Пример #1
0
        public object EvaluateAccessor(BoundAccessor boundAccessor)
        {
            object evaluateItem = EvaluateExpression(boundAccessor.Item);

            if (boundAccessor.Index != null && evaluateItem is IndexableObject indexableObj)
            {
                evaluateItem = indexableObj.Index(EvaluateExpression(boundAccessor.Index));
            }

            if (!boundAccessor.IsLast)
            {
                if (evaluateItem != null && evaluateItem is ScopedObject scopedObj)
                {
                    locals.Push(scopedObj.Variables);

                    var output = EvaluateExpression(boundAccessor.Rest);

                    locals.Pop();

                    return(output);
                }

                return(null);
            }

            return(evaluateItem);
        }
Пример #2
0
        private void OutputAccessor(BoundAccessor node, string prefix)
        {
            builder.AddFragment(new OutputFragment(prefix, DefaultColour));
            Output(node.Item, string.Empty);

            if (!node.IsLast)
            {
                builder.AddFragment(new OutputFragment(".", DefaultColour));
                Output(node.Rest, string.Empty);
            }
        }
Пример #3
0
        private BoundExpression RewriteAccessor(BoundAccessor expression)
        {
            var newItem  = RewriteExpression(expression.Item);
            var newIndex = expression.Index == null ? null : RewriteExpression(expression.Index);
            var newRest  = expression.Rest == null ? null : (BoundAccessor)RewriteExpression(expression.Rest);

            if (newItem == expression.Item && newIndex == expression.Index && newRest == expression.Rest)
            {
                return(expression);
            }

            return(new BoundAccessor(newItem, newIndex, newRest));
        }