예제 #1
0
        private static void AnalyzePossibleContains(SyntaxNodeAnalysisContext context)
        {
            var invocationExpression = (InvocationExpressionSyntax)context.Node;

            if (invocationExpression is null)
            {
                return;
            }

            IMethodSymbol methodSymbol = context.SemanticModel.GetExtensionMethodSymbol(invocationExpression);

            if (methodSymbol is null)
            {
                return;
            }

            if (!SymbolUtility.IsLinqIEnumerableWithPredicate(methodSymbol, "Any"))
            {
                return;
            }

            if (invocationExpression.ArgumentList != null)
            {
                foreach (var argument in invocationExpression.ArgumentList.Arguments)
                {
                    // If simple lambda and the left side of a binary expression with == token is an identifier, use contains
                    if (argument.Expression is SimpleLambdaExpressionSyntax simpleLambdaExpression &&
                        simpleLambdaExpression.Body is BinaryExpressionSyntax binaryExpression)
                    {
                        if (binaryExpression.OperatorToken.Kind() == SyntaxKind.EqualsEqualsToken)
                        {
                            var parameter = simpleLambdaExpression.Parameter.Identifier;

                            if (binaryExpression.Left is IdentifierNameSyntax leftIdentifier &&
                                leftIdentifier.Identifier.ValueText == parameter.ValueText)
                            {
                                context.ReportDiagnostic(Diagnostic.Create(Rule, argument.GetLocation()));
                            }
                            else if (binaryExpression.Right is IdentifierNameSyntax rightIdentifier &&
                                     rightIdentifier.Identifier.ValueText == parameter.ValueText)
                            {
                                context.ReportDiagnostic(Diagnostic.Create(Rule, argument.GetLocation()));
                            }
                        }
                    }
                }
            }