2004-05-29 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / mcs / typemanager.cs
index 2aaf24097d00cd14d546717f684d9f8e8d3d2bca..83184f36821f7112365fdd3d121c2e14882b5d57 100755 (executable)
@@ -81,13 +81,15 @@ public class TypeManager {
        static public Type indexer_name_type;
        static public Type exception_type;
        static public Type invalid_operation_exception_type;
-       static public object obsolete_attribute_type;
+       static public Type obsolete_attribute_type;
        static public object conditional_attribute_type;
        static public Type in_attribute_type;
        static public Type cls_compliant_attribute_type;
        static public Type typed_reference_type;
        static public Type arg_iterator_type;
        static public Type mbr_type;
+       static public Type struct_layout_attribute_type;
+       static public Type field_offset_attribute_type;
 
        //
        // An empty array of types
@@ -231,17 +233,12 @@ public class TypeManager {
        // <remarks>
        static Hashtable method_internal_params;
 
-       // <remarks>
-       //  Keeps track of attribute types
-       // </remarks>
-
-       static Hashtable builder_to_attr;
-
        // <remarks>
        //  Keeps track of methods
        // </remarks>
 
        static Hashtable builder_to_method;
+       static Hashtable builder_to_method_2;
 
        // <remarks>
        //  Contains all public types from referenced assemblies.
@@ -267,13 +264,11 @@ public class TypeManager {
                method_arguments = null;
                indexer_arguments = null;
                method_internal_params = null;
-               builder_to_attr = null;
                builder_to_method = null;
                
                fields = null;
                references = null;
                negative_hits = null;
-               attr_to_allowmult = null;
                builder_to_constant = null;
                fieldbuilders_to_fields = null;
                events = null;
@@ -363,8 +358,8 @@ public class TypeManager {
                typecontainers = new Hashtable ();
                
                builder_to_declspace = new PtrHashtable ();
-               builder_to_attr = new PtrHashtable ();
                builder_to_method = new PtrHashtable ();
+               builder_to_method_2 = new PtrHashtable ();
                method_arguments = new PtrHashtable ();
                method_internal_params = new PtrHashtable ();
                indexer_arguments = new PtrHashtable ();
@@ -462,14 +457,21 @@ public class TypeManager {
                builder_to_declspace.Add (t, i);
        }
 
+
+       [Obsolete("Will be removed very soon")]
        public static void AddMethod (MethodBuilder builder, MethodData method)
        {
                builder_to_method.Add (builder, method);
        }
 
-       public static void RegisterAttrType (Type t, TypeContainer tc)
+       public static void AddMethod2 (MethodBase builder, IMethodData method)
        {
-               builder_to_attr.Add (t, tc);
+               builder_to_method_2.Add (builder, method);
+       }
+
+       public static IMethodData GetMethod (MethodBase builder)
+       {
+               return (IMethodData) builder_to_method_2 [builder];
        }
 
        /// <summary>
@@ -515,10 +517,10 @@ public class TypeManager {
        {
                return builder_to_declspace [t] as Enum;
        }
-       
-       public static TypeContainer LookupAttr (Type t)
+
+       public static Class LookupClass (Type t)
        {
-               return (TypeContainer) builder_to_attr [t];
+               return (Class) builder_to_declspace [t];
        }
        
        /// <summary>
@@ -905,7 +907,7 @@ public class TypeManager {
 
                if (t == null){
                        Report.Error (518, "The predefined type `" + name + "' is not defined or imported");
-                       Environment.Exit (0);
+                       Environment.Exit (1);
                }
 
                return t;
@@ -1069,6 +1071,8 @@ public class TypeManager {
                obsolete_attribute_type = CoreLookupType ("System.ObsoleteAttribute");
                conditional_attribute_type = CoreLookupType ("System.Diagnostics.ConditionalAttribute");
                cls_compliant_attribute_type = CoreLookupType ("System.CLSCompliantAttribute");
+               struct_layout_attribute_type = CoreLookupType ("System.Runtime.InteropServices.StructLayoutAttribute");
+               field_offset_attribute_type = CoreLookupType ("System.Runtime.InteropServices.FieldOffsetAttribute");
 
                //
                // When compiling corlib, store the "real" types here.
@@ -1602,39 +1606,6 @@ public class TypeManager {
                }
        }
 
-       static Hashtable attr_to_allowmult;
-
-       public static void RegisterAttributeAllowMultiple (Type attr_type, bool allow)
-       {
-               if (attr_to_allowmult == null)
-                       attr_to_allowmult = new PtrHashtable ();
-
-               if (attr_to_allowmult.Contains (attr_type))
-                       return;
-
-               attr_to_allowmult.Add (attr_type, allow);
-                              
-       }
-
-       public static bool AreMultipleAllowed (Type attr_type)
-       {
-               if (!(attr_type is TypeBuilder)) {
-                       System.Attribute [] attrs = System.Attribute.GetCustomAttributes (attr_type);
-
-                       foreach (System.Attribute tmp in attrs)
-                               if (tmp is AttributeUsageAttribute) {
-                                        return ((AttributeUsageAttribute) tmp).AllowMultiple;
-                                }
-
-                       return false;
-               }
-               
-               if (attr_to_allowmult == null)
-                       return false;
-
-               return (bool) attr_to_allowmult [attr_type];
-       }
-
        static Hashtable builder_to_constant;
 
        public static void RegisterConstant (FieldBuilder fb, Const c)
@@ -2370,8 +2341,6 @@ public class TypeManager {
 
        [Flags]
        public enum MethodFlags {
-               IsObsolete = 1,
-               IsObsoleteError = 1 << 1,
                ShouldIgnore = 1 << 2
        }
        
@@ -2402,23 +2371,6 @@ public class TypeManager {
                                continue;
                        }
                        System.Attribute a = (System.Attribute) ta;
-                       if (a.TypeId == TypeManager.obsolete_attribute_type){
-                               ObsoleteAttribute oa = (ObsoleteAttribute) a;
-
-                               string method_desc = TypeManager.CSharpSignature (mb);
-
-                               if (oa.IsError) {
-                                       Report.Error (619, loc, "Method `" + method_desc +
-                                                     "' is obsolete: `" + oa.Message + "'");
-                                       return MethodFlags.IsObsoleteError;
-                               } else
-                                       Report.Warning (618, loc, "Method `" + method_desc +
-                                                       "' is obsolete: `" + oa.Message + "'");
-
-                               flags |= MethodFlags.IsObsolete;
-
-                               continue;
-                       }
                        
                        //
                        // Skip over conditional code.