Skip to content

Commit 9837949

Browse files
committed
#3279 Improve receiving of argument index (when delegate is argument), including code fix
1 parent 8d6262e commit 9837949

2 files changed

Lines changed: 22 additions & 2 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/ReadabilityRules/SA1130CodeFixProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ private static ImmutableArray<string> GetMethodInvocationArgumentList(SemanticMo
174174
var originalInvocableExpression = argumentListSyntax.Parent;
175175

176176
var originalSymbolInfo = semanticModel.GetSymbolInfo(originalInvocableExpression);
177-
var argumentIndex = argumentListSyntax.Arguments.IndexOf(argumentSyntax);
177+
var argumentIndex = SA1130UseLambdaSyntax.FindArgumentIndex(originalSymbolInfo, argumentSyntax, argumentListSyntax);
178178
var parameterList = SA1130UseLambdaSyntax.GetDelegateParameterList(originalSymbolInfo.Symbol, argumentIndex);
179179
return parameterList.Parameters.Select(p => p.Identifier.ToString()).ToImmutableArray();
180180
}

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1130UseLambdaSyntax.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,26 @@ internal static ParameterListSyntax GetDelegateParameterList(ISymbol symbol, int
9696
return SyntaxFactory.ParameterList(SyntaxFactory.SeparatedList(syntaxParameters));
9797
}
9898

99+
internal static int FindArgumentIndex(SymbolInfo originalSymbolInfo, ArgumentSyntax argumentSyntax, BaseArgumentListSyntax argumentListSyntax)
100+
{
101+
if (originalSymbolInfo.Symbol.Kind == SymbolKind.Method
102+
&& originalSymbolInfo.Symbol is IMethodSymbol methodSymbol)
103+
{
104+
var calledMethodParameters = methodSymbol.Parameters;
105+
var argumentIdentifier = argumentSyntax.NameColon.Name.Identifier.ValueText;
106+
107+
for (var i = 0; i < calledMethodParameters.Length; ++i)
108+
{
109+
if (string.Equals(calledMethodParameters[i].Name, argumentIdentifier))
110+
{
111+
return i;
112+
}
113+
}
114+
}
115+
116+
return argumentListSyntax.Arguments.IndexOf(argumentSyntax);
117+
}
118+
99119
private static void HandleAnonymousMethodExpression(SyntaxNodeAnalysisContext context)
100120
{
101121
bool reportDiagnostic = true;
@@ -138,7 +158,7 @@ private static bool HandleMethodInvocation(SemanticModel semanticModel, Anonymou
138158
return false;
139159
}
140160

141-
var argumentIndex = argumentListSyntax.Arguments.IndexOf(argumentSyntax);
161+
var argumentIndex = FindArgumentIndex(originalSymbolInfo, argumentSyntax, argumentListSyntax);
142162

143163
// Determine the parameter list from the method that is invoked, as delegates without parameters are allowed, but they cannot be replaced by a lambda without parameters.
144164
var parameterList = GetDelegateParameterList(originalSymbolInfo.Symbol, argumentIndex);

0 commit comments

Comments
 (0)