Enum members are now ordered

This commit is contained in:
Sasha Koshka 2022-08-24 01:16:44 -04:00
parent a5477717eb
commit 0d366964ca
4 changed files with 31 additions and 27 deletions

View File

@ -11,10 +11,7 @@ func (parser *ParsingOperation) parseEnumSection () (
err = parser.expect(lexer.TokenKindName)
if err != nil { return }
section = &EnumSection {
location: parser.token.Location(),
members: make(map[string] Argument),
}
section = &EnumSection { location: parser.token.Location() }
// get permission
err = parser.nextToken(lexer.TokenKindPermission)
@ -63,26 +60,28 @@ func (parser *ParsingOperation) parseEnumMembers (
// if we've left the block, stop parsing
if !parser.token.Is(lexer.TokenKindIndent) { return }
if parser.token.Value().(int) != 1 { return }
member := EnumMember { }
// get name
err = parser.nextToken(lexer.TokenKindName)
if err != nil { return }
name := parser.token.Value().(string)
member.location = parser.token.Location()
member.name = parser.token.Value().(string)
err = parser.nextToken()
if err != nil { return }
// parse default value
var argument Argument
if parser.token.Is(lexer.TokenKindNewline) {
err = parser.nextToken()
if err != nil { return }
argument, err = parser.parseInitializationValues(1)
into.members[name] = argument
member.value, err = parser.parseInitializationValues(1)
into.members = append(into.members, member)
if err != nil { return }
} else {
argument, err = parser.parseArgument()
into.members[name] = argument
member.value, err = parser.parseArgument()
into.members = append(into.members, member)
if err != nil { return }
err = parser.expect(lexer.TokenKindNewline)

View File

@ -179,17 +179,17 @@ enum ro AffrontToGod:{Int 4}
3
4
enum ro NamedColor:U32
blue 255
green 65280
red 16711680
green 65280
blue 255
enum ro Weekday:Int
friday
monday
saturday
sunday
thursday
monday
tuesday
wednesday
thursday
friday
saturday
`, test)
}

View File

@ -337,22 +337,20 @@ func (section *EnumSection) ToString (indent int) (output string) {
section.name, ":",
section.what.ToString(), "\n")
for _, name := range sortMapKeysAlphabetically(section.members) {
output += doIndent(indent + 1, name)
defaultValue := section.members[name]
for _, member := range section.members {
output += doIndent(indent + 1, member.name)
isComplexInitialization :=
defaultValue.kind == ArgumentKindObjectInitializationValues ||
defaultValue.kind == ArgumentKindArrayInitializationValues
member.value.kind == ArgumentKindObjectInitializationValues ||
member.value.kind == ArgumentKindArrayInitializationValues
if defaultValue.value == nil {
if member.value.value == nil {
output += "\n"
} else if isComplexInitialization {
output += "\n"
output += defaultValue.ToString(indent + 2, true)
output += member.value.ToString(indent + 2, true)
} else {
output += " " + defaultValue.ToString(0, false)
output += " " + member.value.ToString(0, false)
output += "\n"
}
}

View File

@ -191,9 +191,17 @@ type ObjtSection struct {
inherits Type
permission types.Permission
// TODO: order matters here we need to store these in an array
// TODO: add bitfield support (:n)
members map[string] ObjtMember
}
type EnumMember struct {
location file.Location
name string
value Argument
}
// EnumSection represents an enumerated type section.
type EnumSection struct {
location file.Location
@ -201,8 +209,7 @@ type EnumSection struct {
what Type
permission types.Permission
// TODO: order matters here we need to store these in an array
members map[string] Argument
members []EnumMember
}
// FaceBehavior represents a behavior of an interface section.