private static TExpressionSyntax?Unwrap(ISyntaxFacts syntaxFacts, TExpressionSyntax node)
        {
            node = (TExpressionSyntax)syntaxFacts.WalkDownParentheses(node);

            if (node is TInvocationExpressionSyntax invocation)
            {
                return((TExpressionSyntax)syntaxFacts.GetExpressionOfInvocationExpression(invocation));
            }

            if (syntaxFacts.IsSimpleMemberAccessExpression(node))
            {
                return((TExpressionSyntax?)syntaxFacts.GetExpressionOfMemberAccessExpression(node));
            }

            if (node is TConditionalAccessExpressionSyntax conditionalAccess)
            {
                return((TExpressionSyntax)syntaxFacts.GetExpressionOfConditionalAccessExpression(conditionalAccess));
            }

            if (node is TElementAccessExpressionSyntax elementAccess)
            {
                return((TExpressionSyntax?)syntaxFacts.GetExpressionOfElementAccessExpression(elementAccess));
            }

            return(null);
        }
        private static SyntaxNode?Unwrap(ISyntaxFacts syntaxFacts, SyntaxNode node)
        {
            node = syntaxFacts.WalkDownParentheses(node);

            if (node is TInvocationExpression invocation)
            {
                return(syntaxFacts.GetExpressionOfInvocationExpression(invocation));
            }

            if (node is TMemberAccessExpression memberAccess)
            {
                return(syntaxFacts.GetExpressionOfMemberAccessExpression(memberAccess));
            }

            if (node is TConditionalAccessExpression conditionalAccess)
            {
                return(syntaxFacts.GetExpressionOfConditionalAccessExpression(conditionalAccess));
            }

            if (node is TElementAccessExpression elementAccess)
            {
                return(syntaxFacts.GetExpressionOfElementAccessExpression(elementAccess));
            }

            return(null);
        }
Ejemplo n.º 3
0
        protected override bool IsViableExtensionMethod(
            IMethodSymbol method,
            SyntaxNode expression,
            SemanticModel semanticModel,
            ISyntaxFacts syntaxFacts,
            CancellationToken cancellationToken
            )
        {
            var leftExpression =
                syntaxFacts.GetExpressionOfMemberAccessExpression(expression)
                ?? syntaxFacts.GetTargetOfMemberBinding(expression);

            if (leftExpression == null)
            {
                if (expression.IsKind(SyntaxKind.CollectionInitializerExpression))
                {
                    leftExpression = expression.GetAncestor <ObjectCreationExpressionSyntax>();
                }
                else
                {
                    return(false);
                }
            }

            var semanticInfo       = semanticModel.GetTypeInfo(leftExpression, cancellationToken);
            var leftExpressionType = semanticInfo.Type;

            return(IsViableExtensionMethod(method, leftExpressionType));
        }