*** merged revision 57555 from mcs
[mono.git] / mcs / gmcs / enum.cs
index 03c758823dd9b39af7dd6e1731446ef2d58ef55b..54570d9d8c3eef41f24c98ce6fde219b1fd23aa9 100644 (file)
@@ -16,11 +16,10 @@ using System.Collections.Specialized;
 using System.Reflection;
 using System.Reflection.Emit;
 using System.Globalization;
-using System.Xml;
 
 namespace Mono.CSharp {
 
-       public class EnumMember: MemberCore, IConstant {
+       public class EnumMember : MemberCore, IConstant {
                static string[] attribute_targets = new string [] { "field" };
 
                public FieldBuilder builder;
@@ -32,14 +31,20 @@ namespace Mono.CSharp {
                Constant value;
                bool in_transit;
 
+               // TODO: remove or simplify
+               EmitContext ec;
+
                public EnumMember (Enum parent_enum, EnumMember prev_member, Expression expr,
                                MemberName name, Attributes attrs):
-                       base (parent_enum.Parent, name, attrs)
+                       base (parent_enum, name, attrs)
                {
                        this.parent_enum = parent_enum;
                        this.ModFlags = parent_enum.ModFlags;
                        this.ValueExpr = expr;
                        this.prev_member = prev_member;
+
+                       ec = new EmitContext (this, parent_enum, parent_enum, Location, null, null, ModFlags, false);
+                       ec.InEnumContext = true;
                }
 
                public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb)
@@ -49,8 +54,8 @@ namespace Mono.CSharp {
                                if (marshal != null) {
                                        builder.SetMarshal (marshal);
                                }
-                                       return;
-                               }
+                               return;
+                       }
 
                        if (a.Type.IsSubclassOf (TypeManager.security_attr_type)) {
                                a.Error_InvalidSecurityParent ();
@@ -79,11 +84,25 @@ namespace Mono.CSharp {
                        const FieldAttributes attr = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
                        TypeBuilder tb = parent_enum.TypeBuilder;
                        builder = tb.DefineField (Name, tb, attr);
+                       ec.ContainerType = tb;
 
                        TypeManager.RegisterConstant (builder, this);
                        return true;
                }
 
+               // Because parent is TypeContainer and we have DeclSpace only
+               public override void CheckObsoleteness (Location loc)
+               {
+                       parent_enum.CheckObsoleteness (loc);
+
+                       ObsoleteAttribute oa = GetObsoleteAttribute ();
+                       if (oa == null) {
+                               return;
+                       }
+
+                       AttributeTester.Report_ObsoleteMessage (oa, GetSignatureForError (), loc);
+               }
+
                public bool ResolveValue ()
                {
                        if (value != null)
@@ -98,8 +117,9 @@ namespace Mono.CSharp {
 
                        if (ValueExpr != null) {
                                in_transit = true;
+                               Constant c = ValueExpr.ResolveAsConstant (ec, this);
+                               in_transit = false;
 
-                               Constant c = ValueExpr.ResolveAsConstant (parent_enum.EmitContext, this);
                                if (c == null)
                                        return false;
 
@@ -143,20 +163,21 @@ namespace Mono.CSharp {
                        return true;
                }
 
-               public void Emit (EmitContext ec)
+               public override void Emit ()
                {
                        if (OptAttributes != null)
-                               OptAttributes.Emit (ec, this); 
+                               OptAttributes.Emit (); 
 
-                       if (ResolveValue ())
-                               builder.SetConstant (value.GetValue ());
+                       if (!ResolveValue ())
+                               return;
 
-                       Emit ();
+                       builder.SetConstant (value.GetValue ());
+                       base.Emit ();
                }
 
                public override string GetSignatureForError()
                {
-                       return String.Concat (parent_enum.GetSignatureForError (), '.', base.GetSignatureForError ());
+                       return String.Concat (parent_enum.GetSignatureForError (), '.', Name);
                }
 
                public override string[] ValidAttributeTargets {
@@ -165,18 +186,6 @@ namespace Mono.CSharp {
                        }
                }
 
-               protected override bool VerifyClsCompliance(DeclSpace ds)
-               {
-                       // Because parent is TypeContainer and we have only DeclSpace parent.
-                       // Parameter replacing is required
-                       return base.VerifyClsCompliance (parent_enum);
-               }
-
-               // There is no base type
-               protected override void VerifyObsoleteAttribute()
-               {
-               }
-
                public override string DocCommentHeader {
                        get { return "F:"; }
                }
@@ -233,19 +242,13 @@ namespace Mono.CSharp {
                        if (TypeBuilder != null)
                                return TypeBuilder;
 
-                       ec = new EmitContext (this, this, Location, null, null, ModFlags, false);
-                       ec.InEnumContext = true;
-
                        if (!(BaseType is TypeLookupExpression)) {
                                Report.Error (1008, Location,
                                        "Type byte, sbyte, short, ushort, int, uint, long or ulong expected");
                                return null;
                        }
 
-                       TypeExpr ute = ResolveBaseTypeExpr (BaseType, false, Location);
-                       if (ute == null)
-                               return null;
-
+                       TypeExpr ute = BaseType.ResolveAsTypeTerminal (this, false);
                        UnderlyingType = ute.Type;
 
                        if (UnderlyingType != TypeManager.int32_type &&
@@ -275,8 +278,6 @@ namespace Mono.CSharp {
                                        Basename, TypeAttr, TypeManager.enum_type);
                        }
 
-                       ec.ContainerType = TypeBuilder;
-
                        //
                        // Call MapToInternalType for corlib
                        //
@@ -284,7 +285,7 @@ namespace Mono.CSharp {
                                                 FieldAttributes.Public | FieldAttributes.SpecialName
                                                 | FieldAttributes.RTSpecialName);
 
-                       TypeManager.AddUserType (Name, this);
+                       TypeManager.AddUserType (this);
 
                        foreach (EnumMember em in defined_names.Values) {
                                if (!em.Define ())
@@ -302,11 +303,11 @@ namespace Mono.CSharp {
                public override void Emit ()
                {
                        if (OptAttributes != null) {
-                               OptAttributes.Emit (ec, this);
+                               OptAttributes.Emit ();
                        }
 
                        foreach (EnumMember em in defined_names.Values) {
-                               em.Emit (ec);
+                               em.Emit ();
                        }
 
                        base.Emit ();
@@ -333,27 +334,30 @@ namespace Mono.CSharp {
                {
                        HybridDictionary dict = new HybridDictionary (defined_names.Count, true);
                        foreach (EnumMember em in defined_names.Values) {
-                               if (!em.IsClsComplianceRequired (this))
+                               if (!em.IsClsComplianceRequired ())
                                        continue;
 
                                try {
                                        dict.Add (em.Name, em);
                                }
                                catch (ArgumentException) {
-                                       Report.SymbolRelatedToPreviousError ((MemberCore)dict [em.Name]);
-                                       Report.Warning (3005, em.Location, "Identifier `{0}' differing only in case is not CLS-compliant", em.GetSignatureForError ());
+                                       Report.SymbolRelatedToPreviousError (em);
+                                       MemberCore col = (MemberCore)dict [em.Name];
+                                       Report.Warning (3005, 1, col.Location, "Identifier `{0}' differing only in case is not CLS-compliant", col.GetSignatureForError ());
                                }
                        }
                }
 
-               protected override bool VerifyClsCompliance (DeclSpace ds)
+               protected override bool VerifyClsCompliance ()
                {
-                       if (!base.VerifyClsCompliance (ds))
+                       if (!base.VerifyClsCompliance ())
                                return false;
 
                        VerifyClsName ();
 
-                       if (!AttributeTester.IsClsCompliant (UnderlyingType)) {
+                       if (UnderlyingType == TypeManager.uint32_type ||
+                               UnderlyingType == TypeManager.uint64_type ||
+                               UnderlyingType == TypeManager.ushort_type) {
                                Report.Error (3009, Location, "`{0}': base type `{1}' is not CLS-compliant", GetSignatureForError (), TypeManager.CSharpName (UnderlyingType));
                        }
 
@@ -381,11 +385,6 @@ namespace Mono.CSharp {
                        }
                }
 
-               protected override void VerifyObsoleteAttribute()
-               {
-                       // UnderlyingType is never obsolete
-               }
-
                //
                // Generates xml doc comments (if any), and if required,
                // handle warning report.