From 5e59605c1e9503eaac9124d28918b231394e18b8 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen <erik.verbruggen@nokia.com> Date: Thu, 30 Sep 2010 16:12:24 +0200 Subject: [PATCH] QMLEditor: changed quickfix to only activate on the type id. --- .../qmljscomponentfromobjectdef.cpp | 8 +++--- src/plugins/qmljseditor/qmljsquickfix.cpp | 11 ++++++++ src/plugins/qmljseditor/qmljsquickfix.h | 3 +++ src/plugins/qmljseditor/qmljsquickfixes.cpp | 7 +++--- .../qmljseditor/qmljsrefactoringchanges.cpp | 25 ++++++++++++++++++- .../qmljseditor/qmljsrefactoringchanges.h | 3 +++ 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index 0d21a6101a5..0fcfd8108ac 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 3b5ce360f98..018442cd8bc 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 419cc73b902..57e6b2521f6 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 145bcee5227..006ce4b457e 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 a612b070cdf..bf7ed2018c0 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 993012e9c8c..b1ba3d4e466 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; -- GitLab