Skip to content

Commit 5bfff2a

Browse files
xphoniexllogick
andauthored
check linkSupport when handling goto requests (#1389)
Starting from LSP 3.14.0, an optional flag `linkSupport` is introduced which changes the result type to LocationLink[] This patch makes `zls` backwards-compatible Signed-off-by: xphoniex <[email protected]> Co-authored-by: nullptrdevs <[email protected]> Co-authored-by: xphoniex <[email protected]>
1 parent c29ff3c commit 5bfff2a

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

src/Server.zig

+29-4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ const ClientCapabilities = packed struct {
6767
label_details_support: bool = false,
6868
supports_configuration: bool = false,
6969
supports_workspace_did_change_configuration_dynamic_registration: bool = false,
70+
supports_textDocument_definition_linkSupport: bool = false,
7071
};
7172

7273
pub const Error = error{
@@ -414,6 +415,9 @@ fn initializeHandler(server: *Server, _: std.mem.Allocator, request: types.Initi
414415
}
415416
}
416417
}
418+
if (textDocument.definition) |definition| {
419+
server.client_capabilities.supports_textDocument_definition_linkSupport = definition.linkSupport orelse false;
420+
}
417421
}
418422

419423
if (request.capabilities.workspace) |workspace| {
@@ -900,8 +904,20 @@ fn gotoHandler(
900904
var analyser = Analyser.init(server.allocator, &server.document_store, &server.ip);
901905
defer analyser.deinit();
902906

907+
const response = try goto.goto(&analyser, &server.document_store, arena, handle, source_index, kind, server.offset_encoding) orelse return null;
908+
if (server.client_capabilities.supports_textDocument_definition_linkSupport) {
909+
return .{
910+
.array_of_DefinitionLink = response,
911+
};
912+
}
913+
914+
var aol = try arena.alloc(types.Location, response.len);
915+
for (0..response.len) |index| {
916+
aol[index].uri = response[index].targetUri;
917+
aol[index].range = response[index].targetSelectionRange;
918+
}
903919
return .{
904-
.array_of_DefinitionLink = try goto.goto(&analyser, &server.document_store, arena, handle, source_index, kind, server.offset_encoding) orelse return null,
920+
.Definition = .{ .array_of_Location = aol },
905921
};
906922
}
907923

@@ -912,7 +928,10 @@ fn gotoTypeDefinitionHandler(server: *Server, arena: std.mem.Allocator, request:
912928
.workDoneToken = request.workDoneToken,
913929
.partialResultToken = request.partialResultToken,
914930
})) orelse return null;
915-
return .{ .array_of_DefinitionLink = response.array_of_DefinitionLink };
931+
return switch (response) {
932+
.array_of_DefinitionLink => |adl| .{ .array_of_DefinitionLink = adl },
933+
.Definition => |def| .{ .Definition = def },
934+
};
916935
}
917936

918937
fn gotoImplementationHandler(server: *Server, arena: std.mem.Allocator, request: types.ImplementationParams) Error!ResultType("textDocument/implementation") {
@@ -922,7 +941,10 @@ fn gotoImplementationHandler(server: *Server, arena: std.mem.Allocator, request:
922941
.workDoneToken = request.workDoneToken,
923942
.partialResultToken = request.partialResultToken,
924943
})) orelse return null;
925-
return .{ .array_of_DefinitionLink = response.array_of_DefinitionLink };
944+
return switch (response) {
945+
.array_of_DefinitionLink => |adl| .{ .array_of_DefinitionLink = adl },
946+
.Definition => |def| .{ .Definition = def },
947+
};
926948
}
927949

928950
fn gotoDeclarationHandler(server: *Server, arena: std.mem.Allocator, request: types.DeclarationParams) Error!ResultType("textDocument/declaration") {
@@ -932,7 +954,10 @@ fn gotoDeclarationHandler(server: *Server, arena: std.mem.Allocator, request: ty
932954
.workDoneToken = request.workDoneToken,
933955
.partialResultToken = request.partialResultToken,
934956
})) orelse return null;
935-
return .{ .array_of_DeclarationLink = response.array_of_DefinitionLink };
957+
return switch (response) {
958+
.array_of_DefinitionLink => |adl| .{ .array_of_DeclarationLink = adl },
959+
.Definition => |def| .{ .Declaration = .{ .array_of_Location = def.array_of_Location } },
960+
};
936961
}
937962

938963
pub fn hoverHandler(server: *Server, arena: std.mem.Allocator, request: types.HoverParams) Error!?types.Hover {

tests/context.zig

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ pub const Context = struct {
5252

5353
// TODO this line shouldn't be needed
5454
context.server.client_capabilities.label_details_support = false;
55+
context.server.client_capabilities.supports_textDocument_definition_linkSupport = true;
5556

5657
return context;
5758
}

0 commit comments

Comments
 (0)