我正在实现ASTVisitor,当我访问MethodInvocation节点时,我想访问其对应的MethodDeclaration节点。以下示例显示了我所需要的:

public boolean visit(MethodInvocation node){
     MethodDeclaration mDeclaration = getMethodDeclaration( node );
}


我知道我可以先访问我的整个项目,并将所有方法声明保存在映射中。然后,在第二个访问者中,我可以访问MethodInvocation节点,并从第一个访问者生成的地图中获取其对应的MethodDeclaration。但是我想访问相应的MethodDeclaration节点,而不必多次访问整个项目。我怎样才能做到这一点?可能吗?

最佳答案

通过方法的绑定找到相应的编译单元,将其解析为另一个AST并从树中获取声明:

IMethodBinding binding = (IMethodBinding) node.getName().resolveBinding();
ICompilationUnit unit = (ICompilationUnit) binding.getJavaElement().getAncestor( IJavaElement.COMPILATION_UNIT );
if ( unit == null ) {
   // not available, external declaration
}b
ASTParser parser = ASTParser.newParser( AST.JLS8 );
parser.setKind( ASTParser.K_COMPILATION_UNIT );
parser.setSource( unit );
parser.setResolveBindings( true );
CompilationUnit cu = (CompilationUnit) parser.createAST( null );
MethodDeclaration decl = (MethodDeclaration)cu.findDeclaringNode( binding.getKey() );


当然,这仅在方法在Eclipse项目中而不是在外部JAR中声明时才有效。

您正在遍历的第一个AST也需要具有解析的绑定:ASTParser.setResolveBindings( true )

07-24 09:18