private static void ReportDiagnosticWithSuppressionCheck( AnalyzerOptions options, Diagnostic diagnostic, Action <Diagnostic> reportDiagnostic) { if (!SuppressionManager.Get(options).IsSuppressed(diagnostic)) { reportDiagnostic(diagnostic); } }
private void AddSuppressByComment(CodeFixContext context, Diagnostic diagnostic) { string title = $"Suppress {diagnostic.Id} with a comment"; context.RegisterCodeFix(CodeAction.Create(title, ct => { var suppressionManager = SuppressionManager.Get( context.Document.Project.AnalyzerOptions); return(suppressionManager.AddSuppressionCommentAsync( context.Document, diagnostic)); }, title), diagnostic); }
private void AddSuppressInFile(CodeFixContext context, Diagnostic diagnostic) { string title = $"Suppress {diagnostic.Id} in suppression file"; context.RegisterCodeFix(CodeAction.Create(title, ct => { // Пытаемся найти suppression-файл внутри проекта var project = context.Document.Project; var suppressionDoc = project.AdditionalDocuments .FirstOrDefault(d => !String.IsNullOrEmpty(d.FilePath) && d.FilePath.EndsWith(SuppressionManager.SuppressionFileExtension)); var text = SuppressionManager.Get(project.AnalyzerOptions) .AddSuppression(diagnostic) .ToText(); Solution solution; // Если файла нет, то создаём его if (suppressionDoc == null) { // Есть открытый баг от 2015 года, что Roslyn // не проставляет Build Action = AdditionalFiles // https://github.com/dotnet/roslyn/issues/4655 solution = project.Solution.AddAdditionalDocument( DocumentId.CreateNewId(project.Id, debugName: "Suppression File"), name: project.Name + SuppressionManager.SuppressionFileExtension, text: text); } // Если файл уже есть, дописываем в конец новую строчку и обновляем solution else { solution = project.Solution .WithAdditionalDocumentText(suppressionDoc.Id, text); } return(Task.FromResult(solution)); }, title), diagnostic); }