예제 #1
0
        public static bool TryGetAction(
            StatementSyntax statement,
            out bool isAllToAny,
            out Func <SyntaxNode, SyntaxNode> action)
        {
            isAllToAny = false;
            action     = null;

            InvocationExpressionSyntax   invocation;
            SimpleLambdaExpressionSyntax lambda;

            //
            // Find LINQ All/Any invocation where predicate is invertible.
            //

            int methodIndex;

            if (!LinqHelper.TryFindMethodInvocation(
                    statement,
                    ImmutableArray.Create(LinqHelper.AllMethodName, LinqHelper.AnyMethodName),
                    IsInvertible,
                    out invocation,
                    out lambda,
                    out methodIndex))
            {
                return(false);
            }

            isAllToAny = methodIndex == 0;

            //
            // Found invocation must be last in a chain.
            //

            if (invocation.Parent.IsKind(SyntaxKind.SimpleMemberAccessExpression) ||
                invocation.Parent.IsKind(SyntaxKind.ConditionalAccessExpression))
            {
                return(false);
            }

            bool isNegationRequired = !invocation.Parent.IsKind(SyntaxKind.LogicalNotExpression);

            bool allToAny = isAllToAny;

            action = syntaxRoot =>
            {
                var newInvocation = Invert(allToAny, isNegationRequired, invocation, lambda);

                SyntaxNode newRoot;

                if (isNegationRequired)
                {
                    var finalNegation = SyntaxFactory.PrefixUnaryExpression(
                        SyntaxKind.LogicalNotExpression,
                        newInvocation);

                    newRoot = syntaxRoot.ReplaceNode((SyntaxNode)invocation, finalNegation);
                }
                else
                {
                    newRoot = syntaxRoot.ReplaceNode((SyntaxNode)invocation.Parent, newInvocation);
                }

                return(newRoot.Format());
            };

            return(true);
        }