Commit e5a3cb8d71

Noam Preil <pleasantatk@gmail.com>
2020-06-26 09:15:12
Stage2: fix incremental compilation after error
1 parent 53fead5
Changed files (1)
src-self-hosted
src-self-hosted/Module.zig
@@ -851,6 +851,8 @@ pub fn update(self: *Module) !void {
 
     self.generation += 1;
 
+    self.clearErrors();
+
     // TODO Use the cache hash file system to detect which source files changed.
     // Until then we simulate a full cache miss. Source files could have been loaded for any reason;
     // to force a refresh we unload now.
@@ -914,6 +916,31 @@ pub fn totalErrorCount(self: *Module) usize {
     return if (total == 0) @boolToInt(self.link_error_flags.no_entry_point_found) else total;
 }
 
+pub fn clearErrors(self: *Module) void {
+    const allocator = self.allocator;
+    {
+        var it = self.failed_decls.iterator();
+        while (it.next()) |kv| {
+            kv.value.destroy(allocator);
+        }
+        self.failed_decls.clear();
+    }
+    {
+        var it = self.failed_files.iterator();
+        while (it.next()) |kv| {
+            kv.value.destroy(allocator);
+        }
+        self.failed_files.clear();
+    }
+    {
+        var it = self.failed_exports.iterator();
+        while (it.next()) |kv| {
+            kv.value.destroy(allocator);
+        }
+        self.failed_exports.clear();
+    }
+}
+
 pub fn getAllErrorsAlloc(self: *Module) !AllErrors {
     var arena = std.heap.ArenaAllocator.init(self.allocator);
     errdefer arena.deinit();
@@ -2092,6 +2119,7 @@ fn analyzeExport(self: *Module, scope: *Scope, src: usize, symbol_name: []const
         .Fn => {},
         else => return self.fail(scope, src, "unable to export type '{}'", .{typed_value.ty}),
     }
+
     try self.decl_exports.ensureCapacity(self.decl_exports.size + 1);
     try self.export_owners.ensureCapacity(self.export_owners.size + 1);