From: owenca Date: Sun, 23 Oct 2022 08:28:43 +0000 (-0700) Subject: [clang-format] Insert closing braces after an unaffected line X-Git-Tag: upstream/17.0.6~29624 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=37e754e5801c5de2e84ca2d7d40a48c780787f01;p=platform%2Fupstream%2Fllvm.git [clang-format] Insert closing braces after an unaffected line The token that records the number of closing braces to be inserted may be on an unaffected line. Extra work is required in order to actually insert the closing braces after inserting the matching opening braces of affected lines. Fixes #58161. Differential Revision: https://reviews.llvm.org/D136437 --- diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 1bab870..1601061 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1874,26 +1874,37 @@ private: void insertBraces(SmallVectorImpl &Lines, tooling::Replacements &Result) { const auto &SourceMgr = Env.getSourceManager(); + int OpeningBraceSurplus = 0; for (AnnotatedLine *Line : Lines) { insertBraces(Line->Children, Result); - if (!Line->Affected) + if (!Line->Affected && OpeningBraceSurplus == 0) continue; for (FormatToken *Token = Line->First; Token && !Token->Finalized; Token = Token->Next) { - if (Token->BraceCount == 0) + int BraceCount = Token->BraceCount; + if (BraceCount == 0) continue; std::string Brace; - if (Token->BraceCount < 0) { - assert(Token->BraceCount == -1); + if (BraceCount < 0) { + assert(BraceCount == -1); + if (!Line->Affected) + break; Brace = Token->is(tok::comment) ? "\n{" : "{"; + ++OpeningBraceSurplus; } else { - Brace = '\n' + std::string(Token->BraceCount, '}'); + if (OpeningBraceSurplus == 0) + break; + if (OpeningBraceSurplus < BraceCount) + BraceCount = OpeningBraceSurplus; + Brace = '\n' + std::string(BraceCount, '}'); + OpeningBraceSurplus -= BraceCount; } Token->BraceCount = 0; const auto Start = Token->Tok.getEndLoc(); cantFail(Result.add(tooling::Replacement(SourceMgr, Start, 0, Brace))); } } + assert(OpeningBraceSurplus == 0); } };