diff --git a/src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedParametersTests.cs b/src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedParametersTests.cs index 43d1876f9bea2..c440cc5566dca 100644 --- a/src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedParametersTests.cs +++ b/src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedParametersTests.cs @@ -1065,6 +1065,19 @@ void M(object [|o|]) { } } +}"); + } + + [WorkItem(32851, "https://github.com/dotnet/roslyn/issues/32851")] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedParameters)] + public async Task Parameter_Unused_SpecialNames() + { + await TestDiagnosticMissingAsync( +@"class C +{ + [|void M(int _, char _1, C _3)|] + { + } }"); } } diff --git a/src/EditorFeatures/VisualBasicTest/RemoveUnusedParametersAndValues/RemoveUnusedParametersTests.vb b/src/EditorFeatures/VisualBasicTest/RemoveUnusedParametersAndValues/RemoveUnusedParametersTests.vb index 4514787b27660..4605032331b8f 100644 --- a/src/EditorFeatures/VisualBasicTest/RemoveUnusedParametersAndValues/RemoveUnusedParametersTests.vb +++ b/src/EditorFeatures/VisualBasicTest/RemoveUnusedParametersAndValues/RemoveUnusedParametersTests.vb @@ -85,6 +85,16 @@ $"Public Class C System.Console.WriteLine(p) #End If End Sub +End Class") + End Function + + + + Public Async Function Parameter_Unused_SpecialNames() As Task + Await TestDiagnosticMissingAsync( +$"Class C + [|Sub M(_0 As Integer, _1 As Char, _3 As C)|] + End Sub End Class") End Function End Class diff --git a/src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.cs b/src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.cs index 134756fae8a4b..f1c8057dda491 100644 --- a/src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.cs +++ b/src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.cs @@ -223,6 +223,19 @@ private bool IsUnusedParameterCandidate(IParameterSymbol parameter) return false; } + // Ignore special parameter names for methods that need a specific signature. + // For example, methods used as a delegate in a different type or project. + // This also serves as a convenient way to suppress instances of unused parameter diagnostic + // without disabling the diagnostic completely. + // We ignore parameter names that start with an underscore and are optionally followed by an integer, + // such as '_', '_1', '_2', etc. + if (parameter.Name.StartsWith("_") && + (parameter.Name.Length == 1 || + uint.TryParse(parameter.Name.Substring(1), out _))) + { + return false; + } + return true; } }