OSDN Git Service

QmlJS indenter: Fix ternary multiline indent.
authorChristian Kamm <christian.d.kamm@nokia.com>
Fri, 14 Oct 2011 10:52:42 +0000 (12:52 +0200)
committerChristian Kamm <christian.d.kamm@nokia.com>
Mon, 17 Oct 2011 09:22:34 +0000 (11:22 +0200)
Task-number: QTCREATORBUG-6208
Change-Id: I7e5267291bc01226b5339cb4abdbb15856c58477
Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
src/libs/qmljs/qmljscodeformatter.cpp
src/libs/qmljs/qmljscodeformatter.h
src/plugins/qmljstools/qmljsqtstylecodeformatter.cpp
tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp

index b02075e..c884e56 100644 (file)
@@ -258,6 +258,14 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
             default:            enter(expression); continue;
             } break;
 
+        case ternary_op:
+            if (kind == Colon) {
+                enter(ternary_op_after_colon);
+                enter(expression_continuation);
+                break;
+            }
+            // fallthrough
+        case ternary_op_after_colon:
         case expression:
             if (tryInsideExpression())
                 break;
@@ -332,18 +340,6 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
             default:                leave(); continue;
             } break;
 
-        case ternary_op:
-            if (tryInsideExpression())
-                break;
-            switch (kind) {
-            case RightParenthesis:
-            case RightBracket:
-            case RightBrace:
-            case Comma:
-            case Semicolon:         leave(); continue;
-            case Colon:             enter(expression); break; // entering expression makes maybe_continuation work
-            } break;
-
         case jsblock_open:
         case substatement_open:
             if (tryStatement())
@@ -494,7 +490,8 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
     // some states might be continued on the next line
     if (topState == expression
             || topState == expression_or_objectdefinition
-            || topState == objectliteral_assignment) {
+            || topState == objectliteral_assignment
+            || topState == ternary_op_after_colon) {
         enter(expression_maybe_continuation);
     }
     // multi-line comment start?
index 4a1f372..7af62d5 100644 (file)
@@ -145,6 +145,7 @@ public: // must be public to make Q_GADGET introspection work
         bracket_element_maybe_objectdefinition, // after an identifier in bracket_element_start
 
         ternary_op, // The ? : operator
+        ternary_op_after_colon, // after the : in a ternary
 
         jsblock_open,
 
index 4b809d8..176c016 100644 (file)
@@ -139,18 +139,15 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
         if (*indentDepth == tokenPosition) {
             // expression_or_objectdefinition doesn't want the indent
             // expression_or_label already has it
-            // ternary already adjusts indents nicely
             if (parentState.type != expression_or_objectdefinition
                     && parentState.type != expression_or_label
-                    && parentState.type != binding_assignment
-                    && parentState.type != ternary_op) {
+                    && parentState.type != binding_assignment) {
                 *indentDepth += 2*m_indentSize;
             }
         }
         // expression_or_objectdefinition and expression_or_label have already consumed the first token
         else if (parentState.type != expression_or_objectdefinition
-                 && parentState.type != expression_or_label
-                 && parentState.type != ternary_op) {
+                 && parentState.type != expression_or_label) {
             *indentDepth = tokenPosition;
         }
         break;
index 3dcfbdf..cc90b0b 100644 (file)
@@ -94,6 +94,7 @@ private Q_SLOTS:
     void labelledStatements1();
     void labelledStatements2();
     void labelledStatements3();
+    void multilineTernaryInProperty();
 };
 
 struct Line {
@@ -1198,6 +1199,29 @@ void tst_QMLCodeFormatter::labelledStatements3()
     checkIndent(data);
 }
 
+void tst_QMLCodeFormatter::multilineTernaryInProperty()
+{
+    QList<Line> data;
+    data << Line("Item {")
+         << Line("    property int a: 1 ?")
+         << Line("                        2 :")
+         << Line("                        3 +")
+         << Line("                        4")
+         << Line("    property int a: 1 ? 2")
+         << Line("                      : 3 +")
+         << Line("                        4")
+         << Line("    a: 1 ?")
+         << Line("           2 :")
+         << Line("           3")
+         << Line("    a: 1 ? 2")
+         << Line("         : 3 +")
+         << Line("           4")
+         << Line("    ba: 1")
+         << Line("}")
+         ;
+    checkIndent(data);
+}
+
 QTEST_APPLESS_MAIN(tst_QMLCodeFormatter)
 #include "tst_qmlcodeformatter.moc"