public object Call(ScriptObject[] args) { ScriptArray array = (ScriptArray)args[0]; int index = ((ScriptNumber)args[1]).ToInt32(); ScriptObject obj = (ScriptObject)args[2]; array.Insert(index, obj); return(obj); }
public static object Evaluate(TemplateContext context, SourceSpan span, ScriptBinaryOperator op, object leftValue, object rightValue) { if (op == ScriptBinaryOperator.EmptyCoalescing) { return(leftValue ?? rightValue); } switch (op) { case ScriptBinaryOperator.ShiftLeft: var leftList = leftValue as IList; if (leftList != null) { var newList = new ScriptArray(leftList) { rightValue }; return(newList); } break; case ScriptBinaryOperator.ShiftRight: var rightList = rightValue as IList; if (rightList != null) { var newList = new ScriptArray(rightList); newList.Insert(0, leftValue); return(newList); } break; case ScriptBinaryOperator.LiquidHasKey: { var leftDict = leftValue as IDictionary <string, object>; if (leftDict != null) { return(ObjectFunctions.HasKey(leftDict, context.ToString(span, rightValue))); } } break; case ScriptBinaryOperator.LiquidHasValue: { var leftDict = leftValue as IDictionary <string, object>; if (leftDict != null) { return(ObjectFunctions.HasValue(leftDict, context.ToString(span, rightValue))); } } break; case ScriptBinaryOperator.CompareEqual: case ScriptBinaryOperator.CompareNotEqual: case ScriptBinaryOperator.CompareGreater: case ScriptBinaryOperator.CompareLess: case ScriptBinaryOperator.CompareGreaterOrEqual: case ScriptBinaryOperator.CompareLessOrEqual: case ScriptBinaryOperator.Add: case ScriptBinaryOperator.Substract: case ScriptBinaryOperator.Multiply: case ScriptBinaryOperator.Divide: case ScriptBinaryOperator.DivideRound: case ScriptBinaryOperator.Modulus: case ScriptBinaryOperator.RangeInclude: case ScriptBinaryOperator.RangeExclude: case ScriptBinaryOperator.LiquidContains: case ScriptBinaryOperator.LiquidStartsWith: case ScriptBinaryOperator.LiquidEndsWith: if (leftValue is string || rightValue is string) { return(CalculateToString(context, span, op, leftValue, rightValue)); } else if (leftValue == EmptyScriptObject.Default || rightValue == EmptyScriptObject.Default) { return(CalculateEmpty(context, span, op, leftValue, rightValue)); } else { return(CalculateOthers(context, span, op, leftValue, rightValue)); } } throw new ScriptRuntimeException(span, $"Operator `{op.ToText()}` is not implemented for `{leftValue}` and `{rightValue}`"); }
public override object Evaluate(TemplateContext context) { var leftValueOriginal = context.Evaluate(Left); var leftValue = leftValueOriginal; var rightValueOriginal = context.Evaluate(Right); object rightValue = rightValueOriginal; if (Operator == ScriptBinaryOperator.EmptyCoalescing) { return(leftValue ?? rightValue); } else if (Operator == ScriptBinaryOperator.And || Operator == ScriptBinaryOperator.Or) { var leftBoolValue = context.ToBool(leftValue); var rightBoolValue = context.ToBool(rightValue); if (Operator == ScriptBinaryOperator.And) { return(leftBoolValue && rightBoolValue); } else { return(leftBoolValue || rightBoolValue); } } else { switch (Operator) { case ScriptBinaryOperator.ShiftLeft: var leftList = leftValue as IList; if (leftList != null) { var newList = new ScriptArray(leftList) { rightValue }; return(newList); } break; case ScriptBinaryOperator.ShiftRight: var rightList = rightValue as IList; if (rightList != null) { var newList = new ScriptArray(rightList); newList.Insert(0, leftValue); return(newList); } break; case ScriptBinaryOperator.CompareEqual: case ScriptBinaryOperator.CompareNotEqual: case ScriptBinaryOperator.CompareGreater: case ScriptBinaryOperator.CompareLess: case ScriptBinaryOperator.CompareGreaterOrEqual: case ScriptBinaryOperator.CompareLessOrEqual: case ScriptBinaryOperator.Add: case ScriptBinaryOperator.Substract: case ScriptBinaryOperator.Multiply: case ScriptBinaryOperator.Divide: case ScriptBinaryOperator.DivideRound: case ScriptBinaryOperator.Modulus: case ScriptBinaryOperator.RangeInclude: case ScriptBinaryOperator.RangeExclude: var leftType = leftValue?.GetType(); var rightType = rightValue?.GetType(); if (leftValue is string || rightValue is string) { return(CalculateToString(context, leftValue, rightValue)); } else { return(Calculate(context, leftValue, leftType, rightValue, rightType)); } } } throw new ScriptRuntimeException(Span, $"Operator [{Operator.ToText()}] is not implemented for the left [{Left}] / right [{Right}]"); }