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 | |
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')
-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 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljsquickfix.cpp | 7 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljsquickfix.h | 9 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljsquickfixassist.cpp | 24 | ||||
-rw-r--r-- | src/plugins/texteditor/quickfix.cpp | 18 | ||||
-rw-r--r-- | src/plugins/texteditor/quickfix.h | 24 |
10 files changed, 88 insertions, 102 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(); } } } diff --git a/src/plugins/qmljseditor/qmljsquickfix.cpp b/src/plugins/qmljseditor/qmljsquickfix.cpp index 926cf4a476..c6c1db2d0b 100644 --- a/src/plugins/qmljseditor/qmljsquickfix.cpp +++ b/src/plugins/qmljseditor/qmljsquickfix.cpp @@ -71,11 +71,4 @@ QString QmlJSQuickFixOperation::fileName() const return m_interface->semanticInfo().document->fileName(); } - -void QmlJSQuickFixFactory::matchingOperations(const QuickFixInterface &interface, - QuickFixOperations &result) -{ - match(interface.staticCast<const QmlJSQuickFixAssistInterface>(), result); -} - } // namespace QmlJSEditor diff --git a/src/plugins/qmljseditor/qmljsquickfix.h b/src/plugins/qmljseditor/qmljsquickfix.h index fda4a25a48..18e09f3d92 100644 --- a/src/plugins/qmljseditor/qmljsquickfix.h +++ b/src/plugins/qmljseditor/qmljsquickfix.h @@ -76,14 +76,13 @@ private: QmlJSQuickFixInterface m_interface; }; -class QmlJSQuickFixFactory: public TextEditor::QuickFixFactory +class QmlJSQuickFixFactory: public QObject { Q_OBJECT -protected: - QmlJSQuickFixFactory() {} - - void matchingOperations(const QuickFixInterface &interface, QuickFixOperations &result); +public: + QmlJSQuickFixFactory(); + ~QmlJSQuickFixFactory(); /*! Implement this function to match and create the appropriate diff --git a/src/plugins/qmljseditor/qmljsquickfixassist.cpp b/src/plugins/qmljseditor/qmljsquickfixassist.cpp index 52a23a43fa..9d3fa6e732 100644 --- a/src/plugins/qmljseditor/qmljsquickfixassist.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixassist.cpp @@ -43,7 +43,23 @@ namespace QmlJSEditor { using namespace Internal; // ----------------------- -// QuickFixAssistInterface +// QmlJSQuickFixFactory +// ----------------------- + +static QList<QmlJSQuickFixFactory *> g_qmlJSQuickFixFactories; + +QmlJSQuickFixFactory::QmlJSQuickFixFactory() +{ + g_qmlJSQuickFixFactories.append(this); +} + +QmlJSQuickFixFactory::~QmlJSQuickFixFactory() +{ + g_qmlJSQuickFixFactories.removeOne(this); +} + +// ----------------------- +// QmlJSQuickFixAssistInterface // ----------------------- QmlJSQuickFixAssistInterface::QmlJSQuickFixAssistInterface(QmlJSEditorWidget *editor, AssistReason reason) @@ -74,12 +90,12 @@ class QmlJSQuickFixAssistProcessor : public IAssistProcessor IAssistProposal *perform(const AssistInterface *interface) override { QSharedPointer<const AssistInterface> assistInterface(interface); + auto qmlJSInterface = assistInterface.staticCast<const QmlJSQuickFixAssistInterface>(); QuickFixOperations quickFixes; - for (QuickFixFactory *factory : QuickFixFactory::allQuickFixFactories()) - if (qobject_cast<QmlJSQuickFixFactory *>(factory) != nullptr) - factory->matchingOperations(assistInterface, quickFixes); + for (QmlJSQuickFixFactory *factory : g_qmlJSQuickFixFactories) + factory->match(qmlJSInterface, quickFixes); return GenericProposal::createProposal(interface, quickFixes); } diff --git a/src/plugins/texteditor/quickfix.cpp b/src/plugins/texteditor/quickfix.cpp index 8f6012829b..a50b36268b 100644 --- a/src/plugins/texteditor/quickfix.cpp +++ b/src/plugins/texteditor/quickfix.cpp @@ -55,21 +55,3 @@ void QuickFixOperation::setDescription(const QString &description) { _description = description; } - -static QList<QuickFixFactory *> g_quickFixFactories; - -QuickFixFactory::QuickFixFactory(QObject *parent) - : QObject(parent) -{ - g_quickFixFactories.append(this); -} - -QuickFixFactory::~QuickFixFactory() -{ - g_quickFixFactories.removeOne(this); -} - -const QList<QuickFixFactory *> QuickFixFactory::allQuickFixFactories() -{ - return g_quickFixFactories; -} diff --git a/src/plugins/texteditor/quickfix.h b/src/plugins/texteditor/quickfix.h index c9ee1f6f0b..c3f1884468 100644 --- a/src/plugins/texteditor/quickfix.h +++ b/src/plugins/texteditor/quickfix.h @@ -95,30 +95,6 @@ inline QuickFixOperations &operator<<(QuickFixOperations &list, QuickFixOperatio typedef QSharedPointer<const AssistInterface> QuickFixInterface; -/*! - 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 TEXTEDITOR_EXPORT QuickFixFactory: public QObject -{ - Q_OBJECT - -public: - QuickFixFactory(QObject *parent = 0); - ~QuickFixFactory(); - - static const QList<QuickFixFactory *> allQuickFixFactories(); - - virtual void matchingOperations(const QuickFixInterface &interface, QuickFixOperations &result) = 0; -}; - } // namespace TextEditor Q_DECLARE_METATYPE(TextEditor::QuickFixOperation::Ptr) |