diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index 0d21a6101a5c78040b4df2c78cee72c5d4fd9dcb..0fcfd8108ac62e0465d18641ec28daba67f522b7 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -149,20 +149,20 @@ public: QList<QmlJSQuickFixOperation::Ptr> ComponentFromObjectDef::match(const QmlJSQuickFixState &state) { - QList<QmlJSQuickFixOperation::Ptr> result; const int pos = state.currentFile().cursor().position(); QList<Node *> path = state.semanticInfo().astPath(pos); for (int i = path.size() - 1; i >= 0; --i) { Node *node = path.at(i); if (UiObjectDefinition *objDef = cast<UiObjectDefinition *>(node)) { + if (!state.currentFile().isCursorOn(objDef->qualifiedTypeNameId)) + return noResult(); // check that the node is not the root node if (i > 0 && !cast<UiProgram*>(path.at(i - 1))) { - result.append(QmlJSQuickFixOperation::Ptr(new Operation(state, objDef))); - return result; + return singleResult(new Operation(state, objDef)); } } } - return result; + return noResult(); } diff --git a/src/plugins/qmljseditor/qmljsquickfix.cpp b/src/plugins/qmljseditor/qmljsquickfix.cpp index 3b5ce360f98b7de8fd9a0cb343977c04ab746c5b..018442cd8bc1b93235b22d2fb8e04489b9a4a8f7 100644 --- a/src/plugins/qmljseditor/qmljsquickfix.cpp +++ b/src/plugins/qmljseditor/qmljsquickfix.cpp @@ -117,6 +117,17 @@ QList<QuickFixOperation::Ptr> QmlJSQuickFixFactory::matchingOperations(QuickFixS return QList<TextEditor::QuickFixOperation::Ptr>(); } +QList<QmlJSQuickFixOperation::Ptr> QmlJSQuickFixFactory::noResult() +{ + return QList<QmlJSQuickFixOperation::Ptr>(); +} + +QList<QmlJSQuickFixOperation::Ptr> QmlJSQuickFixFactory::singleResult(QmlJSQuickFixOperation *operation) +{ + QList<QmlJSQuickFixOperation::Ptr> result; + result.append(QmlJSQuickFixOperation::Ptr(operation)); + return result; +} QmlJSQuickFixCollector::QmlJSQuickFixCollector() { diff --git a/src/plugins/qmljseditor/qmljsquickfix.h b/src/plugins/qmljseditor/qmljsquickfix.h index 419cc73b9020124135e35ae0ff1ad4b0c602fb88..57e6b2521f6868ed357d1551267520fd440d62f6 100644 --- a/src/plugins/qmljseditor/qmljsquickfix.h +++ b/src/plugins/qmljseditor/qmljsquickfix.h @@ -132,6 +132,9 @@ public: QmlJSQuickFixOperation objects. */ virtual QList<QmlJSQuickFixOperation::Ptr> match(const QmlJSQuickFixState &state) = 0; + + static QList<QmlJSQuickFixOperation::Ptr> noResult(); + static QList<QmlJSQuickFixOperation::Ptr> singleResult(QmlJSQuickFixOperation *operation); }; namespace Internal { diff --git a/src/plugins/qmljseditor/qmljsquickfixes.cpp b/src/plugins/qmljseditor/qmljsquickfixes.cpp index 145bcee52275e627fa60c16d062d628ed0b7719b..006ce4b457ecd7dc6fb7f1539a0eb994ea5f55ea 100644 --- a/src/plugins/qmljseditor/qmljsquickfixes.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixes.cpp @@ -52,8 +52,6 @@ class SplitInitializerOp: public QmlJSQuickFixFactory public: virtual QList<QmlJSQuickFixOperation::Ptr> match(const QmlJSQuickFixState &state) { - QList<QmlJSQuickFixOperation::Ptr> result; - UiObjectInitializer *objectInitializer = 0; const int pos = state.currentFile().cursor().position(); @@ -70,8 +68,9 @@ public: } if (objectInitializer) - result.append(QSharedPointer<QmlJSQuickFixOperation>(new Operation(state, objectInitializer))); - return result; + return singleResult(new Operation(state, objectInitializer)); + else + return noResult(); } private: diff --git a/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp b/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp index a612b070cdfdbd442e786f92e834c9f52cb698b2..bf7ed2018c0b5d895e48d7c1eb89641a87e0a267 100644 --- a/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp +++ b/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp @@ -30,6 +30,7 @@ #include "qmljsrefactoringchanges.h" #include "qmljseditorcodeformatter.h" +#include <qmljs/parser/qmljsast_p.h> #include <qmljs/qmljsmodelmanagerinterface.h> #include <texteditor/texteditorsettings.h> #include <texteditor/tabsettings.h> @@ -109,11 +110,33 @@ Document::Ptr QmlJSRefactoringFile::qmljsDocument() const return m_qmljsDocument; } -unsigned QmlJSRefactoringFile::startOf(const QmlJS::AST::SourceLocation &loc) const +unsigned QmlJSRefactoringFile::startOf(const AST::SourceLocation &loc) const { return position(loc.startLine, loc.startColumn); } +bool QmlJSRefactoringFile::isCursorOn(AST::UiObjectMember *ast) const +{ + const unsigned pos = cursor().position(); + + return ast->firstSourceLocation().begin() <= pos + && pos <= ast->lastSourceLocation().end(); +} + +bool QmlJSRefactoringFile::isCursorOn(AST::UiQualifiedId *ast) const +{ + const unsigned pos = cursor().position(); + + if (ast->identifierToken.begin() > pos) + return false; + + AST::UiQualifiedId *last = ast; + while (last->next) + last = last->next; + + return pos <= ast->identifierToken.end(); +} + QmlJSRefactoringChanges *QmlJSRefactoringFile::refactoringChanges() const { return static_cast<QmlJSRefactoringChanges *>(m_refactoringChanges); diff --git a/src/plugins/qmljseditor/qmljsrefactoringchanges.h b/src/plugins/qmljseditor/qmljsrefactoringchanges.h index 993012e9c8cb1332696ff6ae142f6441d9751317..b1ba3d4e466557192212363c714c9a4015e4a04a 100644 --- a/src/plugins/qmljseditor/qmljsrefactoringchanges.h +++ b/src/plugins/qmljseditor/qmljsrefactoringchanges.h @@ -57,6 +57,9 @@ public: */ unsigned startOf(const QmlJS::AST::SourceLocation &loc) const; + bool isCursorOn(QmlJS::AST::UiObjectMember *ast) const; + bool isCursorOn(QmlJS::AST::UiQualifiedId *ast) const; + private: QmlJSRefactoringChanges *refactoringChanges() const;