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 {
|
||||
|
||||
static QObject *languageClientPlugin()
|
||||
static QObject *languageClientManager()
|
||||
{
|
||||
return ExtensionSystem::PluginManager::getObjectByName("LanguageClient");
|
||||
return ExtensionSystem::PluginManager::getObjectByName("LanguageClientManager");
|
||||
}
|
||||
|
||||
class ClangFormatConfigWidget final : public TextEditor::CodeStyleEditorWidget
|
||||
@@ -69,11 +69,8 @@ public:
|
||||
~ClangFormatConfigWidget()
|
||||
{
|
||||
auto doc = qobject_cast<TextEditor::TextDocument *>(m_editor->document());
|
||||
QMetaObject::invokeMethod(languageClientPlugin(),
|
||||
"closeClientForDocument",
|
||||
Q_ARG(TextEditor::TextDocument *, doc));
|
||||
QMetaObject::invokeMethod(languageClientPlugin(),
|
||||
"closeDocument",
|
||||
QMetaObject::invokeMethod(languageClientManager(),
|
||||
"documentClosed",
|
||||
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->widget()->adjustSize();
|
||||
|
||||
QMetaObject::invokeMethod(languageClientPlugin(),
|
||||
"openDocument",
|
||||
QMetaObject::invokeMethod(languageClientManager(),
|
||||
"documentOpened",
|
||||
Q_ARG(Core::IDocument *, m_editor->document()));
|
||||
QMetaObject::invokeMethod(languageClientPlugin(),
|
||||
"openEditor",
|
||||
QMetaObject::invokeMethod(languageClientManager(),
|
||||
"editorOpened",
|
||||
Q_ARG(Core::IEditor *, m_editor));
|
||||
|
||||
m_editorWidget = m_editor->widget();
|
||||
@@ -337,8 +334,8 @@ void ClangFormatConfigWidget::reopenClangFormatDocument()
|
||||
QString errorString;
|
||||
if (m_editor->document()->open(&errorString, m_config->filePath(), m_config->filePath())
|
||||
== Core::IDocument::OpenResult::Success) {
|
||||
QMetaObject::invokeMethod(languageClientPlugin(),
|
||||
"openDocument",
|
||||
QMetaObject::invokeMethod(languageClientManager(),
|
||||
"documentOpened",
|
||||
Q_ARG(Core::IDocument *, m_editor->document()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,8 @@ class LanguageClientManagerPrivate
|
||||
LanguageClientManager::LanguageClientManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
setObjectName("LanguageClientManager");
|
||||
|
||||
managerInstance = this;
|
||||
d.reset(new LanguageClientManagerPrivate);
|
||||
using namespace Core;
|
||||
@@ -67,10 +69,13 @@ LanguageClientManager::LanguageClientManager(QObject *parent)
|
||||
this, &LanguageClientManager::projectAdded);
|
||||
connect(ProjectManager::instance(), &ProjectManager::projectRemoved,
|
||||
this, [&](Project *project) { project->disconnect(this); });
|
||||
|
||||
ExtensionSystem::PluginManager::addObject(this);
|
||||
}
|
||||
|
||||
LanguageClientManager::~LanguageClientManager()
|
||||
{
|
||||
ExtensionSystem::PluginManager::removeObject(this);
|
||||
QTC_ASSERT(m_clients.isEmpty(), qDeleteAll(m_clients));
|
||||
qDeleteAll(m_currentSettings);
|
||||
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)
|
||||
{
|
||||
const QList<BaseSettings *> prefilteredSettings
|
||||
@@ -632,8 +622,13 @@ void LanguageClientManager::documentOpened(Core::IDocument *document)
|
||||
|
||||
void LanguageClientManager::documentClosed(Core::IDocument *document)
|
||||
{
|
||||
if (auto textDocument = qobject_cast<TextEditor::TextDocument *>(document))
|
||||
m_clientForDocument.remove(textDocument);
|
||||
if (auto textDocument = qobject_cast<TextEditor::TextDocument *>(document)) {
|
||||
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)
|
||||
|
||||
@@ -76,9 +76,13 @@ public:
|
||||
const LanguageServerProtocol::JsonRpcMessage &message);
|
||||
|
||||
static void showInspector();
|
||||
static void openDocument(Core::IDocument *document);
|
||||
static void closeDocument(Core::IDocument *document);
|
||||
static void openEditor(Core::IEditor *editor);
|
||||
|
||||
public slots:
|
||||
// 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:
|
||||
void clientAdded(Client *client);
|
||||
@@ -93,10 +97,6 @@ private:
|
||||
|
||||
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 projectAdded(ProjectExplorer::Project *project);
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ class LanguageClientPlugin final : public ExtensionSystem::IPlugin
|
||||
public:
|
||||
LanguageClientPlugin()
|
||||
{
|
||||
setObjectName("LanguageClient");
|
||||
qRegisterMetaType<LanguageServerProtocol::JsonRpcMessage>();
|
||||
}
|
||||
|
||||
@@ -36,24 +35,6 @@ private:
|
||||
void extensionsInitialized() 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;
|
||||
};
|
||||
|
||||
@@ -77,8 +58,6 @@ void LanguageClientPlugin::initialize()
|
||||
inspectAction.setText(Tr::tr("Inspect Language Clients..."));
|
||||
inspectAction.addToContainer(Core::Constants::M_TOOLS_DEBUG);
|
||||
inspectAction.addOnTriggered(this, &LanguageClientManager::showInspector);
|
||||
|
||||
ExtensionSystem::PluginManager::addObject(this);
|
||||
}
|
||||
|
||||
void LanguageClientPlugin::extensionsInitialized()
|
||||
@@ -88,7 +67,6 @@ void LanguageClientPlugin::extensionsInitialized()
|
||||
|
||||
ExtensionSystem::IPlugin::ShutdownFlag LanguageClientPlugin::aboutToShutdown()
|
||||
{
|
||||
ExtensionSystem::PluginManager::removeObject(this);
|
||||
LanguageClientManager::shutdown();
|
||||
if (LanguageClientManager::isShutdownFinished())
|
||||
return ExtensionSystem::IPlugin::SynchronousShutdown;
|
||||
|
||||
Reference in New Issue
Block a user