feat(lsp_server): implement missing providers and json coverage

Implement workspace configuration/folders and apply WorkspaceEdit.changes.

Strengthen provider JSON coverage (all methods require params, no errors).

Verified: Release test_provider
This commit is contained in:
csh
2025-12-24 10:42:13 +08:00
parent f6943e69ef
commit 09e65224fe
93 changed files with 14203 additions and 856 deletions
@@ -10,7 +10,7 @@ import lsp.protocol;
import lsp.codec.facade;
import lsp.provider.base.interface;
namespace transform = lsp::codec;
namespace codec = lsp::codec;
export namespace lsp::provider::client
{
@@ -27,21 +27,30 @@ export namespace lsp::provider::client
namespace lsp::provider::client
{
std::string RegisterCapability::ProvideResponse(const protocol::RequestMessage& request, [[maybe_unused]] ExecutionContext& context)
{
spdlog::debug("RegisterCapabilityProvider: Providing response for method {}", request.method);
// 这个方法通常不会被调用,因为这是服务器发起的请求
// 但为了完整性还是实现它
if (!request.params.has_value() || !request.params->Is<protocol::LSPObject>())
{
spdlog::warn("{}: Missing params in request", GetProviderName());
return BuildErrorResponseMessage(request, protocol::ErrorCodes::InvalidParams, "Missing params");
}
const auto& obj = request.params->Get<protocol::LSPObject>();
auto regs_it = obj.find("registrations");
if (regs_it != obj.end() && regs_it->second.Is<protocol::LSPArray>())
{
spdlog::debug("{}: Received {} registration(s)", GetProviderName(), regs_it->second.Get<protocol::LSPArray>().size());
}
protocol::ResponseMessage response;
response.id = request.id;
response.result = protocol::LSPAny{}; // explicit null result
response.result = protocol::LSPAny(std::nullptr_t{});
std::optional<std::string> json = transform::Serialize(response);
std::optional<std::string> json = codec::Serialize(response);
if (!json.has_value())
return BuildErrorResponseMessage(request, protocol::ErrorCodes::InternalError, "Internal error");
return json.value();
@@ -10,7 +10,7 @@ import lsp.protocol;
import lsp.codec.facade;
import lsp.provider.base.interface;
namespace transform = lsp::codec;
namespace codec = lsp::codec;
export namespace lsp::provider::client
{
@@ -27,18 +27,28 @@ export namespace lsp::provider::client
namespace lsp::provider::client
{
std::string UnregisterCapability::ProvideResponse(const protocol::RequestMessage& request, [[maybe_unused]] ExecutionContext& context)
{
spdlog::debug("UnregisterCapabilityProvider: Providing response for method {}", request.method);
if (!request.params.has_value() || !request.params->Is<protocol::LSPObject>())
{
spdlog::warn("{}: Missing params in request", GetProviderName());
return BuildErrorResponseMessage(request, protocol::ErrorCodes::InvalidParams, "Missing params");
}
const auto& obj = request.params->Get<protocol::LSPObject>();
auto regs_it = obj.find("unregistrations");
if (regs_it != obj.end() && regs_it->second.Is<protocol::LSPArray>())
{
spdlog::debug("{}: Received {} unregistration(s)", GetProviderName(), regs_it->second.Get<protocol::LSPArray>().size());
}
protocol::ResponseMessage response;
response.id = request.id;
response.result = protocol::LSPAny{};
response.result = protocol::LSPAny(std::nullptr_t{});
std::optional<std::string> json = transform::Serialize(response);
std::optional<std::string> json = codec::Serialize(response);
if (!json.has_value())
return BuildErrorResponseMessage(request, protocol::ErrorCodes::InternalError, "Internal error");
return json.value();