Author: jbevain
Date: 2008-02-20 12:10:07 -0500 (Wed, 20 Feb 2008)
New Revision: 96272

Modified:
   trunk/mcs/class/System.Core/System.Linq.Expressions/ChangeLog
   trunk/mcs/class/System.Core/System.Linq.Expressions/Expression.cs
   trunk/mcs/class/System.Core/System.Linq.Expressions/ExpressionPrinter.cs
Log:
2008-02-20  Jb Evain  <[EMAIL PROTECTED]>

        * Expression.cs, ExpressionPrinter.cs: implement ListInit.



Modified: trunk/mcs/class/System.Core/System.Linq.Expressions/ChangeLog
===================================================================
--- trunk/mcs/class/System.Core/System.Linq.Expressions/ChangeLog       
2008-02-20 17:02:50 UTC (rev 96271)
+++ trunk/mcs/class/System.Core/System.Linq.Expressions/ChangeLog       
2008-02-20 17:10:07 UTC (rev 96272)
@@ -1,3 +1,7 @@
+2008-02-20  Jb Evain  <[EMAIL PROTECTED]>
+
+       * Expression.cs, ExpressionPrinter.cs: implement ListInit.
+
 2008-02-19  Jb Evain  <[EMAIL PROTECTED]>
 
        * Expression.cs, ExpressionPrinter.cs: implement MemberInit.

Modified: trunk/mcs/class/System.Core/System.Linq.Expressions/Expression.cs
===================================================================
--- trunk/mcs/class/System.Core/System.Linq.Expressions/Expression.cs   
2008-02-20 17:02:50 UTC (rev 96271)
+++ trunk/mcs/class/System.Core/System.Linq.Expressions/Expression.cs   
2008-02-20 17:10:07 UTC (rev 96272)
@@ -66,10 +66,6 @@
                        return ExpressionPrinter.ToString (this);
                }
 
-               static void CheckMethod (MethodInfo m)
-               {
-               }
-
 #region Binary Expressions
                static bool IsInt (Type t)
                {
@@ -1275,6 +1271,8 @@
                {
                        if (member == null)
                                throw new ArgumentNullException ("member");
+                       if (initializers == null)
+                               throw new ArgumentNullException 
("initializers");
 
                        var inits = initializers.ToReadOnlyCollection ();
                        CheckForNull (inits, "initializers");
@@ -1309,6 +1307,8 @@
                {
                        if (propertyAccessor == null)
                                throw new ArgumentNullException 
("propertyAccessor");
+                       if (initializers == null)
+                               throw new ArgumentNullException 
("initializers");
 
                        var inits = initializers.ToReadOnlyCollection ();
                        CheckForNull (inits, "initializers");
@@ -1322,40 +1322,93 @@
                        return new MemberListBinding (prop, inits);
                }
 
-               [MonoTODO]
                public static ListInitExpression ListInit (NewExpression 
newExpression, params ElementInit [] initializers)
                {
-                       throw new NotImplementedException ();
+                       return ListInit (newExpression, initializers as 
IEnumerable<ElementInit>);
                }
 
-               [MonoTODO]
                public static ListInitExpression ListInit (NewExpression 
newExpression, IEnumerable<ElementInit> initializers)
                {
-                       throw new NotImplementedException ();
+                       var inits = CheckListInit (newExpression, initializers);
+
+                       return new ListInitExpression (newExpression, inits);
                }
 
-               [MonoTODO]
                public static ListInitExpression ListInit (NewExpression 
newExpression, params Expression [] initializers)
                {
-                       throw new NotImplementedException ();
+                       return ListInit (newExpression, initializers as 
IEnumerable<Expression>);
                }
 
-               [MonoTODO]
                public static ListInitExpression ListInit (NewExpression 
newExpression, IEnumerable<Expression> initializers)
                {
-                       throw new NotImplementedException ();
+                       var inits = CheckListInit (newExpression, initializers);
+
+                       var add_method = GetAddMethod (newExpression.Type, 
inits [0].Type);
+                       if (add_method == null)
+                               throw new InvalidOperationException ("No 
suitable add method found");
+
+                       return new ListInitExpression (newExpression, 
CreateInitializers (add_method, inits));
                }
 
-               [MonoTODO]
+               static ReadOnlyCollection<ElementInit> CreateInitializers 
(MethodInfo add_method, ReadOnlyCollection<Expression> initializers)
+               {
+                       return (from init in initializers select 
Expression.ElementInit (add_method, init)).ToReadOnlyCollection ();
+               }
+
+               static MethodInfo GetAddMethod (Type type, Type arg)
+               {
+                       return type.GetMethod ("Add", PublicInstance | 
BindingFlags.IgnoreCase, null, new [] { arg }, null);
+               }
+
                public static ListInitExpression ListInit (NewExpression 
newExpression, MethodInfo addMethod, params Expression [] initializers)
                {
-                       throw new NotImplementedException ();
+                       return ListInit (newExpression, addMethod, initializers 
as IEnumerable<Expression>);
                }
 
-               [MonoTODO]
+               static ReadOnlyCollection<T> CheckListInit<T> (NewExpression 
newExpression, IEnumerable<T> initializers) where T : class
+               {
+                       if (newExpression == null)
+                               throw new ArgumentNullException 
("newExpression");
+                       if (initializers == null)
+                               throw new ArgumentNullException 
("initializers");
+                       if (!typeof (IEnumerable).IsAssignableFrom 
(newExpression.Type))
+                               throw new InvalidOperationException ("The type 
of the new expression does not implement IEnumerable");
+
+                       var inits = initializers.ToReadOnlyCollection ();
+                       if (inits.Count == 0)
+                               throw new ArgumentException ("Empty 
initializers");
+
+                       CheckForNull (inits, "initializers");
+
+                       return inits;
+               }
+
                public static ListInitExpression ListInit (NewExpression 
newExpression, MethodInfo addMethod, IEnumerable<Expression> initializers)
                {
-                       throw new NotImplementedException ();
+                       var inits = CheckListInit (newExpression, initializers);
+
+                       if (addMethod != null) {
+                               if (addMethod.Name.ToLowerInvariant () != "add")
+                                       throw new ArgumentException 
("addMethod");
+
+                               var parameters = addMethod.GetParameters ();
+                               if (parameters.Length != 1)
+                                       throw new ArgumentException 
("addMethod");
+
+                               var type = parameters [0].ParameterType;
+
+                               foreach (var exp in inits)
+                                       if (!type.IsAssignableFrom (exp.Type))
+                                               throw new 
InvalidOperationException ("Initializer not assignable to the add method 
parameter type");
+                       }
+
+                       if (addMethod == null)
+                               addMethod = GetAddMethod (newExpression.Type, 
inits [0].Type);
+
+                       if (addMethod == null)
+                               throw new InvalidOperationException ("No 
suitable add method found");
+
+                       return new ListInitExpression (newExpression, 
CreateInitializers (addMethod, inits));
                }
 
                public static MemberExpression MakeMemberAccess (Expression 
expression, MemberInfo member)

Modified: 
trunk/mcs/class/System.Core/System.Linq.Expressions/ExpressionPrinter.cs
===================================================================
--- trunk/mcs/class/System.Core/System.Linq.Expressions/ExpressionPrinter.cs    
2008-02-20 17:02:50 UTC (rev 96271)
+++ trunk/mcs/class/System.Core/System.Linq.Expressions/ExpressionPrinter.cs    
2008-02-20 17:10:07 UTC (rev 96272)
@@ -346,7 +346,11 @@
 
                protected override void VisitListInit (ListInitExpression init)
                {
-                       throw new NotImplementedException ();
+                       Visit (init.NewExpression);
+                       Print (" {");
+                       // VisitElementInitializerList
+                       VisitList (init.Initializers, VisitElementInitializer);
+                       Print ("}");
                }
 
                protected override void VisitNewArray (NewArrayExpression 
newArray)

_______________________________________________
Mono-patches maillist  -  Mono-patches@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to