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 - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches