IBoundExpr IUnboundExprVisitor<IBoundExpr>.Visit(ArrayExpr expr) { var elementType = (IBoundDecl)null; if (expr.ElementType != null) { elementType = TypeBinder.Bind(mContext, expr.ElementType); } var elements = expr.Elements.Accept(this); // infer the type from the elements if (elementType == null) { var index = 0; foreach (var element in elements) { if (elementType == null) { // take the type of the first elementType = element.Type; } else { // make sure the others match if (!DeclComparer.TypesMatch(elementType, element.Type)) throw new CompileException(expr.Position, String.Format("Array elements must all be the same type. Array is type {0}, but element {1} is type {2}.", elementType, index, element.Type)); } index++; } } // build a structure for the array var fields = new List<IBoundExpr>(); fields.Add(new IntExpr(expr.Elements.Count)); fields.AddRange(elements); return new BoundTupleExpr(fields, new BoundArrayType(elementType)); }
public virtual IUnboundExpr Transform(ArrayExpr expr) { return(expr); }
IUnboundExpr IUnboundExprVisitor <IUnboundExpr> .Visit(ArrayExpr expr) { return(Call("ArrayExpr", Array(expr.Elements.Accept(this)))); }