default: leave(); continue;
} break;
+ case label:
+ switch (kind) {
+ case T_COLON: leave(); break;
+ default: leave(); continue; // shouldn't happen
+ } break;
+
case multiline_comment_start:
case multiline_comment_cont:
if (kind != T_COMMENT && kind != T_DOXY_COMMENT) {
enter(qt_like_macro);
return true;
}
+ if (m_tokens.size() > 1 && m_tokens.at(1).kind() == T_COLON) {
+ enter(label);
+ return true;
+ }
}
// fallthrough
case T_CHAR:
*indentDepth = 0;
}
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;
}
}
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
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.
using_start, // right after the "using" token
void gnuStyleSwitch();
void whitesmithsStyleSwitch();
void indentToNextToken();
+ void labels();
};
struct Line {
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)
#include "tst_codeformatter.moc"