protected void AssertTokenStackIsEmpty()
 {
     if (TokenStack.Any())
     {
         throw new QueryParseException("End of expression expected.");
     }
 }
        protected SortExpression ParseSort()
        {
            SortElementExpression firstElement = ParseSortElement();

            List <SortElementExpression> elements = firstElement.AsList();

            while (TokenStack.Any())
            {
                EatSingleCharacterToken(TokenKind.Comma);

                SortElementExpression nextElement = ParseSortElement();
                elements.Add(nextElement);
            }

            return(new SortExpression(elements));
        }
        protected PaginationQueryStringValueExpression ParsePagination()
        {
            var elements = new List <PaginationElementQueryStringValueExpression>();

            PaginationElementQueryStringValueExpression element = ParsePaginationElement();

            elements.Add(element);

            while (TokenStack.Any())
            {
                EatSingleCharacterToken(TokenKind.Comma);

                element = ParsePaginationElement();
                elements.Add(element);
            }

            return(new PaginationQueryStringValueExpression(elements));
        }
        protected IncludeExpression ParseInclude(int?maximumDepth)
        {
            ResourceFieldChainExpression firstChain = ParseFieldChain(FieldChainRequirements.IsRelationship, "Relationship name expected.");

            List <ResourceFieldChainExpression> chains = firstChain.AsList();

            while (TokenStack.Any())
            {
                EatSingleCharacterToken(TokenKind.Comma);

                ResourceFieldChainExpression nextChain = ParseFieldChain(FieldChainRequirements.IsRelationship, "Relationship name expected.");
                chains.Add(nextChain);
            }

            ValidateMaximumIncludeDepth(maximumDepth, chains);

            return(IncludeChainConverter.FromRelationshipChains(chains));
        }
        protected SparseFieldSetExpression ParseSparseFieldSet()
        {
            var fields = new Dictionary <string, ResourceFieldAttribute>();

            while (TokenStack.Any())
            {
                if (fields.Count > 0)
                {
                    EatSingleCharacterToken(TokenKind.Comma);
                }

                ResourceFieldChainExpression nextChain = ParseFieldChain(FieldChainRequirements.EndsInAttribute, "Field name expected.");
                ResourceFieldAttribute       nextField = nextChain.Fields.Single();
                fields[nextField.PublicName] = nextField;
            }

            return(fields.Any() ? new SparseFieldSetExpression(fields.Values) : null);
        }
        protected SparseFieldSetExpression ParseSparseFieldSet()
        {
            var attributes = new Dictionary <string, AttrAttribute>();

            ResourceFieldChainExpression nextChain = ParseFieldChain(FieldChainRequirements.EndsInAttribute, "Attribute name expected.");
            AttrAttribute nextAttribute            = nextChain.Fields.Cast <AttrAttribute>().Single();

            attributes[nextAttribute.PublicName] = nextAttribute;

            while (TokenStack.Any())
            {
                EatSingleCharacterToken(TokenKind.Comma);

                nextChain     = ParseFieldChain(FieldChainRequirements.EndsInAttribute, "Attribute name expected.");
                nextAttribute = nextChain.Fields.Cast <AttrAttribute>().Single();
                attributes[nextAttribute.PublicName] = nextAttribute;
            }

            return(new SparseFieldSetExpression(attributes.Values));
        }
Esempio n. 7
0
        private Result ProcessBuffer(StringBuilder buffer)
        {
            string bufferContents = null;

            // Check to see if the current character ends the terminator
            if (TokenStack.Any())
            {
                var peek = TokenStack.Peek();
                bufferContents = buffer.ToString();
                if (peek.Type == TokenType.Complex && bufferContents.EndsWith(peek.Token.Terminator))
                {
                    var terminator = new Result {
                        Type = TokenType.Terminator
                    };
                    terminator.Payload = buffer.ToString(0, buffer.Length - peek.Token.Terminator.Length);
                    return(terminator);
                }
            }

            if (string.IsNullOrEmpty(bufferContents))
            {
                bufferContents = buffer.ToString();
            }

            foreach (var child in _prospectiveTokens)
            {
                var isToken = bufferContents.Last() == child.Identifier.Last() &&
                              bufferContents.EndsWith(child.Identifier);

                var match = CheckForInterpolation(child.Interpolation, bufferContents);

                var isInterpolated = match != null && match.Success;

                if (isToken || isInterpolated)
                {
                    var result = new Result {
                        Token = child
                    };

                    if (child.Interpolation != null)
                    {
                        result.Payload = buffer.ToString(0, bufferContents.IndexOf(child.Interpolation.Start));
                        child.Interpolation.ArgumentInput = match.Value;
                        result.Type = TokenType.Interpolation;
                    }
                    else if (string.IsNullOrEmpty(child.Terminator))
                    {
                        result.Payload = buffer.ToString(0, buffer.Length - child.Identifier.Length);
                        result.Type    = TokenType.Simple;
                    }
                    else
                    {
                        result.Payload = buffer.ToString(0, buffer.Length - child.Identifier.Length);
                        result.Type    = TokenType.Complex;
                    }

                    return(result);
                }
            }

            return(new Result {
                Type = TokenType.NotAToken
            });
        }