From 37d0525953593ba99f518819fa4be420a845c690 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 27 Mar 2019 14:05:30 +0100 Subject: LanguageClient: remove friend relationship between manager and plugin Change-Id: I594d62615f365db34174c4bd1e6c8a9f6aeb545a Reviewed-by: Christian Stenger --- .../languageclient/languageclientmanager.cpp | 50 ++++++++++++++-------- src/plugins/languageclient/languageclientmanager.h | 4 +- .../languageclient/languageclientplugin.cpp | 23 +++++++++- src/plugins/languageclient/languageclientplugin.h | 6 ++- 4 files changed, 58 insertions(+), 25 deletions(-) (limited to 'src/plugins/languageclient') diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 1af88ea8c7..7da32eda19 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -26,6 +26,7 @@ #include "languageclientmanager.h" #include "languageclientutils.h" +#include "languageclientplugin.h" #include #include @@ -49,45 +50,50 @@ namespace LanguageClient { static LanguageClientManager *managerInstance = nullptr; -LanguageClientManager::LanguageClientManager() +LanguageClientManager::LanguageClientManager(QObject *parent) + : QObject (parent) { + using namespace Core; + using namespace ProjectExplorer; JsonRpcMessageHandler::registerMessageProvider(); JsonRpcMessageHandler::registerMessageProvider(); JsonRpcMessageHandler::registerMessageProvider(); JsonRpcMessageHandler::registerMessageProvider(); JsonRpcMessageHandler::registerMessageProvider(); JsonRpcMessageHandler::registerMessageProvider(); - managerInstance = this; + connect(EditorManager::instance(), &EditorManager::editorOpened, + this, &LanguageClientManager::editorOpened); + connect(EditorManager::instance(), &EditorManager::documentOpened, + this, &LanguageClientManager::documentOpened); + connect(EditorManager::instance(), &EditorManager::documentClosed, + this, &LanguageClientManager::documentClosed); + connect(EditorManager::instance(), &EditorManager::saved, + this, &LanguageClientManager::documentContentsSaved); + connect(EditorManager::instance(), &EditorManager::aboutToSave, + this, &LanguageClientManager::documentWillSave); + connect(SessionManager::instance(), &SessionManager::projectAdded, + this, &LanguageClientManager::projectAdded); + connect(SessionManager::instance(), &SessionManager::projectRemoved, + this, &LanguageClientManager::projectRemoved); } LanguageClientManager::~LanguageClientManager() { QTC_ASSERT(m_clients.isEmpty(), qDeleteAll(m_clients)); + managerInstance = nullptr; } void LanguageClientManager::init() { - using namespace Core; - using namespace ProjectExplorer; - QTC_ASSERT(managerInstance, return); - connect(EditorManager::instance(), &EditorManager::editorOpened, - managerInstance, &LanguageClientManager::editorOpened); - connect(EditorManager::instance(), &EditorManager::documentOpened, - managerInstance, &LanguageClientManager::documentOpened); - connect(EditorManager::instance(), &EditorManager::documentClosed, - managerInstance, &LanguageClientManager::documentClosed); - connect(EditorManager::instance(), &EditorManager::saved, - managerInstance, &LanguageClientManager::documentContentsSaved); - connect(EditorManager::instance(), &EditorManager::aboutToSave, - managerInstance, &LanguageClientManager::documentWillSave); - connect(SessionManager::instance(), &SessionManager::projectAdded, - managerInstance, &LanguageClientManager::projectAdded); - connect(SessionManager::instance(), &SessionManager::projectRemoved, - managerInstance, &LanguageClientManager::projectRemoved); + if (managerInstance) + return; + QTC_ASSERT(LanguageClientPlugin::instance(), return); + managerInstance = new LanguageClientManager(LanguageClientPlugin::instance()); } void LanguageClientManager::startClient(Client *client) { + QTC_ASSERT(managerInstance, return); QTC_ASSERT(client, return); if (managerInstance->m_shuttingDown) { managerInstance->clientFinished(client); @@ -106,16 +112,19 @@ void LanguageClientManager::startClient(Client *client) QVector LanguageClientManager::clients() { + QTC_ASSERT(managerInstance, return {}); return managerInstance->m_clients; } void LanguageClientManager::addExclusiveRequest(const MessageId &id, Client *client) { + QTC_ASSERT(managerInstance, return); managerInstance->m_exclusiveRequests[id] << client; } void LanguageClientManager::reportFinished(const MessageId &id, Client *byClient) { + QTC_ASSERT(managerInstance, return); for (Client *client : managerInstance->m_exclusiveRequests[id]) { if (client != byClient) client->cancelRequest(id); @@ -125,6 +134,7 @@ void LanguageClientManager::reportFinished(const MessageId &id, Client *byClient void LanguageClientManager::deleteClient(Client *client) { + QTC_ASSERT(managerInstance, return); QTC_ASSERT(client, return); client->disconnect(); managerInstance->m_clients.removeAll(client); @@ -136,6 +146,7 @@ void LanguageClientManager::deleteClient(Client *client) void LanguageClientManager::shutdown() { + QTC_ASSERT(managerInstance, return); if (managerInstance->m_shuttingDown) return; managerInstance->m_shuttingDown = true; @@ -160,6 +171,7 @@ LanguageClientManager *LanguageClientManager::instance() QList LanguageClientManager::clientsSupportingDocument( const TextEditor::TextDocument *doc) { + QTC_ASSERT(managerInstance, return {}); QTC_ASSERT(doc, return {};); return Utils::filtered(managerInstance->reachableClients(), [doc](Client *client) { return client->isSupportedDocument(doc); diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index 9f075a94b3..7a8e83caa2 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -73,7 +73,7 @@ signals: void shutdownFinished(); private: - LanguageClientManager(); + LanguageClientManager(QObject *parent); void editorOpened(Core::IEditor *editor); void documentOpened(Core::IDocument *document); @@ -95,7 +95,5 @@ private: bool m_shuttingDown = false; QVector m_clients; QHash> m_exclusiveRequests; - - friend class LanguageClientPlugin; }; } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientplugin.cpp b/src/plugins/languageclient/languageclientplugin.cpp index 1d64097e62..31643474f6 100644 --- a/src/plugins/languageclient/languageclientplugin.cpp +++ b/src/plugins/languageclient/languageclientplugin.cpp @@ -25,18 +25,37 @@ #include "languageclientplugin.h" +#include "languageclientmanager.h" + #include "client.h" namespace LanguageClient { +static LanguageClientPlugin *m_instance = nullptr; + +LanguageClientPlugin::LanguageClientPlugin() +{ + m_instance = this; +} + +LanguageClientPlugin::~LanguageClientPlugin() +{ + m_instance = nullptr; +} + +LanguageClientPlugin *LanguageClientPlugin::instance() +{ + return m_instance; +} + bool LanguageClientPlugin::initialize(const QStringList & /*arguments*/, QString * /*errorString*/) { + LanguageClientManager::init(); return true; } void LanguageClientPlugin::extensionsInitialized() { - LanguageClientManager::init(); LanguageClientSettings::init(); } @@ -45,6 +64,8 @@ ExtensionSystem::IPlugin::ShutdownFlag LanguageClientPlugin::aboutToShutdown() LanguageClientManager::shutdown(); if (LanguageClientManager::clients().isEmpty()) return ExtensionSystem::IPlugin::SynchronousShutdown; + QTC_ASSERT(LanguageClientManager::instance(), + return ExtensionSystem::IPlugin::SynchronousShutdown); connect(LanguageClientManager::instance(), &LanguageClientManager::shutdownFinished, this, &ExtensionSystem::IPlugin::asynchronousShutdownFinished); return ExtensionSystem::IPlugin::AsynchronousShutdown; diff --git a/src/plugins/languageclient/languageclientplugin.h b/src/plugins/languageclient/languageclientplugin.h index 2cff52cd7b..8fbf66de03 100644 --- a/src/plugins/languageclient/languageclientplugin.h +++ b/src/plugins/languageclient/languageclientplugin.h @@ -38,7 +38,10 @@ class LanguageClientPlugin : public ExtensionSystem::IPlugin Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "LanguageClient.json") public: - LanguageClientPlugin() = default; + LanguageClientPlugin(); + ~LanguageClientPlugin() override; + + static LanguageClientPlugin *instance(); // IPlugin interface private: @@ -47,7 +50,6 @@ private: ShutdownFlag aboutToShutdown() override; private: - LanguageClientManager m_clientManager; LanguageClientOutlineWidgetFactory m_outlineFactory; }; -- cgit v1.2.1