forked from qt-creator/qt-creator
C++ indenter: Fix for GNU and Whitesmiths style switch statement.
Task-number: QTCREATORBUG-2994
This commit is contained in:
@@ -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:
|
||||||
|
@@ -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"
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user