예제 #1
0
        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);
        }
예제 #2
0
        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()
            });
        }