2016-01-28 4 views
5

Ich möchte ButterKnife für Android verwenden. Ich muss einige Felder basierend auf einigen Ausdrücken, die anderswo im Code sind, annotieren. Ich habe Code wie dieseVerwenden Sie IntelliJ strukturelle Suche, um Feld und seinen Ausdruck durch neues Feld zu ersetzen

private String myField; 
... 
public myClassConstructor() { 
    ... 
    myField = res.getString(R.string.my_string_id); 
    ... 
} 

mag ich diese

@BindString(R.string.my_string_id); 
String myField; 
... 
public myClassConstructor() { 
    ... 
    ... 
} 

Im Ergebnis der Ausdruck ist weg, und das Feld auf dem alten Ausdruck mit Anmerkungen versehen basiert.

Ist es möglich, diese Art von Suchen und Ersetzen in IntelliJ strukturellen Ersatz zu tun? Es scheint, dass es den Fall nicht anmutig handhabt, wenn die Linien von Interesse nicht benachbart sind und strukturell an verschiedenen Stellen sind. Ich habe versucht, es auf Klassenvorlage zu basieren, und $ Anweisung $ (0-unbegrenzte Vorkommen) verwendet, aber es hat nicht für mich funktioniert.

Ich erkannte, dass es eigentlich relativ einfach mit regulären Ausdrücken zu tun ist, sicherlich viel einfacher als IntelliJ strukturelle Suche Ball zu spielen, aber Ich mag meine Werkzeuge zu lernen, so würde ich immer noch gerne wissen, ob dies möglich ist.

Antwort

2

Während Search structurally funktioniert irgendwie und es ist möglich, eine Suchanfrage zu stellen, replace structuraly ist eine Art von Werkzeugen, die von "Aliens" für "Räuber" gemacht wurde. Ich hoffe, dass das intelliJ-Team diese Funktion wieder aufgreift und sie besser nutzbar macht.

Ich habe versucht, selbst Replace structurally Abfrage zu machen, aber ich konnte nur Search structurally Klausel machen.

Ich habe es mit Mockito Lib zum Beispiel getan.

Structural search dialog

Einer der wichtigsten Punkte hier zu setzen für $SomeStatement1$ und $SomeStatement2$ min und max Zahl auf {0, unbegrenzt}

enter image description here

Und von diesem Punkt habe ich versucht zu kommen mit Ersatzklausel aber es hat den Umfang der Methode/Felder Deklaration/Klasse komplett durcheinander gebracht.

Hoffe, das hilft.

+0

ich es auch verwirrt gefunden up meinen Code, manchmal weit mehr entfernen, als es sollte, oder eine neue Klasse eingefügt. Es schien für sehr einfache und lokale Suche zu funktionieren. Ich hatte gehofft, dass jemand sagen würde, dass es nicht möglich ist oder so ist. Wenn niemand mit sicherem Wissen hereinkommt, nehme ich das an, weil nur die Entwickler wissen und es wahrscheinlich nicht tun kann, was ich wollte. – arberg

0

So etwas sollte funktionieren.
Suche Vorlage:

class $Class$ { 
    $FieldType$ $FieldName$; 

    $Class$() { 
     $st1$; 
     $FieldName$ = res.getString($expr$); 
     $st2$; 
    } 
} 

Variablen:
st1 min: 0 max: unbegrenzt
st2 min: 0 max: unbegrenzt

Vorlage Ersatz:

class $Class$ { 
    @BindString($expr$) 
    $FieldType$ $FieldName$; 

    $Class$() { 
     $st1$; 
     $st2$; 
    } 
} 
+0

Vielen Dank für den Versuch. Ich hätte das in die Frage aufnehmen sollen, da es eines der Dinge war, die ich ausprobiert habe, und es funktioniert nicht.Ich passe nichts zusammen. Als ich damit herumspielte, erinnere ich mich daran, dass tatsächlich etwas ersetzt wurde, ich denke, ich habe den Quellcode vereinfacht. Aber dann hat es den Ersatz komplett durcheinander gebracht. Ich werde die obige Antwort akzeptieren, um das Problem zu beheben. – arberg