Exemplo n.º 1
0
        protected override Constant DoResolveValue(EmitContext ec)
        {
            if (ValueExpr != null)
            {
                Constant c = ValueExpr.ResolveAsConstant(ec, this);
                if (c == null)
                {
                    return(null);
                }

                if (c is EnumConstant)
                {
                    c = ((EnumConstant)c).Child;
                }

                c = c.ImplicitConversionRequired(ec, ParentEnum.UnderlyingType, Location);
                if (c == null)
                {
                    return(null);
                }

                if (!IsValidEnumType(c.Type))
                {
                    Enum.Error_1008(Location);
                    return(null);
                }

                return(new EnumConstant(c, MemberType));
            }

            if (prev_member == null)
            {
                return(new EnumConstant(
                           New.Constantify(ParentEnum.UnderlyingType), MemberType));
            }

            if (!prev_member.ResolveValue())
            {
                return(null);
            }

            try {
                return((EnumConstant)prev_member.value.Increment());
            } catch (OverflowException) {
                Report.Error(543, Location, "The enumerator value `{0}' is too " +
                             "large to fit in its type `{1}'", GetSignatureForError(),
                             TypeManager.CSharpName(ParentEnum.UnderlyingType));
                return(null);
            }
        }