Explictly type SLE member binding type
authorMarek Safar <marek.safar@gmail.com>
Tue, 22 Nov 2011 16:38:17 +0000 (16:38 +0000)
committerMarek Safar <marek.safar@gmail.com>
Tue, 22 Nov 2011 16:43:50 +0000 (16:43 +0000)
mcs/mcs/expression.cs
mcs/mcs/typemanager.cs
mcs/tests/gtest-etree-27.cs
mcs/tests/ver-il-net_4_5.xml

index 5a9e562bcd1a9dec3b657b1eabe219358fb8d097..e32b61fc5a2b2cd350c432f9f6ab296dd503ffdf 100644 (file)
@@ -9373,14 +9373,17 @@ namespace Mono.CSharp
                                args.Add (new Argument (((PropertyExpr) target).CreateSetterTypeOfExpression (ec)));
 
                        string mname;
+                       Expression arg_expr;
                        var cinit = source as CollectionOrObjectInitializers;
                        if (cinit == null) {
                                mname = "Bind";
+                               arg_expr = source.CreateExpressionTree (ec);
                        } else {
-                               mname = cinit.Initializers[0] is ElementInitializer ? "MemberBind" : "ListBind";
+                               mname = cinit.IsEmpty || cinit.Initializers[0] is ElementInitializer ? "MemberBind" : "ListBind";
+                               arg_expr = cinit.CreateExpressionTree (ec, !cinit.IsEmpty);
                        }
 
-                       args.Add (new Argument (source.CreateExpressionTree (ec)));
+                       args.Add (new Argument (arg_expr));
                        return CreateExpressionFactoryCall (ec, mname, args);
                }
 
@@ -9585,6 +9588,11 @@ namespace Mono.CSharp
                }
 
                public override Expression CreateExpressionTree (ResolveContext ec)
+               {
+                       return CreateExpressionTree (ec, false);
+               }
+
+               public Expression CreateExpressionTree (ResolveContext ec, bool inferType)
                {
                        var expr_initializers = new ArrayInitializer (initializers.Count, loc);
                        foreach (Expression e in initializers) {
@@ -9593,7 +9601,10 @@ namespace Mono.CSharp
                                        expr_initializers.Add (expr);
                        }
 
-                       return new ImplicitlyTypedArrayCreation (expr_initializers, loc);
+                       if (inferType)
+                               return new ImplicitlyTypedArrayCreation (expr_initializers, loc);
+
+                       return new ArrayCreation (new TypeExpression (ec.Module.PredefinedTypes.MemberBinding.Resolve (), loc), expr_initializers, loc); 
                }
                
                protected override Expression DoResolve (ResolveContext ec)
@@ -9763,7 +9774,7 @@ namespace Mono.CSharp
                        Arguments args = new Arguments (2);
                        args.Add (new Argument (base.CreateExpressionTree (ec)));
                        if (!initializers.IsEmpty)
-                               args.Add (new Argument (initializers.CreateExpressionTree (ec)));
+                               args.Add (new Argument (initializers.CreateExpressionTree (ec, initializers.IsCollectionInitializer)));
 
                        return CreateExpressionFactoryCall (ec,
                                initializers.IsCollectionInitializer ? "ListInit" : "MemberInit",
index e189281c81ef0949d2ad40bc10ad15643a456019..6c2915486a2d16784e3a3d582f418078f7b926e7 100644 (file)
@@ -208,6 +208,7 @@ namespace Mono.CSharp
                public readonly PredefinedType MethodBase;
                public readonly PredefinedType MethodInfo;
                public readonly PredefinedType ConstructorInfo;
+               public readonly PredefinedType MemberBinding;
 
                //
                // C# 4.0
@@ -256,6 +257,7 @@ namespace Mono.CSharp
 
                        Expression = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "Expression");
                        ExpressionGeneric = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "Expression", 1);
+                       MemberBinding = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "MemberBinding");
                        ParameterExpression = new PredefinedType (module, MemberKind.Class, "System.Linq.Expressions", "ParameterExpression");
                        FieldInfo = new PredefinedType (module, MemberKind.Class, "System.Reflection", "FieldInfo");
                        MethodBase = new PredefinedType (module, MemberKind.Class, "System.Reflection", "MethodBase");
index 7fcd1afaf9ad3f56bff3575b824e0834db3e295b..e413be7ea8c898bc6acb1c41d28ddf4859dd6f2b 100644 (file)
@@ -47,6 +47,22 @@ public class Node
 
                e.Compile () ();
 
+               e = () => new Node () { Values = { } };
+               mie = (MemberInitExpression) e.Body;
+               if (mie.Bindings[0].BindingType != MemberBindingType.MemberBinding)
+                       return 4;
+
+               e.Compile () ();
+
+               e = () => new Node() { Parent = { Name = "Parent" }, Values = { 4, 5, 7, 8 } };
+               mie = (MemberInitExpression) e.Body;
+               if (mie.Bindings[0].BindingType != MemberBindingType.MemberBinding)
+                       return 5;
+               
+               if (mie.Bindings[1].BindingType != MemberBindingType.ListBinding)
+                       return 6;
+
+               e.Compile () ();
                Console.WriteLine ("ok");
                return 0;
        }
index 4910211f36f0cfd4fcf38820feacf1632f995598..13b7fcd9655049fc1ca8c0ed7130f1f1a219f3c4 100644 (file)
         <size>8</size>
       </method>
       <method name="Int32 Main()">
-        <size>601</size>
+        <size>1172</size>
       </method>
       <method name="Void .ctor()">
         <size>18</size>