Skip to content

Commit 3ae5692

Browse files
authored
Implement $/setTrace and add --enable-message-tracing (#1135)
1 parent 421ae86 commit 3ae5692

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

Diff for: src/Server.zig

+15
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ runtime_zig_version: ?ZigVersionWrapper,
4848
outgoing_messages: std.ArrayListUnmanaged([]const u8) = .{},
4949
recording_enabled: bool,
5050
replay_enabled: bool,
51+
message_tracing_enabled: bool = false,
5152
offset_encoding: offsets.Encoding = .@"utf-16",
5253
status: enum {
5354
/// the server has not received a `initialize` request
@@ -450,6 +451,13 @@ fn initializeHandler(server: *Server, request: types.InitializeParams) Error!typ
450451
}
451452
}
452453

454+
if (request.trace) |trace| {
455+
// To support --enable-message-tracing, only allow turning this on here
456+
if (trace != .off) {
457+
server.message_tracing_enabled = true;
458+
}
459+
}
460+
453461
log.info("zls initializing", .{});
454462
log.info("{}", .{server.client_capabilities});
455463
log.info("Using offset encoding: {s}", .{std.meta.tagName(server.offset_encoding)});
@@ -614,6 +622,10 @@ fn cancelRequestHandler(server: *Server, request: types.CancelParams) Error!void
614622
// TODO implement $/cancelRequest
615623
}
616624

625+
fn setTraceHandler(server: *Server, request: types.SetTraceParams) Error!void {
626+
server.message_tracing_enabled = request.value != .off;
627+
}
628+
617629
fn registerCapability(server: *Server, method: []const u8) Error!void {
618630
const allocator = server.arena.allocator();
619631

@@ -1449,6 +1461,7 @@ pub fn processMessage(server: *Server, message: Message) Error!void {
14491461
.{ "shutdown", shutdownHandler },
14501462
.{ "exit", exitHandler },
14511463
.{ "$/cancelRequest", cancelRequestHandler },
1464+
.{ "$/setTrace", setTraceHandler },
14521465
.{ "textDocument/didOpen", openDocumentHandler },
14531466
.{ "textDocument/didChange", changeDocumentHandler },
14541467
.{ "textDocument/didSave", saveDocumentHandler },
@@ -1533,6 +1546,7 @@ pub fn create(
15331546
config_path: ?[]const u8,
15341547
recording_enabled: bool,
15351548
replay_enabled: bool,
1549+
message_tracing_enabled: bool,
15361550
) !*Server {
15371551
const server = try allocator.create(Server);
15381552
server.* = Server{
@@ -1549,6 +1563,7 @@ pub fn create(
15491563
.builtin_completions = null,
15501564
.recording_enabled = recording_enabled,
15511565
.replay_enabled = replay_enabled,
1566+
.message_tracing_enabled = message_tracing_enabled,
15521567
.status = .uninitialized,
15531568
};
15541569
server.analyser = Analyser.init(allocator, &server.document_store);

Diff for: src/main.zig

+13
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const Header = @import("Header.zig");
1111
const debug = @import("debug.zig");
1212

1313
const logger = std.log.scoped(.zls_main);
14+
const message_logger = std.log.scoped(.message);
1415

1516
var actual_log_level: std.log.Level = switch (zig_builtin.mode) {
1617
.Debug => .debug,
@@ -60,6 +61,7 @@ fn loop(
6061
const header = Header{ .content_length = outgoing_message.len };
6162
try header.write(true, writer);
6263
try writer.writeAll(outgoing_message);
64+
if (server.message_tracing_enabled) message_logger.info("sent: {s}\n", .{outgoing_message});
6365
}
6466
try buffered_writer.flush();
6567
for (server.outgoing_messages.items) |outgoing_message| {
@@ -78,6 +80,7 @@ fn loop(
7880
try file.writeAll(json_message);
7981
}
8082

83+
if (server.message_tracing_enabled) message_logger.info("received: {s}\n", .{json_message});
8184
server.processJsonRpc(json_message);
8285

8386
if (server.status == .exiting_success or server.status == .exiting_failure) return;
@@ -195,6 +198,7 @@ const ParseArgsResult = struct {
195198
config_path: ?[]const u8,
196199
replay_enabled: bool,
197200
replay_session_path: ?[]const u8,
201+
message_tracing_enabled: bool,
198202
};
199203

200204
fn parseArgs(allocator: std.mem.Allocator) !ParseArgsResult {
@@ -203,13 +207,15 @@ fn parseArgs(allocator: std.mem.Allocator) !ParseArgsResult {
203207
.config_path = null,
204208
.replay_enabled = false,
205209
.replay_session_path = null,
210+
.message_tracing_enabled = false,
206211
};
207212

208213
const ArgId = enum {
209214
help,
210215
version,
211216
replay,
212217
@"enable-debug-log",
218+
@"enable-message-tracing",
213219
@"show-config-path",
214220
@"config-path",
215221
};
@@ -236,6 +242,7 @@ fn parseArgs(allocator: std.mem.Allocator) !ParseArgsResult {
236242
.version = "Prints the compiler version with which the server was compiled.",
237243
.replay = "Replay a previous recorded zls session",
238244
.@"enable-debug-log" = "Enables debug logs.",
245+
.@"enable-message-tracing" = "Enables message tracing.",
239246
.@"config-path" = "Specify the path to a configuration file specifying LSP behaviour.",
240247
.@"show-config-path" = "Prints the path to the configuration file to stdout",
241248
});
@@ -281,6 +288,7 @@ fn parseArgs(allocator: std.mem.Allocator) !ParseArgsResult {
281288
.help,
282289
.version,
283290
.@"enable-debug-log",
291+
.@"enable-message-tracing",
284292
.@"show-config-path",
285293
=> {},
286294
.@"config-path" => {
@@ -310,6 +318,10 @@ fn parseArgs(allocator: std.mem.Allocator) !ParseArgsResult {
310318
actual_log_level = .debug;
311319
logger.info("Enabled debug logging.\n", .{});
312320
}
321+
if (specified.get(.@"enable-message-tracing")) {
322+
result.message_tracing_enabled = true;
323+
logger.info("Enabled message tracing.\n", .{});
324+
}
313325
if (specified.get(.@"config-path")) {
314326
std.debug.assert(result.config_path != null);
315327
}
@@ -390,6 +402,7 @@ pub fn main() !void {
390402
config.config_path,
391403
record_file != null,
392404
replay_file != null,
405+
result.message_tracing_enabled,
393406
);
394407
defer server.destroy();
395408

Diff for: tests/context.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub const Context = struct {
4141

4242
config.* = default_config;
4343

44-
const server = try Server.create(allocator, config, null, false, false);
44+
const server = try Server.create(allocator, config, null, false, false, false);
4545
errdefer server.destroy();
4646

4747
var context: Context = .{

0 commit comments

Comments
 (0)