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);
}
}
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) {
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)
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",
public readonly PredefinedType MethodBase;
public readonly PredefinedType MethodInfo;
public readonly PredefinedType ConstructorInfo;
+ public readonly PredefinedType MemberBinding;
//
// C# 4.0
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");
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;
}