簡體   English   中英

從IBinding獲取一個CompilationUnit

[英]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#getASTASTParser#setSource可以工作ITypeRoot這是由雙方實現IClassFileICompilationUnit 要從綁定中獲取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM