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