diff --git a/src/Analyzers/Core/Analyzers/RemoveUnnecessarySuppressions/AbstractRemoveUnnecessaryPragmaSuppressionsDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/RemoveUnnecessarySuppressions/AbstractRemoveUnnecessaryPragmaSuppressionsDiagnosticAnalyzer.cs index f5c9a6e2895a8d561279495a0c9819a7323206b0..d5279f82d38e9dae30206b92d900a7d5cc23ba2b 100644 --- a/src/Analyzers/Core/Analyzers/RemoveUnnecessarySuppressions/AbstractRemoveUnnecessaryPragmaSuppressionsDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/RemoveUnnecessarySuppressions/AbstractRemoveUnnecessaryPragmaSuppressionsDiagnosticAnalyzer.cs @@ -190,9 +190,12 @@ protected sealed override void InitializeWorker(AnalysisContext context) // Remove entries for unhandled diagnostic ids. foreach (var id in unhandledIds) { - foreach (var (pragma, _) in idToPragmasMap[id]) + if (idToPragmasMap.TryGetValue(id, out var pragmas)) { - pragmasToIsUsedMap.Remove(pragma); + foreach (var (pragma, _) in pragmas) + { + pragmasToIsUsedMap.Remove(pragma); + } } if (idToSuppressMessageAttributesMap.TryGetValue(id, out var attributeNodes)) diff --git a/src/EditorFeatures/CSharpTest/Diagnostics/Suppression/RemoveUnnecessaryPragmaSuppressionsTests.cs b/src/EditorFeatures/CSharpTest/Diagnostics/Suppression/RemoveUnnecessaryPragmaSuppressionsTests.cs index 9c81edcabf4a56f27b7bf67f013e521335bacdf7..ab85afad46f8bad915c3645b0ce81f22b932e3b4 100644 --- a/src/EditorFeatures/CSharpTest/Diagnostics/Suppression/RemoveUnnecessaryPragmaSuppressionsTests.cs +++ b/src/EditorFeatures/CSharpTest/Diagnostics/Suppression/RemoveUnnecessaryPragmaSuppressionsTests.cs @@ -265,23 +265,34 @@ void M() } } + public enum TestKind + { + Pragmas, + SuppressMessageAttributes, + PragmasAndSuppressMessageAttributes + } + [Theory, CombinatorialData] - public async Task TestDoNotRemoveUnsupportedDiagnosticSuppression(bool disable) + [WorkItem(46047, "https://github.com/dotnet/roslyn/issues/46047")] + public async Task TestDoNotRemoveUnsupportedDiagnosticSuppression(bool disable, TestKind testKind) { var disableOrRestore = disable ? "disable" : "restore"; var pragmas = new StringBuilder(); var suppressMessageAttribtes = new StringBuilder(); foreach (var id in UnsupportedDiagnosticIds) { - pragmas.AppendLine($@"#pragma warning {disableOrRestore} {id}"); - suppressMessageAttribtes.AppendLine($@"[System.Diagnostics.CodeAnalysis.SuppressMessage(""Category"", ""{id}"")]"); + if (testKind == TestKind.Pragmas || testKind == TestKind.PragmasAndSuppressMessageAttributes) + pragmas.AppendLine($@"#pragma warning {disableOrRestore} {id}"); + + if (testKind == TestKind.SuppressMessageAttributes || testKind == TestKind.PragmasAndSuppressMessageAttributes) + suppressMessageAttribtes.AppendLine($@"[System.Diagnostics.CodeAnalysis.SuppressMessage(""Category"", ""{id}"")]"); } var source = $@"{{|FixAllInDocument:{pragmas}{suppressMessageAttribtes}|}}class Class {{ }}"; // Compiler diagnostics cannot be suppressed with SuppressMessageAttribute. // Hence, attribute suppressions for compiler diagnostics are always unnecessary. - if (!IsCompilerDiagnosticsTest) + if (!IsCompilerDiagnosticsTest || testKind == TestKind.Pragmas) { await TestMissingInRegularAndScriptAsync(source); }