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