1 //===- unittest/Format/FormatTestComments.cpp - Formatting unit tests -----===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "FormatTestBase.h" 10 11 #define DEBUG_TYPE "format-test-comments" 12 13 namespace clang { 14 namespace format { 15 namespace test { 16 namespace { 17 18 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); } 19 20 class FormatTestComments : public FormatTestBase {}; 21 22 //===----------------------------------------------------------------------===// 23 // Tests for comments. 24 //===----------------------------------------------------------------------===// 25 26 TEST_F(FormatTestComments, UnderstandsSingleLineComments) { 27 verifyFormat("//* */"); 28 verifyFormat("// line 1\n" 29 "// line 2\n" 30 "void f() {}"); 31 32 EXPECT_EQ("// comment", format("//comment")); 33 EXPECT_EQ("// #comment", format("//#comment")); 34 35 EXPECT_EQ("// comment\n" 36 "// clang-format on", 37 format("//comment\n" 38 "// clang-format on")); 39 40 verifyFormat("void f() {\n" 41 " // Doesn't do anything\n" 42 "}"); 43 verifyFormat("SomeObject\n" 44 " // Calling someFunction on SomeObject\n" 45 " .someFunction();"); 46 verifyFormat("auto result = SomeObject\n" 47 " // Calling someFunction on SomeObject\n" 48 " .someFunction();"); 49 verifyFormat("void f(int i, // some comment (probably for i)\n" 50 " int j, // some comment (probably for j)\n" 51 " int k); // some comment (probably for k)"); 52 verifyFormat("void f(int i,\n" 53 " // some comment (probably for j)\n" 54 " int j,\n" 55 " // some comment (probably for k)\n" 56 " int k);"); 57 58 verifyFormat("int i // This is a fancy variable\n" 59 " = 5; // with nicely aligned comment."); 60 61 verifyFormat("// Leading comment.\n" 62 "int a; // Trailing comment."); 63 verifyFormat("int a; // Trailing comment\n" 64 " // on 2\n" 65 " // or 3 lines.\n" 66 "int b;"); 67 verifyFormat("int a; // Trailing comment\n" 68 "\n" 69 "// Leading comment.\n" 70 "int b;"); 71 verifyFormat("int a; // Comment.\n" 72 " // More details.\n" 73 "int bbbb; // Another comment."); 74 verifyFormat( 75 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n" 76 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n" 77 "int cccccccccccccccccccccccccccccc; // comment\n" 78 "int ddd; // looooooooooooooooooooooooong comment\n" 79 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n" 80 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n" 81 "int ccccccccccccccccccc; // comment"); 82 83 verifyFormat("#include \"a\" // comment\n" 84 "#include \"a/b/c\" // comment"); 85 verifyFormat("#include <a> // comment\n" 86 "#include <a/b/c> // comment"); 87 EXPECT_EQ("#include \"a\" // comment\n" 88 "#include \"a/b/c\" // comment", 89 format("#include \\\n" 90 " \"a\" // comment\n" 91 "#include \"a/b/c\" // comment")); 92 93 verifyFormat("enum E {\n" 94 " // comment\n" 95 " VAL_A, // comment\n" 96 " VAL_B\n" 97 "};"); 98 99 EXPECT_EQ("enum A {\n" 100 " // line a\n" 101 " a,\n" 102 " b, // line b\n" 103 "\n" 104 " // line c\n" 105 " c\n" 106 "};", 107 format("enum A {\n" 108 " // line a\n" 109 " a,\n" 110 " b, // line b\n" 111 "\n" 112 " // line c\n" 113 " c\n" 114 "};", 115 getLLVMStyleWithColumns(20))); 116 EXPECT_EQ("enum A {\n" 117 " a, // line 1\n" 118 " // line 2\n" 119 "};", 120 format("enum A {\n" 121 " a, // line 1\n" 122 " // line 2\n" 123 "};", 124 getLLVMStyleWithColumns(20))); 125 EXPECT_EQ("enum A {\n" 126 " a, // line 1\n" 127 " // line 2\n" 128 "};", 129 format("enum A {\n" 130 " a, // line 1\n" 131 " // line 2\n" 132 "};", 133 getLLVMStyleWithColumns(20))); 134 EXPECT_EQ("enum A {\n" 135 " a, // line 1\n" 136 " // line 2\n" 137 " b\n" 138 "};", 139 format("enum A {\n" 140 " a, // line 1\n" 141 " // line 2\n" 142 " b\n" 143 "};", 144 getLLVMStyleWithColumns(20))); 145 EXPECT_EQ("enum A {\n" 146 " a, // line 1\n" 147 " // line 2\n" 148 " b\n" 149 "};", 150 format("enum A {\n" 151 " a, // line 1\n" 152 " // line 2\n" 153 " b\n" 154 "};", 155 getLLVMStyleWithColumns(20))); 156 verifyFormat( 157 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 158 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment"); 159 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 160 " // Comment inside a statement.\n" 161 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 162 verifyFormat("SomeFunction(a,\n" 163 " // comment\n" 164 " b + x);"); 165 verifyFormat("SomeFunction(a, a,\n" 166 " // comment\n" 167 " b + x);"); 168 verifyFormat( 169 "bool aaaaaaaaaaaaa = // comment\n" 170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 171 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 172 173 verifyFormat("int aaaa; // aaaaa\n" 174 "int aa; // aaaaaaa", 175 getLLVMStyleWithColumns(20)); 176 177 EXPECT_EQ("void f() { // This does something ..\n" 178 "}\n" 179 "int a; // This is unrelated", 180 format("void f() { // This does something ..\n" 181 " }\n" 182 "int a; // This is unrelated")); 183 EXPECT_EQ("class C {\n" 184 " void f() { // This does something ..\n" 185 " } // awesome..\n" 186 "\n" 187 " int a; // This is unrelated\n" 188 "};", 189 format("class C{void f() { // This does something ..\n" 190 " } // awesome..\n" 191 " \n" 192 "int a; // This is unrelated\n" 193 "};")); 194 195 EXPECT_EQ("int i; // single line trailing comment", 196 format("int i;\\\n// single line trailing comment")); 197 198 verifyGoogleFormat("int a; // Trailing comment."); 199 200 verifyFormat("someFunction(anotherFunction( // Force break.\n" 201 " parameter));"); 202 203 verifyGoogleFormat("#endif // HEADER_GUARD"); 204 205 verifyFormat("const char *test[] = {\n" 206 " // A\n" 207 " \"aaaa\",\n" 208 " // B\n" 209 " \"aaaaa\"};"); 210 verifyGoogleFormat( 211 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 212 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment"); 213 EXPECT_EQ("D(a, {\n" 214 " // test\n" 215 " int a;\n" 216 "});", 217 format("D(a, {\n" 218 "// test\n" 219 "int a;\n" 220 "});")); 221 222 EXPECT_EQ("lineWith(); // comment\n" 223 "// at start\n" 224 "otherLine();", 225 format("lineWith(); // comment\n" 226 "// at start\n" 227 "otherLine();")); 228 EXPECT_EQ("lineWith(); // comment\n" 229 "/*\n" 230 " * at start */\n" 231 "otherLine();", 232 format("lineWith(); // comment\n" 233 "/*\n" 234 " * at start */\n" 235 "otherLine();")); 236 EXPECT_EQ("lineWith(); // comment\n" 237 " // at start\n" 238 "otherLine();", 239 format("lineWith(); // comment\n" 240 " // at start\n" 241 "otherLine();")); 242 243 EXPECT_EQ("lineWith(); // comment\n" 244 "// at start\n" 245 "otherLine(); // comment", 246 format("lineWith(); // comment\n" 247 "// at start\n" 248 "otherLine(); // comment")); 249 EXPECT_EQ("lineWith();\n" 250 "// at start\n" 251 "otherLine(); // comment", 252 format("lineWith();\n" 253 " // at start\n" 254 "otherLine(); // comment")); 255 EXPECT_EQ("// first\n" 256 "// at start\n" 257 "otherLine(); // comment", 258 format("// first\n" 259 " // at start\n" 260 "otherLine(); // comment")); 261 EXPECT_EQ("f();\n" 262 "// first\n" 263 "// at start\n" 264 "otherLine(); // comment", 265 format("f();\n" 266 "// first\n" 267 " // at start\n" 268 "otherLine(); // comment")); 269 verifyFormat("f(); // comment\n" 270 "// first\n" 271 "// at start\n" 272 "otherLine();"); 273 EXPECT_EQ("f(); // comment\n" 274 "// first\n" 275 "// at start\n" 276 "otherLine();", 277 format("f(); // comment\n" 278 "// first\n" 279 " // at start\n" 280 "otherLine();")); 281 EXPECT_EQ("f(); // comment\n" 282 " // first\n" 283 "// at start\n" 284 "otherLine();", 285 format("f(); // comment\n" 286 " // first\n" 287 "// at start\n" 288 "otherLine();")); 289 EXPECT_EQ("void f() {\n" 290 " lineWith(); // comment\n" 291 " // at start\n" 292 "}", 293 format("void f() {\n" 294 " lineWith(); // comment\n" 295 " // at start\n" 296 "}")); 297 EXPECT_EQ("int xy; // a\n" 298 "int z; // b", 299 format("int xy; // a\n" 300 "int z; //b")); 301 EXPECT_EQ("int xy; // a\n" 302 "int z; // bb", 303 format("int xy; // a\n" 304 "int z; //bb", 305 getLLVMStyleWithColumns(12))); 306 307 verifyFormat("#define A \\\n" 308 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n" 309 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */", 310 getLLVMStyleWithColumns(60)); 311 verifyFormat( 312 "#define A \\\n" 313 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n" 314 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */", 315 getLLVMStyleWithColumns(61)); 316 317 verifyFormat("if ( // This is some comment\n" 318 " x + 3) {\n" 319 "}"); 320 EXPECT_EQ("if ( // This is some comment\n" 321 " // spanning two lines\n" 322 " x + 3) {\n" 323 "}", 324 format("if( // This is some comment\n" 325 " // spanning two lines\n" 326 " x + 3) {\n" 327 "}")); 328 329 verifyNoCrash("/\\\n/"); 330 verifyNoCrash("/\\\n* */"); 331 // The 0-character somehow makes the lexer return a proper comment. 332 verifyNoCrash(StringRef("/*\\\0\n/", 6)); 333 } 334 335 TEST_F(FormatTestComments, KeepsParameterWithTrailingCommentsOnTheirOwnLine) { 336 EXPECT_EQ("SomeFunction(a,\n" 337 " b, // comment\n" 338 " c);", 339 format("SomeFunction(a,\n" 340 " b, // comment\n" 341 " c);")); 342 EXPECT_EQ("SomeFunction(a, b,\n" 343 " // comment\n" 344 " c);", 345 format("SomeFunction(a,\n" 346 " b,\n" 347 " // comment\n" 348 " c);")); 349 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n" 350 " c);", 351 format("SomeFunction(a, b, // comment (unclear relation)\n" 352 " c);")); 353 EXPECT_EQ("SomeFunction(a, // comment\n" 354 " b,\n" 355 " c); // comment", 356 format("SomeFunction(a, // comment\n" 357 " b,\n" 358 " c); // comment")); 359 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n" 360 " aaaa), //\n" 361 " aaaa, bbbbb);", 362 format("aaaaaaaaaa(aaaa(aaaa,\n" 363 "aaaa), //\n" 364 "aaaa, bbbbb);")); 365 366 FormatStyle BreakAlways = getLLVMStyle(); 367 BreakAlways.BinPackParameters = FormatStyle::BPPS_AlwaysOnePerLine; 368 verifyFormat("int SomeFunction(a,\n" 369 " b, // comment\n" 370 " c,\n" 371 " d);", 372 BreakAlways); 373 verifyFormat("int SomeFunction(a,\n" 374 " b,\n" 375 " // comment\n" 376 " c);", 377 BreakAlways); 378 } 379 380 TEST_F(FormatTestComments, RemovesTrailingWhitespaceOfComments) { 381 EXPECT_EQ("// comment", format("// comment ")); 382 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment", 383 format("int aaaaaaa, bbbbbbb; // comment ", 384 getLLVMStyleWithColumns(33))); 385 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f ")); 386 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f ")); 387 } 388 389 TEST_F(FormatTestComments, UnderstandsBlockComments) { 390 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);"); 391 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }"); 392 verifyFormat("fooooooooooooooooooooooooooooo(\n" 393 " /*qq_=*/move(q), [this, b](bar<void(uint32_t)> b) {},\n" 394 " c);", 395 getLLVMStyleWithColumns(60)); 396 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n" 397 " bbbbbbbbbbbbbbbbbbbbbbbbb);", 398 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n" 399 "/* Trailing comment for aa... */\n" 400 " bbbbbbbbbbbbbbbbbbbbbbbbb);")); 401 EXPECT_EQ( 402 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 403 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);", 404 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n" 405 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);")); 406 407 verifyFormat( 408 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 409 " aaaaaaaaaaaaaaaaaa,\n" 410 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/ }", 411 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 412 " aaaaaaaaaaaaaaaaaa ,\n" 413 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n" 414 "}"); 415 416 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n" 417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 418 419 verifyFormat( 420 "int aaaaaaaaaaaaa(/* 1st */ int bbbbbbbbbb, /* 2nd */ int ccccccccccc,\n" 421 " /* 3rd */ int dddddddddddd);"); 422 423 auto Style = getLLVMStyle(); 424 Style.BinPackParameters = FormatStyle::BPPS_OnePerLine; 425 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n" 426 " /* parameter 2 */ aaaaaa,\n" 427 " /* parameter 3 */ aaaaaa,\n" 428 " /* parameter 4 */ aaaaaa);", 429 Style); 430 verifyFormat("int a(/* 1st */ int b, /* 2nd */ int c);", Style); 431 verifyFormat("int aaaaaaaaaaaaa(/* 1st */ int bbbbbbbbbb,\n" 432 " /* 2nd */ int ccccccccccc,\n" 433 " /* 3rd */ int dddddddddddd);", 434 Style); 435 436 Style.BinPackParameters = FormatStyle::BPPS_AlwaysOnePerLine; 437 verifyFormat("int a(/* 1st */ int b,\n" 438 " /* 2nd */ int c);", 439 Style); 440 441 // Aligning block comments in macros. 442 verifyGoogleFormat("#define A \\\n" 443 " int i; /*a*/ \\\n" 444 " int jjj; /*b*/"); 445 } 446 447 TEST_F(FormatTestComments, AlignsBlockComments) { 448 EXPECT_EQ("/*\n" 449 " * Really multi-line\n" 450 " * comment.\n" 451 " */\n" 452 "void f() {}", 453 format(" /*\n" 454 " * Really multi-line\n" 455 " * comment.\n" 456 " */\n" 457 " void f() {}")); 458 EXPECT_EQ("class C {\n" 459 " /*\n" 460 " * Another multi-line\n" 461 " * comment.\n" 462 " */\n" 463 " void f() {}\n" 464 "};", 465 format("class C {\n" 466 "/*\n" 467 " * Another multi-line\n" 468 " * comment.\n" 469 " */\n" 470 "void f() {}\n" 471 "};")); 472 EXPECT_EQ("/*\n" 473 " 1. This is a comment with non-trivial formatting.\n" 474 " 1.1. We have to indent/outdent all lines equally\n" 475 " 1.1.1. to keep the formatting.\n" 476 " */", 477 format(" /*\n" 478 " 1. This is a comment with non-trivial formatting.\n" 479 " 1.1. We have to indent/outdent all lines equally\n" 480 " 1.1.1. to keep the formatting.\n" 481 " */")); 482 EXPECT_EQ("/*\n" 483 "Don't try to outdent if there's not enough indentation.\n" 484 "*/", 485 format(" /*\n" 486 " Don't try to outdent if there's not enough indentation.\n" 487 " */")); 488 489 EXPECT_EQ("int i; /* Comment with empty...\n" 490 " *\n" 491 " * line. */", 492 format("int i; /* Comment with empty...\n" 493 " *\n" 494 " * line. */")); 495 EXPECT_EQ("int foobar = 0; /* comment */\n" 496 "int bar = 0; /* multiline\n" 497 " comment 1 */\n" 498 "int baz = 0; /* multiline\n" 499 " comment 2 */\n" 500 "int bzz = 0; /* multiline\n" 501 " comment 3 */", 502 format("int foobar = 0; /* comment */\n" 503 "int bar = 0; /* multiline\n" 504 " comment 1 */\n" 505 "int baz = 0; /* multiline\n" 506 " comment 2 */\n" 507 "int bzz = 0; /* multiline\n" 508 " comment 3 */")); 509 EXPECT_EQ("int foobar = 0; /* comment */\n" 510 "int bar = 0; /* multiline\n" 511 " comment */\n" 512 "int baz = 0; /* multiline\n" 513 "comment */", 514 format("int foobar = 0; /* comment */\n" 515 "int bar = 0; /* multiline\n" 516 "comment */\n" 517 "int baz = 0; /* multiline\n" 518 "comment */")); 519 } 520 521 TEST_F(FormatTestComments, CommentReflowingCanBeTurnedOff) { 522 FormatStyle Style = getLLVMStyleWithColumns(20); 523 Style.ReflowComments = FormatStyle::RCS_Never; 524 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style); 525 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style); 526 verifyNoChange("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa\n" 527 "aaaaaaaaa*/", 528 Style); 529 verifyNoChange("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa\n" 530 " aaaaaaaaa*/", 531 Style); 532 verifyNoChange("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa\n" 533 " * aaaaaaaaa*/", 534 Style); 535 } 536 537 TEST_F(FormatTestComments, CommentReflowingCanApplyOnlyToIndents) { 538 FormatStyle Style = getLLVMStyleWithColumns(20); 539 Style.ReflowComments = FormatStyle::RCS_IndentOnly; 540 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style); 541 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style); 542 verifyNoChange("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa\n" 543 "aaaaaaaaa*/", 544 Style); 545 verifyNoChange("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa\n" 546 " aaaaaaaaa*/", 547 Style); 548 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa\n" 549 " * aaaaaaaaa*/", 550 "/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa\n" 551 " * aaaaaaaaa*/", 552 Style); 553 } 554 555 TEST_F(FormatTestComments, CorrectlyHandlesLengthOfBlockComments) { 556 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 557 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */", 558 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 559 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */")); 560 EXPECT_EQ( 561 "void ffffffffffff(\n" 562 " int aaaaaaaa, int bbbbbbbb,\n" 563 " int cccccccccccc) { /*\n" 564 " aaaaaaaaaa\n" 565 " aaaaaaaaaaaaa\n" 566 " bbbbbbbbbbbbbb\n" 567 " bbbbbbbbbb\n" 568 " */\n" 569 "}", 570 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n" 571 "{ /*\n" 572 " aaaaaaaaaa aaaaaaaaaaaaa\n" 573 " bbbbbbbbbbbbbb bbbbbbbbbb\n" 574 " */\n" 575 "}", 576 getLLVMStyleWithColumns(40))); 577 } 578 579 TEST_F(FormatTestComments, DontBreakNonTrailingBlockComments) { 580 EXPECT_EQ("void ffffffffff(\n" 581 " int aaaaa /* test */);", 582 format("void ffffffffff(int aaaaa /* test */);", 583 getLLVMStyleWithColumns(35))); 584 } 585 586 TEST_F(FormatTestComments, SplitsLongCxxComments) { 587 EXPECT_EQ("// A comment that\n" 588 "// doesn't fit on\n" 589 "// one line", 590 format("// A comment that doesn't fit on one line", 591 getLLVMStyleWithColumns(20))); 592 EXPECT_EQ("/// A comment that\n" 593 "/// doesn't fit on\n" 594 "/// one line", 595 format("/// A comment that doesn't fit on one line", 596 getLLVMStyleWithColumns(20))); 597 EXPECT_EQ("//! A comment that\n" 598 "//! doesn't fit on\n" 599 "//! one line", 600 format("//! A comment that doesn't fit on one line", 601 getLLVMStyleWithColumns(20))); 602 EXPECT_EQ("// a b c d\n" 603 "// e f g\n" 604 "// h i j k", 605 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10))); 606 EXPECT_EQ( 607 "// a b c d\n" 608 "// e f g\n" 609 "// h i j k", 610 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10))); 611 EXPECT_EQ("if (true) // A comment that\n" 612 " // doesn't fit on\n" 613 " // one line", 614 format("if (true) // A comment that doesn't fit on one line ", 615 getLLVMStyleWithColumns(30))); 616 verifyNoChange("// Don't_touch_leading_whitespace", 617 getLLVMStyleWithColumns(20)); 618 EXPECT_EQ("// Add leading\n" 619 "// whitespace", 620 format("//Add leading whitespace", getLLVMStyleWithColumns(20))); 621 EXPECT_EQ("/// Add leading\n" 622 "/// whitespace", 623 format("///Add leading whitespace", getLLVMStyleWithColumns(20))); 624 EXPECT_EQ("//! Add leading\n" 625 "//! whitespace", 626 format("//!Add leading whitespace", getLLVMStyleWithColumns(20))); 627 EXPECT_EQ("// whitespace", format("//whitespace")); 628 EXPECT_EQ("// Even if it makes the line exceed the column\n" 629 "// limit", 630 format("//Even if it makes the line exceed the column limit", 631 getLLVMStyleWithColumns(51))); 632 verifyFormat("//--But not here"); 633 EXPECT_EQ("/// line 1\n" 634 "// add leading whitespace", 635 format("/// line 1\n" 636 "//add leading whitespace", 637 getLLVMStyleWithColumns(30))); 638 EXPECT_EQ("/// line 1\n" 639 "/// line 2\n" 640 "//! line 3\n" 641 "//! line 4\n" 642 "//! line 5\n" 643 "// line 6\n" 644 "// line 7", 645 format("///line 1\n" 646 "///line 2\n" 647 "//! line 3\n" 648 "//!line 4\n" 649 "//!line 5\n" 650 "// line 6\n" 651 "//line 7", 652 getLLVMStyleWithColumns(20))); 653 654 EXPECT_EQ("// aa bb cc dd", 655 format("// aa bb cc dd ", 656 getLLVMStyleWithColumns(15))); 657 658 EXPECT_EQ("// A comment before\n" 659 "// a macro\n" 660 "// definition\n" 661 "#define a b", 662 format("// A comment before a macro definition\n" 663 "#define a b", 664 getLLVMStyleWithColumns(20))); 665 EXPECT_EQ("void ffffff(\n" 666 " int aaaaaaaaa, // wwww\n" 667 " int bbbbbbbbbb, // xxxxxxx\n" 668 " // yyyyyyyyyy\n" 669 " int c, int d, int e) {}", 670 format("void ffffff(\n" 671 " int aaaaaaaaa, // wwww\n" 672 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n" 673 " int c, int d, int e) {}", 674 getLLVMStyleWithColumns(40))); 675 verifyFormat("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 676 getLLVMStyleWithColumns(20)); 677 EXPECT_EQ( 678 "#define XXX // a b c d\n" 679 " // e f g h", 680 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22))); 681 EXPECT_EQ( 682 "#define XXX // q w e r\n" 683 " // t y u i", 684 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22))); 685 EXPECT_EQ("{\n" 686 " //\n" 687 " //\\\n" 688 " // long 1 2 3 4 5\n" 689 "}", 690 format("{\n" 691 " //\n" 692 " //\\\n" 693 " // long 1 2 3 4 5\n" 694 "}", 695 getLLVMStyleWithColumns(20))); 696 EXPECT_EQ("{\n" 697 " //\n" 698 " //\\\n" 699 " // long 1 2 3 4 5\n" 700 " // 6\n" 701 "}", 702 format("{\n" 703 " //\n" 704 " //\\\n" 705 " // long 1 2 3 4 5 6\n" 706 "}", 707 getLLVMStyleWithColumns(20))); 708 709 EXPECT_EQ("//: A comment that\n" 710 "//: doesn't fit on\n" 711 "//: one line", 712 format("//: A comment that doesn't fit on one line", 713 getLLVMStyleWithColumns(20))); 714 715 verifyFormat( 716 "//\t\t\t\tofMap(message.velocity, 0, 127, 0, ofGetWidth()\n" 717 "//* 0.2)", 718 "//\t\t\t\tofMap(message.velocity, 0, 127, 0, ofGetWidth() * 0.2)"); 719 } 720 721 TEST_F(FormatTestComments, PreservesHangingIndentInCxxComments) { 722 EXPECT_EQ("// A comment\n" 723 "// that doesn't\n" 724 "// fit on one\n" 725 "// line", 726 format("// A comment that doesn't fit on one line", 727 getLLVMStyleWithColumns(20))); 728 EXPECT_EQ("/// A comment\n" 729 "/// that doesn't\n" 730 "/// fit on one\n" 731 "/// line", 732 format("/// A comment that doesn't fit on one line", 733 getLLVMStyleWithColumns(20))); 734 } 735 736 TEST_F(FormatTestComments, DontSplitLineCommentsWithEscapedNewlines) { 737 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 738 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 739 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 740 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 741 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 742 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); 743 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" 744 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" 745 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 746 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" 747 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" 748 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 749 getLLVMStyleWithColumns(50))); 750 // FIXME: One day we might want to implement adjustment of leading whitespace 751 // of the consecutive lines in this kind of comment: 752 EXPECT_EQ("double\n" 753 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" 754 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" 755 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 756 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" 757 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" 758 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 759 getLLVMStyleWithColumns(49))); 760 } 761 762 TEST_F(FormatTestComments, DontIntroduceMultilineComments) { 763 // Avoid introducing a multiline comment by breaking after `\`. 764 for (int ColumnLimit = 15; ColumnLimit <= 17; ++ColumnLimit) { 765 EXPECT_EQ( 766 "// aaaaaaaaaa\n" 767 "// \\ bb", 768 format("// aaaaaaaaaa \\ bb", getLLVMStyleWithColumns(ColumnLimit))); 769 EXPECT_EQ( 770 "// aaaaaaaaa\n" 771 "// \\ bb", 772 format("// aaaaaaaaa \\ bb", getLLVMStyleWithColumns(ColumnLimit))); 773 EXPECT_EQ( 774 "// aaaaaaaaa\n" 775 "// \\ \\ bb", 776 format("// aaaaaaaaa \\ \\ bb", getLLVMStyleWithColumns(ColumnLimit))); 777 } 778 } 779 780 TEST_F(FormatTestComments, DontSplitLineCommentsWithPragmas) { 781 FormatStyle Pragmas = getLLVMStyleWithColumns(30); 782 Pragmas.CommentPragmas = "^ IWYU pragma:"; 783 EXPECT_EQ( 784 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", 785 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas)); 786 EXPECT_EQ( 787 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", 788 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas)); 789 } 790 791 TEST_F(FormatTestComments, PriorityOfCommentBreaking) { 792 EXPECT_EQ("if (xxx ==\n" 793 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n" 794 " zzz)\n" 795 " q();", 796 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n" 797 " zzz) q();", 798 getLLVMStyleWithColumns(40))); 799 EXPECT_EQ("if (xxxxxxxxxx ==\n" 800 " yyy && // aaaaaa bbbbbbbb cccc\n" 801 " zzz)\n" 802 " q();", 803 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n" 804 " zzz) q();", 805 getLLVMStyleWithColumns(40))); 806 EXPECT_EQ("if (xxxxxxxxxx &&\n" 807 " yyy || // aaaaaa bbbbbbbb cccc\n" 808 " zzz)\n" 809 " q();", 810 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n" 811 " zzz) q();", 812 getLLVMStyleWithColumns(40))); 813 EXPECT_EQ("fffffffff(\n" 814 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n" 815 " zzz);", 816 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n" 817 " zzz);", 818 getLLVMStyleWithColumns(40))); 819 } 820 821 TEST_F(FormatTestComments, MultiLineCommentsInDefines) { 822 EXPECT_EQ("#define A(x) /* \\\n" 823 " a comment \\\n" 824 " inside */ \\\n" 825 " f();", 826 format("#define A(x) /* \\\n" 827 " a comment \\\n" 828 " inside */ \\\n" 829 " f();", 830 getLLVMStyleWithColumns(17))); 831 EXPECT_EQ("#define A( \\\n" 832 " x) /* \\\n" 833 " a comment \\\n" 834 " inside */ \\\n" 835 " f();", 836 format("#define A( \\\n" 837 " x) /* \\\n" 838 " a comment \\\n" 839 " inside */ \\\n" 840 " f();", 841 getLLVMStyleWithColumns(17))); 842 } 843 844 TEST_F(FormatTestComments, ParsesCommentsAdjacentToPPDirectives) { 845 EXPECT_EQ("namespace {}\n// Test\n#define A", 846 format("namespace {}\n // Test\n#define A")); 847 EXPECT_EQ("namespace {}\n/* Test */\n#define A", 848 format("namespace {}\n /* Test */\n#define A")); 849 EXPECT_EQ("namespace {}\n/* Test */ #define A", 850 format("namespace {}\n /* Test */ #define A")); 851 } 852 853 TEST_F(FormatTestComments, KeepsLevelOfCommentBeforePPDirective) { 854 // Keep the current level if the comment was originally not aligned with 855 // the preprocessor directive. 856 EXPECT_EQ("void f() {\n" 857 " int i;\n" 858 " /* comment */\n" 859 "#ifdef A\n" 860 " int j;\n" 861 "}", 862 format("void f() {\n" 863 " int i;\n" 864 " /* comment */\n" 865 "#ifdef A\n" 866 " int j;\n" 867 "}")); 868 869 EXPECT_EQ("void f() {\n" 870 " int i;\n" 871 " /* comment */\n" 872 "\n" 873 "#ifdef A\n" 874 " int j;\n" 875 "}", 876 format("void f() {\n" 877 " int i;\n" 878 " /* comment */\n" 879 "\n" 880 "#ifdef A\n" 881 " int j;\n" 882 "}")); 883 884 EXPECT_EQ("int f(int i) {\n" 885 " if (true) {\n" 886 " ++i;\n" 887 " }\n" 888 " // comment\n" 889 "#ifdef A\n" 890 " int j;\n" 891 "#endif\n" 892 "}", 893 format("int f(int i) {\n" 894 " if (true) {\n" 895 " ++i;\n" 896 " }\n" 897 " // comment\n" 898 "#ifdef A\n" 899 "int j;\n" 900 "#endif\n" 901 "}")); 902 903 EXPECT_EQ("int f(int i) {\n" 904 " if (true) {\n" 905 " i++;\n" 906 " } else {\n" 907 " // comment in else\n" 908 "#ifdef A\n" 909 " j++;\n" 910 "#endif\n" 911 " }\n" 912 "}", 913 format("int f(int i) {\n" 914 " if (true) {\n" 915 " i++;\n" 916 " } else {\n" 917 " // comment in else\n" 918 "#ifdef A\n" 919 " j++;\n" 920 "#endif\n" 921 " }\n" 922 "}")); 923 924 EXPECT_EQ("int f(int i) {\n" 925 " if (true) {\n" 926 " i++;\n" 927 " } else {\n" 928 " /* comment in else */\n" 929 "#ifdef A\n" 930 " j++;\n" 931 "#endif\n" 932 " }\n" 933 "}", 934 format("int f(int i) {\n" 935 " if (true) {\n" 936 " i++;\n" 937 " } else {\n" 938 " /* comment in else */\n" 939 "#ifdef A\n" 940 " j++;\n" 941 "#endif\n" 942 " }\n" 943 "}")); 944 945 // Keep the current level if there is an empty line between the comment and 946 // the preprocessor directive. 947 EXPECT_EQ("void f() {\n" 948 " int i;\n" 949 " /* comment */\n" 950 "\n" 951 "#ifdef A\n" 952 " int j;\n" 953 "}", 954 format("void f() {\n" 955 " int i;\n" 956 "/* comment */\n" 957 "\n" 958 "#ifdef A\n" 959 " int j;\n" 960 "}")); 961 962 EXPECT_EQ("void f() {\n" 963 " int i;\n" 964 " return i;\n" 965 "}\n" 966 "// comment\n" 967 "\n" 968 "#ifdef A\n" 969 "int i;\n" 970 "#endif // A", 971 format("void f() {\n" 972 " int i;\n" 973 " return i;\n" 974 "}\n" 975 "// comment\n" 976 "\n" 977 "#ifdef A\n" 978 "int i;\n" 979 "#endif // A")); 980 981 EXPECT_EQ("int f(int i) {\n" 982 " if (true) {\n" 983 " ++i;\n" 984 " }\n" 985 " // comment\n" 986 "\n" 987 "#ifdef A\n" 988 " int j;\n" 989 "#endif\n" 990 "}", 991 format("int f(int i) {\n" 992 " if (true) {\n" 993 " ++i;\n" 994 " }\n" 995 " // comment\n" 996 "\n" 997 "#ifdef A\n" 998 " int j;\n" 999 "#endif\n" 1000 "}")); 1001 1002 EXPECT_EQ("int f(int i) {\n" 1003 " if (true) {\n" 1004 " i++;\n" 1005 " } else {\n" 1006 " // comment in else\n" 1007 "\n" 1008 "#ifdef A\n" 1009 " j++;\n" 1010 "#endif\n" 1011 " }\n" 1012 "}", 1013 format("int f(int i) {\n" 1014 " if (true) {\n" 1015 " i++;\n" 1016 " } else {\n" 1017 "// comment in else\n" 1018 "\n" 1019 "#ifdef A\n" 1020 " j++;\n" 1021 "#endif\n" 1022 " }\n" 1023 "}")); 1024 1025 EXPECT_EQ("int f(int i) {\n" 1026 " if (true) {\n" 1027 " i++;\n" 1028 " } else {\n" 1029 " /* comment in else */\n" 1030 "\n" 1031 "#ifdef A\n" 1032 " j++;\n" 1033 "#endif\n" 1034 " }\n" 1035 "}", 1036 format("int f(int i) {\n" 1037 " if (true) {\n" 1038 " i++;\n" 1039 " } else {\n" 1040 "/* comment in else */\n" 1041 "\n" 1042 "#ifdef A\n" 1043 " j++;\n" 1044 "#endif\n" 1045 " }\n" 1046 "}")); 1047 1048 // Align with the preprocessor directive if the comment was originally aligned 1049 // with the preprocessor directive and there is no newline between the comment 1050 // and the preprocessor directive. 1051 EXPECT_EQ("void f() {\n" 1052 " int i;\n" 1053 "/* comment */\n" 1054 "#ifdef A\n" 1055 " int j;\n" 1056 "}", 1057 format("void f() {\n" 1058 " int i;\n" 1059 "/* comment */\n" 1060 "#ifdef A\n" 1061 " int j;\n" 1062 "}")); 1063 1064 EXPECT_EQ("int f(int i) {\n" 1065 " if (true) {\n" 1066 " ++i;\n" 1067 " }\n" 1068 "// comment\n" 1069 "#ifdef A\n" 1070 " int j;\n" 1071 "#endif\n" 1072 "}", 1073 format("int f(int i) {\n" 1074 " if (true) {\n" 1075 " ++i;\n" 1076 " }\n" 1077 "// comment\n" 1078 "#ifdef A\n" 1079 " int j;\n" 1080 "#endif\n" 1081 "}")); 1082 1083 EXPECT_EQ("int f(int i) {\n" 1084 " if (true) {\n" 1085 " i++;\n" 1086 " } else {\n" 1087 "// comment in else\n" 1088 "#ifdef A\n" 1089 " j++;\n" 1090 "#endif\n" 1091 " }\n" 1092 "}", 1093 format("int f(int i) {\n" 1094 " if (true) {\n" 1095 " i++;\n" 1096 " } else {\n" 1097 " // comment in else\n" 1098 " #ifdef A\n" 1099 " j++;\n" 1100 "#endif\n" 1101 " }\n" 1102 "}")); 1103 1104 EXPECT_EQ("int f(int i) {\n" 1105 " if (true) {\n" 1106 " i++;\n" 1107 " } else {\n" 1108 "/* comment in else */\n" 1109 "#ifdef A\n" 1110 " j++;\n" 1111 "#endif\n" 1112 " }\n" 1113 "}", 1114 format("int f(int i) {\n" 1115 " if (true) {\n" 1116 " i++;\n" 1117 " } else {\n" 1118 " /* comment in else */\n" 1119 " #ifdef A\n" 1120 " j++;\n" 1121 "#endif\n" 1122 " }\n" 1123 "}")); 1124 1125 const StringRef Code("void func() {\n" 1126 " // clang-format off\n" 1127 " #define KV(value) #value, value\n" 1128 " // clang-format on\n" 1129 "}"); 1130 verifyNoChange(Code); 1131 1132 auto Style = getLLVMStyle(); 1133 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 1134 verifyFormat("#ifdef FOO\n" 1135 " // Foo\n" 1136 " #define Foo foo\n" 1137 "#else\n" 1138 " // Bar\n" 1139 " #define Bar bar\n" 1140 "#endif", 1141 Style); 1142 } 1143 1144 TEST_F(FormatTestComments, CommentsBetweenUnbracedBodyAndPPDirective) { 1145 verifyFormat("{\n" 1146 " if (a)\n" 1147 " f(); // comment\n" 1148 "#define A\n" 1149 "}"); 1150 1151 verifyFormat("{\n" 1152 " while (a)\n" 1153 " f();\n" 1154 "// comment\n" 1155 "#define A\n" 1156 "}"); 1157 1158 verifyNoChange("{\n" 1159 " if (a)\n" 1160 " f();\n" 1161 " // comment\n" 1162 "#define A\n" 1163 "}"); 1164 1165 verifyNoChange("{\n" 1166 " while (a)\n" 1167 " if (b)\n" 1168 " f();\n" 1169 " // comment\n" 1170 "#define A\n" 1171 "}"); 1172 } 1173 1174 TEST_F(FormatTestComments, SplitsLongLinesInComments) { 1175 // FIXME: Do we need to fix up the " */" at the end? 1176 // It doesn't look like any of our current logic triggers this. 1177 EXPECT_EQ("/* This is a long\n" 1178 " * comment that\n" 1179 " * doesn't fit on\n" 1180 " * one line. */", 1181 format("/* " 1182 "This is a long " 1183 "comment that " 1184 "doesn't " 1185 "fit on one line. */", 1186 getLLVMStyleWithColumns(20))); 1187 EXPECT_EQ( 1188 "/* a b c d\n" 1189 " * e f g\n" 1190 " * h i j k\n" 1191 " */", 1192 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10))); 1193 EXPECT_EQ( 1194 "/* a b c d\n" 1195 " * e f g\n" 1196 " * h i j k\n" 1197 " */", 1198 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10))); 1199 EXPECT_EQ("/*\n" 1200 "This is a long\n" 1201 "comment that doesn't\n" 1202 "fit on one line.\n" 1203 "*/", 1204 format("/*\n" 1205 "This is a long " 1206 "comment that doesn't " 1207 "fit on one line. \n" 1208 "*/", 1209 getLLVMStyleWithColumns(20))); 1210 EXPECT_EQ("/*\n" 1211 " * This is a long\n" 1212 " * comment that\n" 1213 " * doesn't fit on\n" 1214 " * one line.\n" 1215 " */", 1216 format("/* \n" 1217 " * This is a long " 1218 " comment that " 1219 " doesn't fit on " 1220 " one line. \n" 1221 " */", 1222 getLLVMStyleWithColumns(20))); 1223 EXPECT_EQ("/*\n" 1224 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n" 1225 " * so_it_should_be_broken\n" 1226 " * wherever_a_space_occurs\n" 1227 " */", 1228 format("/*\n" 1229 " * This_is_a_comment_with_words_that_dont_fit_on_one_line " 1230 " so_it_should_be_broken " 1231 " wherever_a_space_occurs \n" 1232 " */", 1233 getLLVMStyleWithColumns(20))); 1234 EXPECT_EQ("/*\n" 1235 " * This_comment_can_not_be_broken_into_lines\n" 1236 " */", 1237 format("/*\n" 1238 " * This_comment_can_not_be_broken_into_lines\n" 1239 " */", 1240 getLLVMStyleWithColumns(20))); 1241 EXPECT_EQ("{\n" 1242 " /*\n" 1243 " This is another\n" 1244 " long comment that\n" 1245 " doesn't fit on one\n" 1246 " line 1234567890\n" 1247 " */\n" 1248 "}", 1249 format("{\n" 1250 "/*\n" 1251 "This is another " 1252 " long comment that " 1253 " doesn't fit on one" 1254 " line 1234567890\n" 1255 "*/\n" 1256 "}", 1257 getLLVMStyleWithColumns(20))); 1258 EXPECT_EQ("{\n" 1259 " /*\n" 1260 " * This i s\n" 1261 " * another comment\n" 1262 " * t hat doesn' t\n" 1263 " * fit on one l i\n" 1264 " * n e\n" 1265 " */\n" 1266 "}", 1267 format("{\n" 1268 "/*\n" 1269 " * This i s" 1270 " another comment" 1271 " t hat doesn' t" 1272 " fit on one l i" 1273 " n e\n" 1274 " */\n" 1275 "}", 1276 getLLVMStyleWithColumns(20))); 1277 EXPECT_EQ("/*\n" 1278 " * This is a long\n" 1279 " * comment that\n" 1280 " * doesn't fit on\n" 1281 " * one line\n" 1282 " */", 1283 format(" /*\n" 1284 " * This is a long comment that doesn't fit on one line\n" 1285 " */", 1286 getLLVMStyleWithColumns(20))); 1287 EXPECT_EQ("{\n" 1288 " if (something) /* This is a\n" 1289 " long\n" 1290 " comment */\n" 1291 " ;\n" 1292 "}", 1293 format("{\n" 1294 " if (something) /* This is a long comment */\n" 1295 " ;\n" 1296 "}", 1297 getLLVMStyleWithColumns(30))); 1298 1299 EXPECT_EQ("/* A comment before\n" 1300 " * a macro\n" 1301 " * definition */\n" 1302 "#define a b", 1303 format("/* A comment before a macro definition */\n" 1304 "#define a b", 1305 getLLVMStyleWithColumns(20))); 1306 1307 EXPECT_EQ("/* some comment\n" 1308 " * a comment that\n" 1309 " * we break another\n" 1310 " * comment we have\n" 1311 " * to break a left\n" 1312 " * comment\n" 1313 " */", 1314 format(" /* some comment\n" 1315 " * a comment that we break\n" 1316 " * another comment we have to break\n" 1317 "* a left comment\n" 1318 " */", 1319 getLLVMStyleWithColumns(20))); 1320 1321 EXPECT_EQ("/**\n" 1322 " * multiline block\n" 1323 " * comment\n" 1324 " *\n" 1325 " */", 1326 format("/**\n" 1327 " * multiline block comment\n" 1328 " *\n" 1329 " */", 1330 getLLVMStyleWithColumns(20))); 1331 1332 // This reproduces a crashing bug where both adaptStartOfLine and 1333 // getCommentSplit were trying to wrap after the "/**". 1334 verifyFormat("/** multilineblockcommentwithnowrapopportunity */", 1335 getLLVMStyleWithColumns(20)); 1336 1337 EXPECT_EQ("/*\n" 1338 "\n" 1339 "\n" 1340 " */", 1341 format(" /* \n" 1342 " \n" 1343 " \n" 1344 " */")); 1345 1346 EXPECT_EQ("/* a a */", 1347 format("/* a a */", getLLVMStyleWithColumns(15))); 1348 EXPECT_EQ("/* a a bc */", 1349 format("/* a a bc */", getLLVMStyleWithColumns(15))); 1350 EXPECT_EQ("/* aaa aaa\n" 1351 " * aaaaa */", 1352 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15))); 1353 EXPECT_EQ("/* aaa aaa\n" 1354 " * aaaaa */", 1355 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15))); 1356 } 1357 1358 TEST_F(FormatTestComments, SplitsLongLinesInCommentsInPreprocessor) { 1359 EXPECT_EQ("#define X \\\n" 1360 " /* \\\n" 1361 " Test \\\n" 1362 " Macro comment \\\n" 1363 " with a long \\\n" 1364 " line \\\n" 1365 " */ \\\n" 1366 " A + B", 1367 format("#define X \\\n" 1368 " /*\n" 1369 " Test\n" 1370 " Macro comment with a long line\n" 1371 " */ \\\n" 1372 " A + B", 1373 getLLVMStyleWithColumns(20))); 1374 EXPECT_EQ("#define X \\\n" 1375 " /* Macro comment \\\n" 1376 " with a long \\\n" 1377 " line */ \\\n" 1378 " A + B", 1379 format("#define X \\\n" 1380 " /* Macro comment with a long\n" 1381 " line */ \\\n" 1382 " A + B", 1383 getLLVMStyleWithColumns(20))); 1384 EXPECT_EQ("#define X \\\n" 1385 " /* Macro comment \\\n" 1386 " * with a long \\\n" 1387 " * line */ \\\n" 1388 " A + B", 1389 format("#define X \\\n" 1390 " /* Macro comment with a long line */ \\\n" 1391 " A + B", 1392 getLLVMStyleWithColumns(20))); 1393 } 1394 1395 TEST_F(FormatTestComments, KeepsTrailingPPCommentsAndSectionCommentsSeparate) { 1396 verifyFormat("#ifdef A // line about A\n" 1397 "// section comment\n" 1398 "#endif", 1399 getLLVMStyleWithColumns(80)); 1400 verifyFormat("#ifdef A // line 1 about A\n" 1401 " // line 2 about A\n" 1402 "// section comment\n" 1403 "#endif", 1404 getLLVMStyleWithColumns(80)); 1405 EXPECT_EQ("#ifdef A // line 1 about A\n" 1406 " // line 2 about A\n" 1407 "// section comment\n" 1408 "#endif", 1409 format("#ifdef A // line 1 about A\n" 1410 " // line 2 about A\n" 1411 "// section comment\n" 1412 "#endif", 1413 getLLVMStyleWithColumns(80))); 1414 verifyFormat("int f() {\n" 1415 " int i;\n" 1416 "#ifdef A // comment about A\n" 1417 " // section comment 1\n" 1418 " // section comment 2\n" 1419 " i = 2;\n" 1420 "#else // comment about #else\n" 1421 " // section comment 3\n" 1422 " i = 4;\n" 1423 "#endif\n" 1424 "}", 1425 getLLVMStyleWithColumns(80)); 1426 } 1427 1428 TEST_F(FormatTestComments, AlignsPPElseEndifComments) { 1429 verifyFormat("#if A\n" 1430 "#else // A\n" 1431 "int iiii;\n" 1432 "#endif // B", 1433 getLLVMStyleWithColumns(20)); 1434 verifyFormat("#if A\n" 1435 "#else // A\n" 1436 "int iiii; // CC\n" 1437 "#endif // B", 1438 getLLVMStyleWithColumns(20)); 1439 EXPECT_EQ("#if A\n" 1440 "#else // A1\n" 1441 " // A2\n" 1442 "int ii;\n" 1443 "#endif // B", 1444 format("#if A\n" 1445 "#else // A1\n" 1446 " // A2\n" 1447 "int ii;\n" 1448 "#endif // B", 1449 getLLVMStyleWithColumns(20))); 1450 } 1451 1452 TEST_F(FormatTestComments, CommentsInStaticInitializers) { 1453 EXPECT_EQ( 1454 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n" 1455 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n" 1456 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n" 1457 " aaaaaaaaaaaaaaaaaaaa, // comment\n" 1458 " aaaaaaaaaaaaaaaaaaaa};", 1459 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n" 1460 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n" 1461 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n" 1462 " aaaaaaaaaaaaaaaaaaaa , // comment\n" 1463 " aaaaaaaaaaaaaaaaaaaa };")); 1464 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n" 1465 " bbbbbbbbbbb, ccccccccccc};"); 1466 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n" 1467 " // comment for bb....\n" 1468 " bbbbbbbbbbb, ccccccccccc};"); 1469 verifyGoogleFormat( 1470 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n" 1471 " bbbbbbbbbbb, ccccccccccc};"); 1472 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n" 1473 " // comment for bb....\n" 1474 " bbbbbbbbbbb, ccccccccccc};"); 1475 1476 verifyFormat("S s = {{a, b, c}, // Group #1\n" 1477 " {d, e, f}, // Group #2\n" 1478 " {g, h, i}}; // Group #3"); 1479 verifyFormat("S s = {{// Group #1\n" 1480 " a, b, c},\n" 1481 " {// Group #2\n" 1482 " d, e, f},\n" 1483 " {// Group #3\n" 1484 " g, h, i}};"); 1485 1486 EXPECT_EQ("S s = {\n" 1487 " // Some comment\n" 1488 " a,\n" 1489 "\n" 1490 " // Comment after empty line\n" 1491 " b}", 1492 format("S s = {\n" 1493 " // Some comment\n" 1494 " a,\n" 1495 " \n" 1496 " // Comment after empty line\n" 1497 " b\n" 1498 "}")); 1499 EXPECT_EQ("S s = {\n" 1500 " /* Some comment */\n" 1501 " a,\n" 1502 "\n" 1503 " /* Comment after empty line */\n" 1504 " b}", 1505 format("S s = {\n" 1506 " /* Some comment */\n" 1507 " a,\n" 1508 " \n" 1509 " /* Comment after empty line */\n" 1510 " b\n" 1511 "}")); 1512 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n" 1513 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n" 1514 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n" 1515 " 0x00, 0x00, 0x00, 0x00}; // comment"); 1516 } 1517 1518 TEST_F(FormatTestComments, LineCommentsAfterRightBrace) { 1519 EXPECT_EQ("if (true) { // comment about branch\n" 1520 " // comment about f\n" 1521 " f();\n" 1522 "}", 1523 format("if (true) { // comment about branch\n" 1524 " // comment about f\n" 1525 " f();\n" 1526 "}", 1527 getLLVMStyleWithColumns(80))); 1528 EXPECT_EQ("if (1) { // if line 1\n" 1529 " // if line 2\n" 1530 " // if line 3\n" 1531 " // f line 1\n" 1532 " // f line 2\n" 1533 " f();\n" 1534 "} else { // else line 1\n" 1535 " // else line 2\n" 1536 " // else line 3\n" 1537 " // g line 1\n" 1538 " g();\n" 1539 "}", 1540 format("if (1) { // if line 1\n" 1541 " // if line 2\n" 1542 " // if line 3\n" 1543 " // f line 1\n" 1544 " // f line 2\n" 1545 " f();\n" 1546 "} else { // else line 1\n" 1547 " // else line 2\n" 1548 " // else line 3\n" 1549 " // g line 1\n" 1550 " g();\n" 1551 "}")); 1552 EXPECT_EQ("do { // line 1\n" 1553 " // line 2\n" 1554 " // line 3\n" 1555 " f();\n" 1556 "} while (true);", 1557 format("do { // line 1\n" 1558 " // line 2\n" 1559 " // line 3\n" 1560 " f();\n" 1561 "} while (true);", 1562 getLLVMStyleWithColumns(80))); 1563 EXPECT_EQ("while (a < b) { // line 1\n" 1564 " // line 2\n" 1565 " // line 3\n" 1566 " f();\n" 1567 "}", 1568 format("while (a < b) {// line 1\n" 1569 " // line 2\n" 1570 " // line 3\n" 1571 " f();\n" 1572 "}", 1573 getLLVMStyleWithColumns(80))); 1574 } 1575 1576 TEST_F(FormatTestComments, ReflowsComments) { 1577 // Break a long line and reflow with the full next line. 1578 EXPECT_EQ("// long long long\n" 1579 "// long long", 1580 format("// long long long long\n" 1581 "// long", 1582 getLLVMStyleWithColumns(20))); 1583 1584 // Keep the trailing newline while reflowing. 1585 EXPECT_EQ("// long long long\n" 1586 "// long long", 1587 format("// long long long long\n" 1588 "// long", 1589 getLLVMStyleWithColumns(20))); 1590 1591 // Break a long line and reflow with a part of the next line. 1592 EXPECT_EQ("// long long long\n" 1593 "// long long\n" 1594 "// long_long", 1595 format("// long long long long\n" 1596 "// long long_long", 1597 getLLVMStyleWithColumns(20))); 1598 1599 // Break but do not reflow if the first word from the next line is too long. 1600 EXPECT_EQ("// long long long\n" 1601 "// long\n" 1602 "// long_long_long", 1603 format("// long long long long\n" 1604 "// long_long_long", 1605 getLLVMStyleWithColumns(20))); 1606 1607 // Don't break or reflow short lines. 1608 verifyFormat("// long\n" 1609 "// long long long lo\n" 1610 "// long long long lo\n" 1611 "// long", 1612 getLLVMStyleWithColumns(20)); 1613 1614 // Keep prefixes and decorations while reflowing. 1615 EXPECT_EQ("/// long long long\n" 1616 "/// long long", 1617 format("/// long long long long\n" 1618 "/// long", 1619 getLLVMStyleWithColumns(20))); 1620 EXPECT_EQ("//! long long long\n" 1621 "//! long long", 1622 format("//! long long long long\n" 1623 "//! long", 1624 getLLVMStyleWithColumns(20))); 1625 EXPECT_EQ("/* long long long\n" 1626 " * long long */", 1627 format("/* long long long long\n" 1628 " * long */", 1629 getLLVMStyleWithColumns(20))); 1630 EXPECT_EQ("///< long long long\n" 1631 "///< long long", 1632 format("///< long long long long\n" 1633 "///< long", 1634 getLLVMStyleWithColumns(20))); 1635 EXPECT_EQ("//!< long long long\n" 1636 "//!< long long", 1637 format("//!< long long long long\n" 1638 "//!< long", 1639 getLLVMStyleWithColumns(20))); 1640 1641 // Don't bring leading whitespace up while reflowing. 1642 EXPECT_EQ("/* long long long\n" 1643 " * long long long\n" 1644 " */", 1645 format("/* long long long long\n" 1646 " * long long\n" 1647 " */", 1648 getLLVMStyleWithColumns(20))); 1649 1650 // Reflow the last line of a block comment with its trailing '*/'. 1651 EXPECT_EQ("/* long long long\n" 1652 " long long */", 1653 format("/* long long long long\n" 1654 " long */", 1655 getLLVMStyleWithColumns(20))); 1656 1657 // Reflow two short lines; keep the postfix of the last one. 1658 EXPECT_EQ("/* long long long\n" 1659 " * long long long */", 1660 format("/* long long long long\n" 1661 " * long\n" 1662 " * long */", 1663 getLLVMStyleWithColumns(20))); 1664 1665 // Put the postfix of the last short reflow line on a newline if it doesn't 1666 // fit. 1667 EXPECT_EQ("/* long long long\n" 1668 " * long long longg\n" 1669 " */", 1670 format("/* long long long long\n" 1671 " * long\n" 1672 " * longg */", 1673 getLLVMStyleWithColumns(20))); 1674 1675 // Reflow lines with leading whitespace. 1676 EXPECT_EQ("{\n" 1677 " /*\n" 1678 " * long long long\n" 1679 " * long long long\n" 1680 " * long long long\n" 1681 " */\n" 1682 "}", 1683 format("{\n" 1684 "/*\n" 1685 " * long long long long\n" 1686 " * long\n" 1687 " * long long long long\n" 1688 " */\n" 1689 "}", 1690 getLLVMStyleWithColumns(20))); 1691 1692 // Break single line block comments that are first in the line with ' *' 1693 // decoration. 1694 EXPECT_EQ("/* long long long\n" 1695 " * long */", 1696 format("/* long long long long */", getLLVMStyleWithColumns(20))); 1697 1698 // Break single line block comment that are not first in the line with ' ' 1699 // decoration. 1700 EXPECT_EQ("int i; /* long long\n" 1701 " long */", 1702 format("int i; /* long long long */", getLLVMStyleWithColumns(20))); 1703 1704 // Reflow a line that goes just over the column limit. 1705 EXPECT_EQ("// long long long\n" 1706 "// lon long", 1707 format("// long long long lon\n" 1708 "// long", 1709 getLLVMStyleWithColumns(20))); 1710 1711 // Stop reflowing if the next line has a different indentation than the 1712 // previous line. 1713 EXPECT_EQ("// long long long\n" 1714 "// long\n" 1715 "// long long\n" 1716 "// long", 1717 format("// long long long long\n" 1718 "// long long\n" 1719 "// long", 1720 getLLVMStyleWithColumns(20))); 1721 1722 // Reflow into the last part of a really long line that has been broken into 1723 // multiple lines. 1724 EXPECT_EQ("// long long long\n" 1725 "// long long long\n" 1726 "// long long long", 1727 format("// long long long long long long long long\n" 1728 "// long", 1729 getLLVMStyleWithColumns(20))); 1730 1731 // Break the first line, then reflow the beginning of the second and third 1732 // line up. 1733 EXPECT_EQ("// long long long\n" 1734 "// lon1 lon2 lon2\n" 1735 "// lon2 lon3 lon3", 1736 format("// long long long lon1\n" 1737 "// lon2 lon2 lon2\n" 1738 "// lon3 lon3", 1739 getLLVMStyleWithColumns(20))); 1740 1741 // Reflow the beginning of the second line, then break the rest. 1742 EXPECT_EQ("// long long long\n" 1743 "// lon1 lon2 lon2\n" 1744 "// lon2 lon2 lon2\n" 1745 "// lon3", 1746 format("// long long long lon1\n" 1747 "// lon2 lon2 lon2 lon2 lon2 lon3", 1748 getLLVMStyleWithColumns(20))); 1749 1750 // Shrink the first line, then reflow the second line up. 1751 EXPECT_EQ("// long long long", format("// long long\n" 1752 "// long", 1753 getLLVMStyleWithColumns(20))); 1754 1755 // Don't shrink leading whitespace. 1756 verifyNoChange("int i; /// a", getLLVMStyleWithColumns(20)); 1757 1758 // Shrink trailing whitespace if there is no postfix and reflow. 1759 EXPECT_EQ("// long long long\n" 1760 "// long long", 1761 format("// long long long long \n" 1762 "// long", 1763 getLLVMStyleWithColumns(20))); 1764 1765 // Shrink trailing whitespace to a single one if there is postfix. 1766 EXPECT_EQ("/* long long long */", 1767 format("/* long long long */", getLLVMStyleWithColumns(20))); 1768 1769 // Break a block comment postfix if exceeding the line limit. 1770 EXPECT_EQ("/* long\n" 1771 " */", 1772 format("/* long */", getLLVMStyleWithColumns(20))); 1773 1774 // Reflow indented comments. 1775 EXPECT_EQ("{\n" 1776 " // long long long\n" 1777 " // long long\n" 1778 " int i; /* long lon\n" 1779 " g long\n" 1780 " */\n" 1781 "}", 1782 format("{\n" 1783 " // long long long long\n" 1784 " // long\n" 1785 " int i; /* long lon g\n" 1786 " long */\n" 1787 "}", 1788 getLLVMStyleWithColumns(20))); 1789 1790 // Don't realign trailing comments after reflow has happened. 1791 EXPECT_EQ("// long long long\n" 1792 "// long long\n" 1793 "long i; // long", 1794 format("// long long long long\n" 1795 "// long\n" 1796 "long i; // long", 1797 getLLVMStyleWithColumns(20))); 1798 EXPECT_EQ("// long long long\n" 1799 "// longng long long\n" 1800 "// long lo", 1801 format("// long long long longng\n" 1802 "// long long long\n" 1803 "// lo", 1804 getLLVMStyleWithColumns(20))); 1805 1806 // Reflow lines after a broken line. 1807 EXPECT_EQ("int a; // Trailing\n" 1808 " // comment on\n" 1809 " // 2 or 3\n" 1810 " // lines.", 1811 format("int a; // Trailing comment\n" 1812 " // on 2\n" 1813 " // or 3\n" 1814 " // lines.", 1815 getLLVMStyleWithColumns(20))); 1816 EXPECT_EQ("/// This long line\n" 1817 "/// gets reflown.", 1818 format("/// This long line gets\n" 1819 "/// reflown.", 1820 getLLVMStyleWithColumns(20))); 1821 EXPECT_EQ("//! This long line\n" 1822 "//! gets reflown.", 1823 format(" //! This long line gets\n" 1824 " //! reflown.", 1825 getLLVMStyleWithColumns(20))); 1826 EXPECT_EQ("/* This long line\n" 1827 " * gets reflown.\n" 1828 " */", 1829 format("/* This long line gets\n" 1830 " * reflown.\n" 1831 " */", 1832 getLLVMStyleWithColumns(20))); 1833 1834 // Reflow after indentation makes a line too long. 1835 EXPECT_EQ("{\n" 1836 " // long long long\n" 1837 " // lo long\n" 1838 "}", 1839 format("{\n" 1840 "// long long long lo\n" 1841 "// long\n" 1842 "}", 1843 getLLVMStyleWithColumns(20))); 1844 1845 // Break and reflow multiple lines. 1846 EXPECT_EQ("/*\n" 1847 " * Reflow the end of\n" 1848 " * line by 11 22 33\n" 1849 " * 4.\n" 1850 " */", 1851 format("/*\n" 1852 " * Reflow the end of line\n" 1853 " * by\n" 1854 " * 11\n" 1855 " * 22\n" 1856 " * 33\n" 1857 " * 4.\n" 1858 " */", 1859 getLLVMStyleWithColumns(20))); 1860 EXPECT_EQ("/// First line gets\n" 1861 "/// broken. Second\n" 1862 "/// line gets\n" 1863 "/// reflown and\n" 1864 "/// broken. Third\n" 1865 "/// gets reflown.", 1866 format("/// First line gets broken.\n" 1867 "/// Second line gets reflown and broken.\n" 1868 "/// Third gets reflown.", 1869 getLLVMStyleWithColumns(20))); 1870 EXPECT_EQ("int i; // first long\n" 1871 " // long snd\n" 1872 " // long.", 1873 format("int i; // first long long\n" 1874 " // snd long.", 1875 getLLVMStyleWithColumns(20))); 1876 EXPECT_EQ("{\n" 1877 " // first long line\n" 1878 " // line second\n" 1879 " // long line line\n" 1880 " // third long line\n" 1881 " // line\n" 1882 "}", 1883 format("{\n" 1884 " // first long line line\n" 1885 " // second long line line\n" 1886 " // third long line line\n" 1887 "}", 1888 getLLVMStyleWithColumns(20))); 1889 EXPECT_EQ("int i; /* first line\n" 1890 " * second\n" 1891 " * line third\n" 1892 " * line\n" 1893 " */", 1894 format("int i; /* first line\n" 1895 " * second line\n" 1896 " * third line\n" 1897 " */", 1898 getLLVMStyleWithColumns(20))); 1899 1900 // Reflow the last two lines of a section that starts with a line having 1901 // different indentation. 1902 EXPECT_EQ("// long\n" 1903 "// long long long\n" 1904 "// long long", 1905 format("// long\n" 1906 "// long long long long\n" 1907 "// long", 1908 getLLVMStyleWithColumns(20))); 1909 1910 // Keep the block comment endling '*/' while reflowing. 1911 EXPECT_EQ("/* Long long long\n" 1912 " * line short */", 1913 format("/* Long long long line\n" 1914 " * short */", 1915 getLLVMStyleWithColumns(20))); 1916 1917 // Don't reflow between separate blocks of comments. 1918 EXPECT_EQ("/* First comment\n" 1919 " * block will */\n" 1920 "/* Snd\n" 1921 " */", 1922 format("/* First comment block\n" 1923 " * will */\n" 1924 "/* Snd\n" 1925 " */", 1926 getLLVMStyleWithColumns(20))); 1927 1928 // Don't reflow across blank comment lines. 1929 EXPECT_EQ("int i; // This long\n" 1930 " // line gets\n" 1931 " // broken.\n" 1932 " //\n" 1933 " // keep.", 1934 format("int i; // This long line gets broken.\n" 1935 " // \n" 1936 " // keep.", 1937 getLLVMStyleWithColumns(20))); 1938 EXPECT_EQ("{\n" 1939 " /// long long long\n" 1940 " /// long long\n" 1941 " ///\n" 1942 " /// long\n" 1943 "}", 1944 format("{\n" 1945 " /// long long long long\n" 1946 " /// long\n" 1947 " ///\n" 1948 " /// long\n" 1949 "}", 1950 getLLVMStyleWithColumns(20))); 1951 EXPECT_EQ("//! long long long\n" 1952 "//! long\n" 1953 "\n" 1954 "//! long", 1955 format("//! long long long long\n" 1956 "\n" 1957 "//! long", 1958 getLLVMStyleWithColumns(20))); 1959 EXPECT_EQ("/* long long long\n" 1960 " long\n" 1961 "\n" 1962 " long */", 1963 format("/* long long long long\n" 1964 "\n" 1965 " long */", 1966 getLLVMStyleWithColumns(20))); 1967 EXPECT_EQ("/* long long long\n" 1968 " * long\n" 1969 " *\n" 1970 " * long */", 1971 format("/* long long long long\n" 1972 " *\n" 1973 " * long */", 1974 getLLVMStyleWithColumns(20))); 1975 1976 // Don't reflow lines having content that is a single character. 1977 EXPECT_EQ("// long long long\n" 1978 "// long\n" 1979 "// l", 1980 format("// long long long long\n" 1981 "// l", 1982 getLLVMStyleWithColumns(20))); 1983 1984 // Don't reflow lines starting with two punctuation characters. 1985 EXPECT_EQ("// long long long\n" 1986 "// long\n" 1987 "// ... --- ...", 1988 format("// long long long long\n" 1989 "// ... --- ...", 1990 getLLVMStyleWithColumns(20))); 1991 1992 // Don't reflow lines starting with '@'. 1993 EXPECT_EQ("// long long long\n" 1994 "// long\n" 1995 "// @param arg", 1996 format("// long long long long\n" 1997 "// @param arg", 1998 getLLVMStyleWithColumns(20))); 1999 2000 // Don't reflow lines starting with '\'. 2001 verifyFormat("// long long long\n" 2002 "// long\n" 2003 "// \\param arg", 2004 "// long long long long\n" 2005 "// \\param arg", 2006 getLLVMStyleWithColumns(20)); 2007 2008 // Don't reflow lines starting with 'TODO'. 2009 EXPECT_EQ("// long long long\n" 2010 "// long\n" 2011 "// TODO: long", 2012 format("// long long long long\n" 2013 "// TODO: long", 2014 getLLVMStyleWithColumns(20))); 2015 2016 // Don't reflow lines starting with 'FIXME'. 2017 EXPECT_EQ("// long long long\n" 2018 "// long\n" 2019 "// FIXME: long", 2020 format("// long long long long\n" 2021 "// FIXME: long", 2022 getLLVMStyleWithColumns(20))); 2023 2024 // Don't reflow lines starting with 'XXX'. 2025 EXPECT_EQ("// long long long\n" 2026 "// long\n" 2027 "// XXX: long", 2028 format("// long long long long\n" 2029 "// XXX: long", 2030 getLLVMStyleWithColumns(20))); 2031 2032 // Don't reflow comment pragmas. 2033 EXPECT_EQ("// long long long\n" 2034 "// long\n" 2035 "// IWYU pragma:", 2036 format("// long long long long\n" 2037 "// IWYU pragma:", 2038 getLLVMStyleWithColumns(20))); 2039 EXPECT_EQ("/* long long long\n" 2040 " * long\n" 2041 " * IWYU pragma:\n" 2042 " */", 2043 format("/* long long long long\n" 2044 " * IWYU pragma:\n" 2045 " */", 2046 getLLVMStyleWithColumns(20))); 2047 2048 // Reflow lines that have a non-punctuation character among their first 2 2049 // characters. 2050 EXPECT_EQ("// long long long\n" 2051 "// long 'long'", 2052 format("// long long long long\n" 2053 "// 'long'", 2054 getLLVMStyleWithColumns(20))); 2055 2056 // Don't reflow between separate blocks of comments. 2057 EXPECT_EQ("/* First comment\n" 2058 " * block will */\n" 2059 "/* Snd\n" 2060 " */", 2061 format("/* First comment block\n" 2062 " * will */\n" 2063 "/* Snd\n" 2064 " */", 2065 getLLVMStyleWithColumns(20))); 2066 2067 // Don't reflow lines having different indentation. 2068 EXPECT_EQ("// long long long\n" 2069 "// long\n" 2070 "// long", 2071 format("// long long long long\n" 2072 "// long", 2073 getLLVMStyleWithColumns(20))); 2074 2075 // Don't reflow separate bullets in list 2076 EXPECT_EQ("// - long long long\n" 2077 "// long\n" 2078 "// - long", 2079 format("// - long long long long\n" 2080 "// - long", 2081 getLLVMStyleWithColumns(20))); 2082 EXPECT_EQ("// * long long long\n" 2083 "// long\n" 2084 "// * long", 2085 format("// * long long long long\n" 2086 "// * long", 2087 getLLVMStyleWithColumns(20))); 2088 EXPECT_EQ("// + long long long\n" 2089 "// long\n" 2090 "// + long", 2091 format("// + long long long long\n" 2092 "// + long", 2093 getLLVMStyleWithColumns(20))); 2094 EXPECT_EQ("// 1. long long long\n" 2095 "// long\n" 2096 "// 2. long", 2097 format("// 1. long long long long\n" 2098 "// 2. long", 2099 getLLVMStyleWithColumns(20))); 2100 EXPECT_EQ("// -# long long long\n" 2101 "// long\n" 2102 "// -# long", 2103 format("// -# long long long long\n" 2104 "// -# long", 2105 getLLVMStyleWithColumns(20))); 2106 2107 EXPECT_EQ("// - long long long\n" 2108 "// long long long\n" 2109 "// - long", 2110 format("// - long long long long\n" 2111 "// long long\n" 2112 "// - long", 2113 getLLVMStyleWithColumns(20))); 2114 EXPECT_EQ("// - long long long\n" 2115 "// long long long\n" 2116 "// long\n" 2117 "// - long", 2118 format("// - long long long long\n" 2119 "// long long long\n" 2120 "// - long", 2121 getLLVMStyleWithColumns(20))); 2122 2123 // Large number (>2 digits) are not list items 2124 EXPECT_EQ("// long long long\n" 2125 "// long 1024. long.", 2126 format("// long long long long\n" 2127 "// 1024. long.", 2128 getLLVMStyleWithColumns(20))); 2129 2130 // Do not break before number, to avoid introducing a non-reflowable doxygen 2131 // list item. 2132 EXPECT_EQ("// long long\n" 2133 "// long 10. long.", 2134 format("// long long long 10.\n" 2135 "// long.", 2136 getLLVMStyleWithColumns(20))); 2137 2138 // Don't break or reflow after implicit string literals. 2139 verifyFormat("#include <t> // l l l\n" 2140 " // l", 2141 getLLVMStyleWithColumns(20)); 2142 2143 // Don't break or reflow comments on import lines. 2144 EXPECT_EQ("#include \"t\" /* l l l\n" 2145 " * l */", 2146 format("#include \"t\" /* l l l\n" 2147 " * l */", 2148 getLLVMStyleWithColumns(20))); 2149 2150 // Don't reflow between different trailing comment sections. 2151 EXPECT_EQ("int i; // long long\n" 2152 " // long\n" 2153 "int j; // long long\n" 2154 " // long", 2155 format("int i; // long long long\n" 2156 "int j; // long long long", 2157 getLLVMStyleWithColumns(20))); 2158 2159 // Don't reflow if the first word on the next line is longer than the 2160 // available space at current line. 2161 EXPECT_EQ("int i; // trigger\n" 2162 " // reflow\n" 2163 " // longsec", 2164 format("int i; // trigger reflow\n" 2165 " // longsec", 2166 getLLVMStyleWithColumns(20))); 2167 2168 // Simple case that correctly handles reflow in parameter lists. 2169 EXPECT_EQ("a = f(/* looooooooong\n" 2170 " * long long\n" 2171 " */\n" 2172 " a);", 2173 format("a = f(/* looooooooong long\n* long\n*/ a);", 2174 getLLVMStyleWithColumns(22))); 2175 // Tricky case that has fewer lines if we reflow the comment, ending up with 2176 // fewer lines. 2177 EXPECT_EQ("a = f(/* loooooong\n" 2178 " * long long\n" 2179 " */\n" 2180 " a);", 2181 format("a = f(/* loooooong long\n* long\n*/ a);", 2182 getLLVMStyleWithColumns(22))); 2183 2184 // Keep empty comment lines. 2185 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20))); 2186 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20))); 2187 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20))); 2188 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20))); 2189 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20))); 2190 } 2191 2192 TEST_F(FormatTestComments, ReflowsCommentsPrecise) { 2193 // FIXME: This assumes we do not continue compressing whitespace once we are 2194 // in reflow mode. Consider compressing whitespace. 2195 2196 // Test that we stop reflowing precisely at the column limit. 2197 // After reflowing, "// reflows into foo" does not fit the column limit, 2198 // so we compress the whitespace. 2199 EXPECT_EQ("// some text that\n" 2200 "// reflows into foo", 2201 format("// some text that reflows\n" 2202 "// into foo", 2203 getLLVMStyleWithColumns(20))); 2204 // Given one more column, "// reflows into foo" does fit the limit, so we 2205 // do not compress the whitespace. 2206 EXPECT_EQ("// some text that\n" 2207 "// reflows into foo", 2208 format("// some text that reflows\n" 2209 "// into foo", 2210 getLLVMStyleWithColumns(21))); 2211 2212 // Make sure that we correctly account for the space added in the reflow case 2213 // when making the reflowing decision. 2214 // First, when the next line ends precisely one column over the limit, do not 2215 // reflow. 2216 EXPECT_EQ("// some text that\n" 2217 "// reflows\n" 2218 "// into1234567", 2219 format("// some text that reflows\n" 2220 "// into1234567", 2221 getLLVMStyleWithColumns(21))); 2222 // Secondly, when the next line ends later, but the first word in that line 2223 // is precisely one column over the limit, do not reflow. 2224 EXPECT_EQ("// some text that\n" 2225 "// reflows\n" 2226 "// into1234567 f", 2227 format("// some text that reflows\n" 2228 "// into1234567 f", 2229 getLLVMStyleWithColumns(21))); 2230 } 2231 2232 TEST_F(FormatTestComments, ReflowsCommentsWithExtraWhitespace) { 2233 // Baseline. 2234 EXPECT_EQ("// some text\n" 2235 "// that re flows", 2236 format("// some text that\n" 2237 "// re flows", 2238 getLLVMStyleWithColumns(16))); 2239 EXPECT_EQ("// some text\n" 2240 "// that re flows", 2241 format("// some text that\n" 2242 "// re flows", 2243 getLLVMStyleWithColumns(16))); 2244 EXPECT_EQ("/* some text\n" 2245 " * that re flows\n" 2246 " */", 2247 format("/* some text that\n" 2248 "* re flows\n" 2249 "*/", 2250 getLLVMStyleWithColumns(16))); 2251 // FIXME: We do not reflow if the indent of two subsequent lines differs; 2252 // given that this is different behavior from block comments, do we want 2253 // to keep this? 2254 EXPECT_EQ("// some text\n" 2255 "// that\n" 2256 "// re flows", 2257 format("// some text that\n" 2258 "// re flows", 2259 getLLVMStyleWithColumns(16))); 2260 // Space within parts of a line that fit. 2261 // FIXME: Use the earliest possible split while reflowing to compress the 2262 // whitespace within the line. 2263 EXPECT_EQ("// some text that\n" 2264 "// does re flow\n" 2265 "// more here", 2266 format("// some text that does\n" 2267 "// re flow more here", 2268 getLLVMStyleWithColumns(21))); 2269 } 2270 2271 TEST_F(FormatTestComments, IgnoresIf0Contents) { 2272 EXPECT_EQ("#if 0\n" 2273 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n" 2274 "#endif\n" 2275 "void f() {}", 2276 format("#if 0\n" 2277 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n" 2278 "#endif\n" 2279 "void f( ) { }")); 2280 EXPECT_EQ("#if false\n" 2281 "void f( ) { }\n" 2282 "#endif\n" 2283 "void g() {}", 2284 format("#if false\n" 2285 "void f( ) { }\n" 2286 "#endif\n" 2287 "void g( ) { }")); 2288 EXPECT_EQ("enum E {\n" 2289 " One,\n" 2290 " Two,\n" 2291 "#if 0\n" 2292 "Three,\n" 2293 " Four,\n" 2294 "#endif\n" 2295 " Five\n" 2296 "};", 2297 format("enum E {\n" 2298 " One,Two,\n" 2299 "#if 0\n" 2300 "Three,\n" 2301 " Four,\n" 2302 "#endif\n" 2303 " Five};")); 2304 EXPECT_EQ("enum F {\n" 2305 " One,\n" 2306 "#if 1\n" 2307 " Two,\n" 2308 "#if 0\n" 2309 "Three,\n" 2310 " Four,\n" 2311 "#endif\n" 2312 " Five\n" 2313 "#endif\n" 2314 "};", 2315 format("enum F {\n" 2316 "One,\n" 2317 "#if 1\n" 2318 "Two,\n" 2319 "#if 0\n" 2320 "Three,\n" 2321 " Four,\n" 2322 "#endif\n" 2323 "Five\n" 2324 "#endif\n" 2325 "};")); 2326 EXPECT_EQ("enum G {\n" 2327 " One,\n" 2328 "#if 0\n" 2329 "Two,\n" 2330 "#else\n" 2331 " Three,\n" 2332 "#endif\n" 2333 " Four\n" 2334 "};", 2335 format("enum G {\n" 2336 "One,\n" 2337 "#if 0\n" 2338 "Two,\n" 2339 "#else\n" 2340 "Three,\n" 2341 "#endif\n" 2342 "Four\n" 2343 "};")); 2344 EXPECT_EQ("enum H {\n" 2345 " One,\n" 2346 "#if 0\n" 2347 "#ifdef Q\n" 2348 "Two,\n" 2349 "#else\n" 2350 "Three,\n" 2351 "#endif\n" 2352 "#endif\n" 2353 " Four\n" 2354 "};", 2355 format("enum H {\n" 2356 "One,\n" 2357 "#if 0\n" 2358 "#ifdef Q\n" 2359 "Two,\n" 2360 "#else\n" 2361 "Three,\n" 2362 "#endif\n" 2363 "#endif\n" 2364 "Four\n" 2365 "};")); 2366 EXPECT_EQ("enum I {\n" 2367 " One,\n" 2368 "#if /* test */ 0 || 1\n" 2369 "Two,\n" 2370 "Three,\n" 2371 "#endif\n" 2372 " Four\n" 2373 "};", 2374 format("enum I {\n" 2375 "One,\n" 2376 "#if /* test */ 0 || 1\n" 2377 "Two,\n" 2378 "Three,\n" 2379 "#endif\n" 2380 "Four\n" 2381 "};")); 2382 EXPECT_EQ("enum J {\n" 2383 " One,\n" 2384 "#if 0\n" 2385 "#if 0\n" 2386 "Two,\n" 2387 "#else\n" 2388 "Three,\n" 2389 "#endif\n" 2390 "Four,\n" 2391 "#endif\n" 2392 " Five\n" 2393 "};", 2394 format("enum J {\n" 2395 "One,\n" 2396 "#if 0\n" 2397 "#if 0\n" 2398 "Two,\n" 2399 "#else\n" 2400 "Three,\n" 2401 "#endif\n" 2402 "Four,\n" 2403 "#endif\n" 2404 "Five\n" 2405 "};")); 2406 2407 // Ignore stuff in SWIG-blocks. 2408 EXPECT_EQ("#ifdef SWIG\n" 2409 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n" 2410 "#endif\n" 2411 "void f() {}", 2412 format("#ifdef SWIG\n" 2413 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n" 2414 "#endif\n" 2415 "void f( ) { }")); 2416 EXPECT_EQ("#ifndef SWIG\n" 2417 "void f() {}\n" 2418 "#endif", 2419 format("#ifndef SWIG\n" 2420 "void f( ) { }\n" 2421 "#endif")); 2422 } 2423 2424 TEST_F(FormatTestComments, DontCrashOnBlockComments) { 2425 EXPECT_EQ( 2426 "int xxxxxxxxx; /* " 2427 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n" 2428 "zzzzzz\n" 2429 "0*/", 2430 format("int xxxxxxxxx; /* " 2431 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n" 2432 "0*/")); 2433 } 2434 2435 TEST_F(FormatTestComments, BlockCommentsInControlLoops) { 2436 verifyFormat("if (0) /* a comment in a strange place */ {\n" 2437 " f();\n" 2438 "}"); 2439 verifyFormat("if (0) /* a comment in a strange place */ {\n" 2440 " f();\n" 2441 "} /* another comment */ else /* comment #3 */ {\n" 2442 " g();\n" 2443 "}"); 2444 verifyFormat("while (0) /* a comment in a strange place */ {\n" 2445 " f();\n" 2446 "}"); 2447 verifyFormat("for (;;) /* a comment in a strange place */ {\n" 2448 " f();\n" 2449 "}"); 2450 verifyFormat("do /* a comment in a strange place */ {\n" 2451 " f();\n" 2452 "} /* another comment */ while (0);"); 2453 } 2454 2455 TEST_F(FormatTestComments, BlockComments) { 2456 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */", 2457 format("/* *//* */ /* */\n/* *//* */ /* */")); 2458 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;")); 2459 EXPECT_EQ("#define A /*123*/ \\\n" 2460 " b\n" 2461 "/* */\n" 2462 "someCall(\n" 2463 " parameter);", 2464 format("#define A /*123*/ b\n" 2465 "/* */\n" 2466 "someCall(parameter);", 2467 getLLVMStyleWithColumns(15))); 2468 2469 EXPECT_EQ("#define A\n" 2470 "/* */ someCall(\n" 2471 " parameter);", 2472 format("#define A\n" 2473 "/* */someCall(parameter);", 2474 getLLVMStyleWithColumns(15))); 2475 verifyNoChange("/*\n**\n*/"); 2476 EXPECT_EQ("/*\n" 2477 " *\n" 2478 " * aaaaaa\n" 2479 " * aaaaaa\n" 2480 " */", 2481 format("/*\n" 2482 "*\n" 2483 " * aaaaaa aaaaaa\n" 2484 "*/", 2485 getLLVMStyleWithColumns(10))); 2486 EXPECT_EQ("/*\n" 2487 "**\n" 2488 "* aaaaaa\n" 2489 "*aaaaaa\n" 2490 "*/", 2491 format("/*\n" 2492 "**\n" 2493 "* aaaaaa aaaaaa\n" 2494 "*/", 2495 getLLVMStyleWithColumns(10))); 2496 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 2497 " /* line 1\n" 2498 " bbbbbbbbbbbb */\n" 2499 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 2500 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 2501 " /* line 1\n" 2502 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 2503 getLLVMStyleWithColumns(50))); 2504 2505 FormatStyle NoBinPacking = getLLVMStyle(); 2506 NoBinPacking.BinPackParameters = FormatStyle::BPPS_OnePerLine; 2507 EXPECT_EQ("someFunction(1, /* comment 1 */\n" 2508 " 2, /* comment 2 */\n" 2509 " 3, /* comment 3 */\n" 2510 " aaaa,\n" 2511 " bbbb);", 2512 format("someFunction (1, /* comment 1 */\n" 2513 " 2, /* comment 2 */ \n" 2514 " 3, /* comment 3 */\n" 2515 "aaaa, bbbb );", 2516 NoBinPacking)); 2517 verifyFormat( 2518 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 2519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 2520 EXPECT_EQ( 2521 "bool aaaaaaaaaaaaa = /* trailing comment */\n" 2522 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 2523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;", 2524 format( 2525 "bool aaaaaaaaaaaaa = /* trailing comment */\n" 2526 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 2527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;")); 2528 EXPECT_EQ( 2529 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n" 2530 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n" 2531 "int cccccccccccccccccccccccccccccc; /* comment */", 2532 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n" 2533 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n" 2534 "int cccccccccccccccccccccccccccccc; /* comment */")); 2535 2536 verifyFormat("void f(int * /* unused */) {}"); 2537 2538 EXPECT_EQ("/*\n" 2539 " **\n" 2540 " */", 2541 format("/*\n" 2542 " **\n" 2543 " */")); 2544 EXPECT_EQ("/*\n" 2545 " *q\n" 2546 " */", 2547 format("/*\n" 2548 " *q\n" 2549 " */")); 2550 EXPECT_EQ("/*\n" 2551 " * q\n" 2552 " */", 2553 format("/*\n" 2554 " * q\n" 2555 " */")); 2556 EXPECT_EQ("/*\n" 2557 " **/", 2558 format("/*\n" 2559 " **/")); 2560 EXPECT_EQ("/*\n" 2561 " ***/", 2562 format("/*\n" 2563 " ***/")); 2564 } 2565 2566 TEST_F(FormatTestComments, BlockCommentsInMacros) { 2567 EXPECT_EQ("#define A \\\n" 2568 " { \\\n" 2569 " /* one line */ \\\n" 2570 " someCall();", 2571 format("#define A { \\\n" 2572 " /* one line */ \\\n" 2573 " someCall();", 2574 getLLVMStyleWithColumns(20))); 2575 EXPECT_EQ("#define A \\\n" 2576 " { \\\n" 2577 " /* previous */ \\\n" 2578 " /* one line */ \\\n" 2579 " someCall();", 2580 format("#define A { \\\n" 2581 " /* previous */ \\\n" 2582 " /* one line */ \\\n" 2583 " someCall();", 2584 getLLVMStyleWithColumns(20))); 2585 } 2586 2587 TEST_F(FormatTestComments, BlockCommentsAtEndOfLine) { 2588 EXPECT_EQ("a = {\n" 2589 " 1111 /* */\n" 2590 "};", 2591 format("a = {1111 /* */\n" 2592 "};", 2593 getLLVMStyleWithColumns(15))); 2594 EXPECT_EQ("a = {\n" 2595 " 1111 /* */\n" 2596 "};", 2597 format("a = {1111 /* */\n" 2598 "};", 2599 getLLVMStyleWithColumns(15))); 2600 EXPECT_EQ("a = {\n" 2601 " 1111 /* a\n" 2602 " */\n" 2603 "};", 2604 format("a = {1111 /* a */\n" 2605 "};", 2606 getLLVMStyleWithColumns(15))); 2607 } 2608 2609 TEST_F(FormatTestComments, BreaksAfterMultilineBlockCommentsInParamLists) { 2610 EXPECT_EQ("a = f(/* long\n" 2611 " long */\n" 2612 " a);", 2613 format("a = f(/* long long */ a);", getLLVMStyleWithColumns(16))); 2614 EXPECT_EQ("a = f(\n" 2615 " /* long\n" 2616 " long */\n" 2617 " a);", 2618 format("a = f(/* long long */ a);", getLLVMStyleWithColumns(15))); 2619 2620 EXPECT_EQ("a = f(/* long\n" 2621 " long\n" 2622 " */\n" 2623 " a);", 2624 format("a = f(/* long\n" 2625 " long\n" 2626 " */a);", 2627 getLLVMStyleWithColumns(16))); 2628 2629 EXPECT_EQ("a = f(/* long\n" 2630 " long\n" 2631 " */\n" 2632 " a);", 2633 format("a = f(/* long\n" 2634 " long\n" 2635 " */ a);", 2636 getLLVMStyleWithColumns(16))); 2637 2638 EXPECT_EQ("a = f(/* long\n" 2639 " long\n" 2640 " */\n" 2641 " (1 + 1));", 2642 format("a = f(/* long\n" 2643 " long\n" 2644 " */ (1 + 1));", 2645 getLLVMStyleWithColumns(16))); 2646 2647 EXPECT_EQ( 2648 "a = f(a,\n" 2649 " /* long\n" 2650 " long */\n" 2651 " b);", 2652 format("a = f(a, /* long long */ b);", getLLVMStyleWithColumns(16))); 2653 2654 EXPECT_EQ( 2655 "a = f(\n" 2656 " a,\n" 2657 " /* long\n" 2658 " long */\n" 2659 " b);", 2660 format("a = f(a, /* long long */ b);", getLLVMStyleWithColumns(15))); 2661 2662 EXPECT_EQ("a = f(a,\n" 2663 " /* long\n" 2664 " long */\n" 2665 " (1 + 1));", 2666 format("a = f(a, /* long long */ (1 + 1));", 2667 getLLVMStyleWithColumns(16))); 2668 EXPECT_EQ("a = f(\n" 2669 " a,\n" 2670 " /* long\n" 2671 " long */\n" 2672 " (1 + 1));", 2673 format("a = f(a, /* long long */ (1 + 1));", 2674 getLLVMStyleWithColumns(15))); 2675 } 2676 2677 TEST_F(FormatTestComments, IndentLineCommentsInStartOfBlockAtEndOfFile) { 2678 verifyFormat("{\n" 2679 " // a\n" 2680 " // b"); 2681 } 2682 2683 TEST_F(FormatTestComments, AlignTrailingComments) { 2684 EXPECT_EQ("#define MACRO(V) \\\n" 2685 " V(Rt2) /* one more char */ \\\n" 2686 " V(Rs) /* than here */ \\\n" 2687 "/* comment 3 */\n", 2688 format("#define MACRO(V)\\\n" 2689 "V(Rt2) /* one more char */ \\\n" 2690 "V(Rs) /* than here */ \\\n" 2691 "/* comment 3 */\n", 2692 getLLVMStyleWithColumns(40))); 2693 EXPECT_EQ("int i = f(abc, // line 1\n" 2694 " d, // line 2\n" 2695 " // line 3\n" 2696 " b);", 2697 format("int i = f(abc, // line 1\n" 2698 " d, // line 2\n" 2699 " // line 3\n" 2700 " b);", 2701 getLLVMStyleWithColumns(40))); 2702 2703 // Align newly broken trailing comments. 2704 EXPECT_EQ("int ab; // line\n" 2705 "int a; // long\n" 2706 " // long", 2707 format("int ab; // line\n" 2708 "int a; // long long", 2709 getLLVMStyleWithColumns(15))); 2710 EXPECT_EQ("int ab; // line\n" 2711 "int a; // long\n" 2712 " // long\n" 2713 " // long", 2714 format("int ab; // line\n" 2715 "int a; // long long\n" 2716 " // long", 2717 getLLVMStyleWithColumns(15))); 2718 EXPECT_EQ("int ab; // line\n" 2719 "int a; // long\n" 2720 " // long\n" 2721 "pt c; // long", 2722 format("int ab; // line\n" 2723 "int a; // long long\n" 2724 "pt c; // long", 2725 getLLVMStyleWithColumns(15))); 2726 EXPECT_EQ("int ab; // line\n" 2727 "int a; // long\n" 2728 " // long\n" 2729 "\n" 2730 "// long", 2731 format("int ab; // line\n" 2732 "int a; // long long\n" 2733 "\n" 2734 "// long", 2735 getLLVMStyleWithColumns(15))); 2736 2737 // Don't align newly broken trailing comments if that would put them over the 2738 // column limit. 2739 EXPECT_EQ("int i, j; // line 1\n" 2740 "int k; // line longg\n" 2741 " // long", 2742 format("int i, j; // line 1\n" 2743 "int k; // line longg long", 2744 getLLVMStyleWithColumns(20))); 2745 2746 // Always align if ColumnLimit = 0 2747 EXPECT_EQ("int i, j; // line 1\n" 2748 "int k; // line longg long", 2749 format("int i, j; // line 1\n" 2750 "int k; // line longg long", 2751 getLLVMStyleWithColumns(0))); 2752 2753 // Align comment line sections aligned with the next token with the next 2754 // token. 2755 EXPECT_EQ("class A {\n" 2756 "public: // public comment\n" 2757 " // comment about a\n" 2758 " int a;\n" 2759 "};", 2760 format("class A {\n" 2761 "public: // public comment\n" 2762 " // comment about a\n" 2763 " int a;\n" 2764 "};", 2765 getLLVMStyleWithColumns(40))); 2766 EXPECT_EQ("class A {\n" 2767 "public: // public comment 1\n" 2768 " // public comment 2\n" 2769 " // comment 1 about a\n" 2770 " // comment 2 about a\n" 2771 " int a;\n" 2772 "};", 2773 format("class A {\n" 2774 "public: // public comment 1\n" 2775 " // public comment 2\n" 2776 " // comment 1 about a\n" 2777 " // comment 2 about a\n" 2778 " int a;\n" 2779 "};", 2780 getLLVMStyleWithColumns(40))); 2781 EXPECT_EQ("int f(int n) { // comment line 1 on f\n" 2782 " // comment line 2 on f\n" 2783 " // comment line 1 before return\n" 2784 " // comment line 2 before return\n" 2785 " return n; // comment line 1 on return\n" 2786 " // comment line 2 on return\n" 2787 " // comment line 1 after return\n" 2788 "}", 2789 format("int f(int n) { // comment line 1 on f\n" 2790 " // comment line 2 on f\n" 2791 " // comment line 1 before return\n" 2792 " // comment line 2 before return\n" 2793 " return n; // comment line 1 on return\n" 2794 " // comment line 2 on return\n" 2795 " // comment line 1 after return\n" 2796 "}", 2797 getLLVMStyleWithColumns(40))); 2798 EXPECT_EQ("int f(int n) {\n" 2799 " switch (n) { // comment line 1 on switch\n" 2800 " // comment line 2 on switch\n" 2801 " // comment line 1 before case 1\n" 2802 " // comment line 2 before case 1\n" 2803 " case 1: // comment line 1 on case 1\n" 2804 " // comment line 2 on case 1\n" 2805 " // comment line 1 before return 1\n" 2806 " // comment line 2 before return 1\n" 2807 " return 1; // comment line 1 on return 1\n" 2808 " // comment line 2 on return 1\n" 2809 " // comment line 1 before default\n" 2810 " // comment line 2 before default\n" 2811 " default: // comment line 1 on default\n" 2812 " // comment line 2 on default\n" 2813 " // comment line 1 before return 2\n" 2814 " return 2 * f(n - 1); // comment line 1 on return 2\n" 2815 " // comment line 2 on return 2\n" 2816 " // comment line 1 after return\n" 2817 " // comment line 2 after return\n" 2818 " }\n" 2819 "}", 2820 format("int f(int n) {\n" 2821 " switch (n) { // comment line 1 on switch\n" 2822 " // comment line 2 on switch\n" 2823 " // comment line 1 before case 1\n" 2824 " // comment line 2 before case 1\n" 2825 " case 1: // comment line 1 on case 1\n" 2826 " // comment line 2 on case 1\n" 2827 " // comment line 1 before return 1\n" 2828 " // comment line 2 before return 1\n" 2829 " return 1; // comment line 1 on return 1\n" 2830 " // comment line 2 on return 1\n" 2831 " // comment line 1 before default\n" 2832 " // comment line 2 before default\n" 2833 " default: // comment line 1 on default\n" 2834 " // comment line 2 on default\n" 2835 " // comment line 1 before return 2\n" 2836 " return 2 * f(n - 1); // comment line 1 on return 2\n" 2837 " // comment line 2 on return 2\n" 2838 " // comment line 1 after return\n" 2839 " // comment line 2 after return\n" 2840 " }\n" 2841 "}", 2842 getLLVMStyleWithColumns(80))); 2843 2844 // If all the lines in a sequence of line comments are aligned with the next 2845 // token, the first line belongs to the previous token and the other lines 2846 // belong to the next token. 2847 EXPECT_EQ("int a; // line about a\n" 2848 "long b;", 2849 format("int a; // line about a\n" 2850 " long b;", 2851 getLLVMStyleWithColumns(80))); 2852 EXPECT_EQ("int a; // line about a\n" 2853 "// line about b\n" 2854 "long b;", 2855 format("int a; // line about a\n" 2856 " // line about b\n" 2857 " long b;", 2858 getLLVMStyleWithColumns(80))); 2859 EXPECT_EQ("int a; // line about a\n" 2860 "// line 1 about b\n" 2861 "// line 2 about b\n" 2862 "long b;", 2863 format("int a; // line about a\n" 2864 " // line 1 about b\n" 2865 " // line 2 about b\n" 2866 " long b;", 2867 getLLVMStyleWithColumns(80))); 2868 2869 // Checks an edge case in preprocessor handling. 2870 // These comments should *not* be aligned 2871 EXPECT_EQ( 2872 "#if FOO\n" 2873 "#else\n" 2874 "long a; // Line about a\n" 2875 "#endif\n" 2876 "#if BAR\n" 2877 "#else\n" 2878 "long b_long_name; // Line about b\n" 2879 "#endif", 2880 format("#if FOO\n" 2881 "#else\n" 2882 "long a; // Line about a\n" // Previous (bad) behavior 2883 "#endif\n" 2884 "#if BAR\n" 2885 "#else\n" 2886 "long b_long_name; // Line about b\n" 2887 "#endif", 2888 getLLVMStyleWithColumns(80))); 2889 2890 // bug 47589 2891 EXPECT_EQ( 2892 "namespace m {\n\n" 2893 "#define FOO_GLOBAL 0 // Global scope.\n" 2894 "#define FOO_LINKLOCAL 1 // Link-local scope.\n" 2895 "#define FOO_SITELOCAL 2 // Site-local scope (deprecated).\n" 2896 "#define FOO_UNIQUELOCAL 3 // Unique local\n" 2897 "#define FOO_NODELOCAL 4 // Loopback\n\n" 2898 "} // namespace m", 2899 format("namespace m {\n\n" 2900 "#define FOO_GLOBAL 0 // Global scope.\n" 2901 "#define FOO_LINKLOCAL 1 // Link-local scope.\n" 2902 "#define FOO_SITELOCAL 2 // Site-local scope (deprecated).\n" 2903 "#define FOO_UNIQUELOCAL 3 // Unique local\n" 2904 "#define FOO_NODELOCAL 4 // Loopback\n\n" 2905 "} // namespace m", 2906 getLLVMStyleWithColumns(80))); 2907 2908 // https://llvm.org/PR53441 2909 verifyFormat("/* */ //\n" 2910 "int a; //"); 2911 verifyFormat("/**/ //\n" 2912 "int a; //"); 2913 } 2914 2915 TEST_F(FormatTestComments, AlignTrailingCommentsAcrossEmptyLines) { 2916 FormatStyle Style = getLLVMStyle(); 2917 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Always; 2918 Style.AlignTrailingComments.OverEmptyLines = 1; 2919 verifyFormat("#include \"a.h\" // simple\n" 2920 "\n" 2921 "#include \"aa.h\" // example case", 2922 Style); 2923 2924 verifyFormat("#include \"a.h\" // align across\n" 2925 "\n" 2926 "#include \"aa.h\" // two empty lines\n" 2927 "\n" 2928 "#include \"aaa.h\" // in a row", 2929 Style); 2930 2931 verifyFormat("#include \"a.h\" // align\n" 2932 "#include \"aa.h\" // comment\n" 2933 "#include \"aaa.h\" // blocks\n" 2934 "\n" 2935 "#include \"aaaa.h\" // across\n" 2936 "#include \"aaaaa.h\" // one\n" 2937 "#include \"aaaaaa.h\" // empty line", 2938 Style); 2939 2940 verifyFormat("#include \"a.h\" // align trailing comments\n" 2941 "#include \"a.h\"\n" 2942 "#include \"aa.h\" // across a line without comment", 2943 Style); 2944 2945 verifyFormat("#include \"a.h\" // align across\n" 2946 "#include \"a.h\"\n" 2947 "#include \"aa.h\" // two lines without comment\n" 2948 "#include \"a.h\"\n" 2949 "#include \"aaa.h\" // in a row", 2950 Style); 2951 2952 verifyFormat("#include \"a.h\" // align\n" 2953 "#include \"aa.h\" // comment\n" 2954 "#include \"aaa.h\" // blocks\n" 2955 "#include \"a.h\"\n" 2956 "#include \"aaaa.h\" // across\n" 2957 "#include \"aaaaa.h\" // a line without\n" 2958 "#include \"aaaaaa.h\" // comment", 2959 Style); 2960 2961 // Start of testing OverEmptyLines 2962 Style.MaxEmptyLinesToKeep = 3; 2963 Style.AlignTrailingComments.OverEmptyLines = 2; 2964 // Cannot use verifyFormat here 2965 // test::messUp removes all new lines which changes the logic 2966 EXPECT_EQ("#include \"a.h\" // comment\n" 2967 "\n" 2968 "\n" 2969 "\n" 2970 "#include \"ab.h\" // comment\n" 2971 "\n" 2972 "\n" 2973 "#include \"abcdefg.h\" // comment", 2974 format("#include \"a.h\" // comment\n" 2975 "\n" 2976 "\n" 2977 "\n" 2978 "#include \"ab.h\" // comment\n" 2979 "\n" 2980 "\n" 2981 "#include \"abcdefg.h\" // comment", 2982 Style)); 2983 2984 Style.MaxEmptyLinesToKeep = 1; 2985 Style.AlignTrailingComments.OverEmptyLines = 1; 2986 // End of testing OverEmptyLines 2987 2988 Style.ColumnLimit = 15; 2989 EXPECT_EQ("int ab; // line\n" 2990 "int a; // long\n" 2991 " // long\n" 2992 "\n" 2993 " // long", 2994 format("int ab; // line\n" 2995 "int a; // long long\n" 2996 "\n" 2997 "// long", 2998 Style)); 2999 3000 Style.ColumnLimit = 15; 3001 EXPECT_EQ("int ab; // line\n" 3002 "\n" 3003 "int a; // long\n" 3004 " // long", 3005 format("int ab; // line\n" 3006 "\n" 3007 "int a; // long long", 3008 Style)); 3009 3010 Style.ColumnLimit = 30; 3011 EXPECT_EQ("int foo = 12345; // comment\n" 3012 "int bar =\n" 3013 " 1234; // This is a very\n" 3014 " // long comment\n" 3015 " // which is wrapped\n" 3016 " // arround.\n" 3017 "\n" 3018 "int x = 2; // Is this still\n" 3019 " // aligned?", 3020 format("int foo = 12345; // comment\n" 3021 "int bar = 1234; // This is a very long comment\n" 3022 " // which is wrapped arround.\n" 3023 "\n" 3024 "int x = 2; // Is this still aligned?", 3025 Style)); 3026 3027 Style.ColumnLimit = 35; 3028 EXPECT_EQ("int foo = 12345; // comment\n" 3029 "int bar =\n" 3030 " 1234; // This is a very long\n" 3031 " // comment which is\n" 3032 " // wrapped arround.\n" 3033 "\n" 3034 "int x =\n" 3035 " 2; // Is this still aligned?", 3036 format("int foo = 12345; // comment\n" 3037 "int bar = 1234; // This is a very long comment\n" 3038 " // which is wrapped arround.\n" 3039 "\n" 3040 "int x = 2; // Is this still aligned?", 3041 Style)); 3042 3043 Style.ColumnLimit = 40; 3044 EXPECT_EQ("int foo = 12345; // comment\n" 3045 "int bar =\n" 3046 " 1234; // This is a very long comment\n" 3047 " // which is wrapped arround.\n" 3048 "\n" 3049 "int x = 2; // Is this still aligned?", 3050 format("int foo = 12345; // comment\n" 3051 "int bar = 1234; // This is a very long comment\n" 3052 " // which is wrapped arround.\n" 3053 "\n" 3054 "int x = 2; // Is this still aligned?", 3055 Style)); 3056 3057 Style.ColumnLimit = 45; 3058 EXPECT_EQ("int foo = 12345; // comment\n" 3059 "int bar =\n" 3060 " 1234; // This is a very long comment\n" 3061 " // which is wrapped arround.\n" 3062 "\n" 3063 "int x = 2; // Is this still aligned?", 3064 format("int foo = 12345; // comment\n" 3065 "int bar = 1234; // This is a very long comment\n" 3066 " // which is wrapped arround.\n" 3067 "\n" 3068 "int x = 2; // Is this still aligned?", 3069 Style)); 3070 3071 Style.ColumnLimit = 80; 3072 EXPECT_EQ("int a; // line about a\n" 3073 "\n" 3074 "// line about b\n" 3075 "long b;", 3076 format("int a; // line about a\n" 3077 "\n" 3078 " // line about b\n" 3079 " long b;", 3080 Style)); 3081 3082 Style.ColumnLimit = 80; 3083 EXPECT_EQ("int a; // line about a\n" 3084 "\n" 3085 "// line 1 about b\n" 3086 "// line 2 about b\n" 3087 "long b;", 3088 format("int a; // line about a\n" 3089 "\n" 3090 " // line 1 about b\n" 3091 " // line 2 about b\n" 3092 " long b;", 3093 Style)); 3094 } 3095 3096 TEST_F(FormatTestComments, AlignTrailingCommentsLeave) { 3097 FormatStyle Style = getLLVMStyle(); 3098 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Leave; 3099 3100 EXPECT_EQ("int a;// do not touch\n" 3101 "int b; // any comments\n" 3102 "int c; // comment\n" 3103 "int d; // comment", 3104 format("int a;// do not touch\n" 3105 "int b; // any comments\n" 3106 "int c; // comment\n" 3107 "int d; // comment", 3108 Style)); 3109 3110 EXPECT_EQ("int a; // do not touch\n" 3111 "int b; // any comments\n" 3112 "int c; // comment\n" 3113 "int d;// comment", 3114 format("int a; // do not touch\n" 3115 "int b; // any comments\n" 3116 "int c; // comment\n" 3117 "int d;// comment", 3118 Style)); 3119 3120 EXPECT_EQ("// do not touch\n" 3121 "int a; // any comments\n" 3122 "\n" 3123 " // comment\n" 3124 "// comment\n" 3125 "\n" 3126 "// comment", 3127 format("// do not touch\n" 3128 "int a; // any comments\n" 3129 "\n" 3130 " // comment\n" 3131 "// comment\n" 3132 "\n" 3133 "// comment", 3134 Style)); 3135 3136 EXPECT_EQ("// do not touch\n" 3137 "int a; // any comments\n" 3138 "\n" 3139 " // comment\n" 3140 "// comment\n" 3141 "\n" 3142 "// comment", 3143 format("// do not touch\n" 3144 "int a; // any comments\n" 3145 "\n" 3146 "\n" 3147 " // comment\n" 3148 "// comment\n" 3149 "\n" 3150 "\n" 3151 "// comment", 3152 Style)); 3153 3154 verifyFormat("namespace ns {\n" 3155 "int i;\n" 3156 "int j;\n" 3157 "} // namespace ns", 3158 "namespace ns {\n" 3159 "int i;\n" 3160 "int j;\n" 3161 "}", 3162 Style); 3163 3164 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3165 verifyNoChange("#define FOO \\\n" 3166 " /* foo(); */ \\\n" 3167 " bar();", 3168 Style); 3169 3170 // Allow to keep 2 empty lines 3171 Style.MaxEmptyLinesToKeep = 2; 3172 EXPECT_EQ("// do not touch\n" 3173 "int a; // any comments\n" 3174 "\n" 3175 "\n" 3176 " // comment\n" 3177 "// comment\n" 3178 "\n" 3179 "// comment", 3180 format("// do not touch\n" 3181 "int a; // any comments\n" 3182 "\n" 3183 "\n" 3184 " // comment\n" 3185 "// comment\n" 3186 "\n" 3187 "// comment", 3188 Style)); 3189 Style.MaxEmptyLinesToKeep = 1; 3190 3191 // Just format comments normally when leaving exceeds the column limit 3192 Style.ColumnLimit = 35; 3193 EXPECT_EQ("int foo = 12345; // comment\n" 3194 "int bar =\n" 3195 " 1234; // This is a very long\n" 3196 " // comment which is\n" 3197 " // wrapped arround.", 3198 format("int foo = 12345; // comment\n" 3199 "int bar = 1234; // This is a very long comment\n" 3200 " // which is wrapped arround.", 3201 Style)); 3202 3203 Style = getLLVMStyle(); 3204 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Leave; 3205 Style.TabWidth = 2; 3206 Style.UseTab = FormatStyle::UT_ForIndentation; 3207 verifyNoChange("{\n" 3208 "\t// f\n" 3209 "\tf();\n" 3210 "\n" 3211 "\t// g\n" 3212 "\tg();\n" 3213 "\t{\n" 3214 "\t\t// h(); // h\n" 3215 "\t\tfoo(); // foo\n" 3216 "\t}\n" 3217 "}", 3218 Style); 3219 } 3220 3221 TEST_F(FormatTestComments, DontAlignNamespaceComments) { 3222 FormatStyle Style = getLLVMStyle(); 3223 Style.NamespaceIndentation = FormatStyle::NI_All; 3224 Style.NamespaceMacros.push_back("TESTSUITE"); 3225 Style.ShortNamespaceLines = 0; 3226 3227 StringRef Input = "namespace A {\n" 3228 " TESTSUITE(B) {\n" 3229 " namespace C {\n" 3230 " namespace D { //\n" 3231 " } // namespace D\n" 3232 " std::string Foo = Bar; // Comment\n" 3233 " std::string BazString = Baz; // C2\n" 3234 " } // namespace C\n" 3235 " }\n" 3236 "} // NaMeSpAcE A"; 3237 3238 EXPECT_TRUE(Style.FixNamespaceComments); 3239 EXPECT_EQ(Style.AlignTrailingComments.Kind, FormatStyle::TCAS_Always); 3240 verifyFormat("namespace A {\n" 3241 " TESTSUITE(B) {\n" 3242 " namespace C {\n" 3243 " namespace D { //\n" 3244 " } // namespace D\n" 3245 " std::string Foo = Bar; // Comment\n" 3246 " std::string BazString = Baz; // C2\n" 3247 " } // namespace C\n" 3248 " } // TESTSUITE(B)\n" 3249 "} // NaMeSpAcE A", 3250 Input, Style); 3251 3252 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Never; 3253 verifyFormat("namespace A {\n" 3254 " TESTSUITE(B) {\n" 3255 " namespace C {\n" 3256 " namespace D { //\n" 3257 " } // namespace D\n" 3258 " std::string Foo = Bar; // Comment\n" 3259 " std::string BazString = Baz; // C2\n" 3260 " } // namespace C\n" 3261 " } // TESTSUITE(B)\n" 3262 "} // NaMeSpAcE A", 3263 Input, Style); 3264 3265 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Leave; 3266 verifyFormat("namespace A {\n" 3267 " TESTSUITE(B) {\n" 3268 " namespace C {\n" 3269 " namespace D { //\n" 3270 " } // namespace D\n" 3271 " std::string Foo = Bar; // Comment\n" 3272 " std::string BazString = Baz; // C2\n" 3273 " } // namespace C\n" 3274 " } // TESTSUITE(B)\n" 3275 "} // NaMeSpAcE A", 3276 Input, Style); 3277 3278 Style.FixNamespaceComments = false; 3279 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Always; 3280 verifyFormat("namespace A {\n" 3281 " TESTSUITE(B) {\n" 3282 " namespace C {\n" 3283 " namespace D { //\n" 3284 " } // namespace D\n" 3285 " std::string Foo = Bar; // Comment\n" 3286 " std::string BazString = Baz; // C2\n" 3287 " } // namespace C\n" 3288 " }\n" 3289 "} // NaMeSpAcE A", 3290 Input, Style); 3291 3292 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Never; 3293 verifyFormat("namespace A {\n" 3294 " TESTSUITE(B) {\n" 3295 " namespace C {\n" 3296 " namespace D { //\n" 3297 " } // namespace D\n" 3298 " std::string Foo = Bar; // Comment\n" 3299 " std::string BazString = Baz; // C2\n" 3300 " } // namespace C\n" 3301 " }\n" 3302 "} // NaMeSpAcE A", 3303 Input, Style); 3304 3305 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Leave; 3306 verifyFormat("namespace A {\n" 3307 " TESTSUITE(B) {\n" 3308 " namespace C {\n" 3309 " namespace D { //\n" 3310 " } // namespace D\n" 3311 " std::string Foo = Bar; // Comment\n" 3312 " std::string BazString = Baz; // C2\n" 3313 " } // namespace C\n" 3314 " }\n" 3315 "} // NaMeSpAcE A", 3316 Input, Style); 3317 3318 Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Always; 3319 Style.FixNamespaceComments = true; 3320 Input = "namespace A {\n" 3321 " int Foo;\n" 3322 " int Bar;\n" 3323 "}\n" 3324 "// Comment"; 3325 3326 verifyFormat("namespace A {\n" 3327 " int Foo;\n" 3328 " int Bar;\n" 3329 "} // namespace A\n" 3330 "// Comment", 3331 Input, Style); 3332 3333 Style.FixNamespaceComments = false; 3334 verifyFormat(Input, Style); 3335 } 3336 3337 TEST_F(FormatTestComments, DontAlignOverScope) { 3338 verifyFormat("if (foo) {\n" 3339 " int aLongVariable; // with comment\n" 3340 " int f; // aligned\n" 3341 "} // not aligned\n" 3342 "int bar; // new align\n" 3343 "int foobar; // group"); 3344 3345 verifyFormat("if (foo) {\n" 3346 " // something\n" 3347 "} else {\n" 3348 " int aLongVariable; // with comment\n" 3349 " int f; // aligned\n" 3350 "} // not aligned\n" 3351 "int bar; // new align\n" 3352 "int foobar; // group"); 3353 3354 verifyFormat("if (foo) {\n" 3355 " // something\n" 3356 "} else if (foo) {\n" 3357 " int aLongVariable; // with comment\n" 3358 " int f; // aligned\n" 3359 "} // not aligned\n" 3360 "int bar; // new align\n" 3361 "int foobar; // group"); 3362 3363 verifyFormat("while (foo) {\n" 3364 " int aLongVariable; // with comment\n" 3365 " int f; // aligned\n" 3366 "} // not aligned\n" 3367 "int bar; // new align\n" 3368 "int foobar; // group"); 3369 3370 verifyFormat("for (;;) {\n" 3371 " int aLongVariable; // with comment\n" 3372 " int f; // aligned\n" 3373 "} // not aligned\n" 3374 "int bar; // new align\n" 3375 "int foobar; // group"); 3376 3377 verifyFormat("do {\n" 3378 " int aLongVariable; // with comment\n" 3379 " int f; // aligned\n" 3380 "} while (foo); // not aligned\n" 3381 "int bar; // new align\n" 3382 "int foobar; // group"); 3383 3384 verifyFormat("do\n" 3385 " int aLongVariable; // with comment\n" 3386 "while (foo); // not aigned\n" 3387 "int bar; // new align\n" 3388 "int foobar; // group"); 3389 3390 verifyFormat("do\n" 3391 " int aLongVariable; // with comment\n" 3392 "/**/ while (foo); // not aigned\n" 3393 "int bar; // new align\n" 3394 "int foobar; // group"); 3395 3396 verifyFormat("switch (foo) {\n" 3397 "case 7: {\n" 3398 " int aLongVariable; // with comment\n" 3399 " int f; // aligned\n" 3400 "} // case not aligned\n" 3401 "} // switch also not aligned\n" 3402 "int bar; // new align\n" 3403 "int foobar; // group"); 3404 3405 verifyFormat("switch (foo) {\n" 3406 "default: {\n" 3407 " int aLongVariable; // with comment\n" 3408 " int f; // aligned\n" 3409 "} // case not aligned\n" 3410 "} // switch also not aligned\n" 3411 "int bar; // new align\n" 3412 "int foobar; // group"); 3413 3414 verifyFormat("class C {\n" 3415 " int aLongVariable; // with comment\n" 3416 " int f; // aligned\n" 3417 "}; // not aligned\n" 3418 "int bar; // new align\n" 3419 "int foobar; // group"); 3420 3421 verifyFormat("struct S {\n" 3422 " int aLongVariable; // with comment\n" 3423 " int f; // aligned\n" 3424 "}; // not aligned\n" 3425 "int bar; // new align\n" 3426 "int foobar; // group"); 3427 3428 verifyFormat("union U {\n" 3429 " int aLongVariable; // with comment\n" 3430 " int f; // aligned\n" 3431 "}; // not aligned\n" 3432 "int bar; // new align\n" 3433 "int foobar; // group"); 3434 3435 verifyFormat("enum E {\n" 3436 " aLongVariable, // with comment\n" 3437 " f // aligned\n" 3438 "}; // not aligned\n" 3439 "int bar; // new align\n" 3440 "int foobar; // group"); 3441 3442 verifyFormat("void foo() {\n" 3443 " {\n" 3444 " int aLongVariable; // with comment\n" 3445 " int f; // aligned\n" 3446 " } // not aligned\n" 3447 " int bar; // new align\n" 3448 " int foobar; // group\n" 3449 "}"); 3450 3451 verifyFormat("auto longLambda = [] { // comment\n" 3452 " int aLongVariable; // with comment\n" 3453 " int f; // aligned\n" 3454 "}; // not aligned\n" 3455 "int bar; // new align\n" 3456 "int foobar; // group\n" 3457 "auto shortLambda = [] { return 5; }; // aligned"); 3458 3459 verifyFormat("auto longLambdaResult = [] { // comment\n" 3460 " int aLongVariable; // with comment\n" 3461 " int f; // aligned\n" 3462 "}(); // not aligned\n" 3463 "int bar; // new align\n" 3464 "int foobar; // group\n" 3465 "auto shortLambda = [] { return 5; }(); // aligned"); 3466 3467 verifyFormat( 3468 "auto longLambdaResult = [](auto I, auto J) { // comment\n" 3469 " int aLongVariable; // with comment\n" 3470 " int f; // aligned\n" 3471 "}(\"Input\", 5); // not aligned\n" 3472 "int bar; // new align\n" 3473 "int foobar; // group\n" 3474 "auto shortL = [](auto I, auto J) { return 5; }(\"In\", 5); // aligned"); 3475 3476 verifyFormat("enum E1 { V1, V2 }; // Aligned\n" 3477 "enum E2 { LongerNames, InThis, Enum }; // Comments"); 3478 3479 verifyFormat("class C {\n" 3480 " int aLongVariable; // with comment\n" 3481 " int f; // aligned\n" 3482 "} /* middle comment */; // not aligned\n" 3483 "int bar; // new align\n" 3484 "int foobar; // group"); 3485 } 3486 3487 TEST_F(FormatTestComments, AlignsBlockCommentDecorations) { 3488 EXPECT_EQ("/*\n" 3489 " */", 3490 format("/*\n" 3491 "*/")); 3492 EXPECT_EQ("/*\n" 3493 " */", 3494 format("/*\n" 3495 " */")); 3496 EXPECT_EQ("/*\n" 3497 " */", 3498 format("/*\n" 3499 " */")); 3500 3501 // Align a single line. 3502 EXPECT_EQ("/*\n" 3503 " * line */", 3504 format("/*\n" 3505 "* line */")); 3506 EXPECT_EQ("/*\n" 3507 " * line */", 3508 format("/*\n" 3509 " * line */")); 3510 EXPECT_EQ("/*\n" 3511 " * line */", 3512 format("/*\n" 3513 " * line */")); 3514 EXPECT_EQ("/*\n" 3515 " * line */", 3516 format("/*\n" 3517 " * line */")); 3518 EXPECT_EQ("/**\n" 3519 " * line */", 3520 format("/**\n" 3521 "* line */")); 3522 EXPECT_EQ("/**\n" 3523 " * line */", 3524 format("/**\n" 3525 " * line */")); 3526 EXPECT_EQ("/**\n" 3527 " * line */", 3528 format("/**\n" 3529 " * line */")); 3530 EXPECT_EQ("/**\n" 3531 " * line */", 3532 format("/**\n" 3533 " * line */")); 3534 EXPECT_EQ("/**\n" 3535 " * line */", 3536 format("/**\n" 3537 " * line */")); 3538 3539 // Align the end '*/' after a line. 3540 EXPECT_EQ("/*\n" 3541 " * line\n" 3542 " */", 3543 format("/*\n" 3544 "* line\n" 3545 "*/")); 3546 EXPECT_EQ("/*\n" 3547 " * line\n" 3548 " */", 3549 format("/*\n" 3550 " * line\n" 3551 " */")); 3552 EXPECT_EQ("/*\n" 3553 " * line\n" 3554 " */", 3555 format("/*\n" 3556 " * line\n" 3557 " */")); 3558 3559 // Align two lines. 3560 EXPECT_EQ("/* line 1\n" 3561 " * line 2 */", 3562 format("/* line 1\n" 3563 " * line 2 */")); 3564 EXPECT_EQ("/* line 1\n" 3565 " * line 2 */", 3566 format("/* line 1\n" 3567 "* line 2 */")); 3568 EXPECT_EQ("/* line 1\n" 3569 " * line 2 */", 3570 format("/* line 1\n" 3571 " * line 2 */")); 3572 EXPECT_EQ("/* line 1\n" 3573 " * line 2 */", 3574 format("/* line 1\n" 3575 " * line 2 */")); 3576 EXPECT_EQ("/* line 1\n" 3577 " * line 2 */", 3578 format("/* line 1\n" 3579 " * line 2 */")); 3580 EXPECT_EQ("int i; /* line 1\n" 3581 " * line 2 */", 3582 format("int i; /* line 1\n" 3583 "* line 2 */")); 3584 EXPECT_EQ("int i; /* line 1\n" 3585 " * line 2 */", 3586 format("int i; /* line 1\n" 3587 " * line 2 */")); 3588 EXPECT_EQ("int i; /* line 1\n" 3589 " * line 2 */", 3590 format("int i; /* line 1\n" 3591 " * line 2 */")); 3592 3593 // Align several lines. 3594 EXPECT_EQ("/* line 1\n" 3595 " * line 2\n" 3596 " * line 3 */", 3597 format("/* line 1\n" 3598 " * line 2\n" 3599 "* line 3 */")); 3600 EXPECT_EQ("/* line 1\n" 3601 " * line 2\n" 3602 " * line 3 */", 3603 format("/* line 1\n" 3604 " * line 2\n" 3605 "* line 3 */")); 3606 EXPECT_EQ("/*\n" 3607 "** line 1\n" 3608 "** line 2\n" 3609 "*/", 3610 format("/*\n" 3611 "** line 1\n" 3612 " ** line 2\n" 3613 "*/")); 3614 3615 // Align with different indent after the decorations. 3616 EXPECT_EQ("/*\n" 3617 " * line 1\n" 3618 " * line 2\n" 3619 " * line 3\n" 3620 " * line 4\n" 3621 " */", 3622 format("/*\n" 3623 "* line 1\n" 3624 " * line 2\n" 3625 " * line 3\n" 3626 "* line 4\n" 3627 "*/")); 3628 3629 // Align empty or blank lines. 3630 EXPECT_EQ("/**\n" 3631 " *\n" 3632 " *\n" 3633 " *\n" 3634 " */", 3635 format("/**\n" 3636 "* \n" 3637 " * \n" 3638 " *\n" 3639 "*/")); 3640 3641 // Align while breaking and reflowing. 3642 EXPECT_EQ("/*\n" 3643 " * long long long\n" 3644 " * long long\n" 3645 " *\n" 3646 " * long */", 3647 format("/*\n" 3648 " * long long long long\n" 3649 " * long\n" 3650 " *\n" 3651 "* long */", 3652 getLLVMStyleWithColumns(20))); 3653 } 3654 3655 TEST_F(FormatTestComments, NoCrash_Bug34236) { 3656 // This is a test case from a crasher reported in: 3657 // https://bugs.llvm.org/show_bug.cgi?id=34236 3658 // Temporarily disable formatting for readability. 3659 // clang-format off 3660 EXPECT_EQ( 3661 "/* */ /*\n" 3662 " * a\n" 3663 " * b c d*/", 3664 format( 3665 "/* */ /*\n" 3666 " * a b\n" 3667 " * c d*/", 3668 getLLVMStyleWithColumns(80))); 3669 // clang-format on 3670 } 3671 3672 TEST_F(FormatTestComments, NonTrailingBlockComments) { 3673 verifyFormat("const /** comment comment */ A = B;", 3674 getLLVMStyleWithColumns(40)); 3675 3676 verifyFormat("const /** comment comment comment */ A =\n" 3677 " B;", 3678 getLLVMStyleWithColumns(40)); 3679 3680 EXPECT_EQ("const /** comment comment comment\n" 3681 " comment */\n" 3682 " A = B;", 3683 format("const /** comment comment comment comment */\n" 3684 " A = B;", 3685 getLLVMStyleWithColumns(40))); 3686 } 3687 3688 TEST_F(FormatTestComments, PythonStyleComments) { 3689 // Keeps a space after '#'. 3690 EXPECT_EQ("# comment\n" 3691 "key: value", 3692 format("#comment\n" 3693 "key:value", 3694 getTextProtoStyleWithColumns(20))); 3695 EXPECT_EQ("# comment\n" 3696 "key: value", 3697 format("# comment\n" 3698 "key:value", 3699 getTextProtoStyleWithColumns(20))); 3700 // Breaks long comment. 3701 EXPECT_EQ("# comment comment\n" 3702 "# comment\n" 3703 "key: value", 3704 format("# comment comment comment\n" 3705 "key:value", 3706 getTextProtoStyleWithColumns(20))); 3707 // Indents comments. 3708 EXPECT_EQ("data {\n" 3709 " # comment comment\n" 3710 " # comment\n" 3711 " key: value\n" 3712 "}", 3713 format("data {\n" 3714 "# comment comment comment\n" 3715 "key: value}", 3716 getTextProtoStyleWithColumns(20))); 3717 EXPECT_EQ("data {\n" 3718 " # comment comment\n" 3719 " # comment\n" 3720 " key: value\n" 3721 "}", 3722 format("data {# comment comment comment\n" 3723 "key: value}", 3724 getTextProtoStyleWithColumns(20))); 3725 // Reflows long comments. 3726 EXPECT_EQ("# comment comment\n" 3727 "# comment comment\n" 3728 "key: value", 3729 format("# comment comment comment\n" 3730 "# comment\n" 3731 "key:value", 3732 getTextProtoStyleWithColumns(20))); 3733 // Breaks trailing comments. 3734 EXPECT_EQ("k: val # comment\n" 3735 " # comment\n" 3736 "a: 1", 3737 format("k:val#comment comment\n" 3738 "a:1", 3739 getTextProtoStyleWithColumns(20))); 3740 EXPECT_EQ("id {\n" 3741 " k: val # comment\n" 3742 " # comment\n" 3743 " # line line\n" 3744 " a: 1\n" 3745 "}", 3746 format("id {k:val#comment comment\n" 3747 "# line line\n" 3748 "a:1}", 3749 getTextProtoStyleWithColumns(20))); 3750 // Aligns trailing comments. 3751 EXPECT_EQ("k: val # commen1\n" 3752 " # commen2\n" 3753 " # commen3\n" 3754 "# commen4\n" 3755 "a: 1 # commen5\n" 3756 " # commen6\n" 3757 " # commen7", 3758 format("k:val#commen1 commen2\n" 3759 " #commen3\n" 3760 "# commen4\n" 3761 "a:1#commen5 commen6\n" 3762 " #commen7", 3763 getTextProtoStyleWithColumns(20))); 3764 } 3765 3766 TEST_F(FormatTestComments, BreaksBeforeTrailingUnbreakableSequence) { 3767 // The end of /* trail */ is exactly at 80 columns, but the unbreakable 3768 // trailing sequence ); after it exceeds the column limit. Make sure we 3769 // correctly break the line in that case. 3770 verifyFormat("int a =\n" 3771 " foo(/* trail */);", 3772 getLLVMStyleWithColumns(23)); 3773 } 3774 3775 TEST_F(FormatTestComments, ReflowBackslashCrash) { 3776 // clang-format off 3777 EXPECT_EQ( 3778 "// How to run:\n" 3779 "// bbbbb run \\\n" 3780 "// rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\n" 3781 "// \\ <log_file> -- --output_directory=\"<output_directory>\"", 3782 format( 3783 "// How to run:\n" 3784 "// bbbbb run \\\n" 3785 "// rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr \\\n" 3786 "// <log_file> -- --output_directory=\"<output_directory>\"")); 3787 // clang-format on 3788 } 3789 3790 TEST_F(FormatTestComments, IndentsLongJavadocAnnotatedLines) { 3791 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java); 3792 Style.ColumnLimit = 60; 3793 FormatStyle Style20 = getGoogleStyle(FormatStyle::LK_Java); 3794 Style20.ColumnLimit = 20; 3795 EXPECT_EQ( 3796 "/**\n" 3797 " * @param x long long long long long long long long long\n" 3798 " * long\n" 3799 " */", 3800 format("/**\n" 3801 " * @param x long long long long long long long long long long\n" 3802 " */", 3803 Style)); 3804 EXPECT_EQ("/**\n" 3805 " * @param x long long long long long long long long long\n" 3806 " * long long long long long long long long long long\n" 3807 " */", 3808 format("/**\n" 3809 " * @param x long long long long long long long long long " 3810 "long long long long long long long long long long\n" 3811 " */", 3812 Style)); 3813 EXPECT_EQ("/**\n" 3814 " * @param x long long long long long long long long long\n" 3815 " * long long long long long long long long long long\n" 3816 " * long\n" 3817 " */", 3818 format("/**\n" 3819 " * @param x long long long long long long long long long " 3820 "long long long long long long long long long long long\n" 3821 " */", 3822 Style)); 3823 EXPECT_EQ("/**\n" 3824 " * Sentence that\n" 3825 " * should be broken.\n" 3826 " * @param short\n" 3827 " * keep indentation\n" 3828 " */", 3829 format("/**\n" 3830 " * Sentence that should be broken.\n" 3831 " * @param short\n" 3832 " * keep indentation\n" 3833 " */", 3834 Style20)); 3835 3836 EXPECT_EQ("/**\n" 3837 " * @param l1 long1\n" 3838 " * to break\n" 3839 " * @param l2 long2\n" 3840 " * to break\n" 3841 " */", 3842 format("/**\n" 3843 " * @param l1 long1 to break\n" 3844 " * @param l2 long2 to break\n" 3845 " */", 3846 Style20)); 3847 3848 EXPECT_EQ("/**\n" 3849 " * @param xx to\n" 3850 " * break\n" 3851 " * no reflow\n" 3852 " */", 3853 format("/**\n" 3854 " * @param xx to break\n" 3855 " * no reflow\n" 3856 " */", 3857 Style20)); 3858 3859 EXPECT_EQ("/**\n" 3860 " * @param xx to\n" 3861 " * break yes\n" 3862 " * reflow\n" 3863 " */", 3864 format("/**\n" 3865 " * @param xx to break\n" 3866 " * yes reflow\n" 3867 " */", 3868 Style20)); 3869 3870 FormatStyle JSStyle20 = getGoogleStyle(FormatStyle::LK_JavaScript); 3871 JSStyle20.ColumnLimit = 20; 3872 EXPECT_EQ("/**\n" 3873 " * @param l1 long1\n" 3874 " * to break\n" 3875 " */", 3876 format("/**\n" 3877 " * @param l1 long1 to break\n" 3878 " */", 3879 JSStyle20)); 3880 EXPECT_EQ("/**\n" 3881 " * @param {l1 long1\n" 3882 " * to break}\n" 3883 " */", 3884 format("/**\n" 3885 " * @param {l1 long1 to break}\n" 3886 " */", 3887 JSStyle20)); 3888 } 3889 3890 TEST_F(FormatTestComments, SpaceAtLineCommentBegin) { 3891 FormatStyle Style = getLLVMStyle(); 3892 StringRef NoTextInComment = " // \n" 3893 "\n" 3894 "void foo() {// \n" 3895 "// \n" 3896 "}"; 3897 3898 EXPECT_EQ("//\n" 3899 "\n" 3900 "void foo() { //\n" 3901 " //\n" 3902 "}", 3903 format(NoTextInComment, Style)); 3904 3905 Style.SpacesInLineCommentPrefix.Minimum = 0; 3906 verifyFormat("//#comment", Style); 3907 EXPECT_EQ("//\n" 3908 "\n" 3909 "void foo() { //\n" 3910 " //\n" 3911 "}", 3912 format(NoTextInComment, Style)); 3913 3914 Style.SpacesInLineCommentPrefix.Minimum = 5; 3915 EXPECT_EQ("// #comment", format("//#comment", Style)); 3916 EXPECT_EQ("//\n" 3917 "\n" 3918 "void foo() { //\n" 3919 " //\n" 3920 "}", 3921 format(NoTextInComment, Style)); 3922 3923 Style = getLLVMStyle(); 3924 StringRef Code = 3925 "//Free comment without space\n" 3926 "\n" 3927 "// Free comment with 3 spaces\n" 3928 "\n" 3929 "///Free Doxygen without space\n" 3930 "\n" 3931 "/// Free Doxygen with 3 spaces\n" 3932 "\n" 3933 "// A nice dragon\n" 3934 "\n" 3935 "//\t abccba\n" 3936 "\n" 3937 "//\\t deffed\n" 3938 "\n" 3939 "// Another nice dragon\n" 3940 "\n" 3941 "// \t Three leading spaces following tab\n" 3942 "\n" 3943 "// \\t Three leading spaces following backslash\n" 3944 "\n" 3945 "/// A Doxygen Comment with a nested list:\n" 3946 "/// - Foo\n" 3947 "/// - Bar\n" 3948 "/// - Baz\n" 3949 "/// - End\n" 3950 "/// of the inner list\n" 3951 "/// .\n" 3952 "/// .\n" 3953 "\n" 3954 "namespace Foo {\n" 3955 "bool bar(bool b) {\n" 3956 " bool ret1 = true; ///<Doxygenstyle without space\n" 3957 " bool ret2 = true; ///< Doxygenstyle with 3 spaces\n" 3958 " if (b) {\n" 3959 " //Foo\n" 3960 "\n" 3961 " // In function comment\n" 3962 " ret2 = false;\n" 3963 " } // End of if\n" 3964 "\n" 3965 "// if (ret1) {\n" // Commented out at the beginning of the line 3966 "// return ret2;\n" 3967 "// }\n" 3968 "\n" 3969 " //if (ret1) {\n" // Commtented out at the beginning of the content 3970 " // return ret2;\n" 3971 " //}\n" 3972 "\n" 3973 " return ret1 && ret2;\n" 3974 "}\n" 3975 "}\n" 3976 "\n" 3977 "namespace Bar {\n" 3978 "int foo();\n" 3979 "} // namespace Bar\n" 3980 "//@Nothing added because of the non ascii char\n" 3981 "\n" 3982 "//@ Nothing removed because of the non ascii char\n" 3983 "\n" 3984 "// Comment to move to the left\n" 3985 "//But not this?\n" 3986 "// @but this\n" 3987 "\n" 3988 "//Comment to move to the right\n" 3989 "//@ this stays\n" 3990 "\n" 3991 "//} will not move\n" 3992 "\n" 3993 "//vv will only move\n" 3994 "//} if the line above does"; 3995 3996 EXPECT_EQ("// Free comment without space\n" 3997 "\n" 3998 "// Free comment with 3 spaces\n" 3999 "\n" 4000 "/// Free Doxygen without space\n" 4001 "\n" 4002 "/// Free Doxygen with 3 spaces\n" 4003 "\n" 4004 "// A nice dragon\n" 4005 "\n" 4006 "//\t abccba\n" 4007 "\n" 4008 "//\\t deffed\n" 4009 "\n" 4010 "// Another nice dragon\n" 4011 "\n" 4012 "// \t Three leading spaces following tab\n" 4013 "\n" 4014 "// \\t Three leading spaces following backslash\n" 4015 "\n" 4016 "/// A Doxygen Comment with a nested list:\n" 4017 "/// - Foo\n" 4018 "/// - Bar\n" 4019 "/// - Baz\n" 4020 "/// - End\n" 4021 "/// of the inner list\n" 4022 "/// .\n" 4023 "/// .\n" 4024 "\n" 4025 "namespace Foo {\n" 4026 "bool bar(bool b) {\n" 4027 " bool ret1 = true; ///< Doxygenstyle without space\n" 4028 " bool ret2 = true; ///< Doxygenstyle with 3 spaces\n" 4029 " if (b) {\n" 4030 " // Foo\n" 4031 "\n" 4032 " // In function comment\n" 4033 " ret2 = false;\n" 4034 " } // End of if\n" 4035 "\n" 4036 " // if (ret1) {\n" 4037 " // return ret2;\n" 4038 " // }\n" 4039 "\n" 4040 " // if (ret1) {\n" 4041 " // return ret2;\n" 4042 " // }\n" 4043 "\n" 4044 " return ret1 && ret2;\n" 4045 "}\n" 4046 "} // namespace Foo\n" 4047 "\n" 4048 "namespace Bar {\n" 4049 "int foo();\n" 4050 "} // namespace Bar\n" 4051 "//@Nothing added because of the non ascii char\n" 4052 "\n" 4053 "//@ Nothing removed because of the non ascii char\n" 4054 "\n" 4055 "// Comment to move to the left\n" 4056 "// But not this?\n" 4057 "// @but this\n" 4058 "\n" 4059 "// Comment to move to the right\n" 4060 "//@ this stays\n" 4061 "\n" 4062 "//} will not move\n" 4063 "\n" 4064 "// vv will only move\n" 4065 "// } if the line above does", 4066 format(Code, Style)); 4067 4068 Style.SpacesInLineCommentPrefix = {0, 0}; 4069 EXPECT_EQ("//#comment", format("// #comment", Style)); 4070 EXPECT_EQ("//Free comment without space\n" 4071 "\n" 4072 "//Free comment with 3 spaces\n" 4073 "\n" 4074 "///Free Doxygen without space\n" 4075 "\n" 4076 "///Free Doxygen with 3 spaces\n" 4077 "\n" 4078 "// A nice dragon\n" 4079 "\n" 4080 "//\t abccba\n" 4081 "\n" 4082 "//\\t deffed\n" 4083 "\n" 4084 "// Another nice dragon\n" 4085 "\n" 4086 "//\t Three leading spaces following tab\n" 4087 "\n" 4088 "//\\t Three leading spaces following backslash\n" 4089 "\n" 4090 "///A Doxygen Comment with a nested list:\n" 4091 "///- Foo\n" 4092 "///- Bar\n" 4093 "/// - Baz\n" // Here we keep the relative indentation 4094 "/// - End\n" 4095 "/// of the inner list\n" 4096 "/// .\n" 4097 "///.\n" 4098 "\n" 4099 "namespace Foo {\n" 4100 "bool bar(bool b) {\n" 4101 " bool ret1 = true; ///<Doxygenstyle without space\n" 4102 " bool ret2 = true; ///<Doxygenstyle with 3 spaces\n" 4103 " if (b) {\n" 4104 " //Foo\n" 4105 "\n" 4106 " //In function comment\n" 4107 " ret2 = false;\n" 4108 " } //End of if\n" 4109 "\n" 4110 " //if (ret1) {\n" 4111 " // return ret2;\n" 4112 " //}\n" 4113 "\n" 4114 " //if (ret1) {\n" 4115 " // return ret2;\n" 4116 " //}\n" 4117 "\n" 4118 " return ret1 && ret2;\n" 4119 "}\n" 4120 "} //namespace Foo\n" 4121 "\n" 4122 "namespace Bar {\n" 4123 "int foo();\n" 4124 "} //namespace Bar\n" 4125 "//@Nothing added because of the non ascii char\n" 4126 "\n" 4127 "//@ Nothing removed because of the non ascii char\n" 4128 "\n" 4129 "//Comment to move to the left\n" 4130 "//But not this?\n" 4131 "//@but this\n" 4132 "\n" 4133 "//Comment to move to the right\n" 4134 "//@ this stays\n" 4135 "\n" 4136 "//} will not move\n" 4137 "\n" 4138 "//vv will only move\n" 4139 "//} if the line above does", 4140 format(Code, Style)); 4141 4142 Style.SpacesInLineCommentPrefix = {2, -1u}; 4143 EXPECT_EQ("// Free comment without space\n" 4144 "\n" 4145 "// Free comment with 3 spaces\n" 4146 "\n" 4147 "/// Free Doxygen without space\n" 4148 "\n" 4149 "/// Free Doxygen with 3 spaces\n" 4150 "\n" 4151 "// A nice dragon\n" 4152 "\n" 4153 "//\t abccba\n" 4154 "\n" 4155 "//\\t deffed\n" 4156 "\n" 4157 "// Another nice dragon\n" 4158 "\n" 4159 "// \t Three leading spaces following tab\n" 4160 "\n" 4161 "// \\t Three leading spaces following backslash\n" 4162 "\n" 4163 "/// A Doxygen Comment with a nested list:\n" 4164 "/// - Foo\n" 4165 "/// - Bar\n" 4166 "/// - Baz\n" 4167 "/// - End\n" 4168 "/// of the inner list\n" 4169 "/// .\n" 4170 "/// .\n" 4171 "\n" 4172 "namespace Foo {\n" 4173 "bool bar(bool b) {\n" 4174 " bool ret1 = true; ///< Doxygenstyle without space\n" 4175 " bool ret2 = true; ///< Doxygenstyle with 3 spaces\n" 4176 " if (b) {\n" 4177 " // Foo\n" 4178 "\n" 4179 " // In function comment\n" 4180 " ret2 = false;\n" 4181 " } // End of if\n" 4182 "\n" 4183 " // if (ret1) {\n" 4184 " // return ret2;\n" 4185 " // }\n" 4186 "\n" 4187 " // if (ret1) {\n" 4188 " // return ret2;\n" 4189 " // }\n" 4190 "\n" 4191 " return ret1 && ret2;\n" 4192 "}\n" 4193 "} // namespace Foo\n" 4194 "\n" 4195 "namespace Bar {\n" 4196 "int foo();\n" 4197 "} // namespace Bar\n" 4198 "//@Nothing added because of the non ascii char\n" 4199 "\n" 4200 "//@ Nothing removed because of the non ascii char\n" 4201 "\n" 4202 "// Comment to move to the left\n" 4203 "// But not this?\n" 4204 "// @but this\n" 4205 "\n" 4206 "// Comment to move to the right\n" 4207 "//@ this stays\n" 4208 "\n" 4209 "//} will not move\n" 4210 "\n" 4211 "// vv will only move\n" 4212 "// } if the line above does", 4213 format(Code, Style)); 4214 4215 Style = getLLVMStyleWithColumns(20); 4216 StringRef WrapCode = "//Lorem ipsum dolor sit amet\n" 4217 "\n" 4218 "// Lorem ipsum dolor sit amet\n" 4219 "\n" 4220 "void f() {//Hello World\n" 4221 "}"; 4222 4223 EXPECT_EQ("// Lorem ipsum dolor\n" 4224 "// sit amet\n" 4225 "\n" 4226 "// Lorem ipsum\n" 4227 "// dolor sit amet\n" 4228 "\n" 4229 "void f() { // Hello\n" 4230 " // World\n" 4231 "}", 4232 format(WrapCode, Style)); 4233 4234 Style.SpacesInLineCommentPrefix = {0, 0}; 4235 EXPECT_EQ("//Lorem ipsum dolor\n" 4236 "//sit amet\n" 4237 "\n" 4238 "//Lorem ipsum\n" 4239 "//dolor sit amet\n" 4240 "\n" 4241 "void f() { //Hello\n" 4242 " //World\n" 4243 "}", 4244 format(WrapCode, Style)); 4245 4246 Style.SpacesInLineCommentPrefix = {1, 1}; 4247 EXPECT_EQ("// Lorem ipsum dolor\n" 4248 "// sit amet\n" 4249 "\n" 4250 "// Lorem ipsum\n" 4251 "// dolor sit amet\n" 4252 "\n" 4253 "void f() { // Hello\n" 4254 " // World\n" 4255 "}", 4256 format(WrapCode, Style)); 4257 EXPECT_EQ("// x\n" 4258 "// y", 4259 format("// x\n" 4260 "// y", 4261 Style)); 4262 EXPECT_EQ( 4263 "// loooooooooooooooooooooooooooooong\n" 4264 "// commentcomments\n" 4265 "// normal comments", 4266 format("// loooooooooooooooooooooooooooooong commentcomments\n" 4267 "// normal comments", 4268 Style)); 4269 4270 Style.SpacesInLineCommentPrefix = {3, 3}; 4271 EXPECT_EQ("// Lorem ipsum\n" 4272 "// dolor sit amet\n" 4273 "\n" 4274 "// Lorem ipsum\n" 4275 "// dolor sit\n" 4276 "// amet\n" 4277 "\n" 4278 "void f() { // Hello\n" 4279 " // World\n" 4280 "}", 4281 format(WrapCode, Style)); 4282 4283 Style = getLLVMStyleWithColumns(20); 4284 StringRef LotsOfSpaces = "// This are more spaces " 4285 "than the ColumnLimit, what now?\n" 4286 "\n" 4287 "// Comment\n" 4288 "\n" 4289 "// This is a text to split in multiple " 4290 "lines, please. Thank you very much!\n" 4291 "\n" 4292 "// A comment with\n" 4293 "// some indentation that has to be split.\n" 4294 "// And now without"; 4295 EXPECT_EQ("// This are more spaces " 4296 "than the ColumnLimit, what now?\n" 4297 "\n" 4298 "// Comment\n" 4299 "\n" 4300 "// This is a text to\n" 4301 "// split in multiple\n" 4302 "// lines, please.\n" 4303 "// Thank you very\n" 4304 "// much!\n" 4305 "\n" 4306 "// A comment with\n" 4307 "// some\n" 4308 "// indentation\n" 4309 "// that has to be\n" 4310 "// split.\n" 4311 "// And now without", 4312 format(LotsOfSpaces, Style)); 4313 4314 Style.SpacesInLineCommentPrefix = {0, 0}; 4315 EXPECT_EQ("//This are more\n" 4316 "//spaces than the\n" 4317 "//ColumnLimit, what\n" 4318 "//now?\n" 4319 "\n" 4320 "//Comment\n" 4321 "\n" 4322 "//This is a text to\n" 4323 "//split in multiple\n" 4324 "//lines, please.\n" 4325 "//Thank you very\n" 4326 "//much!\n" 4327 "\n" 4328 "//A comment with\n" 4329 "// some indentation\n" 4330 "// that has to be\n" 4331 "// split.\n" 4332 "//And now without", 4333 format(LotsOfSpaces, Style)); 4334 4335 Style.SpacesInLineCommentPrefix = {3, 3}; 4336 EXPECT_EQ("// This are more\n" 4337 "// spaces than the\n" 4338 "// ColumnLimit,\n" 4339 "// what now?\n" 4340 "\n" 4341 "// Comment\n" 4342 "\n" 4343 "// This is a text\n" 4344 "// to split in\n" 4345 "// multiple lines,\n" 4346 "// please. Thank\n" 4347 "// you very much!\n" 4348 "\n" 4349 "// A comment with\n" 4350 "// some\n" 4351 "// indentation\n" 4352 "// that has to\n" 4353 "// be split.\n" 4354 "// And now without", 4355 format(LotsOfSpaces, Style)); 4356 4357 Style.SpacesInLineCommentPrefix = {30, -1u}; 4358 EXPECT_EQ("// This are more spaces than the " 4359 "ColumnLimit, what now?\n" 4360 "\n" 4361 "// Comment\n" 4362 "\n" 4363 "// This is a text to split in " 4364 "multiple lines, please. Thank you very much!\n" 4365 "\n" 4366 "// A comment with\n" 4367 "// some indentation that has to be " 4368 "split.\n" 4369 "// And now without", 4370 format(LotsOfSpaces, Style)); 4371 4372 Style.SpacesInLineCommentPrefix = {2, 4}; 4373 EXPECT_EQ("// A Comment to be\n" 4374 "// moved\n" 4375 "// with indent\n" 4376 "\n" 4377 "// A Comment to be\n" 4378 "// moved\n" 4379 "// with indent\n" 4380 "\n" 4381 "// A Comment to be\n" 4382 "// moved\n" 4383 "// with indent\n" 4384 "\n" 4385 "// A Comment to be\n" 4386 "// moved\n" 4387 "// with indent\n" 4388 "\n" 4389 "// A Comment to\n" 4390 "// be moved\n" 4391 "// with indent\n" 4392 "\n" 4393 "// A Comment to\n" 4394 "// be moved\n" 4395 "// with indent\n" 4396 "\n" 4397 "// A Comment to\n" 4398 "// be moved\n" 4399 "// with indent", 4400 format("//A Comment to be moved\n" 4401 "// with indent\n" 4402 "\n" 4403 "// A Comment to be moved\n" 4404 "// with indent\n" 4405 "\n" 4406 "// A Comment to be moved\n" 4407 "// with indent\n" 4408 "\n" 4409 "// A Comment to be moved\n" 4410 "// with indent\n" 4411 "\n" 4412 "// A Comment to be moved\n" 4413 "// with indent\n" 4414 "\n" 4415 "// A Comment to be moved\n" 4416 "// with indent\n" 4417 "\n" 4418 "// A Comment to be moved\n" 4419 "// with indent", 4420 Style)); 4421 4422 Style.ColumnLimit = 30; 4423 EXPECT_EQ("int i; // A Comment to be\n" 4424 " // moved\n" 4425 " // with indent\n" 4426 "\n" 4427 "int i; // A Comment to be\n" 4428 " // moved\n" 4429 " // with indent\n" 4430 "\n" 4431 "int i; // A Comment to be\n" 4432 " // moved\n" 4433 " // with indent\n" 4434 "\n" 4435 "int i; // A Comment to be\n" 4436 " // moved\n" 4437 " // with indent\n" 4438 "\n" 4439 "int i; // A Comment to be\n" 4440 " // moved\n" 4441 " // with indent\n" 4442 "\n" 4443 "int i; // A Comment to be\n" 4444 " // moved\n" 4445 " // with indent\n" 4446 "\n" 4447 "int i; // A Comment to be\n" 4448 " // moved\n" 4449 " // with indent", 4450 format("int i;//A Comment to be moved\n" 4451 " // with indent\n" 4452 "\n" 4453 "int i;// A Comment to be moved\n" 4454 " // with indent\n" 4455 "\n" 4456 "int i;// A Comment to be moved\n" 4457 " // with indent\n" 4458 "\n" 4459 "int i;// A Comment to be moved\n" 4460 " // with indent\n" 4461 "\n" 4462 "int i;// A Comment to be moved\n" 4463 " // with indent\n" 4464 "\n" 4465 "int i;// A Comment to be moved\n" 4466 " // with indent\n" 4467 "\n" 4468 "int i;// A Comment to be moved\n" 4469 " // with indent", 4470 Style)); 4471 4472 Style = getLLVMStyleWithColumns(0); 4473 EXPECT_EQ("// Free comment without space\n" 4474 "\n" 4475 "// Free comment with 3 spaces\n" 4476 "\n" 4477 "/// Free Doxygen without space\n" 4478 "\n" 4479 "/// Free Doxygen with 3 spaces\n" 4480 "\n" 4481 "// A nice dragon\n" 4482 "\n" 4483 "//\t abccba\n" 4484 "\n" 4485 "//\\t deffed\n" 4486 "\n" 4487 "// Another nice dragon\n" 4488 "\n" 4489 "// \t Three leading spaces following tab\n" 4490 "\n" 4491 "// \\t Three leading spaces following backslash\n" 4492 "\n" 4493 "/// A Doxygen Comment with a nested list:\n" 4494 "/// - Foo\n" 4495 "/// - Bar\n" 4496 "/// - Baz\n" 4497 "/// - End\n" 4498 "/// of the inner list\n" 4499 "/// .\n" 4500 "/// .\n" 4501 "\n" 4502 "namespace Foo {\n" 4503 "bool bar(bool b) {\n" 4504 " bool ret1 = true; ///< Doxygenstyle without space\n" 4505 " bool ret2 = true; ///< Doxygenstyle with 3 spaces\n" 4506 " if (b) {\n" 4507 " // Foo\n" 4508 "\n" 4509 " // In function comment\n" 4510 " ret2 = false;\n" 4511 " } // End of if\n" 4512 "\n" 4513 " // if (ret1) {\n" 4514 " // return ret2;\n" 4515 " // }\n" 4516 "\n" 4517 " // if (ret1) {\n" 4518 " // return ret2;\n" 4519 " // }\n" 4520 "\n" 4521 " return ret1 && ret2;\n" 4522 "}\n" 4523 "} // namespace Foo\n" 4524 "\n" 4525 "namespace Bar {\n" 4526 "int foo();\n" 4527 "} // namespace Bar\n" 4528 "//@Nothing added because of the non ascii char\n" 4529 "\n" 4530 "//@ Nothing removed because of the non ascii char\n" 4531 "\n" 4532 "// Comment to move to the left\n" 4533 "// But not this?\n" 4534 "// @but this\n" 4535 "\n" 4536 "// Comment to move to the right\n" 4537 "//@ this stays\n" 4538 "\n" 4539 "//} will not move\n" 4540 "\n" 4541 "// vv will only move\n" 4542 "// } if the line above does", 4543 format(Code, Style)); 4544 4545 Style.SpacesInLineCommentPrefix = {0, 0}; 4546 EXPECT_EQ("//Free comment without space\n" 4547 "\n" 4548 "//Free comment with 3 spaces\n" 4549 "\n" 4550 "///Free Doxygen without space\n" 4551 "\n" 4552 "///Free Doxygen with 3 spaces\n" 4553 "\n" 4554 "// A nice dragon\n" 4555 "\n" 4556 "//\t abccba\n" 4557 "\n" 4558 "//\\t deffed\n" 4559 "\n" 4560 "// Another nice dragon\n" 4561 "\n" 4562 "//\t Three leading spaces following tab\n" 4563 "\n" 4564 "//\\t Three leading spaces following backslash\n" 4565 "\n" 4566 "///A Doxygen Comment with a nested list:\n" 4567 "///- Foo\n" 4568 "///- Bar\n" 4569 "/// - Baz\n" // Here we keep the relative indentation 4570 "/// - End\n" 4571 "/// of the inner list\n" 4572 "/// .\n" 4573 "///.\n" 4574 "\n" 4575 "namespace Foo {\n" 4576 "bool bar(bool b) {\n" 4577 " bool ret1 = true; ///<Doxygenstyle without space\n" 4578 " bool ret2 = true; ///<Doxygenstyle with 3 spaces\n" 4579 " if (b) {\n" 4580 " //Foo\n" 4581 "\n" 4582 " //In function comment\n" 4583 " ret2 = false;\n" 4584 " } //End of if\n" 4585 "\n" 4586 " //if (ret1) {\n" 4587 " // return ret2;\n" 4588 " //}\n" 4589 "\n" 4590 " //if (ret1) {\n" 4591 " // return ret2;\n" 4592 " //}\n" 4593 "\n" 4594 " return ret1 && ret2;\n" 4595 "}\n" 4596 "} //namespace Foo\n" 4597 "\n" 4598 "namespace Bar {\n" 4599 "int foo();\n" 4600 "} //namespace Bar\n" 4601 "//@Nothing added because of the non ascii char\n" 4602 "\n" 4603 "//@ Nothing removed because of the non ascii char\n" 4604 "\n" 4605 "//Comment to move to the left\n" 4606 "//But not this?\n" 4607 "//@but this\n" 4608 "\n" 4609 "//Comment to move to the right\n" 4610 "//@ this stays\n" 4611 "\n" 4612 "//} will not move\n" 4613 "\n" 4614 "//vv will only move\n" 4615 "//} if the line above does", 4616 format(Code, Style)); 4617 4618 Style.SpacesInLineCommentPrefix = {2, -1u}; 4619 EXPECT_EQ("// Free comment without space\n" 4620 "\n" 4621 "// Free comment with 3 spaces\n" 4622 "\n" 4623 "/// Free Doxygen without space\n" 4624 "\n" 4625 "/// Free Doxygen with 3 spaces\n" 4626 "\n" 4627 "// A nice dragon\n" 4628 "\n" 4629 "//\t abccba\n" 4630 "\n" 4631 "//\\t deffed\n" 4632 "\n" 4633 "// Another nice dragon\n" 4634 "\n" 4635 "// \t Three leading spaces following tab\n" 4636 "\n" 4637 "// \\t Three leading spaces following backslash\n" 4638 "\n" 4639 "/// A Doxygen Comment with a nested list:\n" 4640 "/// - Foo\n" 4641 "/// - Bar\n" 4642 "/// - Baz\n" 4643 "/// - End\n" 4644 "/// of the inner list\n" 4645 "/// .\n" 4646 "/// .\n" 4647 "\n" 4648 "namespace Foo {\n" 4649 "bool bar(bool b) {\n" 4650 " bool ret1 = true; ///< Doxygenstyle without space\n" 4651 " bool ret2 = true; ///< Doxygenstyle with 3 spaces\n" 4652 " if (b) {\n" 4653 " // Foo\n" 4654 "\n" 4655 " // In function comment\n" 4656 " ret2 = false;\n" 4657 " } // End of if\n" 4658 "\n" 4659 " // if (ret1) {\n" 4660 " // return ret2;\n" 4661 " // }\n" 4662 "\n" 4663 " // if (ret1) {\n" 4664 " // return ret2;\n" 4665 " // }\n" 4666 "\n" 4667 " return ret1 && ret2;\n" 4668 "}\n" 4669 "} // namespace Foo\n" 4670 "\n" 4671 "namespace Bar {\n" 4672 "int foo();\n" 4673 "} // namespace Bar\n" 4674 "//@Nothing added because of the non ascii char\n" 4675 "\n" 4676 "//@ Nothing removed because of the non ascii char\n" 4677 "\n" 4678 "// Comment to move to the left\n" 4679 "// But not this?\n" 4680 "// @but this\n" 4681 "\n" 4682 "// Comment to move to the right\n" 4683 "//@ this stays\n" 4684 "\n" 4685 "//} will not move\n" 4686 "\n" 4687 "// vv will only move\n" 4688 "// } if the line above does", 4689 format(Code, Style)); 4690 } 4691 4692 TEST_F(FormatTestComments, SplitCommentIntroducers) { 4693 EXPECT_EQ(R"(// 4694 /\ 4695 / 4696 )", 4697 format(R"(// 4698 /\ 4699 / 4700 )", 4701 getLLVMStyleWithColumns(10))); 4702 } 4703 4704 } // end namespace 4705 } // namespace test 4706 } // end namespace format 4707 } // end namespace clang 4708