diff --git a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp index ab68cc16054..6204d670b52 100644 --- a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp @@ -132,7 +132,7 @@ bool BaseTextEditModifier::moveToComponent(int nodeOffset) if (!object) return false; - QmlJSEditor::ComponentFromObjectDef::perform(document->filePath().toString(), object); + QmlJSEditor::performComponentFromObjectDef(document->filePath().toString(), object); return true; } } diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index d3f9fe65e0c..456853633ff 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -233,7 +233,7 @@ public: } // end of anonymous namespace -void ComponentFromObjectDef::match(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) +void matchComponentFromObjectDefQuickFix(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) { const int pos = interface->currentFile()->cursor().position(); @@ -258,7 +258,7 @@ void ComponentFromObjectDef::match(const QmlJSQuickFixInterface &interface, Quic } } -void ComponentFromObjectDef::perform(const QString &fileName, QmlJS::AST::UiObjectDefinition *objDef) +void performComponentFromObjectDef(const QString &fileName, QmlJS::AST::UiObjectDefinition *objDef) { QmlJSRefactoringChanges refactoring(QmlJS::ModelManagerInterface::instance(), QmlJS::ModelManagerInterface::instance()->snapshot()); diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.h b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.h index 2aee9f9cf39..e61b992996a 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.h +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.h @@ -29,12 +29,10 @@ namespace QmlJSEditor { -class QMLJSEDITOR_EXPORT ComponentFromObjectDef : public QmlJSQuickFixFactory -{ -public: - void match(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) override; +QMLJSEDITOR_EXPORT void matchComponentFromObjectDefQuickFix + (const QmlJSQuickFixInterface &interface, QuickFixOperations &result); - static void perform(const QString &fileName, QmlJS::AST::UiObjectDefinition *objDef); -}; +QMLJSEDITOR_EXPORT void performComponentFromObjectDef + (const QString &fileName, QmlJS::AST::UiObjectDefinition *objDef); } // namespace QmlJSEditor diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp index 2931b1f9c61..87490e946c3 100644 --- a/src/plugins/qmljseditor/qmljseditorplugin.cpp +++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp @@ -78,8 +78,6 @@ enum { namespace QmlJSEditor { using namespace Internal; -void registerQuickFixes(ExtensionSystem::IPlugin *plugIn); - QmlJSEditorPlugin *QmlJSEditorPlugin::m_instance = 0; QmlJSEditorPlugin::QmlJSEditorPlugin() : @@ -193,8 +191,6 @@ bool QmlJSEditorPlugin::initialize(const QStringList & /*arguments*/, QString *e FileIconProvider::registerIconOverlayForSuffix(ProjectExplorer::Constants::FILEOVERLAY_QML, "qml"); - registerQuickFixes(this); - addAutoReleasedObject(new QmlJSOutlineWidgetFactory); addAutoReleasedObject(new QuickToolBar); diff --git a/src/plugins/qmljseditor/qmljsquickfix.h b/src/plugins/qmljseditor/qmljsquickfix.h index 18e09f3d923..dcca4c9eb58 100644 --- a/src/plugins/qmljseditor/qmljsquickfix.h +++ b/src/plugins/qmljseditor/qmljsquickfix.h @@ -34,8 +34,6 @@ #include -namespace QmlJS { class ModelManagerInterface; } - namespace QmlJSEditor { namespace Internal { class QmlJSQuickFixAssistInterface; } @@ -76,19 +74,6 @@ private: QmlJSQuickFixInterface m_interface; }; -class QmlJSQuickFixFactory: public QObject -{ - Q_OBJECT - -public: - QmlJSQuickFixFactory(); - ~QmlJSQuickFixFactory(); - - /*! - Implement this function to match and create the appropriate - QmlJSQuickFixOperation objects. - */ - virtual void match(const QmlJSQuickFixInterface &interface, TextEditor::QuickFixOperations &result) = 0; -}; +TextEditor::QuickFixOperations findQmlJSQuickFixes(const TextEditor::AssistInterface *interface); } // namespace QmlJSEditor diff --git a/src/plugins/qmljseditor/qmljsquickfixassist.cpp b/src/plugins/qmljseditor/qmljsquickfixassist.cpp index 9d3fa6e732b..c9bb01161d1 100644 --- a/src/plugins/qmljseditor/qmljsquickfixassist.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixassist.cpp @@ -42,22 +42,6 @@ namespace QmlJSEditor { using namespace Internal; -// ----------------------- -// QmlJSQuickFixFactory -// ----------------------- - -static QList g_qmlJSQuickFixFactories; - -QmlJSQuickFixFactory::QmlJSQuickFixFactory() -{ - g_qmlJSQuickFixFactories.append(this); -} - -QmlJSQuickFixFactory::~QmlJSQuickFixFactory() -{ - g_qmlJSQuickFixFactories.removeOne(this); -} - // ----------------------- // QmlJSQuickFixAssistInterface // ----------------------- @@ -89,15 +73,7 @@ class QmlJSQuickFixAssistProcessor : public IAssistProcessor { IAssistProposal *perform(const AssistInterface *interface) override { - QSharedPointer assistInterface(interface); - auto qmlJSInterface = assistInterface.staticCast(); - - QuickFixOperations quickFixes; - - for (QmlJSQuickFixFactory *factory : g_qmlJSQuickFixFactories) - factory->match(qmlJSInterface, quickFixes); - - return GenericProposal::createProposal(interface, quickFixes); + return GenericProposal::createProposal(interface, findQmlJSQuickFixes(interface)); } }; diff --git a/src/plugins/qmljseditor/qmljsquickfixes.cpp b/src/plugins/qmljseditor/qmljsquickfixes.cpp index 2ad877fe5c3..49a15a3e685 100644 --- a/src/plugins/qmljseditor/qmljsquickfixes.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixes.cpp @@ -33,13 +33,14 @@ #include #include #include +#include #include using namespace QmlJS; using namespace QmlJS::AST; using namespace QmlJSTools; -using TextEditor::RefactoringChanges; +using namespace TextEditor; namespace QmlJSEditor { @@ -57,125 +58,125 @@ namespace { width: 10 } */ -class SplitInitializerOp: public QmlJSQuickFixFactory +class SplitInitializerOperation: public QmlJSQuickFixOperation { - void match(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) override + UiObjectInitializer *_objectInitializer; + +public: + SplitInitializerOperation(const QSharedPointer &interface, + UiObjectInitializer *objectInitializer) + : QmlJSQuickFixOperation(interface, 0) + , _objectInitializer(objectInitializer) { - UiObjectInitializer *objectInitializer = 0; - - const int pos = interface->currentFile()->cursor().position(); - - if (Node *member = interface->semanticInfo().rangeAt(pos)) { - if (UiObjectBinding *b = AST::cast(member)) { - if (b->initializer->lbraceToken.startLine == b->initializer->rbraceToken.startLine) - objectInitializer = b->initializer; - - } else if (UiObjectDefinition *b = AST::cast(member)) { - if (b->initializer->lbraceToken.startLine == b->initializer->rbraceToken.startLine) - objectInitializer = b->initializer; - } - } - - if (objectInitializer) - result << new Operation(interface, objectInitializer); + setDescription(QApplication::translate("QmlJSEditor::QuickFix", + "Split Initializer")); } - class Operation: public QmlJSQuickFixOperation + void performChanges(QmlJSRefactoringFilePtr currentFile, + const QmlJSRefactoringChanges &) { - UiObjectInitializer *_objectInitializer; + Q_ASSERT(_objectInitializer != 0); - public: - Operation(const QSharedPointer &interface, - UiObjectInitializer *objectInitializer) - : QmlJSQuickFixOperation(interface, 0) - , _objectInitializer(objectInitializer) - { - setDescription(QApplication::translate("QmlJSEditor::QuickFix", - "Split Initializer")); - } + Utils::ChangeSet changes; - void performChanges(QmlJSRefactoringFilePtr currentFile, - const QmlJSRefactoringChanges &) - { - Q_ASSERT(_objectInitializer != 0); + for (UiObjectMemberList *it = _objectInitializer->members; it; it = it->next) { + if (UiObjectMember *member = it->member) { + const SourceLocation loc = member->firstSourceLocation(); - Utils::ChangeSet changes; - - for (UiObjectMemberList *it = _objectInitializer->members; it; it = it->next) { - if (UiObjectMember *member = it->member) { - const SourceLocation loc = member->firstSourceLocation(); - - // insert a newline at the beginning of this binding - changes.insert(currentFile->startOf(loc), QLatin1String("\n")); - } + // insert a newline at the beginning of this binding + changes.insert(currentFile->startOf(loc), QLatin1String("\n")); } - - // insert a newline before the closing brace - changes.insert(currentFile->startOf(_objectInitializer->rbraceToken), - QLatin1String("\n")); - - currentFile->setChangeSet(changes); - currentFile->appendIndentRange(Range(currentFile->startOf(_objectInitializer->lbraceToken), - currentFile->startOf(_objectInitializer->rbraceToken))); - currentFile->apply(); } - }; + + // insert a newline before the closing brace + changes.insert(currentFile->startOf(_objectInitializer->rbraceToken), + QLatin1String("\n")); + + currentFile->setChangeSet(changes); + currentFile->appendIndentRange(Range(currentFile->startOf(_objectInitializer->lbraceToken), + currentFile->startOf(_objectInitializer->rbraceToken))); + currentFile->apply(); + } }; +void matchSplitInitializerQuickFix(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) +{ + UiObjectInitializer *objectInitializer = 0; + + const int pos = interface->currentFile()->cursor().position(); + + if (Node *member = interface->semanticInfo().rangeAt(pos)) { + if (UiObjectBinding *b = AST::cast(member)) { + if (b->initializer->lbraceToken.startLine == b->initializer->rbraceToken.startLine) + objectInitializer = b->initializer; + + } else if (UiObjectDefinition *b = AST::cast(member)) { + if (b->initializer->lbraceToken.startLine == b->initializer->rbraceToken.startLine) + objectInitializer = b->initializer; + } + } + + if (objectInitializer) + result << new SplitInitializerOperation(interface, objectInitializer); +} + /* Adds a comment to suppress a static analysis message */ -class AddAnalysisMessageSuppressionComment: public QmlJSQuickFixFactory +class AnalysizeMessageSuppressionOperation: public QmlJSQuickFixOperation { - Q_DECLARE_TR_FUNCTIONS(QmlJSEditor::AddAnalysisMessageSuppressionComment) -public: - void match(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) override - { - const QList &messages = interface->semanticInfo().staticAnalysisMessages; + StaticAnalysis::Message _message; - foreach (const StaticAnalysis::Message &message, messages) { - if (interface->currentFile()->isCursorOn(message.location)) { - result << new Operation(interface, message); - return; - } - } + Q_DECLARE_TR_FUNCTIONS(AddAnalysisMessageSuppressionComment) + +public: + AnalysizeMessageSuppressionOperation(const QSharedPointer &interface, + const StaticAnalysis::Message &message) + : QmlJSQuickFixOperation(interface, 0) + , _message(message) + { + setDescription(tr("Add a Comment to Suppress This Message")); } -private: - class Operation: public QmlJSQuickFixOperation + virtual void performChanges(QmlJSRefactoringFilePtr currentFile, + const QmlJSRefactoringChanges &) { - StaticAnalysis::Message _message; - - public: - Operation(const QSharedPointer &interface, - const StaticAnalysis::Message &message) - : QmlJSQuickFixOperation(interface, 0) - , _message(message) - { - setDescription(AddAnalysisMessageSuppressionComment::tr("Add a Comment to Suppress This Message")); - } - - virtual void performChanges(QmlJSRefactoringFilePtr currentFile, - const QmlJSRefactoringChanges &) - { - Utils::ChangeSet changes; - const int insertLoc = _message.location.begin() - _message.location.startColumn + 1; - changes.insert(insertLoc, QString::fromLatin1("// %1\n").arg(_message.suppressionString())); - currentFile->setChangeSet(changes); - currentFile->appendIndentRange(Range(insertLoc, insertLoc + 1)); - currentFile->apply(); - } - }; + Utils::ChangeSet changes; + const int insertLoc = _message.location.begin() - _message.location.startColumn + 1; + changes.insert(insertLoc, QString::fromLatin1("// %1\n").arg(_message.suppressionString())); + currentFile->setChangeSet(changes); + currentFile->appendIndentRange(Range(insertLoc, insertLoc + 1)); + currentFile->apply(); + } }; +void matchAddAnalysisMessageSuppressionCommentQuickFix(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) +{ + const QList &messages = interface->semanticInfo().staticAnalysisMessages; + + foreach (const StaticAnalysis::Message &message, messages) { + if (interface->currentFile()->isCursorOn(message.location)) { + result << new AnalysizeMessageSuppressionOperation(interface, message); + return; + } + } +} + } // end of anonymous namespace -void registerQuickFixes(ExtensionSystem::IPlugin *plugIn) +QuickFixOperations findQmlJSQuickFixes(const AssistInterface *interface) { - plugIn->addAutoReleasedObject(new SplitInitializerOp); - plugIn->addAutoReleasedObject(new ComponentFromObjectDef); - plugIn->addAutoReleasedObject(new WrapInLoader); - plugIn->addAutoReleasedObject(new AddAnalysisMessageSuppressionComment); + QSharedPointer assistInterface(interface); + auto qmlJSInterface = assistInterface.staticCast(); + + QuickFixOperations quickFixes; + + matchSplitInitializerQuickFix(qmlJSInterface, quickFixes); + matchComponentFromObjectDefQuickFix(qmlJSInterface, quickFixes); + matchWrapInLoaderQuickFix(qmlJSInterface, quickFixes); + matchAddAnalysisMessageSuppressionCommentQuickFix(qmlJSInterface, quickFixes); + + return quickFixes; } } // namespace QmlJSEditor diff --git a/src/plugins/qmljseditor/qmljswrapinloader.cpp b/src/plugins/qmljseditor/qmljswrapinloader.cpp index a99ca687bc1..fca146e3d73 100644 --- a/src/plugins/qmljseditor/qmljswrapinloader.cpp +++ b/src/plugins/qmljseditor/qmljswrapinloader.cpp @@ -174,7 +174,7 @@ public: } // end of anonymous namespace -void WrapInLoader::match(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) +void matchWrapInLoaderQuickFix(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) { const int pos = interface->currentFile()->cursor().position(); diff --git a/src/plugins/qmljseditor/qmljswrapinloader.h b/src/plugins/qmljseditor/qmljswrapinloader.h index caf89998848..acdeab9fcb5 100644 --- a/src/plugins/qmljseditor/qmljswrapinloader.h +++ b/src/plugins/qmljseditor/qmljswrapinloader.h @@ -28,12 +28,7 @@ #include "qmljsquickfix.h" namespace QmlJSEditor { -namespace Internal { -class WrapInLoader: public QmlJSQuickFixFactory -{ - void match(const QmlJSQuickFixInterface &interface, QuickFixOperations &result) override; -}; +void matchWrapInLoaderQuickFix(const QmlJSQuickFixInterface &interface, QuickFixOperations &result); -} // namespace Internal } // namespace QmlJSEditor