diff --git a/src/DiagnosticsCollection.zig b/src/DiagnosticsCollection.zig index f7f8bfa9e..899ed6ac0 100644 --- a/src/DiagnosticsCollection.zig +++ b/src/DiagnosticsCollection.zig @@ -210,6 +210,26 @@ pub fn clearErrorBundle(collection: *DiagnosticsCollection, tag: Tag) void { item.error_bundle = .empty; } +pub fn clearSingleDocumentDiagnostics(collection: *DiagnosticsCollection, document_uri: Uri) void { + const tracy_zone = tracy.trace(@src()); + defer tracy_zone.end(); + + collection.mutex.lock(); + defer collection.mutex.unlock(); + + for (collection.tag_set.values()) |*item| { + var kv = item.diagnostics_set.fetchSwapRemove(document_uri) orelse continue; + kv.value.arena.promote(collection.allocator).deinit(); + kv.value.error_bundle.deinit(collection.allocator); + + const gop = collection.outdated_files.getOrPut(collection.allocator, kv.key) catch { + kv.key.deinit(collection.allocator); + continue; + }; + if (gop.found_existing) kv.key.deinit(collection.allocator); + } +} + fn collectUrisFromErrorBundle( allocator: std.mem.Allocator, error_bundle: std.zig.ErrorBundle, diff --git a/src/Server.zig b/src/Server.zig index 301f1cdf1..a6740c1a0 100644 --- a/src/Server.zig +++ b/src/Server.zig @@ -1211,12 +1211,10 @@ fn closeDocumentHandler(server: *Server, arena: std.mem.Allocator, notification: server.document_store.closeLspSyncedDocument(document_uri); if (server.client_capabilities.supports_publish_diagnostics) { - // clear diagnostics on closed file - const json_message = server.sendToClientNotification("textDocument/publishDiagnostics", .{ - .uri = document_uri, - .diagnostics = &.{}, - }) catch return; - server.allocator.free(json_message); + server.diagnostics_collection.clearSingleDocumentDiagnostics(document_uri); + server.diagnostics_collection.publishDiagnostics() catch |err| { + std.log.err("failed to publish diagnostics: {}", .{err}); + }; } } diff --git a/src/Uri.zig b/src/Uri.zig index 3546705d6..39cde01d2 100644 --- a/src/Uri.zig +++ b/src/Uri.zig @@ -151,9 +151,8 @@ pub fn eql(a: Uri, b: Uri) bool { return std.mem.eql(u8, a.raw, b.raw); } -pub fn format(_: Uri, _: *std.Io.Writer) std.Io.Writer.Error!void { - @compileError("Cannot format @import(\"Uri.zig\") directly!. Access the underlying raw string field instead."); -} +pub const format = @compileError("Cannot format @import(\"Uri.zig\") directly!. Access the underlying raw string field instead."); +pub const jsonStringify = @compileError("Cannot stringify @import(\"Uri.zig\") directly!. Access the underlying raw string field instead."); pub fn ArrayHashMap(comptime V: type) type { return std.ArrayHashMapUnmanaged(Uri, V, Context, true);