Author: Tobias Hieta Date: 2022-10-25T09:59:39+02:00 New Revision: fd1d93db71066bedc11944bd32f3540b8084b060
URL: https://github.com/llvm/llvm-project/commit/fd1d93db71066bedc11944bd32f3540b8084b060 DIFF: https://github.com/llvm/llvm-project/commit/fd1d93db71066bedc11944bd32f3540b8084b060.diff LOG: [clang-format] Mark pragma region lines as StringLiterals In our code-base we auto-generate pragma regions the regions look like method signatures like: `#pragma region MYREGION(Foo: bar)` The problem here was that the rest of the line after region was not marked as stringliteral as in the case of pragma mark so clang-format tried to change the formatting based on the method signature. Added test and mark it similar as pragma mark. Reviewed By: owenpan Differential Revision: https://reviews.llvm.org/D136336 Added: Modified: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp clang/unittests/Format/TokenAnnotatorTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index f226e8ffa61c1..fba1a125dc57e 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -1337,14 +1337,15 @@ class AnnotatingParser { if (CurrentToken && CurrentToken->isOneOf(Keywords.kw_mark, Keywords.kw_option, Keywords.kw_region)) { - bool IsMark = CurrentToken->is(Keywords.kw_mark); + bool IsMarkOrRegion = + CurrentToken->isOneOf(Keywords.kw_mark, Keywords.kw_region); next(); next(); // Consume first token (so we fix leading whitespace). while (CurrentToken) { - if (IsMark || CurrentToken->Previous->is(TT_BinaryOperator)) + if (IsMarkOrRegion || CurrentToken->Previous->is(TT_BinaryOperator)) { CurrentToken->setType(TT_ImplicitStringLiteral); next(); - } + } } } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index d7aca687ab40d..00803cd3a230f 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -19965,9 +19965,7 @@ TEST_F(FormatTest, UnderstandPragmaOption) { TEST_F(FormatTest, UnderstandPragmaRegion) { auto Style = getLLVMStyleWithColumns(0); verifyFormat("#pragma region TEST(FOO : BAR)", Style); - - EXPECT_EQ("#pragma region TEST(FOO : BAR)", - format("#pragma region TEST(FOO : BAR)", Style)); + verifyFormat("#pragma region TEST(FOO: NOSPACE)", Style); } TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 14918c7e6ff96..999feca0913d6 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -649,6 +649,22 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) { EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_RequiresExpressionLBrace); } +TEST_F(TokenAnnotatorTest, UnderstandsPragmaRegion) { + // Everything after #pragma region should be ImplicitStringLiteral + auto Tokens = annotate("#pragma region Foo(Bar: Hello)"); + ASSERT_EQ(Tokens.size(), 10u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::identifier, TT_ImplicitStringLiteral); + EXPECT_TOKEN(Tokens[6], tok::colon, TT_ImplicitStringLiteral); + EXPECT_TOKEN(Tokens[7], tok::identifier, TT_ImplicitStringLiteral); + + // Make sure it's annotated correctly inside a function as well + Tokens = annotate("void test(){\n#pragma region Foo(Bar: Hello)\n}"); + ASSERT_EQ(Tokens.size(), 16u) << Tokens; + EXPECT_TOKEN(Tokens[10], tok::identifier, TT_ImplicitStringLiteral); + EXPECT_TOKEN(Tokens[11], tok::colon, TT_ImplicitStringLiteral); + EXPECT_TOKEN(Tokens[12], tok::identifier, TT_ImplicitStringLiteral); +} + TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) { const char *BaseCode = nullptr; const char *ConstrainedCode = nullptr; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits