| ... | ... | @@ -64,8 +64,6 @@ static AstNode *first_executing_node(AstNode *node) { |
| 64 | 64 | case NodeTypeAsmExpr: |
| 65 | 65 | case NodeTypeStructDecl: |
| 66 | 66 | case NodeTypeStructField: |
| 67 | | case NodeTypeEnumDecl: |
| 68 | | case NodeTypeEnumField: |
| 69 | 67 | case NodeTypeStructValueExpr: |
| 70 | 68 | case NodeTypeStructValueField: |
| 71 | 69 | case NodeTypeWhileExpr: |
| ... | ... | @@ -167,7 +165,7 @@ TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool |
| 167 | 165 | static TypeTableEntry *get_maybe_type(CodeGen *g, ImportTableEntry *import, TypeTableEntry *child_type) { |
| 168 | 166 | if (child_type->maybe_parent) { |
| 169 | 167 | TypeTableEntry *entry = child_type->maybe_parent; |
| 170 | | import->type_table.put(&entry->name, entry); |
| 168 | import->block_context->type_table.put(&entry->name, entry); |
| 171 | 169 | return entry; |
| 172 | 170 | } else { |
| 173 | 171 | TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdMaybe); |
| ... | ... | @@ -211,7 +209,7 @@ static TypeTableEntry *get_maybe_type(CodeGen *g, ImportTableEntry *import, Type |
| 211 | 209 | |
| 212 | 210 | entry->data.maybe.child_type = child_type; |
| 213 | 211 | |
| 214 | | import->type_table.put(&entry->name, entry); |
| 212 | import->block_context->type_table.put(&entry->name, entry); |
| 215 | 213 | child_type->maybe_parent = entry; |
| 216 | 214 | return entry; |
| 217 | 215 | } |
| ... | ... | @@ -223,7 +221,7 @@ static TypeTableEntry *get_array_type(CodeGen *g, ImportTableEntry *import, |
| 223 | 221 | auto existing_entry = child_type->arrays_by_size.maybe_get(array_size); |
| 224 | 222 | if (existing_entry) { |
| 225 | 223 | TypeTableEntry *entry = existing_entry->value; |
| 226 | | import->type_table.put(&entry->name, entry); |
| 224 | import->block_context->type_table.put(&entry->name, entry); |
| 227 | 225 | return entry; |
| 228 | 226 | } else { |
| 229 | 227 | TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdArray); |
| ... | ... | @@ -239,7 +237,7 @@ static TypeTableEntry *get_array_type(CodeGen *g, ImportTableEntry *import, |
| 239 | 237 | entry->data.array.child_type = child_type; |
| 240 | 238 | entry->data.array.len = array_size; |
| 241 | 239 | |
| 242 | | import->type_table.put(&entry->name, entry); |
| 240 | import->block_context->type_table.put(&entry->name, entry); |
| 243 | 241 | child_type->arrays_by_size.put(array_size, entry); |
| 244 | 242 | return entry; |
| 245 | 243 | } |
| ... | ... | @@ -441,7 +439,7 @@ static TypeTableEntry *resolve_type(CodeGen *g, AstNode *node, ImportTableEntry |
| 441 | 439 | case AstNodeTypeTypePrimitive: |
| 442 | 440 | { |
| 443 | 441 | Buf *name = &node->data.type.primitive_name; |
| 444 | | auto table_entry = import->type_table.maybe_get(name); |
| 442 | auto table_entry = import->block_context->type_table.maybe_get(name); |
| 445 | 443 | if (!table_entry) { |
| 446 | 444 | table_entry = g->primitive_type_table.maybe_get(name); |
| 447 | 445 | } |
| ... | ... | @@ -895,11 +893,6 @@ static void resolve_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode |
| 895 | 893 | // struct member fns will get resolved independently |
| 896 | 894 | break; |
| 897 | 895 | } |
| 898 | | case NodeTypeEnumDecl: |
| 899 | | { |
| 900 | | zig_panic("TODO resolve enum decl"); |
| 901 | | break; |
| 902 | | } |
| 903 | 896 | case NodeTypeVariableDeclaration: |
| 904 | 897 | { |
| 905 | 898 | VariableTableEntry *var = analyze_variable_declaration(g, import, import->block_context, |
| ... | ... | @@ -942,7 +935,6 @@ static void resolve_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode |
| 942 | 935 | case NodeTypeAsmExpr: |
| 943 | 936 | case NodeTypeFieldAccessExpr: |
| 944 | 937 | case NodeTypeStructField: |
| 945 | | case NodeTypeEnumField: |
| 946 | 938 | case NodeTypeStructValueExpr: |
| 947 | 939 | case NodeTypeStructValueField: |
| 948 | 940 | case NodeTypeCompilerFnExpr: |
| ... | ... | @@ -1212,6 +1204,7 @@ BlockContext *new_block_context(AstNode *node, BlockContext *parent) { |
| 1212 | 1204 | context->node = node; |
| 1213 | 1205 | context->parent = parent; |
| 1214 | 1206 | context->variable_table.init(8); |
| 1207 | context->type_table.init(8); |
| 1215 | 1208 | |
| 1216 | 1209 | if (parent) { |
| 1217 | 1210 | if (parent->next_child_parent_loop_node) { |
| ... | ... | @@ -1258,6 +1251,17 @@ VariableTableEntry *find_variable(BlockContext *context, Buf *name) { |
| 1258 | 1251 | return nullptr; |
| 1259 | 1252 | } |
| 1260 | 1253 | |
| 1254 | TypeTableEntry *find_container(BlockContext *context, Buf *name) { |
| 1255 | while (context) { |
| 1256 | auto entry = context->type_table.maybe_get(name); |
| 1257 | if (entry != nullptr) |
| 1258 | return entry->value; |
| 1259 | |
| 1260 | context = context->parent; |
| 1261 | } |
| 1262 | return nullptr; |
| 1263 | } |
| 1264 | |
| 1261 | 1265 | static void get_struct_field(TypeTableEntry *struct_type, Buf *name, TypeStructField **out_tsf, int *out_i) { |
| 1262 | 1266 | for (int i = 0; i < struct_type->data.structure.field_count; i += 1) { |
| 1263 | 1267 | TypeStructField *type_struct_field = &struct_type->data.structure.fields[i]; |
| ... | ... | @@ -1397,6 +1401,25 @@ static TypeTableEntry *analyze_array_access_expr(CodeGen *g, ImportTableEntry *i |
| 1397 | 1401 | return return_type; |
| 1398 | 1402 | } |
| 1399 | 1403 | |
| 1404 | static TypeTableEntry *analyze_symbol_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, |
| 1405 | TypeTableEntry *expected_type, AstNode *node) |
| 1406 | { |
| 1407 | Buf *variable_name = &node->data.symbol_expr.symbol; |
| 1408 | VariableTableEntry *var = find_variable(context, variable_name); |
| 1409 | if (var) { |
| 1410 | return var->type; |
| 1411 | } else { |
| 1412 | TypeTableEntry *container_type = find_container(context, variable_name); |
| 1413 | if (container_type) { |
| 1414 | return container_type; |
| 1415 | } else { |
| 1416 | add_node_error(g, node, |
| 1417 | buf_sprintf("use of undeclared identifier '%s'", buf_ptr(variable_name))); |
| 1418 | return g->builtin_types.entry_invalid; |
| 1419 | } |
| 1420 | } |
| 1421 | } |
| 1422 | |
| 1400 | 1423 | static TypeTableEntry *analyze_variable_name(CodeGen *g, ImportTableEntry *import, BlockContext *context, |
| 1401 | 1424 | AstNode *node, Buf *variable_name) |
| 1402 | 1425 | { |
| ... | ... | @@ -2381,7 +2404,7 @@ static TypeTableEntry * analyze_expression(CodeGen *g, ImportTableEntry *import, |
| 2381 | 2404 | |
| 2382 | 2405 | case NodeTypeSymbol: |
| 2383 | 2406 | { |
| 2384 | | return_type = analyze_variable_name(g, import, context, node, &node->data.symbol_expr.symbol); |
| 2407 | return_type = analyze_symbol_expr(g, import, context, expected_type, node); |
| 2385 | 2408 | break; |
| 2386 | 2409 | } |
| 2387 | 2410 | case NodeTypeCastExpr: |
| ... | ... | @@ -2499,8 +2522,6 @@ static TypeTableEntry * analyze_expression(CodeGen *g, ImportTableEntry *import, |
| 2499 | 2522 | case NodeTypeLabel: |
| 2500 | 2523 | case NodeTypeStructDecl: |
| 2501 | 2524 | case NodeTypeStructField: |
| 2502 | | case NodeTypeEnumDecl: |
| 2503 | | case NodeTypeEnumField: |
| 2504 | 2525 | case NodeTypeStructValueField: |
| 2505 | 2526 | case NodeTypeCompilerFnExpr: |
| 2506 | 2527 | zig_unreachable(); |
| ... | ... | @@ -2609,7 +2630,6 @@ static void analyze_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode |
| 2609 | 2630 | case NodeTypeRootExportDecl: |
| 2610 | 2631 | case NodeTypeExternBlock: |
| 2611 | 2632 | case NodeTypeUse: |
| 2612 | | case NodeTypeEnumDecl: |
| 2613 | 2633 | case NodeTypeVariableDeclaration: |
| 2614 | 2634 | // already took care of these |
| 2615 | 2635 | break; |
| ... | ... | @@ -2645,7 +2665,6 @@ static void analyze_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode |
| 2645 | 2665 | case NodeTypeAsmExpr: |
| 2646 | 2666 | case NodeTypeFieldAccessExpr: |
| 2647 | 2667 | case NodeTypeStructField: |
| 2648 | | case NodeTypeEnumField: |
| 2649 | 2668 | case NodeTypeStructValueExpr: |
| 2650 | 2669 | case NodeTypeStructValueField: |
| 2651 | 2670 | case NodeTypeCompilerFnExpr: |
| ... | ... | @@ -2779,8 +2798,6 @@ static void collect_expr_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode |
| 2779 | 2798 | case NodeTypeLabel: |
| 2780 | 2799 | case NodeTypeStructDecl: |
| 2781 | 2800 | case NodeTypeStructField: |
| 2782 | | case NodeTypeEnumDecl: |
| 2783 | | case NodeTypeEnumField: |
| 2784 | 2801 | case NodeTypeStructValueField: |
| 2785 | 2802 | zig_unreachable(); |
| 2786 | 2803 | } |
| ... | ... | @@ -2794,7 +2811,7 @@ static void collect_type_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode |
| 2794 | 2811 | Buf *name = &type_node->data.type.primitive_name; |
| 2795 | 2812 | auto table_entry = g->primitive_type_table.maybe_get(name); |
| 2796 | 2813 | if (!table_entry) { |
| 2797 | | table_entry = import->type_table.maybe_get(name); |
| 2814 | table_entry = import->block_context->type_table.maybe_get(name); |
| 2798 | 2815 | } |
| 2799 | 2816 | if (!table_entry) { |
| 2800 | 2817 | decl_node->deps.put(name, type_node); |
| ... | ... | @@ -2826,7 +2843,7 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast |
| 2826 | 2843 | Buf *name = &node->data.struct_decl.name; |
| 2827 | 2844 | auto table_entry = g->primitive_type_table.maybe_get(name); |
| 2828 | 2845 | if (!table_entry) { |
| 2829 | | table_entry = import->type_table.maybe_get(name); |
| 2846 | table_entry = import->block_context->type_table.maybe_get(name); |
| 2830 | 2847 | } |
| 2831 | 2848 | if (table_entry) { |
| 2832 | 2849 | node->data.struct_decl.type_entry = table_entry->value; |
| ... | ... | @@ -2843,20 +2860,20 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast |
| 2843 | 2860 | buf_init_from_buf(&entry->name, name); |
| 2844 | 2861 | // put off adding the debug type until we do the full struct body |
| 2845 | 2862 | // this type is incomplete until we do another pass |
| 2846 | | import->type_table.put(&entry->name, entry); |
| 2863 | import->block_context->type_table.put(&entry->name, entry); |
| 2847 | 2864 | node->data.struct_decl.type_entry = entry; |
| 2848 | 2865 | |
| 2849 | 2866 | bool is_pub = (node->data.struct_decl.visib_mod != VisibModPrivate); |
| 2850 | 2867 | if (is_pub) { |
| 2851 | 2868 | for (int i = 0; i < import->importers.length; i += 1) { |
| 2852 | 2869 | ImporterInfo importer = import->importers.at(i); |
| 2853 | | auto table_entry = importer.import->type_table.maybe_get(&entry->name); |
| 2870 | auto table_entry = importer.import->block_context->type_table.maybe_get(&entry->name); |
| 2854 | 2871 | if (table_entry) { |
| 2855 | 2872 | add_node_error(g, importer.source_node, |
| 2856 | 2873 | buf_sprintf("import of type '%s' overrides existing definition", |
| 2857 | 2874 | buf_ptr(&entry->name))); |
| 2858 | 2875 | } else { |
| 2859 | | importer.import->type_table.put(&entry->name, entry); |
| 2876 | importer.import->block_context->type_table.put(&entry->name, entry); |
| 2860 | 2877 | } |
| 2861 | 2878 | } |
| 2862 | 2879 | } |
| ... | ... | @@ -2886,11 +2903,6 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast |
| 2886 | 2903 | detect_top_level_decl_deps(g, import, fn_def_node); |
| 2887 | 2904 | } |
| 2888 | 2905 | |
| 2889 | | break; |
| 2890 | | } |
| 2891 | | case NodeTypeEnumDecl: |
| 2892 | | { |
| 2893 | | zig_panic("TODO detect enum top level decl deps"); |
| 2894 | 2906 | break; |
| 2895 | 2907 | } |
| 2896 | 2908 | case NodeTypeExternBlock: |
| ... | ... | @@ -2986,7 +2998,6 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast |
| 2986 | 2998 | case NodeTypeAsmExpr: |
| 2987 | 2999 | case NodeTypeFieldAccessExpr: |
| 2988 | 3000 | case NodeTypeStructField: |
| 2989 | | case NodeTypeEnumField: |
| 2990 | 3001 | case NodeTypeStructValueExpr: |
| 2991 | 3002 | case NodeTypeStructValueField: |
| 2992 | 3003 | case NodeTypeCompilerFnExpr: |
| ... | ... | @@ -3216,8 +3227,6 @@ Expr *get_resolved_expr(AstNode *node) { |
| 3216 | 3227 | case NodeTypeStructDecl: |
| 3217 | 3228 | case NodeTypeStructField: |
| 3218 | 3229 | case NodeTypeStructValueField: |
| 3219 | | case NodeTypeEnumDecl: |
| 3220 | | case NodeTypeEnumField: |
| 3221 | 3230 | zig_unreachable(); |
| 3222 | 3231 | } |
| 3223 | 3232 | } |
| ... | ... | @@ -3267,8 +3276,6 @@ NumLitCodeGen *get_resolved_num_lit(AstNode *node) { |
| 3267 | 3276 | case NodeTypeStructDecl: |
| 3268 | 3277 | case NodeTypeStructField: |
| 3269 | 3278 | case NodeTypeStructValueField: |
| 3270 | | case NodeTypeEnumDecl: |
| 3271 | | case NodeTypeEnumField: |
| 3272 | 3279 | case NodeTypeCompilerFnExpr: |
| 3273 | 3280 | zig_unreachable(); |
| 3274 | 3281 | } |
| ... | ... | @@ -3319,8 +3326,6 @@ TopLevelDecl *get_resolved_top_level_decl(AstNode *node) { |
| 3319 | 3326 | case NodeTypeContinue: |
| 3320 | 3327 | case NodeTypeStructField: |
| 3321 | 3328 | case NodeTypeStructValueField: |
| 3322 | | case NodeTypeEnumDecl: |
| 3323 | | case NodeTypeEnumField: |
| 3324 | 3329 | case NodeTypeCompilerFnExpr: |
| 3325 | 3330 | case NodeTypeCompilerFnType: |
| 3326 | 3331 | zig_unreachable(); |