forked from qt-creator/qt-creator
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:
@@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user