我想找到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
?
答案 0 :(得分:1)
我发现SharedASTProvider#getAST
和ASTParser#setSource
可以与ITypeRoot
和IClassFile
实施的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的方式工作。