public void DeclareEnum(miranaParser.Stat_enumdeclContext context) { string enumName = context.name().GetText(); bool isFlag = context.FLAG() != null; var enumFieldList = context.enumBody()?.enumEntryBody()?.enumEntry() ?? Array.Empty <miranaParser.EnumEntryContext>(); ContextEnumType = new(enumName, isFlag, compileUnit.Compiler.GetNextTypeId()); BigInteger lastEnumEntryValue = 0; void RecordEnumField(miranaParser.EnumEntryContext context) { string fieldName = context.enumField().GetText(); if (context.enumFieldExp() != null) { var enumValue = EvaluateExpression(context.enumFieldExp()); if (!isFlag && !IsSingleExpression(context.enumFieldExp())) { compileUnit.AddError(context, 10, $"bitwise operators can only apply on enum flag"); } ContextEnumType[fieldName] = enumValue; if (!isFlag) { lastEnumEntryValue = enumValue; } } else { if (isFlag) { if (lastEnumEntryValue == 0) { lastEnumEntryValue = 1; } else { lastEnumEntryValue <<= 1; } ContextEnumType[fieldName] = lastEnumEntryValue; } else { ContextEnumType[fieldName] = ++lastEnumEntryValue; } } } enumFieldList.ForEach(RecordEnumField); compileUnit.Compiler.AddType(context, ContextEnumType); }
private partial void WriteStat_EnumDecl(miranaParser.Stat_enumdeclContext context);