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 "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);

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
};