从IBinding获取CompilationUnit

时间:2015-06-29 13:11:26

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

我想找到MethodInvocation的声明节点:

MethodInvocation methodNode = ...;
IMethodBinding b = methodNode.resolveMethodBinding();
IMethodBinding[] declaredMethods = b.getDeclaringClass().getDeclaredMethods();
for (IMethodBinding method : declaredMethods) {
    if (astRoot.findDeclaringNode(method).getStructuralProperty(MethodDeclaration.NAME_PROPERTY).equals(name))
        //...
}

这在我的情况下不起作用,因为该方法在另一个编译单元中声明,astRoot.findDeclaringNode(...)返回null。 如何从CompilationUnit获得正确的IBinding

2 个答案:

答案 0 :(得分:1)

我发现SharedASTProvider#getASTASTParser#setSource可以与ITypeRootIClassFile实施的ICompilationUnit一起使用。要从绑定中获取CompilationUnit,可以使用以下代码段:

IJavaElement je = b.getJavaElement();
while (je != null && !(je instanceof ITypeRoot)) {
    je = je.getParent();
}
if (je != null) {
    ITypeRoot = (ITypeRoot)je;
    //...
}

了解ITypeRoot帮助我找到更好的解决方案,该解决方案不涉及AST,并且如果某个类文件无法使用源代码,则似乎可以正常工作。

for (IMethod method : type.findPrimaryType().getMethods()) {
    if (method.getElementName().equals(name)) {
        //....
    }
}

答案 1 :(得分:0)

如果它是您所使用的声明类,IMethodBinding中的getDeclaringClass()方法将返回与该类对应的类型绑定。从类型绑定中,如果这是您想要的,您应该能够通过包碎片以CU的方式工作。