QmlJS: Fix indent of object literals.

Reviewed-by: Roberto Raggi
This commit is contained in:
Christian Kamm
2011-04-21 12:21:23 +02:00
parent e3928941ee
commit d0d0a8c07e
4 changed files with 92 additions and 5 deletions

View File

@@ -295,9 +295,24 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
if (tryInsideExpression()) if (tryInsideExpression())
break; break;
switch (kind) { switch (kind) {
case Colon: enter(objectliteral_assignment); break;
case RightBracket:
case RightParenthesis: leave(); continue; // error recovery
case RightBrace: leave(); break; case RightBrace: leave(); break;
} break; } break;
// pretty much like expression, but ends with , or }
case objectliteral_assignment:
if (tryInsideExpression())
break;
switch (kind) {
case Delimiter: enter(expression_continuation); break;
case RightBracket:
case RightParenthesis: leave(); continue; // error recovery
case RightBrace: leave(); continue; // so we also leave objectliteral_open
case Comma: leave(); break;
} break;
case bracket_element_start: case bracket_element_start:
switch (kind) { switch (kind) {
case Identifier: turnInto(bracket_element_maybe_objectdefinition); break; case Identifier: turnInto(bracket_element_maybe_objectdefinition); break;
@@ -451,7 +466,8 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
int topState = m_currentState.top().type; int topState = m_currentState.top().type;
if (topState == expression if (topState == expression
|| topState == expression_or_objectdefinition) { || topState == expression_or_objectdefinition
|| topState == objectliteral_assignment) {
enter(expression_maybe_continuation); enter(expression_maybe_continuation);
} }
if (topState != multiline_comment_start if (topState != multiline_comment_start
@@ -743,7 +759,8 @@ bool CodeFormatter::isExpressionEndState(int type) const
type == substatement_open || type == substatement_open ||
type == bracket_open || type == bracket_open ||
type == paren_open || type == paren_open ||
type == case_cont; type == case_cont ||
type == objectliteral_open;
} }
const Token &CodeFormatter::tokenAt(int idx) const const Token &CodeFormatter::tokenAt(int idx) const

View File

@@ -138,6 +138,8 @@ public: // must be public to make Q_GADGET introspection work
bracket_open, // opening [ in expression bracket_open, // opening [ in expression
objectliteral_open, // opening { in expression objectliteral_open, // opening { in expression
objectliteral_assignment, // after : in object literal
bracket_element_start, // after starting bracket_open or after ',' in bracket_open bracket_element_start, // after starting bracket_open or after ',' in bracket_open
bracket_element_maybe_objectdefinition, // after an identifier in bracket_element_start bracket_element_maybe_objectdefinition, // after an identifier in bracket_element_start

View File

@@ -117,6 +117,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
break; break;
case binding_assignment: case binding_assignment:
case objectliteral_assignment:
if (lastToken) if (lastToken)
*indentDepth = *savedIndentDepth + 4; *indentDepth = *savedIndentDepth + 4;
else else
@@ -203,6 +204,16 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
*indentDepth = *savedIndentDepth + m_indentSize; *indentDepth = *savedIndentDepth + m_indentSize;
break; break;
case objectliteral_open:
if (parentState.type == expression || parentState.type == objectliteral_assignment) {
// undo the continuation indent of the expression
*indentDepth = parentState.savedIndentDepth;
*savedIndentDepth = *indentDepth;
}
*indentDepth += m_indentSize;
break;
case statement_with_condition: case statement_with_condition:
case statement_with_block: case statement_with_block:
case if_statement: case if_statement:
@@ -290,7 +301,8 @@ void QtStyleCodeFormatter::adjustIndent(const QList<Token> &tokens, int lexerSta
const int type = state(i).type; const int type = state(i).type;
if (type == objectdefinition_open if (type == objectdefinition_open
|| type == jsblock_open || type == jsblock_open
|| type == substatement_open) { || type == substatement_open
|| type == objectliteral_open) {
*indentDepth = state(i).savedIndentDepth; *indentDepth = state(i).savedIndentDepth;
break; break;
} }

View File

@@ -83,7 +83,10 @@ private Q_SLOTS:
// void gnuStyle(); // void gnuStyle();
// void whitesmithsStyle(); // void whitesmithsStyle();
void expressionContinuation(); void expressionContinuation();
void objectLiteral(); void objectLiteral1();
void objectLiteral2();
void objectLiteral3();
void objectLiteral4();
void keywordStatement(); void keywordStatement();
void namespacedObjects(); void namespacedObjects();
}; };
@@ -962,7 +965,7 @@ void tst_QMLCodeFormatter::expressionContinuation()
checkIndent(data); checkIndent(data);
} }
void tst_QMLCodeFormatter::objectLiteral() void tst_QMLCodeFormatter::objectLiteral1()
{ {
QList<Line> data; QList<Line> data;
data << Line("function shuffle() {") data << Line("function shuffle() {")
@@ -974,6 +977,59 @@ void tst_QMLCodeFormatter::objectLiteral()
checkIndent(data); checkIndent(data);
} }
void tst_QMLCodeFormatter::objectLiteral2()
{
QList<Line> data;
data << Line("var x = {")
<< Line(" \"x\": 12,")
<< Line(" \"y\": 34,")
<< Line(" z: \"abc\"")
<< Line("}")
;
checkIndent(data);
}
void tst_QMLCodeFormatter::objectLiteral3()
{
QList<Line> data;
data << Line("var x = {")
<< Line(" x: {")
<< Line(" y: 12,")
<< Line(" z: [1, 3]")
<< Line(" },")
<< Line(" \"z\": {")
<< Line(" a: 1 + 2 + 3,")
<< Line(" b: \"12\"")
<< Line(" },")
<< Line(" a: b")
<< Line("}")
;
checkIndent(data);
}
void tst_QMLCodeFormatter::objectLiteral4()
{
QList<Line> data;
data << Line("var x = { a: 12, b: 13 }")
<< Line("y = {")
<< Line(" a: 1 +")
<< Line(" 2 + 3")
<< Line(" + 4")
<< Line("}")
<< Line("y = {")
<< Line(" a: 1 +")
<< Line(" 2 + 3")
<< Line(" + 4,")
<< Line(" b: {")
<< Line(" adef: 1 +")
<< Line(" 2 + 3")
<< Line(" + 4,")
<< Line(" }")
<< Line("}")
;
checkIndent(data);
}
void tst_QMLCodeFormatter::keywordStatement() void tst_QMLCodeFormatter::keywordStatement()
{ {
QList<Line> data; QList<Line> data;