QmlJS indenter: Fix ternary multiline indent.

Task-number: QTCREATORBUG-6208
Change-Id: I7e5267291bc01226b5339cb4abdbb15856c58477
Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
This commit is contained in:
Christian Kamm
2011-10-14 12:52:42 +02:00
parent 29dff7221d
commit ea24106373
4 changed files with 37 additions and 18 deletions

View File

@@ -258,6 +258,14 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
default: enter(expression); continue; default: enter(expression); continue;
} break; } break;
case ternary_op:
if (kind == Colon) {
enter(ternary_op_after_colon);
enter(expression_continuation);
break;
}
// fallthrough
case ternary_op_after_colon:
case expression: case expression:
if (tryInsideExpression()) if (tryInsideExpression())
break; break;
@@ -332,18 +340,6 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
default: leave(); continue; default: leave(); continue;
} break; } 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 jsblock_open:
case substatement_open: case substatement_open:
if (tryStatement()) if (tryStatement())
@@ -494,7 +490,8 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
// some states might be continued on the next line // some states might be continued on the next line
if (topState == expression if (topState == expression
|| topState == expression_or_objectdefinition || topState == expression_or_objectdefinition
|| topState == objectliteral_assignment) { || topState == objectliteral_assignment
|| topState == ternary_op_after_colon) {
enter(expression_maybe_continuation); enter(expression_maybe_continuation);
} }
// multi-line comment start? // multi-line comment start?

View 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 bracket_element_maybe_objectdefinition, // after an identifier in bracket_element_start
ternary_op, // The ? : operator ternary_op, // The ? : operator
ternary_op_after_colon, // after the : in a ternary
jsblock_open, jsblock_open,

View File

@@ -139,18 +139,15 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
if (*indentDepth == tokenPosition) { if (*indentDepth == tokenPosition) {
// expression_or_objectdefinition doesn't want the indent // expression_or_objectdefinition doesn't want the indent
// expression_or_label already has it // expression_or_label already has it
// ternary already adjusts indents nicely
if (parentState.type != expression_or_objectdefinition if (parentState.type != expression_or_objectdefinition
&& parentState.type != expression_or_label && parentState.type != expression_or_label
&& parentState.type != binding_assignment && parentState.type != binding_assignment) {
&& parentState.type != ternary_op) {
*indentDepth += 2*m_indentSize; *indentDepth += 2*m_indentSize;
} }
} }
// expression_or_objectdefinition and expression_or_label have already consumed the first token // expression_or_objectdefinition and expression_or_label have already consumed the first token
else if (parentState.type != expression_or_objectdefinition else if (parentState.type != expression_or_objectdefinition
&& parentState.type != expression_or_label && parentState.type != expression_or_label) {
&& parentState.type != ternary_op) {
*indentDepth = tokenPosition; *indentDepth = tokenPosition;
} }
break; break;

View File

@@ -94,6 +94,7 @@ private Q_SLOTS:
void labelledStatements1(); void labelledStatements1();
void labelledStatements2(); void labelledStatements2();
void labelledStatements3(); void labelledStatements3();
void multilineTernaryInProperty();
}; };
struct Line { struct Line {
@@ -1198,6 +1199,29 @@ void tst_QMLCodeFormatter::labelledStatements3()
checkIndent(data); 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) QTEST_APPLESS_MAIN(tst_QMLCodeFormatter)
#include "tst_qmlcodeformatter.moc" #include "tst_qmlcodeformatter.moc"