public static void Analyze(
            SyntaxNodeAnalysisContext context,
            InvocationExpressionSyntax invocation,
            MemberAccessExpressionSyntax memberAccess)
        {
            if (memberAccess.Expression?.IsKind(SyntaxKind.InvocationExpression) == true)
            {
                var invocation2 = (InvocationExpressionSyntax)memberAccess.Expression;

                if (invocation2.ArgumentList?.Arguments.Count == 1 &&
                    invocation2.Expression?.IsKind(SyntaxKind.SimpleMemberAccessExpression) == true)
                {
                    var memberAccess2 = (MemberAccessExpressionSyntax)invocation2.Expression;

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

                    if (string.Equals(memberAccess2.Name?.Identifier.ValueText, "Where", StringComparison.Ordinal))
                    {
                        IMethodSymbol methodSymbol = semanticModel.GetMethodSymbol(invocation2, cancellationToken);

                        if (methodSymbol != null)
                        {
                            IMethodSymbol reducedFrom = methodSymbol.ReducedFrom;

                            if (reducedFrom?.Name.Equals("Where", StringComparison.Ordinal) == true)
                            {
                                ImmutableArray <IParameterSymbol> parameters = methodSymbol.Parameters;

                                if (parameters.Length == 1 &&
                                    SyntaxAnalyzer.IsContainedInEnumerable(reducedFrom, semanticModel) &&
                                    SyntaxAnalyzer.IsGenericIEnumerable(reducedFrom.Parameters.First().Type))
                                {
                                    if (SyntaxAnalyzer.IsPredicateFunc(
                                            parameters[0].Type,
                                            methodSymbol.TypeArguments[0],
                                            semanticModel))
                                    {
                                        if (SyntaxAnalyzer.IsEnumerableWhereMethod(invocation, semanticModel, cancellationToken))
                                        {
                                            Analyze(context, invocation, invocation2, memberAccess, memberAccess2);
                                        }
                                    }
                                    else if (SyntaxAnalyzer.IsPredicateFunc(
                                                 parameters[0].Type,
                                                 methodSymbol.TypeArguments[0],
                                                 semanticModel.Compilation.GetSpecialType(SpecialType.System_Int32),
                                                 semanticModel))
                                    {
                                        if (SyntaxAnalyzer.IsEnumerableWhereMethodWithIndex(invocation, semanticModel, cancellationToken))
                                        {
                                            Analyze(context, invocation, invocation2, memberAccess, memberAccess2);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }