2014-12-19 35 views
2

我想變更的方法具有一定的簽名:的Intellij結構代替改變方法簽名

public OldReturnType get.*(Params) { 
    //lots of code 
} 

這樣:

public NewReturnTyp get.*(Params) { 
    //lots of code 
} 

- >我想更換返回類型。我嘗試過使用SSR:

  • 複製現有模板「類的方法」。這產生了模板:

    class $ Class $ { $ ReturnType $ $ MethodName $($ ParameterType $ $ Parameter $); }

我第一次嘗試,以取代$返回類型$ OLDTYPE和NEWTYPE respectivly:

搜索模板:

class $Class$ { 
    OldType $MethodName$($ParameterType$ $Parameter$); 
} 

更換模板:

class $Class$ { 
    NewType $MethodName$($ParameterType$ $Parameter$); 
} 

這給了我所有該方法,但如果我替換它,該方法被刪除。

然後我試圖改變格局的方式如下:

搜索模板:

class $Class$ { 
    $OldType$ $MethodName$($ParameterType$ $Parameter$); 
} 

而且規定,即$ OLDTYPE $應該是搜索的目標。我還爲此變量指定了RegEx模式:OldType。

更換模板:

class $Class$ { 
    NewType $MethodName$($ParameterType$ $Parameter$); 
} 

這也找到所有的方法,但它們會刪除,如果我取代。我嘗試了很多不同的方式,總是得到相同的結果:如果我替換了匹配,方法就會被刪除。我該如何指定搜索/替換模板才能在簽名中用NewType替換OldType。

回答

5

您在結構搜索&替換中遇到了一個錯誤。可能是這一個:https://youtrack.jetbrains.com/issue/IDEA-127835

但有一個解決方法。使用以下搜索模板:

class $Class$ { 
    OldType $MethodName$($ParameterType$ $Parameter$) { 
    $statement$; 
    } 

    $other$; 
} 

請確保「此變量是搜索的目標」for $ MethodName $未設置,否則它將不起作用。

$聲明$
最小計數:0
最大計數:無限

$其他$
最小計數:0
最大計數:無限

其餘爲現有模板的方法。

正如您所期望的替換模板與搜索模板相同,只能用NewType替換OldType。

讓我知道它是否有效,或者如果您有任何問題。

+0

種:現在的問題是,一些參數鬆散其最終修飾符,所以我在匿名內部類中得到一些編譯器錯誤。但我現在手工完成了,我認爲你提到的錯誤是我發誓的原因( - ;)。我會接受你的回答,因爲我認爲它對下一個想做這件事的人有好的開始,但對我而言,問題解決了。 – morpheus05

+0

我想你需要類似這樣的方法簽名: $ accessModifier $ $ static $ OldType $ MethodName $($ ParameterType $ $ Parameter $){ and set min/max分別計數到0和1 – mish

+1

@mish在SSR中不可能使用變量作爲修飾符,模板總是需要是有效的可編譯Java代碼(片段) –