protected bool ValuePatternMatches(TExpressionSyntax expression) { if (_valuePattern.IsToken) { return(_syntaxFacts.IsIdentifierName(expression) && _syntaxFacts.AreEquivalent( _valuePattern.AsToken(), _syntaxFacts.GetIdentifierOfSimpleName(expression))); } else { return(_syntaxFacts.AreEquivalent( _valuePattern.AsNode(), expression)); } }
internal static SyntaxNode?GetWhenPartMatch( ISyntaxFacts syntaxFacts, SemanticModel semanticModel, SyntaxNode expressionToMatch, SyntaxNode whenPart) { expressionToMatch = RemoveObjectCastIfAny(syntaxFacts, semanticModel, expressionToMatch); var current = whenPart; while (true) { var unwrapped = Unwrap(syntaxFacts, current); if (unwrapped == null) { return(null); } if (current is TMemberAccessExpression || current is TElementAccessExpression) { if (syntaxFacts.AreEquivalent(unwrapped, expressionToMatch)) { return(unwrapped); } } current = unwrapped; } }
public static bool TryMatchPattern( ISyntaxFacts syntaxFacts, IConditionalOperation ifOperation, out ISimpleAssignmentOperation trueAssignment, out ISimpleAssignmentOperation falseAssignment) { trueAssignment = null; falseAssignment = null; var trueStatement = ifOperation.WhenTrue; var falseStatement = ifOperation.WhenFalse; trueStatement = UseConditionalExpressionHelpers.UnwrapSingleStatementBlock(trueStatement); falseStatement = UseConditionalExpressionHelpers.UnwrapSingleStatementBlock(falseStatement); if (!TryGetAssignment(trueStatement, out trueAssignment) || !TryGetAssignment(falseStatement, out falseAssignment)) { return(false); } // The left side of both assignment statements has to be syntactically identical (modulo // trivia differences). if (!syntaxFacts.AreEquivalent(trueAssignment.Target.Syntax, falseAssignment.Target.Syntax)) { return(false); } return(UseConditionalExpressionHelpers.CanConvert( syntaxFacts, ifOperation, trueAssignment, falseAssignment)); }
internal static TExpressionSyntax?GetWhenPartMatch( ISyntaxFacts syntaxFacts, SemanticModel semanticModel, TExpressionSyntax expressionToMatch, TExpressionSyntax whenPart, CancellationToken cancellationToken) { expressionToMatch = RemoveObjectCastIfAny(syntaxFacts, semanticModel, expressionToMatch, cancellationToken); var current = whenPart; while (true) { var unwrapped = Unwrap(syntaxFacts, current); if (unwrapped == null) { return(null); } if (syntaxFacts.IsSimpleMemberAccessExpression(current) || current is TElementAccessExpressionSyntax) { if (syntaxFacts.AreEquivalent(unwrapped, expressionToMatch)) { return(unwrapped); } } current = unwrapped; } }
public static bool TryMatchPattern( ISyntaxFacts syntaxFacts, IConditionalOperation ifOperation, [NotNullWhen(true)] out IOperation trueStatement, [NotNullWhen(true)] out IOperation falseStatement, out ISimpleAssignmentOperation?trueAssignment, out ISimpleAssignmentOperation?falseAssignment) { trueAssignment = null; falseAssignment = null; trueStatement = ifOperation.WhenTrue; falseStatement = ifOperation.WhenFalse; trueStatement = UseConditionalExpressionHelpers.UnwrapSingleStatementBlock(trueStatement); falseStatement = UseConditionalExpressionHelpers.UnwrapSingleStatementBlock(falseStatement); if (!TryGetAssignmentOrThrow(trueStatement, out trueAssignment, out var trueThrow) || !TryGetAssignmentOrThrow(falseStatement, out falseAssignment, out var falseThrow)) { return(false); } var anyAssignment = trueAssignment ?? falseAssignment; if (UseConditionalExpressionHelpers.HasInconvertibleThrowStatement( syntaxFacts, anyAssignment?.IsRef == true, trueThrow, falseThrow)) { return(false); } // The left side of both assignment statements has to be syntactically identical (modulo // trivia differences). if (trueAssignment != null && falseAssignment != null && !syntaxFacts.AreEquivalent(trueAssignment.Target.Syntax, falseAssignment.Target.Syntax)) { return(false); } return(UseConditionalExpressionHelpers.CanConvert( syntaxFacts, ifOperation, trueStatement, falseStatement)); }