Exemplo n.º 1
0
        internal static void AnalyzeInvocationExpression(SyntaxNodeAnalysisContext context)
        {
            var invocationExpression = (InvocationExpressionSyntax)context.Node;

            if (!invocationExpression.ContainsDiagnostics &&
                !invocationExpression.SpanContainsDirectives())
            {
                MemberInvocationExpressionWithSingleParameter invocation;
                if (MemberInvocationExpressionWithSingleParameter.TryCreate(invocationExpression, out invocation) &&
                    invocation.NameText == "Any")
                {
                    MemberInvocationExpressionWithSingleParameter invocation2;
                    if (MemberInvocationExpressionWithSingleParameter.TryCreate(invocation.Expression, out invocation2) &&
                        invocation2.NameText == "Where")
                    {
                        SemanticModel     semanticModel     = context.SemanticModel;
                        CancellationToken cancellationToken = context.CancellationToken;

                        MethodInfo methodInfo;
                        if (semanticModel.TryGetExtensionMethodInfo(invocationExpression, out methodInfo, ExtensionMethodKind.None, cancellationToken) &&
                            methodInfo.IsLinqExtensionOfIEnumerableOfTWithPredicate("Any"))
                        {
                            MethodInfo methodInfo2;
                            if (semanticModel.TryGetExtensionMethodInfo(invocation2.InvocationExpression, out methodInfo2, ExtensionMethodKind.None, cancellationToken) &&
                                methodInfo2.IsLinqWhere(allowImmutableArrayExtension: true))
                            {
                                LambdaExpressionWithSingleParameter lambda;
                                if (LambdaExpressionWithSingleParameter.TryCreate(invocation.Argument.Expression, out lambda) &&
                                    lambda.Body is ExpressionSyntax)
                                {
                                    LambdaExpressionWithSingleParameter lambda2;
                                    if (LambdaExpressionWithSingleParameter.TryCreate(invocation2.Argument.Expression, out lambda2) &&
                                        lambda2.Body is ExpressionSyntax &&
                                        lambda.ParameterName.Equals(lambda2.ParameterName, StringComparison.Ordinal))
                                    {
                                        context.ReportDiagnostic(
                                            DiagnosticDescriptors.SimplifyLinqMethodChain,
                                            Location.Create(context.SyntaxTree(), TextSpan.FromBounds(invocation2.Name.SpanStart, invocationExpression.Span.End)));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        public static Task <Document> RefactorAsync(
            Document document,
            InvocationExpressionSyntax invocationExpression,
            CancellationToken cancellationToken)
        {
            MemberInvocationExpressionWithSingleParameter invocation  = MemberInvocationExpressionWithSingleParameter.Create(invocationExpression);
            MemberInvocationExpressionWithSingleParameter invocation2 = MemberInvocationExpressionWithSingleParameter.Create((InvocationExpressionSyntax)invocation.Expression);

            LambdaExpressionWithSingleParameter lambda  = LambdaExpressionWithSingleParameter.Create((LambdaExpressionSyntax)invocation.Argument.Expression);
            LambdaExpressionWithSingleParameter lambda2 = LambdaExpressionWithSingleParameter.Create((LambdaExpressionSyntax)invocation2.Argument.Expression);

            BinaryExpressionSyntax logicalAnd = CSharpFactory.LogicalAndExpression(
                ((ExpressionSyntax)lambda2.Body).Parenthesize(moveTrivia: true).WithSimplifierAnnotation(),
                ((ExpressionSyntax)lambda.Body).Parenthesize(moveTrivia: true).WithSimplifierAnnotation());

            InvocationExpressionSyntax newNode = invocation2.InvocationExpression
                                                 .ReplaceNode(invocation2.Name, invocation.Name.WithTriviaFrom(invocation2.Name))
                                                 .WithArgumentList(invocation2.ArgumentList.ReplaceNode((ExpressionSyntax)lambda2.Body, logicalAnd));

            return(document.ReplaceNodeAsync(invocationExpression, newNode, cancellationToken));
        }