Ejemplo n.º 1
0
        public override void Set(AbstractSymbolValueProvider vp, ISymbolValue value)
        {
            var oldV = vp[Variable];

            if (oldV is ArrayValue)
            {
                var av = (ArrayValue)oldV;

                //TODO: Immutability checks

                if (av.IsString)
                {

                }
                else
                {
                    var at = av.RepresentedType as ArrayType;
                    var newElements = new ISymbolValue[av.Elements.Length + (ItemNumber<0 ? 1:0)];
                    av.Elements.CopyTo(newElements, 0);

                    if (!ResultComparer.IsImplicitlyConvertible(value.RepresentedType, at.ValueType))
                        throw new EvaluationException(BaseExpression, value.ToCode() + " must be implicitly convertible to the array's value type!", value);

                    // Add..
                    if (ItemNumber < 0)
                        av.Elements[av.Elements.Length - 1] = value;
                    else // or set the new value
                        av.Elements[ItemNumber] = value;

                    vp[Variable] = new ArrayValue(at, newElements);
                }
            }
            else
                throw new EvaluationException(BaseExpression, "Type of accessed item must be an array", oldV);
        }
Ejemplo n.º 2
0
        /*
         * public TemplateParameterSymbol(TemplateParameter tp,
         *      ISemantic representedTypeOrValue,
         *      ISyntaxRegion originalParameterIdentifier = null,
         *      DNode parentNode = null)
         *      : base(new TemplateParameterNode(tp) { Parent = parentNode },
         *      AbstractType.Get(representedTypeOrValue), originalParameterIdentifier ?? tp)
         * {
         *      this.Parameter = tp;
         *      this.ParameterValue = representedTypeOrValue as ISymbolValue;
         * }*/

        public override string ToCode()
        {
            if (ParameterValue != null)
            {
                return(ParameterValue.ToCode());
            }
            return(Base == null ? (Parameter == null ? "(unknown template parameter)" : Parameter.Name) : Base.ToCode());            //FIXME: It's not actually code but currently needed for correct ToString() representation in e.g. parameter insight
        }
Ejemplo n.º 3
0
        public override void Set(AbstractSymbolValueProvider vp, ISymbolValue value)
        {
            var oldV = vp[Variable];

            if (oldV is ArrayValue)
            {
                var av = (ArrayValue)oldV;

                //TODO: Immutability checks

                if (av.IsString)
                {
                }
                else
                {
                    var at          = av.RepresentedType as ArrayType;
                    var newElements = new ISymbolValue[av.Elements.Length + (ItemNumber < 0 ? 1:0)];
                    av.Elements.CopyTo(newElements, 0);

                    if (!ResultComparer.IsImplicitlyConvertible(value.RepresentedType, at.ValueType))
                    {
                        if (vp.ev != null)
                        {
                            vp.ev.EvalError(null, value.ToCode() + " must be implicitly convertible to the array's value type!", value);
                        }
                        return;
                    }

                    // Add..
                    if (ItemNumber < 0)
                    {
                        av.Elements[av.Elements.Length - 1] = value;
                    }
                    else                     // or set the new value
                    {
                        av.Elements[ItemNumber] = value;
                    }

                    vp[Variable] = new ArrayValue(at, newElements);
                }
            }
            else
            {
                if (vp.ev != null)
                {
                    vp.ev.EvalError(null, "Type of accessed item must be an array", oldV);
                }
            }
        }