LanguageClient: add LanguageClientManager to object pool

instead of the language client plugin and make sure the same
functionality is still reachable from the outside.

Change-Id: Idff8db221e03afb4100c2e4879b7dfeb3e14e59b
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
David Schulz
2024-01-26 11:47:27 +01:00
parent 6218520b63
commit 73c03faa2d
4 changed files with 29 additions and 59 deletions

View File

@@ -54,9 +54,9 @@ using namespace Utils;
namespace ClangFormat { namespace ClangFormat {
static QObject *languageClientPlugin() static QObject *languageClientManager()
{ {
return ExtensionSystem::PluginManager::getObjectByName("LanguageClient"); return ExtensionSystem::PluginManager::getObjectByName("LanguageClientManager");
} }
class ClangFormatConfigWidget final : public TextEditor::CodeStyleEditorWidget class ClangFormatConfigWidget final : public TextEditor::CodeStyleEditorWidget
@@ -69,11 +69,8 @@ public:
~ClangFormatConfigWidget() ~ClangFormatConfigWidget()
{ {
auto doc = qobject_cast<TextEditor::TextDocument *>(m_editor->document()); auto doc = qobject_cast<TextEditor::TextDocument *>(m_editor->document());
QMetaObject::invokeMethod(languageClientPlugin(), QMetaObject::invokeMethod(languageClientManager(),
"closeClientForDocument", "documentClosed",
Q_ARG(TextEditor::TextDocument *, doc));
QMetaObject::invokeMethod(languageClientPlugin(),
"closeDocument",
Q_ARG(Core::IDocument *, doc)); Q_ARG(Core::IDocument *, doc));
} }
@@ -181,11 +178,11 @@ void ClangFormatConfigWidget::initEditor(TextEditor::ICodeStylePreferences *code
m_editor->document()->open(&errorString, m_config->filePath(), m_config->filePath()); m_editor->document()->open(&errorString, m_config->filePath(), m_config->filePath());
m_editor->widget()->adjustSize(); m_editor->widget()->adjustSize();
QMetaObject::invokeMethod(languageClientPlugin(), QMetaObject::invokeMethod(languageClientManager(),
"openDocument", "documentOpened",
Q_ARG(Core::IDocument *, m_editor->document())); Q_ARG(Core::IDocument *, m_editor->document()));
QMetaObject::invokeMethod(languageClientPlugin(), QMetaObject::invokeMethod(languageClientManager(),
"openEditor", "editorOpened",
Q_ARG(Core::IEditor *, m_editor)); Q_ARG(Core::IEditor *, m_editor));
m_editorWidget = m_editor->widget(); m_editorWidget = m_editor->widget();
@@ -337,8 +334,8 @@ void ClangFormatConfigWidget::reopenClangFormatDocument()
QString errorString; QString errorString;
if (m_editor->document()->open(&errorString, m_config->filePath(), m_config->filePath()) if (m_editor->document()->open(&errorString, m_config->filePath(), m_config->filePath())
== Core::IDocument::OpenResult::Success) { == Core::IDocument::OpenResult::Success) {
QMetaObject::invokeMethod(languageClientPlugin(), QMetaObject::invokeMethod(languageClientManager(),
"openDocument", "documentOpened",
Q_ARG(Core::IDocument *, m_editor->document())); Q_ARG(Core::IDocument *, m_editor->document()));
} }
} }

View File

@@ -53,6 +53,8 @@ class LanguageClientManagerPrivate
LanguageClientManager::LanguageClientManager(QObject *parent) LanguageClientManager::LanguageClientManager(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
setObjectName("LanguageClientManager");
managerInstance = this; managerInstance = this;
d.reset(new LanguageClientManagerPrivate); d.reset(new LanguageClientManagerPrivate);
using namespace Core; using namespace Core;
@@ -67,10 +69,13 @@ LanguageClientManager::LanguageClientManager(QObject *parent)
this, &LanguageClientManager::projectAdded); this, &LanguageClientManager::projectAdded);
connect(ProjectManager::instance(), &ProjectManager::projectRemoved, connect(ProjectManager::instance(), &ProjectManager::projectRemoved,
this, [&](Project *project) { project->disconnect(this); }); this, [&](Project *project) { project->disconnect(this); });
ExtensionSystem::PluginManager::addObject(this);
} }
LanguageClientManager::~LanguageClientManager() LanguageClientManager::~LanguageClientManager()
{ {
ExtensionSystem::PluginManager::removeObject(this);
QTC_ASSERT(m_clients.isEmpty(), qDeleteAll(m_clients)); QTC_ASSERT(m_clients.isEmpty(), qDeleteAll(m_clients));
qDeleteAll(m_currentSettings); qDeleteAll(m_currentSettings);
managerInstance = nullptr; managerInstance = nullptr;
@@ -537,21 +542,6 @@ void LanguageClientManager::editorOpened(Core::IEditor *editor)
} }
} }
void LanguageClientManager::openEditor(Core::IEditor *editor)
{
instance()->editorOpened(editor);
}
void LanguageClientManager::openDocument(Core::IDocument *document)
{
instance()->documentOpened(document);
}
void LanguageClientManager::closeDocument(Core::IDocument *document)
{
instance()->documentClosed(document);
}
static QList<BaseSettings *> sortedSettingsForDocument(Core::IDocument *document) static QList<BaseSettings *> sortedSettingsForDocument(Core::IDocument *document)
{ {
const QList<BaseSettings *> prefilteredSettings const QList<BaseSettings *> prefilteredSettings
@@ -632,8 +622,13 @@ void LanguageClientManager::documentOpened(Core::IDocument *document)
void LanguageClientManager::documentClosed(Core::IDocument *document) void LanguageClientManager::documentClosed(Core::IDocument *document)
{ {
if (auto textDocument = qobject_cast<TextEditor::TextDocument *>(document)) if (auto textDocument = qobject_cast<TextEditor::TextDocument *>(document)) {
m_clientForDocument.remove(textDocument); openDocumentWithClient(textDocument, nullptr);
for (auto client : std::as_const(managerInstance->m_clients)) {
if (client->documentOpen(textDocument))
client->closeDocument(textDocument);
}
}
} }
void LanguageClientManager::updateProject(ProjectExplorer::Project *project) void LanguageClientManager::updateProject(ProjectExplorer::Project *project)

View File

@@ -76,9 +76,13 @@ public:
const LanguageServerProtocol::JsonRpcMessage &message); const LanguageServerProtocol::JsonRpcMessage &message);
static void showInspector(); static void showInspector();
static void openDocument(Core::IDocument *document);
static void closeDocument(Core::IDocument *document); public slots:
static void openEditor(Core::IEditor *editor); // These slots are called automatically if the a file is opened via the usual EditorManager
// methods. If you create an editor manually, you need to call these slots manually as well.
void editorOpened(Core::IEditor *editor);
void documentOpened(Core::IDocument *document);
void documentClosed(Core::IDocument *document);
signals: signals:
void clientAdded(Client *client); void clientAdded(Client *client);
@@ -93,10 +97,6 @@ private:
friend void setupLanguageClientManager(QObject *guard); friend void setupLanguageClientManager(QObject *guard);
void editorOpened(Core::IEditor *editor);
void documentOpened(Core::IDocument *document);
void documentClosed(Core::IDocument *document);
void updateProject(ProjectExplorer::Project *project); void updateProject(ProjectExplorer::Project *project);
void projectAdded(ProjectExplorer::Project *project); void projectAdded(ProjectExplorer::Project *project);

View File

@@ -27,7 +27,6 @@ class LanguageClientPlugin final : public ExtensionSystem::IPlugin
public: public:
LanguageClientPlugin() LanguageClientPlugin()
{ {
setObjectName("LanguageClient");
qRegisterMetaType<LanguageServerProtocol::JsonRpcMessage>(); qRegisterMetaType<LanguageServerProtocol::JsonRpcMessage>();
} }
@@ -36,24 +35,6 @@ private:
void extensionsInitialized() final; void extensionsInitialized() final;
ShutdownFlag aboutToShutdown() final; ShutdownFlag aboutToShutdown() final;
Q_SLOT void openDocument(Core::IDocument *document)
{
LanguageClientManager::openDocument(document);
}
Q_SLOT void closeDocument(Core::IDocument *document)
{
LanguageClientManager::closeDocument(document);
}
Q_SLOT void openEditor(Core::IEditor *editor) { LanguageClientManager::openEditor(editor); }
Q_SLOT void closeClientForDocument(TextEditor::TextDocument *document)
{
if (auto client = LanguageClientManager::clientForDocument(document))
client->closeDocument(document);
}
LanguageClientOutlineWidgetFactory m_outlineFactory; LanguageClientOutlineWidgetFactory m_outlineFactory;
}; };
@@ -77,8 +58,6 @@ void LanguageClientPlugin::initialize()
inspectAction.setText(Tr::tr("Inspect Language Clients...")); inspectAction.setText(Tr::tr("Inspect Language Clients..."));
inspectAction.addToContainer(Core::Constants::M_TOOLS_DEBUG); inspectAction.addToContainer(Core::Constants::M_TOOLS_DEBUG);
inspectAction.addOnTriggered(this, &LanguageClientManager::showInspector); inspectAction.addOnTriggered(this, &LanguageClientManager::showInspector);
ExtensionSystem::PluginManager::addObject(this);
} }
void LanguageClientPlugin::extensionsInitialized() void LanguageClientPlugin::extensionsInitialized()
@@ -88,7 +67,6 @@ void LanguageClientPlugin::extensionsInitialized()
ExtensionSystem::IPlugin::ShutdownFlag LanguageClientPlugin::aboutToShutdown() ExtensionSystem::IPlugin::ShutdownFlag LanguageClientPlugin::aboutToShutdown()
{ {
ExtensionSystem::PluginManager::removeObject(this);
LanguageClientManager::shutdown(); LanguageClientManager::shutdown();
if (LanguageClientManager::isShutdownFinished()) if (LanguageClientManager::isShutdownFinished())
return ExtensionSystem::IPlugin::SynchronousShutdown; return ExtensionSystem::IPlugin::SynchronousShutdown;