@@ -53,23 +53,37 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
5353 return SpecializedTasks . CompletedTask ;
5454 }
5555
56- private static SyntaxNode ReplaceWithLambda ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod , string argumentsProperty )
56+ private static SyntaxNode ReplaceWithLambda ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod )
5757 {
5858 var parameterList = anonymousMethod . ParameterList ;
5959 SyntaxNode lambdaExpression ;
6060
6161 if ( parameterList == null )
6262 {
63- SeparatedSyntaxList < ParameterSyntax > newList = default ( SeparatedSyntaxList < ParameterSyntax > ) ;
63+ ImmutableArray < string > argumentList = default ( ImmutableArray < string > ) ;
6464
65- if ( ! string . IsNullOrEmpty ( argumentsProperty ) )
65+ switch ( anonymousMethod . Parent . Kind ( ) )
6666 {
67- var argumentNames = argumentsProperty . Split ( ',' ) ;
68- List < ParameterSyntax > parameters = GenerateUniqueParameterNames ( semanticModel , anonymousMethod , argumentNames ) ;
69-
70- newList = SyntaxFactory . SeparatedList ( parameters , Enumerable . Repeat ( ParameterListSeparator , parameters . Count - 1 ) ) ;
67+ case SyntaxKind . Argument :
68+ argumentList = GetMethodInvocationArgumentList ( semanticModel , anonymousMethod ) ;
69+ break ;
70+
71+ case SyntaxKind . EqualsValueClause :
72+ argumentList = GetEqualsArgumentList ( semanticModel , anonymousMethod ) ;
73+ break ;
74+
75+ case SyntaxKind . AddAssignmentExpression :
76+ case SyntaxKind . SubtractAssignmentExpression :
77+ argumentList = GetAssignmentArgumentList ( semanticModel , anonymousMethod ) ;
78+ break ;
7179 }
7280
81+ List < ParameterSyntax > parameters = GenerateUniqueParameterNames ( semanticModel , anonymousMethod , argumentList ) ;
82+
83+ var newList = ( parameters . Count > 0 )
84+ ? SyntaxFactory . SeparatedList ( parameters , Enumerable . Repeat ( ParameterListSeparator , parameters . Count - 1 ) )
85+ : SyntaxFactory . SeparatedList < ParameterSyntax > ( ) ;
86+
7387 parameterList = SyntaxFactory . ParameterList ( newList )
7488 . WithLeadingTrivia ( anonymousMethod . DelegateKeyword . LeadingTrivia )
7589 . WithTrailingTrivia ( anonymousMethod . DelegateKeyword . TrailingTrivia ) ;
@@ -119,7 +133,39 @@ private static SyntaxNode ReplaceWithLambda(SemanticModel semanticModel, Anonymo
119133 . WithAdditionalAnnotations ( Formatter . Annotation ) ;
120134 }
121135
122- private static List < ParameterSyntax > GenerateUniqueParameterNames ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod , string [ ] argumentNames )
136+ private static ImmutableArray < string > GetMethodInvocationArgumentList ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod )
137+ {
138+ var argumentSyntax = ( ArgumentSyntax ) anonymousMethod . Parent ;
139+ var argumentListSyntax = ( ArgumentListSyntax ) argumentSyntax . Parent ;
140+ var originalInvocationExpression = ( InvocationExpressionSyntax ) argumentListSyntax . Parent ;
141+
142+ var originalSymbolInfo = semanticModel . GetSymbolInfo ( originalInvocationExpression ) ;
143+ var argumentIndex = argumentListSyntax . Arguments . IndexOf ( argumentSyntax ) ;
144+ var parameterList = SA1130UseLambdaSyntax . GetDelegateParameterList ( ( IMethodSymbol ) originalSymbolInfo . Symbol , argumentIndex ) ;
145+ return parameterList . Parameters . Select ( p => p . Identifier . ToString ( ) ) . ToImmutableArray ( ) ;
146+ }
147+
148+ private static ImmutableArray < string > GetEqualsArgumentList ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod )
149+ {
150+ var equalsValueClauseSyntax = ( EqualsValueClauseSyntax ) anonymousMethod . Parent ;
151+ var variableDeclaration = ( VariableDeclarationSyntax ) equalsValueClauseSyntax . Parent . Parent ;
152+
153+ var symbol = semanticModel . GetSymbolInfo ( variableDeclaration . Type ) ;
154+ var namedTypeSymbol = ( INamedTypeSymbol ) symbol . Symbol ;
155+ return namedTypeSymbol . DelegateInvokeMethod . Parameters . Select ( ps => ps . Name ) . ToImmutableArray ( ) ;
156+ }
157+
158+ private static ImmutableArray < string > GetAssignmentArgumentList ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod )
159+ {
160+ var assignmentExpressionSyntax = ( AssignmentExpressionSyntax ) anonymousMethod . Parent ;
161+
162+ var symbol = semanticModel . GetSymbolInfo ( assignmentExpressionSyntax . Left ) ;
163+ var eventSymbol = ( IEventSymbol ) symbol . Symbol ;
164+ var namedTypeSymbol = ( INamedTypeSymbol ) eventSymbol . Type ;
165+ return namedTypeSymbol . DelegateInvokeMethod . Parameters . Select ( ps => ps . Name ) . ToImmutableArray ( ) ;
166+ }
167+
168+ private static List < ParameterSyntax > GenerateUniqueParameterNames ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod , ImmutableArray < string > argumentNames )
123169 {
124170 var parameters = new List < ParameterSyntax > ( ) ;
125171
@@ -175,8 +221,7 @@ private static async Task<Document> GetTransformedDocumentAsync(Document documen
175221
176222 var anonymousMethod = ( AnonymousMethodExpressionSyntax ) syntaxRoot . FindNode ( diagnostic . Location . SourceSpan , getInnermostNodeForTie : true ) ;
177223
178- var argumentsProperty = diagnostic . Properties . ContainsKey ( SA1130UseLambdaSyntax . DelegateArgumentNamesProperty ) ? diagnostic . Properties [ SA1130UseLambdaSyntax . DelegateArgumentNamesProperty ] : string . Empty ;
179- var newSyntaxRoot = syntaxRoot . ReplaceNode ( anonymousMethod , ReplaceWithLambda ( semanticModel , anonymousMethod , argumentsProperty ) ) ;
224+ var newSyntaxRoot = syntaxRoot . ReplaceNode ( anonymousMethod , ReplaceWithLambda ( semanticModel , anonymousMethod ) ) ;
180225 var newDocument = document . WithSyntaxRoot ( newSyntaxRoot . WithoutFormatting ( ) ) ;
181226
182227 return newDocument ;
@@ -195,18 +240,14 @@ protected override async Task<SyntaxNode> FixAllInDocumentAsync(FixAllContext fi
195240 var semanticModel = await document . GetSemanticModelAsync ( fixAllContext . CancellationToken ) . ConfigureAwait ( false ) ;
196241
197242 var nodes = new List < AnonymousMethodExpressionSyntax > ( ) ;
198- var nodeProperties = new Dictionary < AnonymousMethodExpressionSyntax , string > ( ) ;
199243
200244 foreach ( var diagnostic in diagnostics )
201245 {
202- var argumentsProperty = diagnostic . Properties . ContainsKey ( SA1130UseLambdaSyntax . DelegateArgumentNamesProperty ) ? diagnostic . Properties [ SA1130UseLambdaSyntax . DelegateArgumentNamesProperty ] : string . Empty ;
203246 var node = ( AnonymousMethodExpressionSyntax ) syntaxRoot . FindNode ( diagnostic . Location . SourceSpan , getInnermostNodeForTie : true ) ;
204-
205247 nodes . Add ( node ) ;
206- nodeProperties . Add ( node , argumentsProperty ) ;
207248 }
208249
209- return syntaxRoot . ReplaceNodes ( nodes , ( originalNode , rewrittenNode ) => ReplaceWithLambda ( semanticModel , rewrittenNode , nodeProperties [ rewrittenNode ] ) ) ;
250+ return syntaxRoot . ReplaceNodes ( nodes , ( originalNode , rewrittenNode ) => ReplaceWithLambda ( semanticModel , rewrittenNode ) ) ;
210251 }
211252 }
212253 }
0 commit comments