Remove IsGeneric from DeclSpace
[mono.git] / mcs / mcs / dynamic.cs
index 1990643793fff3cc6896521f759e6369a8caf971..3524196957edf6668ed624c335d98063ce988d06 100644 (file)
@@ -6,6 +6,7 @@
 // Dual licensed under the terms of the MIT X11 or GNU GPL
 //
 // Copyright 2009 Novell, Inc
+// Copyright 2011 Xamarin Inc.
 //
 
 using System;
@@ -47,11 +48,11 @@ namespace Mono.CSharp
                        this.loc = loc;
                }
 
-               public override TypeExpr ResolveAsType (IMemberContext ec, bool silent)
+               public override TypeSpec ResolveAsType (IMemberContext ec)
                {
                        eclass = ExprClass.Type;
                        type = ec.Module.Compiler.BuiltinTypes.Dynamic;
-                       return this;
+                       return type;
                }
        }
 
@@ -95,9 +96,14 @@ namespace Mono.CSharp
                        throw new NotImplementedException ();
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       throw new NotSupportedException ();
+               }
+
                public override Expression CreateExpressionTree (ResolveContext ec)
                {
-                       throw new NotImplementedException ();
+                       throw new NotSupportedException ();
                }
 
                protected override Expression DoResolve (ResolveContext ec)
@@ -122,7 +128,7 @@ namespace Mono.CSharp
                        throw new NotImplementedException ();
                }
 
-               public void EmitAssign (EmitContext ec, Expression source, bool leave_copy, bool prepare_for_load)
+               public void EmitAssign (EmitContext ec, Expression source, bool leave_copy, bool isCompound)
                {
                        throw new NotImplementedException ();
                }
@@ -247,7 +253,7 @@ namespace Mono.CSharp
                protected CSharpBinderFlags flags;
 
                TypeSpec binder_type;
-               TypeParameter[] context_mvars;
+               TypeParameters context_mvars;
 
                public DynamicExpressionStatement (IDynamicBinder binder, Arguments args, Location loc)
                {
@@ -262,6 +268,11 @@ namespace Mono.CSharp
                        }
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return arguments.ContainsEmitWithAwait ();
+               }
+
                public override Expression CreateExpressionTree (ResolveContext ec)
                {
                        ec.Report.Error (1963, loc, "An expression tree cannot contain a dynamic operation");
@@ -338,7 +349,7 @@ namespace Mono.CSharp
                        var site_container = ec.CreateDynamicSite ();
 
                        if (context_mvars != null) {
-                               TypeParameter[] tparam;
+                               TypeParameters tparam;
                                TypeContainer sc = site_container;
                                do {
                                        tparam = sc.CurrentTypeParameters;
@@ -383,7 +394,7 @@ namespace Mono.CSharp
                                TypeExpr te = null;
                                Namespace type_ns = module.GlobalRootNamespace.GetNamespace ("System", true);
                                if (type_ns != null) {
-                                       te = type_ns.LookupType (module, d_name, dyn_args_count + default_args, Location.Null);
+                                       te = type_ns.LookupType (module, d_name, dyn_args_count + default_args, LookupMode.Normal, loc);
                                }
 
                                if (te != null) {
@@ -455,17 +466,14 @@ namespace Mono.CSharp
                                return;
 
                        if (del_type_instance_access == null) {
-                               var dt = d.CurrentType.DeclaringType.MakeGenericType (module, context_mvars.Select (l => l.Type).ToArray ());
+                               var dt = d.CurrentType.DeclaringType.MakeGenericType (module, context_mvars.Types);
                                del_type_instance_access = new TypeExpression (MemberCache.GetMember (dt, d.CurrentType), loc);
                        }
 
-                       FullNamedExpression instanceAccessExprType = new GenericTypeExpr (module.PredefinedTypes.CallSiteGeneric.TypeSpec,
+                       var instanceAccessExprType = new GenericTypeExpr (module.PredefinedTypes.CallSiteGeneric.TypeSpec,
                                new TypeArguments (del_type_instance_access), loc);
 
-                       BlockContext bc = new BlockContext (ec.MemberContext, null, ec.BuiltinTypes.Void);
-
-                       instanceAccessExprType = instanceAccessExprType.ResolveAsType (bc, false);
-                       if (instanceAccessExprType == null)
+                       if (instanceAccessExprType.ResolveAsType (ec.MemberContext) == null)
                                return;
 
                        bool inflate_using_mvar = context_mvars != null && ec.IsAnonymousStoreyMutateRequired;
@@ -474,7 +482,7 @@ namespace Mono.CSharp
                        if (inflate_using_mvar || context_mvars == null) {
                                gt = site_container.CurrentType;
                        } else {
-                               gt = site_container.CurrentType.MakeGenericType (module, context_mvars.Select (l => l.Type).ToArray ());
+                               gt = site_container.CurrentType.MakeGenericType (module, context_mvars.Types);
                        }
 
                        // When site container already exists the inflated version has to be
@@ -487,6 +495,7 @@ namespace Mono.CSharp
 
                        FieldExpr site_field_expr = new FieldExpr (MemberCache.GetMember (gt, field), loc);
 
+                       BlockContext bc = new BlockContext (ec.MemberContext, null, ec.BuiltinTypes.Void);
                        SymbolWriter.OpenCompilerGeneratedBlock (ec);
 
                        Arguments args = new Arguments (1);
@@ -560,7 +569,7 @@ namespace Mono.CSharp
 
                                binder_args.Add (new Argument (new BinderFlags (0, this)));
                                binder_args.Add (new Argument (new StringLiteral (ec.BuiltinTypes, name, loc)));
-                               binder_args.Add (new Argument (new TypeOf (new TypeExpression (ec.CurrentType, loc), loc)));
+                               binder_args.Add (new Argument (new TypeOf (ec.CurrentType, loc)));
 
                                return new Invocation (GetBinder ("IsEvent", loc), binder_args);
                        }
@@ -621,8 +630,8 @@ namespace Mono.CSharp
                        flags |= ec.HasSet (ResolveContext.Options.CheckedScope) ? CSharpBinderFlags.CheckedContext : 0;
 
                        binder_args.Add (new Argument (new BinderFlags (flags, this)));
-                       binder_args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc)));
-                       binder_args.Add (new Argument (new TypeOf (new TypeExpression (ec.CurrentType, loc), loc)));
+                       binder_args.Add (new Argument (new TypeOf (type, loc)));
+                       binder_args.Add (new Argument (new TypeOf (ec.CurrentType, loc)));
                        return new Invocation (GetBinder ("Convert", loc), binder_args);
                }
        }
@@ -641,7 +650,7 @@ namespace Mono.CSharp
                        Arguments binder_args = new Arguments (3);
 
                        binder_args.Add (new Argument (new BinderFlags (0, this)));
-                       binder_args.Add (new Argument (new TypeOf (new TypeExpression (ec.CurrentType, loc), loc)));
+                       binder_args.Add (new Argument (new TypeOf (ec.CurrentType, loc)));
                        binder_args.Add (new Argument (new ImplicitlyTypedArrayCreation (args.CreateDynamicBinderArguments (ec), loc)));
 
                        return new Invocation (GetBinder ("InvokeConstructor", loc), binder_args);
@@ -674,7 +683,7 @@ namespace Mono.CSharp
                        Arguments binder_args = new Arguments (3);
 
                        binder_args.Add (new Argument (new BinderFlags (flags, this)));
-                       binder_args.Add (new Argument (new TypeOf (new TypeExpression (ec.CurrentType, loc), loc)));
+                       binder_args.Add (new Argument (new TypeOf (ec.CurrentType, loc)));
                        binder_args.Add (new Argument (new ImplicitlyTypedArrayCreation (args.CreateDynamicBinderArguments (ec), loc)));
 
                        isSet |= (flags & CSharpBinderFlags.ValueFromCompoundAssignment) != 0;
@@ -716,7 +725,7 @@ namespace Mono.CSharp
 
        class DynamicInvocation : DynamicExpressionStatement, IDynamicBinder
        {
-               ATypeNameExpression member;
+               readonly ATypeNameExpression member;
 
                public DynamicInvocation (ATypeNameExpression member, Arguments args, Location loc)
                        : base (null, args, loc)
@@ -764,7 +773,7 @@ namespace Mono.CSharp
                                if (ta.Resolve (ec)) {
                                        var targs = new ArrayInitializer (ta.Count, loc);
                                        foreach (TypeSpec t in ta.Arguments)
-                                               targs.Add (new TypeOf (new TypeExpression (t, loc), loc));
+                                               targs.Add (new TypeOf (t, loc));
 
                                        binder_args.Add (new Argument (new ImplicitlyTypedArrayCreation (targs, loc)));
                                }
@@ -772,7 +781,7 @@ namespace Mono.CSharp
                                binder_args.Add (new Argument (new NullLiteral (loc)));
                        }
 
-                       binder_args.Add (new Argument (new TypeOf (new TypeExpression (ec.CurrentType, loc), loc)));
+                       binder_args.Add (new Argument (new TypeOf (ec.CurrentType, loc)));
 
                        Expression real_args;
                        if (args == null) {
@@ -818,7 +827,7 @@ namespace Mono.CSharp
 
                        binder_args.Add (new Argument (new BinderFlags (flags, this)));
                        binder_args.Add (new Argument (new StringLiteral (ec.BuiltinTypes, name, loc)));
-                       binder_args.Add (new Argument (new TypeOf (new TypeExpression (ec.CurrentType, loc), loc)));
+                       binder_args.Add (new Argument (new TypeOf (ec.CurrentType, loc)));
                        binder_args.Add (new Argument (new ImplicitlyTypedArrayCreation (args.CreateDynamicBinderArguments (ec), loc)));
 
                        isSet |= (flags & CSharpBinderFlags.ValueFromCompoundAssignment) != 0;
@@ -899,7 +908,7 @@ namespace Mono.CSharp
                        throw new NotImplementedException ();
                }
 
-               public void EmitAssign (EmitContext ec, Expression source, bool leave_copy, bool prepare_for_load)
+               public void EmitAssign (EmitContext ec, Expression source, bool leave_copy, bool isCompound)
                {
                        EmitCall (ec, setter, setter_args, !leave_copy);
                }
@@ -939,7 +948,7 @@ namespace Mono.CSharp
 
                        binder_args.Add (new Argument (new BinderFlags (flags, this)));
                        binder_args.Add (new Argument (new MemberAccess (new MemberAccess (sle, "ExpressionType", loc), name, loc)));
-                       binder_args.Add (new Argument (new TypeOf (new TypeExpression (ec.CurrentType, loc), loc)));
+                       binder_args.Add (new Argument (new TypeOf (ec.CurrentType, loc)));
                        binder_args.Add (new Argument (new ImplicitlyTypedArrayCreation (args.CreateDynamicBinderArguments (ec), loc)));
 
                        return new Invocation (GetBinder ("UnaryOperation", loc), binder_args);
@@ -948,7 +957,7 @@ namespace Mono.CSharp
 
        sealed class DynamicSiteClass : HoistedStoreyClass
        {
-               public DynamicSiteClass (TypeContainer parent, MemberBase host, TypeParameter[] tparams)
+               public DynamicSiteClass (TypeContainer parent, MemberBase host, TypeParameters tparams)
                        : base (parent, MakeMemberName (host, "DynamicSite", parent.DynamicSitesCounter, tparams, Location.Null), tparams, Modifiers.STATIC)
                {
                        parent.DynamicSitesCounter++;