aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests/Format
diff options
context:
space:
mode:
authorOwen Pan <owenpiano@gmail.com>2024-05-06 19:55:55 -0700
committerGitHub <noreply@github.com>2024-05-06 19:55:55 -0700
commit236b3e1aad45e2bab8ede0da6397b7b01f9cc9d8 (patch)
treef2de149014b37d8d1c9b00a8ad7c7ace85ba997a /clang/unittests/Format
parentaac83fcf3ec6bbe5e0d83b76d2d236b1b4bfbe89 (diff)
downloadllvm-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.cpp2
-rw-r--r--clang/unittests/Format/FormatTestJava.cpp171
-rw-r--r--clang/unittests/Format/TokenAnnotatorTest.cpp18
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