diff --git a/src/all_types.hpp b/src/all_types.hpp index f899cfda35..2951885aa5 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -128,8 +128,6 @@ enum NodeType { NodeTypeStructField, NodeTypeStructValueExpr, NodeTypeStructValueField, - NodeTypeEnumDecl, - NodeTypeEnumField, NodeTypeCompilerFnExpr, NodeTypeCompilerFnType, }; @@ -475,19 +473,6 @@ struct AstNodeStructField { ZigList *directives; }; -struct AstNodeEnumDecl { - Buf name; - ZigList fields; - ZigList *directives; - VisibMod visib_mod; -}; - -struct AstNodeEnumField { - Buf name; - ZigList fields; // length 0 means simple enum - AstNode *val_expr; -}; - struct AstNodeStringLiteral { Buf buf; bool c; @@ -646,8 +631,6 @@ struct AstNode { AstNodeFieldAccessExpr field_access_expr; AstNodeStructDecl struct_decl; AstNodeStructField struct_field; - AstNodeEnumDecl enum_decl; - AstNodeEnumField enum_field; AstNodeStringLiteral string_literal; AstNodeCharLiteral char_literal; AstNodeNumberLiteral number_literal; @@ -778,7 +761,6 @@ struct ImportTableEntry { // reminder: hash tables must be initialized before use HashMap fn_table; - HashMap type_table; }; struct LabelTableEntry { @@ -924,6 +906,7 @@ struct BlockContext { FnTableEntry *fn_entry; // null at the module scope BlockContext *parent; // null when this is the root HashMap variable_table; + HashMap type_table; ZigList cast_expr_alloca_list; ZigList struct_val_expr_alloca_list; AstNode *parent_loop_node; diff --git a/src/analyze.cpp b/src/analyze.cpp index 47e67e480f..f0df21636b 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -64,8 +64,6 @@ static AstNode *first_executing_node(AstNode *node) { case NodeTypeAsmExpr: case NodeTypeStructDecl: case NodeTypeStructField: - case NodeTypeEnumDecl: - case NodeTypeEnumField: case NodeTypeStructValueExpr: case NodeTypeStructValueField: case NodeTypeWhileExpr: @@ -167,7 +165,7 @@ TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool static TypeTableEntry *get_maybe_type(CodeGen *g, ImportTableEntry *import, TypeTableEntry *child_type) { if (child_type->maybe_parent) { TypeTableEntry *entry = child_type->maybe_parent; - import->type_table.put(&entry->name, entry); + import->block_context->type_table.put(&entry->name, entry); return entry; } else { TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdMaybe); @@ -211,7 +209,7 @@ static TypeTableEntry *get_maybe_type(CodeGen *g, ImportTableEntry *import, Type entry->data.maybe.child_type = child_type; - import->type_table.put(&entry->name, entry); + import->block_context->type_table.put(&entry->name, entry); child_type->maybe_parent = entry; return entry; } @@ -223,7 +221,7 @@ static TypeTableEntry *get_array_type(CodeGen *g, ImportTableEntry *import, auto existing_entry = child_type->arrays_by_size.maybe_get(array_size); if (existing_entry) { TypeTableEntry *entry = existing_entry->value; - import->type_table.put(&entry->name, entry); + import->block_context->type_table.put(&entry->name, entry); return entry; } else { TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdArray); @@ -239,7 +237,7 @@ static TypeTableEntry *get_array_type(CodeGen *g, ImportTableEntry *import, entry->data.array.child_type = child_type; entry->data.array.len = array_size; - import->type_table.put(&entry->name, entry); + import->block_context->type_table.put(&entry->name, entry); child_type->arrays_by_size.put(array_size, entry); return entry; } @@ -441,7 +439,7 @@ static TypeTableEntry *resolve_type(CodeGen *g, AstNode *node, ImportTableEntry case AstNodeTypeTypePrimitive: { Buf *name = &node->data.type.primitive_name; - auto table_entry = import->type_table.maybe_get(name); + auto table_entry = import->block_context->type_table.maybe_get(name); if (!table_entry) { table_entry = g->primitive_type_table.maybe_get(name); } @@ -895,11 +893,6 @@ static void resolve_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode // struct member fns will get resolved independently break; } - case NodeTypeEnumDecl: - { - zig_panic("TODO resolve enum decl"); - break; - } case NodeTypeVariableDeclaration: { 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 case NodeTypeAsmExpr: case NodeTypeFieldAccessExpr: case NodeTypeStructField: - case NodeTypeEnumField: case NodeTypeStructValueExpr: case NodeTypeStructValueField: case NodeTypeCompilerFnExpr: @@ -1212,6 +1204,7 @@ BlockContext *new_block_context(AstNode *node, BlockContext *parent) { context->node = node; context->parent = parent; context->variable_table.init(8); + context->type_table.init(8); if (parent) { if (parent->next_child_parent_loop_node) { @@ -1258,6 +1251,17 @@ VariableTableEntry *find_variable(BlockContext *context, Buf *name) { return nullptr; } +TypeTableEntry *find_container(BlockContext *context, Buf *name) { + while (context) { + auto entry = context->type_table.maybe_get(name); + if (entry != nullptr) + return entry->value; + + context = context->parent; + } + return nullptr; +} + static void get_struct_field(TypeTableEntry *struct_type, Buf *name, TypeStructField **out_tsf, int *out_i) { for (int i = 0; i < struct_type->data.structure.field_count; i += 1) { TypeStructField *type_struct_field = &struct_type->data.structure.fields[i]; @@ -1397,6 +1401,25 @@ static TypeTableEntry *analyze_array_access_expr(CodeGen *g, ImportTableEntry *i return return_type; } +static TypeTableEntry *analyze_symbol_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, + TypeTableEntry *expected_type, AstNode *node) +{ + Buf *variable_name = &node->data.symbol_expr.symbol; + VariableTableEntry *var = find_variable(context, variable_name); + if (var) { + return var->type; + } else { + TypeTableEntry *container_type = find_container(context, variable_name); + if (container_type) { + return container_type; + } else { + add_node_error(g, node, + buf_sprintf("use of undeclared identifier '%s'", buf_ptr(variable_name))); + return g->builtin_types.entry_invalid; + } + } +} + static TypeTableEntry *analyze_variable_name(CodeGen *g, ImportTableEntry *import, BlockContext *context, AstNode *node, Buf *variable_name) { @@ -2381,7 +2404,7 @@ static TypeTableEntry * analyze_expression(CodeGen *g, ImportTableEntry *import, case NodeTypeSymbol: { - return_type = analyze_variable_name(g, import, context, node, &node->data.symbol_expr.symbol); + return_type = analyze_symbol_expr(g, import, context, expected_type, node); break; } case NodeTypeCastExpr: @@ -2499,8 +2522,6 @@ static TypeTableEntry * analyze_expression(CodeGen *g, ImportTableEntry *import, case NodeTypeLabel: case NodeTypeStructDecl: case NodeTypeStructField: - case NodeTypeEnumDecl: - case NodeTypeEnumField: case NodeTypeStructValueField: case NodeTypeCompilerFnExpr: zig_unreachable(); @@ -2609,7 +2630,6 @@ static void analyze_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode case NodeTypeRootExportDecl: case NodeTypeExternBlock: case NodeTypeUse: - case NodeTypeEnumDecl: case NodeTypeVariableDeclaration: // already took care of these break; @@ -2645,7 +2665,6 @@ static void analyze_top_level_decl(CodeGen *g, ImportTableEntry *import, AstNode case NodeTypeAsmExpr: case NodeTypeFieldAccessExpr: case NodeTypeStructField: - case NodeTypeEnumField: case NodeTypeStructValueExpr: case NodeTypeStructValueField: case NodeTypeCompilerFnExpr: @@ -2779,8 +2798,6 @@ static void collect_expr_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode case NodeTypeLabel: case NodeTypeStructDecl: case NodeTypeStructField: - case NodeTypeEnumDecl: - case NodeTypeEnumField: case NodeTypeStructValueField: zig_unreachable(); } @@ -2794,7 +2811,7 @@ static void collect_type_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode Buf *name = &type_node->data.type.primitive_name; auto table_entry = g->primitive_type_table.maybe_get(name); if (!table_entry) { - table_entry = import->type_table.maybe_get(name); + table_entry = import->block_context->type_table.maybe_get(name); } if (!table_entry) { decl_node->deps.put(name, type_node); @@ -2826,7 +2843,7 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast Buf *name = &node->data.struct_decl.name; auto table_entry = g->primitive_type_table.maybe_get(name); if (!table_entry) { - table_entry = import->type_table.maybe_get(name); + table_entry = import->block_context->type_table.maybe_get(name); } if (table_entry) { 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 buf_init_from_buf(&entry->name, name); // put off adding the debug type until we do the full struct body // this type is incomplete until we do another pass - import->type_table.put(&entry->name, entry); + import->block_context->type_table.put(&entry->name, entry); node->data.struct_decl.type_entry = entry; bool is_pub = (node->data.struct_decl.visib_mod != VisibModPrivate); if (is_pub) { for (int i = 0; i < import->importers.length; i += 1) { ImporterInfo importer = import->importers.at(i); - auto table_entry = importer.import->type_table.maybe_get(&entry->name); + auto table_entry = importer.import->block_context->type_table.maybe_get(&entry->name); if (table_entry) { add_node_error(g, importer.source_node, buf_sprintf("import of type '%s' overrides existing definition", buf_ptr(&entry->name))); } else { - importer.import->type_table.put(&entry->name, entry); + importer.import->block_context->type_table.put(&entry->name, entry); } } } @@ -2886,11 +2903,6 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast detect_top_level_decl_deps(g, import, fn_def_node); } - break; - } - case NodeTypeEnumDecl: - { - zig_panic("TODO detect enum top level decl deps"); break; } case NodeTypeExternBlock: @@ -2986,7 +2998,6 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast case NodeTypeAsmExpr: case NodeTypeFieldAccessExpr: case NodeTypeStructField: - case NodeTypeEnumField: case NodeTypeStructValueExpr: case NodeTypeStructValueField: case NodeTypeCompilerFnExpr: @@ -3216,8 +3227,6 @@ Expr *get_resolved_expr(AstNode *node) { case NodeTypeStructDecl: case NodeTypeStructField: case NodeTypeStructValueField: - case NodeTypeEnumDecl: - case NodeTypeEnumField: zig_unreachable(); } } @@ -3267,8 +3276,6 @@ NumLitCodeGen *get_resolved_num_lit(AstNode *node) { case NodeTypeStructDecl: case NodeTypeStructField: case NodeTypeStructValueField: - case NodeTypeEnumDecl: - case NodeTypeEnumField: case NodeTypeCompilerFnExpr: zig_unreachable(); } @@ -3319,8 +3326,6 @@ TopLevelDecl *get_resolved_top_level_decl(AstNode *node) { case NodeTypeContinue: case NodeTypeStructField: case NodeTypeStructValueField: - case NodeTypeEnumDecl: - case NodeTypeEnumField: case NodeTypeCompilerFnExpr: case NodeTypeCompilerFnType: zig_unreachable(); diff --git a/src/analyze.hpp b/src/analyze.hpp index ec9c6ac705..b35311ad02 100644 --- a/src/analyze.hpp +++ b/src/analyze.hpp @@ -15,6 +15,7 @@ void add_node_error(CodeGen *g, AstNode *node, Buf *msg); TypeTableEntry *new_type_table_entry(TypeTableEntryId id); TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool is_const, bool is_noalias); VariableTableEntry *find_variable(BlockContext *context, Buf *name); +TypeTableEntry *find_container(BlockContext *context, Buf *name); BlockContext *new_block_context(AstNode *node, BlockContext *parent); Expr *get_resolved_expr(AstNode *node); NumLitCodeGen *get_resolved_num_lit(AstNode *node); diff --git a/src/codegen.cpp b/src/codegen.cpp index b46ec52e9c..e89b19e79f 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1752,8 +1752,6 @@ static LLVMValueRef gen_expr_no_cast(CodeGen *g, AstNode *node) { case NodeTypeUse: case NodeTypeStructDecl: case NodeTypeStructField: - case NodeTypeEnumDecl: - case NodeTypeEnumField: case NodeTypeStructValueField: case NodeTypeCompilerFnExpr: zig_unreachable(); @@ -2516,7 +2514,6 @@ static ImportTableEntry *codegen_add_code(CodeGen *g, Buf *abs_full_path, import_entry->line_offsets = tokenization.line_offsets; import_entry->path = full_path; import_entry->fn_table.init(32); - import_entry->type_table.init(32); import_entry->root = ast_parse(source_code, tokenization.tokens, import_entry, g->err_color); assert(import_entry->root); diff --git a/src/parser.cpp b/src/parser.cpp index 0448837dc1..b9c55ef319 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -144,10 +144,6 @@ const char *node_type_str(NodeType node_type) { return "StructDecl"; case NodeTypeStructField: return "StructField"; - case NodeTypeEnumDecl: - return "EnumDecl"; - case NodeTypeEnumField: - return "EnumField"; case NodeTypeStructValueExpr: return "StructValueExpr"; case NodeTypeStructValueField: @@ -435,24 +431,6 @@ void ast_print(AstNode *node, int indent) { ast_print(node->data.struct_field.type, indent + 2); } break; - case NodeTypeEnumDecl: - fprintf(stderr, "%s '%s'\n", - node_type_str(node->type), buf_ptr(&node->data.enum_decl.name)); - for (int i = 0; i < node->data.enum_decl.fields.length; i += 1) { - AstNode *child = node->data.enum_decl.fields.at(i); - ast_print(child, indent + 2); - } - break; - case NodeTypeEnumField: - fprintf(stderr, "%s '%s'\n", node_type_str(node->type), buf_ptr(&node->data.enum_field.name)); - if (node->data.enum_field.val_expr) { - ast_print(node->data.enum_field.val_expr, indent + 2); - } - for (int i = 0; i < node->data.enum_field.fields.length; i += 1) { - AstNode *child = node->data.enum_field.fields.at(i); - ast_print(child, indent + 2); - } - break; case NodeTypeStructValueExpr: fprintf(stderr, "%s\n", node_type_str(node->type)); ast_print(node->data.struct_val_expr.type, indent + 2);