using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Linq.Expressions;
+using System.Reflection;
namespace Microsoft.CSharp.RuntimeBinder
{
public static CallSiteBinder InvokeConstructor (CSharpBinderFlags flags, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
{
- throw new NotImplementedException ();
+ // What are flags for here
+ return new CSharpInvokeConstructorBinder (context, argumentInfo);
}
public static CallSiteBinder InvokeMember (CSharpBinderFlags flags, string name, IEnumerable<Type> typeArguments, Type context, IEnumerable<CSharpArgumentInfo> argumentInfo)
--- /dev/null
+//
+// CSharpInvokeConstructorBinder.cs
+//
+// Authors:
+// Marek Safar <marek.safar@gmail.com>
+//
+// Copyright (C) 2009 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Dynamic;
+using System.Collections.Generic;
+using System.Linq;
+using Compiler = Mono.CSharp;
+
+namespace Microsoft.CSharp.RuntimeBinder
+{
+ class CSharpInvokeConstructorBinder : DynamicMetaObjectBinder
+ {
+ IList<CSharpArgumentInfo> argumentInfo;
+ Type callingContext;
+ Type target_return_type;
+
+ public CSharpInvokeConstructorBinder (Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo)
+ {
+ this.callingContext = callingContext;
+ this.argumentInfo = argumentInfo.ToReadOnly ();
+ }
+
+ public override DynamicMetaObject Bind (DynamicMetaObject target, DynamicMetaObject[] args)
+ {
+ var type = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
+ target_return_type = type.Type;
+
+ var c_args = CSharpBinder.CreateCompilerArguments (argumentInfo.Skip (1), args);
+
+ Compiler.Expression expr = new Compiler.New (type, c_args, Compiler.Location.Null);
+
+ var restrictions = CSharpBinder.CreateRestrictionsOnTarget (target).Merge (
+ CSharpBinder.CreateRestrictionsOnTarget (args));
+
+ return CSharpBinder.Bind (this, expr, callingContext, restrictions, null);
+ }
+
+ public override Type ReturnType {
+ get {
+ return target_return_type;
+ }
+ }
+ }
+}
public override DynamicMetaObject FallbackInvokeMember (DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
{
- var expr = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
var c_args = CSharpBinder.CreateCompilerArguments (argumentInfo.Skip (1), args);
var t_args = typeArguments == null ?
null :
new Compiler.TypeArguments (typeArguments.Select (l => new Compiler.TypeExpression (l, Compiler.Location.Null)).ToArray ());
- expr = new Compiler.MemberAccess (expr, Name, t_args, Compiler.Location.Null);
+ Compiler.Expression expr;
+ if ((flags & CSharpBinderFlags.InvokeSimpleName) != 0) {
+ expr = new Compiler.SimpleName (Name, t_args, Compiler.Location.Null);
+ } else {
+ expr = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
+ expr = new Compiler.MemberAccess (expr, Name, t_args, Compiler.Location.Null);
+ }
+
expr = new Compiler.Invocation (expr, c_args);
if ((flags & CSharpBinderFlags.ResultDiscarded) == 0)