Example #1
0
        private static CanConsumeResult JoinCanConsumeNext(ParsingContext xoContext, Boolean xbIsPreconsumption = false)
        {
            SyntaxKind eKind = xoContext.List.Peek().ExpectedType;

            if (SyntaxKindFacts.IsIdentifier(eKind) ||
                eKind == SyntaxKind.OpenParenthesisToken ||
                eKind == SyntaxKind.OnKeyword ||
                (xbIsPreconsumption && SyntaxKindFacts.IsJoinKeyword(eKind)) // Allow preconsumption to use JOIN keywods
                )
            {
                return(CheckIfConsumptionIsAllowed(xoContext));
            }
            // If we got another keyword (that we cant process)
            else if (
                SyntaxKindFacts.IsTerminatingNode(eKind) ||
                SyntaxKindFacts.IsKeyword(eKind) ||
                eKind == SyntaxKind.CloseParenthesisToken)
            {
                // Post execution check
                if (xoContext.CurrentNode.Count != 3)
                {
                    ResolutionGenerator.HandleIncompleteNode(xoContext);
                }

                return(CanConsumeResult.Complete);
            }

            CanConsumeResult eResult = DefaultCanConsumeNext(xoContext);



            return(DefaultCanConsumeNext(xoContext));
        }
Example #2
0
        /// <summary>
        /// Used by WHERE and ON
        /// </summary>
        /// <param name="xoContext.CurrentNode"></param>
        /// <param name="xoContext.List"></param>
        /// <returns></returns>
        private static CanConsumeResult ExpressionCanConsumeNext(ParsingContext xoContext, Boolean xbIsPreconsumption = false)
        {
            SyntaxKind eKind = xoContext.List.Peek().ExpectedType;

            if (
                SyntaxKindFacts.IsIdentifierOrExpression(eKind) ||     // Identifiers and Expressions are allowed here
                SyntaxKindFacts.IsAdjunctConditionalOperator(eKind) || // AND OR
                SyntaxKindFacts.IsConditionalOperator(eKind) ||        // = >= IN
                SyntaxKindFacts.IsUnaryOperator(eKind) ||              // NOT
                SyntaxKindFacts.IsFunction(eKind) ||
                SyntaxKindFacts.IsArithmaticOperator(eKind))
            {
                return(CheckIfConsumptionIsAllowed(xoContext));
            }


            CanConsumeResult eResult = DefaultCanConsumeNext(xoContext);

            // Post execution check
            if (eResult == CanConsumeResult.Complete && xoContext.CurrentNode.Count != 1)
            {
                ResolutionGenerator.HandleIncompleteNode(xoContext);
            }

            return(eResult);
        }
Example #3
0
        private static CanConsumeResult BinaryExpressionCanConsumeNext(ParsingContext xoContext, Boolean xbIsPreconsumption = false)
        {
            // Intermediate var
            SyntaxKind eKind = xoContext.List.Peek().ExpectedType;

            // If we have something we are actually allowed to consume
            if ((xbIsPreconsumption && SyntaxKindFacts.IsAdjunctConditionalOperator(eKind)) || // Allow AND/OR in preconsump
                SyntaxKindFacts.IsIdentifierOrExpression(eKind) ||                             // Identifiers and Expressions are allowed here
                SyntaxKindFacts.IsConditionalOperator(eKind) ||                                // = >= IN
                SyntaxKindFacts.IsUnaryOperator(eKind) ||                                      // NOT
                SyntaxKindFacts.IsArithmaticOperator(eKind))
            {
                CanConsumeResult eResult = CheckIfConsumptionIsAllowed(xoContext);

                switch (eResult)
                {
                // Possible erroroneous
                case CanConsumeResult.Unknown:

                // Definitely finished
                case CanConsumeResult.Complete:
                    // Perform final checks
                    break;

                // Break immediately
                case CanConsumeResult.Skip:
                case CanConsumeResult.Consume:
                    return(eResult);
                }
            }

            // Closing condition
            if (xoContext.CurrentNode.IsFull() ||
                SyntaxKindFacts.IsTerminatingNode(eKind) ||
                SyntaxKindFacts.IsKeyword(eKind) ||
                eKind == SyntaxKind.CloseParenthesisToken)
            {
                // Post execution check
                if (xoContext.CurrentNode.Count != 2)
                {
                    ResolutionGenerator.HandleIncompleteNode(xoContext);
                }

                return(CanConsumeResult.Complete);
            }

            //
            return(DefaultCanConsumeNext(xoContext));
        }
Example #4
0
        private static CanConsumeResult ConcatCanConsume(ParsingContext xoContext, Boolean xbIsPreconsumption = false)
        {
            // Intermediate var
            SyntaxKind oKind = xoContext.List.Peek().ExpectedType;

            // Consume immediately
            if (xoContext.CurrentNode.Count <= 1)
            {
                if (SyntaxKindFacts.IsIdentifierOrExpression(oKind))
                {
                    return(CanConsumeResult.Consume);
                }
                else
                {
                    ResolutionGenerator.HandleIncompleteNode(xoContext);
                    return(CanConsumeResult.Complete);
                }
            }
            // Get BARBAR, consume next
            else if (oKind == SyntaxKind.BarBarToken)
            {
                // Drop the bar bar and consume the next item
                xoContext.List.Pop();

                if (SyntaxKindFacts.IsIdentifierOrExpression(xoContext.List.Peek().ExpectedType))
                {
                    return(CanConsumeResult.Consume);
                }
                else
                {
                    ResolutionGenerator.HandleIncompleteNode(xoContext);
                    return(CanConsumeResult.Complete);
                }
            }
            // Else close this object
            else
            {
                // Post consumption check
                if (xoContext.CurrentNode.Count <= 1)
                {
                    ResolutionGenerator.HandleIncompleteNode(xoContext);
                }

                return(CanConsumeResult.Complete);
            }
        }