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