internal override Node Bind(Binder b) { b.Bind(ref Expr); Expr.RequireGetAccess(); b.Bind(ref Args); if (Expr.Datatype.IsUsualOrObject()) { b.Convert(ref Expr, Compilation.Get(NativeType.Array)); } if (Binder.TypesMatch(Expr.Datatype, NativeType.Array) || Expr.Datatype.IsArray) { b.ConvertArrayBase(Args); } if (Expr.Datatype.IsArray && Expr.Datatype.ArrayRank == 1) { if (Args.Args.Count != 1) { throw Error(ErrorCode.WrongNumberIfIndices); } return(NativeArrayAccessExpr.Bound(Expr, Args)); } Self = Expr; var s = Self.Datatype.Lookup(SystemNames.IndexerName); Symbol = b.BindArrayAccess(Self, s, Args); Datatype = Symbol.Type(); if (Expr.Datatype.IsArray && Expr.Datatype != Datatype) { Expr conv = this; b.Convert(ref conv, Expr.Datatype.ElementType); return(conv); } return(null); }
internal static ArrayAccessExpr Bound(Expr e, ArgList a, Binder b) { if (e.Datatype.IsUsualOrObject()) { b.Convert(ref e, Compilation.Get(NativeType.Array)); } if (Binder.TypesMatch(e.Datatype, NativeType.Array) || e.Datatype.IsArray) { b.ConvertArrayBase(a); } if (e.Datatype.IsArray && e.Datatype.ArrayRank == 1) { if (a.Args.Count != 1) { throw e.Error(ErrorCode.WrongNumberIfIndices); } return(NativeArrayAccessExpr.Bound(e, a)); } var item = e.Datatype.Lookup(SystemNames.IndexerName); var sym = b.BindArrayAccess(e, item, a); return(new ArrayAccessExpr(e, a) { Self = e, Symbol = sym, Datatype = sym.Type() }); }