forked from qt-creator/qt-creator
LanguageClient: remove friend relationship between manager and plugin
Change-Id: I594d62615f365db34174c4bd1e6c8a9f6aeb545a Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user