2009-10-20 294 views
1

是否有一種方法(如果是這樣,如何?)遞歸地遍歷一個XPath查詢?如何遞歸遍歷XPath?

我在Java中的AST有以下情形

@Relevant 
public void foo() { 
    bar(true); 
} 

public void bar(boolean flag) { 
    assert flag; 
} 

我想找到它標註有「@Relevant」(那很容易)的方法,並檢查被稱爲在FOO的方法(這裏吧)確實有一個assert語句。

所以a)如何提取方法名稱'bar'並通過XPath詢問名爲'bar'的方法?

以及如果'bar'實際調用assert發生的'bla'會怎麼樣?

希望這是可以理解的......

感謝所有幫助

+1

目前還不清楚你的AST格式是什麼。我假設你創建了它的XML配置。如果這是正確的,請提供有關您使用的方法調用和斷言語句定義的更多詳細信息。 我可以說我玩過javac源代碼(可以從OpenJDK項目中獲得),它們以編程方式構建AST(以JCTree.JCCompilationUnit格式 - http://xref.jsecurity.net/openjdk-6/langtools/dd/d25/ classcom_1_1sun_1_1tools_1_1javac_1_1tree_1_1_j_c_tree_1_1_j_c_compilation_unit.html)。通過該API然後使用JCTree.JCCompilationUnit.accept(Visitor)很容易完成您的任務。 – 2009-10-20 09:08:15

+0

的目的實際上是爲PMD創建一個XPath規則。 由於情況,我不能使用Java的實現。 所以無論是在XPath中是可能的還是我必須忘記整個想法;-) 謝謝無論如何 – Marty 2009-10-21 11:11:28

回答

0

一個XPath是不夠的,你要完成的任務。首先,您需要一個類型綁定(例如,用於查找bar()方法聲明)。其次,您需要開發某種類型的靜態代碼分析器,它以遞歸方式在AST上運行,並試圖滿足條件,即調用堆棧中的「存在斷言表達式」。

您可以查看Eclipse JDT源代碼,瞭解如何實現類型綁定。一旦你有一個綁定,你可以調用你的邏輯。