From: Daniel Jasper Date: Fri, 30 Aug 2013 10:10:19 +0000 (+0000) Subject: clang-format: Improve recovery from enums with errors. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4b434cf0c913a853cb5fd5011a631447836563b2;p=clang clang-format: Improve recovery from enums with errors. Before: namespace n { enum Type { One, Two, // missing }; int i; } void g() { } After: namespace n { enum Type { One, Two, // missing }; int i; } void g() {} git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189662 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index 9e4600b430..fb63899f47 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -937,6 +937,7 @@ void UnwrappedLineParser::parseEnum() { if (FormatTok->Tok.is(tok::identifier)) nextToken(); } + bool HasError = false; if (FormatTok->Tok.is(tok::l_brace)) { if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) addUnwrappedLine(); @@ -952,7 +953,17 @@ void UnwrappedLineParser::parseEnum() { 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(); diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 9c8efd882c..aef1dae6fd 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -1519,6 +1519,20 @@ TEST_F(FormatTest, FormatsEnum) { verifyFormat("enum X f() {\n a();\n return 42;\n}"); } +TEST_F(FormatTest, FormatsEnumsWithErrors) { + verifyFormat("enum Type {\n" + " One = 0;\n" // These semicolons should be commas. + " Two = 1;\n" + "};"); + verifyFormat("namespace n {\n" + "enum Type {\n" + " One,\n" + " Two,\n" // missing }; + " int i;\n" + "}\n" + "void g() {}"); +} + TEST_F(FormatTest, FormatsEnumStruct) { verifyFormat("enum struct {\n" " Zero,\n"