diff options
author | Owen Pan <owenpiano@gmail.com> | 2024-05-06 19:55:55 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-06 19:55:55 -0700 |
commit | 236b3e1aad45e2bab8ede0da6397b7b01f9cc9d8 (patch) | |
tree | f2de149014b37d8d1c9b00a8ad7c7ace85ba997a /clang/unittests/Format | |
parent | aac83fcf3ec6bbe5e0d83b76d2d236b1b4bfbe89 (diff) | |
download | llvm-236b3e1aad45e2bab8ede0da6397b7b01f9cc9d8.zip llvm-236b3e1aad45e2bab8ede0da6397b7b01f9cc9d8.tar.gz llvm-236b3e1aad45e2bab8ede0da6397b7b01f9cc9d8.tar.bz2 |
[clang-format] Handle Java switch expressions (#91112)
Also adds AllowShortCaseExpressionOnASingleLine option and
AlignCaseArrows suboption of AlignConsecutiveShortCaseStatements.
Fixes #55903.
Diffstat (limited to 'clang/unittests/Format')
-rw-r--r-- | clang/unittests/Format/ConfigParseTest.cpp | 2 | ||||
-rw-r--r-- | clang/unittests/Format/FormatTestJava.cpp | 171 | ||||
-rw-r--r-- | clang/unittests/Format/TokenAnnotatorTest.cpp | 18 |
3 files changed, 191 insertions, 0 deletions
diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp index 8c74ed2..82e72f0 100644 --- a/clang/unittests/Format/ConfigParseTest.cpp +++ b/clang/unittests/Format/ConfigParseTest.cpp @@ -153,6 +153,7 @@ TEST(ConfigParseTest, ParsesConfigurationBools) { Style.Language = FormatStyle::LK_Cpp; CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); + CHECK_PARSE_BOOL(AllowShortCaseExpressionOnASingleLine); CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); CHECK_PARSE_BOOL(AllowShortCompoundRequirementOnASingleLine); CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine); @@ -205,6 +206,7 @@ TEST(ConfigParseTest, ParsesConfigurationBools) { CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AcrossEmptyLines); CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AcrossComments); + CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AlignCaseArrows); CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AlignCaseColons); CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); diff --git a/clang/unittests/Format/FormatTestJava.cpp b/clang/unittests/Format/FormatTestJava.cpp index 6da5f4f..33998bc 100644 --- a/clang/unittests/Format/FormatTestJava.cpp +++ b/clang/unittests/Format/FormatTestJava.cpp @@ -618,6 +618,177 @@ TEST_F(FormatTestJava, ConfigurableSpacesInSquareBrackets) { verifyFormat("types[ i ] = arguments[ i ].getClass();", Spaces); } +TEST_F(FormatTestJava, SwitchExpression) { + auto Style = getLLVMStyle(FormatStyle::LK_Java); + EXPECT_TRUE(Style.AllowShortCaseExpressionOnASingleLine); + + verifyFormat("foo(switch (day) {\n" + " case THURSDAY, SATURDAY -> 8;\n" + " case WEDNESDAY -> 9;\n" + " default -> 1;\n" + "});", + Style); + + constexpr StringRef Code1{"i = switch (day) {\n" + " case THURSDAY, SATURDAY -> 8;\n" + " case WEDNESDAY -> 9;\n" + " default -> 0;\n" + "};"}; + verifyFormat(Code1, Style); + + Style.IndentCaseLabels = true; + verifyFormat(Code1, Style); + + constexpr StringRef Code2{"i = switch (day) {\n" + " case THURSDAY, SATURDAY -> {\n" + " foo();\n" + " yield 8;\n" + " }\n" + " case WEDNESDAY -> {\n" + " bar();\n" + " yield 9;\n" + " }\n" + " default -> {\n" + " yield 0;\n" + " }\n" + "};"}; + verifyFormat(Code2, Style); + + Style.IndentCaseLabels = false; + verifyFormat(Code2, Style); + + constexpr StringRef Code3{"switch (day) {\n" + "case THURSDAY, SATURDAY -> i = 8;\n" + "case WEDNESDAY -> i = 9;\n" + "default -> i = 0;\n" + "};"}; + verifyFormat(Code3, Style); + + Style.IndentCaseLabels = true; + verifyFormat("switch (day) {\n" + " case THURSDAY, SATURDAY -> i = 8;\n" + " case WEDNESDAY -> i = 9;\n" + " default -> i = 0;\n" + "};", + Code3, Style); +} + +TEST_F(FormatTestJava, ShortCaseExpression) { + auto Style = getLLVMStyle(FormatStyle::LK_Java); + + verifyFormat("i = switch (a) {\n" + " case 1 -> 1;\n" + " case 2 -> // comment\n" + " 2;\n" + " case 3 ->\n" + " // comment\n" + " 3;\n" + " case 4 -> 4; // comment\n" + " default -> 0;\n" + "};", + Style); + + verifyNoChange("i = switch (a) {\n" + " case 1 -> 1;\n" + " // comment\n" + " case 2 -> 2;\n" + " // comment 1\n" + " // comment 2\n" + " case 3 -> 3; /* comment */\n" + " case 4 -> /* comment */ 4;\n" + " case 5 -> x + /* comment */ 1;\n" + " default ->\n" + " 0; // comment line 1\n" + " // comment line 2\n" + "};", + Style); + + Style.ColumnLimit = 18; + verifyFormat("i = switch (a) {\n" + " case Monday ->\n" + " 1;\n" + " default -> 9999;\n" + "};", + Style); + + Style.ColumnLimit = 80; + Style.AllowShortCaseExpressionOnASingleLine = false; + Style.IndentCaseLabels = true; + verifyFormat("i = switch (n) {\n" + " default /*comments*/ ->\n" + " 1;\n" + " case 0 ->\n" + " 0;\n" + "};", + Style); + + Style.AllowShortCaseExpressionOnASingleLine = true; + Style.BreakBeforeBraces = FormatStyle::BS_Custom; + Style.BraceWrapping.AfterCaseLabel = true; + Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; + verifyFormat("i = switch (n)\n" + "{\n" + " case 0 ->\n" + " {\n" + " yield 0;\n" + " }\n" + " default ->\n" + " {\n" + " yield 1;\n" + " }\n" + "};", + Style); +} + +TEST_F(FormatTestJava, AlignCaseArrows) { + auto Style = getLLVMStyle(FormatStyle::LK_Java); + Style.AlignConsecutiveShortCaseStatements.Enabled = true; + + verifyFormat("foo(switch (day) {\n" + " case THURSDAY, SATURDAY -> 8;\n" + " case WEDNESDAY -> 9;\n" + " default -> 1;\n" + "});", + Style); + + verifyFormat("i = switch (day) {\n" + " case THURSDAY, SATURDAY -> 8;\n" + " case WEDNESDAY -> 9;\n" + " default -> 0;\n" + "};", + Style); + + verifyFormat("switch (day) {\n" + "case THURSDAY, SATURDAY -> i = 8;\n" + "case WEDNESDAY -> i = 9;\n" + "default -> i = 0;\n" + "};", + Style); + + Style.AlignConsecutiveShortCaseStatements.AlignCaseArrows = true; + + verifyFormat("foo(switch (day) {\n" + " case THURSDAY, SATURDAY -> 8;\n" + " case WEDNESDAY -> 9;\n" + " default -> 1;\n" + "});", + Style); + + verifyFormat("i = switch (day) {\n" + " case THURSDAY, SATURDAY -> 8;\n" + " case WEDNESDAY -> 9;\n" + " default -> 0;\n" + "};", + Style); + + verifyFormat("switch (day) {\n" + "case THURSDAY, SATURDAY -> i = 8;\n" + "case WEDNESDAY -> i = 9;\n" + "default -> i = 0;\n" + "};", + Style); +} + } // namespace } // namespace test } // namespace format diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index b424424..51b475d 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -2981,6 +2981,24 @@ TEST_F(TokenAnnotatorTest, BlockLBrace) { EXPECT_BRACE_KIND(Tokens[5], BK_Block); } +TEST_F(TokenAnnotatorTest, SwitchExpression) { + auto Style = getLLVMStyle(FormatStyle::LK_Java); + auto Tokens = annotate("i = switch (day) {\n" + " case THURSDAY, SATURDAY -> 8;\n" + " case WEDNESDAY -> 9;\n" + " default -> 1;\n" + "};", + Style); + ASSERT_EQ(Tokens.size(), 26u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_SwitchExpressionLBrace); + EXPECT_TOKEN(Tokens[7], tok::kw_case, TT_SwitchExpressionLabel); + EXPECT_TOKEN(Tokens[11], tok::arrow, TT_CaseLabelArrow); + EXPECT_TOKEN(Tokens[14], tok::kw_case, TT_SwitchExpressionLabel); + EXPECT_TOKEN(Tokens[16], tok::arrow, TT_CaseLabelArrow); + EXPECT_TOKEN(Tokens[19], tok::kw_default, TT_SwitchExpressionLabel); + EXPECT_TOKEN(Tokens[20], tok::arrow, TT_CaseLabelArrow); +} + } // namespace } // namespace format } // namespace clang |