在JDT AST中,如何从MethodInvocation节点检索MethodDeclaration节点?

时间:2014-12-16 15:20:07

标签: java abstract-syntax-tree eclipse-jdt

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

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

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

1 个答案:

答案 0 :(得分:3)

通过绑定方法找到相应的编译单元,将其解析为另一个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 )