Author: jbevain
Date: 2008-02-19 09:11:37 -0500 (Tue, 19 Feb 2008)
New Revision: 96146

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-19  Jb Evain  <[EMAIL PROTECTED]>

        * Expression.cs, ExpressionPrinter.cs: implement last New
        overload for anonymous types.



Modified: trunk/mcs/class/System.Core/System.Linq.Expressions/ChangeLog
===================================================================
--- trunk/mcs/class/System.Core/System.Linq.Expressions/ChangeLog       
2008-02-19 13:52:05 UTC (rev 96145)
+++ trunk/mcs/class/System.Core/System.Linq.Expressions/ChangeLog       
2008-02-19 14:11:37 UTC (rev 96146)
@@ -1,3 +1,8 @@
+2008-02-19  Jb Evain  <[EMAIL PROTECTED]>
+
+       * Expression.cs, ExpressionPrinter.cs: implement last New
+       overload for anonymous types.
+
 2008-02-08  Jb Evain  <[EMAIL PROTECTED]>
 
        * Expression.cs, InvocationExpression.cs, ExpressionPrinter.cs

Modified: trunk/mcs/class/System.Core/System.Linq.Expressions/Expression.cs
===================================================================
--- trunk/mcs/class/System.Core/System.Linq.Expressions/Expression.cs   
2008-02-19 13:52:05 UTC (rev 96145)
+++ trunk/mcs/class/System.Core/System.Linq.Expressions/Expression.cs   
2008-02-19 14:11:37 UTC (rev 96146)
@@ -1523,16 +1523,53 @@
                        }
                }
 
-               [MonoTODO]
                public static NewExpression New (ConstructorInfo constructor, 
IEnumerable<Expression> arguments, params MemberInfo [] members)
                {
-                       throw new NotImplementedException ();
+                       return New (constructor, arguments, members as 
IEnumerable<MemberInfo>);
                }
 
-               [MonoTODO]
                public static NewExpression New (ConstructorInfo constructor, 
IEnumerable<Expression> arguments, IEnumerable<MemberInfo> members)
                {
-                       throw new NotImplementedException ();
+                       if (constructor == null)
+                               throw new ArgumentNullException ("constructor");
+                       
+                       var args = arguments.ToReadOnlyCollection ();
+                       var mmbs = members.ToReadOnlyCollection ();
+
+                       CheckForNull (args, "arguments");
+                       CheckForNull (mmbs, "members");
+
+                       CheckMethodArguments (constructor, args);
+
+                       if (args.Count != mmbs.Count)
+                               throw new ArgumentException ("Arguments count 
does not match members count");
+
+                       for (int i = 0; i < mmbs.Count; i++) {
+                               var member = mmbs [i];
+                               Type type = null;
+                               switch (member.MemberType) {
+                               case MemberTypes.Field:
+                                       type = (member as FieldInfo).FieldType;
+                                       break;
+                               case MemberTypes.Method:
+                                       type = (member as 
MethodInfo).ReturnType;
+                                       break;
+                               case MemberTypes.Property:
+                                       var prop = member as PropertyInfo;
+                                       if (prop.GetGetMethod (true) == null)
+                                               throw new ArgumentException 
("Property must have a getter");
+
+                                       type = (member as 
PropertyInfo).PropertyType;
+                                       break;
+                               default:
+                                       throw new ArgumentException ("Member 
type not allowed");
+                               }
+
+                               if (!type.IsAssignableFrom (args [i].Type))
+                                       throw new ArgumentException ("Argument 
type not assignable to member type");
+                       }
+
+                       return new NewExpression (constructor, args, mmbs);
                }
 
                public static NewArrayExpression NewArrayBounds (Type type, 
params Expression [] bounds)

Modified: 
trunk/mcs/class/System.Core/System.Linq.Expressions/ExpressionPrinter.cs
===================================================================
--- trunk/mcs/class/System.Core/System.Linq.Expressions/ExpressionPrinter.cs    
2008-02-19 13:52:05 UTC (rev 96145)
+++ trunk/mcs/class/System.Core/System.Linq.Expressions/ExpressionPrinter.cs    
2008-02-19 14:11:37 UTC (rev 96146)
@@ -322,7 +322,16 @@
                protected override void VisitNew (NewExpression nex)
                {
                        Print ("new {0}(", nex.Type.Name);
-                       VisitExpressionList (nex.Arguments);
+                       if (nex.Members != null && nex.Members.Count > 0) {
+                               for (int i = 0; i < nex.Members.Count; i++) {
+                                       if (i > 0)
+                                               Print (ListSeparator);
+
+                                       Print ("{0} = ", nex.Members [i].Name);
+                                       Visit (nex.Arguments [i]);
+                               }
+                       } else
+                               VisitExpressionList (nex.Arguments);
                        Print (")");
                }
 

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

Reply via email to