次の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()
この問題に従ってくださいhttps://youtrack.jetbrains.com/issue/IDEA-178110 – Andrey