@@ -5,8 +5,6 @@ namespace StyleCop.Analyzers.MaintainabilityRules
55{
66 using System ;
77 using System . Collections . Immutable ;
8- using System . Linq ;
9- using System . Threading ;
108 using Microsoft . CodeAnalysis ;
119 using Microsoft . CodeAnalysis . CSharp ;
1210 using Microsoft . CodeAnalysis . CSharp . Syntax ;
@@ -93,7 +91,7 @@ private static void HandleAnonymousMethodExpression(SyntaxNodeAnalysisContext co
9391 {
9492 case SyntaxKind . ObjectCreationExpression :
9593 case SyntaxKind . InvocationExpression :
96- if ( HasAmbiguousOverload ( context , argumentListSyntax . Arguments . IndexOf ( argumentSyntax ) , argumentListSyntax . Parent ) )
94+ if ( HasAmbiguousOverload ( context , syntax , argumentListSyntax . Parent ) )
9795 {
9896 return ;
9997 }
@@ -106,36 +104,11 @@ private static void HandleAnonymousMethodExpression(SyntaxNodeAnalysisContext co
106104 context . ReportDiagnostic ( Diagnostic . Create ( Descriptor , syntax . ParameterList . GetLocation ( ) ) ) ;
107105 }
108106
109- private static bool HasAmbiguousOverload ( SyntaxNodeAnalysisContext context , int parameterIndex , SyntaxNode methodCallSyntax )
107+ private static bool HasAmbiguousOverload ( SyntaxNodeAnalysisContext context , AnonymousMethodExpressionSyntax anonymousMethodExpression , SyntaxNode methodCallSyntax )
110108 {
111- var methodSymbol = ( IMethodSymbol ) context . SemanticModel . GetSymbolInfo ( methodCallSyntax , context . CancellationToken ) . Symbol ;
112-
113- var nameOverloads = methodSymbol . ContainingType . GetMembers ( methodSymbol . Name ) ;
114- var parameterCountMatchingOverloads = nameOverloads . OfType < IMethodSymbol > ( ) . Where ( symbol => ( symbol != methodSymbol ) && ( symbol . Parameters . Length == methodSymbol . Parameters . Length ) ) ;
115-
116- foreach ( var overload in parameterCountMatchingOverloads )
117- {
118- var isAmbiguousOverload = true ;
119-
120- for ( var i = 0 ; isAmbiguousOverload && ( i < methodSymbol . Parameters . Length ) ; i ++ )
121- {
122- if ( i == parameterIndex )
123- {
124- isAmbiguousOverload = overload . Parameters [ i ] . Type . TypeKind == TypeKind . Delegate ;
125- }
126- else
127- {
128- isAmbiguousOverload = methodSymbol . Parameters [ i ] . Type == overload . Parameters [ i ] . Type ;
129- }
130- }
131-
132- if ( isAmbiguousOverload )
133- {
134- return true ;
135- }
136- }
137-
138- return false ;
109+ var nodeForSpeculation = methodCallSyntax . ReplaceNode ( anonymousMethodExpression , anonymousMethodExpression . WithParameterList ( null ) ) ;
110+ var speculativeSymbolInfo = context . SemanticModel . GetSpeculativeSymbolInfo ( methodCallSyntax . SpanStart , nodeForSpeculation , SpeculativeBindingOption . BindAsExpression ) ;
111+ return speculativeSymbolInfo . Symbol == null ;
139112 }
140113 }
141114}
0 commit comments