Commit 4d7835e21a

Andrew Kelley <superjoe30@gmail.com>
2016-01-11 01:27:58
delete unused enumfield and enumdecl node types
1 parent fc748e2
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);