2017-08-25 1 views
1

次のBuilderスタイルクラスの完全な例を考えてみましょう。 IntelliJのの構造検索を使用してIntelliJ Structural Searchはチェーン/流暢インターフェイスのすべてのメソッド呼び出しを置き換えません

package com.derp; 

class MyBuilder { 

    public MyBuilder set(String key, Object val) { 
     return this; 
    } 

    public MyBuilder setFoo(Object val) { 
     return this; 
    } 

    public MyBuilder setBar(Object val) { 
     return this; 
    } 

    public MyBuilder setBaz(Object val) { 
     return this; 
    } 
} 

public class Main { 

    public static void main(String[] args) { 
     // ** Example 1 
     MyBuilder a = new MyBuilder(); 
     a.set("foo", 1); 
     a.set("bar", 2); 
     a.set("baz", 3); 

     // ** Example 2 
     MyBuilder b = new MyBuilder() 
       .set("foo", 1) 
       .set("bar", 2) 
       .set("baz", 3); 
    } 
} 

私はどこでも、それはすべての文字列リテラル(だけでなく、「foo」という)のために、特定のクラス/インタフェース上で呼び出されていますsetFoo(value)にフォームset("foo", value)のメソッド呼び出しをリファクタリングしたいと思います。

これは、set()メソッドがthisを返す一連のメソッド呼び出し(一貫して「流暢」なインターフェイス)で動作します。上記の主な方法で

、私は1例としてラベル付けされてきたことは、適切にリファクタリングしますが、例2は有用されていない、このように終わる:

MyBuilder b = new MyBuilder() 
    .set("foo", 1) 
    .set("bar", 2).setBaz(3); 

私はset("foo", 1)を必要とし、 set("bar", 2)もここで更新されます。


このケースはIntelliJで処理できますか?

以下は、構造検索と置換に渡したオプションの詳細です。私は "発生数"の周りのオプションを微調整しようとしましたが、悲しいことに、働いていたオプションは思いつきませんでした。ここにテンプレートの詳細があります。

検索テンプレート: $Builder$.set($Key$, $Val$)

交換用テンプレート: $Builder$.set$Name$($Val$)

変数:

$Builder$ 式タイプ(正規表現):com\.derp\.MyBuilder

$Key$ 式タイプ(正規表現):java\.lang\.String

$Name$ スクリプトテキスト:Key.getText().replace("\"", "").capitalize()

+0

この問題に従ってくださいhttps://youtrack.jetbrains.com/issue/IDEA-178110 – Andrey

答えて

0

これは、構造検索&の制限に置き換えており、現時点では不可能です。あなたができることは、Replaceを複数回呼び出すことです。チェーンの1つのインスタンスが見つかるたびにインスタンスが見つからなくなるまでこれを続けなければなりません。

さらに便利なことに、テンプレートから構造検索インスペクションを作成することができます。これにより、すべてのインスタンスが検索されます。しかし、チェーンの各インスタンスでクイックフィックスを個別に呼び出す必要があります。そうしないと、動作しません。

この問題にはbug reportを送信してください。

+0

迅速な対応に感謝します。構造検索を「ヘッドレス」で実行する方法、つまりコマンドラインからスクリプト可能なバージョンを実行する方法についてのポインタやドキュメントはありますか? GUIを使ってこれを手動で100回実行することは、変更が終わるまで実行できません。 私は、リファクタを別のAST表現に基づいて支援するためのツールを即座に用意しましたが、これは大規模なリファクタを行う必要がある最後の時間ではありません。将来、私はIntelliJソースのクローンを作成し、私のIDEをこの種のものにパッチすることを検討します。したがって、あなたが持っているドキュメントは歓迎されるでしょう:) – wsanville

関連する問題