internal override Node Bind(Binder b) { if (Token.Type == TokenType.LPARAMETERS || Token.Type == TokenType.PARAMETERS) { for (int i = 0; i < VarDecls.Length; i++) { var argIdx = b.Options.ArrayBase + i; var paramArray = IdExpr.Bound((b.Entity as Script).ParamArray); VarDecls[i].Initializer = IifExpr.Bound( BinaryExpr.Bound(ArrayLengthExpr.Bound(paramArray), Token, LiteralExpr.Bound(Constant.Create(i)), BinaryOperatorKind.GreaterThan, b.Options.Binding), ArrayAccessExpr.Bound(paramArray, ArgList.Bound(LiteralExpr.Bound(Constant.Create(argIdx))), b), DefaultExpr.Bound(b, b.ObjectType), b.Options.Binding); } } // TODO: Handle STATIC if (Token.Type == TokenType.STATIC) { throw Error(ErrorCode.NotSupported, "STATIC"); } for (int i = 0; i < VarDecls.Length; i++) { b.Bind(ref VarDecls[i]); } return(null); }
internal override Node Bind(Binder b) { if (!b.Options.AllowDotAccess && Token.Type == TokenType.DOT) { ThrowError(ErrorCode.DotMemberAccess); } b.Bind(ref Expr); Expr.RequireValue(); if (Expr.Datatype.IsArray && Expr.Datatype.ArrayRank == 1 && Binder.LookupComparer.Equals((Member as IdExpr)?.Name, SystemNames.Length)) { return(ArrayLengthExpr.Bound(Expr)); } Symbol = b.BindMemberAccess(ref Expr, ref Member, Affinity); Datatype = Symbol.Type(); return(null); }