0

我选择了一段代码,我想用 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[]

我做错了什么,因为解析器没有找到任何方法。

我做错了什么?

4

1 回答 1

0

ASTParser.setResolveBindings() 的 javadoc 说:

绑定信息是从 Java 模型中获得的。这意味着编译单元必须相对于 Java 模型定位。当源代码来自 setSource(ICompilationUnit) 或 setSource(IClassFile) 时,这会自动发生。当源由 setSource(char[]) 提供时,必须通过调用 setProject(IJavaProject) 和 setUnitName(String) 显式显示该位置。请注意,影响文档注释检查的编译器选项也可能影响是否为文档注释中的节点解析任何绑定。

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);
于 2013-01-30T13:38:14.333 回答