gpt4 book ai didi

java - 从 AST 获取方法调用信息

转载 作者:搜寻专家 更新时间:2023-11-01 02:31:36 27 4
gpt4 key购买 nike

如何使用 AST(抽象语法树)解析器获取程序的每个方法声明中调用的方法的名称?到目前为止,我已经设法获得了方法声明的所有名称和被调用的方法的所有名称,但我想知道哪个方法调用了哪些方法。例如,我想看到方法 m1 调用方法 mAmB,而方法 m2 调用方法 mCmD

[编辑 11/9/2011 IDB,将新手的扩展评论转录到原始问题的正文中。我希望我已经正确转录了它。希望作者回来修改]:

我的问题似乎是(Eclipse 的)MethodDeclaration api 没有要调用的 GetInvokedMethodName 函数。这是我的代码:

 public class MethodVisitor extends ASTVisitor { 

List<MethodDeclaration> methods = new ArrayList<MethodDeclaration>();

@Override public boolean visit(MethodDeclaration node) {
methods.add(node);
return super.visit(node); }

public List<MethodDeclaration> getMethods()
{ return methods; }

List<MethodInvocation> methods1 = new ArrayList<MethodInvocation>();

@Override public boolean visit(MethodInvocation node)
{ methods1.add(node);
return super.visit(node); }

public List<MethodInvocation> getMethods1()
{ return methods1; }
}

...

for (MethodDeclaration method : visitor .getMethods())
{ System.out.println("Method name: " + method.getName()
+ " Return type: " + method.getReturnType2()
+ " Is constructor: " + method.isConstructor()
+ " Method invoked: " + ASTNode.METHOD_INVOCATION );
); }

for (MethodInvocation method1 : visitor .getMethods1())
{ System.out.println("Method name invoked: " + method1.getName() ); }

最佳答案

我遇到了同样的问题。这是我的解决方案:

final HashMap<MethodDeclaration, ArrayList<MethodInvocation>> invocationsForMethods =
new HashMap<MethodDeclaration, ArrayList<MethodInvocation>>();

CompilationUnit cu = (CompilationUnit) ap.createAST(null);
cu.accept(new ASTVisitor() {

private MethodDeclaration activeMethod;

@Override
public boolean visit(MethodDeclaration node) {
activeMethod = node;
return super.visit(node);
}

@Override
public boolean visit(MethodInvocation node) {
if (invocationsForMethods.get(activeMethod) == null) {
invocationsForMethods.put(activeMethod, new ArrayList<MethodInvocation>());
}
invocationsForMethods.get(activeMethod).add(node);
return super.visit(node);
}

});

现在,可以问 invocationsForMethods.keySet()获取所用 AST 的所有方法声明和 invocationsForMethods.get(key)返回作为键给出的声明的所有方法调用。

关于java - 从 AST 获取方法调用信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8069599/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com