public override void Evaluate(TemplateContext context) { var scriptArray = new ScriptArray(); foreach (var value in Values) { var valueEval = context.Evaluate(value); scriptArray.Add(valueEval); } context.Result = scriptArray; }
public bool ExpandParameters(object value, ScriptArray expandedParameters) { // Handle parameters expansion for a function call when the operator ~ is used if (Operator == ScriptUnaryOperator.FunctionParametersExpand) { var valueEnumerator = value as IEnumerable; if (valueEnumerator != null) { foreach (var subValue in valueEnumerator) { expandedParameters.Add(subValue); } return(true); } } return(false); }
public static object Call(TemplateContext context, ScriptNode callerContext, object functionObject, List <ScriptExpression> arguments = null) { if (callerContext == null) { throw new ArgumentNullException(nameof(callerContext)); } if (functionObject == null) { throw new ScriptRuntimeException(callerContext.Span, $"The target function [{callerContext}] is null"); } var function = functionObject as ScriptFunction; var externFunction = functionObject as IScriptCustomFunction; if (function == null && externFunction == null) { throw new ScriptRuntimeException(callerContext.Span, $"Invalid object function [{functionObject?.GetType()}]"); } ScriptBlockStatement blockDelegate = null; if (context.BlockDelegates.Count > 0) { blockDelegate = context.BlockDelegates.Pop(); } var argumentValues = new ScriptArray(); if (arguments != null) { foreach (var argument in arguments) { var value = context.Evaluate(argument); // Handle parameters expansion for a function call when the operator ^ is used var unaryExpression = argument as ScriptUnaryExpression; if (unaryExpression != null && unaryExpression.ExpandParameters(value, argumentValues)) { continue; } argumentValues.Add(value); } } // Handle pipe arguments here if (context.PipeArguments.Count > 0) { var additionalArgument = context.PipeArguments.Pop(); var value = context.Evaluate(additionalArgument); // Handle parameters expansion for a function call when the operator ~ is used var unaryExpression = additionalArgument as ScriptUnaryExpression; if (unaryExpression == null || !unaryExpression.ExpandParameters(value, argumentValues)) { argumentValues.Add(value); } } object result = null; context.EnterFunction(callerContext); try { if (externFunction != null) { result = externFunction.Evaluate(context, callerContext, argumentValues, blockDelegate); } else { context.SetValue(ScriptVariable.Arguments, argumentValues, true); // Set the block delegate if (blockDelegate != null) { context.SetValue(ScriptVariable.BlockDelegate, blockDelegate, true); } result = context.Evaluate(function.Body); } } finally { context.ExitFunction(); } // Restore the flow state to none context.FlowState = ScriptFlowState.None; return(result); }