From 1de97aace567b57e9cc8ebb10d87d2f05b302761 Mon Sep 17 00:00:00 2001 From: csh Date: Sun, 21 Dec 2025 15:38:46 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix:=20support=20LSP=20request?= =?UTF-8?q?=20id=20variants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsp-server/src/codec/facade.cppm | 6 +++--- lsp-server/src/codec/transformer.cppm | 4 ++++ lsp-server/src/core/server.cppm | 4 +++- lsp-server/src/protocol/common/basic_types.cppm | 1 + lsp-server/src/protocol/common/message.cppm | 6 +++--- lsp-server/test/test_lsp_any/facade_test.cppm | 4 ++-- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/lsp-server/src/codec/facade.cppm b/lsp-server/src/codec/facade.cppm index c981626..4f2d3ed 100644 --- a/lsp-server/src/codec/facade.cppm +++ b/lsp-server/src/codec/facade.cppm @@ -47,7 +47,7 @@ export namespace lsp::codec namespace debug { std::string GetTypeName(const protocol::LSPAny& any); - std::string GetIdString(const std::variant& id); + std::string GetIdString(const protocol::RequestId& id); } } @@ -134,10 +134,10 @@ namespace lsp::codec return "unknown"; } - inline std::string GetIdString(const std::variant& id) + inline std::string GetIdString(const protocol::RequestId& id) { return std::visit([](const auto& value) -> std::string { - if constexpr (std::is_same_v, int>) + if constexpr (std::is_same_v, protocol::integer>) return std::to_string(value); else return value; diff --git a/lsp-server/src/codec/transformer.cppm b/lsp-server/src/codec/transformer.cppm index 7b5d82d..cea3e24 100644 --- a/lsp-server/src/codec/transformer.cppm +++ b/lsp-server/src/codec/transformer.cppm @@ -189,6 +189,10 @@ namespace lsp::codec { if (any.Is()) return static_cast(any.Get()); + if (any.Is()) + return static_cast(any.Get()); + if (any.Is()) + return static_cast(any.Get()); } throw ConversionError("LSPAny does not contain a compatible numeric type"); diff --git a/lsp-server/src/core/server.cppm b/lsp-server/src/core/server.cppm index 239ab9b..feeaad5 100644 --- a/lsp-server/src/core/server.cppm +++ b/lsp-server/src/core/server.cppm @@ -315,7 +315,9 @@ namespace lsp::core void LspServer::HandleResponse(const protocol::ResponseMessage& response) { - const std::string id = response.id.value_or(""); + std::string id = ""; + if (response.id.has_value()) + id = transform::debug::GetIdString(response.id.value()); spdlog::debug("Received response: {}", id); // 当前服务器作为 client 的场景较少,这里暂时不处理 } diff --git a/lsp-server/src/protocol/common/basic_types.cppm b/lsp-server/src/protocol/common/basic_types.cppm index 0d17f21..5817a31 100644 --- a/lsp-server/src/protocol/common/basic_types.cppm +++ b/lsp-server/src/protocol/common/basic_types.cppm @@ -16,6 +16,7 @@ export namespace lsp::protocol using URI = string; using DocumentUri = string; using ProgressToken = std::variant; + using RequestId = std::variant; struct LSPAny; using LSPObject = std::map; diff --git a/lsp-server/src/protocol/common/message.cppm b/lsp-server/src/protocol/common/message.cppm index d132766..bfebc60 100644 --- a/lsp-server/src/protocol/common/message.cppm +++ b/lsp-server/src/protocol/common/message.cppm @@ -32,7 +32,7 @@ export namespace lsp::protocol struct RequestMessage { string jsonrpc = "2.0"; - string id; + RequestId id; string method; std::optional params; }; @@ -48,7 +48,7 @@ export namespace lsp::protocol struct ResponseMessage { string jsonrpc = "2.0"; - std::optional id; + std::optional id; std::optional result; std::optional error; }; @@ -64,6 +64,6 @@ export namespace lsp::protocol struct CancelParams { // The request id to cancel. - std::variant id; // integer | string + RequestId id; // integer | string }; } diff --git a/lsp-server/test/test_lsp_any/facade_test.cppm b/lsp-server/test/test_lsp_any/facade_test.cppm index 3b1c981..6f97eb6 100644 --- a/lsp-server/test/test_lsp_any/facade_test.cppm +++ b/lsp-server/test/test_lsp_any/facade_test.cppm @@ -403,7 +403,7 @@ namespace lsp::test TestResult result; result.passed = true; - std::variant id = 123; + protocol::RequestId id = static_cast(123); std::string id_str = transform::debug::GetIdString(id); assertEqual(std::string("123"), id_str, "int id应该转换为'123'"); @@ -416,7 +416,7 @@ namespace lsp::test TestResult result; result.passed = true; - std::variant id = std::string("abc-123-def"); + protocol::RequestId id = std::string("abc-123-def"); std::string id_str = transform::debug::GetIdString(id); assertEqual(std::string("abc-123-def"), id_str, "string id应该保持为'abc-123-def'");