public void Parser_UnaryExpression_HonorsPrecedences(SyntaxKind unaryKind, SyntaxKind binaryKind) { var unaryPrecedence = unaryKind.GetUnaryOperatorPrecedence(); var binaryPrecedence = binaryKind.GetBinaryOperatorPrecedence(); var unaryText = SyntaxFacts.GetText(unaryKind); var binaryText = SyntaxFacts.GetText(binaryKind); var text = $"{unaryText} a {binaryText} b"; var expression = SyntaxTree.Parse(text).Root; if (unaryPrecedence >= binaryPrecedence) { // binary // / \ // unary b // | // a using (var e = new AssertingEnumerator(expression)) { e.AssertNode(SyntaxKind.BinaryExpression); e.AssertNode(SyntaxKind.UnaryExpression); e.AssertToken(unaryKind, unaryText); e.AssertNode(SyntaxKind.NameExpression); e.AssertToken(SyntaxKind.IdentifierToken, "a"); e.AssertToken(binaryKind, binaryText); e.AssertNode(SyntaxKind.NameExpression); e.AssertToken(SyntaxKind.IdentifierToken, "b"); } } else { // unary // | // binary // / \ // a b using (var e = new AssertingEnumerator(expression)) { e.AssertNode(SyntaxKind.UnaryExpression); e.AssertToken(unaryKind, unaryText); e.AssertNode(SyntaxKind.BinaryExpression); e.AssertNode(SyntaxKind.NameExpression); e.AssertToken(SyntaxKind.IdentifierToken, "a"); e.AssertToken(binaryKind, binaryText); e.AssertNode(SyntaxKind.NameExpression); e.AssertToken(SyntaxKind.IdentifierToken, "b"); } } }
public void HonorPrecedences_GivenUnaryExpression(SyntaxKind unaaryKind, SyntaxKind binaryKind) { var unaryPrecedence = unaaryKind.GetUnaryOperatorPrecedence(); var binaryPrecedence = binaryKind.GetBinaryOperatorPrecedence(); var unaryText = unaaryKind.GetText(); var binaryText = binaryKind.GetText(); var text = $"{unaryText} a {binaryText} b"; var expressionSyntax = ParseExpression(text); if (unaryPrecedence >= binaryPrecedence) { // op2 // / \ // op1 b // | // a using (var asserter = new AssertingEnumerator(expressionSyntax)) { asserter.AssertNode(SyntaxKind.BinaryExpression); asserter.AssertNode(SyntaxKind.UnaryExpression); asserter.AssertToken(unaaryKind, unaryText); asserter.AssertNode(SyntaxKind.NameExpression); asserter.AssertToken(SyntaxKind.IdentifierToken, "a"); asserter.AssertToken(binaryKind, binaryText); asserter.AssertNode(SyntaxKind.NameExpression); asserter.AssertToken(SyntaxKind.IdentifierToken, "b"); } } else { // op2 // | // op1 // / \ // a b using (var asserter = new AssertingEnumerator(expressionSyntax)) { asserter.AssertNode(SyntaxKind.UnaryExpression); asserter.AssertNode(SyntaxKind.BinaryExpression); asserter.AssertToken(unaaryKind, unaryText); asserter.AssertNode(SyntaxKind.NameExpression); asserter.AssertToken(SyntaxKind.IdentifierToken, "a"); asserter.AssertToken(binaryKind, binaryText); asserter.AssertNode(SyntaxKind.NameExpression); asserter.AssertToken(SyntaxKind.IdentifierToken, "b"); } } }