[clang-format] Add new style option IndentGotoLabels
Summary: This option determines whether goto labels are indented according to scope. Setting this option to false causes goto labels to be flushed to the left. This is mostly copied from [[ http://lists.llvm.org/pipermail/cfe-dev/2015-September/045014.html | this patch ]] submitted by Christian Neukirchen that didn't make its way into trunk. ``` true: false: int f() { vs. int f() { if (foo()) { if (foo()) { label1: label1: bar(); bar(); } } label2: label2: return 1; return 1; } } ``` Reviewers: klimek, MyDeveloperDay Reviewed By: MyDeveloperDay Subscribers: cfe-commits Tags: #clang, #clang-tools-extra Patch by: tetsuo-cpp Differential Revision: https://reviews.llvm.org/D67037 llvm-svn: 371719
This commit is contained in:
parent
f1286621eb
commit
3867a2d510
|
@ -1527,6 +1527,23 @@ the configuration (without a prefix: ``Auto``).
|
|||
plop(); plop();
|
||||
} }
|
||||
|
||||
**IndentGotoLabels** (``bool``)
|
||||
Indent goto labels.
|
||||
|
||||
When ``false``, goto labels are flushed left.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
true: false:
|
||||
int f() { vs. int f() {
|
||||
if (foo()) { if (foo()) {
|
||||
label1: label1:
|
||||
bar(); bar();
|
||||
} }
|
||||
label2: label2:
|
||||
return 1; return 1;
|
||||
} }
|
||||
|
||||
**IndentPPDirectives** (``PPDirectiveIndentStyle``)
|
||||
The preprocessor directive indenting style to use.
|
||||
|
||||
|
|
|
@ -1265,6 +1265,22 @@ struct FormatStyle {
|
|||
/// \endcode
|
||||
bool IndentCaseLabels;
|
||||
|
||||
/// Indent goto labels.
|
||||
///
|
||||
/// When ``false``, goto labels are flushed left.
|
||||
/// \code
|
||||
/// true: false:
|
||||
/// int f() { vs. int f() {
|
||||
/// if (foo()) { if (foo()) {
|
||||
/// label1: label1:
|
||||
/// bar(); bar();
|
||||
/// } }
|
||||
/// label2: label2:
|
||||
/// return 1; return 1;
|
||||
/// } }
|
||||
/// \endcode
|
||||
bool IndentGotoLabels;
|
||||
|
||||
/// Options for indenting preprocessor directives.
|
||||
enum PPDirectiveIndentStyle {
|
||||
/// Does not indent any directives.
|
||||
|
@ -1990,6 +2006,7 @@ struct FormatStyle {
|
|||
IncludeStyle.IncludeBlocks == R.IncludeStyle.IncludeBlocks &&
|
||||
IncludeStyle.IncludeCategories == R.IncludeStyle.IncludeCategories &&
|
||||
IndentCaseLabels == R.IndentCaseLabels &&
|
||||
IndentGotoLabels == R.IndentGotoLabels &&
|
||||
IndentPPDirectives == R.IndentPPDirectives &&
|
||||
IndentWidth == R.IndentWidth && Language == R.Language &&
|
||||
IndentWrappedFunctionNames == R.IndentWrappedFunctionNames &&
|
||||
|
|
|
@ -453,6 +453,7 @@ template <> struct MappingTraits<FormatStyle> {
|
|||
IO.mapOptional("IncludeCategories", Style.IncludeStyle.IncludeCategories);
|
||||
IO.mapOptional("IncludeIsMainRegex", Style.IncludeStyle.IncludeIsMainRegex);
|
||||
IO.mapOptional("IndentCaseLabels", Style.IndentCaseLabels);
|
||||
IO.mapOptional("IndentGotoLabels", Style.IndentGotoLabels);
|
||||
IO.mapOptional("IndentPPDirectives", Style.IndentPPDirectives);
|
||||
IO.mapOptional("IndentWidth", Style.IndentWidth);
|
||||
IO.mapOptional("IndentWrappedFunctionNames",
|
||||
|
@ -725,6 +726,7 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
|
|||
LLVMStyle.IncludeStyle.IncludeIsMainRegex = "(Test)?$";
|
||||
LLVMStyle.IncludeStyle.IncludeBlocks = tooling::IncludeStyle::IBS_Preserve;
|
||||
LLVMStyle.IndentCaseLabels = false;
|
||||
LLVMStyle.IndentGotoLabels = true;
|
||||
LLVMStyle.IndentPPDirectives = FormatStyle::PPDIS_None;
|
||||
LLVMStyle.IndentWrappedFunctionNames = false;
|
||||
LLVMStyle.IndentWidth = 2;
|
||||
|
|
|
@ -1351,7 +1351,7 @@ void UnwrappedLineParser::parseStructuralElement() {
|
|||
(TokenCount == 2 && Line->Tokens.front().Tok->is(tok::comment))) {
|
||||
if (FormatTok->Tok.is(tok::colon) && !Line->MustBeDeclaration) {
|
||||
Line->Tokens.begin()->Tok->MustBreakBefore = true;
|
||||
parseLabel();
|
||||
parseLabel(!Style.IndentGotoLabels);
|
||||
return;
|
||||
}
|
||||
// Recognize function-like macro usages without trailing semicolon as
|
||||
|
@ -1970,11 +1970,13 @@ void UnwrappedLineParser::parseDoWhile() {
|
|||
parseStructuralElement();
|
||||
}
|
||||
|
||||
void UnwrappedLineParser::parseLabel() {
|
||||
void UnwrappedLineParser::parseLabel(bool LeftAlignLabel) {
|
||||
nextToken();
|
||||
unsigned OldLineLevel = Line->Level;
|
||||
if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0))
|
||||
--Line->Level;
|
||||
if (LeftAlignLabel)
|
||||
Line->Level = 0;
|
||||
if (CommentsBeforeNextToken.empty() && FormatTok->Tok.is(tok::l_brace)) {
|
||||
CompoundStatementIndenter Indenter(this, Line->Level,
|
||||
Style.BraceWrapping.AfterCaseLabel,
|
||||
|
|
|
@ -106,7 +106,7 @@ private:
|
|||
void parseTryCatch();
|
||||
void parseForOrWhileLoop();
|
||||
void parseDoWhile();
|
||||
void parseLabel();
|
||||
void parseLabel(bool LeftAlignLabel = false);
|
||||
void parseCaseLabel();
|
||||
void parseSwitch();
|
||||
void parseNamespace();
|
||||
|
|
|
@ -1408,6 +1408,30 @@ TEST_F(FormatTest, FormatsLabels) {
|
|||
"test_label:;\n"
|
||||
" int i = 0;\n"
|
||||
"}");
|
||||
FormatStyle Style = getLLVMStyle();
|
||||
Style.IndentGotoLabels = false;
|
||||
verifyFormat("void f() {\n"
|
||||
" some_code();\n"
|
||||
"test_label:\n"
|
||||
" some_other_code();\n"
|
||||
" {\n"
|
||||
" some_more_code();\n"
|
||||
"another_label:\n"
|
||||
" some_more_code();\n"
|
||||
" }\n"
|
||||
"}",
|
||||
Style);
|
||||
verifyFormat("{\n"
|
||||
" some_code();\n"
|
||||
"test_label:\n"
|
||||
" some_other_code();\n"
|
||||
"}",
|
||||
Style);
|
||||
verifyFormat("{\n"
|
||||
" some_code();\n"
|
||||
"test_label:;\n"
|
||||
" int i = 0;\n"
|
||||
"}");
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -11779,6 +11803,7 @@ TEST_F(FormatTest, ParsesConfigurationBools) {
|
|||
CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
|
||||
CHECK_PARSE_BOOL(DisableFormat);
|
||||
CHECK_PARSE_BOOL(IndentCaseLabels);
|
||||
CHECK_PARSE_BOOL(IndentGotoLabels);
|
||||
CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
|
||||
CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
|
||||
CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
|
||||
|
|
Loading…
Reference in New Issue