internal void Bind <T>(ref T node, BindAffinity affinity) where T : Syntax.Expr { if (node != null) { node.Affinity = affinity; Bind(ref node); } }
internal static MemberAccessExpr Bound(Binder b, Expr expr, Expr member, BindAffinity affinity) { expr.RequireValue(); var e = new MemberAccessExpr(expr, Token.None, member); e.Symbol = b.BindMemberAccess(ref e.Expr, ref e.Member, affinity); e.Datatype = e.Symbol.Type(); return(e); }
internal Symbol BindMemberAccess(ref Expr expr, ref Expr member, BindAffinity affinity) { if (member is NameExpr MemberName) { if (affinity == BindAffinity.Invoke) { Symbol s = null; if (!expr.Datatype.IsUsualOrObject()) { s = Lookup(expr.Datatype, MemberName.LookupName); } if (s == null) { if (Options.Binding.HasFlag(BindOptions.AllowDynamic) && expr.Datatype.IsUsualOrObject()) { Convert(ref expr, Compilation.Get(NativeType.Usual) ?? Compilation.Get(NativeType.Object)); return(new DynamicSymbol(MemberName.LookupName)); } else { throw Binder.LookupError(expr, MemberName); } } return(s); } else { Convert(ref expr, Compilation.Get(NativeType.Object)); return(new DynamicSymbol(MemberName.LookupName)); } } else if (member is RuntimeIdExpr) { Bind(ref member, BindAffinity.Member); return(new DynamicExprSymbol(member)); } else { throw member.Error(ErrorCode.NameExpected); } }