r189662 - clang-format: Improve recovery from enums with errors.

Daniel Jasper djasper at google.com
Fri Aug 30 03:10:20 PDT 2013


Author: djasper
Date: Fri Aug 30 05:10:19 2013
New Revision: 189662

URL: http://llvm.org/viewvc/llvm-project?rev=189662&view=rev
Log:
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() {}

Modified:
    cfe/trunk/lib/Format/UnwrappedLineParser.cpp
    cfe/trunk/unittests/Format/FormatTest.cpp

Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=189662&r1=189661&r2=189662&view=diff
==============================================================================
--- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original)
+++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Fri Aug 30 05:10:19 2013
@@ -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();

Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=189662&r1=189661&r2=189662&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Fri Aug 30 05:10:19 2013
@@ -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"





More information about the cfe-commits mailing list