Immer wieder muss ich die Verwendung eines Methodenaufrufs durch einen anderen ändern.
z. Ich habe 100 ähnliche Methodenaufrufe wie folgt:
%Vor%, die zu
geändert werden müssen %Vor%Dies ist relativ einfach mit einem regulären Ausdruck zu lösen. Aber was, wenn whitespace (manchmal) ins Spiel kommt?
%Vor%Immer noch mit einer Regex machbar, aber es ist jetzt ein unlesbares Durcheinander von optionalen Leerzeichen-Tokens.
OK, aber was ist, wenn die Parameter nicht immer einfache Bezeichner sind, sondern beliebige Ausdrücke ?
%Vor%Hier kommen reguläre Ausdrücke wirklich zusammen.
Kann das heute gemacht werden? (in einer Weise, die Sie gesund, d. h. ohne Regex hält)
Gibt es eine VS-Erweiterung oder ein Standalone-Tool, mit dem C # -Code auf einer höheren (semantischen) Ebene gesucht und ersetzt werden kann?
Etwas, was es mir erlauben würde zu suchen (ich stelle mir vor):
%Vor%und ersetzen durch
%Vor%Existiert ein solches Werkzeug für C #? (Ich kann mir vorstellen, dass es um Roslyn herum gebaut werden könnte.)
Nachdem Sie noch einmal darüber nachgedacht haben, was Sie erreichen wollen, ist gefährlich und besser zu vermeiden. Eine RegEx-Übereinstimmung / Ersetzen ist eine eingeschränkte Funktion. Es kann komplexen Code nicht "verstehen" und muss zwangsläufig fehlschlagen. Betrachten Sie ein Beispiel wie (lassen Sie es für eine Sekunde ignorieren, wenn dieser Code sogar Sinn macht):
Helper.GetIntFromData(packetData.Skip(skipArray.Take(1)).Take(length).ToArray());
Ein regulärer Ausdruck, der nicht speziell darauf zugeschnitten ist, das "falsche Take
" zu vermeiden, hat keine Chance. Es ist eine Frage der Zeit, bis Ihre automatische Ersetzungs-Methode Ihren Code durchbricht, und Ihre einzige Hoffnung ist, dass sie brutal genug ist, um einen Fehler bei der Kompilierung zu erzeugen. Es kann genauso gut eine Runtime-Ausnahme oder ein ungeklärtes Verhalten verursachen. Code-Refactoring sollte mit einem Werkzeug durchgeführt werden, das Code versteht, und nicht ein Werkzeug, das Textmuster erkennt.
Resharper hat semantische Suche und ersetzen
%Vor%mit
%Vor%Es ist weißraumunempfindlich und Sie können festlegen, dass die Tokenübereinstimmungen bestimmten Typen entsprechen. Ich benutze es die ganze Zeit, um zu tun, was du versuchst zu tun. Ich habe noch keine roslyn-basierten Projekte gesehen, die alle Benutzer so trivial machen.
Hier finden Sie eine Einführung in die Funktion auf der Website von Resharpers
Wenn es mir möglich wäre, würde ich es "manuell" machen, aber mit einfachen Regexen (ja, ich weiß, dass du ohne sie gesagt hast, und Amits Antwort "sieht richtig aus", obwohl ich es nicht für Randfälle überprüft habe).
In etwa so:
%Vor% Ersetzen Sie (Helper.GetIntFromData.*?)\.Skip\(
durch ,
, um
Ersetzen Sie dann (Helper.GetIntFromData.*?)\)\.Take\(
durch ,
, um
Und schließlich ersetzen Sie (Helper.GetIntFromData.*?)\)\.ToArray\(\)\);
durch \);
, um
Tags und Links c# regex visual-studio roslyn