C++ indenter: Fix for GNU and Whitesmiths style switch statement.

Task-number: QTCREATORBUG-2994
This commit is contained in:
Christian Kamm
2010-11-04 14:07:58 +01:00
parent 338a349dff
commit d2468a4491
2 changed files with 82 additions and 5 deletions

View File

@@ -1198,7 +1198,11 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
break; break;
case block_open: case block_open:
if (parentState.type != case_cont) // case_cont already adds some indent, revert it for a block
if (parentState.type == case_cont && !m_indentSubstatementBraces)
*indentDepth = *savedIndentDepth = parentState.savedIndentDepth;
if (m_indentSubstatementStatements)
*indentDepth += m_indentSize; *indentDepth += m_indentSize;
break; break;
@@ -1302,6 +1306,8 @@ void QtStyleCodeFormatter::adjustIndent(const QList<CPlusPlus::Token> &tokens, i
case T_LBRACE: { case T_LBRACE: {
if (topState.type == case_cont) { if (topState.type == case_cont) {
*indentDepth = topState.savedIndentDepth; *indentDepth = topState.savedIndentDepth;
if (m_indentSubstatementBraces)
*indentDepth += m_indentSize;
*paddingDepth = 0; *paddingDepth = 0;
// function definition - argument list is expression state // function definition - argument list is expression state
} else if (topState.type == expression && previousState.type == declaration_start) { } else if (topState.type == expression && previousState.type == declaration_start) {
@@ -1332,8 +1338,8 @@ void QtStyleCodeFormatter::adjustIndent(const QList<CPlusPlus::Token> &tokens, i
} }
case T_RBRACE: { case T_RBRACE: {
if (topState.type == block_open && previousState.type == case_cont) { if (topState.type == block_open && previousState.type == case_cont) {
*indentDepth = previousState.savedIndentDepth; *indentDepth = topState.savedIndentDepth;
*paddingDepth = previousState.savedPaddingDepth; *paddingDepth = topState.savedPaddingDepth;
break; break;
} }
for (int i = 0; state(i).type != topmost_intro; ++i) { for (int i = 0; state(i).type != topmost_intro; ++i) {
@@ -1365,10 +1371,16 @@ void QtStyleCodeFormatter::adjustIndent(const QList<CPlusPlus::Token> &tokens, i
// } // }
// break; // break;
case T_DEFAULT: case T_DEFAULT:
case T_CASE: case T_CASE: {
int lastSubstatementIndent = 0;
for (int i = 0; state(i).type != topmost_intro; ++i) { for (int i = 0; state(i).type != topmost_intro; ++i) {
const int type = state(i).type; const int type = state(i).type;
if (type == switch_statement || type == case_cont) { if (type == substatement_open) {
lastSubstatementIndent = state(i).savedIndentDepth;
} else if (type == switch_statement) {
*indentDepth = lastSubstatementIndent;
break;
} else if (type == case_cont) {
*indentDepth = state(i).savedIndentDepth; *indentDepth = state(i).savedIndentDepth;
break; break;
} else if (type == topmost_intro) { } else if (type == topmost_intro) {
@@ -1376,6 +1388,7 @@ void QtStyleCodeFormatter::adjustIndent(const QList<CPlusPlus::Token> &tokens, i
} }
} }
break; break;
}
case T_PUBLIC: case T_PUBLIC:
case T_PRIVATE: case T_PRIVATE:
case T_PROTECTED: case T_PROTECTED:

View File

@@ -54,6 +54,8 @@ private Q_SLOTS:
void macrosNoSemicolon2(); void macrosNoSemicolon2();
void renamedNamespace(); void renamedNamespace();
void cpp0xFor(); void cpp0xFor();
void gnuStyleSwitch();
void whitesmithsStyleSwitch();
}; };
struct Line { struct Line {
@@ -820,6 +822,9 @@ void tst_CodeFormatter::gnuStyle()
<< Line(" if (b) {") << Line(" if (b) {")
<< Line(" fpp;") << Line(" fpp;")
<< Line(" }") << Line(" }")
<< Line(" {")
<< Line(" foo;")
<< Line(" }")
<< Line(" }") << Line(" }")
<< Line("};") << Line("};")
; ;
@@ -840,6 +845,9 @@ void tst_CodeFormatter::whitesmithsStyle()
<< Line(" if (b) {") << Line(" if (b) {")
<< Line(" fpp;") << Line(" fpp;")
<< Line(" }") << Line(" }")
<< Line(" {")
<< Line(" foo;")
<< Line(" }")
<< Line(" }") << Line(" }")
<< Line(" };") << Line(" };")
; ;
@@ -1034,6 +1042,62 @@ void tst_CodeFormatter::cpp0xFor()
checkIndent(data); checkIndent(data);
} }
void tst_CodeFormatter::gnuStyleSwitch()
{
QList<Line> data;
data << Line("void foo()")
<< Line("{")
<< Line(" switch (a)")
<< Line(" {")
<< Line(" case 1:")
<< Line(" foo;")
<< Line(" break;")
<< Line(" case 2: {")
<< Line(" bar;")
<< Line(" continue;")
<< Line(" }")
<< Line(" case 3:")
<< Line(" {")
<< Line(" bar;")
<< Line(" continue;")
<< Line(" }")
<< Line(" case 4:")
<< Line(" case 5:")
<< Line(" ;")
<< Line(" }")
<< Line("}")
;
checkIndent(data, 1);
}
void tst_CodeFormatter::whitesmithsStyleSwitch()
{
QList<Line> data;
data << Line("void foo()")
<< Line(" {")
<< Line(" switch (a)")
<< Line(" {")
<< Line(" case 1:")
<< Line(" foo;")
<< Line(" break;")
<< Line(" case 2: {")
<< Line(" bar;")
<< Line(" continue;")
<< Line(" }")
<< Line(" case 3:")
<< Line(" {")
<< Line(" bar;")
<< Line(" continue;")
<< Line(" }")
<< Line(" case 4:")
<< Line(" case 5:")
<< Line(" ;")
<< Line(" }")
<< Line(" }")
;
checkIndent(data, 2);
}
QTEST_APPLESS_MAIN(tst_CodeFormatter) QTEST_APPLESS_MAIN(tst_CodeFormatter)
#include "tst_codeformatter.moc" #include "tst_codeformatter.moc"