예제 #1
0
        public static void Analyze(
            SyntaxNodeAnalysisContext context,
            SimpleMemberInvocationExpressionInfo invocationInfo)
        {
            SimpleMemberInvocationExpressionInfo invocationInfo2 = SyntaxInfo.SimpleMemberInvocationExpressionInfo(invocationInfo.Expression);

            if (!invocationInfo2.Success)
            {
                return;
            }

            if (invocationInfo2.Arguments.Count != 1)
            {
                return;
            }

            SemanticModel     semanticModel     = context.SemanticModel;
            CancellationToken cancellationToken = context.CancellationToken;

            if (!string.Equals(invocationInfo2.NameText, "Where", StringComparison.Ordinal))
            {
                return;
            }

            IMethodSymbol methodSymbol2 = semanticModel.GetReducedExtensionMethodInfo(invocationInfo2.InvocationExpression, cancellationToken).Symbol;

            if (methodSymbol2 == null)
            {
                return;
            }

            if (!SymbolUtility.IsLinqExtensionOfIEnumerableOfT(methodSymbol2, semanticModel, "Where", parameterCount: 2))
            {
                return;
            }

            if (SymbolUtility.IsPredicateFunc(
                    methodSymbol2.Parameters[1].Type,
                    methodSymbol2.TypeArguments[0],
                    semanticModel))
            {
                IMethodSymbol methodSymbol = semanticModel.GetReducedExtensionMethodInfo(invocationInfo.InvocationExpression, cancellationToken).Symbol;

                if (methodSymbol != null &&
                    SymbolUtility.IsLinqWhere(methodSymbol, semanticModel))
                {
                    Analyze(context, invocationInfo, invocationInfo2);
                }
            }
            else if (SymbolUtility.IsPredicateFunc(
                         methodSymbol2.Parameters[1].Type,
                         methodSymbol2.TypeArguments[0],
                         semanticModel.Compilation.GetSpecialType(SpecialType.System_Int32),
                         semanticModel))
            {
                IMethodSymbol methodSymbol = semanticModel.GetReducedExtensionMethodInfo(invocationInfo.InvocationExpression, cancellationToken).Symbol;

                if (methodSymbol != null &&
                    SymbolUtility.IsLinqWhereWithIndex(methodSymbol, semanticModel))
                {
                    Analyze(context, invocationInfo, invocationInfo2);
                }
            }
        }