internal void OnAnalyzerException(Exception ex, DiagnosticAnalyzer analyzer, Compilation compilation) { var exceptionDiagnostic = AnalyzerHelper.CreateAnalyzerExceptionDiagnostic(analyzer, ex); if (compilation != null) { exceptionDiagnostic = CompilationWithAnalyzers.GetEffectiveDiagnostics(ImmutableArray.Create(exceptionDiagnostic), compilation).SingleOrDefault(); } _analysisOptions.OnAnalyzerException(ex, analyzer, exceptionDiagnostic); }
private async Task GetCompilationDiagnosticsAsync(DiagnosticAnalyzer analyzer, List <Diagnostic> diagnostics, Action <Project, DiagnosticAnalyzer, CancellationToken> forceAnalyzeAllDocuments) { Contract.ThrowIfFalse(_project.SupportsCompilation); var analyzerActionsAndDiagnostics = GetSessionAnalyzerActionsAndDiagnostics(analyzer); var analyzerActions = analyzerActionsAndDiagnostics.Item1; var compilation = await _project.GetCompilationAsync(_cancellationToken).ConfigureAwait(false); diagnostics.AddRange(CompilationWithAnalyzers.GetEffectiveDiagnostics(analyzerActionsAndDiagnostics.Item2, compilation)); DiagnosticAnalyzerLogger.UpdateAnalyzerTypeCount(analyzer, analyzerActions, (DiagnosticLogAggregator)_logAggregator); if (analyzerActions == null || (analyzerActions.CompilationStartActionsCount == 0 && analyzerActions.CompilationEndActionsCount == 0)) { return; } using (var pooledObject = SharedPools.Default <List <Diagnostic> >().GetPooledObject()) { var localDiagnostics = pooledObject.Object; // Get all the analyzer actions, including the per-compilation actions. var allAnalyzerActions = await GetAnalyzerActionsAsync(analyzer, localDiagnostics.Add).ConfigureAwait(false); if (analyzerActions.CompilationEndActionsCount < allAnalyzerActions.CompilationEndActionsCount && forceAnalyzeAllDocuments != null) { if (allAnalyzerActions.CodeBlockEndActionsCount > analyzerActions.CodeBlockEndActionsCount || allAnalyzerActions.CodeBlockStartActionsCount > analyzerActions.CodeBlockStartActionsCount || allAnalyzerActions.SemanticModelActionsCount > analyzerActions.SemanticModelActionsCount || allAnalyzerActions.SymbolActionsCount > analyzerActions.SymbolActionsCount || allAnalyzerActions.SyntaxNodeActionsCount > analyzerActions.SyntaxNodeActionsCount || allAnalyzerActions.SyntaxTreeActionsCount > analyzerActions.SyntaxTreeActionsCount) { // Analyzer registered a compilation end action and at least one other analyzer action during it's compilation start action. // We need to ensure that we have force analyzed all documents in this project for this analyzer before executing the end actions. forceAnalyzeAllDocuments(_project, analyzer, _cancellationToken); } } // CompilationEnd actions. AnalyzerDriverHelper.ExecuteCompilationEndActions(allAnalyzerActions, compilation, _analyzerOptions, localDiagnostics.Add, CatchAnalyzerException, _cancellationToken); diagnostics.AddRange(CompilationWithAnalyzers.GetEffectiveDiagnostics(localDiagnostics, compilation)); } }
public void TestSuppressMessageAttributeDoesNotSuppressCompilerDiagnostics() { var source = @" using System.Diagnostics.CodeAnalysis; [assembly: SuppressMessage("""", ""CS0168"", Justification = """", Scope = ""type"", Target = ""~T:C"")] class C { void M() { // warning CS0168: The variable 'x' is declared but never used. int x; } } "; // Verify unsuppressed CS0168 in 'Compilation.GetDiagnostics' var compilation = CreateCompilation(source); var diagnostics = compilation.GetDiagnostics(); var expected = Diagnostic(ErrorCode.WRN_UnreferencedVar, "x") .WithArguments("x") .WithLocation(11, 13); diagnostics.Verify(expected); Assert.False(diagnostics.Single().IsSuppressed); // Verify 'GetEffectiveDiagnostics' does not apply SuppressMessage suppression to compiler diagnostics. var effectiveDiagnostics = CompilationWithAnalyzers.GetEffectiveDiagnostics( diagnostics, compilation ); effectiveDiagnostics.Verify(expected); Assert.False(effectiveDiagnostics.Single().IsSuppressed); // Verify CS0168 is not suppressed for compiler diagnostics computed // using CompilerDiagnosticAnalyzer var analyzers = new DiagnosticAnalyzer[] { new CSharpCompilerDiagnosticAnalyzer() }; var analyzerDiagnostics = compilation.GetAnalyzerDiagnostics(analyzers); analyzerDiagnostics.Verify(expected); Assert.False(analyzerDiagnostics.Single().IsSuppressed); }
internal void ReportAnalyzerExceptionDiagnostic(DiagnosticAnalyzer analyzer, Diagnostic exceptionDiagnostic, Compilation compilation) { Contract.ThrowIfFalse(AnalyzerManager.IsAnalyzerExceptionDiagnostic(exceptionDiagnostic)); if (_hostDiagnosticUpdateSource == null) { return; } if (compilation != null) { var effectiveDiagnostic = CompilationWithAnalyzers.GetEffectiveDiagnostics(ImmutableArray.Create(exceptionDiagnostic), compilation).SingleOrDefault(); if (effectiveDiagnostic == null) { return; } else { exceptionDiagnostic = effectiveDiagnostic; } } _hostDiagnosticUpdateSource.ReportAnalyzerDiagnostic(analyzer, exceptionDiagnostic, this.Project.Solution.Workspace, this.Project); }