diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-21 16:14:36 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-21 16:14:36 +0200 |
commit | 5a25eeefd13b0e1988ecaf7e497ebde81e71bb2e (patch) | |
tree | d309d8a3de4f7f385dc08bb3fd74149be6ad0707 /src/main.c | |
parent | 59b9c661cbdf125b0a17f8f955158a1f77f163f8 (diff) | |
download | bdl-5a25eeefd13b0e1988ecaf7e497ebde81e71bb2e.tar.gz bdl-5a25eeefd13b0e1988ecaf7e497ebde81e71bb2e.zip |
Add semantic duplication check for enum fields
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 24 |
1 files changed, 16 insertions, 8 deletions
@@ -42,7 +42,7 @@ Str sym_kind_str[] = { | |||
42 | typedef struct Symbol { | 42 | typedef 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 | ||
48 | MAPDEF(SymbolMap, symmap, Str, Symbol, str_hash, str_eq) | 48 | MAPDEF(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 | } |