Buduję zestaw diagnostyki kodu za pomocą Roslyn (w VS2015 Preview). Idealnie byłoby, gdyby wszelkie błędy, które generują, działałyby jak trwałe błędy, tak jakbym łamał normalną zasadę języka.W jaki sposób można wykonać działanie węzła składni diagnostycznej kodu dla zamkniętych plików?
Istnieje kilka opcji, ale ciężko jest mi sprawić, aby któryś z nich działał konsekwentnie. Udało mi się wdrożyć działania węzła podstawową składnię, to znaczy jeden zarejestrowany
context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
w metodzie diagnostycznej Initialize
mojej klasie. I oto, kiedy otworzy się plik, który narusza ten diagnostyczny (podczas uruchamiania projektu VSIX), VS2015 pokazuje błąd:
- Red squiggle pod prawym kawałka kodu
- czerwony blok na marginesie
- Błąd na liście błędów
Jednak błąd zniknie po zamknięciu pliku.
Próbowałem za pomocą context.RegisterCompilationEndAction
jak dobrze, ale to ma dwa problemy:
- Wydaje niekonsekwentnie ogień. Zwykle po otwarciu rozwiązania odpala, ale nie zawsze. Nie strzela na czystym/przebudowanym, co wydaje się dziwne.
Chociaż diagnostyka stworzony bezpośrednio w ogniu metoda analizy, w celu wykonania diagnostyki używam gościa, jak ta - która może być nieudany:
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); } } }
wiem, że diagnostyka są jest tworzony - punkt przerwania na linii
ReportDiagnostic
jest uderzany kilka razy - ale nie widzę niczego na liście błędów. (Podczas gdy podobnyReportDiagnostic
wezwanie na początku metody, albo jeden na drzewo składni ze ścieżką pliku, robi się widoczne.)
Co robię źle tutaj? Pierwsze podejście (działanie węzła składni) byłoby idealne, gdyby było wykonalne - daje mi dokładnie ten kontekst, którego potrzebuję. Czy istnieje pewne ustawienie we właściwościach projektu, którego potrzebuję, aby kompilator użył go do kompilacji "pełnego projektu", a także po prostu interaktywnego "w obsłudze IDE"? Czy to może tylko odrobina integracji z Roslyn, która nie jest jeszcze ukończona?
(mogę zawierać pełny kod dla klasy czy byłoby użyteczne. - w tym przypadku podejrzewam, że byłoby więcej hałasu niż sygnału chociaż)
Z tego co zrozumiałem na wykładzie 'RegisterCompilationEndAction' jest rzeczywiście tym, czego potrzebujesz, a to, że odpala niekonsekwentnie jest błędem. Wyślę e-mail do głośnika i zapytam. –