private static Node BuildNode(ParameterExpression param, PropertyParser parser, BuildArgument arg)
        {
            if (parser.BuiltNode != null)
            {
                return(parser.BuiltNode);
            }

            var result = parser.Result;

            Node builtNode;

            if (parser.IsNull)
            {
                builtNode = new Constant {
                    Value = null, StartIndex = parser.StartIndex, StartChar = parser.StartChar
                };
            }
            else if (parser.IsBoolean)
            {
                builtNode = new Constant {
                    Value = result.ToLower(), Type = typeof(bool), StartIndex = parser.StartIndex, StartChar = parser.StartChar
                };
            }
            else if (arg.VariableResolver.IsVariable(result))
            {
                builtNode = new Constant {
                    Value = result, StartIndex = parser.StartIndex, StartChar = parser.StartChar, IsVariable = true
                };
            }
            else
            {
                if (parser.IsVariable)
                {
                    arg.InvalidVariables.Add(result);
                }
                else
                {
                    arg.IsValidProperty(result);
                }

                builtNode = new Property {
                    Name = result, Param = param, StartIndex = parser.StartIndex, StartChar = parser.StartChar
                };
            }

            parser.BuiltNode = builtNode;

            return(builtNode);
        }
Exemple #2
0
        public override bool Accept(char @char, int noOfWhiteSpaceIgnored, int index, ref bool keepTrack, ref bool isStartGroup)
        {
            if (Done)
            {
                return(false);
            }
            var prevChar = PreviousChar;

            if (IsNestedProperty)
            {
                if (@char == '.')
                {
                    _nestedParser = new PropertyParser();
                    return(true);
                }
                else
                {
                    var accepted = _nestedParser.Accept(@char, noOfWhiteSpaceIgnored, index, ref keepTrack, ref isStartGroup);
                    if (!accepted)
                    {
                        if (@char != '(' && _nestedParser.Done)
                        {
                            Append('.');
                            Append(_nestedParser);
                        }

                        Done = _nestedParser.Done;
                        if (Done)
                        {
                            EndIndex = index - 1;
                        }
                    }

                    return(accepted);
                }
            }

            if (noOfWhiteSpaceIgnored > 0 && Length > 0)
            {
                Done = Length > 0;
                if (Done)
                {
                    EndIndex = index - noOfWhiteSpaceIgnored;
                }
                return(false);
            }

            if (prevChar == char.MinValue && char.IsDigit(@char))
            {
                return(false);
            }
            if (char.IsLetter(@char) || @char == '_' || char.IsDigit(@char))
            {
                if (prevChar == char.MinValue)
                {
                    StartIndex = index;
                }
                Append(@char);
                return(true);
            }

            Done = Length > 0;
            if (Done)
            {
                EndIndex = index - 1;
            }

            return(false);
        }