2016-04-15 3 views
0

Ich habe eine kleine Roslyn-basierte Anwendung für die Code-Formatierung von VB.NET/C# Projekten basierend auf einem sample provided at codeplex. Diese Anwendung ist eine neue Version des älteren Code Formatter, die ich auf DTE, in dem basierend entwickelte ich auf jede Datei in einer bestimmten Lösung wie diese programmatisch Visual Studio Befehl ausführen Edit.FormatDocument:Wie wird die Fallkorrektur in der Lösung ausgeführt?

projectItem.Document.DTE.ExecuteCommand("Edit.FormatDocument"); 

Das ist nicht mehr akzeptabel, ich daher begann mit der Entwicklung der neuen Version, die dieselbe Aufgabe wie der Befehl FormatDocument ausführen würde. Eines der Merkmale dieses Befehls in VB.NET Quelldatei ist, dass es Gehäuse sowohl für Schlüsselwörter und Namen korrigiert, zB:

  • public wird Public,
  • Variable als fooBar definiert, sondern als foobar => Nutzung verwendet Änderungen an fooBar
  • usw.

Zuerst dachte ich, dass Microsoft.CodeAnalysis.Formatting.Formatter.FormatAsync(...) allein die Arbeit machen würde, aber es scheint, wie es Pflege der Whitespaces nimmt nur. Deshalb fing ich an, anderswo zu suchen und entdeckte die Methode Microsoft.CodeAnalysis.CaseCorrection.CaseCorrector.CaseCorrectAsync(...), aber die CaseCorrector Klasse ist leider internal. Es lässt mich jedoch darüber nachdenken, ob es sich nicht um einen Fehler handelt, bei dem die Methode CaseCorrectAsyncpublic ist.

Gibt es eine vernünftige Möglichkeit, Fallkorrektur in meiner neuen Roslyn-basierten App auszuführen?

+0

Ob es ein Fehler ist: Nein, sehr wahrscheinlich ist es nicht. Viele von Roslyns Helfern sind "intern", aber das Team ist offen für Anfragen, sie öffentlich zu machen, nachdem Sie die Notwendigkeit dafür demonstriert haben. Sie sollten dafür wahrscheinlich ein Problem im Repo erstellen. –

+0

Denken Sie daran, dass wir [Open Source] (https://github.com/dotnet/roslyn) sind, und Sie können uns daher leicht an die Gabel bringen und für Ihre eigenen Tools veröffentlichen. Aber natürlich, füge auch den Fehler ein. –

+0

@JasonMalinowski Wenn ich noch eine Frage habe - gibt es einige Anweisungen, wie man Roslyn-Nugget-Pakete lokal mit den Modifikationen erstellen kann (z. B. indem ich CaseCorrector public mache)? –

Antwort

0

Korrekte Lösung ist wirklich CaseCorrector Klasse zu verwenden, die public laut Kommentare in einer roslyn bug report sein sollte. Um dieses Problem jetzt anzugehen, muss man CaseCorrector veröffentlichen, Roslyn lokal erstellen und die modifizierten Binärdateien verwenden.

Es sollte möglich sein, BuildNuGets.csx script zu nutzen, um Roslyn-Nugget-Pakete mit Ihren lokalen Änderungen zu erstellen, falls erforderlich.