From 716ff39b4278132998158a6d506a4f63cbad119c Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 26 Jul 2017 13:25:44 +0200 Subject: [PATCH] [mcs] Adds workaround for repl enum declaration on .net SRE --- mcs/mcs/enum.cs | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/mcs/mcs/enum.cs b/mcs/mcs/enum.cs index 3e1c3fc6530..8a288402330 100644 --- a/mcs/mcs/enum.cs +++ b/mcs/mcs/enum.cs @@ -22,10 +22,29 @@ using MetaType = System.Type; using System.Reflection; #endif -namespace Mono.CSharp { +namespace Mono.CSharp +{ public class EnumMember : Const { +#if !STATIC + class MemberTypeDelegator : TypeDelegator + { + Type underlyingType; + + public MemberTypeDelegator (Type delegatingType, Type underlyingType) + : base (delegatingType) + { + this.underlyingType = underlyingType; + } + + public override Type GetEnumUnderlyingType () + { + return underlyingType; + } + } +#endif + class EnumTypeExpr : TypeExpr { public override TypeSpec ResolveAsType (IMemberContext ec, bool allowUnboundTypeArguments) @@ -85,8 +104,17 @@ namespace Mono.CSharp { if (!ResolveMemberType ()) return false; + MetaType ftype = MemberType.GetMetaInfo (); +#if !STATIC + // + // Workaround for .net SRE limitation which cannot define field of unbaked enum type + // which is how all enums are declared + // + ftype = new MemberTypeDelegator (ftype, ((Enum)Parent).UnderlyingType.GetMetaInfo ()); +#endif + const FieldAttributes attr = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal; - FieldBuilder = Parent.TypeBuilder.DefineField (Name, MemberType.GetMetaInfo (), attr); + FieldBuilder = Parent.TypeBuilder.DefineField (Name, ftype, attr); spec = new ConstSpec (Parent.Definition, this, MemberType, FieldBuilder, ModFlags, initializer); Parent.MemberCache.AddMember (spec); -- 2.25.1