Commit 1862282b authored by Christian Kamm's avatar Christian Kamm
Browse files

C++ indenter: Fix nested array/struct initializers.

parent 16367a03
......@@ -1008,6 +1008,9 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
const int tokenPosition = column(tk.begin());
const bool firstToken = (tokenIndex() == 0);
const bool lastToken = (tokenIndex() == tokenCount() - 1);
int nextTokenStart = 0;
if (!lastToken)
nextTokenStart = column(tokenAt(tokenIndex() + 1).begin());
switch (newState) {
case namespace_start:
......@@ -1136,10 +1139,14 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
break;
case brace_list_open:
if (parentState.type != initializer)
*indentDepth = parentState.savedIndentDepth + m_indentSize;
else if (lastToken) {
*savedIndentDepth = state(1).savedIndentDepth;
if (!lastToken) {
if (parentState.type == initializer)
*savedIndentDepth = tokenPosition;
*indentDepth = nextTokenStart;
} else {
// avoid existing continuation indents
if (parentState.type == initializer)
*savedIndentDepth = state(1).savedIndentDepth;
*indentDepth = *savedIndentDepth + m_indentSize;
}
break;
......@@ -1256,6 +1263,7 @@ void QtStyleCodeFormatter::adjustIndent(const QList<CPlusPlus::Token> &tokens, i
} else if (topState.type != defun_open
&& topState.type != block_open
&& topState.type != substatement_open
&& topState.type != brace_list_open
&& !topWasMaybeElse) {
*indentDepth = topState.savedIndentDepth;
}
......
......@@ -46,6 +46,7 @@ private Q_SLOTS:
void functionReturnType();
void streamOp();
void blockStmtInIf();
void nestedInitializer();
};
struct Line {
......@@ -613,9 +614,9 @@ void tst_CodeFormatter::braceList()
<< Line(" b = 4")
<< Line(" };")
<< Line("void foo () {")
<< Line(" int[] a = { foo, bar, ")
<< Line(" car };")
<< Line(" int[] a = {")
<< Line(" int a[] = { foo, bar, ")
<< Line(" car };")
<< Line(" int a[] = {")
<< Line(" a, b,")
<< Line(" c")
<< Line(" };")
......@@ -837,6 +838,36 @@ void tst_CodeFormatter::blockStmtInIf()
checkIndent(data);
}
void tst_CodeFormatter::nestedInitializer()
{
QList<Line> data;
data
<< Line("SomeStruct v[] = {")
<< Line(" {2}, {3},")
<< Line(" {4}, {5},")
<< Line("};")
<< Line("S v[] = {{1}, {2},")
<< Line(" {3}, {4},")
<< Line(" };")
<< Line("SomeStruct v[] = {")
<< Line(" {")
<< Line(" {2, 3,")
<< Line(" 4, 5},")
<< Line(" {1},")
<< Line(" }")
<< Line("};")
<< Line("SomeStruct v[] = {{{2, 3},")
<< Line(" {4, 5}")
<< Line(" },")
<< Line(" {{2, 3},")
<< Line(" {4, 5},")
<< Line(" }")
<< Line(" };")
<< Line("int i;")
;
checkIndent(data);
}
QTEST_APPLESS_MAIN(tst_CodeFormatter)
#include "tst_codeformatter.moc"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment