// 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;
{
return DoResolveAsTypeStep (ec);
}
-
- public override string Name {
- get { return Enum.Name; }
- }
-
- public override string FullName {
- get { return Enum.Name; }
- }
}
static bool IsValidEnumType (Type t)
}
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)
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 ();
/// </summary>
public class Enum : TypeContainer
{
- Expression base_type;
+ public static readonly string UnderlyingValueField = "value__";
+
+ FullNamedExpression base_type;
public Type UnderlyingType;
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)
{
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;
}
//
// 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;
}