![](/img/trans.png)
[英]How to get CompilationUnit from IJavaCompletionProposal
[英]Get a CompilationUnit from IBinding
我想為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
。 如何從IBinding
獲取正確的CompilationUnit
?
我想通了, 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)) {
//....
}
}
如果這是您需要的聲明類,則IMethodBinding中的getDeclaringClass()方法將返回與該類相對應的類型綁定。 通過類型綁定,如果需要的話,您應該能夠通過包片段進入CU。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.