* Makefile (centum_tests): Add Mono.Security and
[mono.git] / mcs / gmcs / rootcontext.cs
index 4fbc27ec19df55f6539cba1e14189fc6338badd1..10b5bc81e5100d7fdec3d9220915e369e01dc993 100644 (file)
@@ -42,7 +42,7 @@ namespace Mono.CSharp {
                // This is only used to tell whether `System.Object' should
                // have a base class or not.
                //
-               public static bool StdLib = true;
+               public static bool StdLib;
 
                //
                // This keeps track of the order in which classes were defined
@@ -54,7 +54,6 @@ namespace Mono.CSharp {
                // override).
                //
                static ArrayList type_container_resolve_order;
-               static ArrayList attribute_types;
 
                //
                // Holds a reference to the Private Implementation Details
@@ -64,14 +63,19 @@ namespace Mono.CSharp {
                
                static TypeBuilder impl_details_class;
 
-               public static int WarningLevel = 3;
+               public static int WarningLevel;
 
-               public static Target Target = Target.Exe;
+               public static Target Target;
                public static string TargetExt = ".exe";
 
                public static bool VerifyClsCompliance = true;
 
-               public static LanguageVersion Version = LanguageVersion.Default;
+               /// <summary>
+               /// Holds /optimize option
+               /// </summary>
+               public static bool Optimize = true;
+
+               public static LanguageVersion Version;
 
                //
                // We keep strongname related info here because
@@ -79,20 +83,40 @@ namespace Mono.CSharp {
                //
                public static string StrongNameKeyFile;
                public static string StrongNameKeyContainer;
-               public static bool StrongNameDelaySign = false;
+               public static bool StrongNameDelaySign;
 
                //
                // If set, enable XML documentation generation
                //
                public static Documentation Documentation;
 
+               static public string MainClass;
+
                //
                // Constructor
                //
                static RootContext ()
+               {
+                       Reset ();
+               }
+
+               public static void Reset ()
                {
                        tree = new Tree ();
                        type_container_resolve_order = new ArrayList ();
+                       EntryPoint = null;
+                       WarningLevel = 3;
+                       Checked = false;
+                       Unsafe = false;
+                       StdLib = true;
+                       StrongNameKeyFile = null;
+                       StrongNameKeyContainer = null;
+                       StrongNameDelaySign = false;
+                       MainClass = null;
+                       Target = Target.Exe;
+                       Version = LanguageVersion.Default;
+                       Documentation = null;
+                       impl_details_class = null;
                }
 
                public static bool NeedsEntryPoint {
@@ -107,38 +131,21 @@ namespace Mono.CSharp {
                        }
                }
 
-               static public string MainClass;
-               
                public static void RegisterOrder (TypeContainer tc)
                {
                        type_container_resolve_order.Add (tc);
                }
-
-               public static void RegisterAttribute (TypeContainer tc)
-               {
-                       if (attribute_types == null)
-                               attribute_types = new ArrayList ();
-                       
-                       attribute_types.Add (tc);
-               }
                
                // 
                // The default compiler checked state
                //
-               static public bool Checked = false;
+               static public bool Checked;
 
                //
                // Whether to allow Unsafe code
                //
-               static public bool Unsafe = false;
+               static public bool Unsafe;
                
-               static string MakeFQN (string nsn, string name)
-               {
-                       if (nsn == "")
-                               return name;
-                       return String.Concat (nsn, ".", name);
-               }
-
                // <remarks>
                //   This function is used to resolve the hierarchy tree.
                //   It processes interfaces, structs and classes in that order.
@@ -148,13 +155,6 @@ namespace Mono.CSharp {
                // </remarks>
                static public void ResolveTree ()
                {
-                       //
-                       // Process the attribute types separately and before anything else
-                       //
-                       if (attribute_types != null)
-                               foreach (TypeContainer tc in attribute_types)
-                                       tc.DefineType ();
-                       
                        //
                        // Interfaces are processed next, as classes and
                        // structs might inherit from an object or implement
@@ -165,7 +165,7 @@ namespace Mono.CSharp {
 
                        ArrayList ifaces = root.Interfaces;
                        if (ifaces != null){
-                               foreach (Interface i in ifaces) 
+                               foreach (TypeContainer i in ifaces) 
                                        i.DefineType ();
                        }
 
@@ -276,7 +276,7 @@ namespace Mono.CSharp {
                        object o = root.GetDefinition (name);
                        if (o == null){
                                Report.Error (518, "The predefined type `" + name + "' is not defined");
-                               Environment.Exit (1);
+                               return;
                        }
 
                        if (!(o is Delegate)){
@@ -298,6 +298,7 @@ namespace Mono.CSharp {
                        TypeManager.object_type = BootstrapCorlib_ResolveClass (root, "System.Object");
                        TypeManager.value_type = BootstrapCorlib_ResolveClass (root, "System.ValueType");
                        TypeManager.attribute_type = BootstrapCorlib_ResolveClass (root, "System.Attribute");
+                       TypeManager.indexer_name_type = BootstrapCorlib_ResolveClass (root, "System.Runtime.CompilerServices.IndexerNameAttribute");
                        
                        string [] interfaces_first_stage = {
                                "System.IComparable", "System.ICloneable",
@@ -385,22 +386,25 @@ namespace Mono.CSharp {
                                "System.Runtime.CompilerServices.MethodImplAttribute",
                                "System.Runtime.InteropServices.MarshalAsAttribute",
                                "System.Runtime.CompilerServices.NewConstraintAttribute",
+                               "System.Runtime.CompilerServices.CompilerGeneratedAttribute",
+                               "System.Runtime.CompilerServices.FixedBufferAttribute",
                                "System.Diagnostics.ConditionalAttribute",
                                "System.ObsoleteAttribute",
                                "System.ParamArrayAttribute",
                                "System.CLSCompliantAttribute",
                                "System.Security.UnverifiableCodeAttribute",
                                "System.Security.Permissions.SecurityAttribute",
-                               "System.Runtime.CompilerServices.IndexerNameAttribute",
                                "System.Runtime.CompilerServices.DecimalConstantAttribute",
                                "System.Runtime.InteropServices.InAttribute",
                                "System.Runtime.InteropServices.OutAttribute",
                                "System.Runtime.InteropServices.StructLayoutAttribute",
                                "System.Runtime.InteropServices.FieldOffsetAttribute",
+                               "System.Runtime.InteropServices.DefaultCharSetAttribute",
                                "System.InvalidOperationException",
                                "System.NotSupportedException",
                                "System.MarshalByRefObject",
-                               "System.Security.CodeAccessPermission"
+                               "System.Security.CodeAccessPermission",
+                               "System.Runtime.CompilerServices.RequiredAttributeAttribute"
                        };
 
                        foreach (string cname in classes_second_stage)
@@ -435,10 +439,6 @@ namespace Mono.CSharp {
                                foreach (Enum en in root.Enums)
                                        en.CloseType ();
 
-                       if (attribute_types != null)
-                               foreach (TypeContainer tc in attribute_types)
-                                       tc.CloseType ();
-                       
                        //
                        // We do this in two passes, first we close the structs,
                        // then the classes, because it seems the code needs it this
@@ -465,11 +465,12 @@ namespace Mono.CSharp {
                        // If we have a <PrivateImplementationDetails> class, close it
                        //
                        if (helper_classes != null){
-                               foreach (TypeBuilder type_builder in helper_classes)
+                               foreach (TypeBuilder type_builder in helper_classes) {
+                                       type_builder.SetCustomAttribute (TypeManager.compiler_generated_attr);
                                        type_builder.CreateType ();
+                               }
                        }
                        
-                       attribute_types = null;
                        type_container_resolve_order = null;
                        helper_classes = null;
                        //tree = null;
@@ -480,10 +481,11 @@ namespace Mono.CSharp {
                ///   Used to register classes that need to be closed after all the
                ///   user defined classes
                /// </summary>
-               public static void RegisterHelperClass (TypeBuilder helper_class)
+               public static void RegisterCompilerGeneratedType (TypeBuilder helper_class)
                {
                        if (helper_classes == null)
                                helper_classes = new ArrayList ();
+
                        helper_classes.Add (helper_class);
                }
                
@@ -507,6 +509,7 @@ namespace Mono.CSharp {
                        PopulateCoreType (root, "System.Object");
                        PopulateCoreType (root, "System.ValueType");
                        PopulateCoreType (root, "System.Attribute");
+                       PopulateCoreType (root, "System.Runtime.CompilerServices.IndexerNameAttribute");
                }
                
                // <summary>
@@ -519,10 +522,6 @@ namespace Mono.CSharp {
                {
                        TypeContainer root = Tree.Types;
 
-                       if (attribute_types != null)
-                               foreach (TypeContainer tc in attribute_types)
-                                       tc.DefineMembers (root);
-
                        if (type_container_resolve_order != null){
                                if (RootContext.StdLib){
                                        foreach (TypeContainer tc in type_container_resolve_order)
@@ -532,8 +531,9 @@ namespace Mono.CSharp {
                                                // When compiling corlib, these types have already been
                                                // populated from BootCorlib_PopulateCoreTypes ().
                                                if (((tc.Name == "System.Object") ||
-                                                    (tc.Name == "System.Attribute") ||
-                                                    (tc.Name == "System.ValueType")))
+                                                       (tc.Name == "System.Attribute") ||
+                                                       (tc.Name == "System.ValueType") ||
+                                                       (tc.Name == "System.Runtime.CompilerServices.IndexerNameAttribute")))
                                                continue;
 
                                                tc.DefineMembers (root);
@@ -586,10 +586,6 @@ namespace Mono.CSharp {
                {
                        TypeContainer root = Tree.Types;
 
-                       if (attribute_types != null)
-                               foreach (TypeContainer tc in attribute_types)
-                                       tc.Define ();
-
                        if (type_container_resolve_order != null){
                                foreach (TypeContainer tc in type_container_resolve_order) {
                                        // When compiling corlib, these types have already been
@@ -597,7 +593,8 @@ namespace Mono.CSharp {
                                        if (!RootContext.StdLib &&
                                            ((tc.Name == "System.Object") ||
                                             (tc.Name == "System.Attribute") ||
-                                            (tc.Name == "System.ValueType")))
+                                            (tc.Name == "System.ValueType") ||
+                                            (tc.Name == "System.Runtime.CompilerServices.IndexerNameAttribute")))
                                                continue;
 
                                        if ((tc.ModFlags & Modifiers.NEW) == 0)
@@ -622,13 +619,6 @@ namespace Mono.CSharp {
 
                static public void EmitCode ()
                {
-                       if (attribute_types != null)
-                               foreach (TypeContainer tc in attribute_types)
-                                       tc.EmitType ();
-
-                       CodeGen.Assembly.Emit (Tree.Types);
-                       CodeGen.Module.Emit (Tree.Types);
-                        
                        if (Tree.Types.Enums != null) {
                                foreach (Enum e in Tree.Types.Enums)
                                        e.Emit ();
@@ -637,6 +627,9 @@ namespace Mono.CSharp {
                        if (type_container_resolve_order != null) {
                                foreach (TypeContainer tc in type_container_resolve_order)
                                        tc.EmitType ();
+
+                               foreach (TypeContainer tc in type_container_resolve_order)
+                                       tc.VerifyMembers ();
                        }
                        
                        if (Tree.Types.Delegates != null) {
@@ -650,6 +643,9 @@ namespace Mono.CSharp {
 
                        if (EmitCodeHook != null)
                                EmitCodeHook ();
+
+                       CodeGen.Assembly.Emit (Tree.Types);
+                       CodeGen.Module.Emit (Tree.Types);
                }
                
                //
@@ -692,7 +688,7 @@ namespace Mono.CSharp {
                                         TypeAttributes.NotPublic,
                                         TypeManager.object_type);
                                 
-                               RegisterHelperClass (impl_details_class);
+                               RegisterCompilerGeneratedType (impl_details_class);
                        }
 
                        fb = impl_details_class.DefineInitializedData (