diff options
author | hjk <hjk@qt.io> | 2017-12-15 15:46:37 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2017-12-18 15:39:51 +0000 |
commit | 479ab4ef22e8810f059307b9eca68b79893db7a4 (patch) | |
tree | 31a9eb3710868f2a2619576af949c97866c15c6b /src/plugins/cppeditor | |
parent | 4ed12d95f83a50d6020270b85718b446604df7f2 (diff) |
TextEditor: Split the global QuickFixFactory list
It's only ever used in the filtered Cpp/QmlJs variants. Splitting
the class simplifies the code and avoids re-doing filtering over
and over again.
Also inline QuickFixFactory::matchingOperations() into callers
Change-Id: I730756315f2e0321649259ef229631233b12fbdd
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/plugins/cppeditor')
-rw-r--r-- | src/plugins/cppeditor/cppquickfix.cpp | 11 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppquickfix.h | 22 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppquickfixassistant.cpp | 9 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppquickfixes.cpp | 30 | ||||
-rw-r--r-- | src/plugins/cppeditor/fileandtokenactions_test.cpp | 36 |
5 files changed, 64 insertions, 44 deletions
diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp index 48d8170193..c91c4dccb8 100644 --- a/src/plugins/cppeditor/cppquickfix.cpp +++ b/src/plugins/cppeditor/cppquickfix.cpp @@ -29,8 +29,6 @@ #include <cpptools/cpprefactoringchanges.h> -#include <utils/algorithm.h> - using namespace CppEditor; using namespace CppEditor::Internal; using namespace CppTools; @@ -43,12 +41,3 @@ CppQuickFixOperation::CppQuickFixOperation(const CppQuickFixInterface &interface CppQuickFixOperation::~CppQuickFixOperation() {} - - -void CppQuickFixFactory::matchingOperations(const QuickFixInterface &interface, QuickFixOperations &result) -{ - auto cppInterface = interface.staticCast<const CppQuickFixInterface>(); - if (cppInterface->path().isEmpty()) - return; - match(*cppInterface, result); -} diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h index 4f447861b5..6244b5ca52 100644 --- a/src/plugins/cppeditor/cppquickfix.h +++ b/src/plugins/cppeditor/cppquickfix.h @@ -42,20 +42,34 @@ public: ~CppQuickFixOperation(); }; -class CPPEDITOR_EXPORT CppQuickFixFactory: public TextEditor::QuickFixFactory +/*! + The QuickFixFactory is responsible for generating QuickFixOperation s which are + applicable to the given QuickFixState. + + A QuickFixFactory should not have any state -- it can be invoked multiple times + for different QuickFixState objects to create the matching operations, before any + of those operations are applied (or released). + + This way, a single factory can be used by multiple editors, and a single editor + can have multiple QuickFixCollector objects for different parts of the code. + */ + +class CPPEDITOR_EXPORT CppQuickFixFactory : public QObject { Q_OBJECT public: - void matchingOperations(const TextEditor::QuickFixInterface &interface, - TextEditor::QuickFixOperations &result); + CppQuickFixFactory(); + ~CppQuickFixFactory(); /*! Implement this function to match and create the appropriate CppQuickFixOperation objects. */ virtual void match(const Internal::CppQuickFixInterface &interface, - TextEditor::QuickFixOperations &result) = 0; + TextEditor::QuickFixOperations &result) = 0; + + static const QList<CppQuickFixFactory *> &cppQuickFixFactories(); }; } // namespace CppEditor diff --git a/src/plugins/cppeditor/cppquickfixassistant.cpp b/src/plugins/cppeditor/cppquickfixassistant.cpp index 7517e4c136..8fdcbe6601 100644 --- a/src/plugins/cppeditor/cppquickfixassistant.cpp +++ b/src/plugins/cppeditor/cppquickfixassistant.cpp @@ -55,12 +55,13 @@ class CppQuickFixAssistProcessor : public IAssistProcessor IAssistProposal *perform(const AssistInterface *interface) override { QSharedPointer<const AssistInterface> assistInterface(interface); + auto cppInterface = assistInterface.staticCast<const CppQuickFixInterface>(); + if (cppInterface->path().isEmpty()) + return nullptr; QuickFixOperations quickFixes; - - for (QuickFixFactory *factory : QuickFixFactory::allQuickFixFactories()) - if (qobject_cast<CppQuickFixFactory *>(factory) != nullptr) - factory->matchingOperations(assistInterface, quickFixes); + for (CppQuickFixFactory *factory : CppQuickFixFactory::cppQuickFixFactories()) + factory->match(*cppInterface, quickFixes); return GenericProposal::createProposal(interface, quickFixes); } diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index b5fb1f9958..8a2a2ad326 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -79,6 +79,24 @@ using namespace TextEditor; using Utils::ChangeSet; namespace CppEditor { + +static QList<CppQuickFixFactory *> g_cppQuickFixFactories; + +CppQuickFixFactory::CppQuickFixFactory() +{ + g_cppQuickFixFactories.append(this); +} + +CppQuickFixFactory::~CppQuickFixFactory() +{ + g_cppQuickFixFactories.removeOne(this); +} + +const QList<CppQuickFixFactory *> &CppQuickFixFactory::cppQuickFixFactories() +{ + return g_cppQuickFixFactories; +} + namespace Internal { void registerQuickFixes(ExtensionSystem::IPlugin *plugIn) @@ -2993,15 +3011,15 @@ public: switch (m_type) { case GetterSetterType: setPriority(5); - setDescription(QuickFixFactory::tr("Create Getter and Setter Member Functions")); + setDescription(CppQuickFixFactory::tr("Create Getter and Setter Member Functions")); break; case GetterType: setPriority(4); - setDescription(QuickFixFactory::tr("Create Getter Member Function")); + setDescription(CppQuickFixFactory::tr("Create Getter Member Function")); break; case SetterType: setPriority(3); - setDescription(QuickFixFactory::tr("Create Setter Member Function")); + setDescription(CppQuickFixFactory::tr("Create Setter Member Function")); break; default: break; @@ -4125,8 +4143,8 @@ public: { setDescription( mode == FromPointer - ? QuickFixFactory::tr("Convert to Stack Variable") - : QuickFixFactory::tr("Convert to Pointer")); + ? CppQuickFixFactory::tr("Convert to Stack Variable") + : CppQuickFixFactory::tr("Convert to Pointer")); } void perform() override @@ -4472,7 +4490,7 @@ public: , m_signalName(signalName) , m_storageName(storageName) { - setDescription(QuickFixFactory::tr("Generate Missing Q_PROPERTY Members")); + setDescription(CppQuickFixFactory::tr("Generate Missing Q_PROPERTY Members")); } void perform() diff --git a/src/plugins/cppeditor/fileandtokenactions_test.cpp b/src/plugins/cppeditor/fileandtokenactions_test.cpp index 21b11c7524..73f995c3d2 100644 --- a/src/plugins/cppeditor/fileandtokenactions_test.cpp +++ b/src/plugins/cppeditor/fileandtokenactions_test.cpp @@ -452,26 +452,24 @@ void RunAllQuickFixesTokenAction::run(CppEditorWidget *editorWidget) if (qfi.path().isEmpty()) return; - for (QuickFixFactory *quickFixFactory : QuickFixFactory::allQuickFixFactories()) { - if (auto cppQuickFixFactory = qobject_cast<CppQuickFixFactory *>(quickFixFactory)) { - QuickFixOperations operations; - // Some Quick Fixes pop up a dialog and are therefore inappropriate for this test. - // Where possible, use a guiless version of the factory. - if (qobject_cast<InsertVirtualMethods *>(cppQuickFixFactory)) { - QScopedPointer<CppQuickFixFactory> factoryProducingGuiLessOperations; - factoryProducingGuiLessOperations.reset(InsertVirtualMethods::createTestFactory()); - factoryProducingGuiLessOperations->match(qfi, operations); - } else { - cppQuickFixFactory->match(qfi, operations); - } + for (CppQuickFixFactory *cppQuickFixFactory : CppQuickFixFactory::cppQuickFixFactories()) { + QuickFixOperations operations; + // Some Quick Fixes pop up a dialog and are therefore inappropriate for this test. + // Where possible, use a guiless version of the factory. + if (qobject_cast<InsertVirtualMethods *>(cppQuickFixFactory)) { + QScopedPointer<CppQuickFixFactory> factoryProducingGuiLessOperations; + factoryProducingGuiLessOperations.reset(InsertVirtualMethods::createTestFactory()); + factoryProducingGuiLessOperations->match(qfi, operations); + } else { + cppQuickFixFactory->match(qfi, operations); + } - foreach (QuickFixOperation::Ptr operation, operations) { - qDebug() << " -- Performing Quick Fix" << operation->description(); - operation->perform(); - TestActionsTestCase::escape(); - TestActionsTestCase::undoChangesInAllEditorWidgets(); - QApplication::processEvents(); - } + foreach (QuickFixOperation::Ptr operation, operations) { + qDebug() << " -- Performing Quick Fix" << operation->description(); + operation->perform(); + TestActionsTestCase::escape(); + TestActionsTestCase::undoChangesInAllEditorWidgets(); + QApplication::processEvents(); } } } |