Import private members too when using dynamic context
authorMarek Safar <marek.safar@gmail.com>
Wed, 25 Aug 2010 09:20:03 +0000 (10:20 +0100)
committerMarek Safar <marek.safar@gmail.com>
Wed, 25 Aug 2010 09:21:13 +0000 (10:21 +0100)
25 files changed:
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpBinaryOperationBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpConvertBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpGetIndexBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpGetMemberBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpInvokeBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpInvokeConstructorBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpInvokeMemberBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpIsEventBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpSetIndexBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpSetMemberBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpUnaryOperationBinder.cs
mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/RuntimeBinderContext.cs
mcs/mcs/attribute.cs
mcs/mcs/context.cs
mcs/mcs/doc.cs
mcs/mcs/driver.cs
mcs/mcs/eval.cs
mcs/mcs/import.cs
mcs/mcs/namespace.cs
mcs/mcs/parameter.cs
mcs/mcs/typespec.cs
mcs/tests/dtest-024.cs [new file with mode: 0644]
mcs/tests/gtest-533.cs [new file with mode: 0644]
mcs/tests/ver-il-dmcs.xml

index 44d57a8ecc0896393d3d2fc8c3a7a14007e60c52..a59a09c80c425a8d8b2eea680f715da791123456 100644 (file)
@@ -130,21 +130,22 @@ namespace Microsoft.CSharp.RuntimeBinder
                
                public override DynamicMetaObject FallbackBinaryOperation (DynamicMetaObject target, DynamicMetaObject arg, DynamicMetaObject errorSuggestion)
                {
-                       var left = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
-                       var right = CSharpBinder.CreateCompilerExpression (argumentInfo [1], arg);
+                       var ctx = DynamicContext.Create ();
+                       var left = ctx.CreateCompilerExpression (argumentInfo [0], target);
+                       var right = ctx.CreateCompilerExpression (argumentInfo [1], arg);
                        
                        bool is_compound;
                        var oper = GetOperator (out is_compound);
                        Compiler.Expression expr;
 
                        if (is_compound) {
-                               var target_expr = CSharpBinder.CreateCompilerExpression (argumentInfo[0], target);
+                               var target_expr = ctx.CreateCompilerExpression (argumentInfo[0], target);
                                expr = new Compiler.CompoundAssign (oper, target_expr, right, left, Compiler.Location.Null);
                        } else {
                                expr = new Compiler.Binary (oper, left, right, Compiler.Location.Null);
                        }
 
-                       expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
+                       expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
                        
                        if ((flags & CSharpBinderFlags.CheckedContext) != 0)
                                expr = new Compiler.CheckedExpr (expr, Compiler.Location.Null);
@@ -153,7 +154,7 @@ namespace Microsoft.CSharp.RuntimeBinder
                        binder.AddRestrictions (target);
                        binder.AddRestrictions (arg);
 
-                       return binder.Bind (context);
+                       return binder.Bind (ctx, context);
                }
        }
 }
index 981252043cdc51339e5073c58bd16f8eb425cb94..1a8d645575acbeec5678818c465794edd2629723 100644 (file)
@@ -38,7 +38,6 @@ namespace Microsoft.CSharp.RuntimeBinder
        class CSharpBinder
        {
                static ConstructorInfo binder_exception_ctor;
-               static object compiler_initializer = new object ();
                static object resolver = new object ();
 
                DynamicMetaObjectBinder binder;
@@ -66,7 +65,7 @@ namespace Microsoft.CSharp.RuntimeBinder
                        restrictions = restrictions.Merge (CreateRestrictionsOnTarget (args));
                }
 
-               public DynamicMetaObject Bind (Type callingType, DynamicMetaObject target)
+               public DynamicMetaObject Bind (DynamicContext ctx, Type callingType, DynamicMetaObject target)
                {
                        if (target.Value == null) {
                                if (errorSuggestion != null)
@@ -76,18 +75,14 @@ namespace Microsoft.CSharp.RuntimeBinder
                                return new DynamicMetaObject (ex, restrictions);
                        }
 
-                       return Bind (callingType);
+                       return Bind (ctx, callingType);
                }
 
-               public DynamicMetaObject Bind (Type callingType)
+               public DynamicMetaObject Bind (DynamicContext ctx, Type callingType)
                {
-                       var ctx = CreateDefaultCompilerContext ();
-
-                       InitializeCompiler (ctx);
-
                        Expression res;
                        try {
-                               var rc = new Compiler.ResolveContext (new RuntimeBinderContext (ctx, TypeImporter.Import (callingType)), ResolveOptions);
+                               var rc = new Compiler.ResolveContext (new RuntimeBinderContext (ctx, ctx.ImportType (callingType)), ResolveOptions);
 
                                // Static typemanager and internal caches are not thread-safe
                                lock (resolver) {
@@ -124,46 +119,130 @@ namespace Microsoft.CSharp.RuntimeBinder
                        return Expression.Throw (Expression.New (binder_exception_ctor, Expression.Constant (message)), binder.ReturnType);
                }
 
+               static BindingRestrictions CreateRestrictionsOnTarget (DynamicMetaObject arg)
+               {
+                       return arg.HasValue && arg.Value == null ?
+                               BindingRestrictions.GetInstanceRestriction (arg.Expression, null) :
+                               BindingRestrictions.GetTypeRestriction (arg.Expression, arg.LimitType);
+               }
+
+               public static BindingRestrictions CreateRestrictionsOnTarget (DynamicMetaObject[] args)
+               {
+                       if (args.Length == 0)
+                               return BindingRestrictions.Empty;
+
+                       var res = CreateRestrictionsOnTarget (args[0]);
+                       for (int i = 1; i < args.Length; ++i)
+                               res = res.Merge (CreateRestrictionsOnTarget (args[i]));
+
+                       return res;
+               }
+       }
+
+       class DynamicContext
+       {
+               static DynamicContext dc;
+               static object compiler_initializer = new object ();
+               static object lock_object = new object ();
+
+               readonly Compiler.CompilerContext cc;
+
+               private DynamicContext (Compiler.CompilerContext cc)
+               {
+                       this.cc = cc;
+               }
+
+               public Compiler.CompilerContext CompilerContext {
+                       get {
+                               return cc;
+                       }
+               }
+
+               public static DynamicContext Create ()
+               {
+                       if (dc != null)
+                               return dc;
+
+                       lock (compiler_initializer) {
+                               if (dc != null)
+                                       return dc;
+
+                               var importer = new Compiler.ReflectionMetaImporter () {
+                                       IgnorePrivateMembers = false
+                               };
+
+                               var core_types = Compiler.TypeManager.InitCoreTypes ();
+                               importer.Initialize ();
+
+                               // I don't think dynamically loaded assemblies can be used as dynamic
+                               // expression without static type to be loaded first
+                               // AppDomain.CurrentDomain.AssemblyLoad += (sender, e) => { throw new NotImplementedException (); };
+
+                               // Import all currently loaded assemblies
+                               var ns = Compiler.GlobalRootNamespace.Instance;
+                               foreach (System.Reflection.Assembly a in AppDomain.CurrentDomain.GetAssemblies ()) {
+                                       ns.AddAssemblyReference (a);
+                                       importer.ImportAssembly (a, ns);
+                               }
+
+                               var reporter = new Compiler.Report (ErrorPrinter.Instance) {
+                                       WarningLevel = 0
+                               };
+
+                               var cc = new Compiler.CompilerContext (importer, reporter) {
+                                       IsRuntimeBinder = true
+                               };
+
+                               Compiler.TypeManager.InitCoreTypes (cc, core_types);
+                               Compiler.TypeManager.InitOptionalCoreTypes (cc);
+
+                               dc = new DynamicContext (cc);
+                       }
+
+                       return dc;
+               }
+
                //
                // Creates mcs expression from dynamic method object
                //
-               public static Compiler.Expression CreateCompilerExpression (CSharpArgumentInfo info, DynamicMetaObject value)
+               public Compiler.Expression CreateCompilerExpression (CSharpArgumentInfo info, DynamicMetaObject value)
                {
                        if (value.Value == null) {
                                if (value.LimitType == typeof (object))
                                        return new Compiler.NullLiteral (Compiler.Location.Null);
 
-                               InitializeCompiler (null);
-                               return Compiler.Constant.CreateConstantFromValue (TypeImporter.Import (value.LimitType), null, Compiler.Location.Null);
+                               return Compiler.Constant.CreateConstantFromValue (ImportType (value.LimitType), null, Compiler.Location.Null);
                        }
 
                        bool is_compile_time;
 
                        if (info != null) {
                                if ((info.Flags & CSharpArgumentInfoFlags.Constant) != 0) {
-                                       InitializeCompiler (null);
-                                       return Compiler.Constant.CreateConstantFromValue (TypeImporter.Import (value.LimitType), value.Value, Compiler.Location.Null);
+                                       return Compiler.Constant.CreateConstantFromValue (ImportType (value.LimitType), value.Value, Compiler.Location.Null);
                                }
 
                                if ((info.Flags & CSharpArgumentInfoFlags.IsStaticType) != 0)
-                                       return new Compiler.TypeExpression (TypeImporter.Import ((Type) value.Value), Compiler.Location.Null);
+                                       return new Compiler.TypeExpression (ImportType ((Type) value.Value), Compiler.Location.Null);
 
                                is_compile_time = (info.Flags & CSharpArgumentInfoFlags.UseCompileTimeType) != 0;
                        } else {
                                is_compile_time = false;
                        }
 
-                       return new Compiler.RuntimeValueExpression (value, TypeImporter.Import (is_compile_time ? value.LimitType : value.RuntimeType));
+                       return new Compiler.RuntimeValueExpression (value, ImportType (is_compile_time ? value.LimitType : value.RuntimeType));
                }
 
-               public static Compiler.Arguments CreateCompilerArguments (IEnumerable<CSharpArgumentInfo> info, DynamicMetaObject[] args)
+               //
+               // Creates mcs arguments from dynamic argument info
+               //
+               public Compiler.Arguments CreateCompilerArguments (IEnumerable<CSharpArgumentInfo> info, DynamicMetaObject[] args)
                {
                        var res = new Compiler.Arguments (args.Length);
                        int pos = 0;
 
                        // enumerates over args
                        foreach (var item in info) {
-                               var expr = CreateCompilerExpression (item, args [pos++]);
+                               var expr = CreateCompilerExpression (item, args[pos++]);
                                if (item.IsNamed) {
                                        res.Add (new Compiler.NamedArgument (item.Name, Compiler.Location.Null, expr));
                                } else {
@@ -177,82 +256,10 @@ namespace Microsoft.CSharp.RuntimeBinder
                        return res;
                }
 
-               public static Compiler.CompilerContext CreateDefaultCompilerContext ()
-               {
-                       return new Compiler.CompilerContext (
-                               new Compiler.Report (ErrorPrinter.Instance) {
-                                       WarningLevel = 0
-                               }) {
-                                       IsRuntimeBinder = true
-                               };
-               }
-
-               static BindingRestrictions CreateRestrictionsOnTarget (DynamicMetaObject arg)
-               {
-                       return arg.HasValue && arg.Value == null ?
-                               BindingRestrictions.GetInstanceRestriction (arg.Expression, null) :
-                               BindingRestrictions.GetTypeRestriction (arg.Expression, arg.LimitType);
-               }
-
-               public static BindingRestrictions CreateRestrictionsOnTarget (DynamicMetaObject[] args)
-               {
-                       if (args.Length == 0)
-                               return BindingRestrictions.Empty;
-
-                       var res = CreateRestrictionsOnTarget (args[0]);
-                       for (int i = 1; i < args.Length; ++i)
-                               res = res.Merge (CreateRestrictionsOnTarget (args[i]));
-
-                       return res;
-               }
-
-               public static void InitializeCompiler (Compiler.CompilerContext ctx)
-               {
-                       if (TypeImporter.Predefined == null)
-                               return;
-
-                       lock (compiler_initializer) {
-                               if (TypeImporter.Predefined == null)
-                                       return;
-
-                               // I don't think dynamically loaded assemblies can be used as dynamic
-                               // expression without static type to be loaded first
-                               // AppDomain.CurrentDomain.AssemblyLoad += (sender, e) => { throw new NotImplementedException (); };
-
-                               // Import all currently loaded assemblies
-                               var ns = Compiler.GlobalRootNamespace.Instance;
-                               foreach (System.Reflection.Assembly a in AppDomain.CurrentDomain.GetAssemblies ()) {
-                                       ns.AddAssemblyReference (a);
-                                       ns.ImportAssembly (a);
-                               }
-
-                               if (ctx == null)
-                                       ctx = CreateDefaultCompilerContext ();
-
-                               Compiler.TypeManager.InitCoreTypes (ctx, TypeImporter.Predefined);
-                               TypeImporter.Predefined = null;
-
-                               Compiler.TypeManager.InitOptionalCoreTypes (ctx);
-                       }
-               }
-       }
-
-       static class TypeImporter
-       {
-               static object lock_object;
-               public static IList<Compiler.PredefinedTypeSpec> Predefined;
-
-               static TypeImporter ()
-               {
-                       lock_object = new object ();
-                       Predefined = Compiler.TypeManager.InitCoreTypes ();
-                       Compiler.Import.Initialize ();
-               }
-
-               public static Compiler.TypeSpec Import (Type type)
+               public Compiler.TypeSpec ImportType (Type type)
                {
                        lock (lock_object) {
-                               return Compiler.Import.ImportType (type);
+                               return cc.MetaImporter.ImportType (type);
                        }
                }
        }
index d46fd719c371e9598cb57aa7a578136938cc6c45..32fa4726b106ba991acd3a75afeaff5fc71051e2 100644 (file)
@@ -48,12 +48,13 @@ namespace Microsoft.CSharp.RuntimeBinder
 
                public override DynamicMetaObject FallbackConvert (DynamicMetaObject target, DynamicMetaObject errorSuggestion)
                {
-                       var expr = CSharpBinder.CreateCompilerExpression (null, target);
+                       var ctx = DynamicContext.Create ();
+                       var expr = ctx.CreateCompilerExpression (null, target);
 
                        if (Explicit)
-                               expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (Type), Compiler.Location.Null), expr, Compiler.Location.Null);
+                               expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (Type), Compiler.Location.Null), expr, Compiler.Location.Null);
                        else
-                               expr = new Compiler.ImplicitCast (expr, TypeImporter.Import (Type), (flags & CSharpBinderFlags.ConvertArrayIndex) != 0);
+                               expr = new Compiler.ImplicitCast (expr, ctx.ImportType (Type), (flags & CSharpBinderFlags.ConvertArrayIndex) != 0);
 
                        if ((flags & CSharpBinderFlags.CheckedContext) != 0)
                                expr = new Compiler.CheckedExpr (expr, Compiler.Location.Null);
@@ -61,7 +62,7 @@ namespace Microsoft.CSharp.RuntimeBinder
                        var binder = new CSharpBinder (this, expr, errorSuggestion);
                        binder.AddRestrictions (target);
 
-                       return binder.Bind (context);
+                       return binder.Bind (ctx, context);
                }
        }
 }
index 966b15831d9c08bb3b702fc9fe975eae242f52f3..3afdf86a773a1265203517b512285a60e38550c9 100644 (file)
@@ -55,16 +55,17 @@ namespace Microsoft.CSharp.RuntimeBinder
                                return errorSuggestion;
                        }
 
-                       var expr = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
-                       var args = CSharpBinder.CreateCompilerArguments (argumentInfo.Skip (1), indexes);
+                       var ctx = DynamicContext.Create ();
+                       var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
+                       var args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), indexes);
                        expr = new Compiler.ElementAccess (expr, args, Compiler.Location.Null);
-                       expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
+                       expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
 
                        var binder = new CSharpBinder (this, expr, errorSuggestion);
                        binder.AddRestrictions (target);
                        binder.AddRestrictions (indexes);
 
-                       return binder.Bind (callingContext, target);
+                       return binder.Bind (ctx, callingContext, target);
                }
        }
 }
index 37ded7f382b2841b6c413ff226f61936a58dcc4c..9e23926c4daab957d43f02d0183500019f8767ad 100644 (file)
@@ -48,14 +48,16 @@ namespace Microsoft.CSharp.RuntimeBinder
                
                public override DynamicMetaObject FallbackGetMember (DynamicMetaObject target, DynamicMetaObject errorSuggestion)
                {
-                       var expr = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
+                       var ctx = DynamicContext.Create ();
+
+                       var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
                        expr = new Compiler.MemberAccess (expr, Name);
-                       expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
+                       expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
 
                        var binder = new CSharpBinder (this, expr, errorSuggestion);
                        binder.AddRestrictions (target);
 
-                       return binder.Bind (callingContext, target);
+                       return binder.Bind (ctx, callingContext, target);
                }
        }
 }
index f805bbf520333ea5905e13798dfc6e52b3b8ca03..8c7548ea0d593fdea54e7af2f10eebc477434976 100644 (file)
@@ -50,20 +50,21 @@ namespace Microsoft.CSharp.RuntimeBinder
                
                public override DynamicMetaObject FallbackInvoke (DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
                {
-                       var expr = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
-                       var c_args = CSharpBinder.CreateCompilerArguments (argumentInfo.Skip (1), args);
+                       var ctx = DynamicContext.Create ();
+                       var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
+                       var c_args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), args);
                        expr = new Compiler.Invocation (expr, c_args);
 
                        if ((flags & CSharpBinderFlags.ResultDiscarded) == 0)
-                               expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
+                               expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
                        else
-                               expr = new Compiler.DynamicResultCast (TypeImporter.Import (ReturnType), expr);
+                               expr = new Compiler.DynamicResultCast (ctx.ImportType (ReturnType), expr);
 
                        var binder = new CSharpBinder (this, expr, errorSuggestion);
                        binder.AddRestrictions (target);
                        binder.AddRestrictions (args);
 
-                       return binder.Bind (callingContext, target);
+                       return binder.Bind (ctx, callingContext, target);
                }
        }
 }
index b42cc43873d44d0e7eb729b3ade06f8a0d5bb8c9..dbe319f4afabe62b1208053a02fcbb4342176bdc 100644 (file)
@@ -48,10 +48,12 @@ namespace Microsoft.CSharp.RuntimeBinder
 
                public override DynamicMetaObject Bind (DynamicMetaObject target, DynamicMetaObject[] args)
                {
-                       var type = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
+                       var ctx = DynamicContext.Create ();
+
+                       var type = ctx.CreateCompilerExpression (argumentInfo [0], target);
                        target_return_type = type.Type.GetMetaInfo ();
 
-                       var c_args = CSharpBinder.CreateCompilerArguments (argumentInfo.Skip (1), args);
+                       var c_args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), args);
 
                        var binder = new CSharpBinder (
                                this, new Compiler.New (type, c_args, Compiler.Location.Null), null);
@@ -59,7 +61,7 @@ namespace Microsoft.CSharp.RuntimeBinder
                        binder.AddRestrictions (target);
                        binder.AddRestrictions (args);
 
-                       return binder.Bind (callingContext, target);
+                       return binder.Bind (ctx, callingContext, target);
                }
 
                public override Type ReturnType {
index 8b4a4999cd2f75eb9ae74d879076e97ecc59160c..5a6a65184e716bb493f08cf1d44fe97dd5f66fd0 100644 (file)
@@ -60,12 +60,13 @@ namespace Microsoft.CSharp.RuntimeBinder
                
                public override DynamicMetaObject FallbackInvokeMember (DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
                {
-                       var c_args = CSharpBinder.CreateCompilerArguments (argumentInfo.Skip (1), args);
+                       var ctx = DynamicContext.Create ();
+                       var c_args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), args);
                        var t_args = typeArguments == null ?
                                null :
-                               new Compiler.TypeArguments (typeArguments.Select (l => new Compiler.TypeExpression (TypeImporter.Import (l), Compiler.Location.Null)).ToArray ());
+                               new Compiler.TypeArguments (typeArguments.Select (l => new Compiler.TypeExpression (ctx.ImportType (l), Compiler.Location.Null)).ToArray ());
 
-                       var expr = CSharpBinder.CreateCompilerExpression (argumentInfo[0], target);
+                       var expr = ctx.CreateCompilerExpression (argumentInfo[0], target);
 
                        //
                        // Simple name invocation is actually member access invocation
@@ -83,9 +84,9 @@ namespace Microsoft.CSharp.RuntimeBinder
                        expr = new Compiler.Invocation (expr, c_args);
 
                        if ((flags & CSharpBinderFlags.ResultDiscarded) == 0)
-                               expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
+                               expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
                        else
-                               expr = new Compiler.DynamicResultCast (TypeImporter.Import (ReturnType), expr);
+                               expr = new Compiler.DynamicResultCast (ctx.ImportType (ReturnType), expr);
 
                        var binder = new CSharpBinder (this, expr, errorSuggestion);
                        binder.AddRestrictions (target);
@@ -94,7 +95,7 @@ namespace Microsoft.CSharp.RuntimeBinder
                        if ((flags & CSharpBinderFlags.InvokeSpecialName) != 0)
                                binder.ResolveOptions |= Compiler.ResolveContext.Options.InvokeSpecialName;
 
-                       return binder.Bind (callingContext, target);
+                       return binder.Bind (ctx, callingContext, target);
                }
        }
 }
index 15a7841bd61822e538594e31a55b3d8c4b8ec612..0cf12bcd29a6ac65d6edf03014a54c67f589f2bf 100644 (file)
@@ -47,9 +47,8 @@ namespace Microsoft.CSharp.RuntimeBinder
                
                public override DynamicMetaObject Bind (DynamicMetaObject target, DynamicMetaObject[] args)
                {
-                       var ctx = CSharpBinder.CreateDefaultCompilerContext ();
-                       CSharpBinder.InitializeCompiler (ctx);
-                       var context_type = TypeImporter.Import (callingContext);
+                       var ctx = DynamicContext.Create ();
+                       var context_type = ctx.ImportType (callingContext);
                        var rc = new Compiler.ResolveContext (new RuntimeBinderContext (ctx, context_type), 0);
 
                        var expr = Compiler.Expression.MemberLookup (rc, context_type, context_type, name, 0, false, Compiler.Location.Null);
@@ -58,7 +57,7 @@ namespace Microsoft.CSharp.RuntimeBinder
                                this, new Compiler.BoolConstant (expr is Compiler.EventExpr, Compiler.Location.Null), null);
 
                        binder.AddRestrictions (target);
-                       return binder.Bind (callingContext, target);
+                       return binder.Bind (ctx, callingContext, target);
                }
 
                public override Type ReturnType {
index 1f1d6719215ae5bcfb9eea063227f02541fa6f04..0109b32a99736798808b1ecd6aecc31abdcba07e 100644 (file)
@@ -55,20 +55,21 @@ namespace Microsoft.CSharp.RuntimeBinder
                                return errorSuggestion;
                        }
 
-                       var expr = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
-                       var args = CSharpBinder.CreateCompilerArguments (argumentInfo.Skip (1), indexes);
+                       var ctx = DynamicContext.Create ();
+                       var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
+                       var args = ctx.CreateCompilerArguments (argumentInfo.Skip (1), indexes);
                        expr = new Compiler.ElementAccess (expr, args, Compiler.Location.Null);
 
-                       var source = CSharpBinder.CreateCompilerExpression (argumentInfo [indexes.Length + 1], value);
+                       var source = ctx.CreateCompilerExpression (argumentInfo [indexes.Length + 1], value);
                        expr = new Compiler.SimpleAssign (expr, source);
-                       expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
+                       expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
 
                        var binder = new CSharpBinder (this, expr, errorSuggestion);
                        binder.AddRestrictions (target);
                        binder.AddRestrictions (value);
                        binder.AddRestrictions (indexes);
 
-                       return binder.Bind (callingContext, target);
+                       return binder.Bind (ctx, callingContext, target);
                }
        }
 }
index f3a4ae489e630bd70d11df5781ade46b15b7638d..89a245e766e90ca3127bf613e223bb4f734db790 100644 (file)
@@ -48,19 +48,20 @@ namespace Microsoft.CSharp.RuntimeBinder
                
                public override DynamicMetaObject FallbackSetMember (DynamicMetaObject target, DynamicMetaObject value, DynamicMetaObject errorSuggestion)
                {
-                       var source = CSharpBinder.CreateCompilerExpression (argumentInfo [1], value);
-                       var expr = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
+                       var ctx = DynamicContext.Create ();
+                       var source = ctx.CreateCompilerExpression (argumentInfo [1], value);
+                       var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
 
                        // Field assignment
                        expr = new Compiler.MemberAccess (expr, Name);
                        expr = new Compiler.SimpleAssign (expr, source);
-                       expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
+                       expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
 
                        var binder = new CSharpBinder (this, expr, errorSuggestion);
                        binder.AddRestrictions (target);
                        binder.AddRestrictions (value);
 
-                       return binder.Bind (callingContext, target);
+                       return binder.Bind (ctx, callingContext, target);
                }
        }
 }
index c116ff5c8c25987389f468ab4d1254869721e099..38dbf387f42d9b977423209910668d28d013fecd 100644 (file)
@@ -71,7 +71,8 @@ namespace Microsoft.CSharp.RuntimeBinder
                
                public override DynamicMetaObject FallbackUnaryOperation (DynamicMetaObject target, DynamicMetaObject errorSuggestion)
                {
-                       Compiler.Expression expr = CSharpBinder.CreateCompilerExpression (argumentInfo [0], target);
+                       var ctx = DynamicContext.Create ();
+                       var expr = ctx.CreateCompilerExpression (argumentInfo [0], target);
 
                        if (Operation == ExpressionType.IsTrue) {
                                expr = new Compiler.BooleanExpression (expr);
@@ -83,7 +84,7 @@ namespace Microsoft.CSharp.RuntimeBinder
                                else
                                        expr = new Compiler.Unary (GetOperator (), expr, Compiler.Location.Null);
 
-                               expr = new Compiler.Cast (new Compiler.TypeExpression (TypeImporter.Import (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
+                               expr = new Compiler.Cast (new Compiler.TypeExpression (ctx.ImportType (ReturnType), Compiler.Location.Null), expr, Compiler.Location.Null);
 
                                if ((flags & CSharpBinderFlags.CheckedContext) != 0)
                                        expr = new Compiler.CheckedExpr (expr, Compiler.Location.Null);
@@ -92,7 +93,7 @@ namespace Microsoft.CSharp.RuntimeBinder
                        var binder = new CSharpBinder (this, expr, errorSuggestion);
                        binder.AddRestrictions (target);
 
-                       return binder.Bind (context);
+                       return binder.Bind (ctx, context);
                }
        }
 }
index 9c170e3896ddd3bedfd3eea6a610b58b5f2bddab..afdb7f17db27faa5b382a6d3d1928897db9a54a0 100644 (file)
@@ -37,9 +37,9 @@ namespace Microsoft.CSharp.RuntimeBinder
                readonly Compiler.CompilerContext ctx;
                readonly Compiler.TypeSpec currentType;
 
-               public RuntimeBinderContext (Compiler.CompilerContext ctx, Compiler.TypeSpec currentType)
+               public RuntimeBinderContext (DynamicContext ctx, Compiler.TypeSpec currentType)
                {
-                       this.ctx = ctx;
+                       this.ctx = ctx.CompilerContext;
                        this.currentType = currentType;
                }
 
index 452544e223d881be00eab6053547e87fbc15933a..2a26b99e6d51b9a4ef02f3527a50ea02368f3ef3 100644 (file)
@@ -353,7 +353,7 @@ namespace Mono.CSharp {
                                }
                        }
 
-                       var char_set = Import.ImportType (typeof (CharSet));
+                       var char_set = rc.Compiler.MetaImporter.ImportType (typeof (CharSet));  // TODO: typeof
                        NamedArguments.Add (new NamedArgument (CharSetEnumMember, loc,
                                Constant.CreateConstant (rc, char_set, RootContext.ToplevelTypes.DefaultCharSet, Location)));
                }
index 19b39ffdb02a16a2b21a24f8503dccd386eb85a9..8da08ce636312af68880a3051ef95ac1b2a06397 100644 (file)
@@ -551,16 +551,26 @@ namespace Mono.CSharp
        public class CompilerContext
        {
                readonly Report report;
+               readonly ReflectionMetaImporter meta_importer;
 
-               public CompilerContext (Report report)
+               public CompilerContext (ReflectionMetaImporter metaImporter, Report report)
                {
+                       this.meta_importer = metaImporter;
                        this.report = report;
                }
 
                public bool IsRuntimeBinder { get; set; }
 
+               public ReflectionMetaImporter MetaImporter {
+                       get {
+                               return meta_importer;
+                       }
+               }
+
                public Report Report {
-                       get { return report; }
+                       get {
+                               return report;
+                       }
                }
 
                //public PredefinedAttributes PredefinedAttributes {
index 7107568a9e3d7d9758d7283ca57d39b5cf8d9f99..65e4cee087d59fb393cc6187b6aca903e7047e67 100644 (file)
@@ -271,7 +271,7 @@ namespace Mono.CSharp {
                        }
                        TypeSpec t = FindDocumentedTypeNonArray (mc, identifier, ds, cref, r);
                        if (t != null && is_array)
-                               t = Import.ImportType (Array.CreateInstance (t.GetMetaInfo (), 0).GetType ());
+                               t = ArrayContainer.MakeType (t);
                        return t;
                }
 
index 2458ec07a0baf5fd3d2d0c77feaf4e49a501f8a1..39360e9127f205eaa64983faf9ae2f8eb76e4e46 100644 (file)
@@ -97,7 +97,7 @@ namespace Mono.CSharp
                //
                Encoding encoding;
 
-               readonly CompilerContext ctx;
+               internal readonly CompilerContext ctx;
 
                static readonly char[] argument_value_separator = new char [] { ';', ',' };
 
@@ -114,7 +114,7 @@ namespace Mono.CSharp
 
                public static Driver Create (string[] args, bool require_files, ReportPrinter printer)
                {
-                       Driver d = new Driver (new CompilerContext (new Report (printer)));
+                       Driver d = new Driver (new CompilerContext (new ReflectionMetaImporter (), new Report (printer)));
 
                        if (!d.ParseArguments (args, require_files))
                                return null;
@@ -1703,7 +1703,7 @@ namespace Mono.CSharp
                        if (timestamps)
                                ShowTime ("Loading references");
 
-                       Import.Initialize ();
+                       ctx.MetaImporter.Initialize ();
                        LoadReferences ();
                        
                        if (modules.Count > 0) {
index 9d7be6f0f08f0b9106535502be47bfbd8a4b10ae..899331d0ffcd544adefc7c76fa649bc420878d39 100644 (file)
@@ -117,6 +117,8 @@ namespace Mono.CSharp {
                                if (driver == null)
                                        throw new Exception ("Failed to create compiler driver with the given arguments");
 
+                               ctx = driver.ctx;
+
                                RootContext.ToplevelTypes = new ModuleCompiled (ctx, true);
                                
                                driver.ProcessDefaultConfig ();
@@ -129,7 +131,7 @@ namespace Mono.CSharp {
                                RootContext.ToplevelTypes = new ModuleCompiled (ctx, true);
                                /*var ctypes = */TypeManager.InitCoreTypes ();
 
-                               Import.Initialize ();
+                               ctx.MetaImporter.Initialize ();
                                driver.LoadReferences ();
                                TypeManager.InitOptionalCoreTypes (ctx);
 
@@ -159,9 +161,11 @@ namespace Mono.CSharp {
                        } else
                                printer = new StreamReportPrinter (MessageOutput);
 
-                       ctx = new CompilerContext (new Report (printer));
+                       ctx = new CompilerContext (new ReflectionMetaImporter (), new Report (printer));
                        RootContext.ToplevelTypes = new ModuleCompiled (ctx, true);
 
+                       ctx.MetaImporter.Initialize ();
+
                        //
                        // PartialReset should not reset the core types, this is very redundant.
                        //
@@ -198,7 +202,7 @@ namespace Mono.CSharp {
                                if (interactive_base_class != null)
                                        return interactive_base_class;
 
-                               return Import.ImportType (typeof (InteractiveBase));
+                               return ctx.MetaImporter.ImportType (typeof (InteractiveBase));
                        }
                }
 
@@ -208,7 +212,7 @@ namespace Mono.CSharp {
                                throw new ArgumentNullException ();
 
                        lock (evaluator_lock)
-                               interactive_base_class = Import.ImportType (type);
+                               interactive_base_class = ctx.MetaImporter.ImportType (type);
                }
 
                /// <summary>
@@ -905,7 +909,7 @@ namespace Mono.CSharp {
                        lock (evaluator_lock){
 //                             GlobalRootNamespace.Instance.AddAssemblyReference (a);
 //                             GlobalRootNamespace.Instance.ComputeNamespaces (ctx);
-                               GlobalRootNamespace.Instance.ImportAssembly (a);
+                               ctx.MetaImporter.ImportAssembly (a, GlobalRootNamespace.Instance);
                        }
                }
 
index 8a7e370288cb0a62abca3727b3fb555bd1585256..246f57d592a56f170b6b16d6793d4702bb9d4892 100644 (file)
@@ -18,15 +18,25 @@ using System.Runtime.InteropServices;
 
 namespace Mono.CSharp
 {
-       public static class Import
+       public class ReflectionMetaImporter
        {
-               static Dictionary<Type, TypeSpec> import_cache;
-               static Dictionary<Type, PredefinedTypeSpec> type_2_predefined;
+               Dictionary<Type, TypeSpec> import_cache;
+               Dictionary<Type, PredefinedTypeSpec> type_2_predefined;
 
-               public static void Initialize ()
+               public ReflectionMetaImporter ()
                {
                        import_cache = new Dictionary<Type, TypeSpec> (1024, ReferenceEquality<Type>.Default);
+                       IgnorePrivateMembers = true;
+               }
+
+               #region Properties
+
+               public bool IgnorePrivateMembers { get; set; }
 
+               #endregion
+
+               public void Initialize ()
+               {
                        // Setup mapping for predefined types
                        type_2_predefined = new Dictionary<Type, PredefinedTypeSpec> () {
                                { typeof (object), TypeManager.object_type },
@@ -67,7 +77,7 @@ namespace Mono.CSharp
                        };
                }
 
-               public static FieldSpec CreateField (FieldInfo fi, TypeSpec declaringType)
+               public FieldSpec CreateField (FieldInfo fi, TypeSpec declaringType)
                {
                        Modifiers mod = 0;
                        var fa = fi.Attributes;
@@ -90,7 +100,7 @@ namespace Mono.CSharp
                        }
 
                        // Ignore private fields (even for error reporting) to not require extra dependencies
-                       if (mod == Modifiers.PRIVATE)
+                       if (mod == Modifiers.PRIVATE && IgnorePrivateMembers)
                                return null;
 
                        var definition = new ImportedMemberDefinition (fi);
@@ -101,7 +111,7 @@ namespace Mono.CSharp
                        } catch (Exception e) {
                                // TODO: I should construct fake TypeSpec based on TypeRef signature
                                // but there is no way to do it with System.Reflection
-                               throw new InternalErrorException (e, "Cannot import field `{0}.{1}' in assembly `{2}'",
+                               throw new InternalErrorException (e, "Cannot import field `{0}.{1}' referenced in assembly `{2}'",
                                        declaringType.GetSignatureForError (), fi.Name, declaringType.Assembly);
                        }
 
@@ -143,7 +153,7 @@ namespace Mono.CSharp
                        return new FieldSpec (declaringType, definition, field_type, fi, mod);
                }
 
-               public static EventSpec CreateEvent (EventInfo ei, TypeSpec declaringType, MethodSpec add, MethodSpec remove)
+               public EventSpec CreateEvent (EventInfo ei, TypeSpec declaringType, MethodSpec add, MethodSpec remove)
                {
                        add.IsAccessor = true;
                        remove.IsAccessor = true;
@@ -155,7 +165,7 @@ namespace Mono.CSharp
                        return new EventSpec (declaringType, definition, ImportType (ei.EventHandlerType), add.Modifiers, add, remove);
                }
 
-               static T[] CreateGenericParameters<T> (Type type, TypeSpec declaringType) where T : TypeSpec
+               T[] CreateGenericParameters<T> (Type type, TypeSpec declaringType) where T : TypeSpec
                {
                        Type[] tparams = type.GetGenericArguments ();
 
@@ -195,7 +205,7 @@ namespace Mono.CSharp
                        return CreateGenericParameters<T> (parent_owned_count, tparams);
                }
 
-               static T[] CreateGenericParameters<T> (int first, Type[] tparams) where T : TypeSpec
+               T[] CreateGenericParameters<T> (int first, Type[] tparams) where T : TypeSpec
                {
                        var tspec = new T [tparams.Length - first];
                        for (int pos = first; pos < tparams.Length; ++pos) {
@@ -218,13 +228,13 @@ namespace Mono.CSharp
                        return tspec;
                }
 
-               public static MethodSpec CreateMethod (MethodBase mb, TypeSpec declaringType)
+               public MethodSpec CreateMethod (MethodBase mb, TypeSpec declaringType)
                {
                        Modifiers mod = ReadMethodModifiers (mb, declaringType);
                        TypeParameterSpec[] tparams;
                        ImportedMethodDefinition definition;
 
-                       var parameters = ParametersImported.Create (declaringType, mb);
+                       var parameters = CreateParameters (declaringType, mb.GetParameters (), mb);
 
                        if (mb.IsGenericMethod) {
                                if (!mb.IsGenericMethodDefinition)
@@ -294,10 +304,78 @@ namespace Mono.CSharp
                        return ms;
                }
 
+               //
+               // Imports System.Reflection parameters
+               //
+               AParametersCollection CreateParameters (TypeSpec parent, ParameterInfo[] pi, MethodBase method)
+               {
+                       int varargs = method != null && (method.CallingConvention & CallingConventions.VarArgs) != 0 ? 1 : 0;
+
+                       if (pi.Length == 0 && varargs == 0)
+                               return ParametersCompiled.EmptyReadOnlyParameters;
+
+                       TypeSpec[] types = new TypeSpec[pi.Length + varargs];
+                       IParameterData[] par = new IParameterData[pi.Length + varargs];
+                       bool is_params = false;
+                       for (int i = 0; i < pi.Length; i++) {
+                               ParameterInfo p = pi[i];
+                               Parameter.Modifier mod = 0;
+                               Expression default_value = null;
+                               if (p.ParameterType.IsByRef) {
+                                       if ((p.Attributes & (ParameterAttributes.Out | ParameterAttributes.In)) == ParameterAttributes.Out)
+                                               mod = Parameter.Modifier.OUT;
+                                       else
+                                               mod = Parameter.Modifier.REF;
+
+                                       //
+                                       // Strip reference wrapping
+                                       //
+                                       types[i] = ImportType (p.ParameterType.GetElementType ());
+                               } else if (i == 0 && method.IsStatic && parent.IsStatic && // TODO: parent.Assembly.IsExtension &&
+                                       HasExtensionAttribute (CustomAttributeData.GetCustomAttributes (method)) != null) {
+                                       mod = Parameter.Modifier.This;
+                                       types[i] = ImportType (p.ParameterType);
+                               } else {
+                                       types[i] = ImportType (p.ParameterType);
+
+                                       if (i >= pi.Length - 2 && types[i] is ArrayContainer) {
+                                               var cattrs = CustomAttributeData.GetCustomAttributes (p);
+                                               if (cattrs != null && cattrs.Any (l => l.Constructor.DeclaringType == typeof (ParamArrayAttribute))) {
+                                                       mod = Parameter.Modifier.PARAMS;
+                                                       is_params = true;
+                                               }
+                                       }
+
+                                       if (!is_params && p.IsOptional) {
+                                               object value = p.DefaultValue;
+                                               if (value == Missing.Value) {
+                                                       default_value = EmptyExpression.Null;
+                                               } else if (value == null) {
+                                                       default_value = new NullLiteral (Location.Null);
+                                               } else {
+                                                       default_value = Constant.CreateConstant (null, ImportType (value.GetType ()), value, Location.Null);
+                                               }
+                                       }
+                               }
+
+                               par[i] = new ParameterData (p.Name, mod, default_value);
+                       }
+
+                       if (varargs != 0) {
+                               par[par.Length - 1] = new ArglistParameter (Location.Null);
+                               types[types.Length - 1] = InternalType.Arglist;
+                       }
+
+                       return method != null ?
+                               new ParametersImported (par, types, varargs != 0, is_params) :
+                               new ParametersImported (par, types, is_params);
+               }
+
+
                //
                // Returns null when the property is not valid C# property
                //
-               public static PropertySpec CreateProperty (PropertyInfo pi, TypeSpec declaringType, MethodSpec get, MethodSpec set)
+               public PropertySpec CreateProperty (PropertyInfo pi, TypeSpec declaringType, MethodSpec get, MethodSpec set)
                {
                        var definition = new ImportedMemberDefinition (pi);
 
@@ -413,7 +491,7 @@ namespace Mono.CSharp
                        return spec;
                }
 
-               public static TypeSpec CreateType (Type type)
+               public TypeSpec CreateType (Type type)
                {
                        TypeSpec declaring_type;
                        if (type.IsNested && !type.IsGenericParameter)
@@ -424,7 +502,7 @@ namespace Mono.CSharp
                        return CreateType (type, declaring_type);
                }
 
-               public static TypeSpec CreateType (Type type, TypeSpec declaringType)
+               public TypeSpec CreateType (Type type, TypeSpec declaringType)
                {
                        TypeSpec spec;
                        if (import_cache.TryGetValue (type, out spec))
@@ -511,7 +589,7 @@ namespace Mono.CSharp
                                mod |= Modifiers.SEALED;
                        }
 
-                       var definition = new ImportedTypeDefinition (type);
+                       var definition = new ImportedTypeDefinition (this, type);
                        PredefinedTypeSpec pt;
 
                        if (kind == MemberKind.Enum) {
@@ -521,7 +599,7 @@ namespace Mono.CSharp
 
                                var type_members = type.GetFields (underlying_member);
                                foreach (var type_member in type_members) {
-                                       spec = new EnumSpec (declaringType, definition, Import.CreateType (type_member.FieldType), type, mod);
+                                       spec = new EnumSpec (declaringType, definition, CreateType (type_member.FieldType), type, mod);
                                        break;
                                }
 
@@ -556,14 +634,14 @@ namespace Mono.CSharp
                        var ifaces = type.GetInterfaces ();
                        if (ifaces.Length > 0) {
                                foreach (Type iface in ifaces) {
-                                       spec.AddInterface (Import.CreateType (iface));
+                                       spec.AddInterface (CreateType (iface));
                                }
                        }
 
                        return spec;
                }
 
-               static TypeParameterSpec CreateTypeParameter (Type type, TypeSpec declaringType)
+               TypeParameterSpec CreateTypeParameter (Type type, TypeSpec declaringType)
                {
                        Variance variance;
                        switch (type.GenericParameterAttributes & GenericParameterAttributes.VarianceMask) {
@@ -634,7 +712,62 @@ namespace Mono.CSharp
                        return spec;
                }
 
-               public static TypeSpec ImportType (Type type)
+               static Type HasExtensionAttribute (IList<CustomAttributeData> attributes)
+               {
+                       foreach (var attr in attributes) {
+                               var dt = attr.Constructor.DeclaringType;
+                               if (dt.Name == "ExtensionAttribute" && dt.Namespace == "System.Runtime.CompilerServices") {
+                                       return dt;
+                               }
+                       }
+
+                       return null;
+               }
+
+               public void ImportAssembly (Assembly assembly, Namespace targetNamespace)
+               {
+                       Type extension_type = HasExtensionAttribute (CustomAttributeData.GetCustomAttributes (assembly));
+
+                       //
+                       // This part tries to simulate loading of top-level
+                       // types only, any missing dependencies are ignores here.
+                       // Full error report is reported later when the type is
+                       // actually used
+                       //
+                       Type[] all_types;
+                       try {
+                               all_types = assembly.GetTypes ();
+                       } catch (ReflectionTypeLoadException e) {
+                               all_types = e.Types;
+                       }
+
+                       Namespace ns = targetNamespace;
+                       string prev_namespace = null;
+                       foreach (var t in all_types) {
+                               if (t == null || t.IsNested)
+                                       continue;
+
+                               if (t.Name[0] == '<')
+                                       continue;
+
+                               var it = CreateType (t, null);
+                               if (it == null)
+                                       continue;
+
+                               if (prev_namespace != t.Namespace) {
+                                       ns = t.Namespace == null ? targetNamespace : targetNamespace.GetNamespace (t.Namespace, true);
+                                       prev_namespace = t.Namespace;
+                               }
+
+                               ns.AddType (it);
+
+                               if (it.IsStatic && extension_type != null && t.IsDefined (extension_type, false)) {
+                                       it.SetExtensionMethodContainer ();
+                               }
+                       }
+               }
+
+               public TypeSpec ImportType (Type type)
                {
                        if (type.HasElementType) {
                                var element = type.GetElementType ();
@@ -942,10 +1075,12 @@ namespace Mono.CSharp
        {
                TypeParameterSpec[] tparams;
                string name;
+               ReflectionMetaImporter meta_import;
 
-               public ImportedTypeDefinition (Type type)
+               public ImportedTypeDefinition (ReflectionMetaImporter metaImport, Type type)
                        : base (type)
                {
+                       this.meta_import = metaImport;
                }
 
                #region Properties
@@ -992,7 +1127,7 @@ namespace Mono.CSharp
                        if (attr.Length < 1)
                                return null;
 
-                       return Import.CreateType (((CoClassAttribute) attr[0]).CoClass);
+                       return meta_import.CreateType (((CoClassAttribute) attr[0]).CoClass);
                }
 
                public string GetAttributeDefaultMember ()
@@ -1013,6 +1148,12 @@ namespace Mono.CSharp
 
                public MemberCache LoadMembers (TypeSpec declaringType)
                {
+                       //
+                       // Not interested in members of nested private types unless the importer needs them
+                       //
+                       if (declaringType.IsPrivate && meta_import.IgnorePrivateMembers)
+                               return MemberCache.Empty;
+
                        var loading_type = (Type) provider;
                        const BindingFlags all_members = BindingFlags.DeclaredOnly |
                                BindingFlags.Static | BindingFlags.Instance |
@@ -1052,7 +1193,7 @@ namespace Mono.CSharp
                                        if (mb.IsPrivate && mb.IsDefined (typeof (CompilerGeneratedAttribute), false))
                                                continue;
 
-                                       imported = Import.CreateMethod (mb, declaringType);
+                                       imported = meta_import.CreateMethod (mb, declaringType);
                                        if (imported.Kind == MemberKind.Method && !imported.IsGeneric) {
                                                if (possible_accessors == null)
                                                        possible_accessors = new Dictionary<MethodBase, MethodSpec> (ReferenceEquality<MethodBase>.Default);
@@ -1083,7 +1224,7 @@ namespace Mono.CSharp
                                        if (get == null && set == null)
                                                continue;
 
-                                       imported = Import.CreateProperty (p, declaringType, get, set);
+                                       imported = meta_import.CreateProperty (p, declaringType, get, set);
                                        if (imported == null)
                                                continue;
 
@@ -1109,7 +1250,7 @@ namespace Mono.CSharp
                                        if (add == null || remove == null)
                                                continue;
 
-                                       imported = Import.CreateEvent (e, declaringType, add, remove);
+                                       imported = meta_import.CreateEvent (e, declaringType, add, remove);
                                        break;
                                case MemberTypes.Field:
                                        var fi = (FieldInfo) member;
@@ -1118,7 +1259,7 @@ namespace Mono.CSharp
                                        if (fi.IsPrivate && fi.IsDefined (typeof (CompilerGeneratedAttribute), false))
                                                continue;
 
-                                       imported = Import.CreateField (fi, declaringType);
+                                       imported = meta_import.CreateField (fi, declaringType);
                                        if (imported == null)
                                                continue;
 
@@ -1130,7 +1271,7 @@ namespace Mono.CSharp
                                        if (t.IsNotPublic && t.IsDefined (typeof (CompilerGeneratedAttribute), false))
                                                continue;
 
-                                       imported = Import.CreateType (t, declaringType);
+                                       imported = meta_import.CreateType (t, declaringType);
                                        break;
                                default:
                                        throw new NotImplementedException (member.ToString ());
index a7442ae87c0ff83da9f0ceaa4c3d3f9e686b3960..8fd3dff0f54d82a57a40a6758a194670ba95faa9 100644 (file)
@@ -50,7 +50,7 @@ namespace Mono.CSharp {
                {
                        foreach (Assembly a in referenced_assemblies) {
                                try {
-                                       ImportAssembly (a);
+                                       ctx.MetaImporter.ImportAssembly (a, this);
                                } catch (TypeLoadException e) {
                                        ctx.Report.Error (11, Location.Null, e.Message);
                                } catch (System.IO.FileNotFoundException) {
@@ -77,57 +77,6 @@ namespace Mono.CSharp {
                                GetNamespace (dotted_name, true);
                }
 
-               public void ImportAssembly (Assembly assembly)
-               {
-                       Type extension_type = null;
-                       var all_attributes = CustomAttributeData.GetCustomAttributes (assembly);
-                       foreach (var attr in all_attributes) {
-                               var dt = attr.Constructor.DeclaringType;
-                               if (dt.Name == "ExtensionAttribute" && dt.Namespace == "System.Runtime.CompilerServices") {
-                                       extension_type = dt;
-                                       break;
-                               }
-                       }
-
-                       //
-                       // This part tries to simulate loading of top-level
-                       // types only, any missing dependencies are ignores here.
-                       // Full error report is reported later when the type is
-                       // actually used
-                       //
-                       Type[] all_types;
-                       try {
-                               all_types = assembly.GetTypes ();
-                       } catch (ReflectionTypeLoadException e) {
-                               all_types = e.Types;
-                       }
-
-                       Namespace ns = this;
-                       string prev_namespace = null;
-                       foreach (var t in all_types) {
-                               if (t == null || t.IsNested)
-                                       continue;
-
-                               if (t.Name[0] == '<')
-                                       continue;
-
-                               var it = Import.CreateType (t, null);
-                               if (it == null)
-                                       continue;
-
-                               if (prev_namespace != t.Namespace) {
-                                       ns = t.Namespace == null ? this : GetNamespace (t.Namespace, true);
-                                       prev_namespace = t.Namespace;
-                               }
-
-                               ns.AddType (it);
-
-                               if (it.IsStatic && extension_type != null && t.IsDefined (extension_type, false)) {
-                                       it.SetExtensionMethodContainer ();
-                               }
-                       }
-               }
-
                public override string GetSignatureForError ()
                {
                        return alias_name + "::";
index b219a8170885351b69c78fae7449969d172cb038..54532a59b07fcc1bf33fa234996f20e5016f9780 100644 (file)
@@ -939,15 +939,7 @@ namespace Mono.CSharp {
        //
        public class ParametersImported : AParametersCollection
        {
-               ParametersImported (AParametersCollection param, TypeSpec[] types)
-               {
-                       this.parameters = param.FixedParameters;
-                       this.types = types;
-                       has_arglist = param.HasArglist;
-                       has_params = param.HasParams;
-               }
-
-               ParametersImported (IParameterData [] parameters, TypeSpec [] types, bool hasArglist, bool hasParams)
+               public ParametersImported (IParameterData [] parameters, TypeSpec [] types, bool hasArglist, bool hasParams)
                {
                        this.parameters = parameters;
                        this.types = types;
@@ -961,91 +953,6 @@ namespace Mono.CSharp {
                        this.types = types;
                        this.has_params = hasParams;
                }
-
-               public static AParametersCollection Create (TypeSpec parent, MethodBase method)
-               {
-                       return Create (parent, method.GetParameters (), method);
-               }
-
-               //
-               // Imports System.Reflection parameters
-               //
-               public static AParametersCollection Create (TypeSpec parent, ParameterInfo [] pi, MethodBase method)
-               {
-                       int varargs = method != null && (method.CallingConvention & CallingConventions.VarArgs) != 0 ? 1 : 0;
-
-                       if (pi.Length == 0 && varargs == 0)
-                               return ParametersCompiled.EmptyReadOnlyParameters;
-
-                       TypeSpec [] types = new TypeSpec [pi.Length + varargs];
-                       IParameterData [] par = new IParameterData [pi.Length + varargs];
-                       bool is_params = false;
-                       for (int i = 0; i < pi.Length; i++) {
-                               ParameterInfo p = pi [i];
-                               Parameter.Modifier mod = 0;
-                               Expression default_value = null;
-                               if (p.ParameterType.IsByRef) {
-                                       if ((p.Attributes & (ParameterAttributes.Out | ParameterAttributes.In)) == ParameterAttributes.Out)
-                                               mod = Parameter.Modifier.OUT;
-                                       else
-                                               mod = Parameter.Modifier.REF;
-
-                                       //
-                                       // Strip reference wrapping
-                                       //
-                                       types [i] = Import.ImportType (p.ParameterType.GetElementType ());
-                               } else if (i == 0 && method.IsStatic && parent.IsStatic && // TODO: parent.Assembly.IsExtension &&
-                                       HasExtensionAttribute (method)) {
-                                       mod = Parameter.Modifier.This;
-                                       types[i] = Import.ImportType (p.ParameterType);
-                               } else {
-                                       types[i] = Import.ImportType (p.ParameterType);
-
-                                       if (i >= pi.Length - 2 && types[i] is ArrayContainer) {
-                                               var cattrs = CustomAttributeData.GetCustomAttributes (p);
-                                               if (cattrs != null && cattrs.Any (l => l.Constructor.DeclaringType == typeof (ParamArrayAttribute))) {
-                                                       mod = Parameter.Modifier.PARAMS;
-                                                       is_params = true;
-                                               }
-                                       }
-
-                                       if (!is_params && p.IsOptional) {
-                                               object value = p.DefaultValue;
-                                               if (value == Missing.Value) {
-                                                       default_value = EmptyExpression.Null;
-                                               } else if (value == null) {
-                                                       default_value = new NullLiteral (Location.Null);
-                                               } else {
-                                                       default_value = Constant.CreateConstant (null, Import.ImportType (value.GetType ()), value, Location.Null);
-                                               }
-                                       }
-                               }
-
-                               par [i] = new ParameterData (p.Name, mod, default_value);
-                       }
-
-                       if (varargs != 0) {
-                               par [par.Length - 1] = new ArglistParameter (Location.Null);
-                               types [types.Length - 1] = InternalType.Arglist;
-                       }
-
-                       return method != null ?
-                               new ParametersImported (par, types, varargs != 0, is_params) :
-                               new ParametersImported (par, types, is_params);
-               }
-
-               static bool HasExtensionAttribute (MethodBase mb)
-               {
-                       var all_attributes = CustomAttributeData.GetCustomAttributes (mb);
-                       foreach (var attr in all_attributes) {
-                               var dt = attr.Constructor.DeclaringType;
-                               if (dt.Name == "ExtensionAttribute" && dt.Namespace == "System.Runtime.CompilerServices") {
-                                       return true;
-                               }
-                       }
-
-                       return false;
-               }
        }
 
        /// <summary>
index 2edb5cef452a898319a2a1f8c5517d245e9fb478..242dacdb2734ba9a116f81c600f030bd53b99acd 100644 (file)
@@ -308,14 +308,7 @@ namespace Mono.CSharp
 
                protected virtual void InitializeMemberCache (bool onlyTypes)
                {
-                       //
-                       // Not interested in members of nested private types
-                       //
-                       if (IsPrivate) {
-                               cache = new MemberCache (0);
-                       } else {
-                               cache = MemberDefinition.LoadMembers (this);
-                       }
+                       cache = MemberDefinition.LoadMembers (this);
                }
 
                //
diff --git a/mcs/tests/dtest-024.cs b/mcs/tests/dtest-024.cs
new file mode 100644 (file)
index 0000000..cf4d1f2
--- /dev/null
@@ -0,0 +1,23 @@
+using System;
+
+// Tests private accessibility for dynamic binder
+
+class Test
+{
+       private delegate int D ();
+       private int field = 9;
+
+       public static int Main ()
+       {
+               D del = () => 5;
+               dynamic d = del;
+               if (d () != 5)
+                       return 1;
+
+               d = new Test ();
+               if (d.field != 9)
+                       return 2;
+
+               return 0;
+       }
+}
diff --git a/mcs/tests/gtest-533.cs b/mcs/tests/gtest-533.cs
new file mode 100644 (file)
index 0000000..dafc015
--- /dev/null
@@ -0,0 +1,24 @@
+public class List<X>
+{
+       public class Comp<Y>
+       {
+               public List<Y>.Comp<X> flip (Y y, X x)
+               {
+                       return new Flip<Y> (this);
+               }
+       }
+       public class Flip<Z> : List<Z>.Comp<X>
+       {
+               Comp<Z> c;
+               public Flip (Comp<Z> cc) { c = cc; }
+       }
+}
+
+class C
+{
+       public static int Main ()
+       {
+               var a = new List<short>.Comp<bool> ().flip (true, 3);
+               return 0;
+       }
+}
index 908c93a95bd4a4a64fe9d4aed513836fc6df2b42..4343166478e55714b25f0c531b571d9177b73c66 100644 (file)
       </method>
     </type>
   </test>
+  <test name="dtest-024.cs">
+    <type name="Test">
+      <method name="Int32 Main()">
+        <size>524</size>
+      </method>
+      <method name="Int32 &lt;Main&gt;m__0()">
+        <size>2</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>15</size>
+      </method>
+    </type>
+    <type name="Test+D">
+      <method name="Int32 Invoke()">
+        <size>0</size>
+      </method>
+      <method name="IAsyncResult BeginInvoke(System.AsyncCallback, System.Object)">
+        <size>0</size>
+      </method>
+      <method name="Int32 EndInvoke(IAsyncResult)">
+        <size>0</size>
+      </method>
+      <method name="Void .ctor(Object, IntPtr)">
+        <size>0</size>
+      </method>
+    </type>
+  </test>
   <test name="dtest-error-01.cs">
     <type name="Helper">
       <method name="Int32* Foo(Int32)">
       </method>
     </type>
   </test>
+  <test name="gtest-533.cs">
+    <type name="List`1[X]">
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="List`1+Comp`1[X,Y]">
+      <method name="List`1+Comp`1[Y,X] flip(Y, X)">
+        <size>7</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="List`1+Flip`1[X,Z]">
+      <method name="Void .ctor(Comp`1)">
+        <size>14</size>
+      </method>
+    </type>
+    <type name="C">
+      <method name="Int32 Main()">
+        <size>15</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="gtest-anon-1.cs">
     <type name="X">
       <method name="Void .ctor()">