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

View File

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

View File

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

View File

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