feat(LSP): add some logging of LSP start/stop

This commit is contained in:
CJ van den Berg 2024-07-08 22:41:34 +02:00
parent f60ccd7c37
commit f9bbc7f582
2 changed files with 32 additions and 0 deletions

View file

@ -3,6 +3,7 @@ const tp = @import("thespian");
const cbor = @import("cbor");
const root = @import("root");
const tracy = @import("tracy");
const log = @import("log");
a: std.mem.Allocator,
pid: tp.pid,
@ -233,6 +234,8 @@ const Process = struct {
}
fn handle_terminated(self: *Process, err: []const u8, code: u32) tp.result {
const logger = log.logger("LSP");
logger.print("terminated: {s} {d}", .{ err, code });
self.write_log("### subprocess terminated {s} {d} ###\n", .{ err, code });
try self.parent.send(.{ sp_tag, self.tag, "done" });
return tp.exit_normal();

View file

@ -88,6 +88,8 @@ pub fn restore_state(self: *Self, data: []const u8) !void {
fn get_lsp(self: *Self, language_server: []const u8) !LSP {
if (self.language_servers.get(language_server)) |lsp| return lsp;
const logger = log.logger("lsp");
errdefer |e| logger.print_err("get_lsp", "failed to initialize LSP: {s} -> {any}", .{ fmt_lsp_name_func(language_server), e });
const lsp = try LSP.open(self.a, self.name, .{ .buf = language_server });
try self.language_servers.put(try self.a.dupe(u8, language_server), lsp);
const uri = try self.make_URI(null);
@ -97,10 +99,13 @@ fn get_lsp(self: *Self, language_server: []const u8) !LSP {
const response = try self.send_lsp_init_request(lsp, self.name, basename, uri);
defer self.a.free(response.buf);
try lsp.send_notification("initialized", .{});
logger.print("initialized LSP: {s}", .{fmt_lsp_name_func(language_server)});
return lsp;
}
fn get_file_lsp(self: *Self, file_path: []const u8) !LSP {
const logger = log.logger("lsp");
errdefer logger.print_err("get_file_lsp", "no LSP found for file: {s}", .{std.fmt.fmtSliceEscapeLower(file_path)});
const lsp = self.file_language_server.get(file_path) orelse return tp.exit("no language server");
if (lsp.pid.expired()) return tp.exit("no language server");
return lsp;
@ -915,3 +920,27 @@ fn send_lsp_init_request(self: *Self, lsp: LSP, project_path: []const u8, projec
},
});
}
fn fmt_lsp_name_func(bytes: []const u8) std.fmt.Formatter(format_lsp_name_func) {
return .{ .data = bytes };
}
fn format_lsp_name_func(
bytes: []const u8,
comptime fmt: []const u8,
options: std.fmt.FormatOptions,
writer: anytype,
) !void {
_ = fmt;
_ = options;
var iter: []const u8 = bytes;
var len = cbor.decodeArrayHeader(&iter) catch return;
var first: bool = true;
while (len > 0) : (len -= 1) {
var value: []const u8 = undefined;
if (!(cbor.matchValue(&iter, cbor.extract(&value)) catch return))
return;
if (first) first = false else try writer.writeAll(" ");
try writer.writeAll(value);
}
}