Insert constructor into AST before initializer is parsed
[mono.git] / mcs / mcs / typemanager.cs
index 0cd4d0e22b921bc5134656abd658848b0744f748..51bc5326bca4c7f3d194f6361fb58dd02eaac46c 100644 (file)
@@ -3,65 +3,67 @@
 //
 // Author: Miguel de Icaza (miguel@gnu.org)
 //         Ravi Pratap     (ravi@ximian.com)
-//         Marek Safar     (marek.safar@seznam.cz)
+//         Marek Safar     (marek.safar@gmail.com)
 //
 // Dual licensed under the terms of the MIT X11 or GNU GPL
 //
 // Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
-// Copyright 2003-2008 Novell, Inc.
+// Copyright 2003-2011 Novell, Inc.
+// Copyright 2011 Xamarin Inc
 //
 
 using System;
 using System.Globalization;
 using System.Collections.Generic;
 using System.Text;
+using System.IO;
 
 namespace Mono.CSharp
 {
        //
-       // All compiler build-in types (they have to exist otherwise the compiler will not work)
+       // All compiler built-in types (they have to exist otherwise the compiler will not work)
        //
-       public class BuildinTypes
+       public class BuiltinTypes
        {
-               public readonly BuildinTypeSpec Object;
-               public readonly BuildinTypeSpec ValueType;
-               public readonly BuildinTypeSpec Attribute;
-
-               public readonly BuildinTypeSpec Int;
-               public readonly BuildinTypeSpec UInt;
-               public readonly BuildinTypeSpec Long;
-               public readonly BuildinTypeSpec ULong;
-               public readonly BuildinTypeSpec Float;
-               public readonly BuildinTypeSpec Double;
-               public readonly BuildinTypeSpec Char;
-               public readonly BuildinTypeSpec Short;
-               public readonly BuildinTypeSpec Decimal;
-               public readonly BuildinTypeSpec Bool;
-               public readonly BuildinTypeSpec SByte;
-               public readonly BuildinTypeSpec Byte;
-               public readonly BuildinTypeSpec UShort;
-               public readonly BuildinTypeSpec String;
-
-               public readonly BuildinTypeSpec Enum;
-               public readonly BuildinTypeSpec Delegate;
-               public readonly BuildinTypeSpec MulticastDelegate;
-               public readonly BuildinTypeSpec Void;
-               public readonly BuildinTypeSpec Array;
-               public readonly BuildinTypeSpec Type;
-               public readonly BuildinTypeSpec IEnumerator;
-               public readonly BuildinTypeSpec IEnumerable;
-               public readonly BuildinTypeSpec IDisposable;
-               public readonly BuildinTypeSpec IntPtr;
-               public readonly BuildinTypeSpec UIntPtr;
-               public readonly BuildinTypeSpec RuntimeFieldHandle;
-               public readonly BuildinTypeSpec RuntimeTypeHandle;
-               public readonly BuildinTypeSpec Exception;
+               public readonly BuiltinTypeSpec Object;
+               public readonly BuiltinTypeSpec ValueType;
+               public readonly BuiltinTypeSpec Attribute;
+
+               public readonly BuiltinTypeSpec Int;
+               public readonly BuiltinTypeSpec UInt;
+               public readonly BuiltinTypeSpec Long;
+               public readonly BuiltinTypeSpec ULong;
+               public readonly BuiltinTypeSpec Float;
+               public readonly BuiltinTypeSpec Double;
+               public readonly BuiltinTypeSpec Char;
+               public readonly BuiltinTypeSpec Short;
+               public readonly BuiltinTypeSpec Decimal;
+               public readonly BuiltinTypeSpec Bool;
+               public readonly BuiltinTypeSpec SByte;
+               public readonly BuiltinTypeSpec Byte;
+               public readonly BuiltinTypeSpec UShort;
+               public readonly BuiltinTypeSpec String;
+
+               public readonly BuiltinTypeSpec Enum;
+               public readonly BuiltinTypeSpec Delegate;
+               public readonly BuiltinTypeSpec MulticastDelegate;
+               public readonly BuiltinTypeSpec Void;
+               public readonly BuiltinTypeSpec Array;
+               public readonly BuiltinTypeSpec Type;
+               public readonly BuiltinTypeSpec IEnumerator;
+               public readonly BuiltinTypeSpec IEnumerable;
+               public readonly BuiltinTypeSpec IDisposable;
+               public readonly BuiltinTypeSpec IntPtr;
+               public readonly BuiltinTypeSpec UIntPtr;
+               public readonly BuiltinTypeSpec RuntimeFieldHandle;
+               public readonly BuiltinTypeSpec RuntimeTypeHandle;
+               public readonly BuiltinTypeSpec Exception;
 
                //
                // These are internal buil-in types which depend on other
                // build-in type (mostly object)
                //
-               public readonly BuildinTypeSpec Dynamic;
+               public readonly BuiltinTypeSpec Dynamic;
 
                // Predefined operators tables
                public readonly Binary.PredefinedOperator[] OperatorsBinaryStandard;
@@ -73,48 +75,48 @@ namespace Mono.CSharp
                public readonly TypeSpec[] BinaryPromotionsTypes;
                public readonly TypeSpec[] SwitchUserTypes;
 
-               readonly BuildinTypeSpec[] types;
+               readonly BuiltinTypeSpec[] types;
 
-               public BuildinTypes ()
+               public BuiltinTypes ()
                {
-                       Object = new BuildinTypeSpec (MemberKind.Class, "System", "Object", BuildinTypeSpec.Type.Object);
-                       ValueType = new BuildinTypeSpec (MemberKind.Class, "System", "ValueType", BuildinTypeSpec.Type.ValueType);
-                       Attribute = new BuildinTypeSpec (MemberKind.Class, "System", "Attribute", BuildinTypeSpec.Type.Attribute);
-
-                       Int = new BuildinTypeSpec (MemberKind.Struct, "System", "Int32", BuildinTypeSpec.Type.Int);
-                       Long = new BuildinTypeSpec (MemberKind.Struct, "System", "Int64", BuildinTypeSpec.Type.Long);
-                       UInt = new BuildinTypeSpec (MemberKind.Struct, "System", "UInt32", BuildinTypeSpec.Type.UInt);
-                       ULong = new BuildinTypeSpec (MemberKind.Struct, "System", "UInt64", BuildinTypeSpec.Type.ULong);
-                       Byte = new BuildinTypeSpec (MemberKind.Struct, "System", "Byte", BuildinTypeSpec.Type.Byte);
-                       SByte = new BuildinTypeSpec (MemberKind.Struct, "System", "SByte", BuildinTypeSpec.Type.SByte);
-                       Short = new BuildinTypeSpec (MemberKind.Struct, "System", "Int16", BuildinTypeSpec.Type.Short);
-                       UShort = new BuildinTypeSpec (MemberKind.Struct, "System", "UInt16", BuildinTypeSpec.Type.UShort);
-
-                       IEnumerator = new BuildinTypeSpec (MemberKind.Interface, "System.Collections", "IEnumerator", BuildinTypeSpec.Type.IEnumerator);
-                       IEnumerable = new BuildinTypeSpec (MemberKind.Interface, "System.Collections", "IEnumerable", BuildinTypeSpec.Type.IEnumerable);
-                       IDisposable = new BuildinTypeSpec (MemberKind.Interface, "System", "IDisposable", BuildinTypeSpec.Type.IDisposable);
-
-                       Char = new BuildinTypeSpec (MemberKind.Struct, "System", "Char", BuildinTypeSpec.Type.Char);
-                       String = new BuildinTypeSpec (MemberKind.Class, "System", "String", BuildinTypeSpec.Type.String);
-                       Float = new BuildinTypeSpec (MemberKind.Struct, "System", "Single", BuildinTypeSpec.Type.Float);
-                       Double = new BuildinTypeSpec (MemberKind.Struct, "System", "Double", BuildinTypeSpec.Type.Double);
-                       Decimal = new BuildinTypeSpec (MemberKind.Struct, "System", "Decimal", BuildinTypeSpec.Type.Decimal);
-                       Bool = new BuildinTypeSpec (MemberKind.Struct, "System", "Boolean", BuildinTypeSpec.Type.Bool);
-                       IntPtr = new BuildinTypeSpec (MemberKind.Struct, "System", "IntPtr", BuildinTypeSpec.Type.IntPtr);
-                       UIntPtr = new BuildinTypeSpec (MemberKind.Struct, "System", "UIntPtr", BuildinTypeSpec.Type.UIntPtr);
-
-                       MulticastDelegate = new BuildinTypeSpec (MemberKind.Class, "System", "MulticastDelegate", BuildinTypeSpec.Type.MulticastDelegate);
-                       Delegate = new BuildinTypeSpec (MemberKind.Class, "System", "Delegate", BuildinTypeSpec.Type.Delegate);
-                       Enum = new BuildinTypeSpec (MemberKind.Class, "System", "Enum", BuildinTypeSpec.Type.Enum);
-                       Array = new BuildinTypeSpec (MemberKind.Class, "System", "Array", BuildinTypeSpec.Type.Array);
-                       Void = new BuildinTypeSpec (MemberKind.Void, "System", "Void", BuildinTypeSpec.Type.Other);
-                       Type = new BuildinTypeSpec (MemberKind.Class, "System", "Type", BuildinTypeSpec.Type.Type);
-                       Exception = new BuildinTypeSpec (MemberKind.Class, "System", "Exception", BuildinTypeSpec.Type.Exception);
-                       RuntimeFieldHandle = new BuildinTypeSpec (MemberKind.Struct, "System", "RuntimeFieldHandle", BuildinTypeSpec.Type.Other);
-                       RuntimeTypeHandle = new BuildinTypeSpec (MemberKind.Struct, "System", "RuntimeTypeHandle", BuildinTypeSpec.Type.Other);
+                       Object = new BuiltinTypeSpec (MemberKind.Class, "System", "Object", BuiltinTypeSpec.Type.Object);
+                       ValueType = new BuiltinTypeSpec (MemberKind.Class, "System", "ValueType", BuiltinTypeSpec.Type.ValueType);
+                       Attribute = new BuiltinTypeSpec (MemberKind.Class, "System", "Attribute", BuiltinTypeSpec.Type.Attribute);
+
+                       Int = new BuiltinTypeSpec (MemberKind.Struct, "System", "Int32", BuiltinTypeSpec.Type.Int);
+                       Long = new BuiltinTypeSpec (MemberKind.Struct, "System", "Int64", BuiltinTypeSpec.Type.Long);
+                       UInt = new BuiltinTypeSpec (MemberKind.Struct, "System", "UInt32", BuiltinTypeSpec.Type.UInt);
+                       ULong = new BuiltinTypeSpec (MemberKind.Struct, "System", "UInt64", BuiltinTypeSpec.Type.ULong);
+                       Byte = new BuiltinTypeSpec (MemberKind.Struct, "System", "Byte", BuiltinTypeSpec.Type.Byte);
+                       SByte = new BuiltinTypeSpec (MemberKind.Struct, "System", "SByte", BuiltinTypeSpec.Type.SByte);
+                       Short = new BuiltinTypeSpec (MemberKind.Struct, "System", "Int16", BuiltinTypeSpec.Type.Short);
+                       UShort = new BuiltinTypeSpec (MemberKind.Struct, "System", "UInt16", BuiltinTypeSpec.Type.UShort);
+
+                       IEnumerator = new BuiltinTypeSpec (MemberKind.Interface, "System.Collections", "IEnumerator", BuiltinTypeSpec.Type.IEnumerator);
+                       IEnumerable = new BuiltinTypeSpec (MemberKind.Interface, "System.Collections", "IEnumerable", BuiltinTypeSpec.Type.IEnumerable);
+                       IDisposable = new BuiltinTypeSpec (MemberKind.Interface, "System", "IDisposable", BuiltinTypeSpec.Type.IDisposable);
+
+                       Char = new BuiltinTypeSpec (MemberKind.Struct, "System", "Char", BuiltinTypeSpec.Type.Char);
+                       String = new BuiltinTypeSpec (MemberKind.Class, "System", "String", BuiltinTypeSpec.Type.String);
+                       Float = new BuiltinTypeSpec (MemberKind.Struct, "System", "Single", BuiltinTypeSpec.Type.Float);
+                       Double = new BuiltinTypeSpec (MemberKind.Struct, "System", "Double", BuiltinTypeSpec.Type.Double);
+                       Decimal = new BuiltinTypeSpec (MemberKind.Struct, "System", "Decimal", BuiltinTypeSpec.Type.Decimal);
+                       Bool = new BuiltinTypeSpec (MemberKind.Struct, "System", "Boolean", BuiltinTypeSpec.Type.Bool);
+                       IntPtr = new BuiltinTypeSpec (MemberKind.Struct, "System", "IntPtr", BuiltinTypeSpec.Type.IntPtr);
+                       UIntPtr = new BuiltinTypeSpec (MemberKind.Struct, "System", "UIntPtr", BuiltinTypeSpec.Type.UIntPtr);
+
+                       MulticastDelegate = new BuiltinTypeSpec (MemberKind.Class, "System", "MulticastDelegate", BuiltinTypeSpec.Type.MulticastDelegate);
+                       Delegate = new BuiltinTypeSpec (MemberKind.Class, "System", "Delegate", BuiltinTypeSpec.Type.Delegate);
+                       Enum = new BuiltinTypeSpec (MemberKind.Class, "System", "Enum", BuiltinTypeSpec.Type.Enum);
+                       Array = new BuiltinTypeSpec (MemberKind.Class, "System", "Array", BuiltinTypeSpec.Type.Array);
+                       Void = new BuiltinTypeSpec (MemberKind.Void, "System", "Void", BuiltinTypeSpec.Type.Other);
+                       Type = new BuiltinTypeSpec (MemberKind.Class, "System", "Type", BuiltinTypeSpec.Type.Type);
+                       Exception = new BuiltinTypeSpec (MemberKind.Class, "System", "Exception", BuiltinTypeSpec.Type.Exception);
+                       RuntimeFieldHandle = new BuiltinTypeSpec (MemberKind.Struct, "System", "RuntimeFieldHandle", BuiltinTypeSpec.Type.Other);
+                       RuntimeTypeHandle = new BuiltinTypeSpec (MemberKind.Struct, "System", "RuntimeTypeHandle", BuiltinTypeSpec.Type.Other);
 
                        // TODO: Maybe I should promote it to different kind for faster compares
-                       Dynamic = new BuildinTypeSpec ("dynamic", BuildinTypeSpec.Type.Dynamic);
+                       Dynamic = new BuiltinTypeSpec ("dynamic", BuiltinTypeSpec.Type.Dynamic);
 
                        OperatorsBinaryStandard = Binary.CreateStandardOperatorsTable (this);
                        OperatorsBinaryEquality = Binary.CreateEqualityOperatorsTable (this);
@@ -125,19 +127,14 @@ namespace Mono.CSharp
                        BinaryPromotionsTypes = ConstantFold.CreateBinaryPromotionsTypes (this);
                        SwitchUserTypes = Switch.CreateSwitchUserTypes (this);
 
-                       types = new BuildinTypeSpec[] {
+                       types = new BuiltinTypeSpec[] {
                                Object, ValueType, Attribute,
                                Int, UInt, Long, ULong, Float, Double, Char, Short, Decimal, Bool, SByte, Byte, UShort, String,
                                Enum, Delegate, MulticastDelegate, Void, Array, Type, IEnumerator, IEnumerable, IDisposable,
                                IntPtr, UIntPtr, RuntimeFieldHandle, RuntimeTypeHandle, Exception };
-
-                       // Deal with obsolete static types
-                       // TODO: remove
-                       TypeManager.object_type = Object;
-                       TypeManager.value_type = ValueType;
                }
 
-               public BuildinTypeSpec[] AllTypes {
+               public BuiltinTypeSpec[] AllTypes {
                        get {
                                return types;
                        }
@@ -147,14 +144,14 @@ namespace Mono.CSharp
                {
                        var ctx = module.Compiler;
                        foreach (var p in types) {
-                               var found = PredefinedType.Resolve (module, p.Kind, p.Namespace, p.Name, p.Arity, Location.Null);
+                               var found = PredefinedType.Resolve (module, p.Kind, p.Namespace, p.Name, p.Arity);
                                if (found == null || found == p)
                                        continue;
 
                                var tc = found.MemberDefinition as TypeContainer;
                                if (tc != null) {
                                        var ns = module.GlobalRootNamespace.GetNamespace (p.Namespace, false);
-                                       ns.ReplaceTypeWithPredefined (found, p);
+                                       ns.SetBuiltinType (p);
 
                                        tc.SetPredefinedSpec (p);
                                        p.SetDefinition (found);
@@ -179,6 +176,7 @@ namespace Mono.CSharp
        class PredefinedTypes
        {
                public readonly PredefinedType ArgIterator;
+               public readonly PredefinedType TypedReference;
                public readonly PredefinedType MarshalByRefObject;
                public readonly PredefinedType RuntimeHelpers;
                public readonly PredefinedType IAsyncResult;
@@ -198,6 +196,8 @@ namespace Mono.CSharp
                public readonly PredefinedType RuntimeFieldHandle;
                public readonly PredefinedType RuntimeMethodHandle;
                public readonly PredefinedType SecurityAction;
+               public readonly PredefinedType Dictionary;
+               public readonly PredefinedType Hashtable;
 
                //
                // C# 3.0
@@ -209,6 +209,7 @@ namespace Mono.CSharp
                public readonly PredefinedType MethodBase;
                public readonly PredefinedType MethodInfo;
                public readonly PredefinedType ConstructorInfo;
+               public readonly PredefinedType MemberBinding;
 
                //
                // C# 4.0
@@ -218,9 +219,19 @@ namespace Mono.CSharp
                public readonly PredefinedType CallSiteGeneric;
                public readonly PredefinedType BinderFlags;
 
+               //
+               // C# 5.0
+               //
+               public readonly PredefinedType AsyncVoidMethodBuilder;
+               public readonly PredefinedType AsyncTaskMethodBuilder;
+               public readonly PredefinedType AsyncTaskMethodBuilderGeneric;
+               public readonly PredefinedType Action;
+               public readonly PredefinedType Task;
+               public readonly PredefinedType TaskGeneric;
+
                public PredefinedTypes (ModuleContainer module)
                {
-                       var TypedReference = new PredefinedType (module, MemberKind.Struct, "System", "TypedReference");
+                       TypedReference = new PredefinedType (module, MemberKind.Struct, "System", "TypedReference");
                        ArgIterator = new PredefinedType (module, MemberKind.Struct, "System", "ArgIterator");
 
                        MarshalByRefObject = new PredefinedType (module, MemberKind.Class, "System", "MarshalByRefObject");
@@ -242,9 +253,12 @@ namespace Mono.CSharp
                        RuntimeFieldHandle = new PredefinedType (module, MemberKind.Struct, "System", "RuntimeFieldHandle");
                        RuntimeMethodHandle = new PredefinedType (module, MemberKind.Struct, "System", "RuntimeMethodHandle");
                        SecurityAction = new PredefinedType (module, MemberKind.Enum, "System.Security.Permissions", "SecurityAction");
+                       Dictionary = new PredefinedType (module, MemberKind.Class, "System.Collections.Generic", "Dictionary", 2);
+                       Hashtable = new PredefinedType (module, MemberKind.Class, "System.Collections", "Hashtable");
 
                        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");
@@ -256,40 +270,58 @@ namespace Mono.CSharp
                        Binder = new PredefinedType (module, MemberKind.Class, "Microsoft.CSharp.RuntimeBinder", "Binder");
                        BinderFlags = new PredefinedType (module, MemberKind.Enum, "Microsoft.CSharp.RuntimeBinder", "CSharpBinderFlags");
 
+                       Action = new PredefinedType (module, MemberKind.Delegate, "System", "Action");
+                       AsyncVoidMethodBuilder = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncVoidMethodBuilder");
+                       AsyncTaskMethodBuilder = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder");
+                       AsyncTaskMethodBuilderGeneric = new PredefinedType (module, MemberKind.Struct, "System.Runtime.CompilerServices", "AsyncTaskMethodBuilder", 1);
+                       Task = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task");
+                       TaskGeneric = new PredefinedType (module, MemberKind.Class, "System.Threading.Tasks", "Task", 1);
+
                        //
                        // Define types which are used for comparison. It does not matter
                        // if they don't exist as no error report is needed
                        //
                        if (TypedReference.Define ())
                                TypedReference.TypeSpec.IsSpecialRuntimeType = true;
+
                        if (ArgIterator.Define ())
                                ArgIterator.TypeSpec.IsSpecialRuntimeType = true;
-                       MarshalByRefObject.Define ();
-                       CharSet.Define ();
-
-                       IEnumerableGeneric.Define ();
-                       IListGeneric.Define ();
-                       ICollectionGeneric.Define ();
-                       IEnumerableGeneric.Define ();
-                       IEnumeratorGeneric.Define ();
+
+                       if (IEnumerableGeneric.Define ())
+                               IEnumerableGeneric.TypeSpec.IsGenericIterateInterface = true;
+
+                       if (IListGeneric.Define ())
+                               IListGeneric.TypeSpec.IsGenericIterateInterface = true;
+
+                       if (ICollectionGeneric.Define ())
+                               ICollectionGeneric.TypeSpec.IsGenericIterateInterface = true;
+
                        if (Nullable.Define ())
                                Nullable.TypeSpec.IsNullableType = true;
 
                        if (ExpressionGeneric.Define ())
                                ExpressionGeneric.TypeSpec.IsExpressionTreeType = true;
 
-                       // Deal with obsolete static types
-                       // TODO: remove
-                       TypeManager.generic_ilist_type = IListGeneric.TypeSpec;
-                       TypeManager.generic_icollection_type = ICollectionGeneric.TypeSpec;
-                       TypeManager.generic_ienumerator_type = IEnumeratorGeneric.TypeSpec;
-                       TypeManager.generic_ienumerable_type = IEnumerableGeneric.TypeSpec;
+                       Task.Define ();
+                       if (TaskGeneric.Define ())
+                               TaskGeneric.TypeSpec.IsGenericTask = true;
                }
        }
 
        class PredefinedMembers
        {
                public readonly PredefinedMember<MethodSpec> ActivatorCreateInstance;
+               public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderCreate;
+               public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderSetResult;
+               public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderSetException;
+               public readonly PredefinedMember<PropertySpec> AsyncTaskMethodBuilderTask;
+               public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericCreate;
+               public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericSetResult;
+               public readonly PredefinedMember<MethodSpec> AsyncTaskMethodBuilderGenericSetException;
+               public readonly PredefinedMember<PropertySpec> AsyncTaskMethodBuilderGenericTask;
+               public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderCreate;
+               public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderSetException;
+               public readonly PredefinedMember<MethodSpec> AsyncVoidMethodBuilderSetResult;
                public readonly PredefinedMember<MethodSpec> DecimalCtor;
                public readonly PredefinedMember<MethodSpec> DecimalCtorInt;
                public readonly PredefinedMember<MethodSpec> DecimalCtorLong;
@@ -321,65 +353,100 @@ namespace Mono.CSharp
                public readonly PredefinedMember<MethodSpec> StringInequal;
                public readonly PredefinedMember<MethodSpec> StructLayoutAttributeCtor;
                public readonly PredefinedMember<FieldSpec> StructLayoutCharSet;
-               public readonly PredefinedMember<FieldSpec> StructLayoutPack;
                public readonly PredefinedMember<FieldSpec> StructLayoutSize;
                public readonly PredefinedMember<MethodSpec> TypeGetTypeFromHandle;
 
                public PredefinedMembers (ModuleContainer module)
                {
-                       var ctx = module.Compiler;
                        var types = module.PredefinedTypes;
                        var atypes = module.PredefinedAttributes;
-                       var btypes = module.Compiler.BuildinTypes;
+                       var btypes = module.Compiler.BuiltinTypes;
 
-                       ActivatorCreateInstance = new PredefinedMember<MethodSpec> (ctx, types.Activator,
+                       ActivatorCreateInstance = new PredefinedMember<MethodSpec> (module, types.Activator,
                                MemberFilter.Method ("CreateInstance", 1, ParametersCompiled.EmptyReadOnlyParameters, null));
 
-                       DecimalCtor = new PredefinedMember<MethodSpec> (ctx, btypes.Decimal,
+                       AsyncTaskMethodBuilderCreate = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
+                               MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncTaskMethodBuilder.TypeSpec));
+
+                       AsyncTaskMethodBuilderSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
+                               MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void));
+
+                       AsyncTaskMethodBuilderSetException = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
+                               MemberFilter.Method ("SetException", 0,
+                               ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void));
+
+                       AsyncTaskMethodBuilderTask = new PredefinedMember<PropertySpec> (module, types.AsyncTaskMethodBuilder,
+                               MemberFilter.Property ("Task", null));
+
+                       AsyncTaskMethodBuilderGenericCreate = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
+                               MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec));
+
+                       AsyncTaskMethodBuilderGenericSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
+                               "SetResult", MemberKind.Method, () => new TypeSpec[] {
+                                               types.AsyncTaskMethodBuilderGeneric.TypeSpec.MemberDefinition.TypeParameters[0]
+                               });
+
+                       AsyncTaskMethodBuilderGenericSetException = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
+                               MemberFilter.Method ("SetException", 0,
+                               ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void));
+
+                       AsyncTaskMethodBuilderGenericTask = new PredefinedMember<PropertySpec> (module, types.AsyncTaskMethodBuilderGeneric,
+                               MemberFilter.Property ("Task", null));
+
+                       AsyncVoidMethodBuilderCreate = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
+                               MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec));
+
+                       AsyncVoidMethodBuilderSetException = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
+                               MemberFilter.Method ("SetException", 0, null, btypes.Void));
+
+                       AsyncVoidMethodBuilderSetResult = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
+                               MemberFilter.Method ("SetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, btypes.Void));
+
+                       DecimalCtor = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
                                MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
                                        btypes.Int, btypes.Int, btypes.Int, btypes.Bool, btypes.Byte)));
 
-                       DecimalCtorInt = new PredefinedMember<MethodSpec> (ctx, btypes.Decimal,
+                       DecimalCtorInt = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
                                MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Int)));
 
-                       DecimalCtorLong = new PredefinedMember<MethodSpec> (ctx, btypes.Decimal,
+                       DecimalCtorLong = new PredefinedMember<MethodSpec> (module, btypes.Decimal,
                                MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Long)));
 
-                       DecimalConstantAttributeCtor = new PredefinedMember<MethodSpec> (ctx, atypes.DecimalConstant,
+                       DecimalConstantAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.DecimalConstant,
                                MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
                                        btypes.Byte, btypes.Byte, btypes.UInt, btypes.UInt, btypes.UInt)));
 
-                       DefaultMemberAttributeCtor = new PredefinedMember<MethodSpec> (ctx, atypes.DefaultMember,
+                       DefaultMemberAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.DefaultMember,
                                MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.String)));
 
-                       DelegateCombine = new PredefinedMember<MethodSpec> (ctx, btypes.Delegate, "Combine", btypes.Delegate, btypes.Delegate);
-                       DelegateRemove = new PredefinedMember<MethodSpec> (ctx, btypes.Delegate, "Remove", btypes.Delegate, btypes.Delegate);
+                       DelegateCombine = new PredefinedMember<MethodSpec> (module, btypes.Delegate, "Combine", btypes.Delegate, btypes.Delegate);
+                       DelegateRemove = new PredefinedMember<MethodSpec> (module, btypes.Delegate, "Remove", btypes.Delegate, btypes.Delegate);
 
-                       DelegateEqual = new PredefinedMember<MethodSpec> (ctx, btypes.Delegate,
+                       DelegateEqual = new PredefinedMember<MethodSpec> (module, btypes.Delegate,
                                new MemberFilter (Operator.GetMetadataName (Operator.OpType.Equality), 0, MemberKind.Operator, null, btypes.Bool));
 
-                       DelegateInequal = new PredefinedMember<MethodSpec> (ctx, btypes.Delegate,
+                       DelegateInequal = new PredefinedMember<MethodSpec> (module, btypes.Delegate,
                                new MemberFilter (Operator.GetMetadataName (Operator.OpType.Inequality), 0, MemberKind.Operator, null, btypes.Bool));
 
-                       DynamicAttributeCtor = new PredefinedMember<MethodSpec> (ctx, atypes.Dynamic,
+                       DynamicAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.Dynamic,
                                MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (
                                        ArrayContainer.MakeType (module, btypes.Bool))));
 
-                       FieldInfoGetFieldFromHandle = new PredefinedMember<MethodSpec> (ctx, types.FieldInfo,
+                       FieldInfoGetFieldFromHandle = new PredefinedMember<MethodSpec> (module, types.FieldInfo,
                                "GetFieldFromHandle", MemberKind.Method, types.RuntimeFieldHandle);
 
-                       FieldInfoGetFieldFromHandle2 = new PredefinedMember<MethodSpec> (ctx, types.FieldInfo,
+                       FieldInfoGetFieldFromHandle2 = new PredefinedMember<MethodSpec> (module, types.FieldInfo,
                                "GetFieldFromHandle", MemberKind.Method, types.RuntimeFieldHandle, new PredefinedType (btypes.RuntimeTypeHandle));
 
-                       FixedBufferAttributeCtor = new PredefinedMember<MethodSpec> (ctx, atypes.FixedBuffer,
+                       FixedBufferAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.FixedBuffer,
                                MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Type, btypes.Int)));
 
-                       IDisposableDispose = new PredefinedMember<MethodSpec> (ctx, btypes.IDisposable, "Dispose", TypeSpec.EmptyTypes);
+                       IDisposableDispose = new PredefinedMember<MethodSpec> (module, btypes.IDisposable, "Dispose", TypeSpec.EmptyTypes);
 
-                       IEnumerableGetEnumerator = new PredefinedMember<MethodSpec> (ctx, btypes.IEnumerable,
+                       IEnumerableGetEnumerator = new PredefinedMember<MethodSpec> (module, btypes.IEnumerable,
                                "GetEnumerator", TypeSpec.EmptyTypes);
 
-                       InterlockedCompareExchange = new PredefinedMember<MethodSpec> (ctx, types.Interlocked,
+                       InterlockedCompareExchange = new PredefinedMember<MethodSpec> (module, types.Interlocked,
                                MemberFilter.Method ("CompareExchange", 0,
                                        new ParametersImported (
                                                new[] {
@@ -393,7 +460,7 @@ namespace Mono.CSharp
                                                false),
                                btypes.Int));
 
-                       InterlockedCompareExchange_T = new PredefinedMember<MethodSpec> (ctx, types.Interlocked,
+                       InterlockedCompareExchange_T = new PredefinedMember<MethodSpec> (module, types.Interlocked,
                                MemberFilter.Method ("CompareExchange", 1,
                                        new ParametersImported (
                                                new[] {
@@ -408,15 +475,15 @@ namespace Mono.CSharp
                                                        }, false),
                                        null));
 
-                       MethodInfoGetMethodFromHandle = new PredefinedMember<MethodSpec> (ctx, types.MethodBase,
+                       MethodInfoGetMethodFromHandle = new PredefinedMember<MethodSpec> (module, types.MethodBase,
                                "GetMethodFromHandle", MemberKind.Method, types.RuntimeMethodHandle);
 
-                       MethodInfoGetMethodFromHandle2 = new PredefinedMember<MethodSpec> (ctx, types.MethodBase,
+                       MethodInfoGetMethodFromHandle2 = new PredefinedMember<MethodSpec> (module, types.MethodBase,
                                "GetMethodFromHandle", MemberKind.Method, types.RuntimeMethodHandle, new PredefinedType (btypes.RuntimeTypeHandle));
 
-                       MonitorEnter = new PredefinedMember<MethodSpec> (ctx, types.Monitor, "Enter", btypes.Object);
+                       MonitorEnter = new PredefinedMember<MethodSpec> (module, types.Monitor, "Enter", btypes.Object);
 
-                       MonitorEnter_v4 = new PredefinedMember<MethodSpec> (ctx, types.Monitor,
+                       MonitorEnter_v4 = new PredefinedMember<MethodSpec> (module, types.Monitor,
                                MemberFilter.Method ("Enter", 0,
                                        new ParametersImported (new[] {
                                                        new ParameterData (null, Parameter.Modifier.NONE),
@@ -426,41 +493,38 @@ namespace Mono.CSharp
                                                        btypes.Object, btypes.Bool
                                                }, false), null));
 
-                       MonitorExit = new PredefinedMember<MethodSpec> (ctx, types.Monitor, "Exit", btypes.Object);
+                       MonitorExit = new PredefinedMember<MethodSpec> (module, types.Monitor, "Exit", btypes.Object);
 
-                       RuntimeCompatibilityWrapNonExceptionThrows = new PredefinedMember<PropertySpec> (ctx, atypes.RuntimeCompatibility,
+                       RuntimeCompatibilityWrapNonExceptionThrows = new PredefinedMember<PropertySpec> (module, atypes.RuntimeCompatibility,
                                MemberFilter.Property ("WrapNonExceptionThrows", btypes.Bool));
 
-                       RuntimeHelpersInitializeArray = new PredefinedMember<MethodSpec> (ctx, types.RuntimeHelpers,
+                       RuntimeHelpersInitializeArray = new PredefinedMember<MethodSpec> (module, types.RuntimeHelpers,
                                "InitializeArray", btypes.Array, btypes.RuntimeFieldHandle);
 
-                       RuntimeHelpersOffsetToStringData = new PredefinedMember<PropertySpec> (ctx, types.RuntimeHelpers,
+                       RuntimeHelpersOffsetToStringData = new PredefinedMember<PropertySpec> (module, types.RuntimeHelpers,
                                MemberFilter.Property ("OffsetToStringData", btypes.Int));
 
-                       SecurityActionRequestMinimum = new PredefinedMember<ConstSpec> (ctx, types.SecurityAction, "RequestMinimum",
+                       SecurityActionRequestMinimum = new PredefinedMember<ConstSpec> (module, types.SecurityAction, "RequestMinimum",
                                MemberKind.Field, types.SecurityAction);
 
-                       StringEmpty = new PredefinedMember<FieldSpec> (ctx, btypes.String, MemberFilter.Field ("Empty", btypes.String));
+                       StringEmpty = new PredefinedMember<FieldSpec> (module, btypes.String, MemberFilter.Field ("Empty", btypes.String));
 
-                       StringEqual = new PredefinedMember<MethodSpec> (ctx, btypes.String,
+                       StringEqual = new PredefinedMember<MethodSpec> (module, btypes.String,
                                new MemberFilter (Operator.GetMetadataName (Operator.OpType.Equality), 0, MemberKind.Operator, null, btypes.Bool));
 
-                       StringInequal = new PredefinedMember<MethodSpec> (ctx, btypes.String,
+                       StringInequal = new PredefinedMember<MethodSpec> (module, btypes.String,
                                new MemberFilter (Operator.GetMetadataName (Operator.OpType.Inequality), 0, MemberKind.Operator, null, btypes.Bool));
 
-                       StructLayoutAttributeCtor = new PredefinedMember<MethodSpec> (ctx, atypes.StructLayout,
+                       StructLayoutAttributeCtor = new PredefinedMember<MethodSpec> (module, atypes.StructLayout,
                                MemberFilter.Constructor (ParametersCompiled.CreateFullyResolved (btypes.Short)));
 
-                       StructLayoutCharSet = new PredefinedMember<FieldSpec> (ctx, atypes.StructLayout, "CharSet",
+                       StructLayoutCharSet = new PredefinedMember<FieldSpec> (module, atypes.StructLayout, "CharSet",
                                MemberKind.Field, types.CharSet);
 
-                       StructLayoutPack = new PredefinedMember<FieldSpec> (ctx, atypes.StructLayout,
-                               MemberFilter.Field ("Pack", btypes.Int));
-
-                       StructLayoutSize = new PredefinedMember<FieldSpec> (ctx, atypes.StructLayout,
+                       StructLayoutSize = new PredefinedMember<FieldSpec> (module, atypes.StructLayout,
                                MemberFilter.Field ("Size", btypes.Int));
 
-                       TypeGetTypeFromHandle = new PredefinedMember<MethodSpec> (ctx, btypes.Type, "GetTypeFromHandle", btypes.RuntimeTypeHandle);
+                       TypeGetTypeFromHandle = new PredefinedMember<MethodSpec> (module, btypes.Type, "GetTypeFromHandle", btypes.RuntimeTypeHandle);
                }
        }
 
@@ -487,7 +551,7 @@ namespace Mono.CSharp
                        this.ns = ns;
                }
 
-               public PredefinedType (BuildinTypeSpec type)
+               public PredefinedType (BuiltinTypeSpec type)
                {
                        this.kind = type.Kind;
                        this.name = type.Name;
@@ -534,14 +598,8 @@ namespace Mono.CSharp
                        if (type != null)
                                return true;
 
-                       Namespace type_ns = module.GlobalRootNamespace.GetNamespace (ns, true);
-                       var te = type_ns.LookupType (module, name, arity, true, Location.Null);
-                       if (te == null || te.Type.Kind != kind) {
-                               return false;
-                       }
-
-                       type = te.Type;
-                       return true;
+                       type = Resolve (module, kind, ns, name, arity, false);
+                       return type != null;
                }
 
                public string GetSignatureForError ()
@@ -549,33 +607,87 @@ namespace Mono.CSharp
                        return ns + "." + name;
                }
 
-               public static TypeSpec Resolve (ModuleContainer module, MemberKind kind, string ns, string name, int arity, Location loc)
+               public static TypeSpec Resolve (ModuleContainer module, MemberKind kind, string ns, string name, int arity)
+               {
+                       return Resolve (module, kind, ns, name, arity, true);
+               }
+
+               public static TypeSpec Resolve (ModuleContainer module, MemberKind kind, string ns, string name, int arity, bool reportErrors)
                {
                        Namespace type_ns = module.GlobalRootNamespace.GetNamespace (ns, true);
-                       var te = type_ns.LookupType (module, name, arity, false, Location.Null);
-                       if (te == null) {
-                               module.Compiler.Report.Error (518, loc, "The predefined type `{0}.{1}' is not defined or imported", ns, name);
+                       var found = type_ns.GetAllTypes (name);
+                       if (found == null) {
+                               if (reportErrors)
+                                       module.Compiler.Report.Error (518, "The predefined type `{0}.{1}' is not defined or imported", ns, name);
+
                                return null;
                        }
 
-                       var type = te.Type;
-                       if (type.Kind != kind) {
-                               if (type.Kind == MemberKind.Struct && kind == MemberKind.Void && type.MemberDefinition is TypeContainer) {
-                                       // Void is declared as struct but we keep it internally as
-                                       // special kind, the swap will be done by caller
+                       TypeSpec best_match = null;
+                       foreach (var candidate in found) {
+                               if (candidate.Kind != kind) {
+                                       if (candidate.Kind == MemberKind.Struct && kind == MemberKind.Void && candidate.MemberDefinition is TypeContainer) {
+                                               // Void is declared as struct but we keep it internally as
+                                               // special kind, the swap will be done by caller
+                                       } else {
+                                               continue;
+                                       }
+                               }
+
+                               if (candidate.Arity != arity)
+                                       continue;
+
+                               if ((candidate.Modifiers & Modifiers.INTERNAL) != 0 && !candidate.MemberDefinition.IsInternalAsPublic (module.DeclaringAssembly))
+                                       continue;
+
+                               if (best_match == null) {
+                                       best_match = candidate;
+                                       continue;
+                               }
+
+                               var other_match = best_match;
+                               if (!best_match.MemberDefinition.IsImported &&
+                                       module.Compiler.BuiltinTypes.Object.MemberDefinition.DeclaringAssembly == candidate.MemberDefinition.DeclaringAssembly) {
+                                       best_match = candidate;
+                               }
+
+                               string location;
+                               if (best_match.MemberDefinition is MemberCore) {
+                                       location = ((MemberCore) best_match.MemberDefinition).Location.Name;
                                } else {
-                                       module.Compiler.Report.Error (520, loc, "The predefined type `{0}.{1}' is not declared correctly", ns, name);
-                                       return null;
+                                       var assembly = (ImportedAssemblyDefinition) best_match.MemberDefinition.DeclaringAssembly;
+                                       location = Path.GetFileName (assembly.Location);
                                }
+
+                               module.Compiler.Report.SymbolRelatedToPreviousError (other_match);
+                               module.Compiler.Report.SymbolRelatedToPreviousError (candidate);
+
+                               module.Compiler.Report.Warning (1685, 1,
+                                       "The predefined type `{0}.{1}' is defined multiple times. Using definition from `{2}'",
+                                       ns, name, location);
+
+                               break;
                        }
 
-                       return type;
+                       if (best_match == null && reportErrors) {
+                               Location loc;
+                               if (found[0].MemberDefinition is MemberCore) {
+                                       loc = ((MemberCore) found[0].MemberDefinition).Location;
+                               } else {
+                                       loc = Location.Null;
+                                       module.Compiler.Report.SymbolRelatedToPreviousError (found[0]);
+                               }
+
+                               module.Compiler.Report.Error (520, loc, "The predefined type `{0}.{1}' is not declared correctly", ns, name);
+                       }
+
+                       return best_match;
                }
 
-               public TypeSpec Resolve (Location loc)
+               public TypeSpec Resolve ()
                {
                        if (type == null)
-                               type = Resolve (module, kind, ns, name, arity, loc);
+                               type = Resolve (module, kind, ns, name, arity);
 
                        return type;
                }
@@ -583,40 +695,57 @@ namespace Mono.CSharp
 
        class PredefinedMember<T> where T : MemberSpec
        {
-               readonly CompilerContext ctx;
+               readonly ModuleContainer module;
                T member;
                TypeSpec declaring_type;
                readonly PredefinedType declaring_type_predefined;
-               readonly PredefinedType[] parameters_predefined;
                MemberFilter filter;
+               readonly Func<TypeSpec[]> filter_builder;
 
-               public PredefinedMember (CompilerContext ctx, PredefinedType type, MemberFilter filter)
+               public PredefinedMember (ModuleContainer module, PredefinedType type, MemberFilter filter)
                {
-                       this.ctx = ctx;
+                       this.module = module;
                        this.declaring_type_predefined = type;
                        this.filter = filter;
                }
 
-               public PredefinedMember (CompilerContext ctx, TypeSpec type, MemberFilter filter)
+               public PredefinedMember (ModuleContainer module, TypeSpec type, MemberFilter filter)
                {
-                       this.ctx = ctx;
+                       this.module = module;
                        this.declaring_type = type;
                        this.filter = filter;
                }
 
-               public PredefinedMember (CompilerContext ctx, PredefinedType type, string name, params TypeSpec[] types)
-                       : this (ctx, type, MemberFilter.Method (name, 0, ParametersCompiled.CreateFullyResolved (types), null))
+               public PredefinedMember (ModuleContainer module, PredefinedType type, string name, params TypeSpec[] types)
+                       : this (module, type, MemberFilter.Method (name, 0, ParametersCompiled.CreateFullyResolved (types), null))
                {
                }
 
-               public PredefinedMember (CompilerContext ctx, PredefinedType type, string name, MemberKind kind, params PredefinedType[] types)
-                       : this (ctx, type, new MemberFilter (name, 0, kind, null, null))
+               public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, params PredefinedType[] types)
+                       : this (module, type, new MemberFilter (name, 0, kind, null, null))
+               {
+                       filter_builder = () => {
+                               var ptypes = new TypeSpec[types.Length];
+                               for (int i = 0; i < ptypes.Length; ++i) {
+                                       var p = types[i];
+                                       if (!p.Define ())
+                                               return null;
+
+                                       ptypes[i] = p.TypeSpec;
+                               }
+
+                               return ptypes;
+                       };
+               }
+
+               public PredefinedMember (ModuleContainer module, PredefinedType type, string name, MemberKind kind, Func<TypeSpec[]> typesBuilder)
+                       : this (module, type, new MemberFilter (name, 0, kind, null, null))
                {
-                       parameters_predefined = types;
+                       filter_builder = typesBuilder;
                }
 
-               public PredefinedMember (CompilerContext ctx, BuildinTypeSpec type, string name, params TypeSpec[] types)
-                       : this (ctx, type, MemberFilter.Method (name, 0, ParametersCompiled.CreateFullyResolved (types), null))
+               public PredefinedMember (ModuleContainer module, BuiltinTypeSpec type, string name, params TypeSpec[] types)
+                       : this (module, type, MemberFilter.Method (name, 0, ParametersCompiled.CreateFullyResolved (types), null))
                {
                }
 
@@ -632,27 +761,21 @@ namespace Mono.CSharp
                                declaring_type = declaring_type_predefined.TypeSpec;
                        }
 
-                       if (parameters_predefined != null) {
-                               TypeSpec[] types = new TypeSpec [parameters_predefined.Length];
-                               for (int i = 0; i < types.Length; ++i) {
-                                       var p = parameters_predefined [i];
-                                       if (!p.Define ())
-                                               return null;
-
-                                       types[i] = p.TypeSpec;
-                               }
+                       if (filter_builder != null) {
+                               var types = filter_builder ();
 
                                if (filter.Kind == MemberKind.Field)
                                        filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, null, types [0]);
                                else
-                                       filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, ParametersCompiled.CreateFullyResolved (types), filter.MemberType);
+                                       filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind,
+                                               ParametersCompiled.CreateFullyResolved (types), filter.MemberType);
                        }
 
                        member = MemberCache.FindMember (declaring_type, filter, BindingRestriction.DeclaredOnly) as T;
                        if (member == null)
                                return null;
 
-                       if (!member.IsAccessible (InternalType.FakeInternalType))
+                       if (!member.IsAccessible (module))
                                return null;
 
                        return member;
@@ -667,27 +790,20 @@ namespace Mono.CSharp
                                return member;
 
                        if (declaring_type == null) {
-                               if (declaring_type_predefined.Resolve (loc) == null)
+                               if (declaring_type_predefined.Resolve () == null)
                                        return null;
                        }
 
-                       if (parameters_predefined != null) {
-                               TypeSpec[] types = new TypeSpec[parameters_predefined.Length];
-                               for (int i = 0; i < types.Length; ++i) {
-                                       var p = parameters_predefined[i];
-                                       types[i] = p.Resolve (loc);
-                                       if (types[i] == null)
-                                               return null;
-                               }
-
-                               filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind, ParametersCompiled.CreateFullyResolved (types), filter.MemberType);
+                       if (filter_builder != null) {
+                               filter = new MemberFilter (filter.Name, filter.Arity, filter.Kind,
+                                       ParametersCompiled.CreateFullyResolved (filter_builder ()), filter.MemberType);
                        }
 
                        string method_args = null;
                        if (filter.Parameters != null)
                                method_args = filter.Parameters.GetSignatureForError ();
 
-                       ctx.Report.Error (656, loc, "The compiler required member `{0}.{1}{2}' could not be found or is inaccessible",
+                       module.Compiler.Report.Error (656, loc, "The compiler required member `{0}.{1}{2}' could not be found or is inaccessible",
                                declaring_type.GetSignatureForError (), filter.Name, method_args);
 
                        return null;
@@ -695,27 +811,6 @@ namespace Mono.CSharp
        }
 
        partial class TypeManager {
-       //
-       // A list of core types that the compiler requires or uses
-       //
-       static public BuildinTypeSpec object_type;
-       static public BuildinTypeSpec value_type;
-
-       static public TypeSpec generic_ilist_type;
-       static public TypeSpec generic_icollection_type;
-       static public TypeSpec generic_ienumerator_type;
-       static public TypeSpec generic_ienumerable_type;
-
-       static TypeManager ()
-       {
-               Reset ();
-       }
-
-       static public void Reset ()
-       {
-               generic_ilist_type = generic_icollection_type = generic_ienumerator_type =
-               generic_ienumerable_type = null;
-       }
 
        /// <summary>
        ///   Returns the C# name of a type if possible, or the full type name otherwise
@@ -749,68 +844,7 @@ namespace Mono.CSharp
        {
                return mb.GetSignatureForError ();
        }
-
-       // Obsolete
-       public static bool IsDelegateType (TypeSpec t)
-       {
-               return t.IsDelegate;
-       }
-       
-       // Obsolete
-       public static bool IsEnumType (TypeSpec t)
-       {
-               return t.IsEnum;
-       }
-
-       //
-       // Whether a type is unmanaged.  This is used by the unsafe code (25.2)
-       //
-       public static bool IsUnmanagedType (TypeSpec t)
-       {
-               var ds = t.MemberDefinition as DeclSpace;
-               if (ds != null)
-                       return ds.IsUnmanagedType ();
-
-               if (t.Kind == MemberKind.Void)
-                       return true;
-
-               // Someone did the work of checking if the ElementType of t is unmanaged.  Let's not repeat it.
-               if (t.IsPointer)
-                       return IsUnmanagedType (GetElementType (t));
-
-               if (!IsValueType (t))
-                       return false;
-
-               if (t.IsNested && t.DeclaringType.IsGenericOrParentIsGeneric)
-                       return false;
-
-               return true;
-       }
-
-       //
-       // Null is considered to be a reference type
-       //                      
-       public static bool IsReferenceType (TypeSpec t)
-       {
-               if (t.IsGenericParameter)
-                       return ((TypeParameterSpec) t).IsReferenceType;
-
-               return !t.IsStruct && !IsEnumType (t);
-       }                       
                
-       public static bool IsValueType (TypeSpec t)
-       {
-               if (t.IsGenericParameter)
-                       return ((TypeParameterSpec) t).IsValueType;
-
-               return t.IsStruct || IsEnumType (t);
-       }
-
-       public static bool IsStruct (TypeSpec t)
-       {
-               return t.IsStruct;
-       }
-
        public static bool IsFamilyAccessible (TypeSpec type, TypeSpec parent)
        {
 //             TypeParameter tparam = LookupTypeParameter (type);
@@ -834,22 +868,6 @@ namespace Mono.CSharp
                return false;
        }
 
-       //
-       // Checks whether `type' is a subclass or nested child of `base_type'.
-       //
-       public static bool IsNestedFamilyAccessible (TypeSpec type, TypeSpec base_type)
-       {
-               do {
-                       if (IsFamilyAccessible (type, base_type))
-                               return true;
-
-                       // Handle nested types.
-                       type = type.DeclaringType;
-               } while (type != null);
-
-               return false;
-       }
-
        //
        // Checks whether `type' is a nested child of `parent'.
        //
@@ -891,12 +909,12 @@ namespace Mono.CSharp
        /// </summary>
        public static bool VerifyUnmanaged (ModuleContainer rc, TypeSpec t, Location loc)
        {
-               while (t.IsPointer)
-                       t = GetElementType (t);
-
-               if (IsUnmanagedType (t))
+               if (t.IsUnmanaged)
                        return true;
 
+               while (t.IsPointer)
+                       t = ((ElementTypeSpec) t).Element;
+
                rc.Compiler.Report.SymbolRelatedToPreviousError (t);
                rc.Compiler.Report.Error (208, loc,
                        "Cannot take the address of, get the size of, or declare a pointer to a managed type `{0}'",