Increment enum entry values if no value's supplied (#385)

This commit is contained in:
ManDude 2021-04-25 04:51:47 +01:00 committed by GitHub
parent fa122356ec
commit 54ccc9db97
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -126,10 +126,17 @@ EnumType* parse_defenum(const goos::Object& defenum, TypeSystem* ts) {
} }
auto type = ts->lookup_type(base_type); auto type = ts->lookup_type(base_type);
s64 highest = -1;
while (!iter->is_empty_list()) { while (!iter->is_empty_list()) {
auto field = car(iter); auto field = car(iter);
auto entry_name = symbol_string(car(&field)); auto entry_name = symbol_string(car(&field));
if (entries.find(entry_name) != entries.end()) {
throw std::runtime_error(fmt::format("Entry {} appears multiple times.", entry_name));
}
auto rest = cdr(&field); auto rest = cdr(&field);
if (!rest->is_empty_list()) {
auto& value = car(rest); auto& value = car(rest);
if (!value.is_int()) { if (!value.is_int()) {
fmt::print("Expected integer for enum value, got {}\n", value.print()); fmt::print("Expected integer for enum value, got {}\n", value.print());
@ -140,16 +147,21 @@ EnumType* parse_defenum(const goos::Object& defenum, TypeSystem* ts) {
fmt::print("Integer {} does not fit inside a {}\n", entry_val, type->get_name()); fmt::print("Integer {} does not fit inside a {}\n", entry_val, type->get_name());
} }
if (!entries.size()) {
highest = entry_val;
}
highest = std::max(highest, entry_val);
rest = cdr(rest); rest = cdr(rest);
if (!rest->is_empty_list()) { if (!rest->is_empty_list()) {
fmt::print("Got too many items in defenum {} entry {}\n", name, entry_name); fmt::print("Got too many items in defenum {} entry {}\n", name, entry_name);
} }
if (entries.find(entry_name) != entries.end()) { entries[entry_name] = entry_val;
throw std::runtime_error(fmt::format("Entry {} appears multiple times.", entry_name)); } else {
entries[entry_name] = ++highest;
} }
entries[entry_name] = entry_val;
iter = cdr(iter); iter = cdr(iter);
} }