2017-07-29 24 views
1

我想映射變量聲明和方法調用到他們被聲明/調用的地方。我正在開發一個獨立的應用程序。如何找到哪個方法被調用和變量聲明在

這是我到目前爲止有:

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周用的ArrayList我需要的信息。文件中的方法,聲明的變量和調用的方法。我希望能夠具體找到在哪些方法(如果不是類變量)以及從哪些方法調用哪些方法中定義了哪些變量。有任何想法嗎?

回答

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類型的訪問者方法,你的變量聲明添加到方法聲明這個變量的聲明是,你還需要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將包含鍵的每個方法的聲明和值將包含變量聲明。

+0

這些信息相當有幫助,但是,驅使我問這個問題的關鍵方面是因爲我無法找到一種方法將VariableDeclarationFragment的getParent與methodDeclaration匹配。你建議在API中找到一個名爲FindMethodDeclaration的方法,但是,根據我的經驗,沒有任何方法存在。我可以將它們轉換爲字符串並使用String.compareTo這樣的stull,但是,我認爲這很雜亂,想要查看社區是否有更好的解決方案? – Jimmy

+0

@Jimmy FindMethodDeclaration()方法只是一個while循環和getParent()調用的結合。你直接進入父節點,直到你點擊了方法聲明。類似於'while(currentNode!= null){if(currentNode is MethodDeclaration){\ o /} else {currentNode = currentNode.getParent(); }}'。將節點轉換爲字符串並比較字符串是不可取的。您可以使用解析後的樹,包含所有信息(名稱,孩子,父母,類型,內容,興趣愛好,朋友,工作......),請使用它們。 – Progman