2013-09-23 42 views
7

我有一個新的代碼庫出現次數的其中存在的方法調用等的序列,靜態代碼分析儀,在連續的行檢測的代碼模式

object o = something.foo(); 
bar(o); 
something.foobar(); 

。我想在我的代碼中找到/計算這樣一個序列的總數,其中對象「某事」的名稱可能不同,但我想對待相同。

我想拉出這些作爲一種方法,並查看需要重構的所有位置。我該如何去做這樣的事情?

+0

我不知道任何工具,可以做到這一點現成的架子。你可以寫(或者擴展現有的)findbug插件這樣做的檢查:http://findbugs.sourceforge.net/ – Jayan

+0

爲什麼不能簡單地搜索在你的IDE正則表達式的模式?應該給你計數和地點... – assylias

+0

@assylias正則表達式可能工作,但我認爲這可能是非常困難的。此外,您可能需要應對所有語法細節,可能會在某個地方或其他地方進行投射。 – SpaceTrucker

回答

1

你可以使用正則表達式 - 在Netbeans的,例如,此正則表達式:

(?s)object o = (.*?)\.foo\(\);\s+bar\(o\);\s+(\1)\.foobar\(\); 

找到的所有線,如:

object o = xyz.foo(); 
bar(o); 
xyz.foobar(); 

其中xyz可以是任何東西,只要它是在同一第一行和最後一行。

+0

也許你應該考慮你的正則表達式中的空行和註釋行。 – SpaceTrucker

+0

@SpaceTrucker空白行已被該正則表達式忽略。如果需要,評論確實可以添加。 – assylias

+0

要做空白的權利,你需要一堆額外的正則表達式插入到處;同樣對於評論。這對於更復雜的模式會變得非常多毛。如果在方法參數括號內有任意的參數表達式(我認爲Op的情況並不完全如他所示),正則表達式會讓你完全失敗,因爲它不能可靠地跳過這些表達式。 –

2

Intellij IDEA(包括免費社區版本)重複代碼檢測&替換。

如果您使用其重構功能將某種出現轉化爲方法,它會遍歷代碼庫並詢問您是否要在其他位置替換它。

1

如果您的代碼是Java 1.6或更低版本,則可以使用Eclipse MoDisco來生成Java項目的EMF model實例。然後,您可以實施Model Query來搜索您描述的模式。即使MoDisco Java模型基於Java 1.5,也可以在1.6中使用它,因爲在1.6中沒有引入語法變更。

2

有些工具可以做到這一點,他們被稱爲program transformation tools

如果您真的想用DMS規則語言(RSL)將它們識別爲連續的行,使用我們的DMS Software Reengineering Toolkit程序轉換引擎。 RSL讓你寫的模式在語言的語言語法,其語法已經知道DMS方面:

domain Java~v7; 

pattern odd_pattern(IDENTIFIER: o, 
        qualifier: something, 
        IDENTIFIER: foo 
        IDENTIFIER: bar, 
        IDENTIFIER: foobar, 
        more: stmt_sequence): stmt_sequence 
= " Object \o = \something.\foo; 
    \bar(\o); 
    \something.\foobar(); 
    \more"; 

這定義在指定的符號(「域名的Java〜V7」的表面語法方面的模式)。每個模式都有一個名稱(「odd_pattern」),以便您可以區分多種模式。一個模式具有一組強制(乾淨語法)語法類別指定的子模式,命名爲<(非)終端:名稱>。這個模式有幾個不同的標識符,模式名稱o,foo,bar,foobar。我猜你的意思是某種合格的途徑,但也許你的意思是它只是一個標識符。

圖案內容在元引號定義區分目標語言的RSL模式語言文本(Java)的圖案文字。該元引號內,\巴茲意味着句法類別N其中巴茲的圖案可變巴茲在模式參數列表中定義爲N:baz 相同發生在多個位置的模式變量需要相同的替換

鑑於此模式,您可以要求DMS在哪裏與(Java)AST匹配。通過與AST匹配,解決空白,註釋,非標準化字符串/標識符/數字等問題。被淘汰。通過簡單的計數匹配,就可以得到OP的原始期望指標。 [我們已經在很大程度上完成了RSL模式的擴展,其中元素通過數據流而不是代碼語法連接。

想必他要變換這些情況下進入一些其他的代碼,他可以寫做,在RSL,

rule rewrite_odd_pattern(parms): stmt_sequence 
     odd_pattern(parms) -> replacement_pattern(parms); 

提一些「replacement_pattern」寫類似。

如果OP只有這樣的模式數量不多,他可能會更好使用正則表達式或只是猛擊,而不是讓DMS(或其他程序轉換工具),並設置它。如果他這麼做了,或者他們分散在一大堆代碼中,模式很複雜,或者他有許多類似的事情要做,權衡可能會以另一種方式提出。