diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 296cb9b2ad5..221264c6a39 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -861,9 +861,12 @@ QList Client::diagnosticsAt(const DocumentUri &uri, const QTextCurso return m_diagnosticManager.diagnosticsAt(uri, cursor); } -bool Client::start() +void Client::start() { - return m_clientInterface->start(); + if (m_clientInterface->start()) + LanguageClientManager::clientStarted(this); + else + LanguageClientManager::clientFinished(this); } bool Client::reset() diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index 2eac8ee2c03..8cafaaae900 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -151,7 +151,7 @@ public: const LanguageServerProtocol::DocumentUri &uri, const QTextCursor &cursor) const; - bool start(); + void start(); bool reset(); void log(const QString &message); diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 52dcf1133c9..54f46cd83d4 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -98,28 +98,46 @@ void LanguageClientManager::init() managerInstance = new LanguageClientManager(LanguageClientPlugin::instance()); } -void LanguageClientManager::startClient(Client *client) +void LanguageClientManager::clientStarted(Client *client) { QTC_ASSERT(managerInstance, return); QTC_ASSERT(client, return); if (managerInstance->m_shuttingDown) { - managerInstance->clientFinished(client); + clientFinished(client); return; } - if (!managerInstance->m_clients.contains(client)) - managerInstance->m_clients.append(client); connect(client, &Client::finished, managerInstance, [client](){ - managerInstance->clientFinished(client); + clientFinished(client); }); - if (client->start()) - client->initialize(); - else - managerInstance->clientFinished(client); - connect(client, &Client::initialized, &managerInstance->m_currentDocumentLocatorFilter, &DocumentLocatorFilter::updateCurrentClient); + + client->initialize(); +} + +void LanguageClientManager::clientFinished(Client *client) +{ + QTC_ASSERT(managerInstance, return); + constexpr int restartTimeoutS = 5; + const bool unexpectedFinish = client->state() != Client::Shutdown + && client->state() != Client::ShutdownRequested; + if (unexpectedFinish && !managerInstance->m_shuttingDown && client->reset()) { + client->disconnect(managerInstance); + client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); + QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { client->start(); }); + for (TextEditor::TextDocument *document : managerInstance->m_clientForDocument.keys(client)) + client->deactivateDocument(document); + } else { + if (unexpectedFinish && !managerInstance->m_shuttingDown) + client->log(tr("Unexpectedly finished.")); + for (TextEditor::TextDocument *document : managerInstance->m_clientForDocument.keys(client)) + managerInstance->m_clientForDocument.remove(document); + deleteClient(client); + if (managerInstance->m_shuttingDown && managerInstance->m_clients.isEmpty()) + emit managerInstance->shutdownFinished(); + } } Client *LanguageClientManager::startClient(BaseSettings *setting, ProjectExplorer::Project *project) @@ -130,7 +148,7 @@ Client *LanguageClientManager::startClient(BaseSettings *setting, ProjectExplore Client *client = setting->createClient(); QTC_ASSERT(client, return nullptr); client->setCurrentProject(project); - startClient(client); + client->start(); managerInstance->m_clientsForSetting[setting->m_id].append(client); return client; } @@ -380,28 +398,6 @@ QVector LanguageClientManager::reachableClients() return Utils::filtered(m_clients, &Client::reachable); } -void LanguageClientManager::clientFinished(Client *client) -{ - constexpr int restartTimeoutS = 5; - const bool unexpectedFinish = client->state() != Client::Shutdown - && client->state() != Client::ShutdownRequested; - if (unexpectedFinish && !m_shuttingDown && client->reset()) { - client->disconnect(this); - client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS)); - QTimer::singleShot(restartTimeoutS * 1000, client, [client]() { startClient(client); }); - for (TextEditor::TextDocument *document : m_clientForDocument.keys(client)) - client->deactivateDocument(document); - } else { - if (unexpectedFinish && !m_shuttingDown) - client->log(tr("Unexpectedly finished.")); - for (TextEditor::TextDocument *document : m_clientForDocument.keys(client)) - m_clientForDocument.remove(document); - deleteClient(client); - if (m_shuttingDown && m_clients.isEmpty()) - emit shutdownFinished(); - } -} - void LanguageClientManager::editorOpened(Core::IEditor *editor) { using namespace TextEditor; diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index 22c59e3a5cc..0867104e9c8 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -58,7 +58,8 @@ public: static void init(); - static void startClient(Client *client); + static void clientStarted(Client *client); + static void clientFinished(Client *client); static Client *startClient(BaseSettings *setting, ProjectExplorer::Project *project = nullptr); static QVector clients(); @@ -114,8 +115,6 @@ private: QVector reachableClients(); - void clientFinished(Client *client); - bool m_shuttingDown = false; QVector m_clients; QList m_currentSettings; // owned