Exemple #1
0
 internal void Bind <T>(ref T node, BindAffinity affinity) where T : Syntax.Expr
 {
     if (node != null)
     {
         node.Affinity = affinity;
         Bind(ref node);
     }
 }
Exemple #2
0
        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);
        }
Exemple #3
0
 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);
     }
 }