Ich baue eine Reihe von Codediagnosen mit Roslyn (in VS2015 Preview). Idealerweise möchte ich, dass alle Fehler, die sie erzeugen, als persistente Fehler auftreten, so als ob ich gegen eine normale Sprachregel verstoßen würde.Wie kann ich meine Code-Diagnose-Syntax-Node-Aktion an geschlossenen Dateien arbeiten lassen?
Es gibt eine Reihe von Optionen, aber ich habe es schwer, eine von ihnen konsequent zu arbeiten. Ich habe es geschafft, eine rudimentäre Syntax Knoten Aktion, das heißt ein mit
context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
im Initialize
Methode meiner Diagnoseklasse registriert zu implementieren. Und siehe da, wenn ich eine Datei öffnen, das diese Diagnose verletzt (während des VSIX Projekt läuft), VS2015 zeigt einen Fehler:
- Red Kringel unter dem rechten Stück Code
- Red Block am Rande
- Fehler in der Fehlerliste
Allerdings geht der Fehler weg, wenn ich die Datei schließen.
Ich habe versucht, context.RegisterCompilationEndAction
auch verwenden, aber dies hat zwei Probleme:
- Es inkonsequent zu schießen scheint. Normalerweise wenn ich die Lösung öffne es feuert, aber nicht immer. Es feuert nicht auf eine saubere/Wiederherstellung, die seltsam scheint.
Obwohl Diagnose erstellt direkt in der Analysemethode Feuer, um die Diagnose zu implementieren ich einen Besucher bin mit, wie diese - die unfähigen sein kann:
private static void AnalyzeEndCompilation(CompilationEndAnalysisContext context) { foreach (var tree in context.Compilation.SyntaxTrees) { var visitor = new ReportingVisitor(context.Compilation.GetSemanticModel(tree)); visitor.Visit(tree.GetRoot()); foreach (var diagnostic in visitor.Diagnostics) { context.ReportDiagnostic(diagnostic); } } }
Ich weiß, dass die Diagnostik erstellt werden - ein Breakpoint auf der
ReportDiagnostic
Zeile wird mehrmals getroffen - aber ich sehe nichts in der Fehlerliste. (Während eines ähnlichenReportDiagnostic
Anrufs zu Beginn des Verfahrens oder eines pro Syntaxbaum mit dem Dateipfad, tut gezeigt zu bekommen.)
Was mache ich falsch hier? Der erste Ansatz (eine Syntax-Node-Aktion) wäre ideal, wenn möglich - er gibt mir genau den Kontext, den ich brauche. Gibt es eine Einstellung in den Projekteigenschaften, die ich brauche, damit der Compiler das Kompilieren des vollständigen Projekts und nur das interaktive Handling in der IDE verwendet? Ist das vielleicht nur ein bisschen Roslyn-Integration, die noch nicht ganz fertig ist?
(Ich kann den vollständigen Code für die Klasse enthalten, wenn es sinnvoll wäre -. In diesem Fall vermute ich, es würde als Signal mehr Lärm aber sein)
Von was ich bei einem Vortrag 'RegisterCompilationEndAction' verstanden habe, ist in der Tat, was Sie brauchen und die Tatsache, dass es inkonsistent löscht, ist ein Fehler. Ich maile dem Sprecher und frage. –