[clang] [clang-format] Support of TableGen basic format restrictions. (PR #81611)
Hirofumi Nakamura via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 13 07:19:02 PST 2024
================
@@ -55,5 +55,268 @@ TEST_F(FormatTestTableGen, NoSpacesInSquareBracketLists) {
verifyFormat("def flag : Flag<[\"-\", \"--\"], \"foo\">;");
}
+TEST_F(FormatTestTableGen, LiteralsAndIdentifiers) {
+ verifyFormat("def LiteralAndIdentifiers {\n"
+ " let someInteger = -42;\n"
+ " let 0startID = $TokVarName;\n"
+ " let 0xstartInteger = 0x42;\n"
+ " let someIdentifier = $TokVarName;\n"
+ "}\n");
+}
+
+TEST_F(FormatTestTableGen, BangOperators) {
+ verifyFormat("def BangOperators {\n"
+ " let IfOpe = !if(\n"
+ " !not(!and(!gt(!add(1, 2), !sub(3, 4)), !isa<Ty>($x))),\n"
+ " !foldl(0, !listconcat(!range(5, 6), !range(7, 8)),\n"
+ " total, rec, !add(total, rec.Number)),\n"
+ " !tail(!range(9, 10)));\n"
+ " let ForeachOpe = !foreach(\n"
+ " arg, arglist,\n"
+ " !if(!isa<SomeType>(arg.Type),\n"
+ " !add(!cast<SomeOtherType>(arg).Number, x), arg));\n"
+ " let CondOpe1 = !cond(!eq(size, 1): 1,\n"
+ " !eq(size, 2): 1,\n"
+ " !eq(size, 4): 1,\n"
+ " !eq(size, 8): 1,\n"
+ " !eq(size, 16): 1,\n"
+ " true: 0);\n"
+ " let CondOpe2 = !cond(!lt(x, 0): \"negativenegative\",\n"
+ " !eq(x, 0): \"zerozero\",\n"
+ " true: \"positivepositive\");\n"
+ " let CondOpe2WithComment = !cond(!lt(x, 0): // negative\n"
+ " \"negativenegative\",\n"
+ " !eq(x, 0): // zero\n"
+ " \"zerozero\",\n"
+ " true: // default\n"
+ " \"positivepositive\");\n"
+ "}\n");
+}
+
+TEST_F(FormatTestTableGen, Include) {
+ verifyFormat("include \"test/IncludeFile.h\"\n");
+}
+
+TEST_F(FormatTestTableGen, Types) {
+ verifyFormat("def Types : list<int>, bits<3>, list<list<string>> {}\n");
+}
+
+TEST_F(FormatTestTableGen, SimpleValue1_SingleLiterals) {
+ verifyFormat("def SimpleValue {\n"
+ " let Integer = 42;\n"
+ " let String = \"some string\";\n"
+ "}\n");
+}
+
+TEST_F(FormatTestTableGen, SimpleValue1_MultilineString) {
+ // verifyFormat does not understand multiline TableGen code-literals
+ std::string DefWithCode =
+ "def SimpleValueCode {\n"
+ " let Code =\n"
+ " [{ A TokCode is nothing more than a multi-line string literal "
+ "delimited by \\[{ and }\\]. It can break across lines and the line "
+ "breaks are retained in the string. "
+ "(https://llvm.org/docs/TableGen/ProgRef.html#grammar-token-TokCode)}];\n"
+ "}\n";
+ std::string DefWithCodeMessingUp =
+ "def SimpleValueCode {\n"
+ " let Code= "
+ "[{ A TokCode is nothing more than a multi-line string literal "
+ "delimited by \\[{ and }\\]. It can break across lines and the line "
+ "breaks are retained in the string. "
+ "(https://llvm.org/docs/TableGen/ProgRef.html#grammar-token-TokCode)}];\n"
+ " } \n";
+ EXPECT_EQ(DefWithCode, format(DefWithCodeMessingUp));
+}
+
+TEST_F(FormatTestTableGen, SimpleValue2) {
+ verifyFormat("def SimpleValue2 {\n"
+ " let True = true;\n"
+ " let False = false;\n"
+ "}\n");
+}
+
+TEST_F(FormatTestTableGen, SimpleValue3) {
+ verifyFormat("class SimpleValue3<int x> { int Question = ?; }\n");
+}
+
+TEST_F(FormatTestTableGen, SimpleValue4) {
+ verifyFormat("def SimpleValue4 { let ValueList = {1, 2, 3}; }\n");
+}
+
+TEST_F(FormatTestTableGen, SimpleValue5) {
+ verifyFormat("def SimpleValue5 {\n"
+ " let SquareList = [1, 4, 9];\n"
+ " let SquareListWithType = [\"a\", \"b\", \"c\"]<string>;\n"
+ " let SquareListListWithType = [[1, 2], [3, 4, 5], [7]]<\n"
+ " list<int>>;\n"
+ " let SquareBitsListWithType = [ {1, 2},\n"
+ " {3, 4} ]<list<bits<8>>>;\n"
+ "}\n");
----------------
hnakamura5 wrote:
SquareListListWithType and SquareBitsListWithType seems a little bit strange for they are similar but the format is difference.
One reason is '[' and '{' cannot be connected because '[{' is the beginning of multiline string.
https://github.com/llvm/llvm-project/pull/81611
More information about the cfe-commits
mailing list