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