HazardyKnusperkeks created this revision.
HazardyKnusperkeks added reviewers: owenpan, MyDeveloperDay, rymiel.
HazardyKnusperkeks added a project: clang-format.
Herald added a project: All.
HazardyKnusperkeks requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Now every left and right brace of any block (even the block macros) point to 
each other through the `MatchingParen`.

This commit on it self is NFC (as far as I can see), it is a preparation for 
other change(s).

The brace removing part has been rewritten, because that took advantage of the 
`MatchingParen` field.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D138358

Files:
  clang/lib/Format/UnwrappedLineParser.cpp
  clang/lib/Format/UnwrappedLineParser.h

Index: clang/lib/Format/UnwrappedLineParser.h
===================================================================
--- clang/lib/Format/UnwrappedLineParser.h
+++ clang/lib/Format/UnwrappedLineParser.h
@@ -110,7 +110,8 @@
                          const FormatToken *OpeningBrace = nullptr) const;
   FormatToken *parseBlock(bool MustBeDeclaration = false,
                           unsigned AddLevels = 1u, bool MunchSemi = true,
-                          bool KeepBraces = true, IfStmtKind *IfKind = nullptr,
+                          bool *KeepBraces = nullptr,
+                          IfStmtKind *IfKind = nullptr,
                           bool UnindentWhitesmithsBraces = false,
                           bool CanContainBracedList = true,
                           TokenType NextLBracesType = TT_Unknown);
Index: clang/lib/Format/UnwrappedLineParser.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -533,7 +533,7 @@
         continue;
       }
       parseBlock(/*MustBeDeclaration=*/false, /*AddLevels=*/1u,
-                 /*MunchSemi=*/true, /*KeepBraces=*/true, /*IfKind=*/nullptr,
+                 /*MunchSemi=*/true, /*KeepBraces=*/nullptr, /*IfKind=*/nullptr,
                  /*UnindentWhitesmithsBraces=*/false, CanContainBracedList,
                  NextLBracesType);
       ++StatementCount;
@@ -836,9 +836,23 @@
   return Line.Level * Style.IndentWidth + Length <= ColumnLimit;
 }
 
+/// \brief Parses a Block.
+/// \param[in] MustBeDeclaration If the block is for a declaration.
+/// \param[in] AddLevels How many levels should be added to the lines.
+/// \param[in] MunchSemi If a trailing semi should be munched.
+/// \param[in,out] KeepBraces If not provided it's the same as if it is provided
+/// and set to \c true. If provided it will be set to \c true, if the braces of
+/// this block have to be kept (and thus also the braces of the outer scopes).
+/// \param[in] IfKind <Todo>
+/// \param[in] UnindentWhitesmithsBraces If the brace has to be unindented,
+/// because of Whitesmith brace indenting.
+/// \param[in] CanContainBracedList If the block can contain braced init lists.
+/// \param[in] NextLBracesType The type for the next found left braces, when
+/// it's set to something different than TT_Unknown.
+/// \return <Todo>
 FormatToken *UnwrappedLineParser::parseBlock(
-    bool MustBeDeclaration, unsigned AddLevels, bool MunchSemi, bool KeepBraces,
-    IfStmtKind *IfKind, bool UnindentWhitesmithsBraces,
+    bool MustBeDeclaration, unsigned AddLevels, bool MunchSemi,
+    bool *KeepBraces, IfStmtKind *IfKind, bool UnindentWhitesmithsBraces,
     bool CanContainBracedList, TokenType NextLBracesType) {
   auto HandleVerilogBlockLabel = [this]() {
     // ":" name
@@ -932,7 +946,7 @@
     if (WrappedOpeningBrace && FollowedByComment)
       return false;
     const bool HasRequiredIfBraces = IfLBrace && !IfLBrace->Optional;
-    if (KeepBraces && !HasRequiredIfBraces)
+    if ((!KeepBraces || *KeepBraces) && !HasRequiredIfBraces)
       return false;
     if (Tok->isNot(TT_ElseLBrace) || !HasRequiredIfBraces) {
       const FormatToken *Previous = Tokens->getPreviousToken();
@@ -953,10 +967,13 @@
     }
     return mightFitOnOneLine((*CurrentLines)[Index], Tok);
   };
-  if (RemoveBraces()) {
-    Tok->MatchingParen = FormatTok;
-    FormatTok->MatchingParen = Tok;
-  }
+  if (RemoveBraces())
+    Tok->Optional = FormatTok->Optional = true;
+  else if (KeepBraces)
+    *KeepBraces = true;
+
+  Tok->MatchingParen = FormatTok;
+  FormatTok->MatchingParen = Tok;
 
   size_t PPEndHash = computePPHash();
 
@@ -2676,10 +2693,8 @@
   --Line->Level;
 }
 
-static void markOptionalBraces(FormatToken *LeftBrace) {
-  if (!LeftBrace)
-    return;
-
+static void markOptionalBraces(FormatToken *LeftBrace, bool Optional) {
+  assert(LeftBrace);
   assert(LeftBrace->is(tok::l_brace));
 
   FormatToken *RightBrace = LeftBrace->MatchingParen;
@@ -2692,8 +2707,8 @@
   assert(RightBrace->MatchingParen == LeftBrace);
   assert(LeftBrace->Optional == RightBrace->Optional);
 
-  LeftBrace->Optional = true;
-  RightBrace->Optional = true;
+  LeftBrace->Optional = Optional;
+  RightBrace->Optional = Optional;
 }
 
 void UnwrappedLineParser::handleAttributes() {
@@ -2742,7 +2757,7 @@
     IfLeftBrace = FormatTok;
     CompoundStatementIndenter Indenter(this, Style, Line->Level);
     parseBlock(/*MustBeDeclaration=*/false, /*AddLevels=*/1u,
-               /*MunchSemi=*/true, KeepIfBraces, &IfBlockKind);
+               /*MunchSemi=*/true, &KeepIfBraces, &IfBlockKind);
     if (Style.BraceWrapping.BeforeElse)
       addUnwrappedLine();
     else
@@ -2753,13 +2768,13 @@
 
   if (Style.RemoveBracesLLVM) {
     assert(!NestedTooDeep.empty());
-    KeepIfBraces = KeepIfBraces ||
-                   (IfLeftBrace && !IfLeftBrace->MatchingParen) ||
-                   NestedTooDeep.back() || IfBlockKind == IfStmtKind::IfOnly ||
+    KeepIfBraces = KeepIfBraces || NestedTooDeep.back() ||
+                   IfBlockKind == IfStmtKind::IfOnly ||
                    IfBlockKind == IfStmtKind::IfElseIf;
   }
 
   bool KeepElseBraces = KeepIfBraces;
+  bool MergeElseIf = false;
   FormatToken *ElseLeftBrace = nullptr;
   IfStmtKind Kind = IfStmtKind::IfOnly;
 
@@ -2778,15 +2793,15 @@
       IfStmtKind ElseBlockKind = IfStmtKind::NotIf;
       FormatToken *IfLBrace =
           parseBlock(/*MustBeDeclaration=*/false, /*AddLevels=*/1u,
-                     /*MunchSemi=*/true, KeepElseBraces, &ElseBlockKind);
+                     /*MunchSemi=*/true, &KeepElseBraces, &ElseBlockKind);
       if (FormatTok->is(tok::kw_else)) {
         KeepElseBraces = KeepElseBraces ||
                          ElseBlockKind == IfStmtKind::IfOnly ||
                          ElseBlockKind == IfStmtKind::IfElseIf;
       } else if (FollowedByIf && IfLBrace && !IfLBrace->Optional) {
         KeepElseBraces = true;
+        MergeElseIf = true;
         assert(ElseLeftBrace->MatchingParen);
-        markOptionalBraces(ElseLeftBrace);
       }
       addUnwrappedLine();
     } else if (FormatTok->is(tok::kw_if)) {
@@ -2810,6 +2825,8 @@
     } else {
       parseUnbracedBody(/*CheckEOF=*/true);
     }
+    KeepElseBraces =
+        KeepElseBraces || (ElseLeftBrace && !ElseLeftBrace->Optional);
   } else {
     KeepIfBraces = KeepIfBraces || IfBlockKind == IfStmtKind::IfElse;
     if (NeedsUnwrappedLine)
@@ -2820,25 +2837,15 @@
     return nullptr;
 
   assert(!NestedTooDeep.empty());
-  KeepElseBraces = KeepElseBraces ||
-                   (ElseLeftBrace && !ElseLeftBrace->MatchingParen) ||
-                   NestedTooDeep.back();
+  KeepElseBraces = KeepElseBraces || NestedTooDeep.back();
 
   NestedTooDeep.pop_back();
 
-  if (!KeepIfBraces && !KeepElseBraces) {
-    markOptionalBraces(IfLeftBrace);
-    markOptionalBraces(ElseLeftBrace);
-  } else if (IfLeftBrace) {
-    FormatToken *IfRightBrace = IfLeftBrace->MatchingParen;
-    if (IfRightBrace) {
-      assert(IfRightBrace->MatchingParen == IfLeftBrace);
-      assert(!IfLeftBrace->Optional);
-      assert(!IfRightBrace->Optional);
-      IfLeftBrace->MatchingParen = nullptr;
-      IfRightBrace->MatchingParen = nullptr;
-    }
-  }
+  bool DropBraces = !KeepIfBraces && !KeepElseBraces;
+  if (IfLeftBrace)
+    markOptionalBraces(IfLeftBrace, DropBraces);
+  if (ElseLeftBrace)
+    markOptionalBraces(ElseLeftBrace, DropBraces || MergeElseIf);
 
   if (IfKind)
     *IfKind = Kind;
@@ -2980,7 +2987,7 @@
       ++Line->Level;
 
     parseBlock(/*MustBeDeclaration=*/true, AddLevels, /*MunchSemi=*/true,
-               /*KeepBraces=*/true, /*IfKind=*/nullptr,
+               /*KeepBraces=*/nullptr, /*IfKind=*/nullptr,
                ManageWhitesmithsBraces);
 
     // Munch the semicolon after a namespace. This is more common than one would
@@ -3048,11 +3055,11 @@
     FormatToken *LeftBrace = FormatTok;
     CompoundStatementIndenter Indenter(this, Style, Line->Level);
     parseBlock(/*MustBeDeclaration=*/false, /*AddLevels=*/1u,
-               /*MunchSemi=*/true, KeepBraces);
+               /*MunchSemi=*/true, &KeepBraces);
     if (!KeepBraces) {
       assert(!NestedTooDeep.empty());
       if (!NestedTooDeep.back())
-        markOptionalBraces(LeftBrace);
+        markOptionalBraces(LeftBrace, true);
     }
     if (WrapRightBrace)
       addUnwrappedLine();
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to