Commit 4d7835e21a
Changed files (5)
src/all_types.hpp
@@ -128,8 +128,6 @@ enum NodeType {
NodeTypeStructField,
NodeTypeStructValueExpr,
NodeTypeStructValueField,
- NodeTypeEnumDecl,
- NodeTypeEnumField,
NodeTypeCompilerFnExpr,
NodeTypeCompilerFnType,
};
@@ -475,19 +473,6 @@ struct AstNodeStructField {
ZigList<AstNode *> *directives;
};
-struct AstNodeEnumDecl {
- Buf name;
- ZigList<AstNode *> fields;
- ZigList<AstNode *> *directives;
- VisibMod visib_mod;
-};
-
-struct AstNodeEnumField {
- Buf name;
- ZigList<AstNode *> 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<Buf *, FnTableEntry *, buf_hash, buf_eql_buf> fn_table;
- HashMap<Buf *, TypeTableEntry *, buf_hash, buf_eql_buf> 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<Buf *, VariableTableEntry *, buf_hash, buf_eql_buf> variable_table;
+ HashMap<Buf *, TypeTableEntry *, buf_hash, buf_eql_buf> type_table;
ZigList<Cast *> cast_expr_alloca_list;
ZigList<StructValExprCodeGen *> struct_val_expr_alloca_list;
AstNode *parent_loop_node;
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();
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);
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);
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);