aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2012-02-28 15:04:47 +0100
committerChristian Kamm <christian.d.kamm@nokia.com>2012-03-01 17:00:02 +0100
commit658e80d1b8471da11563a9738fa64aa32548a7db (patch)
tree7da2c92bd0d25ef363f8bb22db248cb1992cd0b9
parentec23f54b3e198777f7f2250d640328e7eecfa6da (diff)
QmlJS indenter: Improve handling of function expressions.
Task-number: QTCREATORBUG-7001 Change-Id: I254b84153b042c81008314bbebc800edfe201b89 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@nokia.com> Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com> (cherry picked from commit fcaf3d4f4c515e9c552357156d0a48b2c8359984)
-rw-r--r--src/libs/qmljs/qmljscodeformatter.cpp25
-rw-r--r--tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp73
2 files changed, 90 insertions, 8 deletions
diff --git a/src/libs/qmljs/qmljscodeformatter.cpp b/src/libs/qmljs/qmljscodeformatter.cpp
index 7b1a5e250b..1ef3c80c08 100644
--- a/src/libs/qmljs/qmljscodeformatter.cpp
+++ b/src/libs/qmljs/qmljscodeformatter.cpp
@@ -396,7 +396,6 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
} break;
case maybe_catch_or_finally:
- dump();
switch (kind) {
case Catch: turnInto(catch_statement); break;
case Finally: turnInto(finally_statement); break;
@@ -1125,17 +1124,27 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
}
break;
- case function_start:
- if (parentState.type == expression) {
- // undo the continuation indent of the expression
- *indentDepth = parentState.savedIndentDepth;
- *savedIndentDepth = *indentDepth;
- } else {
- // always align to function keyword
+ case function_start: {
+ // in these states, align to the 'function' keyword
+ const int parentType = parentState.type;
+ if (parentType == objectdefinition_open
+ || parentType == paren_open
+ || parentType == bracket_open) {
*indentDepth = tokenPosition;
*savedIndentDepth = *indentDepth;
+ break;
+ }
+
+ // otherwise find the enclosing expression end state and align to that
+ for (int i = 1; state(i).type != topmost_intro; ++i) {
+ const int type = state(i).type;
+ if (isExpressionEndState(type)) {
+ *indentDepth = state(i - 1).savedIndentDepth;
+ break;
+ }
}
break;
+ }
case do_statement_while_paren_open:
case statement_with_condition_paren_open:
diff --git a/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp b/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp
index 5a4411a1e9..82cefa729b 100644
--- a/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp
+++ b/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp
@@ -56,6 +56,9 @@ private Q_SLOTS:
void functionDeclaration();
void functionExpression1();
void functionExpression2();
+ void functionExpression3();
+ void functionExpression4();
+ void functionExpression5();
void propertyDeclarations();
void signalDeclarations();
void ifBinding1();
@@ -415,6 +418,76 @@ void tst_QMLCodeFormatter::functionExpression2()
checkIndent(data);
}
+void tst_QMLCodeFormatter::functionExpression3()
+{
+ QList<Line> data;
+ data << Line("Rectangle {")
+ << Line(" function foo(a, b, c) {")
+ << Line(" var foo = {")
+ << Line(" bar: function() {")
+ << Line(" bar = 2")
+ << Line(" },")
+ << Line(" bar2: function()")
+ << Line(" {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line(" }")
+ << Line(" Foo.proto.bar = function() {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line(" Foo.proto.bar = function()")
+ << Line(" {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line(" }")
+ << Line("}")
+ ;
+ checkIndent(data);
+}
+
+void tst_QMLCodeFormatter::functionExpression4()
+{
+ QList<Line> data;
+ data << Line("Rectangle {")
+ << Line(" function foo(a, b, c) {")
+ << Line(" baz = function() {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line(" baz = function()")
+ << Line(" {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line(" var buz = new function() {")
+ << Line(" this.bar = function() {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line(" this.bar = function()")
+ << Line(" {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line(" }")
+ << Line(" }")
+ << Line("}")
+ ;
+ checkIndent(data);
+}
+
+void tst_QMLCodeFormatter::functionExpression5()
+{
+ QList<Line> data;
+ data << Line("Rectangle {")
+ << Line(" property var foo: function() {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line(" property var foo: function()")
+ << Line(" {")
+ << Line(" bar = 2")
+ << Line(" }")
+ << Line("}")
+ ;
+ checkIndent(data);
+}
+
void tst_QMLCodeFormatter::propertyDeclarations()
{
QList<Line> data;