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); }
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); }