🐛 fix: support LSP request id variants
This commit is contained in:
parent
8e564fc8bb
commit
1de97aace5
|
|
@ -47,7 +47,7 @@ export namespace lsp::codec
|
||||||
namespace debug
|
namespace debug
|
||||||
{
|
{
|
||||||
std::string GetTypeName(const protocol::LSPAny& any);
|
std::string GetTypeName(const protocol::LSPAny& any);
|
||||||
std::string GetIdString(const std::variant<int, std::string>& id);
|
std::string GetIdString(const protocol::RequestId& id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -134,10 +134,10 @@ namespace lsp::codec
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string GetIdString(const std::variant<int, std::string>& id)
|
inline std::string GetIdString(const protocol::RequestId& id)
|
||||||
{
|
{
|
||||||
return std::visit([](const auto& value) -> std::string {
|
return std::visit([](const auto& value) -> std::string {
|
||||||
if constexpr (std::is_same_v<std::decay_t<decltype(value)>, int>)
|
if constexpr (std::is_same_v<std::decay_t<decltype(value)>, protocol::integer>)
|
||||||
return std::to_string(value);
|
return std::to_string(value);
|
||||||
else
|
else
|
||||||
return value;
|
return value;
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,10 @@ namespace lsp::codec
|
||||||
{
|
{
|
||||||
if (any.Is<protocol::decimal>())
|
if (any.Is<protocol::decimal>())
|
||||||
return static_cast<T>(any.Get<protocol::decimal>());
|
return static_cast<T>(any.Get<protocol::decimal>());
|
||||||
|
if (any.Is<protocol::integer>())
|
||||||
|
return static_cast<T>(any.Get<protocol::integer>());
|
||||||
|
if (any.Is<protocol::uinteger>())
|
||||||
|
return static_cast<T>(any.Get<protocol::uinteger>());
|
||||||
}
|
}
|
||||||
|
|
||||||
throw ConversionError("LSPAny does not contain a compatible numeric type");
|
throw ConversionError("LSPAny does not contain a compatible numeric type");
|
||||||
|
|
|
||||||
|
|
@ -315,7 +315,9 @@ namespace lsp::core
|
||||||
|
|
||||||
void LspServer::HandleResponse(const protocol::ResponseMessage& response)
|
void LspServer::HandleResponse(const protocol::ResponseMessage& response)
|
||||||
{
|
{
|
||||||
const std::string id = response.id.value_or("<no id>");
|
std::string id = "<no id>";
|
||||||
|
if (response.id.has_value())
|
||||||
|
id = transform::debug::GetIdString(response.id.value());
|
||||||
spdlog::debug("Received response: {}", id);
|
spdlog::debug("Received response: {}", id);
|
||||||
// 当前服务器作为 client 的场景较少,这里暂时不处理
|
// 当前服务器作为 client 的场景较少,这里暂时不处理
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ export namespace lsp::protocol
|
||||||
using URI = string;
|
using URI = string;
|
||||||
using DocumentUri = string;
|
using DocumentUri = string;
|
||||||
using ProgressToken = std::variant<string, integer>;
|
using ProgressToken = std::variant<string, integer>;
|
||||||
|
using RequestId = std::variant<integer, string>;
|
||||||
|
|
||||||
struct LSPAny;
|
struct LSPAny;
|
||||||
using LSPObject = std::map<string, LSPAny>;
|
using LSPObject = std::map<string, LSPAny>;
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ export namespace lsp::protocol
|
||||||
struct RequestMessage
|
struct RequestMessage
|
||||||
{
|
{
|
||||||
string jsonrpc = "2.0";
|
string jsonrpc = "2.0";
|
||||||
string id;
|
RequestId id;
|
||||||
string method;
|
string method;
|
||||||
std::optional<LSPAny> params;
|
std::optional<LSPAny> params;
|
||||||
};
|
};
|
||||||
|
|
@ -48,7 +48,7 @@ export namespace lsp::protocol
|
||||||
struct ResponseMessage
|
struct ResponseMessage
|
||||||
{
|
{
|
||||||
string jsonrpc = "2.0";
|
string jsonrpc = "2.0";
|
||||||
std::optional<string> id;
|
std::optional<RequestId> id;
|
||||||
std::optional<LSPAny> result;
|
std::optional<LSPAny> result;
|
||||||
std::optional<ResponseError> error;
|
std::optional<ResponseError> error;
|
||||||
};
|
};
|
||||||
|
|
@ -64,6 +64,6 @@ export namespace lsp::protocol
|
||||||
struct CancelParams
|
struct CancelParams
|
||||||
{
|
{
|
||||||
// The request id to cancel.
|
// The request id to cancel.
|
||||||
std::variant<int, std::string> id; // integer | string
|
RequestId id; // integer | string
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -403,7 +403,7 @@ namespace lsp::test
|
||||||
TestResult result;
|
TestResult result;
|
||||||
result.passed = true;
|
result.passed = true;
|
||||||
|
|
||||||
std::variant<int, std::string> id = 123;
|
protocol::RequestId id = static_cast<protocol::integer>(123);
|
||||||
std::string id_str = transform::debug::GetIdString(id);
|
std::string id_str = transform::debug::GetIdString(id);
|
||||||
assertEqual(std::string("123"), id_str, "int id应该转换为'123'");
|
assertEqual(std::string("123"), id_str, "int id应该转换为'123'");
|
||||||
|
|
||||||
|
|
@ -416,7 +416,7 @@ namespace lsp::test
|
||||||
TestResult result;
|
TestResult result;
|
||||||
result.passed = true;
|
result.passed = true;
|
||||||
|
|
||||||
std::variant<int, std::string> id = std::string("abc-123-def");
|
protocol::RequestId id = std::string("abc-123-def");
|
||||||
std::string id_str = transform::debug::GetIdString(id);
|
std::string id_str = transform::debug::GetIdString(id);
|
||||||
assertEqual(std::string("abc-123-def"), id_str, "string id应该保持为'abc-123-def'");
|
assertEqual(std::string("abc-123-def"), id_str, "string id应该保持为'abc-123-def'");
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue