clang-format: Fix incorrect enum parsing / layouting.
Before:
enum {
Bar = Foo < int,
int > ::value
};
After:
enum {
Bar = Foo<int, int>::value
};
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190674 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp
index f1924c3..7066e15 100644
--- a/lib/Format/ContinuationIndenter.cpp
+++ b/lib/Format/ContinuationIndenter.cpp
@@ -106,8 +106,10 @@
const FormatToken &Previous = *Current.Previous;
if (Current.MustBreakBefore || Current.Type == TT_InlineASMColon)
return true;
- if (!Style.Cpp11BracedListStyle && Current.is(tok::r_brace) &&
- State.Stack.back().BreakBeforeClosingBrace)
+ if ((!Style.Cpp11BracedListStyle ||
+ (Current.MatchingParen &&
+ Current.MatchingParen->BlockKind == BK_Block)) &&
+ Current.is(tok::r_brace) && State.Stack.back().BreakBeforeClosingBrace)
return true;
if (Previous.is(tok::semi) && State.LineContainsContinuedForLoopSection)
return true;
@@ -224,7 +226,9 @@
State.Column <= Style.ColumnLimit / 2)
Penalty += Style.PenaltyBreakFirstLessLess;
- if (Current.is(tok::r_brace)) {
+ if (Current.is(tok::l_brace) && Current.BlockKind == BK_Block) {
+ State.Column = State.FirstIndent;
+ } else if (Current.is(tok::r_brace)) {
if (Current.MatchingParen &&
(Current.MatchingParen->BlockKind == BK_BracedInit ||
!Current.MatchingParen->Children.empty()))
@@ -524,14 +528,15 @@
// });
for (unsigned i = 0; i != Current.MatchingParen->FakeRParens; ++i)
State.Stack.pop_back();
- NewIndent = State.Stack.back().LastSpace;
+ NewIndent = State.Stack.back().LastSpace + Style.IndentWidth;
} else {
NewIndent = State.Stack.back().LastSpace +
(Style.Cpp11BracedListStyle ? 4 : Style.IndentWidth);
}
const FormatToken *NextNoComment = Current.getNextNonComment();
- AvoidBinPacking = NextNoComment &&
- NextNoComment->Type == TT_DesignatedInitializerPeriod;
+ AvoidBinPacking = Current.BlockKind == BK_Block ||
+ (NextNoComment &&
+ NextNoComment->Type == TT_DesignatedInitializerPeriod);
} else {
NewIndent = 4 + std::max(State.Stack.back().LastSpace,
State.Stack.back().StartOfFunctionCall);
@@ -545,6 +550,7 @@
State.Stack.push_back(ParenState(NewIndent, State.Stack.back().LastSpace,
AvoidBinPacking,
State.Stack.back().NoLineBreak));
+ State.Stack.back().BreakBeforeParameter = Current.BlockKind == BK_Block;
++State.ParenLevel;
}
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp
index 52f8b07..034f6e6 100644
--- a/lib/Format/Format.cpp
+++ b/lib/Format/Format.cpp
@@ -529,7 +529,7 @@
E = LBrace.Children.end();
I != E; ++I) {
unsigned Indent =
- ParentIndent + ((*I)->Level - Line.Level) * Style.IndentWidth;
+ ParentIndent + ((*I)->Level - Line.Level - 1) * Style.IndentWidth;
if (!DryRun) {
unsigned Newlines = std::min((*I)->First->NewlinesBefore,
Style.MaxEmptyLinesToKeep + 1);
diff --git a/lib/Format/FormatToken.cpp b/lib/Format/FormatToken.cpp
index 49e0ce8..7469216 100644
--- a/lib/Format/FormatToken.cpp
+++ b/lib/Format/FormatToken.cpp
@@ -36,6 +36,7 @@
// Ensure that we start on the opening brace.
const FormatToken *LBrace = State.NextToken->Previous->Previous;
if (LBrace->isNot(tok::l_brace) ||
+ LBrace->BlockKind == BK_Block ||
LBrace->Next->Type == TT_DesignatedInitializerPeriod)
return 0;
diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp
index dec631f..db17135 100644
--- a/lib/Format/TokenAnnotator.cpp
+++ b/lib/Format/TokenAnnotator.cpp
@@ -1057,6 +1057,12 @@
} else if (Current->Type == TT_CtorInitializerComma &&
Style.BreakConstructorInitializersBeforeComma) {
Current->MustBreakBefore = true;
+ } else if (Current->Previous->BlockKind == BK_Block &&
+ Current->isNot(tok::r_brace)) {
+ Current->MustBreakBefore = true;
+ } else if (Current->is(tok::l_brace) && (Current->BlockKind == BK_Block)) {
+ Current->MustBreakBefore =
+ Style.BreakBeforeBraces == FormatStyle::BS_Allman;
}
Current->CanBreakBefore =
Current->MustBreakBefore || canBreakBefore(Line, *Current);
diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp
index f70de5f..3fb46f2 100644
--- a/lib/Format/UnwrappedLineParser.cpp
+++ b/lib/Format/UnwrappedLineParser.cpp
@@ -759,7 +759,8 @@
return true;
}
-void UnwrappedLineParser::parseBracedList() {
+bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons) {
+ bool HasError = false;
nextToken();
// FIXME: Once we have an expression parser in the UnwrappedLineParser,
@@ -786,10 +787,13 @@
break;
case tok::r_brace:
nextToken();
- return;
+ return !HasError;
case tok::semi:
- // Probably a missing closing brace. Bail out.
- return;
+ HasError = true;
+ if (!ContinueOnSemicolons)
+ return !HasError;
+ nextToken();
+ break;
case tok::comma:
nextToken();
break;
@@ -798,6 +802,7 @@
break;
}
} while (!eof());
+ return false;
}
void UnwrappedLineParser::parseReturn() {
@@ -1046,42 +1051,14 @@
if (FormatTok->Tok.is(tok::identifier))
nextToken();
}
- bool HasError = false;
if (FormatTok->Tok.is(tok::l_brace)) {
- if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
+ FormatTok->BlockKind = BK_Block;
+ bool HasError = !parseBracedList(/*ContinueOnSemicolons=*/true);
+ if (HasError) {
+ if (FormatTok->is(tok::semi))
+ nextToken();
addUnwrappedLine();
- nextToken();
- addUnwrappedLine();
- ++Line->Level;
- do {
- switch (FormatTok->Tok.getKind()) {
- case tok::l_paren:
- parseParens();
- break;
- case tok::r_brace:
- addUnwrappedLine();
- nextToken();
- --Line->Level;
- if (HasError) {
- if (FormatTok->is(tok::semi))
- nextToken();
- addUnwrappedLine();
- }
- return;
- case tok::semi:
- HasError = true;
- nextToken();
- addUnwrappedLine();
- break;
- case tok::comma:
- nextToken();
- addUnwrappedLine();
- break;
- default:
- nextToken();
- break;
- }
- } while (!eof());
+ }
}
// We fall through to parsing a structural element afterwards, so that in
// enum A {} n, m;
diff --git a/lib/Format/UnwrappedLineParser.h b/lib/Format/UnwrappedLineParser.h
index c79c35e..3acdbd6 100644
--- a/lib/Format/UnwrappedLineParser.h
+++ b/lib/Format/UnwrappedLineParser.h
@@ -79,7 +79,7 @@
void parsePPUnknown();
void parseStructuralElement();
bool tryToParseBracedList();
- void parseBracedList();
+ bool parseBracedList(bool ContinueOnSemicolons = false);
void parseReturn();
void parseParens();
void parseIfThenElse();