CppEditorPlugin: Partially pimpl and avoid use of global object pool

Change-Id: I1e55848a9947ff0b4bffcdca717419db8f6f2fa5
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
hjk
2018-02-07 14:51:15 +01:00
parent acd63756dc
commit 4e4111a92d
3 changed files with 63 additions and 77 deletions

View File

@@ -39,6 +39,7 @@
#include "resourcepreviewhoverhandler.h" #include "resourcepreviewhoverhandler.h"
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/ieditorfactory.h>
#ifdef WITH_TESTS #ifdef WITH_TESTS
# include "cppdoxygen_test.h" # include "cppdoxygen_test.h"
@@ -105,24 +106,39 @@ public:
| TextEditorActionHandler::UnCommentSelection | TextEditorActionHandler::UnCommentSelection
| TextEditorActionHandler::UnCollapseAll | TextEditorActionHandler::UnCollapseAll
| TextEditorActionHandler::FollowSymbolUnderCursor); | TextEditorActionHandler::FollowSymbolUnderCursor);
addHoverHandler(CppModelManager::instance()->createHoverHandler());
addHoverHandler(new ColorPreviewHoverHandler);
addHoverHandler(new ResourcePreviewHoverHandler);
} }
}; };
///////////////////////////////// CppEditorPlugin ////////////////////////////////// ///////////////////////////////// CppEditorPlugin //////////////////////////////////
CppEditorPlugin *CppEditorPlugin::m_instance = 0; class CppEditorPluginPrivate : public QObject
{
public:
void onTaskStarted(Core::Id type);
void onAllTasksFinished(Core::Id type);
void inspectCppCodeModel();
CppEditorPlugin::CppEditorPlugin() : QAction *m_renameSymbolUnderCursorAction = nullptr;
m_renameSymbolUnderCursorAction(0), QAction *m_findUsagesAction = nullptr;
m_findUsagesAction(0), QAction *m_reparseExternallyChangedFiles = nullptr;
m_reparseExternallyChangedFiles(0), QAction *m_openTypeHierarchyAction = nullptr;
m_openTypeHierarchyAction(0), QAction *m_openIncludeHierarchyAction = nullptr;
m_openIncludeHierarchyAction(0),
m_quickFixProvider(0) CppQuickFixAssistProvider m_quickFixProvider;
QPointer<CppCodeModelInspectorDialog> m_cppCodeModelInspectorDialog;
QPointer<TextEditor::BaseTextEditor> m_currentEditor;
CppOutlineWidgetFactory m_cppOutlineWidgetFactory;
CppTypeHierarchyFactory m_cppTypeHierarchyFactory;
CppIncludeHierarchyFactory m_cppIncludeHierarchyFactory;
CppEditorFactory m_cppEditorFactory;
};
static CppEditorPlugin *m_instance = nullptr;
CppEditorPlugin::CppEditorPlugin()
{ {
m_instance = this; m_instance = this;
} }
@@ -130,7 +146,9 @@ CppEditorPlugin::CppEditorPlugin() :
CppEditorPlugin::~CppEditorPlugin() CppEditorPlugin::~CppEditorPlugin()
{ {
destroyCppQuickFixes(); destroyCppQuickFixes();
m_instance = 0; delete d;
d = nullptr;
m_instance = nullptr;
} }
CppEditorPlugin *CppEditorPlugin::instance() CppEditorPlugin *CppEditorPlugin::instance()
@@ -140,20 +158,18 @@ CppEditorPlugin *CppEditorPlugin::instance()
CppQuickFixAssistProvider *CppEditorPlugin::quickFixProvider() const CppQuickFixAssistProvider *CppEditorPlugin::quickFixProvider() const
{ {
return m_quickFixProvider; return &d->m_quickFixProvider;
} }
bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage) bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage)
{ {
Q_UNUSED(errorMessage) Q_UNUSED(errorMessage)
addAutoReleasedObject(new CppOutlineWidgetFactory); d = new CppEditorPluginPrivate;
addAutoReleasedObject(new CppTypeHierarchyFactory);
addAutoReleasedObject(new CppIncludeHierarchyFactory);
SnippetProvider::registerGroup(Constants::CPP_SNIPPETS_GROUP_ID, tr("C++", "SnippetProvider"), SnippetProvider::registerGroup(Constants::CPP_SNIPPETS_GROUP_ID, tr("C++", "SnippetProvider"),
&CppEditor::decorateEditor); &CppEditor::decorateEditor);
m_quickFixProvider = new CppQuickFixAssistProvider(this);
createCppQuickFixes(); createCppQuickFixes();
Context context(Constants::CPPEDITOR_ID); Context context(Constants::CPPEDITOR_ID);
@@ -200,24 +216,24 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err
this, &CppEditorPlugin::openDeclarationDefinitionInNextSplit); this, &CppEditorPlugin::openDeclarationDefinitionInNextSplit);
cppToolsMenu->addAction(cmd); cppToolsMenu->addAction(cmd);
m_findUsagesAction = new QAction(tr("Find Usages"), this); d->m_findUsagesAction = new QAction(tr("Find Usages"), this);
cmd = ActionManager::registerAction(m_findUsagesAction, Constants::FIND_USAGES, context); cmd = ActionManager::registerAction(d->m_findUsagesAction, Constants::FIND_USAGES, context);
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U"))); cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
connect(m_findUsagesAction, &QAction::triggered, this, &CppEditorPlugin::findUsages); connect(d->m_findUsagesAction, &QAction::triggered, this, &CppEditorPlugin::findUsages);
contextMenu->addAction(cmd); contextMenu->addAction(cmd);
cppToolsMenu->addAction(cmd); cppToolsMenu->addAction(cmd);
m_openTypeHierarchyAction = new QAction(tr("Open Type Hierarchy"), this); d->m_openTypeHierarchyAction = new QAction(tr("Open Type Hierarchy"), this);
cmd = ActionManager::registerAction(m_openTypeHierarchyAction, Constants::OPEN_TYPE_HIERARCHY, context); cmd = ActionManager::registerAction(d->m_openTypeHierarchyAction, Constants::OPEN_TYPE_HIERARCHY, context);
cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+T") : tr("Ctrl+Shift+T"))); cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+T") : tr("Ctrl+Shift+T")));
connect(m_openTypeHierarchyAction, &QAction::triggered, this, &CppEditorPlugin::openTypeHierarchy); connect(d->m_openTypeHierarchyAction, &QAction::triggered, this, &CppEditorPlugin::openTypeHierarchy);
contextMenu->addAction(cmd); contextMenu->addAction(cmd);
cppToolsMenu->addAction(cmd); cppToolsMenu->addAction(cmd);
m_openIncludeHierarchyAction = new QAction(tr("Open Include Hierarchy"), this); d->m_openIncludeHierarchyAction = new QAction(tr("Open Include Hierarchy"), this);
cmd = ActionManager::registerAction(m_openIncludeHierarchyAction, Constants::OPEN_INCLUDE_HIERARCHY, context); cmd = ActionManager::registerAction(d->m_openIncludeHierarchyAction, Constants::OPEN_INCLUDE_HIERARCHY, context);
cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+I") : tr("Ctrl+Shift+I"))); cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+I") : tr("Ctrl+Shift+I")));
connect(m_openIncludeHierarchyAction, &QAction::triggered, this, &CppEditorPlugin::openIncludeHierarchy); connect(d->m_openIncludeHierarchyAction, &QAction::triggered, this, &CppEditorPlugin::openIncludeHierarchy);
contextMenu->addAction(cmd); contextMenu->addAction(cmd);
cppToolsMenu->addAction(cmd); cppToolsMenu->addAction(cmd);
@@ -226,29 +242,29 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err
sep->action()->setObjectName(QLatin1String(Constants::M_REFACTORING_MENU_INSERTION_POINT)); sep->action()->setObjectName(QLatin1String(Constants::M_REFACTORING_MENU_INSERTION_POINT));
contextMenu->addSeparator(); contextMenu->addSeparator();
m_renameSymbolUnderCursorAction = new QAction(tr("Rename Symbol Under Cursor"), d->m_renameSymbolUnderCursorAction = new QAction(tr("Rename Symbol Under Cursor"),
this); this);
cmd = ActionManager::registerAction(m_renameSymbolUnderCursorAction, cmd = ActionManager::registerAction(d->m_renameSymbolUnderCursorAction,
Constants::RENAME_SYMBOL_UNDER_CURSOR, Constants::RENAME_SYMBOL_UNDER_CURSOR,
context); context);
cmd->setDefaultKeySequence(QKeySequence(tr("CTRL+SHIFT+R"))); cmd->setDefaultKeySequence(QKeySequence(tr("CTRL+SHIFT+R")));
connect(m_renameSymbolUnderCursorAction, &QAction::triggered, connect(d->m_renameSymbolUnderCursorAction, &QAction::triggered,
this, &CppEditorPlugin::renameSymbolUnderCursor); this, &CppEditorPlugin::renameSymbolUnderCursor);
cppToolsMenu->addAction(cmd); cppToolsMenu->addAction(cmd);
// Update context in global context // Update context in global context
cppToolsMenu->addSeparator(); cppToolsMenu->addSeparator();
m_reparseExternallyChangedFiles = new QAction(tr("Reparse Externally Changed Files"), this); d->m_reparseExternallyChangedFiles = new QAction(tr("Reparse Externally Changed Files"), this);
cmd = ActionManager::registerAction(m_reparseExternallyChangedFiles, Constants::UPDATE_CODEMODEL); cmd = ActionManager::registerAction(d->m_reparseExternallyChangedFiles, Constants::UPDATE_CODEMODEL);
CppTools::CppModelManager *cppModelManager = CppTools::CppModelManager::instance(); CppTools::CppModelManager *cppModelManager = CppTools::CppModelManager::instance();
connect(m_reparseExternallyChangedFiles, &QAction::triggered, cppModelManager, &CppTools::CppModelManager::updateModifiedSourceFiles); connect(d->m_reparseExternallyChangedFiles, &QAction::triggered, cppModelManager, &CppTools::CppModelManager::updateModifiedSourceFiles);
cppToolsMenu->addAction(cmd); cppToolsMenu->addAction(cmd);
cppToolsMenu->addSeparator(); cppToolsMenu->addSeparator();
QAction *inspectCppCodeModel = new QAction(tr("Inspect C++ Code Model..."), this); QAction *inspectCppCodeModel = new QAction(tr("Inspect C++ Code Model..."), this);
cmd = ActionManager::registerAction(inspectCppCodeModel, Constants::INSPECT_CPP_CODEMODEL); cmd = ActionManager::registerAction(inspectCppCodeModel, Constants::INSPECT_CPP_CODEMODEL);
cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+F12") : tr("Ctrl+Shift+F12"))); cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+F12") : tr("Ctrl+Shift+F12")));
connect(inspectCppCodeModel, &QAction::triggered, this, &CppEditorPlugin::inspectCppCodeModel); connect(inspectCppCodeModel, &QAction::triggered, d, &CppEditorPluginPrivate::inspectCppCodeModel);
cppToolsMenu->addAction(cmd); cppToolsMenu->addAction(cmd);
contextMenu->addSeparator(context); contextMenu->addSeparator(context);
@@ -260,18 +276,20 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err
contextMenu->addAction(cmd); contextMenu->addAction(cmd);
connect(ProgressManager::instance(), &ProgressManager::taskStarted, connect(ProgressManager::instance(), &ProgressManager::taskStarted,
this, &CppEditorPlugin::onTaskStarted); d, &CppEditorPluginPrivate::onTaskStarted);
connect(ProgressManager::instance(), &ProgressManager::allTasksFinished, connect(ProgressManager::instance(), &ProgressManager::allTasksFinished,
this, &CppEditorPlugin::onAllTasksFinished); d, &CppEditorPluginPrivate::onAllTasksFinished);
return true; return true;
} }
void CppEditorPlugin::extensionsInitialized() void CppEditorPlugin::extensionsInitialized()
{ {
// Add the editor factory here instead of in initialize() // Add the hover handler factories here instead of in initialize()
// so that the Clang Code Model has a chance to hook in. // so that the Clang Code Model has a chance to hook in.
addAutoReleasedObject(new CppEditorFactory); d->m_cppEditorFactory.addHoverHandler(CppModelManager::instance()->createHoverHandler());
d->m_cppEditorFactory.addHoverHandler(new ColorPreviewHoverHandler);
d->m_cppEditorFactory.addHoverHandler(new ResourcePreviewHoverHandler);
if (!HostOsInfo::isMacHost() && !HostOsInfo::isWindowsHost()) { if (!HostOsInfo::isMacHost() && !HostOsInfo::isWindowsHost()) {
FileIconProvider::registerIconOverlayForMimeType( FileIconProvider::registerIconOverlayForMimeType(
@@ -286,11 +304,6 @@ void CppEditorPlugin::extensionsInitialized()
} }
} }
ExtensionSystem::IPlugin::ShutdownFlag CppEditorPlugin::aboutToShutdown()
{
return SynchronousShutdown;
}
static CppEditorWidget *currentCppEditorWidget() static CppEditorWidget *currentCppEditorWidget()
{ {
if (IEditor *currentEditor = EditorManager::currentEditor()) if (IEditor *currentEditor = EditorManager::currentEditor())
@@ -328,7 +341,7 @@ void CppEditorPlugin::showPreProcessorDialog()
editorWidget->showPreProcessorWidget(); editorWidget->showPreProcessorWidget();
} }
void CppEditorPlugin::onTaskStarted(Id type) void CppEditorPluginPrivate::onTaskStarted(Id type)
{ {
if (type == CppTools::Constants::TASK_INDEX) { if (type == CppTools::Constants::TASK_INDEX) {
m_renameSymbolUnderCursorAction->setEnabled(false); m_renameSymbolUnderCursorAction->setEnabled(false);
@@ -339,7 +352,7 @@ void CppEditorPlugin::onTaskStarted(Id type)
} }
} }
void CppEditorPlugin::onAllTasksFinished(Id type) void CppEditorPluginPrivate::onAllTasksFinished(Id type)
{ {
if (type == CppTools::Constants::TASK_INDEX) { if (type == CppTools::Constants::TASK_INDEX) {
m_renameSymbolUnderCursorAction->setEnabled(true); m_renameSymbolUnderCursorAction->setEnabled(true);
@@ -350,7 +363,7 @@ void CppEditorPlugin::onAllTasksFinished(Id type)
} }
} }
void CppEditorPlugin::inspectCppCodeModel() void CppEditorPluginPrivate::inspectCppCodeModel()
{ {
if (m_cppCodeModelInspectorDialog) { if (m_cppCodeModelInspectorDialog) {
ICore::raiseWindow(m_cppCodeModelInspectorDialog); ICore::raiseWindow(m_cppCodeModelInspectorDialog);

View File

@@ -25,19 +25,12 @@
#pragma once #pragma once
#include <coreplugin/editormanager/ieditorfactory.h>
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <QtPlugin>
#include <QAction>
namespace TextEditor { class BaseTextEditor; }
namespace CppEditor { namespace CppEditor {
namespace Internal { namespace Internal {
class CppCodeModelInspectorDialog; class CppEditorPluginPrivate;
class CppQuickFixAssistProvider; class CppQuickFixAssistProvider;
class CppEditorPlugin : public ExtensionSystem::IPlugin class CppEditorPlugin : public ExtensionSystem::IPlugin
@@ -51,9 +44,8 @@ public:
static CppEditorPlugin *instance(); static CppEditorPlugin *instance();
bool initialize(const QStringList &arguments, QString *errorMessage = 0) override; bool initialize(const QStringList &arguments, QString *errorMessage) override;
void extensionsInitialized() override; void extensionsInitialized() override;
ShutdownFlag aboutToShutdown() override;
CppQuickFixAssistProvider *quickFixProvider() const; CppQuickFixAssistProvider *quickFixProvider() const;
@@ -71,11 +63,6 @@ public:
void renameSymbolUnderCursor(); void renameSymbolUnderCursor();
void switchDeclarationDefinition(); void switchDeclarationDefinition();
private:
void onTaskStarted(Core::Id type);
void onAllTasksFinished(Core::Id type);
void inspectCppCodeModel();
#ifdef WITH_TESTS #ifdef WITH_TESTS
private: private:
QList<QObject *> createTestObjects() const override; QList<QObject *> createTestObjects() const override;
@@ -252,21 +239,7 @@ private slots:
#endif // WITH_TESTS #endif // WITH_TESTS
private: private:
Core::IEditor *createEditor(QWidget *parent); CppEditorPluginPrivate *d = nullptr;
static CppEditorPlugin *m_instance;
QAction *m_renameSymbolUnderCursorAction;
QAction *m_findUsagesAction;
QAction *m_reparseExternallyChangedFiles;
QAction *m_openTypeHierarchyAction;
QAction *m_openIncludeHierarchyAction;
CppQuickFixAssistProvider *m_quickFixProvider;
QPointer<CppCodeModelInspectorDialog> m_cppCodeModelInspectorDialog;
QPointer<TextEditor::BaseTextEditor> m_currentEditor;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -71,7 +71,7 @@ private:
class CppQuickFixAssistProvider : public TextEditor::IAssistProvider class CppQuickFixAssistProvider : public TextEditor::IAssistProvider
{ {
public: public:
CppQuickFixAssistProvider(QObject *parent = nullptr) : TextEditor::IAssistProvider(parent) {} CppQuickFixAssistProvider() = default;
IAssistProvider::RunType runType() const override; IAssistProvider::RunType runType() const override;
TextEditor::IAssistProcessor *createProcessor() const override; TextEditor::IAssistProcessor *createProcessor() const override;
}; };