]> granicus.if.org Git - clang/commitdiff
clang-format: Fix switch/case interaction with macros.
authorDaniel Jasper <djasper@google.com>
Thu, 25 Jul 2013 11:31:57 +0000 (11:31 +0000)
committerDaniel Jasper <djasper@google.com>
Thu, 25 Jul 2013 11:31:57 +0000 (11:31 +0000)
Before:
  #define OPERATION_CASE(name) \
    case OP_name:              \
    return operations::Operation##name

  switch (OpCode) {
      CASE(Add);
      CASE(Subtract);
    default:
      return operations::Unknown;
  }

After:
  #define OPERATION_CASE(name) \
    case OP_name:              \
      return operations::Operation##name;

  switch (OpCode) {
    CASE(Add);
    CASE(Subtract);
    default:
      return operations::Unknown;
  }

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187118 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Format/UnwrappedLineParser.cpp
unittests/Format/FormatTest.cpp

index 77f98bffda227254ff3ee8a643963451bbcd826c..939a301e9d7f892a91be9dff750211f797616935 100644 (file)
@@ -213,6 +213,7 @@ void UnwrappedLineParser::parseFile() {
 }
 
 void UnwrappedLineParser::parseLevel(bool HasOpeningBrace) {
+  bool SwitchLabelEncountered = false;
   do {
     switch (FormatTok->Tok.getKind()) {
     case tok::comment:
@@ -232,6 +233,13 @@ void UnwrappedLineParser::parseLevel(bool HasOpeningBrace) {
       nextToken();
       addUnwrappedLine();
       break;
+    case tok::kw_default:
+    case tok::kw_case:
+      if (!SwitchLabelEncountered)
+        Line->Level += Style.IndentCaseLabels;
+      SwitchLabelEncountered = true;
+      parseStructuralElement();
+      break;
     default:
       parseStructuralElement();
       break;
@@ -314,6 +322,7 @@ void UnwrappedLineParser::calculateBraceTypes() {
 void UnwrappedLineParser::parseBlock(bool MustBeDeclaration,
                                      unsigned AddLevels) {
   assert(FormatTok->Tok.is(tok::l_brace) && "'{' expected");
+  unsigned InitialLevel = Line->Level;
   nextToken();
 
   addUnwrappedLine();
@@ -324,13 +333,13 @@ void UnwrappedLineParser::parseBlock(bool MustBeDeclaration,
   parseLevel(/*HasOpeningBrace=*/true);
 
   if (!FormatTok->Tok.is(tok::r_brace)) {
-    Line->Level -= AddLevels;
+    Line->Level = InitialLevel;
     StructuralError = true;
     return;
   }
 
   nextToken(); // Munch the closing brace.
-  Line->Level -= AddLevels;
+  Line->Level = InitialLevel;
 }
 
 void UnwrappedLineParser::parsePPDirective() {
@@ -865,13 +874,13 @@ void UnwrappedLineParser::parseSwitch() {
   if (FormatTok->Tok.is(tok::l_paren))
     parseParens();
   if (FormatTok->Tok.is(tok::l_brace)) {
-    parseBlock(/*MustBeDeclaration=*/false, Style.IndentCaseLabels ? 2 : 1);
+    parseBlock(/*MustBeDeclaration=*/false, 1);
     addUnwrappedLine();
   } else {
     addUnwrappedLine();
-    Line->Level += (Style.IndentCaseLabels ? 2 : 1);
+    ++Line->Level;
     parseStructuralElement();
-    Line->Level -= (Style.IndentCaseLabels ? 2 : 1);
+    --Line->Level;
   }
 }
 
index 9f41491924e72a57435c314ca0d7a51b772a1339..f4ebc7159aa43b62495c6d3fbcd1ff6e9d1f8511 100644 (file)
@@ -544,7 +544,21 @@ TEST_F(FormatTest, FormatsSwitchStatement) {
                      "  }\n"
                      "}");
   verifyGoogleFormat("switch (test)\n"
-                     "    ;");
+                     "  ;");
+
+  verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
+                     "  case OP_name:              \\\n"
+                     "    return operations::Operation##name\n");
+  verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
+                     "  // Get the correction operation class.\n"
+                     "  switch (OpCode) {\n"
+                     "    CASE(Add);\n"
+                     "    CASE(Subtract);\n"
+                     "    default:\n"
+                     "      return operations::Unknown;\n"
+                     "  }\n"
+                     "#undef OPERATION_CASE\n"
+                     "}");
 }
 
 TEST_F(FormatTest, FormatsLabels) {