From 047c9bbb994e277fefc01bf7ae11eaec5efc1001 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 16 Dec 2024 23:14:24 +0100 Subject: [PATCH] feat: improve language server not found errors --- src/LSP.zig | 18 +++++++++++------- src/project_manager.zig | 2 ++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/LSP.zig b/src/LSP.zig index 3376304..b14c5a5 100644 --- a/src/LSP.zig +++ b/src/LSP.zig @@ -192,19 +192,14 @@ const Process = struct { try self.term(); } else if (try cbor.match(m.buf, .{ self.sp_tag, "stdout", tp.extract(&bytes) })) { try self.handle_output(bytes); + } else if (try cbor.match(m.buf, .{ self.sp_tag, "term", "error.FileNotFound", 1 })) { + try self.handle_not_found(); } else if (try cbor.match(m.buf, .{ self.sp_tag, "term", tp.extract(&err), tp.extract(&code) })) { try self.handle_terminated(err, code); } else if (try cbor.match(m.buf, .{ self.sp_tag, "stderr", tp.extract(&bytes) })) { self.write_log("{s}\n", .{bytes}); } else if (try cbor.match(m.buf, .{ "exit", "normal" })) { // self.write_log("### exit normal ###\n", .{}); - } else if (try cbor.match(m.buf, .{ "exit", "error.FileNotFound" })) { - self.write_log("### LSP not found ###\n", .{}); - const logger = log.logger("LSP"); - defer logger.deinit(); - var buf: [1024]u8 = undefined; - logger.print_err("init", "executable not found: {s}", .{self.cmd.to_json(&buf) catch "{command too large}"}); - return error.FileNotFound; } else { tp.unexpected(m) catch {}; self.write_log("{s}\n", .{tp.error_text()}); @@ -273,6 +268,15 @@ const Process = struct { }; } + fn handle_not_found(self: *Process) error{ExitNormal}!void { + const logger = log.logger("LSP"); + defer logger.deinit(); + logger.print_err("init", "'{s}' executable not found", .{self.tag}); + self.write_log("### '{s}' executable not found ###\n", .{self.tag}); + self.parent.send(.{ sp_tag, self.tag, "not found" }) catch {}; + return error.ExitNormal; + } + fn handle_terminated(self: *Process, err: []const u8, code: u32) error{ExitNormal}!void { const logger = log.logger("LSP"); defer logger.deinit(); diff --git a/src/project_manager.zig b/src/project_manager.zig index 28439f0..1c03f4e 100644 --- a/src/project_manager.zig +++ b/src/project_manager.zig @@ -302,6 +302,8 @@ const Process = struct { self.dispatch_notify(project_directory, language_server, method, params_cb) catch |e| return self.logger.err("lsp-handling", e); } else if (try cbor.match(m.buf, .{ "child", tp.extract(&project_directory), tp.extract(&language_server), "request", tp.extract(&method), tp.extract_cbor(&cbor_id), tp.extract_cbor(¶ms_cb) })) { self.dispatch_request(from, project_directory, language_server, method, cbor_id, params_cb) catch |e| return self.logger.err("lsp-handling", e); + } else if (try cbor.match(m.buf, .{ "child", tp.extract(&path), "not found" })) { + self.logger.print("executable '{s}' not found", .{path}); } else if (try cbor.match(m.buf, .{ "child", tp.extract(&path), "done" })) { self.logger.print_err("lsp-handling", "child '{s}' terminated", .{path}); } else if (try cbor.match(m.buf, .{ "open", tp.extract(&project_directory) })) {