forked from qt-creator/qt-creator
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:
@@ -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?
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user