2008-06-11 Marek Safar <marek.safar@gmail.com>
[mono.git] / mcs / mcs / enum.cs
index d3454c336cda9c2d88a2a69e3775b513c0ec072f..8bc58c0c54e8d8caf43e5cc583328704cb9acb6c 100644 (file)
@@ -5,9 +5,10 @@
 //         Ravi Pratap     (ravi@ximian.com)
 //         Marek Safar     (marek.safar@seznam.cz)
 //
-// Licensed under the terms of the GNU GPL
+// Dual licensed under the terms of the MIT X11 or GNU GPL
 //
-// (C) 2001 Ximian, Inc (http://www.ximian.com)
+// Copyright 2001 Ximian, Inc (http://www.ximian.com)
+// Copyright 2003-2003 Novell, Inc (http://www.novell.com)
 //
 
 using System;
@@ -53,14 +54,6 @@ namespace Mono.CSharp {
                        {
                                return DoResolveAsTypeStep (ec);
                        }
-
-                       public override string Name {
-                               get { return Enum.Name; }
-                       }
-
-                       public override string FullName {
-                               get { return Enum.Name; }
-                       }
                }
 
                static bool IsValidEnumType (Type t)
@@ -72,7 +65,16 @@ namespace Mono.CSharp {
                }
 
                public object Value {
-                       get { return value.GetValue (); }
+                       get { return ResolveValue () ? value.GetValue () : null; }
+               }
+
+               public override bool Define ()
+               {
+                       const FieldAttributes attr = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
+                       FieldBuilder = Parent.TypeBuilder.DefineField (Name, MemberType, attr);
+                       Parent.MemberCache.AddMember (FieldBuilder, this);
+                       TypeManager.RegisterConstant (FieldBuilder, this);
+                       return true;
                }
        
                protected override Constant DoResolveValue (EmitContext ec)
@@ -97,16 +99,12 @@ namespace Mono.CSharp {
                                return new EnumConstant (c, MemberType);
                        }
 
-                       if (prev_member == null) {
+                       if (prev_member == null)
                                return new EnumConstant (
                                        New.Constantify (ParentEnum.UnderlyingType), MemberType);
-                       }
 
-                       if (!prev_member.ResolveValue ()) {
-                               prev_member.value = new EnumConstant (
-                                       New.Constantify (ParentEnum.UnderlyingType), MemberType);
+                       if (!prev_member.ResolveValue ())
                                return null;
-                       }
 
                        try {
                                return (EnumConstant) prev_member.value.Increment ();
@@ -124,7 +122,9 @@ namespace Mono.CSharp {
        /// </summary>
        public class Enum : TypeContainer
        {
-               Expression base_type;
+               public static readonly string UnderlyingValueField = "value__";
+
+               FullNamedExpression base_type;
 
                public Type UnderlyingType;
 
@@ -135,7 +135,7 @@ namespace Mono.CSharp {
                        Modifiers.INTERNAL |
                        Modifiers.PRIVATE;
 
-               public Enum (NamespaceEntry ns, DeclSpace parent, Expression type,
+               public Enum (NamespaceEntry ns, DeclSpace parent, FullNamedExpression type,
                             int mod_flags, MemberName name, Attributes attrs)
                        : base (ns, parent, name, attrs, Kind.Enum)
                {
@@ -146,9 +146,9 @@ namespace Mono.CSharp {
 
                public void AddEnumMember (EnumMember em)
                {
-                       if (em.Name == "value__") {
-                               Report.Error (76, em.Location, "An item in an enumeration cannot " +
-                                             "have an identifier `value__'");
+                       if (em.Name == UnderlyingValueField) {
+                               Report.Error (76, em.Location, "An item in an enumeration cannot have an identifier `{0}'",
+                                       UnderlyingValueField);
                                return;
                        }
 
@@ -189,20 +189,27 @@ namespace Mono.CSharp {
                        //
                        // Call MapToInternalType for corlib
                        //
-                       TypeBuilder.DefineField ("value__", UnderlyingType,
+                       TypeBuilder.DefineField (UnderlyingValueField, UnderlyingType,
                                                 FieldAttributes.Public | FieldAttributes.SpecialName
                                                 | FieldAttributes.RTSpecialName);
 
                        return true;
                }
 
+               protected override bool DoDefineMembers ()
+               {
+                       member_cache = new MemberCache (TypeManager.enum_type, this);
+                       DefineContainerMembers (constants);
+                       return true;
+               }
+
                //
                // Used for error reporting only
                //
                public EnumMember GetDefinition (object value)
                {
                        foreach (EnumMember e in defined_names.Values) {
-                               if (e.Value.Equals (value))
+                               if (value.Equals (e.Value))
                                        return e;
                        }