2013-01-21 61 views
4

當我有一個調用bar()的方法foo()時,如何從MethodInvocation節點(或方法中的任何語句/表達式)獲取foo()AST節點?例如,我需要從b.bar()知道IMethod foo。如何用JDT獲取封閉方法節點?

public void foo() 
{ 
    b.bar(); 
} 
+0

我認爲這實際上是規範的方式來獲得封閉g語句的方法。 – Ladlestein

回答

2

在JDT/UI中,我們有一個輔助方法來執行此操作。看看org.eclipse.jdt.internal.corext.dom.ASTNodes.getParent(ASTNode, int)

+0

需要爲此添加哪個依賴關係?此外,這是在3.5版本? –

+0

你需要org.eclipse.jdt.ui插件。我沒有檢查,但這種方法可能在3.5之前。 –

+1

+1,它的工作原理! 'ASTNode parentNode = ASTNodes.getParent(methodInvocationNode,ASTNode.METHOD_DECLARATION);' –

2

我想出了這段代碼,但我希望有更好的方法來獲得結果。

public static IMethod getMethodThatInvokesThisMethod(MethodInvocation node) { 
    ASTNode parentNode = node.getParent(); 
    while (parentNode.getNodeType() != ASTNode.METHOD_DECLARATION) { 
     parentNode = parentNode.getParent(); 
    } 

    MethodDeclaration md = (MethodDeclaration) parentNode; 
    IBinding binding = md.resolveBinding(); 
    return (IMethod)binding.getJavaElement(); 
} 
+0

對我很好。這與我們在JDT/UI中使用的幾乎相同。 –

0

另一招可能讓遊客參觀的MethodInvocation節點之前存儲來電者信息:

ASTVisitor visitor = new ASTVisitor() { 
    public boolean visit(MethodDeclaration node) { 
     String caller = node.getName().toString(); 
     System.out.println("CALLER: " + caller); 

     return true; 
    } 
    public boolean visit(MethodInvocation node) { 
     String methodName = node.getName().toString(); 
     System.out.println("INVOKE: " + methodName); 

隨着AnotherClass類型:

public class AnotherClass { 

    public int getValue() 
    { 
     return 10; 
    } 

    public int moved(int x, int y) 
    { 
     if (x > 30) 
      return getValue(); 
     else 
      return getValue(); 
    } 
} 

我能得到的信息:

TYPE(CLASS): AnotherClass 
CALLER: getValue 
CALLER: moved 
INVOKE: getValue 
INVOKE: getValue 
+0

不幸的是,主要的用例是從另一個類中調用的一個類中檢查方法聲明。這隻在調用者類也是聲明類時纔有用。 –