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); }
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)); }