Esempio n. 1
0
        public void Parser_Parse_Query_Ordered_WithMultipleColumns()
        {
            const string text = @"
                SELECT  *
                ORDER   BY 1, 2
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.OrderedQuery);
                enumerator.AssertNode(SyntaxKind.SelectQuery);
                enumerator.AssertNode(SyntaxKind.SelectClause);
                enumerator.AssertToken(SyntaxKind.SelectKeyword, @"SELECT");
                enumerator.AssertNode(SyntaxKind.WildcardSelectColumn);
                enumerator.AssertToken(SyntaxKind.AsteriskToken, @"*");
                enumerator.AssertToken(SyntaxKind.OrderKeyword, @"ORDER");
                enumerator.AssertToken(SyntaxKind.ByKeyword, @"BY");
                enumerator.AssertNode(SyntaxKind.OrderByColumn);
                enumerator.AssertNode(SyntaxKind.LiteralExpression);
                enumerator.AssertToken(SyntaxKind.NumericLiteralToken, @"1");
                enumerator.AssertToken(SyntaxKind.CommaToken, @",");
                enumerator.AssertNode(SyntaxKind.OrderByColumn);
                enumerator.AssertNode(SyntaxKind.LiteralExpression);
                enumerator.AssertToken(SyntaxKind.NumericLiteralToken, @"2");
            }
        }
Esempio n. 2
0
        public void Parser_Parse_Query_GroupByClause_WithMultipleColumns()
        {
            const string text = @"
                SELECT  *
                FROM    Employees e
                {GROUP   BY e.Country, e.City}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.GroupByClause);
                enumerator.AssertToken(SyntaxKind.GroupKeyword, @"GROUP");
                enumerator.AssertToken(SyntaxKind.ByKeyword, @"BY");
                enumerator.AssertNode(SyntaxKind.GroupByColumn);
                enumerator.AssertNode(SyntaxKind.PropertyAccessExpression);
                enumerator.AssertNode(SyntaxKind.NameExpression);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"e");
                enumerator.AssertToken(SyntaxKind.DotToken, @".");
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"Country");
                enumerator.AssertToken(SyntaxKind.CommaToken, @",");
                enumerator.AssertNode(SyntaxKind.GroupByColumn);
                enumerator.AssertNode(SyntaxKind.PropertyAccessExpression);
                enumerator.AssertNode(SyntaxKind.NameExpression);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"e");
                enumerator.AssertToken(SyntaxKind.DotToken, @".");
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"City");
            }
        }
Esempio n. 3
0
    public void ParseNestedBlockExpression()
    {
        var text       = "{{}}";
        var expression = SyntaxTree.Parse(text).Root;

        using var e = new AssertingEnumerator(expression);

        //└──ExpressionStatement
        //    ├──BlockExpression
        //    │   ├──OpenBraceToken
        //    │   ├──BlockExpression
        //    │   │   ├──OpenBraceToken
        //    │   │   ├──UnitExpression
        //    │   │   │   ├──CloseBraceToken
        //    │   │   │   └──CloseBraceToken
        //    │   │   └──CloseBraceToken
        //    │   └──CloseBraceToken
        //    └──NewLineToken

        e.AssertNode(SyntaxKind.CompilationUnit);
        e.AssertNode(SyntaxKind.GlobalStatement);
        e.AssertNode(SyntaxKind.ExpressionStatement);
        e.AssertNode(SyntaxKind.BlockExpression);
        e.AssertToken(SyntaxKind.OpenBraceToken, "{");
        e.AssertNode(SyntaxKind.BlockExpression);
        e.AssertToken(SyntaxKind.OpenBraceToken, "{");
        e.AssertNode(SyntaxKind.UnitExpression);
        e.AssertToken(SyntaxKind.OpenParenToken, "(");
        e.AssertToken(SyntaxKind.CloseParenToken, ")");
        e.AssertToken(SyntaxKind.CloseBraceToken, "}");
        e.AssertToken(SyntaxKind.CloseBraceToken, "}");
        e.AssertToken(SyntaxKind.EndOfInputToken, "");
    }
Esempio n. 4
0
        public void Parser_Parse_Query_CommonTableExpression_WithRecursiveKeyword()
        {
            const string text = @"
                WITH RECURSIVE CTE AS (
                    SELECT *
                )
                SELECT  *
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.CommonTableExpressionQuery);
                enumerator.AssertToken(SyntaxKind.WithKeyword, @"WITH");
                enumerator.AssertNode(SyntaxKind.CommonTableExpression);
                enumerator.AssertToken(SyntaxKind.RecursiveKeyword, @"RECURSIVE");
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"CTE");
                enumerator.AssertToken(SyntaxKind.AsKeyword, @"AS");
                enumerator.AssertToken(SyntaxKind.LeftParenthesisToken, @"(");
                enumerator.AssertNode(SyntaxKind.SelectQuery);
                enumerator.AssertNode(SyntaxKind.SelectClause);
                enumerator.AssertToken(SyntaxKind.SelectKeyword, @"SELECT");
                enumerator.AssertNode(SyntaxKind.WildcardSelectColumn);
                enumerator.AssertToken(SyntaxKind.AsteriskToken, @"*");
                enumerator.AssertToken(SyntaxKind.RightParenthesisToken, @")");
                enumerator.AssertNode(SyntaxKind.SelectQuery);
                enumerator.AssertNode(SyntaxKind.SelectClause);
                enumerator.AssertToken(SyntaxKind.SelectKeyword, @"SELECT");
                enumerator.AssertNode(SyntaxKind.WildcardSelectColumn);
                enumerator.AssertToken(SyntaxKind.AsteriskToken, @"*");
            }
        }
Esempio n. 5
0
        public void Parser_Parse_Table_Derived_WithAsKeyword()
        {
            const string text = @"
                SELECT  *
                FROM    {(SELECT * FROM Employees) AS d}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.DerivedTableReference);
                enumerator.AssertToken(SyntaxKind.LeftParenthesisToken, @"(");
                enumerator.AssertNode(SyntaxKind.SelectQuery);
                enumerator.AssertNode(SyntaxKind.SelectClause);
                enumerator.AssertToken(SyntaxKind.SelectKeyword, @"SELECT");
                enumerator.AssertNode(SyntaxKind.WildcardSelectColumn);
                enumerator.AssertToken(SyntaxKind.AsteriskToken, @"*");
                enumerator.AssertNode(SyntaxKind.FromClause);
                enumerator.AssertToken(SyntaxKind.FromKeyword, @"FROM");
                enumerator.AssertNode(SyntaxKind.NamedTableReference);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"Employees");
                enumerator.AssertToken(SyntaxKind.RightParenthesisToken, @")");
                enumerator.AssertToken(SyntaxKind.AsKeyword, @"AS");
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"d");
            }
        }
Esempio n. 6
0
        public void Parser_Parse_Table_InnerJoined_WithInnerJoinKeywords()
        {
            const string text = @"
                SELECT  *
                FROM    {Employees e
                            JOIN EmployeeTerritories et ON et.EmployeeID = e.EmployeeID}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.InnerJoinedTableReference);
                enumerator.AssertNode(SyntaxKind.NamedTableReference);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"Employees");
                enumerator.AssertNode(SyntaxKind.Alias);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"e");
                enumerator.AssertToken(SyntaxKind.JoinKeyword, @"JOIN");
                enumerator.AssertNode(SyntaxKind.NamedTableReference);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"EmployeeTerritories");
                enumerator.AssertNode(SyntaxKind.Alias);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"et");
                enumerator.AssertToken(SyntaxKind.OnKeyword, @"ON");
                enumerator.AssertNode(SyntaxKind.EqualExpression);
                enumerator.AssertNode(SyntaxKind.PropertyAccessExpression);
                enumerator.AssertNode(SyntaxKind.NameExpression);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"et");
                enumerator.AssertToken(SyntaxKind.DotToken, @".");
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"EmployeeID");
                enumerator.AssertToken(SyntaxKind.EqualsToken, @"=");
                enumerator.AssertNode(SyntaxKind.PropertyAccessExpression);
                enumerator.AssertNode(SyntaxKind.NameExpression);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"e");
                enumerator.AssertToken(SyntaxKind.DotToken, @".");
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"EmployeeID");
            }
        }
Esempio n. 7
0
    public void ParseForExpressionWithLineBreaks()
    {
        var text = AnnotatedText.Parse(
            @"
                for (x <- 0 to 5)
                    x
            "
            );
        var tree = SyntaxTree.Parse(text.Text);

        Assert.Empty(tree.Diagnostics);

        var expression = tree.Root;

        using var e = new AssertingEnumerator(expression);

        //└──CompilationUnit
        //    ├──ExpressionStatement
        //    │   ├──ForExpression
        //    │   │   ├──ForKeyword
        //    │   │   ├──OpenParenToken
        //    │   │   ├──NameExpression
        //    │   │   │   └──IdentifierToken
        //    │   │   ├──LessThanDashToken
        //    │   │   ├──LiteralExpression
        //    │   │   │   └──NumberToken 0
        //    │   │   ├──ToKeyword
        //    │   │   ├──LiteralExpression
        //    │   │   │   └──NumberToken 5
        //    │   │   ├──CloseParenToken
        //    │   │   └──NameExpression
        //    │   │       └──IdentifierToken
        //    │   └──NewLineToken
        //    └──EndOfInputToken
        e.AssertNode(SyntaxKind.CompilationUnit);
        e.AssertNode(SyntaxKind.GlobalStatement);
        e.AssertNode(SyntaxKind.ExpressionStatement);
        e.AssertNode(SyntaxKind.ForExpression);
        e.AssertToken(SyntaxKind.ForKeyword, "for");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, " ");
        e.AssertToken(SyntaxKind.OpenParenToken, "(");
        e.AssertToken(SyntaxKind.IdentifierToken, "x");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, " ");
        e.AssertToken(SyntaxKind.LessThanDashToken, "<-");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, " ");
        e.AssertNode(SyntaxKind.LiteralExpression);
        e.AssertToken(SyntaxKind.NumberToken, "0");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, " ");
        e.AssertToken(SyntaxKind.ToKeyword, "to");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, " ");
        e.AssertNode(SyntaxKind.LiteralExpression);
        e.AssertToken(SyntaxKind.NumberToken, "5");
        e.AssertToken(SyntaxKind.CloseParenToken, ")");
        e.AssertTrivia(SyntaxKind.EndOfLineTrivia);
        e.AssertNode(SyntaxKind.IdentifierName);
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, "    ");
        e.AssertToken(SyntaxKind.IdentifierToken, "x");
        e.AssertToken(SyntaxKind.EndOfInputToken, "");
    }
Esempio n. 8
0
    public void ParseNestedNonUnitBlockExpression()
    {
        var text = AnnotatedText.Parse(
            @"
                         {
                            val x = 5
                            5
                         }"
            );
        var tree = SyntaxTree.Parse(text.Text);

        Assert.Empty(tree.Diagnostics);

        var expression = tree.Root;

        using var e = new AssertingEnumerator(expression);

        //└──ExpressionStatement
        //    ├──BlockExpression
        //    │   ├──OpenBraceToken
        //    │   ├──BlockExpression
        //    │   │   ├──OpenBraceToken
        //    │   │   ├──UnitExpression
        //    │   │   │   ├──CloseBraceToken
        //    │   │   │   └──CloseBraceToken
        //    │   │   └──CloseBraceToken
        //    │   └──CloseBraceToken
        //    └──NewLineToken

        e.AssertNode(SyntaxKind.CompilationUnit);
        e.AssertNode(SyntaxKind.GlobalStatement);
        e.AssertNode(SyntaxKind.ExpressionStatement);
        e.AssertNode(SyntaxKind.BlockExpression);
        e.AssertToken(SyntaxKind.OpenBraceToken, "{");
        e.AssertTrivia(SyntaxKind.EndOfLineTrivia);
        e.AssertNode(SyntaxKind.VariableDeclarationStatement);
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, "   ");
        e.AssertToken(SyntaxKind.ValKeyword, "val");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, " ");
        e.AssertToken(SyntaxKind.IdentifierToken, "x");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, " ");
        e.AssertNode(SyntaxKind.Initializer);
        e.AssertToken(SyntaxKind.EqualsToken, "=");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, " ");
        e.AssertNode(SyntaxKind.LiteralExpression);
        e.AssertToken(SyntaxKind.NumberToken, "5");
        e.AssertTrivia(SyntaxKind.EndOfLineTrivia);

        e.AssertNode(SyntaxKind.LiteralExpression);
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia, "   ");
        e.AssertToken(SyntaxKind.NumberToken, "5");
        e.AssertTrivia(SyntaxKind.EndOfLineTrivia);
        e.AssertToken(SyntaxKind.CloseBraceToken, "}");
        e.AssertToken(SyntaxKind.EndOfInputToken, "");
    }
Esempio n. 9
0
        public void Parser_BinaryExpression_HonorsPrecedences(SyntaxKind op1, SyntaxKind op2)
        {
            var op1Precedence = SyntaxInfo.GetBinaryOperatorPrecedence(op1);
            var op2Precedence = SyntaxInfo.GetBinaryOperatorPrecedence(op2);
            var op1Text       = SyntaxInfo.GetText(op1);
            var op2Text       = SyntaxInfo.GetText(op2);

            Debug.Assert(op1Text != null);
            Debug.Assert(op2Text != null);

            var text       = $"a {op1Text} b {op2Text} c";
            var expression = ParseExpression(text);

            using var e = new AssertingEnumerator(expression);

            if (op1Precedence >= op2Precedence)
            {
                //     op2
                //    /   \
                //   op1   c
                //  /   \
                // a     b


                e.AssertNode(SyntaxKind.BinaryExpression);
                e.AssertNode(SyntaxKind.BinaryExpression);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "a");
                e.AssertToken(op1, op1Text);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "b");
                e.AssertToken(op2, op2Text);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "c");
            }
            else
            {
                //   op1
                //  /   \
                // a    op2
                //     /   \
                //    b     c

                e.AssertNode(SyntaxKind.BinaryExpression);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "a");
                e.AssertToken(op1, op1Text);
                e.AssertNode(SyntaxKind.BinaryExpression);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "b");
                e.AssertToken(op2, op2Text);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "c");
            }
        }
Esempio n. 10
0
        public void Parser_Parse_Query_WildcardSelectColumn_WithoutTableAlias()
        {
            const string text = @"
                SELECT  {*}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.WildcardSelectColumn);
                enumerator.AssertToken(SyntaxKind.AsteriskToken, @"*");
            }
        }
Esempio n. 11
0
        public void Parser_Parse_Query_Alias_WithoutAsKeyword()
        {
            const string text = @"
                SELECT 1 {X}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.Alias);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"X");
            }
        }
Esempio n. 12
0
        public void HonorPrecedences_GivenBinaryExpression(SyntaxKind op1, SyntaxKind op2)
        {
            var op1Precedence    = op1.GetBinaryOperatorPrecedence();
            var op2Precedence    = op2.GetBinaryOperatorPrecedence();
            var op1Text          = op1.GetText();
            var op2Text          = op2.GetText();
            var text             = $"a {op1Text} b {op2Text} c";
            var expressionSyntax = ParseExpression(text);

            if (op1Precedence >= op2Precedence)
            {
                //      op2
                //     /   \
                //   op1    c
                //  /   \
                // a     b
                using (var asserter = new AssertingEnumerator(expressionSyntax))
                {
                    asserter.AssertNode(SyntaxKind.BinaryExpression);
                    asserter.AssertNode(SyntaxKind.BinaryExpression);
                    asserter.AssertNode(SyntaxKind.NameExpression);
                    asserter.AssertToken(SyntaxKind.IdentifierToken, "a");
                    asserter.AssertToken(op1, op1Text);
                    asserter.AssertNode(SyntaxKind.NameExpression);
                    asserter.AssertToken(SyntaxKind.IdentifierToken, "b");
                    asserter.AssertToken(op2, op2Text);
                    asserter.AssertNode(SyntaxKind.NameExpression);
                    asserter.AssertToken(SyntaxKind.IdentifierToken, "c");
                }
            }
            else
            {
                //   op1
                //  /   \
                // a    op2
                //     /   \
                //    b     c

                using (var asserter = new AssertingEnumerator(expressionSyntax))
                {
                    asserter.AssertNode(SyntaxKind.BinaryExpression);
                    asserter.AssertNode(SyntaxKind.NameExpression);
                    asserter.AssertToken(SyntaxKind.IdentifierToken, "a");
                    asserter.AssertToken(op1, op1Text);
                    asserter.AssertNode(SyntaxKind.BinaryExpression);
                    asserter.AssertNode(SyntaxKind.NameExpression);
                    asserter.AssertToken(SyntaxKind.IdentifierToken, "b");
                    asserter.AssertToken(op2, op2Text);
                    asserter.AssertNode(SyntaxKind.NameExpression);
                    asserter.AssertToken(SyntaxKind.IdentifierToken, "c");
                }
            }
        }
Esempio n. 13
0
    public void ParseUsingDirectives()
    {
        var text = AnnotatedText.Parse(
            @"
                using System
                using System.Collections.Immutable
                using System.Diagnostics
            "
            );
        var tree = SyntaxTree.Parse(text.Text);

        Assert.Empty(tree.Diagnostics);

        var expression = tree.Root;

        using var e = new AssertingEnumerator(expression);

        e.AssertNode(SyntaxKind.CompilationUnit);

        e.AssertNode(SyntaxKind.UsingDirective);
        e.AssertToken(SyntaxKind.UsingKeyword, "using");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia);
        e.AssertNode(SyntaxKind.IdentifierName);
        e.AssertToken(SyntaxKind.IdentifierToken, "System");
        e.AssertTrivia(SyntaxKind.EndOfLineTrivia);

        e.AssertNode(SyntaxKind.UsingDirective);
        e.AssertToken(SyntaxKind.UsingKeyword, "using");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia);
        e.AssertNode(SyntaxKind.QualifiedName);
        e.AssertNode(SyntaxKind.QualifiedName);
        e.AssertNode(SyntaxKind.IdentifierName);
        e.AssertToken(SyntaxKind.IdentifierToken, "System");
        e.AssertToken(SyntaxKind.DotToken, ".");
        e.AssertNode(SyntaxKind.IdentifierName);
        e.AssertToken(SyntaxKind.IdentifierToken, "Collections");
        e.AssertToken(SyntaxKind.DotToken, ".");
        e.AssertNode(SyntaxKind.IdentifierName);
        e.AssertToken(SyntaxKind.IdentifierToken, "Immutable");
        e.AssertTrivia(SyntaxKind.EndOfLineTrivia);

        e.AssertNode(SyntaxKind.UsingDirective);
        e.AssertToken(SyntaxKind.UsingKeyword, "using");
        e.AssertTrivia(SyntaxKind.WhitespaceTrivia);
        e.AssertNode(SyntaxKind.QualifiedName);
        e.AssertNode(SyntaxKind.IdentifierName);
        e.AssertToken(SyntaxKind.IdentifierToken, "System");
        e.AssertToken(SyntaxKind.DotToken, ".");
        e.AssertNode(SyntaxKind.IdentifierName);
        e.AssertToken(SyntaxKind.IdentifierToken, "Diagnostics");
        e.AssertToken(SyntaxKind.EndOfInputToken, "");
    }
Esempio n. 14
0
        public void Parser_Parse_Table_Named_WithoutAlias()
        {
            const string text = @"
                SELECT  *
                FROM    {Employees}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.NamedTableReference);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"Employees");
            }
        }
Esempio n. 15
0
        public void Parser_Parse_Query_TopClause()
        {
            const string text = @"
                SELECT {TOP 10} *
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.TopClause);
                enumerator.AssertToken(SyntaxKind.TopKeyword, @"TOP");
                enumerator.AssertToken(SyntaxKind.NumericLiteralToken, @"10");
            }
        }
Esempio n. 16
0
        public void Parser_Parse_Query_ExpressionSelectColumn_WithoutAlias()
        {
            const string text = @"
                SELECT  {1}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.ExpressionSelectColumn);
                enumerator.AssertNode(SyntaxKind.LiteralExpression);
                enumerator.AssertToken(SyntaxKind.NumericLiteralToken, @"1");
            }
        }
Esempio n. 17
0
        public void Parser_UnaryExpression_HonorsPrecedences(SyntaxKind unaryKind, SyntaxKind binaryKind)
        {
            var unaryPrecedence  = SyntaxInfo.GetUnaryOperatorPrecedence(unaryKind);
            var binaryPrecedence = SyntaxInfo.GetBinaryOperatorPrecedence(binaryKind);
            var unaryText        = SyntaxInfo.GetText(unaryKind);
            var binaryText       = SyntaxInfo.GetText(binaryKind);

            Debug.Assert(unaryText != null);
            Debug.Assert(binaryText != null);

            var text       = $"{unaryText} a {binaryText} b";
            var expression = ParseExpression(text);

            using var e = new AssertingEnumerator(expression);

            if (unaryPrecedence >= binaryPrecedence)
            {
                //   binary
                //   /    \
                // unary   b
                //   |
                //   a

                e.AssertNode(SyntaxKind.BinaryExpression);
                e.AssertNode(SyntaxKind.UnaryExpression);
                e.AssertToken(unaryKind, unaryText);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "a");
                e.AssertToken(binaryKind, binaryText);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "b");
            }
            else
            {
                //  unary
                //    |
                //  binary
                //  /   \
                // a     b

                e.AssertNode(SyntaxKind.UnaryExpression);
                e.AssertToken(unaryKind, unaryText);
                e.AssertNode(SyntaxKind.BinaryExpression);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "a");
                e.AssertToken(binaryKind, binaryText);
                e.AssertNode(SyntaxKind.NameExpression);
                e.AssertToken(SyntaxKind.Identifier, "b");
            }
        }
Esempio n. 18
0
        public void Parser_Parse_Query_TopClause_WithMissingLimit()
        {
            const string text = @"
                SELECT {TOP }*
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.TopClause);
                enumerator.AssertToken(SyntaxKind.TopKeyword, @"TOP");
                enumerator.AssertTokenMissing(SyntaxKind.NumericLiteralToken);
                enumerator.AssertDiagnostic(DiagnosticId.TokenExpected, @"Found '*' but expected '<Numeric Literal>'.");
            }
        }
Esempio n. 19
0
        public void Parser_Parse_Query_TopClause_WithInvalidLimit_NumericLiteral()
        {
            const string text = @"
                SELECT {TOP 10.3} *
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.TopClause);
                enumerator.AssertToken(SyntaxKind.TopKeyword, @"TOP");
                enumerator.AssertToken(SyntaxKind.NumericLiteralToken, @"10.3");
                enumerator.AssertDiagnostic(DiagnosticId.InvalidInteger, @"'10.3' is not a valid integer.");
            }
        }
Esempio n. 20
0
        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");
                }
            }
        }
Esempio n. 21
0
        public void Parser_Parse_Query_CommonTableExpressionColumnName()
        {
            const string text = @"
                WITH CTE ({x}, y) AS (
                    SELECT *
                )
                SELECT  *
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.CommonTableExpressionColumnName);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"x");
            }
        }
Esempio n. 22
0
        public void Parser_Parse_Query_OrderByColumn_WithoutModifier()
        {
            const string text = @"
                SELECT  *
                FROM    Employees
                ORDER   BY {FirstName}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.OrderByColumn);
                enumerator.AssertNode(SyntaxKind.NameExpression);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"FirstName");
            }
        }
Esempio n. 23
0
        public void Parser_Parse_Query_GroupByColumn()
        {
            const string text = @"
                SELECT  *
                FROM    Employees e
                GROUP   BY {Country}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.GroupByColumn);
                enumerator.AssertNode(SyntaxKind.NameExpression);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"Country");
            }
        }
Esempio n. 24
0
    public void ParseLineCommentOnly()
    {
        var text = @"// taco";
        var tree = SyntaxTree.Parse(text);

        Assert.Empty(tree.Diagnostics);

        var expression = tree.Root;

        using var e = new AssertingEnumerator(expression);

        e.AssertNode(SyntaxKind.CompilationUnit);
        e.AssertTrivia(SyntaxKind.LineCommentTrivia, "// taco");
        e.AssertToken(SyntaxKind.EndOfInputToken, "");
    }
Esempio n. 25
0
        public void Parser_Parse_Query_FromClause()
        {
            const string text = @"
                SELECT  *
                {FROM    Employees}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.FromClause);
                enumerator.AssertToken(SyntaxKind.FromKeyword, @"FROM");
                enumerator.AssertNode(SyntaxKind.NamedTableReference);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"Employees");
            }
        }
Esempio n. 26
0
        public void Parser_Parse_Table_Parenthesized_WithNamed()
        {
            const string text = @"
                SELECT  *
                FROM    {(Employees)}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.ParenthesizedTableReference);
                enumerator.AssertToken(SyntaxKind.LeftParenthesisToken, @"(");
                enumerator.AssertNode(SyntaxKind.NamedTableReference);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"Employees");
                enumerator.AssertToken(SyntaxKind.RightParenthesisToken, @")");
            }
        }
Esempio n. 27
0
        public void Parser_Parse_Query_Select_WithSelectClause()
        {
            const string text = @"
                SELECT  1
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.SelectQuery);
                enumerator.AssertNode(SyntaxKind.SelectClause);
                enumerator.AssertToken(SyntaxKind.SelectKeyword, @"SELECT");
                enumerator.AssertNode(SyntaxKind.ExpressionSelectColumn);
                enumerator.AssertNode(SyntaxKind.LiteralExpression);
                enumerator.AssertToken(SyntaxKind.NumericLiteralToken, @"1");
            }
        }
Esempio n. 28
0
        public void Parser_Parse_Query_WhereClause()
        {
            const string text = @"
                SELECT  *
                FROM    Employees e
                {WHERE   TRUE}
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.WhereClause);
                enumerator.AssertToken(SyntaxKind.WhereKeyword, @"WHERE");
                enumerator.AssertNode(SyntaxKind.LiteralExpression);
                enumerator.AssertToken(SyntaxKind.TrueKeyword, @"TRUE");
            }
        }
Esempio n. 29
0
        public void Parser_Parse_Query_SelectClause()
        {
            const string text = @"
                SELECT x
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.SelectQuery);
                enumerator.AssertNode(SyntaxKind.SelectClause);
                enumerator.AssertToken(SyntaxKind.SelectKeyword, @"SELECT");
                enumerator.AssertNode(SyntaxKind.ExpressionSelectColumn);
                enumerator.AssertNode(SyntaxKind.NameExpression);
                enumerator.AssertToken(SyntaxKind.IdentifierToken, @"x");
            }
        }
Esempio n. 30
0
        public void Parser_Parse_Query_TopClause_WithTies_WithoutWithKeyword()
        {
            const string text = @"
                SELECT {TOP 10 TIES} *
            ";

            using (var enumerator = AssertingEnumerator.ForQuery(text))
            {
                enumerator.AssertNode(SyntaxKind.TopClause);
                enumerator.AssertToken(SyntaxKind.TopKeyword, @"TOP");
                enumerator.AssertToken(SyntaxKind.NumericLiteralToken, @"10");
                enumerator.AssertTokenMissing(SyntaxKind.WithKeyword);
                enumerator.AssertDiagnostic(DiagnosticId.TokenExpected, @"Found 'TIES' but expected 'WITH'.");
                enumerator.AssertToken(SyntaxKind.TiesKeyword, @"TIES");
            }
        }