Avoid creating a temporary variable when target await expression is does not include...
[mono.git] / mcs / mcs / dynamic.cs
index 1990643793fff3cc6896521f759e6369a8caf971..b3daab895b22702d49140573cd5fe70be149381b 100644 (file)
@@ -47,11 +47,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 +95,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 +127,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 ();
                }
@@ -383,7 +388,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) {
@@ -459,13 +464,10 @@ namespace Mono.CSharp
                                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;
@@ -487,6 +489,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 +563,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 +624,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 +644,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 +677,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;
@@ -764,7 +767,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 +775,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 +821,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 +902,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 +942,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);