aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmljseditor/qmljsquickfix.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-06-07 12:20:07 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-06-07 12:20:07 +0200
commitc6b8e52053f56ef71abc3cbb6322ebf68266ba0b (patch)
tree82d762a5bebc7413551d5275aebf64e0f6042a2a /src/plugins/qmljseditor/qmljsquickfix.cpp
parentf5dae8bc9f8ab63c3f16579906d82bafcbcac5c7 (diff)
Introduced a quickfix refactoring operation to split QML initializers.
Diffstat (limited to 'src/plugins/qmljseditor/qmljsquickfix.cpp')
-rw-r--r--src/plugins/qmljseditor/qmljsquickfix.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/plugins/qmljseditor/qmljsquickfix.cpp b/src/plugins/qmljseditor/qmljsquickfix.cpp
index db4fb16ab7..5317716327 100644
--- a/src/plugins/qmljseditor/qmljsquickfix.cpp
+++ b/src/plugins/qmljseditor/qmljsquickfix.cpp
@@ -41,6 +41,76 @@ public:
SemanticInfo semanticInfo;
};
+namespace {
+
+class SplitInitializerOp: public QmlJSQuickFixOperation {
+public:
+ SplitInitializerOp(TextEditor::BaseTextEditor *editor)
+ : QmlJSQuickFixOperation(editor), _objectInitializer(0)
+ {}
+
+ virtual QString description() const
+ {
+ return QApplication::translate("QmlJSEditor::QuickFix", "Split initializer");
+ }
+
+ virtual Range topLevelRange() const
+ {
+ Q_ASSERT(_objectInitializer);
+
+ return range(position(_objectInitializer->lbraceToken),
+ position(_objectInitializer->rbraceToken));
+ }
+
+ virtual void createChangeSet()
+ {
+ Q_ASSERT(_objectInitializer != 0);
+
+ for (QmlJS::AST::UiObjectMemberList *it = _objectInitializer->members; it; it = it->next) {
+ if (QmlJS::AST::UiObjectMember *member = it->member) {
+ const QmlJS::AST::SourceLocation loc = member->firstSourceLocation();
+
+ // insert a newline at the beginning of this binding
+ insert(position(loc), QLatin1String("\n"));
+ }
+ }
+
+ // insert a newline before the closing brace
+ insert(position(_objectInitializer->rbraceToken), QLatin1String("\n"));
+ }
+
+ virtual int check()
+ {
+ _objectInitializer = 0;
+
+ const int pos = textCursor().position();
+
+ if (QmlJS::AST::Node *member = semanticInfo().declaringMember(pos)) {
+ if (QmlJS::AST::UiObjectBinding *b = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding *>(member)) {
+ if (b->initializer->lbraceToken.startLine == b->initializer->rbraceToken.startLine) {
+ _objectInitializer = b->initializer;
+ return 0; // very high priority
+ }
+
+ } else if (QmlJS::AST::UiObjectDefinition *b = QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition *>(member)) {
+ if (b->initializer->lbraceToken.startLine == b->initializer->rbraceToken.startLine) {
+ _objectInitializer = b->initializer;
+ return 0; // very high priority
+ }
+ }
+
+ return false;
+ }
+
+ return -1;
+ }
+
+private:
+ QmlJS::AST::UiObjectInitializer *_objectInitializer;
+};
+
+
+} // end of anonymous namespace
QmlJSQuickFixOperation::QmlJSQuickFixOperation(TextEditor::BaseTextEditor *editor)
@@ -137,5 +207,6 @@ TextEditor::QuickFixState *QmlJSQuickFixCollector::initializeCompletion(TextEdit
QList<TextEditor::QuickFixOperation::Ptr> QmlJSQuickFixCollector::quickFixOperations(TextEditor::BaseTextEditor *editor) const
{
QList<TextEditor::QuickFixOperation::Ptr> quickFixOperations;
+ quickFixOperations.append(TextEditor::QuickFixOperation::Ptr(new SplitInitializerOp(editor)));
return quickFixOperations;
}