Esempio n. 1
0
            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);
            }
Esempio n. 2
0
        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}`");
        }
Esempio n. 3
0
        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}]");
        }