Example #1
0
        public static ExpressionNode Parse(HandlebarsParserState state, HandlebarsBlockStack blockStack, SourceLocation location, string expression, IMemberLocator memberLocator = null)
        {
            int recursionLevel = 0;

            memberLocator = memberLocator ?? MemberLocator.Default;

            expression = expression.Trim();

            if (expression == "this")
            {
                return(SyntaxTreeExpression.Self(blockStack.GetCurrentModelType(), location));
            }
            if (expression.StartsWith("../"))
            {
                var blockNode = blockStack.FirstNode();
                while (expression.StartsWith("../"))
                {
                    var parentBlockNode = blockStack.GetParentNode(blockNode);
                    if (parentBlockNode != null)
                    {
                        blockNode  = parentBlockNode;
                        expression = expression.Substring(3);
                        location   = location.MoveIndex(3);
                    }
                    recursionLevel++;
                }
                return(ParseAgainstModel(blockStack.GetCurrentModelType(blockNode), expression, ExpressionScope.ModelOfParentScope, recursionLevel, memberLocator, location));
            }

            return(ParseAgainstModel(blockStack.GetCurrentModelType(), expression, ExpressionScope.CurrentModelOnStack, recursionLevel, memberLocator, location));
        }