2017-08-25 1 views
1

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()

+0

Bitte folgen Sie diesem Problem https://youtrack.jetbrains.com/issue/IDEA-178110 – Andrey

Antwort

0

Dies ist eine Einschränkung der Struktur Suchen & ersetzen und ist im Moment nicht möglich. Sie können mehrere Male mehrfach ersetzen. Jedes Mal, wenn eine Instanz der Kette gefunden wird. Sie müssen dies weiter tun, bis keine weiteren Instanzen gefunden werden.

Oder etwas bequemer, können Sie eine strukturelle Suche Inspektion von Ihren Vorlagen erstellen. Dies wird alle Instanzen finden. Aber Sie müssen die schnelle Lösung für jede Instanz der Kette separat aufrufen oder es wird nicht funktionieren.

Möglicherweise möchten Sie eine bug report für dieses Problem senden.

+0

Danke für die schnelle Antwort.Haben Sie irgendwelche Hinweise oder Dokumentation darüber, wie ich die strukturelle Suche "kopflos" ausführen könnte, d. H. Eine skriptfähige Version von einer Befehlszeile aus? Es ist nicht machbar, dass ich das 100 Mal manuell mit der GUI ausführe, bis es aufhört zu wechseln. Ich habe da ein Werkzeug improvisiert, um mit meinem Refactor basierend auf einer anderen AST-Darstellung zu helfen, aber dies wird definitiv nicht das letzte Mal sein, dass ich große Refactors machen muss. In Zukunft würde ich in Erwägung ziehen, die IntelliJ-Quelle zu klonen und meine IDE für diese Art von Sache zu patchen, so dass alle Dokumente, die Sie haben, willkommen wären :) – wsanville

Verwandte Themen