diff options
author | David Schulz <david.schulz@qt.io> | 2019-03-27 14:05:30 +0100 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2019-04-04 08:18:41 +0000 |
commit | 37d0525953593ba99f518819fa4be420a845c690 (patch) | |
tree | 0835b4de6a3f58a81092d560e51d0b33b800fbbd /src/plugins/languageclient | |
parent | 0161729c23fd86175a9f3c30c2d75d05f9081740 (diff) | |
download | qt-creator-37d0525953593ba99f518819fa4be420a845c690.tar.gz |
LanguageClient: remove friend relationship between manager and plugin
Change-Id: I594d62615f365db34174c4bd1e6c8a9f6aeb545a
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/languageclient')
4 files changed, 58 insertions, 25 deletions
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 <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/ieditor.h> @@ -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<PublishDiagnosticsNotification>(); JsonRpcMessageHandler::registerMessageProvider<ApplyWorkspaceEditRequest>(); JsonRpcMessageHandler::registerMessageProvider<LogMessageNotification>(); JsonRpcMessageHandler::registerMessageProvider<ShowMessageRequest>(); JsonRpcMessageHandler::registerMessageProvider<ShowMessageNotification>(); JsonRpcMessageHandler::registerMessageProvider<WorkSpaceFolderRequest>(); - 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<Client *> 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<Client *> 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<Client *> m_clients; QHash<LanguageServerProtocol::MessageId, QList<Client *>> 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; }; |