Betrachten Sie das folgende vollständige Beispiel einer Builder-Stilklasse.IntelliJ Structural Search ersetzt nicht alle Methodenaufrufe in einer Kette/fließenden Schnittstelle
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);
}
}
Mit IntelliJ der Struktur Suche Ich mag würde Methode Anrufungen der Form set("foo", value)
-setFoo(value)
überall Refactoring es auf eine bestimmte Klasse/Schnittstelle aufgerufen wird ist, für alle Stringliterale (nicht nur „foo“).
Dies funktioniert nur etwas mit einer Kette von Methodenaufrufen (AKA eine "fließende" Schnittstelle), in der die set()
Methode in Frage this
zurückgibt.
Im Hauptverfahren über das, was ich als Beispiel markiert habe 1 richtig Refactoring wird, aber Beispiel 2 endet wie diese auf, was nicht hilfreich ist:
MyBuilder b = new MyBuilder()
.set("foo", 1)
.set("bar", 2).setBaz(3);
Ich brauche set("foo", 1)
und set("bar", 2)
auch hier aktualisiert werden.
Kann IntelliJ mit diesem Anwendungsfall umgehen?
Im Folgenden finden Sie die Details zu den Optionen, die ich in die strukturelle Suche und Ersetzen übergeben habe. Ich habe versucht, die Optionen um "Vorkommen zählen" zu optimieren, aber leider keine Option, die funktionierte. Hier sind die Vorlagendetails.
Suche Vorlage: $Builder$.set($Key$, $Val$)
Ersatzvorlage: $Builder$.set$Name$($Val$)
Variablen:
$Builder$
Expression Typ (Wildcards): com\.derp\.MyBuilder
$Key$
Expression Typ (Wildcards): java\.lang\.String
$Name$
Skripttext: Key.getText().replace("\"", "").capitalize()
Bitte folgen Sie diesem Problem https://youtrack.jetbrains.com/issue/IDEA-178110 – Andrey