forked from OSchip/llvm-project
Fixes various problems around enum parsing.
Very similar to what we do for record definitions: - tighten down what is an enum definition, so that we don't mistake a function for an enum - allow common idioms around declarations (we'll want to handle that more centrally in the future) We now correctly format: enum X f() { a(); return 42; } llvm-svn: 173075
This commit is contained in:
parent
085c5450d9
commit
2cec01916c
|
@ -329,7 +329,7 @@ void UnwrappedLineParser::parseStructuralElement() {
|
|||
switch (FormatTok.Tok.getKind()) {
|
||||
case tok::kw_enum:
|
||||
parseEnum();
|
||||
return;
|
||||
break;
|
||||
case tok::kw_struct:
|
||||
case tok::kw_union:
|
||||
case tok::kw_class:
|
||||
|
@ -580,39 +580,50 @@ void UnwrappedLineParser::parseAccessSpecifier() {
|
|||
}
|
||||
|
||||
void UnwrappedLineParser::parseEnum() {
|
||||
bool HasContents = false;
|
||||
do {
|
||||
switch (FormatTok.Tok.getKind()) {
|
||||
case tok::l_brace:
|
||||
nextToken();
|
||||
addUnwrappedLine();
|
||||
++Line->Level;
|
||||
parseComments();
|
||||
break;
|
||||
case tok::l_paren:
|
||||
nextToken();
|
||||
if (FormatTok.Tok.is(tok::identifier) ||
|
||||
FormatTok.Tok.is(tok::kw___attribute) ||
|
||||
FormatTok.Tok.is(tok::kw___declspec)) {
|
||||
nextToken();
|
||||
// We can have macros or attributes in between 'enum' and the enum name.
|
||||
if (FormatTok.Tok.is(tok::l_paren)) {
|
||||
parseParens();
|
||||
break;
|
||||
case tok::comma:
|
||||
nextToken();
|
||||
addUnwrappedLine();
|
||||
parseComments();
|
||||
break;
|
||||
case tok::r_brace:
|
||||
if (HasContents)
|
||||
addUnwrappedLine();
|
||||
--Line->Level;
|
||||
nextToken();
|
||||
break;
|
||||
case tok::semi:
|
||||
nextToken();
|
||||
addUnwrappedLine();
|
||||
return;
|
||||
default:
|
||||
HasContents = true;
|
||||
nextToken();
|
||||
break;
|
||||
}
|
||||
} while (!eof());
|
||||
if (FormatTok.Tok.is(tok::identifier))
|
||||
nextToken();
|
||||
}
|
||||
if (FormatTok.Tok.is(tok::l_brace)) {
|
||||
nextToken();
|
||||
addUnwrappedLine();
|
||||
++Line->Level;
|
||||
do {
|
||||
switch (FormatTok.Tok.getKind()) {
|
||||
case tok::comment:
|
||||
// FIXME: Handle comments centrally, instead of special casing
|
||||
// them everywhere.
|
||||
parseComments();
|
||||
break;
|
||||
case tok::l_paren:
|
||||
parseParens();
|
||||
break;
|
||||
case tok::r_brace:
|
||||
addUnwrappedLine();
|
||||
nextToken();
|
||||
--Line->Level;
|
||||
return;
|
||||
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;
|
||||
// "} n, m;" will end up in one unwrapped line.
|
||||
}
|
||||
|
||||
void UnwrappedLineParser::parseRecord() {
|
||||
|
|
|
@ -499,6 +499,10 @@ TEST_F(FormatTest, FormatsEnum) {
|
|||
"};");
|
||||
verifyFormat("enum {\n"
|
||||
"};");
|
||||
verifyFormat("enum X E {\n} d;");
|
||||
verifyFormat("enum __attribute__((...)) E {\n} d;");
|
||||
verifyFormat("enum __declspec__((...)) E {\n} d;");
|
||||
verifyFormat("enum X f() {\n a();\n return 42;\n}");
|
||||
}
|
||||
|
||||
TEST_F(FormatTest, FormatsBitfields) {
|
||||
|
|
Loading…
Reference in New Issue