From 567e68a42a0a57f6dc83d39cf664e48c1dee6f9b Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Wed, 19 Oct 2011 09:21:48 +0200
Subject: [PATCH] QmlJS indenter: Fix hang when using 'else (a==a) {}'.

Change-Id: Id7b8fba6707b1eaabf8065854f357cf600c809c5
Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
---
 src/libs/qmljs/qmljscodeformatter.cpp             | 10 ++++++++--
 .../qmlcodeformatter/tst_qmlcodeformatter.cpp     | 15 +++++++++++++++
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/libs/qmljs/qmljscodeformatter.cpp b/src/libs/qmljs/qmljscodeformatter.cpp
index 782e0f36a59..fa5ef50eeac 100644
--- a/src/libs/qmljs/qmljscodeformatter.cpp
+++ b/src/libs/qmljs/qmljscodeformatter.cpp
@@ -255,8 +255,13 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
 
         case expression_or_label:
             switch (kind) {
-            case Colon:         turnInto(labelled_statement); break;
-            default:            enter(expression); continue;
+            case Colon:             turnInto(labelled_statement); break;
+
+            // propagate 'leave' from expression state
+            case RightBracket:
+            case RightParenthesis:  leave(); continue;
+
+            default:                enter(expression); continue;
             } break;
 
         case ternary_op:
@@ -756,6 +761,7 @@ bool CodeFormatter::tryStatement()
     case Function:
     case Number:
     case String:
+    case LeftParenthesis:
         enter(expression);
         // look at the token again
         m_tokenIndex -= 1;
diff --git a/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp b/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp
index 046540befeb..938f20df715 100644
--- a/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp
+++ b/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp
@@ -97,6 +97,7 @@ private Q_SLOTS:
     void labelledStatements3();
     void json1();
     void multilineTernaryInProperty();
+    void bug1();
 };
 
 struct Line {
@@ -1277,6 +1278,20 @@ void tst_QMLCodeFormatter::multilineTernaryInProperty()
     checkIndent(data);
 }
 
+void tst_QMLCodeFormatter::bug1()
+{
+    QList<Line> data;
+    data << Line("Item {")
+         << Line("    x: {")
+         << Line("        if (a==a) {}")
+         << Line("        else (b==b) {}")
+         << Line("        foo()")
+         << Line("    }")
+         << Line("}")
+         ;
+    checkIndent(data);
+}
+
 QTEST_APPLESS_MAIN(tst_QMLCodeFormatter)
 #include "tst_qmlcodeformatter.moc"
 
-- 
GitLab