https://github.com/HazardyKnusperkeks created https://github.com/llvm/llvm-project/pull/68621
Annotating switch braces for the first time. Also in preparation of #67906. From 358cbf4fd25d2d323e21774a3d4f5a605c4f1479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Sch=C3=A4pers?= <bjo...@hazardy.de> Date: Mon, 9 Oct 2023 21:28:01 +0200 Subject: [PATCH] [clang-format][NFC] Annotate control statement r_braces Annotating switch braces for the first time. Also in preparation of #67906. --- clang/lib/Format/FormatToken.h | 2 ++ clang/lib/Format/UnwrappedLineParser.cpp | 20 ++++++++++-- clang/unittests/Format/TokenAnnotatorTest.cpp | 31 +++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index 527f1d744a58089..606e9e790ad833b 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -52,6 +52,7 @@ namespace format { TYPE(ConflictStart) \ /* l_brace of if/for/while */ \ TYPE(ControlStatementLBrace) \ + TYPE(ControlStatementRBrace) \ TYPE(CppCastLParen) \ TYPE(CSharpGenericTypeConstraint) \ TYPE(CSharpGenericTypeConstraintColon) \ @@ -67,6 +68,7 @@ namespace format { TYPE(DesignatedInitializerPeriod) \ TYPE(DictLiteral) \ TYPE(ElseLBrace) \ + TYPE(ElseRBrace) \ TYPE(EnumLBrace) \ TYPE(EnumRBrace) \ TYPE(FatArrow) \ diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 3275d7b6a71aaa0..9769d536bee32aa 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -2756,6 +2756,10 @@ FormatToken *UnwrappedLineParser::parseIfThenElse(IfStmtKind *IfKind, CompoundStatementIndenter Indenter(this, Style, Line->Level); parseBlock(/*MustBeDeclaration=*/false, /*AddLevels=*/1u, /*MunchSemi=*/true, KeepIfBraces, &IfBlockKind); + if (auto Prev = FormatTok->getPreviousNonComment(); + Prev && Prev->is(tok::r_brace)) { + Prev->setFinalizedType(TT_ControlStatementRBrace); + } if (Style.BraceWrapping.BeforeElse) addUnwrappedLine(); else @@ -2794,6 +2798,10 @@ FormatToken *UnwrappedLineParser::parseIfThenElse(IfStmtKind *IfKind, FormatToken *IfLBrace = parseBlock(/*MustBeDeclaration=*/false, /*AddLevels=*/1u, /*MunchSemi=*/true, KeepElseBraces, &ElseBlockKind); + if (auto Prev = FormatTok->getPreviousNonComment(); + Prev && Prev->is(tok::r_brace)) { + Prev->setFinalizedType(TT_ElseRBrace); + } if (FormatTok->is(tok::kw_else)) { KeepElseBraces = KeepElseBraces || ElseBlockKind == IfStmtKind::IfOnly || @@ -3057,12 +3065,15 @@ void UnwrappedLineParser::parseLoopBody(bool KeepBraces, bool WrapRightBrace) { keepAncestorBraces(); if (isBlockBegin(*FormatTok)) { - if (!KeepBraces) - FormatTok->setFinalizedType(TT_ControlStatementLBrace); + FormatTok->setFinalizedType(TT_ControlStatementLBrace); FormatToken *LeftBrace = FormatTok; CompoundStatementIndenter Indenter(this, Style, Line->Level); parseBlock(/*MustBeDeclaration=*/false, /*AddLevels=*/1u, /*MunchSemi=*/true, KeepBraces); + if (auto Prev = FormatTok->getPreviousNonComment(); + Prev && Prev->is(tok::r_brace)) { + Prev->setFinalizedType(TT_ControlStatementRBrace); + } if (!KeepBraces) { assert(!NestedTooDeep.empty()); if (!NestedTooDeep.back()) @@ -3196,7 +3207,12 @@ void UnwrappedLineParser::parseSwitch() { if (FormatTok->is(tok::l_brace)) { CompoundStatementIndenter Indenter(this, Style, Line->Level); + FormatTok->setFinalizedType(TT_ControlStatementLBrace); parseBlock(); + if (auto Prev = FormatTok->getPreviousNonComment(); + Prev && Prev->is(tok::r_brace)) { + Prev->setFinalizedType(TT_ControlStatementRBrace); + } addUnwrappedLine(); } else { addUnwrappedLine(); diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 2d590f2af05e63a..b6d4cf166de0281 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -2151,6 +2151,37 @@ TEST_F(TokenAnnotatorTest, UnderstandsAttributes) { EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_AttributeRParen); } +TEST_F(TokenAnnotatorTest, UnderstandsControlStatements) { + auto Tokens = annotate("while (true) {}"); + ASSERT_EQ(Tokens.size(), 7u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_ControlStatementLBrace); + EXPECT_TOKEN(Tokens[5], tok::r_brace, TT_ControlStatementRBrace); + + Tokens = annotate("for (;;) {}"); + ASSERT_EQ(Tokens.size(), 8u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_ControlStatementLBrace); + EXPECT_TOKEN(Tokens[6], tok::r_brace, TT_ControlStatementRBrace); + + Tokens = annotate("do {} while (true);"); + ASSERT_EQ(Tokens.size(), 9u) << Tokens; + EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_ControlStatementLBrace); + EXPECT_TOKEN(Tokens[2], tok::r_brace, TT_ControlStatementRBrace); + + Tokens = annotate("if (true) {} else if (false) {} else {}"); + ASSERT_EQ(Tokens.size(), 17u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_ControlStatementLBrace); + EXPECT_TOKEN(Tokens[5], tok::r_brace, TT_ControlStatementRBrace); + EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_ControlStatementLBrace); + EXPECT_TOKEN(Tokens[12], tok::r_brace, TT_ControlStatementRBrace); + EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_ElseLBrace); + EXPECT_TOKEN(Tokens[15], tok::r_brace, TT_ElseRBrace); + + Tokens = annotate("switch (foo) {}"); + ASSERT_EQ(Tokens.size(), 7u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_ControlStatementLBrace); + EXPECT_TOKEN(Tokens[5], tok::r_brace, TT_ControlStatementRBrace); +} + } // namespace } // namespace format } // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits