C++ indenter: Fix labels.

Reviewed-by: Roberto Raggi
This commit is contained in:
Christian Kamm
2010-12-01 10:19:53 +01:00
parent bb654838cf
commit c5c4bacda9
3 changed files with 37 additions and 0 deletions

View File

@@ -382,6 +382,12 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
default: leave(); continue; default: leave(); continue;
} break; } break;
case label:
switch (kind) {
case T_COLON: leave(); break;
default: leave(); continue; // shouldn't happen
} break;
case multiline_comment_start: case multiline_comment_start:
case multiline_comment_cont: case multiline_comment_cont:
if (kind != T_COMMENT && kind != T_DOXY_COMMENT) { if (kind != T_COMMENT && kind != T_DOXY_COMMENT) {
@@ -710,6 +716,10 @@ bool CodeFormatter::tryDeclaration()
enter(qt_like_macro); enter(qt_like_macro);
return true; return true;
} }
if (m_tokens.size() > 1 && m_tokens.at(1).kind() == T_COLON) {
enter(label);
return true;
}
} }
// fallthrough // fallthrough
case T_CHAR: case T_CHAR:
@@ -1428,6 +1438,16 @@ void QtStyleCodeFormatter::adjustIndent(const QList<CPlusPlus::Token> &tokens, i
*indentDepth = 0; *indentDepth = 0;
} }
break; break;
case T_IDENTIFIER:
if (topState.type == substatement
|| topState.type == substatement_open
|| topState.type == case_cont
|| topState.type == block_open
|| topState.type == defun_open) {
if (tokens.size() > 1 && tokens.at(1).kind() == T_COLON) // label?
*indentDepth = 0;
}
break;
} }
} }

View File

@@ -112,6 +112,7 @@ public: // must be public to make Q_GADGET introspection work
cpp_macro_cont, // Subsequent lines of a multi-line C preprocessor macro definition. cpp_macro_cont, // Subsequent lines of a multi-line C preprocessor macro definition.
cpp_macro_conditional, // Special marker used for separating saved from current state when dealing with #ifdef cpp_macro_conditional, // Special marker used for separating saved from current state when dealing with #ifdef
qt_like_macro, // after an identifier starting with Q_ or QT_ at the beginning of the line qt_like_macro, // after an identifier starting with Q_ or QT_ at the beginning of the line
label, // after an identifier followed by a colon
defun_open, // Brace that opens a top-level function definition. defun_open, // Brace that opens a top-level function definition.
using_start, // right after the "using" token using_start, // right after the "using" token

View File

@@ -57,6 +57,7 @@ private Q_SLOTS:
void gnuStyleSwitch(); void gnuStyleSwitch();
void whitesmithsStyleSwitch(); void whitesmithsStyleSwitch();
void indentToNextToken(); void indentToNextToken();
void labels();
}; };
struct Line { struct Line {
@@ -1116,6 +1117,21 @@ void tst_CodeFormatter::indentToNextToken()
checkIndent(data); checkIndent(data);
} }
void tst_CodeFormatter::labels()
{
QList<Line> data;
data << Line("void foo() {")
<< Line("lab:")
<< Line(" int abc;")
<< Line("def:")
<< Line(" if (a)")
<< Line("boo:")
<< Line(" foo;")
<< Line(" int j;")
;
checkIndent(data);
}
QTEST_APPLESS_MAIN(tst_CodeFormatter) QTEST_APPLESS_MAIN(tst_CodeFormatter)
#include "tst_codeformatter.moc" #include "tst_codeformatter.moc"