aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-21 16:14:36 +0200
committerBad Diode <bd@badd10de.dev>2024-06-21 16:14:36 +0200
commit5a25eeefd13b0e1988ecaf7e497ebde81e71bb2e (patch)
treed309d8a3de4f7f385dc08bb3fd74149be6ad0707 /src/main.c
parent59b9c661cbdf125b0a17f8f955158a1f77f163f8 (diff)
downloadbdl-5a25eeefd13b0e1988ecaf7e497ebde81e71bb2e.tar.gz
bdl-5a25eeefd13b0e1988ecaf7e497ebde81e71bb2e.zip
Add semantic duplication check for enum fields
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/main.c b/src/main.c
index 8e177e1..2bcbf39 100644
--- a/src/main.c
+++ b/src/main.c
@@ -42,7 +42,7 @@ Str sym_kind_str[] = {
42typedef struct Symbol { 42typedef struct Symbol {
43 SymbolKind kind; 43 SymbolKind kind;
44 Str name; 44 Str name;
45 struct Symbol *fields; 45 struct SymbolMap *fields;
46} Symbol; 46} Symbol;
47 47
48MAPDEF(SymbolMap, symmap, Str, Symbol, str_hash, str_eq) 48MAPDEF(SymbolMap, symmap, Str, Symbol, str_hash, str_eq)
@@ -173,10 +173,14 @@ analyzer_symbols(Analyzer *a, Node *node, Scope *scope) {
173 for (sz i = 0; i < array_size(node->struct_field); i++) { 173 for (sz i = 0; i < array_size(node->struct_field); i++) {
174 Node *field = node->struct_field[i]; 174 Node *field = node->struct_field[i];
175 Str field_name = field->field_name->value.str; 175 Str field_name = field->field_name->value.str;
176 field_name = str_concat(cstr("."), field_name, a->storage); 176 if (symmap_lookup(&map->val.fields, field_name) != NULL) {
177 field_name = str_concat(symbol, field_name, a->storage); 177 eprintln(
178 "%s:%d:%d: error: enum field '%s.%s' already exists",
179 a->file_name, field->line, field->col, symbol,
180 field_name);
181 }
178 Symbol s = (Symbol){.kind = SYM_ENUM_FIELD, .name = field_name}; 182 Symbol s = (Symbol){.kind = SYM_ENUM_FIELD, .name = field_name};
179 array_push(map->val.fields, s, a->storage); 183 symmap_insert(&map->val.fields, field_name, s, a->storage);
180 } 184 }
181 } break; 185 } break;
182 case NODE_CASE: { 186 case NODE_CASE: {
@@ -408,10 +412,14 @@ process_file(Str path) {
408 while (sym) { 412 while (sym) {
409 println("%s: SCOPE: %d DEPTH: %d\t%s %s", path, scope->id, 413 println("%s: SCOPE: %d DEPTH: %d\t%s %s", path, scope->id,
410 scope->depth, sym_kind_str[sym->val.kind], sym->val.name); 414 scope->depth, sym_kind_str[sym->val.kind], sym->val.name);
411 for (sz i = 0; i < array_size(sym->val.fields); i++) { 415 SymbolMapIter field_iter =
412 Symbol field = sym->val.fields[i]; 416 symmap_iterator(sym->val.fields, &scratch);
413 println("%s: SCOPE: %d DEPTH: %d\t%s %s", path, scope->id, 417 SymbolMap *field = symmap_next(&field_iter, &scratch);
414 scope->depth, sym_kind_str[field.kind], field.name); 418 while (field) {
419 println("%s: SCOPE: %d DEPTH: %d\t%s %s.%s", path, scope->id,
420 scope->depth, sym_kind_str[field->val.kind],
421 sym->val.name, field->val.name);
422 field = symmap_next(&field_iter, &scratch);
415 } 423 }
416 sym = symmap_next(&iter, &lexer_arena); 424 sym = symmap_next(&iter, &lexer_arena);
417 } 425 }