QmlJS indenter: Fix indentation for property initializers.

property int foo: {

used to start an object literal but is a block statement now.

Change-Id: I9ffbce4927b444314f1a43aba65ca3d9d234e47c
Reviewed-on: http://codereview.qt-project.org/4339
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
This commit is contained in:
Christian Kamm
2011-09-07 12:06:46 +02:00
parent 84364b7884
commit 62a71b75a0
4 changed files with 24 additions and 41 deletions

View File

@@ -166,21 +166,6 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
default: enter(expression); continue; default: enter(expression); continue;
} break; } break;
// property inits don't take statements
case property_initializer:
switch (kind) {
case Semicolon: leave(true); break;
case LeftBrace: enter(objectliteral_open); break;
case On:
case As:
case List:
case Import:
case Signal:
case Property:
case Identifier: enter(expression_or_objectdefinition); break;
default: enter(expression); continue;
} break;
case objectdefinition_open: case objectdefinition_open:
switch (kind) { switch (kind) {
case RightBrace: leave(true); break; case RightBrace: leave(true); break;
@@ -222,7 +207,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
case property_maybe_initializer: case property_maybe_initializer:
switch (kind) { switch (kind) {
case Colon: enter(property_initializer); break; case Colon: turnInto(binding_assignment); break;
default: leave(true); continue; default: leave(true); continue;
} break; } break;

View File

@@ -127,7 +127,6 @@ public: // must be public to make Q_GADGET introspection work
binding_or_objectdefinition, // after an identifier binding_or_objectdefinition, // after an identifier
binding_assignment, // after : in a binding binding_assignment, // after : in a binding
property_initializer, // after : in a property
objectdefinition_open, // after { objectdefinition_open, // after {
expression, expression,

View File

@@ -101,7 +101,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
switch (newState) { switch (newState) {
case objectdefinition_open: { case objectdefinition_open: {
// special case for things like "gradient: Gradient {" // special case for things like "gradient: Gradient {"
if (parentState.type == binding_assignment || parentState.type == property_initializer) if (parentState.type == binding_assignment)
*savedIndentDepth = state(1).savedIndentDepth; *savedIndentDepth = state(1).savedIndentDepth;
if (firstToken) if (firstToken)
@@ -117,7 +117,6 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
break; break;
case binding_assignment: case binding_assignment:
case property_initializer:
case objectliteral_assignment: case objectliteral_assignment:
if (lastToken) if (lastToken)
*indentDepth = *savedIndentDepth + 4; *indentDepth = *savedIndentDepth + 4;
@@ -134,7 +133,6 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
// ternary already adjusts indents nicely // ternary already adjusts indents nicely
if (parentState.type != expression_or_objectdefinition if (parentState.type != expression_or_objectdefinition
&& parentState.type != binding_assignment && parentState.type != binding_assignment
&& parentState.type != property_initializer
&& parentState.type != ternary_op) { && parentState.type != ternary_op) {
*indentDepth += 2 * m_indentSize; *indentDepth += 2 * m_indentSize;
} }
@@ -155,8 +153,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
break; break;
case bracket_open: case bracket_open:
if (parentState.type == expression && (state(1).type == binding_assignment if (parentState.type == expression && state(1).type == binding_assignment) {
|| state(1).type == property_initializer)) {
*savedIndentDepth = state(2).savedIndentDepth; *savedIndentDepth = state(2).savedIndentDepth;
*indentDepth = *savedIndentDepth + m_indentSize; *indentDepth = *savedIndentDepth + m_indentSize;
} else if (!lastToken) { } else if (!lastToken) {
@@ -201,16 +198,15 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
} }
// fallthrough // fallthrough
case substatement_open: case substatement_open:
// special case for foo: { // special case for "foo: {" and "property int foo: {"
if (parentState.type == binding_assignment && state(1).type == binding_or_objectdefinition) if (parentState.type == binding_assignment)
*savedIndentDepth = state(1).savedIndentDepth; *savedIndentDepth = state(1).savedIndentDepth;
*indentDepth = *savedIndentDepth + m_indentSize; *indentDepth = *savedIndentDepth + m_indentSize;
break; break;
case objectliteral_open: case objectliteral_open:
if (parentState.type == expression if (parentState.type == expression
|| parentState.type == objectliteral_assignment || parentState.type == objectliteral_assignment) {
|| parentState.type == property_initializer) {
// undo the continuation indent of the expression // undo the continuation indent of the expression
*indentDepth = parentState.savedIndentDepth; *indentDepth = parentState.savedIndentDepth;
*savedIndentDepth = *indentDepth; *savedIndentDepth = *indentDepth;
@@ -293,7 +289,6 @@ void QtStyleCodeFormatter::adjustIndent(const QList<Token> &tokens, int lexerSta
case LeftBrace: case LeftBrace:
if (topState.type == substatement if (topState.type == substatement
|| topState.type == binding_assignment || topState.type == binding_assignment
|| topState.type == property_initializer
|| topState.type == case_cont) { || topState.type == case_cont) {
*indentDepth = topState.savedIndentDepth; *indentDepth = topState.savedIndentDepth;
} }

View File

@@ -87,7 +87,7 @@ private Q_SLOTS:
void objectLiteral2(); void objectLiteral2();
void objectLiteral3(); void objectLiteral3();
void objectLiteral4(); void objectLiteral4();
void objectLiteral5(); void propertyWithStatement();
void keywordStatement(); void keywordStatement();
void namespacedObjects(); void namespacedObjects();
}; };
@@ -1031,24 +1031,28 @@ void tst_QMLCodeFormatter::objectLiteral4()
checkIndent(data); checkIndent(data);
} }
void tst_QMLCodeFormatter::objectLiteral5() void tst_QMLCodeFormatter::propertyWithStatement()
{ {
QList<Line> data; QList<Line> data;
data << Line("Rectangle {") data << Line("Rectangle {")
<< Line(" property int x: { a: 12, b: 13 }") << Line(" property int x: { if (a) break }")
<< Line(" property int y: {") << Line(" property int y: {")
<< Line(" a: 1 +") << Line(" if (a)")
<< Line(" 2 + 3") << Line(" break")
<< Line(" + 4") << Line(" switch (a) {")
<< Line(" case 1:")
<< Line(" case 2:")
<< Line(" continue")
<< Line(" }")
<< Line(" }") << Line(" }")
<< Line(" property int y: {") << Line(" property int y:")
<< Line(" a: 1 +") << Line(" {")
<< Line(" 2 + 3") << Line(" if (a)")
<< Line(" + 4,") << Line(" break")
<< Line(" b: {") << Line(" switch (a) {")
<< Line(" adef: 1 +") << Line(" case 1:")
<< Line(" 2 + 3") << Line(" case 2:")
<< Line(" + 4,") << Line(" continue")
<< Line(" }") << Line(" }")
<< Line(" }") << Line(" }")
<< Line("}") << Line("}")