Put the merging back.
[mono.git] / mcs / gmcs / rootcontext.cs
index f84af3a269c013f094214b459ac7cf52ebd5fd79..184fd139ca37c9f23518ebfd48d0b5b863307dbf 100755 (executable)
@@ -16,6 +16,12 @@ using System.Diagnostics;
 
 namespace Mono.CSharp {
 
+       public enum LanguageVersion
+       {
+               Default = 0,
+               ISO_1   = 1
+       }
+
        public class RootContext {
 
                //
@@ -46,7 +52,6 @@ namespace Mono.CSharp {
                // override).
                //
                static ArrayList type_container_resolve_order;
-               static ArrayList interface_resolve_order;
                static ArrayList attribute_types;
 
                //
@@ -64,10 +69,7 @@ namespace Mono.CSharp {
 
                public static bool VerifyClsCompliance = true;
 
-               //
-               // If set, enable C# version 2 features
-               //
-               public static bool V2 = true;
+               public static LanguageVersion Version = LanguageVersion.Default;
 
                //
                // We keep strongname related info here because
@@ -83,7 +85,6 @@ namespace Mono.CSharp {
                static RootContext ()
                {
                        tree = new Tree ();
-                       interface_resolve_order = new ArrayList ();
                        type_container_resolve_order = new ArrayList ();
                }
 
@@ -101,11 +102,6 @@ namespace Mono.CSharp {
 
                static public string MainClass;
                
-               public static void RegisterOrder (Interface iface)
-               {
-                       interface_resolve_order.Add (iface);
-               }
-               
                public static void RegisterOrder (TypeContainer tc)
                {
                        type_container_resolve_order.Add (tc);
@@ -310,7 +306,13 @@ namespace Mono.CSharp {
                                "System.Runtime.Serialization.ISerializable",
 
                                "System.Reflection.IReflect",
-                               "System.Reflection.ICustomAttributeProvider"
+                               "System.Reflection.ICustomAttributeProvider",
+
+                               //
+                               // Generic types
+                               //
+                               "System.Collections.Generic.IEnumerator`1",
+                               "System.Collections.Generic.IEnumerable`1"
                        };
 
                        foreach (string iname in interfaces_first_stage)
@@ -340,6 +342,7 @@ namespace Mono.CSharp {
                                "System.Char",    "System.Boolean",
                                "System.Decimal", "System.Void",
                                "System.RuntimeFieldHandle",
+                               "System.RuntimeArgumentHandle",
                                "System.RuntimeTypeHandle",
                                "System.IntPtr",
                                "System.TypedReference",
@@ -376,10 +379,15 @@ namespace Mono.CSharp {
                                "System.ParamArrayAttribute",
                                "System.CLSCompliantAttribute",
                                "System.Security.UnverifiableCodeAttribute",
+                               "System.Security.Permissions.SecurityAttribute",
                                "System.Runtime.CompilerServices.IndexerNameAttribute",
                                "System.Runtime.InteropServices.InAttribute",
+                               "System.Runtime.InteropServices.StructLayoutAttribute",
+                               "System.Runtime.InteropServices.FieldOffsetAttribute",
                                "System.InvalidOperationException",
-                               "System.MarshalByRefObject"
+                               "System.NotSupportedException",
+                               "System.MarshalByRefObject",
+                               "System.Security.CodeAccessPermission"
                        };
 
                        // We must store them here before calling BootstrapCorlib_ResolveDelegate.
@@ -417,9 +425,6 @@ namespace Mono.CSharp {
                                foreach (TypeContainer tc in attribute_types)
                                        tc.CloseType ();
                        
-                       foreach (Interface iface in interface_resolve_order)
-                               iface.CloseType ();
-
                        //
                        // We do this in two passes, first we close the structs,
                        // then the classes, because it seems the code needs it this
@@ -427,13 +432,13 @@ namespace Mono.CSharp {
                        // make sure that we define the structs in order as well.
                        //
                        foreach (TypeContainer tc in type_container_resolve_order){
-                               if (tc is Struct && tc.Parent == tree.Types){
+                               if (tc.Kind == Kind.Struct && tc.Parent == tree.Types){
                                        tc.CloseType ();
                                }
                        }
 
                        foreach (TypeContainer tc in type_container_resolve_order){
-                               if (!(tc is Struct && tc.Parent == tree.Types))
+                               if (!(tc.Kind == Kind.Struct && tc.Parent == tree.Types))
                                        tc.CloseType ();                                        
                        }
                        
@@ -451,10 +456,9 @@ namespace Mono.CSharp {
                        }
                        
                        attribute_types = null;
-                       interface_resolve_order = null;
                        type_container_resolve_order = null;
                        helper_classes = null;
-                       tree = null;
+                       //tree = null;
                        TypeManager.CleanUp ();
                }
 
@@ -491,7 +495,7 @@ namespace Mono.CSharp {
                        // Try in the current namespace and all its implicit parents
                        //
                        for (NamespaceEntry ns = ds.NamespaceEntry; ns != null; ns = ns.ImplicitParent) {
-                               IAlias result = ns.Lookup (ds, name, num_type_args, loc);
+                               IAlias result = ns.Lookup (ds, name, num_type_args, false, loc);
 
                                if (result == null)
                                        continue;
@@ -543,6 +547,7 @@ namespace Mono.CSharp {
                                                //
                                                Type type = TypeManager.LookupType (current_type.FullName + "." + name);
                                                if (type != null){
+                                                       type = ds.ResolveNestedType (type, loc);
                                                        t = new TypeExpression (type, loc);
                                                        ds.Cache [name] = t;
                                                        return t;
@@ -576,20 +581,6 @@ namespace Mono.CSharp {
                        return LookupType (tc, name, true, loc);
                }
 
-               static public bool IsNamespace (string name)
-               {
-                       Namespace ns;
-
-                       if (tree.Namespaces != null){
-                               ns = (Namespace) tree.Namespaces [name];
-
-                               if (ns != null)
-                                       return true;
-                       }
-
-                       return false;
-               }
-
                static void Report1530 (Location loc)
                {
                        Report.Error (1530, loc, "Keyword new not allowed for namespace elements");
@@ -600,7 +591,7 @@ namespace Mono.CSharp {
                        DeclSpace ds = (DeclSpace) root.GetDefinition (name);
 
                        ds.DefineMembers (root);
-                       ds.Define (root);
+                       ds.Define ();
                }
                
                static public void BootCorlib_PopulateCoreTypes ()
@@ -625,15 +616,6 @@ namespace Mono.CSharp {
                        if (attribute_types != null)
                                foreach (TypeContainer tc in attribute_types)
                                        tc.DefineMembers (root);
-                       
-                       if (interface_resolve_order != null){
-                               foreach (Interface iface in interface_resolve_order)
-                                       if ((iface.ModFlags & Modifiers.NEW) == 0)
-                                               iface.DefineMembers (root);
-                                       else
-                                               Report1530 (iface.Location);
-                       }
-
 
                        if (type_container_resolve_order != null){
                                if (RootContext.StdLib){
@@ -700,14 +682,7 @@ namespace Mono.CSharp {
 
                        if (attribute_types != null)
                                foreach (TypeContainer tc in attribute_types)
-                                       tc.Define (root);
-                       
-                       if (interface_resolve_order != null){
-                               foreach (Interface iface in interface_resolve_order)
-                                       if ((iface.ModFlags & Modifiers.NEW) == 0)
-                                               iface.Define (root);
-                       }
-
+                                       tc.Define ();
 
                        if (type_container_resolve_order != null){
                                foreach (TypeContainer tc in type_container_resolve_order) {
@@ -720,7 +695,7 @@ namespace Mono.CSharp {
                                                continue;
 
                                        if ((tc.ModFlags & Modifiers.NEW) == 0)
-                                               tc.Define (root);
+                                               tc.Define ();
                                }
                        }
 
@@ -728,14 +703,14 @@ namespace Mono.CSharp {
                        if (delegates != null){
                                foreach (Delegate d in delegates)
                                        if ((d.ModFlags & Modifiers.NEW) == 0)
-                                               d.Define (root);
+                                               d.Define ();
                        }
 
                        ArrayList enums = root.Enums;
                        if (enums != null){
                                foreach (Enum en in enums)
                                        if ((en.ModFlags & Modifiers.NEW) == 0)
-                                               en.Define (root);
+                                               en.Define ();
                        }
                }
 
@@ -743,32 +718,24 @@ namespace Mono.CSharp {
                {
                        if (attribute_types != null)
                                foreach (TypeContainer tc in attribute_types)
-                                       tc.Emit ();
+                                       tc.EmitType ();
 
-                       CodeGen.Assembly.Emit ();
-                       CodeGen.Module.Emit ();
+                       CodeGen.Assembly.Emit (Tree.Types);
+                       CodeGen.Module.Emit (Tree.Types);
                         
                        if (Tree.Types.Enums != null) {
                                foreach (Enum e in Tree.Types.Enums)
-                                       e.Emit (Tree.Types);
+                                       e.Emit ();
                        }
 
-                        if (interface_resolve_order != null){
-                               foreach (Interface iface in interface_resolve_order)
-                                       iface.Emit (Tree.Types);
-                       }                        
-                       
                        if (type_container_resolve_order != null) {
                                foreach (TypeContainer tc in type_container_resolve_order)
-                                       tc.EmitConstants ();
-                               
-                               foreach (TypeContainer tc in type_container_resolve_order)
-                                       tc.Emit ();
+                                       tc.EmitType ();
                        }
                        
                        if (Tree.Types.Delegates != null) {
                                foreach (Delegate d in Tree.Types.Delegates)
-                                       d.Emit (Tree.Types);
+                                       d.Emit ();
                        }                       
                        //
                        // Run any hooks after all the types have been defined.