我正在尝试将声明的变量和调用的方法映射到声明/调用它们的位置。我正在开发一个独立的应用程序。
这是我到目前为止所拥有的:
public class HelloWorld {
static ArrayList methodsDeclared = new ArrayList();
static ArrayList methodsInvoked = new ArrayList();
static ArrayList variablesDeclared = new ArrayList();
public static void main(String[] args) {
...
public static void parse(String file) {
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(file.toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);
final CompilationUnit cu = (CompilationUnit) parser.createAST(null);
cu.accept(new ASTVisitor() {
public boolean visit(MethodDeclaration node) {
methodsDeclared.add(node);
return false;
}
public boolean visit(MethodInvocation node) {
methodsInvoked.add(node);
return false;
}
public Boolean visit(VariableDeclarationFragment node) {
variablesDeclared.add(node);
return false;
}
}
}
}
最后,我有3个ArrayLists,其中包含我需要的信息。文件中的方法,声明的变量和调用的方法。我希望能够具体找到哪些变量在哪些方法中定义(如果不是类变量)以及从哪些方法调用哪些方法。有什么想法吗?
答案 0 :(得分:0)
首先,您需要存储变量信息的空间" X"位于方法" Y"内。您需要将methodsDeclared
的类型从ArrayList
(无论如何应该包含泛型)更改为Map<MethodDeclaration, Set<VariableDeclarationFragment>>
。
static final Map<MethodDeclaration, Set<VariableDeclarationFragment>> methodDeclared = new HashMap<MethodDeclaration, Set<VariableDeclarationFragment>>();
在MethodDeclaration
类型的访问者方法中,您可以在此字段中添加/创建新条目。
HelloWorld.methodDeclared.put(node, new HashSet<VariableDeclarationFragment>());
在VariableDeclarationFragment
类型的visitor方法中,将变量声明添加到此变量声明所在的方法声明中。您需要getParent()
方法来查找方法声明。然后使用此信息访问Map中的右侧条目,并将变量声明添加到集合中。
// find the method declaration from the "node" variable
MethodDeclaration methodOfVariable = FindMethodDeclaration(node); // node is of type "VariableDeclarationFragment"
// add the node to the method declaration
HelloWorld.methodDeclared.get(methodOfVariable).add(node);
注意:如果有这样的辅助方法,您必须编写这样的
FindMethodDeclaration
或检查API。
运行代码后,字段methodDeclared
将包含键中的每个方法声明,值将包含变量声明。