LanguageClient: remove friend relationship between manager and plugin

Change-Id: I594d62615f365db34174c4bd1e6c8a9f6aeb545a
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2019-03-27 14:05:30 +01:00
parent 0161729c23
commit 37d0525953
4 changed files with 58 additions and 25 deletions

View File

@@ -26,6 +26,7 @@
#include "languageclientmanager.h" #include "languageclientmanager.h"
#include "languageclientutils.h" #include "languageclientutils.h"
#include "languageclientplugin.h"
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
@@ -49,45 +50,50 @@ namespace LanguageClient {
static LanguageClientManager *managerInstance = nullptr; static LanguageClientManager *managerInstance = nullptr;
LanguageClientManager::LanguageClientManager() LanguageClientManager::LanguageClientManager(QObject *parent)
: QObject (parent)
{ {
using namespace Core;
using namespace ProjectExplorer;
JsonRpcMessageHandler::registerMessageProvider<PublishDiagnosticsNotification>(); JsonRpcMessageHandler::registerMessageProvider<PublishDiagnosticsNotification>();
JsonRpcMessageHandler::registerMessageProvider<ApplyWorkspaceEditRequest>(); JsonRpcMessageHandler::registerMessageProvider<ApplyWorkspaceEditRequest>();
JsonRpcMessageHandler::registerMessageProvider<LogMessageNotification>(); JsonRpcMessageHandler::registerMessageProvider<LogMessageNotification>();
JsonRpcMessageHandler::registerMessageProvider<ShowMessageRequest>(); JsonRpcMessageHandler::registerMessageProvider<ShowMessageRequest>();
JsonRpcMessageHandler::registerMessageProvider<ShowMessageNotification>(); JsonRpcMessageHandler::registerMessageProvider<ShowMessageNotification>();
JsonRpcMessageHandler::registerMessageProvider<WorkSpaceFolderRequest>(); 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() LanguageClientManager::~LanguageClientManager()
{ {
QTC_ASSERT(m_clients.isEmpty(), qDeleteAll(m_clients)); QTC_ASSERT(m_clients.isEmpty(), qDeleteAll(m_clients));
managerInstance = nullptr;
} }
void LanguageClientManager::init() void LanguageClientManager::init()
{ {
using namespace Core; if (managerInstance)
using namespace ProjectExplorer; return;
QTC_ASSERT(managerInstance, return); QTC_ASSERT(LanguageClientPlugin::instance(), return);
connect(EditorManager::instance(), &EditorManager::editorOpened, managerInstance = new LanguageClientManager(LanguageClientPlugin::instance());
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);
} }
void LanguageClientManager::startClient(Client *client) void LanguageClientManager::startClient(Client *client)
{ {
QTC_ASSERT(managerInstance, return);
QTC_ASSERT(client, return); QTC_ASSERT(client, return);
if (managerInstance->m_shuttingDown) { if (managerInstance->m_shuttingDown) {
managerInstance->clientFinished(client); managerInstance->clientFinished(client);
@@ -106,16 +112,19 @@ void LanguageClientManager::startClient(Client *client)
QVector<Client *> LanguageClientManager::clients() QVector<Client *> LanguageClientManager::clients()
{ {
QTC_ASSERT(managerInstance, return {});
return managerInstance->m_clients; return managerInstance->m_clients;
} }
void LanguageClientManager::addExclusiveRequest(const MessageId &id, Client *client) void LanguageClientManager::addExclusiveRequest(const MessageId &id, Client *client)
{ {
QTC_ASSERT(managerInstance, return);
managerInstance->m_exclusiveRequests[id] << client; managerInstance->m_exclusiveRequests[id] << client;
} }
void LanguageClientManager::reportFinished(const MessageId &id, Client *byClient) void LanguageClientManager::reportFinished(const MessageId &id, Client *byClient)
{ {
QTC_ASSERT(managerInstance, return);
for (Client *client : managerInstance->m_exclusiveRequests[id]) { for (Client *client : managerInstance->m_exclusiveRequests[id]) {
if (client != byClient) if (client != byClient)
client->cancelRequest(id); client->cancelRequest(id);
@@ -125,6 +134,7 @@ void LanguageClientManager::reportFinished(const MessageId &id, Client *byClient
void LanguageClientManager::deleteClient(Client *client) void LanguageClientManager::deleteClient(Client *client)
{ {
QTC_ASSERT(managerInstance, return);
QTC_ASSERT(client, return); QTC_ASSERT(client, return);
client->disconnect(); client->disconnect();
managerInstance->m_clients.removeAll(client); managerInstance->m_clients.removeAll(client);
@@ -136,6 +146,7 @@ void LanguageClientManager::deleteClient(Client *client)
void LanguageClientManager::shutdown() void LanguageClientManager::shutdown()
{ {
QTC_ASSERT(managerInstance, return);
if (managerInstance->m_shuttingDown) if (managerInstance->m_shuttingDown)
return; return;
managerInstance->m_shuttingDown = true; managerInstance->m_shuttingDown = true;
@@ -160,6 +171,7 @@ LanguageClientManager *LanguageClientManager::instance()
QList<Client *> LanguageClientManager::clientsSupportingDocument( QList<Client *> LanguageClientManager::clientsSupportingDocument(
const TextEditor::TextDocument *doc) const TextEditor::TextDocument *doc)
{ {
QTC_ASSERT(managerInstance, return {});
QTC_ASSERT(doc, return {};); QTC_ASSERT(doc, return {};);
return Utils::filtered(managerInstance->reachableClients(), [doc](Client *client) { return Utils::filtered(managerInstance->reachableClients(), [doc](Client *client) {
return client->isSupportedDocument(doc); return client->isSupportedDocument(doc);

View File

@@ -73,7 +73,7 @@ signals:
void shutdownFinished(); void shutdownFinished();
private: private:
LanguageClientManager(); LanguageClientManager(QObject *parent);
void editorOpened(Core::IEditor *editor); void editorOpened(Core::IEditor *editor);
void documentOpened(Core::IDocument *document); void documentOpened(Core::IDocument *document);
@@ -95,7 +95,5 @@ private:
bool m_shuttingDown = false; bool m_shuttingDown = false;
QVector<Client *> m_clients; QVector<Client *> m_clients;
QHash<LanguageServerProtocol::MessageId, QList<Client *>> m_exclusiveRequests; QHash<LanguageServerProtocol::MessageId, QList<Client *>> m_exclusiveRequests;
friend class LanguageClientPlugin;
}; };
} // namespace LanguageClient } // namespace LanguageClient

View File

@@ -25,18 +25,37 @@
#include "languageclientplugin.h" #include "languageclientplugin.h"
#include "languageclientmanager.h"
#include "client.h" #include "client.h"
namespace LanguageClient { 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*/) bool LanguageClientPlugin::initialize(const QStringList & /*arguments*/, QString * /*errorString*/)
{ {
LanguageClientManager::init();
return true; return true;
} }
void LanguageClientPlugin::extensionsInitialized() void LanguageClientPlugin::extensionsInitialized()
{ {
LanguageClientManager::init();
LanguageClientSettings::init(); LanguageClientSettings::init();
} }
@@ -45,6 +64,8 @@ ExtensionSystem::IPlugin::ShutdownFlag LanguageClientPlugin::aboutToShutdown()
LanguageClientManager::shutdown(); LanguageClientManager::shutdown();
if (LanguageClientManager::clients().isEmpty()) if (LanguageClientManager::clients().isEmpty())
return ExtensionSystem::IPlugin::SynchronousShutdown; return ExtensionSystem::IPlugin::SynchronousShutdown;
QTC_ASSERT(LanguageClientManager::instance(),
return ExtensionSystem::IPlugin::SynchronousShutdown);
connect(LanguageClientManager::instance(), &LanguageClientManager::shutdownFinished, connect(LanguageClientManager::instance(), &LanguageClientManager::shutdownFinished,
this, &ExtensionSystem::IPlugin::asynchronousShutdownFinished); this, &ExtensionSystem::IPlugin::asynchronousShutdownFinished);
return ExtensionSystem::IPlugin::AsynchronousShutdown; return ExtensionSystem::IPlugin::AsynchronousShutdown;

View File

@@ -38,7 +38,10 @@ class LanguageClientPlugin : public ExtensionSystem::IPlugin
Q_OBJECT Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "LanguageClient.json") Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "LanguageClient.json")
public: public:
LanguageClientPlugin() = default; LanguageClientPlugin();
~LanguageClientPlugin() override;
static LanguageClientPlugin *instance();
// IPlugin interface // IPlugin interface
private: private:
@@ -47,7 +50,6 @@ private:
ShutdownFlag aboutToShutdown() override; ShutdownFlag aboutToShutdown() override;
private: private:
LanguageClientManager m_clientManager;
LanguageClientOutlineWidgetFactory m_outlineFactory; LanguageClientOutlineWidgetFactory m_outlineFactory;
}; };