diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-25 12:01:47 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-25 12:01:47 +0200 |
commit | 1980bc35c8d161089d3f996abcce80bc67056736 (patch) | |
tree | 07686fbe2d00aafe34b66ed4dcb858e7dc129548 /src/main.c | |
parent | f39149eaac8a7e6400aca1edea4bf47e3941a3fc (diff) | |
download | bdl-1980bc35c8d161089d3f996abcce80bc67056736.tar.gz bdl-1980bc35c8d161089d3f996abcce80bc67056736.zip |
Add compound types for anonymous struct fields
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 62 |
1 files changed, 32 insertions, 30 deletions
@@ -534,33 +534,35 @@ type_inference(Analyzer *a, Node *node, TypeScope *scope) { | |||
534 | // TODO: make sure it didn't exist before. | 534 | // TODO: make sure it didn't exist before. |
535 | StructMap *e = structmap_insert( | 535 | StructMap *e = structmap_insert( |
536 | &scope->structs, symbol, (Struct){.name = symbol}, a->storage); | 536 | &scope->structs, symbol, (Struct){.name = symbol}, a->storage); |
537 | for (sz i = 0; i < array_size(node->struct_field); i++) { | 537 | // for (sz i = 0; i < array_size(node->struct_field); i++) { |
538 | Node *field = node->struct_field[i]; | 538 | // Node *field = node->struct_field[i]; |
539 | Str field_name = field->field_name->value.str; | 539 | // // TODO: handle compound types |
540 | Str field_type = field->field_type->value.str; | 540 | // Str field_name = field->value.str; |
541 | if (fieldmap_lookup(&e->val.fields, field_name)) { | 541 | // Str field_type = field->field_type->value.str; |
542 | eprintln( | 542 | // if (fieldmap_lookup(&e->val.fields, field_name)) { |
543 | "%s:%d:%d: error: struct field '%s.%s' already exists", | 543 | // eprintln( |
544 | a->file_name, field->line, field->col, symbol, | 544 | // "%s:%d:%d: error: struct field '%s.%s' already exists", |
545 | field_name); | 545 | // a->file_name, field->line, field->col, symbol, |
546 | } | 546 | // field_name); |
547 | if (field->field_val) { | 547 | // } |
548 | Type type = type_inference(a, field->field_val, scope); | 548 | // if (field->field_val) { |
549 | if (!str_eq(type, field_type)) { | 549 | // Type type = type_inference(a, field->field_val, scope); |
550 | eprintln( | 550 | // if (!str_eq(type, field_type)) { |
551 | "%s:%d:%d: error: mismatched types in struct value " | 551 | // eprintln( |
552 | "for '%s.%s' ", | 552 | // "%s:%d:%d: error: mismatched types in struct " |
553 | a->file_name, field->line, field->col, symbol, | 553 | // "value " |
554 | field_name); | 554 | // "for '%s.%s': %s expected %s", |
555 | } | 555 | // a->file_name, field->line, field->col, symbol, |
556 | } | 556 | // field_name, type, field_type); |
557 | fieldmap_insert(&e->val.fields, field_name, | 557 | // } |
558 | (Field){.name = field_name, | 558 | // } |
559 | .type = field_type, | 559 | // fieldmap_insert(&e->val.fields, field_name, |
560 | .val = field->field_val}, | 560 | // (Field){.name = field_name, |
561 | a->storage); | 561 | // .type = field_type, |
562 | field->type = field_type; | 562 | // .val = field->field_val}, |
563 | } | 563 | // a->storage); |
564 | // field->type = field_type; | ||
565 | // } | ||
564 | typemap_insert(&scope->types, symbol, symbol, a->storage); | 566 | typemap_insert(&scope->types, symbol, symbol, a->storage); |
565 | return node->type; | 567 | return node->type; |
566 | } break; | 568 | } break; |
@@ -572,7 +574,7 @@ type_inference(Analyzer *a, Node *node, TypeScope *scope) { | |||
572 | (Enum){.name = symbol}, a->storage); | 574 | (Enum){.name = symbol}, a->storage); |
573 | for (sz i = 0; i < array_size(node->struct_field); i++) { | 575 | for (sz i = 0; i < array_size(node->struct_field); i++) { |
574 | Node *field = node->struct_field[i]; | 576 | Node *field = node->struct_field[i]; |
575 | Str field_name = field->field_name->value.str; | 577 | Str field_name = field->value.str; |
576 | if (fieldmap_lookup(&e->val.fields, field_name)) { | 578 | if (fieldmap_lookup(&e->val.fields, field_name)) { |
577 | eprintln( | 579 | eprintln( |
578 | "%s:%d:%d: error: enum field '%s.%s' already exists", | 580 | "%s:%d:%d: error: enum field '%s.%s' already exists", |
@@ -865,7 +867,7 @@ type_inference(Analyzer *a, Node *node, TypeScope *scope) { | |||
865 | } | 867 | } |
866 | for (sz i = 0; i < array_size(node->elements); i++) { | 868 | for (sz i = 0; i < array_size(node->elements); i++) { |
867 | Node *next = node->elements[i]; | 869 | Node *next = node->elements[i]; |
868 | Str field_name = next->field_name->value.str; | 870 | Str field_name = next->value.str; |
869 | FieldMap *field = fieldmap_lookup(&s->val.fields, field_name); | 871 | FieldMap *field = fieldmap_lookup(&s->val.fields, field_name); |
870 | if (!field) { | 872 | if (!field) { |
871 | eprintln( | 873 | eprintln( |
@@ -1154,7 +1156,7 @@ analyzer_symbols(Analyzer *a, Node *node, Scope *scope) { | |||
1154 | // TODO: symcheck the value expression? | 1156 | // TODO: symcheck the value expression? |
1155 | for (sz i = 0; i < array_size(node->struct_field); i++) { | 1157 | for (sz i = 0; i < array_size(node->struct_field); i++) { |
1156 | Node *field = node->struct_field[i]; | 1158 | Node *field = node->struct_field[i]; |
1157 | Str field_name = field->field_name->value.str; | 1159 | Str field_name = field->value.str; |
1158 | if (symmap_lookup(&map->val.fields, field_name) != NULL) { | 1160 | if (symmap_lookup(&map->val.fields, field_name) != NULL) { |
1159 | eprintln( | 1161 | eprintln( |
1160 | "%s:%d:%d: error: enum field '%s.%s' already exists", | 1162 | "%s:%d:%d: error: enum field '%s.%s' already exists", |