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 に答える