diff options
author | Lukasz Papierkowski <[email protected]> | 2024-07-19 11:44:26 +0200 |
---|---|---|
committer | lie <[email protected]> | 2024-07-19 13:33:29 +0000 |
commit | f4d8eaca00a66abe1ffd0951a5ef8c251a7c24c2 (patch) | |
tree | 1e703f3f86bf715331dec4dd4c73ab8424fa31f2 /src/plugins/languageclient/lualanguageclient | |
parent | a858e305d5fe17234d24e73928b32021ef0c2a9d (diff) |
LUA: Client and Utils bindings update
Change-Id: Icad01906aa9f9405004ce342399fcb42354e77df
Reviewed-by: Marcus Tillmanns <[email protected]>
Reviewed-by: <[email protected]>
Diffstat (limited to 'src/plugins/languageclient/lualanguageclient')
-rw-r--r-- | src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp | 91 |
1 files changed, 80 insertions, 11 deletions
diff --git a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp index f872c8d07c2..1d226feee97 100644 --- a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp +++ b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp @@ -26,6 +26,43 @@ using namespace Core; using namespace TextEditor; using namespace ProjectExplorer; +namespace { + +class RequestWithResponse : public LanguageServerProtocol::JsonRpcMessage +{ + sol::function m_callback; + LanguageServerProtocol::MessageId m_id; + +public: + RequestWithResponse(const QJsonObject &obj, const sol::function &cb) + : LanguageServerProtocol::JsonRpcMessage(obj) + , m_callback(cb) + { + m_id = LanguageServerProtocol::MessageId(obj["id"]); + } + + std::optional<LanguageServerProtocol::ResponseHandler> responseHandler() const override + { + if (!m_id.isValid()) + qWarning() << "Invalid 'id' in request:" << toJsonObject(); + return std::nullopt; + + return LanguageServerProtocol::ResponseHandler{ + m_id, [callback = m_callback](const JsonRpcMessage &msg) { + if (!callback.valid()) { + qWarning() << "Invalid Lua callback"; + return; + } + + auto result = ::Lua::LuaEngine::void_safe_call( + callback, ::Lua::LuaEngine::toTable(callback.lua_state(), msg.toJsonObject())); + QTC_CHECK_EXPECTED(result); + }}; + } +}; + +} // anonymous namespace + namespace LanguageClient::Lua { static void registerLuaApi(); @@ -73,14 +110,16 @@ public: } m_process = new Process; m_process->setProcessMode(ProcessMode::Writer); - connect(m_process, - &Process::readyReadStandardError, - this, - &LuaLocalSocketClientInterface::readError); - connect(m_process, - &Process::readyReadStandardOutput, - this, - &LuaLocalSocketClientInterface::readOutput); + connect( + m_process, + &Process::readyReadStandardError, + this, + &LuaLocalSocketClientInterface::readError); + connect( + m_process, + &Process::readyReadStandardOutput, + this, + &LuaLocalSocketClientInterface::readOutput); connect(m_process, &Process::started, this, [this]() { this->LocalSocketClientInterface::startImpl(); emit started(); @@ -348,15 +387,24 @@ public: } } - void sendMessage(const sol::table &message) + void sendMessage(const sol::table &message, const sol::function &callback) { const QJsonValue messageValue = ::Lua::LuaEngine::toJson(message); if (!messageValue.isObject()) throw sol::error("Message is not an object"); - const LanguageServerProtocol::JsonRpcMessage jsonrpcmessage(messageValue.toObject()); + + auto make_request = [&]() -> std::unique_ptr<LanguageServerProtocol::JsonRpcMessage> { + if (callback.valid()) { + return std::make_unique<RequestWithResponse>(messageValue.toObject(), callback); + } + + return std::make_unique<LanguageServerProtocol::JsonRpcMessage>(messageValue.toObject()); + }; + + auto const request = make_request(); for (Client *c : LanguageClientManager::clientsForSettingId(m_settingsTypeId.toString())) { if (c) - c->sendMessage(jsonrpcmessage); + c->sendMessage(*request); } } @@ -545,6 +593,27 @@ static void registerLuaApi() LanguageClientSettings::registerClientType(type); return luaClient; + }, + "documentVersion", + [](const Utils::FilePath &path) -> int { + auto client = LanguageClientManager::clientForFilePath(path); + if (!client) { + qWarning() << "documentVersion(). No client for file path:" << path; + return -1; + } + + return client->documentVersion(path); + }, + + "hostPathToServerUri", + [](const Utils::FilePath &path) -> QString { + auto client = LanguageClientManager::clientForFilePath(path); + if (!client) { + qWarning() << "hostPathToServerUri(). No client for file path:" << path; + return {}; + } + + return client->hostPathToServerUri(path).toString(); }); return result; |