2013-01-30 2 views
0

Я выбрал фрагмент кода, и я хочу проанализировать AST с целью идентификации методов в выбранном коде.Анализ выбранного кода с AST

public void run(IAction action) { 
    SelectedText selectedText;  
    IEditorPart editor = getActiveEditor(); 

    if (editor instanceof AbstractTextEditor) { 
     selectedText = getSelectedText(editor); 
     creteAST(selectedText); 
    }   
} 

private void creteAST(SelectedText selectedText) { 
    CompilationUnit parse = parse(selectedText); 
    MethodVisitor visitor = new MethodVisitor(); 
    parse.accept(visitor); 

    System.out.println("Printing methods from the selected code"); 
    for (MethodDeclaration method : visitor.getMethods()) { 
     System.out.println("Method name: " + method.getName()+ ". Return type: " + method.getReturnType2()); 
     System.out.println(method); 
    } 
} 

private static CompilationUnit parse(SelectedText selectedText) { 
    String s_text = selectedText.getSelectedText(); 
    char[] c_text = s_text.toCharArray(); 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    parser.setSource(c_text); 
    parser.setResolveBindings(true); 
    return (CompilationUnit) parser.createAST(null); 
    } 

Как вы можете видеть, что я должен изменить тип из SelectedText в char[] перед разбором.

Я делаю что-то неправильно, потому что парсер не находит никакого метода.

Что я делаю неправильно?

ответ

0

Javadoc для ASTParser.setResolveBindings() говорит:

Binding информация получена из модели Java. Это означает, что блок компиляции должен быть расположен относительно модели Java. Этот происходит автоматически, когда исходный код исходит от setSource (ICompilationUnit) или setSource (IClassFile). Когда источник равен , предоставленному setSource (char []), местоположение должно быть полностью израсходовано , вызвав setProject (IJavaProject) и setUnitName (String). Обратите внимание, что параметры компилятора, которые влияют на проверку комментариев doc , также могут повлиять на то, разрешены ли какие-либо привязки для узлов в комментариях к документу.

IJavaProject javaProject = ...obtain it somehow, possibly through getAdapter() on editor? 
String name = ...from editor?... 

ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setKind(ASTParser.K_COMPILATION_UNIT); 
parser.setSource(c_text); 
parser.setResolveBindings(true); 
parser.setProject(javaProject); 
parser.setUnitName(name); 
return (CompilationUnit) parser.createAST(null); 
+0

Спасибо, полезная информация !!! Но знаете ли вы, как получить javaProject и имя ??? Я пытаюсь найти какую-то информацию, но никак не могу :-( – Jose

+0

возможно 'JavaModelManager.getJavaModelManager(). GetJavaModel(). GetJavaProject()' должен возвращать активный проект. Ищите примеры использования ASTParser в grepcode: http: // grepcode .com/поиск/обыкновений? ID = repo1.maven.org $ Maven2 @ org.eclipse.tycho $ org.eclipse.jdt.core @ 3.8.2.v20120814-155456 @ орг $ затмить $ Jdt $ ядро ​​$ РОМ @ ASTParser и типа = тип & к = U – mantrid

Смежные вопросы