2005-05-31 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / mcs / enum.cs
old mode 100755 (executable)
new mode 100644 (file)
index be8cd2e..f2ed451
@@ -33,7 +33,7 @@ namespace Mono.CSharp {
                        this.Type = expr;
                }
 
-               public override void ApplyAttributeBuilder(Attribute a, CustomAttributeBuilder cb)
+               public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb)
                {
                        if (a.Type == TypeManager.marshal_as_attr_type) {
                                UnmanagedMarshal marshal = a.GetMarshal (this);
@@ -165,7 +165,7 @@ namespace Mono.CSharp {
 
                        EnumMember em = new EnumMember (this, expr, name, loc, opt_attrs);
                        em.DocComment = documentation;
-                       if (!AddToContainer (em, false, name, ""))
+                       if (!AddToContainer (em, name))
                                return;
 
 
@@ -173,49 +173,14 @@ namespace Mono.CSharp {
                        ordered_enums.Add (name);
                        member_to_location.Add (name, loc);
                }
-
-               //
-               // This is used by corlib compilation: we map from our
-               // type to a type that is consumable by the DefineField
-               //
-               Type MapToInternalType (Type t)
-               {
-                       if (t == TypeManager.int32_type)
-                               return typeof (int);
-                       if (t == TypeManager.int64_type)
-                               return typeof (long);
-                       if (t == TypeManager.uint32_type)
-                               return typeof (uint);
-                       if (t == TypeManager.uint64_type)
-                               return typeof (ulong);
-                       if (t == TypeManager.float_type)
-                               return typeof (float);
-                       if (t == TypeManager.double_type)
-                               return typeof (double);
-                       if (t == TypeManager.byte_type)
-                               return typeof (byte);
-                       if (t == TypeManager.sbyte_type)
-                               return typeof (sbyte);
-                       if (t == TypeManager.char_type)
-                               return typeof (char);
-                       if (t == TypeManager.short_type)
-                               return typeof (short);
-                       if (t == TypeManager.ushort_type)
-                               return typeof (ushort);
-
-                       throw new Exception ();
-               }
                
                public override TypeBuilder DefineType ()
                {
                        if (TypeBuilder != null)
                                return TypeBuilder;
 
-                       TypeAttributes attr = Modifiers.TypeAttr (ModFlags, IsTopLevel);
-
                        ec = new EmitContext (this, this, Location, null, null, ModFlags, false);
-
-                       attr |= TypeAttributes.Class | TypeAttributes.Sealed;
+                       ec.InEnumContext = true;
 
                        if (!(BaseType is TypeLookupExpression)) {
                                Report.Error (1008, Location,
@@ -224,7 +189,8 @@ namespace Mono.CSharp {
                                return null;
                        }
 
-                       UnderlyingType = ResolveType (BaseType, false, Location);
+                       TypeExpr ute = ResolveBaseTypeExpr (BaseType, false, Location);
+                       UnderlyingType = ute.Type;
 
                        if (UnderlyingType != TypeManager.int32_type &&
                            UnderlyingType != TypeManager.uint32_type &&
@@ -247,14 +213,16 @@ namespace Mono.CSharp {
                                
                                ModuleBuilder builder = CodeGen.Module.Builder;
 
-                               TypeBuilder = builder.DefineType (Name, attr, TypeManager.enum_type);
+                               TypeBuilder = builder.DefineType (Name, TypeAttr, TypeManager.enum_type);
                        } else {
                                TypeBuilder builder = Parent.TypeBuilder;
 
                                TypeBuilder = builder.DefineNestedType (
-                                       Basename, attr, TypeManager.enum_type);
+                                       Basename, TypeAttr, TypeManager.enum_type);
                        }
 
+                       ec.ContainerType = TypeBuilder;
+
                        //
                        // Call MapToInternalType for corlib
                        //
@@ -480,19 +448,14 @@ namespace Mono.CSharp {
                        return false;
                }
 
-               //
-               // Horrible, horrible.  But there is no other way we can pass the EmitContext
-               // to the recursive definition triggered by the evaluation of a forward
-               // expression
-               //
-               static EmitContext current_ec = null;
-               
                /// <summary>
                ///  This is used to lookup the value of an enum member. If the member is undefined,
                ///  it attempts to define it and return its value
                /// </summary>
-               public object LookupEnumValue (EmitContext ec, string name, Location loc)
+               public object LookupEnumValue (string name, Location loc)
                {
+                       if (ec == null)
+                               Report.Error (-1, loc, "Enum.LookupEnumValue () called too soon");
                        
                        object default_value = null;
                        Constant c = null;
@@ -533,14 +496,7 @@ namespace Mono.CSharp {
                                                Location m_loc = (Mono.CSharp.Location)
                                                        member_to_location [n];
                                                in_transit.Add (name, true);
-
-                                               EmitContext old_ec = current_ec;
-                                               current_ec = ec;
-                       
-                                               default_value = LookupEnumValue (ec, n, m_loc);
-
-                                               current_ec = old_ec;
-                                               
+                                               default_value = LookupEnumValue (n, m_loc);
                                                in_transit.Remove (name);
                                                if (default_value == null)
                                                        return null;
@@ -550,17 +506,9 @@ namespace Mono.CSharp {
                                }
                                
                        } else {
-                               bool old = ec.InEnumContext;
-                               ec.InEnumContext = true;
                                in_transit.Add (name, true);
-
-                               EmitContext old_ec = current_ec;
-                               current_ec = ec;
-                               val = val.Resolve (ec);
-                               current_ec = old_ec;
-                               
+                               val = val.Resolve (EmitContext);
                                in_transit.Remove (name);
-                               ec.InEnumContext = old;
 
                                if (val == null)
                                        return null;
@@ -625,7 +573,8 @@ namespace Mono.CSharp {
                        if (TypeBuilder == null)
                                return false;
 
-                       ec = new EmitContext (this, this, Location, null, UnderlyingType, ModFlags, false);
+                       if (ec == null)
+                               throw new InternalErrorException ("Enum.Define () called too soon");
                        
                        object default_value = 0;
                        
@@ -640,7 +589,7 @@ namespace Mono.CSharp {
                                Location loc = (Mono.CSharp.Location) member_to_location [name];
 
                                if (this [name] != null) {
-                                       default_value = LookupEnumValue (ec, name, loc);
+                                       default_value = LookupEnumValue (name, loc);
 
                                        if (default_value == null)
                                                return true;
@@ -726,14 +675,6 @@ namespace Mono.CSharp {
                        return true;
                }
                
-               /// <summary>
-               /// Returns full enum name.
-               /// </summary>
-               string GetEnumeratorName (string valueName)
-               {
-                       return String.Concat (Name, ".", valueName);
-               }
-
                //
                // IMemberFinder
                //
@@ -743,10 +684,8 @@ namespace Mono.CSharp {
                        ArrayList members = new ArrayList ();
 
                        if ((mt & MemberTypes.Field) != 0) {
-                               if (criteria is string){
-                                       if (member_to_value [criteria] == null && current_ec != null){
-                                               LookupEnumValue (current_ec, (string) criteria, Location.Null);
-                                       }
+                               if (criteria is string && member_to_value [criteria] == null) {
+                                       LookupEnumValue ((string) criteria, Location.Null);
                                }
                                
                                foreach (FieldBuilder fb in field_builders)
@@ -782,6 +721,15 @@ namespace Mono.CSharp {
                        }
                }
 
+               protected override TypeAttributes TypeAttr {
+                       get {
+                               return Modifiers.TypeAttr (ModFlags, IsTopLevel) |
+                               TypeAttributes.Class | TypeAttributes.Sealed |
+                               base.TypeAttr;
+                       }
+               }
+
+
                protected override void VerifyObsoleteAttribute()
                {
                        // UnderlyingType is never obsolete