@@ -72,7 +72,7 @@ private static async Task<bool> CanFixAsync(CodeFixContext context, Diagnostic d
7272 private static SyntaxNode ReplaceWithLambda ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod )
7373 {
7474 var parameterList = anonymousMethod . ParameterList ;
75- SyntaxNode lambdaExpression ;
75+ ExpressionSyntax lambdaExpression ;
7676 SyntaxToken arrowToken ;
7777
7878 if ( parameterList == null )
@@ -91,16 +91,17 @@ private static SyntaxNode ReplaceWithLambda(SemanticModel semanticModel, Anonymo
9191
9292 case SyntaxKind . AddAssignmentExpression :
9393 case SyntaxKind . SubtractAssignmentExpression :
94- var list = GetAssignmentArgumentList ( semanticModel , anonymousMethod ) ;
95-
96- if ( list == null )
9794 {
98- return null ;
95+ var list = GetAssignmentArgumentList ( semanticModel , anonymousMethod ) ;
96+ if ( list == null )
97+ {
98+ return null ;
99+ }
100+
101+ argumentList = list . Value ;
102+ break ;
99103 }
100104
101- argumentList = list . Value ;
102- break ;
103-
104105 case SyntaxKind . ArrowExpressionClause :
105106 case SyntaxKind . ReturnStatement :
106107 argumentList = GetMemberReturnTypeArgumentList ( semanticModel , anonymousMethod ) ;
@@ -110,6 +111,18 @@ private static SyntaxNode ReplaceWithLambda(SemanticModel semanticModel, Anonymo
110111 }
111112
112113 break ;
114+
115+ case SyntaxKind . CastExpression :
116+ {
117+ var list = GetCastTypeArgumentList ( semanticModel , anonymousMethod ) ;
118+ if ( list == null )
119+ {
120+ return null ;
121+ }
122+
123+ argumentList = list . Value ;
124+ break ;
125+ }
113126 }
114127
115128 List < ParameterSyntax > parameters = GenerateUniqueParameterNames ( semanticModel , anonymousMethod , argumentList ) ;
@@ -165,6 +178,13 @@ private static SyntaxNode ReplaceWithLambda(SemanticModel semanticModel, Anonymo
165178 lambdaExpression = SyntaxFactory . ParenthesizedLambdaExpression ( anonymousMethod . AsyncKeyword , parameterListSyntax , arrowToken , anonymousMethod . Body ) ;
166179 }
167180
181+ if ( anonymousMethod . Parent . IsKind ( SyntaxKind . CastExpression ) )
182+ {
183+ // In this case, the lambda needs enclosing parenthesis to be syntactically correct
184+ lambdaExpression = SyntaxFactory . ParenthesizedExpression ( lambdaExpression ) ;
185+ }
186+
187+ // TODO: No tests require this annotation. Can it be removed?
168188 return lambdaExpression
169189 . WithAdditionalAnnotations ( Formatter . Annotation ) ;
170190 }
@@ -213,6 +233,21 @@ private static ImmutableArray<string> GetMemberReturnTypeArgumentList(SemanticMo
213233 return ! ( ( ( IMethodSymbol ) enclosingSymbol ) . ReturnType is INamedTypeSymbol returnType ) ? ImmutableArray < string > . Empty : returnType . DelegateInvokeMethod . Parameters . Select ( ps => ps . Name ) . ToImmutableArray ( ) ;
214234 }
215235
236+ private static ImmutableArray < string > ? GetCastTypeArgumentList ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod )
237+ {
238+ var castExpression = ( CastExpressionSyntax ) anonymousMethod . Parent ;
239+
240+ var symbol = semanticModel . GetSymbolInfo ( castExpression . Type ) ;
241+ var namedTypeSymbol = symbol . Symbol as INamedTypeSymbol ;
242+ var parameters = namedTypeSymbol ? . DelegateInvokeMethod ? . Parameters ;
243+ if ( parameters == null )
244+ {
245+ return null ;
246+ }
247+
248+ return parameters . Value . Select ( ps => ps . Name ) . ToImmutableArray ( ) ;
249+ }
250+
216251 private static List < ParameterSyntax > GenerateUniqueParameterNames ( SemanticModel semanticModel , AnonymousMethodExpressionSyntax anonymousMethod , ImmutableArray < string > argumentNames )
217252 {
218253 var parameters = new List < ParameterSyntax > ( ) ;
@@ -306,7 +341,7 @@ protected override async Task<SyntaxNode> FixAllInDocumentAsync(FixAllContext fi
306341 return rewrittenNode ;
307342 }
308343
309- return newNode ;
344+ return newNode . WithoutFormatting ( ) ;
310345 } ) ;
311346 }
312347 }
0 commit comments