1 //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "clang/Format/Format.h" 11 12 #include "../Tooling/ReplacementTest.h" 13 #include "FormatTestUtils.h" 14 15 #include "clang/Frontend/TextDiagnosticPrinter.h" 16 #include "llvm/Support/Debug.h" 17 #include "llvm/Support/MemoryBuffer.h" 18 #include "gtest/gtest.h" 19 20 #define DEBUG_TYPE "format-test" 21 22 using clang::tooling::ReplacementTest; 23 using clang::tooling::toReplacements; 24 25 namespace clang { 26 namespace format { 27 namespace { 28 29 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); } 30 31 class FormatTest : public ::testing::Test { 32 protected: 33 enum StatusCheck { 34 SC_ExpectComplete, 35 SC_ExpectIncomplete, 36 SC_DoNotCheck 37 }; 38 39 std::string format(llvm::StringRef Code, 40 const FormatStyle &Style = getLLVMStyle(), 41 StatusCheck CheckComplete = SC_ExpectComplete) { 42 LLVM_DEBUG(llvm::errs() << "---\n"); 43 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 44 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 45 FormattingAttemptStatus Status; 46 tooling::Replacements Replaces = 47 reformat(Style, Code, Ranges, "<stdin>", &Status); 48 if (CheckComplete != SC_DoNotCheck) { 49 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete; 50 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete) 51 << Code << "\n\n"; 52 } 53 ReplacementCount = Replaces.size(); 54 auto Result = applyAllReplacements(Code, Replaces); 55 EXPECT_TRUE(static_cast<bool>(Result)); 56 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 57 return *Result; 58 } 59 60 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) { 61 Style.ColumnLimit = ColumnLimit; 62 return Style; 63 } 64 65 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) { 66 return getStyleWithColumns(getLLVMStyle(), ColumnLimit); 67 } 68 69 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) { 70 return getStyleWithColumns(getGoogleStyle(), ColumnLimit); 71 } 72 73 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code, 74 const FormatStyle &Style = getLLVMStyle()) { 75 EXPECT_EQ(Expected.str(), format(Expected, Style)) 76 << "Expected code is not stable"; 77 EXPECT_EQ(Expected.str(), format(Code, Style)); 78 if (Style.Language == FormatStyle::LK_Cpp) { 79 // Objective-C++ is a superset of C++, so everything checked for C++ 80 // needs to be checked for Objective-C++ as well. 81 FormatStyle ObjCStyle = Style; 82 ObjCStyle.Language = FormatStyle::LK_ObjC; 83 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle)); 84 } 85 } 86 87 void verifyFormat(llvm::StringRef Code, 88 const FormatStyle &Style = getLLVMStyle()) { 89 verifyFormat(Code, test::messUp(Code), Style); 90 } 91 92 void verifyIncompleteFormat(llvm::StringRef Code, 93 const FormatStyle &Style = getLLVMStyle()) { 94 EXPECT_EQ(Code.str(), 95 format(test::messUp(Code), Style, SC_ExpectIncomplete)); 96 } 97 98 void verifyGoogleFormat(llvm::StringRef Code) { 99 verifyFormat(Code, getGoogleStyle()); 100 } 101 102 void verifyIndependentOfContext(llvm::StringRef text) { 103 verifyFormat(text); 104 verifyFormat(llvm::Twine("void f() { " + text + " }").str()); 105 } 106 107 /// \brief Verify that clang-format does not crash on the given input. 108 void verifyNoCrash(llvm::StringRef Code, 109 const FormatStyle &Style = getLLVMStyle()) { 110 format(Code, Style, SC_DoNotCheck); 111 } 112 113 int ReplacementCount; 114 }; 115 116 TEST_F(FormatTest, MessUp) { 117 EXPECT_EQ("1 2 3", test::messUp("1 2 3")); 118 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n")); 119 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc")); 120 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc")); 121 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne")); 122 } 123 124 //===----------------------------------------------------------------------===// 125 // Basic function tests. 126 //===----------------------------------------------------------------------===// 127 128 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) { 129 EXPECT_EQ(";", format(";")); 130 } 131 132 TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 133 EXPECT_EQ("int i;", format(" int i;")); 134 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;")); 135 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 136 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 137 } 138 139 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 140 EXPECT_EQ("int i;", format("int\ni;")); 141 } 142 143 TEST_F(FormatTest, FormatsNestedBlockStatements) { 144 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}")); 145 } 146 147 TEST_F(FormatTest, FormatsNestedCall) { 148 verifyFormat("Method(f1, f2(f3));"); 149 verifyFormat("Method(f1(f2, f3()));"); 150 verifyFormat("Method(f1(f2, (f3())));"); 151 } 152 153 TEST_F(FormatTest, NestedNameSpecifiers) { 154 verifyFormat("vector<::Type> v;"); 155 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); 156 verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); 157 verifyFormat("bool a = 2 < ::SomeFunction();"); 158 verifyFormat("ALWAYS_INLINE ::std::string getName();"); 159 verifyFormat("some::string getName();"); 160 } 161 162 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { 163 EXPECT_EQ("if (a) {\n" 164 " f();\n" 165 "}", 166 format("if(a){f();}")); 167 EXPECT_EQ(4, ReplacementCount); 168 EXPECT_EQ("if (a) {\n" 169 " f();\n" 170 "}", 171 format("if (a) {\n" 172 " f();\n" 173 "}")); 174 EXPECT_EQ(0, ReplacementCount); 175 EXPECT_EQ("/*\r\n" 176 "\r\n" 177 "*/\r\n", 178 format("/*\r\n" 179 "\r\n" 180 "*/\r\n")); 181 EXPECT_EQ(0, ReplacementCount); 182 } 183 184 TEST_F(FormatTest, RemovesEmptyLines) { 185 EXPECT_EQ("class C {\n" 186 " int i;\n" 187 "};", 188 format("class C {\n" 189 " int i;\n" 190 "\n" 191 "};")); 192 193 // Don't remove empty lines at the start of namespaces or extern "C" blocks. 194 EXPECT_EQ("namespace N {\n" 195 "\n" 196 "int i;\n" 197 "}", 198 format("namespace N {\n" 199 "\n" 200 "int i;\n" 201 "}", 202 getGoogleStyle())); 203 EXPECT_EQ("extern /**/ \"C\" /**/ {\n" 204 "\n" 205 "int i;\n" 206 "}", 207 format("extern /**/ \"C\" /**/ {\n" 208 "\n" 209 "int i;\n" 210 "}", 211 getGoogleStyle())); 212 213 // ...but do keep inlining and removing empty lines for non-block extern "C" 214 // functions. 215 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); 216 EXPECT_EQ("extern \"C\" int f() {\n" 217 " int i = 42;\n" 218 " return i;\n" 219 "}", 220 format("extern \"C\" int f() {\n" 221 "\n" 222 " int i = 42;\n" 223 " return i;\n" 224 "}", 225 getGoogleStyle())); 226 227 // Remove empty lines at the beginning and end of blocks. 228 EXPECT_EQ("void f() {\n" 229 "\n" 230 " if (a) {\n" 231 "\n" 232 " f();\n" 233 " }\n" 234 "}", 235 format("void f() {\n" 236 "\n" 237 " if (a) {\n" 238 "\n" 239 " f();\n" 240 "\n" 241 " }\n" 242 "\n" 243 "}", 244 getLLVMStyle())); 245 EXPECT_EQ("void f() {\n" 246 " if (a) {\n" 247 " f();\n" 248 " }\n" 249 "}", 250 format("void f() {\n" 251 "\n" 252 " if (a) {\n" 253 "\n" 254 " f();\n" 255 "\n" 256 " }\n" 257 "\n" 258 "}", 259 getGoogleStyle())); 260 261 // Don't remove empty lines in more complex control statements. 262 EXPECT_EQ("void f() {\n" 263 " if (a) {\n" 264 " f();\n" 265 "\n" 266 " } else if (b) {\n" 267 " f();\n" 268 " }\n" 269 "}", 270 format("void f() {\n" 271 " if (a) {\n" 272 " f();\n" 273 "\n" 274 " } else if (b) {\n" 275 " f();\n" 276 "\n" 277 " }\n" 278 "\n" 279 "}")); 280 281 // Don't remove empty lines before namespace endings. 282 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 283 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 284 EXPECT_EQ("namespace {\n" 285 "int i;\n" 286 "\n" 287 "}", 288 format("namespace {\n" 289 "int i;\n" 290 "\n" 291 "}", LLVMWithNoNamespaceFix)); 292 EXPECT_EQ("namespace {\n" 293 "int i;\n" 294 "}", 295 format("namespace {\n" 296 "int i;\n" 297 "}", LLVMWithNoNamespaceFix)); 298 EXPECT_EQ("namespace {\n" 299 "int i;\n" 300 "\n" 301 "};", 302 format("namespace {\n" 303 "int i;\n" 304 "\n" 305 "};", LLVMWithNoNamespaceFix)); 306 EXPECT_EQ("namespace {\n" 307 "int i;\n" 308 "};", 309 format("namespace {\n" 310 "int i;\n" 311 "};", LLVMWithNoNamespaceFix)); 312 EXPECT_EQ("namespace {\n" 313 "int i;\n" 314 "\n" 315 "}", 316 format("namespace {\n" 317 "int i;\n" 318 "\n" 319 "}")); 320 EXPECT_EQ("namespace {\n" 321 "int i;\n" 322 "\n" 323 "} // namespace", 324 format("namespace {\n" 325 "int i;\n" 326 "\n" 327 "} // namespace")); 328 329 FormatStyle Style = getLLVMStyle(); 330 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 331 Style.MaxEmptyLinesToKeep = 2; 332 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 333 Style.BraceWrapping.AfterClass = true; 334 Style.BraceWrapping.AfterFunction = true; 335 Style.KeepEmptyLinesAtTheStartOfBlocks = false; 336 337 EXPECT_EQ("class Foo\n" 338 "{\n" 339 " Foo() {}\n" 340 "\n" 341 " void funk() {}\n" 342 "};", 343 format("class Foo\n" 344 "{\n" 345 " Foo()\n" 346 " {\n" 347 " }\n" 348 "\n" 349 " void funk() {}\n" 350 "};", 351 Style)); 352 } 353 354 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) { 355 verifyFormat("x = (a) and (b);"); 356 verifyFormat("x = (a) or (b);"); 357 verifyFormat("x = (a) bitand (b);"); 358 verifyFormat("x = (a) bitor (b);"); 359 verifyFormat("x = (a) not_eq (b);"); 360 verifyFormat("x = (a) and_eq (b);"); 361 verifyFormat("x = (a) or_eq (b);"); 362 verifyFormat("x = (a) xor (b);"); 363 } 364 365 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) { 366 verifyFormat("x = compl(a);"); 367 verifyFormat("x = not(a);"); 368 verifyFormat("x = bitand(a);"); 369 // Unary operator must not be merged with the next identifier 370 verifyFormat("x = compl a;"); 371 verifyFormat("x = not a;"); 372 verifyFormat("x = bitand a;"); 373 } 374 375 //===----------------------------------------------------------------------===// 376 // Tests for control statements. 377 //===----------------------------------------------------------------------===// 378 379 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) { 380 verifyFormat("if (true)\n f();\ng();"); 381 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();"); 382 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();"); 383 verifyFormat("if constexpr (true)\n" 384 " f();\ng();"); 385 verifyFormat("if constexpr (a)\n" 386 " if constexpr (b)\n" 387 " if constexpr (c)\n" 388 " g();\n" 389 "h();"); 390 verifyFormat("if constexpr (a)\n" 391 " if constexpr (b) {\n" 392 " f();\n" 393 " }\n" 394 "g();"); 395 396 FormatStyle AllowsMergedIf = getLLVMStyle(); 397 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 398 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true; 399 verifyFormat("if (a)\n" 400 " // comment\n" 401 " f();", 402 AllowsMergedIf); 403 verifyFormat("{\n" 404 " if (a)\n" 405 " label:\n" 406 " f();\n" 407 "}", 408 AllowsMergedIf); 409 verifyFormat("#define A \\\n" 410 " if (a) \\\n" 411 " label: \\\n" 412 " f()", 413 AllowsMergedIf); 414 verifyFormat("if (a)\n" 415 " ;", 416 AllowsMergedIf); 417 verifyFormat("if (a)\n" 418 " if (b) return;", 419 AllowsMergedIf); 420 421 verifyFormat("if (a) // Can't merge this\n" 422 " f();\n", 423 AllowsMergedIf); 424 verifyFormat("if (a) /* still don't merge */\n" 425 " f();", 426 AllowsMergedIf); 427 verifyFormat("if (a) { // Never merge this\n" 428 " f();\n" 429 "}", 430 AllowsMergedIf); 431 verifyFormat("if (a) { /* Never merge this */\n" 432 " f();\n" 433 "}", 434 AllowsMergedIf); 435 436 AllowsMergedIf.ColumnLimit = 14; 437 verifyFormat("if (a) return;", AllowsMergedIf); 438 verifyFormat("if (aaaaaaaaa)\n" 439 " return;", 440 AllowsMergedIf); 441 442 AllowsMergedIf.ColumnLimit = 13; 443 verifyFormat("if (a)\n return;", AllowsMergedIf); 444 } 445 446 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) { 447 FormatStyle AllowsMergedLoops = getLLVMStyle(); 448 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true; 449 verifyFormat("while (true) continue;", AllowsMergedLoops); 450 verifyFormat("for (;;) continue;", AllowsMergedLoops); 451 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops); 452 verifyFormat("while (true)\n" 453 " ;", 454 AllowsMergedLoops); 455 verifyFormat("for (;;)\n" 456 " ;", 457 AllowsMergedLoops); 458 verifyFormat("for (;;)\n" 459 " for (;;) continue;", 460 AllowsMergedLoops); 461 verifyFormat("for (;;) // Can't merge this\n" 462 " continue;", 463 AllowsMergedLoops); 464 verifyFormat("for (;;) /* still don't merge */\n" 465 " continue;", 466 AllowsMergedLoops); 467 } 468 469 TEST_F(FormatTest, FormatShortBracedStatements) { 470 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 471 AllowSimpleBracedStatements.ColumnLimit = 40; 472 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true; 473 474 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true; 475 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 476 477 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom; 478 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true; 479 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false; 480 481 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 482 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 483 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 484 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 485 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 486 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 487 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 488 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 489 verifyFormat("if (true) {\n" 490 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 491 "}", 492 AllowSimpleBracedStatements); 493 verifyFormat("if (true) { //\n" 494 " f();\n" 495 "}", 496 AllowSimpleBracedStatements); 497 verifyFormat("if (true) {\n" 498 " f();\n" 499 " f();\n" 500 "}", 501 AllowSimpleBracedStatements); 502 verifyFormat("if (true) {\n" 503 " f();\n" 504 "} else {\n" 505 " f();\n" 506 "}", 507 AllowSimpleBracedStatements); 508 509 verifyFormat("struct A2 {\n" 510 " int X;\n" 511 "};", 512 AllowSimpleBracedStatements); 513 verifyFormat("typedef struct A2 {\n" 514 " int X;\n" 515 "} A2_t;", 516 AllowSimpleBracedStatements); 517 verifyFormat("template <int> struct A2 {\n" 518 " struct B {};\n" 519 "};", 520 AllowSimpleBracedStatements); 521 522 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false; 523 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 524 verifyFormat("if (true) {\n" 525 " f();\n" 526 "}", 527 AllowSimpleBracedStatements); 528 verifyFormat("if (true) {\n" 529 " f();\n" 530 "} else {\n" 531 " f();\n" 532 "}", 533 AllowSimpleBracedStatements); 534 535 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 536 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 537 verifyFormat("while (true) {\n" 538 " f();\n" 539 "}", 540 AllowSimpleBracedStatements); 541 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 542 verifyFormat("for (;;) {\n" 543 " f();\n" 544 "}", 545 AllowSimpleBracedStatements); 546 547 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true; 548 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 549 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true; 550 551 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 552 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 553 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 554 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 555 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 556 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 557 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 558 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 559 verifyFormat("if (true)\n" 560 "{\n" 561 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 562 "}", 563 AllowSimpleBracedStatements); 564 verifyFormat("if (true)\n" 565 "{ //\n" 566 " f();\n" 567 "}", 568 AllowSimpleBracedStatements); 569 verifyFormat("if (true)\n" 570 "{\n" 571 " f();\n" 572 " f();\n" 573 "}", 574 AllowSimpleBracedStatements); 575 verifyFormat("if (true)\n" 576 "{\n" 577 " f();\n" 578 "} else\n" 579 "{\n" 580 " f();\n" 581 "}", 582 AllowSimpleBracedStatements); 583 584 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false; 585 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 586 verifyFormat("if (true)\n" 587 "{\n" 588 " f();\n" 589 "}", 590 AllowSimpleBracedStatements); 591 verifyFormat("if (true)\n" 592 "{\n" 593 " f();\n" 594 "} else\n" 595 "{\n" 596 " f();\n" 597 "}", 598 AllowSimpleBracedStatements); 599 600 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 601 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 602 verifyFormat("while (true)\n" 603 "{\n" 604 " f();\n" 605 "}", 606 AllowSimpleBracedStatements); 607 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 608 verifyFormat("for (;;)\n" 609 "{\n" 610 " f();\n" 611 "}", 612 AllowSimpleBracedStatements); 613 } 614 615 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 616 FormatStyle Style = getLLVMStyleWithColumns(60); 617 Style.AllowShortBlocksOnASingleLine = true; 618 Style.AllowShortIfStatementsOnASingleLine = true; 619 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 620 EXPECT_EQ("#define A \\\n" 621 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 622 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 623 "X;", 624 format("#define A \\\n" 625 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 626 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 627 " }\n" 628 "X;", 629 Style)); 630 } 631 632 TEST_F(FormatTest, ParseIfElse) { 633 verifyFormat("if (true)\n" 634 " if (true)\n" 635 " if (true)\n" 636 " f();\n" 637 " else\n" 638 " g();\n" 639 " else\n" 640 " h();\n" 641 "else\n" 642 " i();"); 643 verifyFormat("if (true)\n" 644 " if (true)\n" 645 " if (true) {\n" 646 " if (true)\n" 647 " f();\n" 648 " } else {\n" 649 " g();\n" 650 " }\n" 651 " else\n" 652 " h();\n" 653 "else {\n" 654 " i();\n" 655 "}"); 656 verifyFormat("if (true)\n" 657 " if constexpr (true)\n" 658 " if (true) {\n" 659 " if constexpr (true)\n" 660 " f();\n" 661 " } else {\n" 662 " g();\n" 663 " }\n" 664 " else\n" 665 " h();\n" 666 "else {\n" 667 " i();\n" 668 "}"); 669 verifyFormat("void f() {\n" 670 " if (a) {\n" 671 " } else {\n" 672 " }\n" 673 "}"); 674 } 675 676 TEST_F(FormatTest, ElseIf) { 677 verifyFormat("if (a) {\n} else if (b) {\n}"); 678 verifyFormat("if (a)\n" 679 " f();\n" 680 "else if (b)\n" 681 " g();\n" 682 "else\n" 683 " h();"); 684 verifyFormat("if constexpr (a)\n" 685 " f();\n" 686 "else if constexpr (b)\n" 687 " g();\n" 688 "else\n" 689 " h();"); 690 verifyFormat("if (a) {\n" 691 " f();\n" 692 "}\n" 693 "// or else ..\n" 694 "else {\n" 695 " g()\n" 696 "}"); 697 698 verifyFormat("if (a) {\n" 699 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 701 "}"); 702 verifyFormat("if (a) {\n" 703 "} else if (\n" 704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 705 "}", 706 getLLVMStyleWithColumns(62)); 707 verifyFormat("if (a) {\n" 708 "} else if constexpr (\n" 709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 710 "}", 711 getLLVMStyleWithColumns(62)); 712 } 713 714 TEST_F(FormatTest, FormatsForLoop) { 715 verifyFormat( 716 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 717 " ++VeryVeryLongLoopVariable)\n" 718 " ;"); 719 verifyFormat("for (;;)\n" 720 " f();"); 721 verifyFormat("for (;;) {\n}"); 722 verifyFormat("for (;;) {\n" 723 " f();\n" 724 "}"); 725 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 726 727 verifyFormat( 728 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 729 " E = UnwrappedLines.end();\n" 730 " I != E; ++I) {\n}"); 731 732 verifyFormat( 733 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 734 " ++IIIII) {\n}"); 735 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 736 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 737 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 738 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 739 " I = FD->getDeclsInPrototypeScope().begin(),\n" 740 " E = FD->getDeclsInPrototypeScope().end();\n" 741 " I != E; ++I) {\n}"); 742 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 743 " I = Container.begin(),\n" 744 " E = Container.end();\n" 745 " I != E; ++I) {\n}", 746 getLLVMStyleWithColumns(76)); 747 748 verifyFormat( 749 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 753 " ++aaaaaaaaaaa) {\n}"); 754 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 755 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 756 " ++i) {\n}"); 757 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 758 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 759 "}"); 760 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 761 " aaaaaaaaaa);\n" 762 " iter; ++iter) {\n" 763 "}"); 764 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 766 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 767 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 768 769 // These should not be formatted as Objective-C for-in loops. 770 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 771 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 772 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 773 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 774 775 FormatStyle NoBinPacking = getLLVMStyle(); 776 NoBinPacking.BinPackParameters = false; 777 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 778 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 779 " aaaaaaaaaaaaaaaa,\n" 780 " aaaaaaaaaaaaaaaa,\n" 781 " aaaaaaaaaaaaaaaa);\n" 782 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 783 "}", 784 NoBinPacking); 785 verifyFormat( 786 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 787 " E = UnwrappedLines.end();\n" 788 " I != E;\n" 789 " ++I) {\n}", 790 NoBinPacking); 791 792 FormatStyle AlignLeft = getLLVMStyle(); 793 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 794 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 795 } 796 797 TEST_F(FormatTest, RangeBasedForLoops) { 798 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 799 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 800 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 801 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 802 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 803 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 804 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 805 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 806 } 807 808 TEST_F(FormatTest, ForEachLoops) { 809 verifyFormat("void f() {\n" 810 " foreach (Item *item, itemlist) {}\n" 811 " Q_FOREACH (Item *item, itemlist) {}\n" 812 " BOOST_FOREACH (Item *item, itemlist) {}\n" 813 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 814 "}"); 815 816 // As function-like macros. 817 verifyFormat("#define foreach(x, y)\n" 818 "#define Q_FOREACH(x, y)\n" 819 "#define BOOST_FOREACH(x, y)\n" 820 "#define UNKNOWN_FOREACH(x, y)\n"); 821 822 // Not as function-like macros. 823 verifyFormat("#define foreach (x, y)\n" 824 "#define Q_FOREACH (x, y)\n" 825 "#define BOOST_FOREACH (x, y)\n" 826 "#define UNKNOWN_FOREACH (x, y)\n"); 827 } 828 829 TEST_F(FormatTest, FormatsWhileLoop) { 830 verifyFormat("while (true) {\n}"); 831 verifyFormat("while (true)\n" 832 " f();"); 833 verifyFormat("while () {\n}"); 834 verifyFormat("while () {\n" 835 " f();\n" 836 "}"); 837 } 838 839 TEST_F(FormatTest, FormatsDoWhile) { 840 verifyFormat("do {\n" 841 " do_something();\n" 842 "} while (something());"); 843 verifyFormat("do\n" 844 " do_something();\n" 845 "while (something());"); 846 } 847 848 TEST_F(FormatTest, FormatsSwitchStatement) { 849 verifyFormat("switch (x) {\n" 850 "case 1:\n" 851 " f();\n" 852 " break;\n" 853 "case kFoo:\n" 854 "case ns::kBar:\n" 855 "case kBaz:\n" 856 " break;\n" 857 "default:\n" 858 " g();\n" 859 " break;\n" 860 "}"); 861 verifyFormat("switch (x) {\n" 862 "case 1: {\n" 863 " f();\n" 864 " break;\n" 865 "}\n" 866 "case 2: {\n" 867 " break;\n" 868 "}\n" 869 "}"); 870 verifyFormat("switch (x) {\n" 871 "case 1: {\n" 872 " f();\n" 873 " {\n" 874 " g();\n" 875 " h();\n" 876 " }\n" 877 " break;\n" 878 "}\n" 879 "}"); 880 verifyFormat("switch (x) {\n" 881 "case 1: {\n" 882 " f();\n" 883 " if (foo) {\n" 884 " g();\n" 885 " h();\n" 886 " }\n" 887 " break;\n" 888 "}\n" 889 "}"); 890 verifyFormat("switch (x) {\n" 891 "case 1: {\n" 892 " f();\n" 893 " g();\n" 894 "} break;\n" 895 "}"); 896 verifyFormat("switch (test)\n" 897 " ;"); 898 verifyFormat("switch (x) {\n" 899 "default: {\n" 900 " // Do nothing.\n" 901 "}\n" 902 "}"); 903 verifyFormat("switch (x) {\n" 904 "// comment\n" 905 "// if 1, do f()\n" 906 "case 1:\n" 907 " f();\n" 908 "}"); 909 verifyFormat("switch (x) {\n" 910 "case 1:\n" 911 " // Do amazing stuff\n" 912 " {\n" 913 " f();\n" 914 " g();\n" 915 " }\n" 916 " break;\n" 917 "}"); 918 verifyFormat("#define A \\\n" 919 " switch (x) { \\\n" 920 " case a: \\\n" 921 " foo = b; \\\n" 922 " }", 923 getLLVMStyleWithColumns(20)); 924 verifyFormat("#define OPERATION_CASE(name) \\\n" 925 " case OP_name: \\\n" 926 " return operations::Operation##name\n", 927 getLLVMStyleWithColumns(40)); 928 verifyFormat("switch (x) {\n" 929 "case 1:;\n" 930 "default:;\n" 931 " int i;\n" 932 "}"); 933 934 verifyGoogleFormat("switch (x) {\n" 935 " case 1:\n" 936 " f();\n" 937 " break;\n" 938 " case kFoo:\n" 939 " case ns::kBar:\n" 940 " case kBaz:\n" 941 " break;\n" 942 " default:\n" 943 " g();\n" 944 " break;\n" 945 "}"); 946 verifyGoogleFormat("switch (x) {\n" 947 " case 1: {\n" 948 " f();\n" 949 " break;\n" 950 " }\n" 951 "}"); 952 verifyGoogleFormat("switch (test)\n" 953 " ;"); 954 955 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 956 " case OP_name: \\\n" 957 " return operations::Operation##name\n"); 958 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 959 " // Get the correction operation class.\n" 960 " switch (OpCode) {\n" 961 " CASE(Add);\n" 962 " CASE(Subtract);\n" 963 " default:\n" 964 " return operations::Unknown;\n" 965 " }\n" 966 "#undef OPERATION_CASE\n" 967 "}"); 968 verifyFormat("DEBUG({\n" 969 " switch (x) {\n" 970 " case A:\n" 971 " f();\n" 972 " break;\n" 973 " // fallthrough\n" 974 " case B:\n" 975 " g();\n" 976 " break;\n" 977 " }\n" 978 "});"); 979 EXPECT_EQ("DEBUG({\n" 980 " switch (x) {\n" 981 " case A:\n" 982 " f();\n" 983 " break;\n" 984 " // On B:\n" 985 " case B:\n" 986 " g();\n" 987 " break;\n" 988 " }\n" 989 "});", 990 format("DEBUG({\n" 991 " switch (x) {\n" 992 " case A:\n" 993 " f();\n" 994 " break;\n" 995 " // On B:\n" 996 " case B:\n" 997 " g();\n" 998 " break;\n" 999 " }\n" 1000 "});", 1001 getLLVMStyle())); 1002 verifyFormat("switch (a) {\n" 1003 "case (b):\n" 1004 " return;\n" 1005 "}"); 1006 1007 verifyFormat("switch (a) {\n" 1008 "case some_namespace::\n" 1009 " some_constant:\n" 1010 " return;\n" 1011 "}", 1012 getLLVMStyleWithColumns(34)); 1013 } 1014 1015 TEST_F(FormatTest, CaseRanges) { 1016 verifyFormat("switch (x) {\n" 1017 "case 'A' ... 'Z':\n" 1018 "case 1 ... 5:\n" 1019 "case a ... b:\n" 1020 " break;\n" 1021 "}"); 1022 } 1023 1024 TEST_F(FormatTest, ShortCaseLabels) { 1025 FormatStyle Style = getLLVMStyle(); 1026 Style.AllowShortCaseLabelsOnASingleLine = true; 1027 verifyFormat("switch (a) {\n" 1028 "case 1: x = 1; break;\n" 1029 "case 2: return;\n" 1030 "case 3:\n" 1031 "case 4:\n" 1032 "case 5: return;\n" 1033 "case 6: // comment\n" 1034 " return;\n" 1035 "case 7:\n" 1036 " // comment\n" 1037 " return;\n" 1038 "case 8:\n" 1039 " x = 8; // comment\n" 1040 " break;\n" 1041 "default: y = 1; break;\n" 1042 "}", 1043 Style); 1044 verifyFormat("switch (a) {\n" 1045 "case 0: return; // comment\n" 1046 "case 1: break; // comment\n" 1047 "case 2: return;\n" 1048 "// comment\n" 1049 "case 3: return;\n" 1050 "// comment 1\n" 1051 "// comment 2\n" 1052 "// comment 3\n" 1053 "case 4: break; /* comment */\n" 1054 "case 5:\n" 1055 " // comment\n" 1056 " break;\n" 1057 "case 6: /* comment */ x = 1; break;\n" 1058 "case 7: x = /* comment */ 1; break;\n" 1059 "case 8:\n" 1060 " x = 1; /* comment */\n" 1061 " break;\n" 1062 "case 9:\n" 1063 " break; // comment line 1\n" 1064 " // comment line 2\n" 1065 "}", 1066 Style); 1067 EXPECT_EQ("switch (a) {\n" 1068 "case 1:\n" 1069 " x = 8;\n" 1070 " // fall through\n" 1071 "case 2: x = 8;\n" 1072 "// comment\n" 1073 "case 3:\n" 1074 " return; /* comment line 1\n" 1075 " * comment line 2 */\n" 1076 "case 4: i = 8;\n" 1077 "// something else\n" 1078 "#if FOO\n" 1079 "case 5: break;\n" 1080 "#endif\n" 1081 "}", 1082 format("switch (a) {\n" 1083 "case 1: x = 8;\n" 1084 " // fall through\n" 1085 "case 2:\n" 1086 " x = 8;\n" 1087 "// comment\n" 1088 "case 3:\n" 1089 " return; /* comment line 1\n" 1090 " * comment line 2 */\n" 1091 "case 4:\n" 1092 " i = 8;\n" 1093 "// something else\n" 1094 "#if FOO\n" 1095 "case 5: break;\n" 1096 "#endif\n" 1097 "}", 1098 Style)); 1099 EXPECT_EQ("switch (a) {\n" "case 0:\n" 1100 " return; // long long long long long long long long long long long long comment\n" 1101 " // line\n" "}", 1102 format("switch (a) {\n" 1103 "case 0: return; // long long long long long long long long long long long long comment line\n" 1104 "}", 1105 Style)); 1106 EXPECT_EQ("switch (a) {\n" 1107 "case 0:\n" 1108 " return; /* long long long long long long long long long long long long comment\n" 1109 " line */\n" 1110 "}", 1111 format("switch (a) {\n" 1112 "case 0: return; /* long long long long long long long long long long long long comment line */\n" 1113 "}", 1114 Style)); 1115 verifyFormat("switch (a) {\n" 1116 "#if FOO\n" 1117 "case 0: return 0;\n" 1118 "#endif\n" 1119 "}", 1120 Style); 1121 verifyFormat("switch (a) {\n" 1122 "case 1: {\n" 1123 "}\n" 1124 "case 2: {\n" 1125 " return;\n" 1126 "}\n" 1127 "case 3: {\n" 1128 " x = 1;\n" 1129 " return;\n" 1130 "}\n" 1131 "case 4:\n" 1132 " if (x)\n" 1133 " return;\n" 1134 "}", 1135 Style); 1136 Style.ColumnLimit = 21; 1137 verifyFormat("switch (a) {\n" 1138 "case 1: x = 1; break;\n" 1139 "case 2: return;\n" 1140 "case 3:\n" 1141 "case 4:\n" 1142 "case 5: return;\n" 1143 "default:\n" 1144 " y = 1;\n" 1145 " break;\n" 1146 "}", 1147 Style); 1148 } 1149 1150 TEST_F(FormatTest, FormatsLabels) { 1151 verifyFormat("void f() {\n" 1152 " some_code();\n" 1153 "test_label:\n" 1154 " some_other_code();\n" 1155 " {\n" 1156 " some_more_code();\n" 1157 " another_label:\n" 1158 " some_more_code();\n" 1159 " }\n" 1160 "}"); 1161 verifyFormat("{\n" 1162 " some_code();\n" 1163 "test_label:\n" 1164 " some_other_code();\n" 1165 "}"); 1166 verifyFormat("{\n" 1167 " some_code();\n" 1168 "test_label:;\n" 1169 " int i = 0;\n" 1170 "}"); 1171 } 1172 1173 //===----------------------------------------------------------------------===// 1174 // Tests for classes, namespaces, etc. 1175 //===----------------------------------------------------------------------===// 1176 1177 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1178 verifyFormat("class A {};"); 1179 } 1180 1181 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1182 verifyFormat("class A {\n" 1183 "public:\n" 1184 "public: // comment\n" 1185 "protected:\n" 1186 "private:\n" 1187 " void f() {}\n" 1188 "};"); 1189 verifyGoogleFormat("class A {\n" 1190 " public:\n" 1191 " protected:\n" 1192 " private:\n" 1193 " void f() {}\n" 1194 "};"); 1195 verifyFormat("class A {\n" 1196 "public slots:\n" 1197 " void f1() {}\n" 1198 "public Q_SLOTS:\n" 1199 " void f2() {}\n" 1200 "protected slots:\n" 1201 " void f3() {}\n" 1202 "protected Q_SLOTS:\n" 1203 " void f4() {}\n" 1204 "private slots:\n" 1205 " void f5() {}\n" 1206 "private Q_SLOTS:\n" 1207 " void f6() {}\n" 1208 "signals:\n" 1209 " void g1();\n" 1210 "Q_SIGNALS:\n" 1211 " void g2();\n" 1212 "};"); 1213 1214 // Don't interpret 'signals' the wrong way. 1215 verifyFormat("signals.set();"); 1216 verifyFormat("for (Signals signals : f()) {\n}"); 1217 verifyFormat("{\n" 1218 " signals.set(); // This needs indentation.\n" 1219 "}"); 1220 verifyFormat("void f() {\n" 1221 "label:\n" 1222 " signals.baz();\n" 1223 "}"); 1224 } 1225 1226 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1227 EXPECT_EQ("class A {\n" 1228 "public:\n" 1229 " void f();\n" 1230 "\n" 1231 "private:\n" 1232 " void g() {}\n" 1233 " // test\n" 1234 "protected:\n" 1235 " int h;\n" 1236 "};", 1237 format("class A {\n" 1238 "public:\n" 1239 "void f();\n" 1240 "private:\n" 1241 "void g() {}\n" 1242 "// test\n" 1243 "protected:\n" 1244 "int h;\n" 1245 "};")); 1246 EXPECT_EQ("class A {\n" 1247 "protected:\n" 1248 "public:\n" 1249 " void f();\n" 1250 "};", 1251 format("class A {\n" 1252 "protected:\n" 1253 "\n" 1254 "public:\n" 1255 "\n" 1256 " void f();\n" 1257 "};")); 1258 1259 // Even ensure proper spacing inside macros. 1260 EXPECT_EQ("#define B \\\n" 1261 " class A { \\\n" 1262 " protected: \\\n" 1263 " public: \\\n" 1264 " void f(); \\\n" 1265 " };", 1266 format("#define B \\\n" 1267 " class A { \\\n" 1268 " protected: \\\n" 1269 " \\\n" 1270 " public: \\\n" 1271 " \\\n" 1272 " void f(); \\\n" 1273 " };", 1274 getGoogleStyle())); 1275 // But don't remove empty lines after macros ending in access specifiers. 1276 EXPECT_EQ("#define A private:\n" 1277 "\n" 1278 "int i;", 1279 format("#define A private:\n" 1280 "\n" 1281 "int i;")); 1282 } 1283 1284 TEST_F(FormatTest, FormatsClasses) { 1285 verifyFormat("class A : public B {};"); 1286 verifyFormat("class A : public ::B {};"); 1287 1288 verifyFormat( 1289 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1290 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1291 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1292 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1293 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1294 verifyFormat( 1295 "class A : public B, public C, public D, public E, public F {};"); 1296 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1297 " public C,\n" 1298 " public D,\n" 1299 " public E,\n" 1300 " public F,\n" 1301 " public G {};"); 1302 1303 verifyFormat("class\n" 1304 " ReallyReallyLongClassName {\n" 1305 " int i;\n" 1306 "};", 1307 getLLVMStyleWithColumns(32)); 1308 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1309 " aaaaaaaaaaaaaaaa> {};"); 1310 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1311 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1312 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1313 verifyFormat("template <class R, class C>\n" 1314 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1315 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1316 verifyFormat("class ::A::B {};"); 1317 } 1318 1319 TEST_F(FormatTest, BreakInheritanceStyle) { 1320 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1321 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1322 FormatStyle::BILS_BeforeComma; 1323 verifyFormat("class MyClass : public X {};", 1324 StyleWithInheritanceBreakBeforeComma); 1325 verifyFormat("class MyClass\n" 1326 " : public X\n" 1327 " , public Y {};", 1328 StyleWithInheritanceBreakBeforeComma); 1329 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1330 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1331 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1332 StyleWithInheritanceBreakBeforeComma); 1333 verifyFormat("struct aaaaaaaaaaaaa\n" 1334 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1335 " aaaaaaaaaaaaaaaa> {};", 1336 StyleWithInheritanceBreakBeforeComma); 1337 1338 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1339 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1340 FormatStyle::BILS_AfterColon; 1341 verifyFormat("class MyClass : public X {};", 1342 StyleWithInheritanceBreakAfterColon); 1343 verifyFormat("class MyClass : public X, public Y {};", 1344 StyleWithInheritanceBreakAfterColon); 1345 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1346 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1347 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1348 StyleWithInheritanceBreakAfterColon); 1349 verifyFormat("struct aaaaaaaaaaaaa :\n" 1350 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1351 " aaaaaaaaaaaaaaaa> {};", 1352 StyleWithInheritanceBreakAfterColon); 1353 } 1354 1355 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1356 verifyFormat("class A {\n} a, b;"); 1357 verifyFormat("struct A {\n} a, b;"); 1358 verifyFormat("union A {\n} a;"); 1359 } 1360 1361 TEST_F(FormatTest, FormatsEnum) { 1362 verifyFormat("enum {\n" 1363 " Zero,\n" 1364 " One = 1,\n" 1365 " Two = One + 1,\n" 1366 " Three = (One + Two),\n" 1367 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1368 " Five = (One, Two, Three, Four, 5)\n" 1369 "};"); 1370 verifyGoogleFormat("enum {\n" 1371 " Zero,\n" 1372 " One = 1,\n" 1373 " Two = One + 1,\n" 1374 " Three = (One + Two),\n" 1375 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1376 " Five = (One, Two, Three, Four, 5)\n" 1377 "};"); 1378 verifyFormat("enum Enum {};"); 1379 verifyFormat("enum {};"); 1380 verifyFormat("enum X E {} d;"); 1381 verifyFormat("enum __attribute__((...)) E {} d;"); 1382 verifyFormat("enum __declspec__((...)) E {} d;"); 1383 verifyFormat("enum {\n" 1384 " Bar = Foo<int, int>::value\n" 1385 "};", 1386 getLLVMStyleWithColumns(30)); 1387 1388 verifyFormat("enum ShortEnum { A, B, C };"); 1389 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1390 1391 EXPECT_EQ("enum KeepEmptyLines {\n" 1392 " ONE,\n" 1393 "\n" 1394 " TWO,\n" 1395 "\n" 1396 " THREE\n" 1397 "}", 1398 format("enum KeepEmptyLines {\n" 1399 " ONE,\n" 1400 "\n" 1401 " TWO,\n" 1402 "\n" 1403 "\n" 1404 " THREE\n" 1405 "}")); 1406 verifyFormat("enum E { // comment\n" 1407 " ONE,\n" 1408 " TWO\n" 1409 "};\n" 1410 "int i;"); 1411 // Not enums. 1412 verifyFormat("enum X f() {\n" 1413 " a();\n" 1414 " return 42;\n" 1415 "}"); 1416 verifyFormat("enum X Type::f() {\n" 1417 " a();\n" 1418 " return 42;\n" 1419 "}"); 1420 verifyFormat("enum ::X f() {\n" 1421 " a();\n" 1422 " return 42;\n" 1423 "}"); 1424 verifyFormat("enum ns::X f() {\n" 1425 " a();\n" 1426 " return 42;\n" 1427 "}"); 1428 } 1429 1430 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1431 verifyFormat("enum Type {\n" 1432 " One = 0; // These semicolons should be commas.\n" 1433 " Two = 1;\n" 1434 "};"); 1435 verifyFormat("namespace n {\n" 1436 "enum Type {\n" 1437 " One,\n" 1438 " Two, // missing };\n" 1439 " int i;\n" 1440 "}\n" 1441 "void g() {}"); 1442 } 1443 1444 TEST_F(FormatTest, FormatsEnumStruct) { 1445 verifyFormat("enum struct {\n" 1446 " Zero,\n" 1447 " One = 1,\n" 1448 " Two = One + 1,\n" 1449 " Three = (One + Two),\n" 1450 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1451 " Five = (One, Two, Three, Four, 5)\n" 1452 "};"); 1453 verifyFormat("enum struct Enum {};"); 1454 verifyFormat("enum struct {};"); 1455 verifyFormat("enum struct X E {} d;"); 1456 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1457 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1458 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1459 } 1460 1461 TEST_F(FormatTest, FormatsEnumClass) { 1462 verifyFormat("enum class {\n" 1463 " Zero,\n" 1464 " One = 1,\n" 1465 " Two = One + 1,\n" 1466 " Three = (One + Two),\n" 1467 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1468 " Five = (One, Two, Three, Four, 5)\n" 1469 "};"); 1470 verifyFormat("enum class Enum {};"); 1471 verifyFormat("enum class {};"); 1472 verifyFormat("enum class X E {} d;"); 1473 verifyFormat("enum class __attribute__((...)) E {} d;"); 1474 verifyFormat("enum class __declspec__((...)) E {} d;"); 1475 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1476 } 1477 1478 TEST_F(FormatTest, FormatsEnumTypes) { 1479 verifyFormat("enum X : int {\n" 1480 " A, // Force multiple lines.\n" 1481 " B\n" 1482 "};"); 1483 verifyFormat("enum X : int { A, B };"); 1484 verifyFormat("enum X : std::uint32_t { A, B };"); 1485 } 1486 1487 TEST_F(FormatTest, FormatsTypedefEnum) { 1488 FormatStyle Style = getLLVMStyle(); 1489 Style.ColumnLimit = 40; 1490 verifyFormat("typedef enum {} EmptyEnum;"); 1491 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1492 verifyFormat("typedef enum {\n" 1493 " ZERO = 0,\n" 1494 " ONE = 1,\n" 1495 " TWO = 2,\n" 1496 " THREE = 3\n" 1497 "} LongEnum;", 1498 Style); 1499 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1500 Style.BraceWrapping.AfterEnum = true; 1501 verifyFormat("typedef enum {} EmptyEnum;"); 1502 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1503 verifyFormat("typedef enum\n" 1504 "{\n" 1505 " ZERO = 0,\n" 1506 " ONE = 1,\n" 1507 " TWO = 2,\n" 1508 " THREE = 3\n" 1509 "} LongEnum;", 1510 Style); 1511 } 1512 1513 TEST_F(FormatTest, FormatsNSEnums) { 1514 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1515 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 1516 " // Information about someDecentlyLongValue.\n" 1517 " someDecentlyLongValue,\n" 1518 " // Information about anotherDecentlyLongValue.\n" 1519 " anotherDecentlyLongValue,\n" 1520 " // Information about aThirdDecentlyLongValue.\n" 1521 " aThirdDecentlyLongValue\n" 1522 "};"); 1523 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 1524 " a = 1,\n" 1525 " b = 2,\n" 1526 " c = 3,\n" 1527 "};"); 1528 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 1529 " a = 1,\n" 1530 " b = 2,\n" 1531 " c = 3,\n" 1532 "};"); 1533 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 1534 " a = 1,\n" 1535 " b = 2,\n" 1536 " c = 3,\n" 1537 "};"); 1538 } 1539 1540 TEST_F(FormatTest, FormatsBitfields) { 1541 verifyFormat("struct Bitfields {\n" 1542 " unsigned sClass : 8;\n" 1543 " unsigned ValueKind : 2;\n" 1544 "};"); 1545 verifyFormat("struct A {\n" 1546 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 1547 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 1548 "};"); 1549 verifyFormat("struct MyStruct {\n" 1550 " uchar data;\n" 1551 " uchar : 8;\n" 1552 " uchar : 8;\n" 1553 " uchar other;\n" 1554 "};"); 1555 } 1556 1557 TEST_F(FormatTest, FormatsNamespaces) { 1558 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 1559 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 1560 1561 verifyFormat("namespace some_namespace {\n" 1562 "class A {};\n" 1563 "void f() { f(); }\n" 1564 "}", 1565 LLVMWithNoNamespaceFix); 1566 verifyFormat("namespace {\n" 1567 "class A {};\n" 1568 "void f() { f(); }\n" 1569 "}", 1570 LLVMWithNoNamespaceFix); 1571 verifyFormat("inline namespace X {\n" 1572 "class A {};\n" 1573 "void f() { f(); }\n" 1574 "}", 1575 LLVMWithNoNamespaceFix); 1576 verifyFormat("using namespace some_namespace;\n" 1577 "class A {};\n" 1578 "void f() { f(); }", 1579 LLVMWithNoNamespaceFix); 1580 1581 // This code is more common than we thought; if we 1582 // layout this correctly the semicolon will go into 1583 // its own line, which is undesirable. 1584 verifyFormat("namespace {};", 1585 LLVMWithNoNamespaceFix); 1586 verifyFormat("namespace {\n" 1587 "class A {};\n" 1588 "};", 1589 LLVMWithNoNamespaceFix); 1590 1591 verifyFormat("namespace {\n" 1592 "int SomeVariable = 0; // comment\n" 1593 "} // namespace", 1594 LLVMWithNoNamespaceFix); 1595 EXPECT_EQ("#ifndef HEADER_GUARD\n" 1596 "#define HEADER_GUARD\n" 1597 "namespace my_namespace {\n" 1598 "int i;\n" 1599 "} // my_namespace\n" 1600 "#endif // HEADER_GUARD", 1601 format("#ifndef HEADER_GUARD\n" 1602 " #define HEADER_GUARD\n" 1603 " namespace my_namespace {\n" 1604 "int i;\n" 1605 "} // my_namespace\n" 1606 "#endif // HEADER_GUARD", 1607 LLVMWithNoNamespaceFix)); 1608 1609 EXPECT_EQ("namespace A::B {\n" 1610 "class C {};\n" 1611 "}", 1612 format("namespace A::B {\n" 1613 "class C {};\n" 1614 "}", 1615 LLVMWithNoNamespaceFix)); 1616 1617 FormatStyle Style = getLLVMStyle(); 1618 Style.NamespaceIndentation = FormatStyle::NI_All; 1619 EXPECT_EQ("namespace out {\n" 1620 " int i;\n" 1621 " namespace in {\n" 1622 " int i;\n" 1623 " } // namespace in\n" 1624 "} // namespace out", 1625 format("namespace out {\n" 1626 "int i;\n" 1627 "namespace in {\n" 1628 "int i;\n" 1629 "} // namespace in\n" 1630 "} // namespace out", 1631 Style)); 1632 1633 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1634 EXPECT_EQ("namespace out {\n" 1635 "int i;\n" 1636 "namespace in {\n" 1637 " int i;\n" 1638 "} // namespace in\n" 1639 "} // namespace out", 1640 format("namespace out {\n" 1641 "int i;\n" 1642 "namespace in {\n" 1643 "int i;\n" 1644 "} // namespace in\n" 1645 "} // namespace out", 1646 Style)); 1647 } 1648 1649 TEST_F(FormatTest, FormatsCompactNamespaces) { 1650 FormatStyle Style = getLLVMStyle(); 1651 Style.CompactNamespaces = true; 1652 1653 verifyFormat("namespace A { namespace B {\n" 1654 "}} // namespace A::B", 1655 Style); 1656 1657 EXPECT_EQ("namespace out { namespace in {\n" 1658 "}} // namespace out::in", 1659 format("namespace out {\n" 1660 "namespace in {\n" 1661 "} // namespace in\n" 1662 "} // namespace out", 1663 Style)); 1664 1665 // Only namespaces which have both consecutive opening and end get compacted 1666 EXPECT_EQ("namespace out {\n" 1667 "namespace in1 {\n" 1668 "} // namespace in1\n" 1669 "namespace in2 {\n" 1670 "} // namespace in2\n" 1671 "} // namespace out", 1672 format("namespace out {\n" 1673 "namespace in1 {\n" 1674 "} // namespace in1\n" 1675 "namespace in2 {\n" 1676 "} // namespace in2\n" 1677 "} // namespace out", 1678 Style)); 1679 1680 EXPECT_EQ("namespace out {\n" 1681 "int i;\n" 1682 "namespace in {\n" 1683 "int j;\n" 1684 "} // namespace in\n" 1685 "int k;\n" 1686 "} // namespace out", 1687 format("namespace out { int i;\n" 1688 "namespace in { int j; } // namespace in\n" 1689 "int k; } // namespace out", 1690 Style)); 1691 1692 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 1693 "}}} // namespace A::B::C\n", 1694 format("namespace A { namespace B {\n" 1695 "namespace C {\n" 1696 "}} // namespace B::C\n" 1697 "} // namespace A\n", 1698 Style)); 1699 1700 Style.ColumnLimit = 40; 1701 EXPECT_EQ("namespace aaaaaaaaaa {\n" 1702 "namespace bbbbbbbbbb {\n" 1703 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 1704 format("namespace aaaaaaaaaa {\n" 1705 "namespace bbbbbbbbbb {\n" 1706 "} // namespace bbbbbbbbbb\n" 1707 "} // namespace aaaaaaaaaa", 1708 Style)); 1709 1710 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 1711 "namespace cccccc {\n" 1712 "}}} // namespace aaaaaa::bbbbbb::cccccc", 1713 format("namespace aaaaaa {\n" 1714 "namespace bbbbbb {\n" 1715 "namespace cccccc {\n" 1716 "} // namespace cccccc\n" 1717 "} // namespace bbbbbb\n" 1718 "} // namespace aaaaaa", 1719 Style)); 1720 Style.ColumnLimit = 80; 1721 1722 // Extra semicolon after 'inner' closing brace prevents merging 1723 EXPECT_EQ("namespace out { namespace in {\n" 1724 "}; } // namespace out::in", 1725 format("namespace out {\n" 1726 "namespace in {\n" 1727 "}; // namespace in\n" 1728 "} // namespace out", 1729 Style)); 1730 1731 // Extra semicolon after 'outer' closing brace is conserved 1732 EXPECT_EQ("namespace out { namespace in {\n" 1733 "}}; // namespace out::in", 1734 format("namespace out {\n" 1735 "namespace in {\n" 1736 "} // namespace in\n" 1737 "}; // namespace out", 1738 Style)); 1739 1740 Style.NamespaceIndentation = FormatStyle::NI_All; 1741 EXPECT_EQ("namespace out { namespace in {\n" 1742 " int i;\n" 1743 "}} // namespace out::in", 1744 format("namespace out {\n" 1745 "namespace in {\n" 1746 "int i;\n" 1747 "} // namespace in\n" 1748 "} // namespace out", 1749 Style)); 1750 EXPECT_EQ("namespace out { namespace mid {\n" 1751 " namespace in {\n" 1752 " int j;\n" 1753 " } // namespace in\n" 1754 " int k;\n" 1755 "}} // namespace out::mid", 1756 format("namespace out { namespace mid {\n" 1757 "namespace in { int j; } // namespace in\n" 1758 "int k; }} // namespace out::mid", 1759 Style)); 1760 1761 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1762 EXPECT_EQ("namespace out { namespace in {\n" 1763 " int i;\n" 1764 "}} // namespace out::in", 1765 format("namespace out {\n" 1766 "namespace in {\n" 1767 "int i;\n" 1768 "} // namespace in\n" 1769 "} // namespace out", 1770 Style)); 1771 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 1772 " int i;\n" 1773 "}}} // namespace out::mid::in", 1774 format("namespace out {\n" 1775 "namespace mid {\n" 1776 "namespace in {\n" 1777 "int i;\n" 1778 "} // namespace in\n" 1779 "} // namespace mid\n" 1780 "} // namespace out", 1781 Style)); 1782 } 1783 1784 TEST_F(FormatTest, FormatsExternC) { 1785 verifyFormat("extern \"C\" {\nint a;"); 1786 verifyFormat("extern \"C\" {}"); 1787 verifyFormat("extern \"C\" {\n" 1788 "int foo();\n" 1789 "}"); 1790 verifyFormat("extern \"C\" int foo() {}"); 1791 verifyFormat("extern \"C\" int foo();"); 1792 verifyFormat("extern \"C\" int foo() {\n" 1793 " int i = 42;\n" 1794 " return i;\n" 1795 "}"); 1796 1797 FormatStyle Style = getLLVMStyle(); 1798 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1799 Style.BraceWrapping.AfterFunction = true; 1800 verifyFormat("extern \"C\" int foo() {}", Style); 1801 verifyFormat("extern \"C\" int foo();", Style); 1802 verifyFormat("extern \"C\" int foo()\n" 1803 "{\n" 1804 " int i = 42;\n" 1805 " return i;\n" 1806 "}", 1807 Style); 1808 1809 Style.BraceWrapping.AfterExternBlock = true; 1810 Style.BraceWrapping.SplitEmptyRecord = false; 1811 verifyFormat("extern \"C\"\n" 1812 "{}", 1813 Style); 1814 verifyFormat("extern \"C\"\n" 1815 "{\n" 1816 " int foo();\n" 1817 "}", 1818 Style); 1819 } 1820 1821 TEST_F(FormatTest, FormatsInlineASM) { 1822 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 1823 verifyFormat("asm(\"nop\" ::: \"memory\");"); 1824 verifyFormat( 1825 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 1826 " \"cpuid\\n\\t\"\n" 1827 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 1828 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 1829 " : \"a\"(value));"); 1830 EXPECT_EQ( 1831 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 1832 " __asm {\n" 1833 " mov edx,[that] // vtable in edx\n" 1834 " mov eax,methodIndex\n" 1835 " call [edx][eax*4] // stdcall\n" 1836 " }\n" 1837 "}", 1838 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 1839 " __asm {\n" 1840 " mov edx,[that] // vtable in edx\n" 1841 " mov eax,methodIndex\n" 1842 " call [edx][eax*4] // stdcall\n" 1843 " }\n" 1844 "}")); 1845 EXPECT_EQ("_asm {\n" 1846 " xor eax, eax;\n" 1847 " cpuid;\n" 1848 "}", 1849 format("_asm {\n" 1850 " xor eax, eax;\n" 1851 " cpuid;\n" 1852 "}")); 1853 verifyFormat("void function() {\n" 1854 " // comment\n" 1855 " asm(\"\");\n" 1856 "}"); 1857 EXPECT_EQ("__asm {\n" 1858 "}\n" 1859 "int i;", 1860 format("__asm {\n" 1861 "}\n" 1862 "int i;")); 1863 } 1864 1865 TEST_F(FormatTest, FormatTryCatch) { 1866 verifyFormat("try {\n" 1867 " throw a * b;\n" 1868 "} catch (int a) {\n" 1869 " // Do nothing.\n" 1870 "} catch (...) {\n" 1871 " exit(42);\n" 1872 "}"); 1873 1874 // Function-level try statements. 1875 verifyFormat("int f() try { return 4; } catch (...) {\n" 1876 " return 5;\n" 1877 "}"); 1878 verifyFormat("class A {\n" 1879 " int a;\n" 1880 " A() try : a(0) {\n" 1881 " } catch (...) {\n" 1882 " throw;\n" 1883 " }\n" 1884 "};\n"); 1885 1886 // Incomplete try-catch blocks. 1887 verifyIncompleteFormat("try {} catch ("); 1888 } 1889 1890 TEST_F(FormatTest, FormatSEHTryCatch) { 1891 verifyFormat("__try {\n" 1892 " int a = b * c;\n" 1893 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 1894 " // Do nothing.\n" 1895 "}"); 1896 1897 verifyFormat("__try {\n" 1898 " int a = b * c;\n" 1899 "} __finally {\n" 1900 " // Do nothing.\n" 1901 "}"); 1902 1903 verifyFormat("DEBUG({\n" 1904 " __try {\n" 1905 " } __finally {\n" 1906 " }\n" 1907 "});\n"); 1908 } 1909 1910 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 1911 verifyFormat("try {\n" 1912 " f();\n" 1913 "} catch {\n" 1914 " g();\n" 1915 "}"); 1916 verifyFormat("try {\n" 1917 " f();\n" 1918 "} catch (A a) MACRO(x) {\n" 1919 " g();\n" 1920 "} catch (B b) MACRO(x) {\n" 1921 " g();\n" 1922 "}"); 1923 } 1924 1925 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 1926 FormatStyle Style = getLLVMStyle(); 1927 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 1928 FormatStyle::BS_WebKit}) { 1929 Style.BreakBeforeBraces = BraceStyle; 1930 verifyFormat("try {\n" 1931 " // something\n" 1932 "} catch (...) {\n" 1933 " // something\n" 1934 "}", 1935 Style); 1936 } 1937 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 1938 verifyFormat("try {\n" 1939 " // something\n" 1940 "}\n" 1941 "catch (...) {\n" 1942 " // something\n" 1943 "}", 1944 Style); 1945 verifyFormat("__try {\n" 1946 " // something\n" 1947 "}\n" 1948 "__finally {\n" 1949 " // something\n" 1950 "}", 1951 Style); 1952 verifyFormat("@try {\n" 1953 " // something\n" 1954 "}\n" 1955 "@finally {\n" 1956 " // something\n" 1957 "}", 1958 Style); 1959 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 1960 verifyFormat("try\n" 1961 "{\n" 1962 " // something\n" 1963 "}\n" 1964 "catch (...)\n" 1965 "{\n" 1966 " // something\n" 1967 "}", 1968 Style); 1969 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 1970 verifyFormat("try\n" 1971 " {\n" 1972 " // something\n" 1973 " }\n" 1974 "catch (...)\n" 1975 " {\n" 1976 " // something\n" 1977 " }", 1978 Style); 1979 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1980 Style.BraceWrapping.BeforeCatch = true; 1981 verifyFormat("try {\n" 1982 " // something\n" 1983 "}\n" 1984 "catch (...) {\n" 1985 " // something\n" 1986 "}", 1987 Style); 1988 } 1989 1990 TEST_F(FormatTest, StaticInitializers) { 1991 verifyFormat("static SomeClass SC = {1, 'a'};"); 1992 1993 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 1994 " 100000000, " 1995 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 1996 1997 // Here, everything other than the "}" would fit on a line. 1998 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 1999 " 10000000000000000000000000};"); 2000 EXPECT_EQ("S s = {a,\n" 2001 "\n" 2002 " b};", 2003 format("S s = {\n" 2004 " a,\n" 2005 "\n" 2006 " b\n" 2007 "};")); 2008 2009 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2010 // line. However, the formatting looks a bit off and this probably doesn't 2011 // happen often in practice. 2012 verifyFormat("static int Variable[1] = {\n" 2013 " {1000000000000000000000000000000000000}};", 2014 getLLVMStyleWithColumns(40)); 2015 } 2016 2017 TEST_F(FormatTest, DesignatedInitializers) { 2018 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2019 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2020 " .bbbbbbbbbb = 2,\n" 2021 " .cccccccccc = 3,\n" 2022 " .dddddddddd = 4,\n" 2023 " .eeeeeeeeee = 5};"); 2024 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2025 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2026 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2027 " .ccccccccccccccccccccccccccc = 3,\n" 2028 " .ddddddddddddddddddddddddddd = 4,\n" 2029 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2030 2031 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2032 2033 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2034 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2035 " [2] = bbbbbbbbbb,\n" 2036 " [3] = cccccccccc,\n" 2037 " [4] = dddddddddd,\n" 2038 " [5] = eeeeeeeeee};"); 2039 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2040 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2041 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2042 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2043 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2044 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2045 } 2046 2047 TEST_F(FormatTest, NestedStaticInitializers) { 2048 verifyFormat("static A x = {{{}}};\n"); 2049 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2050 " {init1, init2, init3, init4}}};", 2051 getLLVMStyleWithColumns(50)); 2052 2053 verifyFormat("somes Status::global_reps[3] = {\n" 2054 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2055 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2056 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2057 getLLVMStyleWithColumns(60)); 2058 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2059 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2060 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2061 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2062 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2063 " {rect.fRight - rect.fLeft, rect.fBottom - " 2064 "rect.fTop}};"); 2065 2066 verifyFormat( 2067 "SomeArrayOfSomeType a = {\n" 2068 " {{1, 2, 3},\n" 2069 " {1, 2, 3},\n" 2070 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2071 " 333333333333333333333333333333},\n" 2072 " {1, 2, 3},\n" 2073 " {1, 2, 3}}};"); 2074 verifyFormat( 2075 "SomeArrayOfSomeType a = {\n" 2076 " {{1, 2, 3}},\n" 2077 " {{1, 2, 3}},\n" 2078 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2079 " 333333333333333333333333333333}},\n" 2080 " {{1, 2, 3}},\n" 2081 " {{1, 2, 3}}};"); 2082 2083 verifyFormat("struct {\n" 2084 " unsigned bit;\n" 2085 " const char *const name;\n" 2086 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2087 " {kOsWin, \"Windows\"},\n" 2088 " {kOsLinux, \"Linux\"},\n" 2089 " {kOsCrOS, \"Chrome OS\"}};"); 2090 verifyFormat("struct {\n" 2091 " unsigned bit;\n" 2092 " const char *const name;\n" 2093 "} kBitsToOs[] = {\n" 2094 " {kOsMac, \"Mac\"},\n" 2095 " {kOsWin, \"Windows\"},\n" 2096 " {kOsLinux, \"Linux\"},\n" 2097 " {kOsCrOS, \"Chrome OS\"},\n" 2098 "};"); 2099 } 2100 2101 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2102 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2103 " \\\n" 2104 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2105 } 2106 2107 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2108 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2109 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2110 2111 // Do break defaulted and deleted functions. 2112 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2113 " default;", 2114 getLLVMStyleWithColumns(40)); 2115 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2116 " delete;", 2117 getLLVMStyleWithColumns(40)); 2118 } 2119 2120 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2121 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2122 getLLVMStyleWithColumns(40)); 2123 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2124 getLLVMStyleWithColumns(40)); 2125 EXPECT_EQ("#define Q \\\n" 2126 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2127 " \"aaaaaaaa.cpp\"", 2128 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2129 getLLVMStyleWithColumns(40))); 2130 } 2131 2132 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2133 EXPECT_EQ("# 123 \"A string literal\"", 2134 format(" # 123 \"A string literal\"")); 2135 } 2136 2137 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2138 EXPECT_EQ("#;", format("#;")); 2139 verifyFormat("#\n;\n;\n;"); 2140 } 2141 2142 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2143 EXPECT_EQ("#line 42 \"test\"\n", 2144 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2145 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2146 getLLVMStyleWithColumns(12))); 2147 } 2148 2149 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2150 EXPECT_EQ("#line 42 \"test\"", 2151 format("# \\\n line \\\n 42 \\\n \"test\"")); 2152 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2153 } 2154 2155 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2156 verifyFormat("#define A \\x20"); 2157 verifyFormat("#define A \\ x20"); 2158 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2159 verifyFormat("#define A ''"); 2160 verifyFormat("#define A ''qqq"); 2161 verifyFormat("#define A `qqq"); 2162 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2163 EXPECT_EQ("const char *c = STRINGIFY(\n" 2164 "\\na : b);", 2165 format("const char * c = STRINGIFY(\n" 2166 "\\na : b);")); 2167 2168 verifyFormat("a\r\\"); 2169 verifyFormat("a\v\\"); 2170 verifyFormat("a\f\\"); 2171 } 2172 2173 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2174 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2175 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2176 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2177 // FIXME: We never break before the macro name. 2178 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2179 2180 verifyFormat("#define A A\n#define A A"); 2181 verifyFormat("#define A(X) A\n#define A A"); 2182 2183 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2184 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2185 } 2186 2187 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2188 EXPECT_EQ("// somecomment\n" 2189 "#include \"a.h\"\n" 2190 "#define A( \\\n" 2191 " A, B)\n" 2192 "#include \"b.h\"\n" 2193 "// somecomment\n", 2194 format(" // somecomment\n" 2195 " #include \"a.h\"\n" 2196 "#define A(A,\\\n" 2197 " B)\n" 2198 " #include \"b.h\"\n" 2199 " // somecomment\n", 2200 getLLVMStyleWithColumns(13))); 2201 } 2202 2203 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2204 2205 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2206 EXPECT_EQ("#define A \\\n" 2207 " c; \\\n" 2208 " e;\n" 2209 "f;", 2210 format("#define A c; e;\n" 2211 "f;", 2212 getLLVMStyleWithColumns(14))); 2213 } 2214 2215 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2216 2217 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2218 EXPECT_EQ("int x,\n" 2219 "#define A\n" 2220 " y;", 2221 format("int x,\n#define A\ny;")); 2222 } 2223 2224 TEST_F(FormatTest, HashInMacroDefinition) { 2225 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2226 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2227 verifyFormat("#define A \\\n" 2228 " { \\\n" 2229 " f(#c); \\\n" 2230 " }", 2231 getLLVMStyleWithColumns(11)); 2232 2233 verifyFormat("#define A(X) \\\n" 2234 " void function##X()", 2235 getLLVMStyleWithColumns(22)); 2236 2237 verifyFormat("#define A(a, b, c) \\\n" 2238 " void a##b##c()", 2239 getLLVMStyleWithColumns(22)); 2240 2241 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2242 } 2243 2244 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2245 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2246 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2247 } 2248 2249 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2250 EXPECT_EQ("#define A b;", format("#define A \\\n" 2251 " \\\n" 2252 " b;", 2253 getLLVMStyleWithColumns(25))); 2254 EXPECT_EQ("#define A \\\n" 2255 " \\\n" 2256 " a; \\\n" 2257 " b;", 2258 format("#define A \\\n" 2259 " \\\n" 2260 " a; \\\n" 2261 " b;", 2262 getLLVMStyleWithColumns(11))); 2263 EXPECT_EQ("#define A \\\n" 2264 " a; \\\n" 2265 " \\\n" 2266 " b;", 2267 format("#define A \\\n" 2268 " a; \\\n" 2269 " \\\n" 2270 " b;", 2271 getLLVMStyleWithColumns(11))); 2272 } 2273 2274 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2275 verifyIncompleteFormat("#define A :"); 2276 verifyFormat("#define SOMECASES \\\n" 2277 " case 1: \\\n" 2278 " case 2\n", 2279 getLLVMStyleWithColumns(20)); 2280 verifyFormat("#define MACRO(a) \\\n" 2281 " if (a) \\\n" 2282 " f(); \\\n" 2283 " else \\\n" 2284 " g()", 2285 getLLVMStyleWithColumns(18)); 2286 verifyFormat("#define A template <typename T>"); 2287 verifyIncompleteFormat("#define STR(x) #x\n" 2288 "f(STR(this_is_a_string_literal{));"); 2289 verifyFormat("#pragma omp threadprivate( \\\n" 2290 " y)), // expected-warning", 2291 getLLVMStyleWithColumns(28)); 2292 verifyFormat("#d, = };"); 2293 verifyFormat("#if \"a"); 2294 verifyIncompleteFormat("({\n" 2295 "#define b \\\n" 2296 " } \\\n" 2297 " a\n" 2298 "a", 2299 getLLVMStyleWithColumns(15)); 2300 verifyFormat("#define A \\\n" 2301 " { \\\n" 2302 " {\n" 2303 "#define B \\\n" 2304 " } \\\n" 2305 " }", 2306 getLLVMStyleWithColumns(15)); 2307 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 2308 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 2309 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 2310 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 2311 } 2312 2313 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 2314 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 2315 EXPECT_EQ("class A : public QObject {\n" 2316 " Q_OBJECT\n" 2317 "\n" 2318 " A() {}\n" 2319 "};", 2320 format("class A : public QObject {\n" 2321 " Q_OBJECT\n" 2322 "\n" 2323 " A() {\n}\n" 2324 "} ;")); 2325 EXPECT_EQ("MACRO\n" 2326 "/*static*/ int i;", 2327 format("MACRO\n" 2328 " /*static*/ int i;")); 2329 EXPECT_EQ("SOME_MACRO\n" 2330 "namespace {\n" 2331 "void f();\n" 2332 "} // namespace", 2333 format("SOME_MACRO\n" 2334 " namespace {\n" 2335 "void f( );\n" 2336 "} // namespace")); 2337 // Only if the identifier contains at least 5 characters. 2338 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 2339 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 2340 // Only if everything is upper case. 2341 EXPECT_EQ("class A : public QObject {\n" 2342 " Q_Object A() {}\n" 2343 "};", 2344 format("class A : public QObject {\n" 2345 " Q_Object\n" 2346 " A() {\n}\n" 2347 "} ;")); 2348 2349 // Only if the next line can actually start an unwrapped line. 2350 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 2351 format("SOME_WEIRD_LOG_MACRO\n" 2352 "<< SomeThing;")); 2353 2354 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 2355 "(n, buffers))\n", 2356 getChromiumStyle(FormatStyle::LK_Cpp)); 2357 } 2358 2359 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 2360 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2361 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2362 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2363 "class X {};\n" 2364 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2365 "int *createScopDetectionPass() { return 0; }", 2366 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2367 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2368 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2369 " class X {};\n" 2370 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2371 " int *createScopDetectionPass() { return 0; }")); 2372 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 2373 // braces, so that inner block is indented one level more. 2374 EXPECT_EQ("int q() {\n" 2375 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2376 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2377 " IPC_END_MESSAGE_MAP()\n" 2378 "}", 2379 format("int q() {\n" 2380 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2381 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2382 " IPC_END_MESSAGE_MAP()\n" 2383 "}")); 2384 2385 // Same inside macros. 2386 EXPECT_EQ("#define LIST(L) \\\n" 2387 " L(A) \\\n" 2388 " L(B) \\\n" 2389 " L(C)", 2390 format("#define LIST(L) \\\n" 2391 " L(A) \\\n" 2392 " L(B) \\\n" 2393 " L(C)", 2394 getGoogleStyle())); 2395 2396 // These must not be recognized as macros. 2397 EXPECT_EQ("int q() {\n" 2398 " f(x);\n" 2399 " f(x) {}\n" 2400 " f(x)->g();\n" 2401 " f(x)->*g();\n" 2402 " f(x).g();\n" 2403 " f(x) = x;\n" 2404 " f(x) += x;\n" 2405 " f(x) -= x;\n" 2406 " f(x) *= x;\n" 2407 " f(x) /= x;\n" 2408 " f(x) %= x;\n" 2409 " f(x) &= x;\n" 2410 " f(x) |= x;\n" 2411 " f(x) ^= x;\n" 2412 " f(x) >>= x;\n" 2413 " f(x) <<= x;\n" 2414 " f(x)[y].z();\n" 2415 " LOG(INFO) << x;\n" 2416 " ifstream(x) >> x;\n" 2417 "}\n", 2418 format("int q() {\n" 2419 " f(x)\n;\n" 2420 " f(x)\n {}\n" 2421 " f(x)\n->g();\n" 2422 " f(x)\n->*g();\n" 2423 " f(x)\n.g();\n" 2424 " f(x)\n = x;\n" 2425 " f(x)\n += x;\n" 2426 " f(x)\n -= x;\n" 2427 " f(x)\n *= x;\n" 2428 " f(x)\n /= x;\n" 2429 " f(x)\n %= x;\n" 2430 " f(x)\n &= x;\n" 2431 " f(x)\n |= x;\n" 2432 " f(x)\n ^= x;\n" 2433 " f(x)\n >>= x;\n" 2434 " f(x)\n <<= x;\n" 2435 " f(x)\n[y].z();\n" 2436 " LOG(INFO)\n << x;\n" 2437 " ifstream(x)\n >> x;\n" 2438 "}\n")); 2439 EXPECT_EQ("int q() {\n" 2440 " F(x)\n" 2441 " if (1) {\n" 2442 " }\n" 2443 " F(x)\n" 2444 " while (1) {\n" 2445 " }\n" 2446 " F(x)\n" 2447 " G(x);\n" 2448 " F(x)\n" 2449 " try {\n" 2450 " Q();\n" 2451 " } catch (...) {\n" 2452 " }\n" 2453 "}\n", 2454 format("int q() {\n" 2455 "F(x)\n" 2456 "if (1) {}\n" 2457 "F(x)\n" 2458 "while (1) {}\n" 2459 "F(x)\n" 2460 "G(x);\n" 2461 "F(x)\n" 2462 "try { Q(); } catch (...) {}\n" 2463 "}\n")); 2464 EXPECT_EQ("class A {\n" 2465 " A() : t(0) {}\n" 2466 " A(int i) noexcept() : {}\n" 2467 " A(X x)\n" // FIXME: function-level try blocks are broken. 2468 " try : t(0) {\n" 2469 " } catch (...) {\n" 2470 " }\n" 2471 "};", 2472 format("class A {\n" 2473 " A()\n : t(0) {}\n" 2474 " A(int i)\n noexcept() : {}\n" 2475 " A(X x)\n" 2476 " try : t(0) {} catch (...) {}\n" 2477 "};")); 2478 EXPECT_EQ("class SomeClass {\n" 2479 "public:\n" 2480 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2481 "};", 2482 format("class SomeClass {\n" 2483 "public:\n" 2484 " SomeClass()\n" 2485 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2486 "};")); 2487 EXPECT_EQ("class SomeClass {\n" 2488 "public:\n" 2489 " SomeClass()\n" 2490 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2491 "};", 2492 format("class SomeClass {\n" 2493 "public:\n" 2494 " SomeClass()\n" 2495 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2496 "};", 2497 getLLVMStyleWithColumns(40))); 2498 2499 verifyFormat("MACRO(>)"); 2500 } 2501 2502 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 2503 verifyFormat("#define A \\\n" 2504 " f({ \\\n" 2505 " g(); \\\n" 2506 " });", 2507 getLLVMStyleWithColumns(11)); 2508 } 2509 2510 TEST_F(FormatTest, IndentPreprocessorDirectives) { 2511 FormatStyle Style = getLLVMStyle(); 2512 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 2513 Style.ColumnLimit = 40; 2514 verifyFormat("#ifdef _WIN32\n" 2515 "#define A 0\n" 2516 "#ifdef VAR2\n" 2517 "#define B 1\n" 2518 "#include <someheader.h>\n" 2519 "#define MACRO \\\n" 2520 " some_very_long_func_aaaaaaaaaa();\n" 2521 "#endif\n" 2522 "#else\n" 2523 "#define A 1\n" 2524 "#endif", 2525 Style); 2526 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 2527 verifyFormat("#ifdef _WIN32\n" 2528 "# define A 0\n" 2529 "# ifdef VAR2\n" 2530 "# define B 1\n" 2531 "# include <someheader.h>\n" 2532 "# define MACRO \\\n" 2533 " some_very_long_func_aaaaaaaaaa();\n" 2534 "# endif\n" 2535 "#else\n" 2536 "# define A 1\n" 2537 "#endif", 2538 Style); 2539 verifyFormat("#if A\n" 2540 "# define MACRO \\\n" 2541 " void a(int x) { \\\n" 2542 " b(); \\\n" 2543 " c(); \\\n" 2544 " d(); \\\n" 2545 " e(); \\\n" 2546 " f(); \\\n" 2547 " }\n" 2548 "#endif", 2549 Style); 2550 // Comments before include guard. 2551 verifyFormat("// file comment\n" 2552 "// file comment\n" 2553 "#ifndef HEADER_H\n" 2554 "#define HEADER_H\n" 2555 "code();\n" 2556 "#endif", 2557 Style); 2558 // Test with include guards. 2559 verifyFormat("#ifndef HEADER_H\n" 2560 "#define HEADER_H\n" 2561 "code();\n" 2562 "#endif", 2563 Style); 2564 // Include guards must have a #define with the same variable immediately 2565 // after #ifndef. 2566 verifyFormat("#ifndef NOT_GUARD\n" 2567 "# define FOO\n" 2568 "code();\n" 2569 "#endif", 2570 Style); 2571 2572 // Include guards must cover the entire file. 2573 verifyFormat("code();\n" 2574 "code();\n" 2575 "#ifndef NOT_GUARD\n" 2576 "# define NOT_GUARD\n" 2577 "code();\n" 2578 "#endif", 2579 Style); 2580 verifyFormat("#ifndef NOT_GUARD\n" 2581 "# define NOT_GUARD\n" 2582 "code();\n" 2583 "#endif\n" 2584 "code();", 2585 Style); 2586 // Test with trailing blank lines. 2587 verifyFormat("#ifndef HEADER_H\n" 2588 "#define HEADER_H\n" 2589 "code();\n" 2590 "#endif\n", 2591 Style); 2592 // Include guards don't have #else. 2593 verifyFormat("#ifndef NOT_GUARD\n" 2594 "# define NOT_GUARD\n" 2595 "code();\n" 2596 "#else\n" 2597 "#endif", 2598 Style); 2599 verifyFormat("#ifndef NOT_GUARD\n" 2600 "# define NOT_GUARD\n" 2601 "code();\n" 2602 "#elif FOO\n" 2603 "#endif", 2604 Style); 2605 // Non-identifier #define after potential include guard. 2606 verifyFormat("#ifndef FOO\n" 2607 "# define 1\n" 2608 "#endif\n", 2609 Style); 2610 // #if closes past last non-preprocessor line. 2611 verifyFormat("#ifndef FOO\n" 2612 "#define FOO\n" 2613 "#if 1\n" 2614 "int i;\n" 2615 "# define A 0\n" 2616 "#endif\n" 2617 "#endif\n", 2618 Style); 2619 // FIXME: This doesn't handle the case where there's code between the 2620 // #ifndef and #define but all other conditions hold. This is because when 2621 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 2622 // previous code line yet, so we can't detect it. 2623 EXPECT_EQ("#ifndef NOT_GUARD\n" 2624 "code();\n" 2625 "#define NOT_GUARD\n" 2626 "code();\n" 2627 "#endif", 2628 format("#ifndef NOT_GUARD\n" 2629 "code();\n" 2630 "# define NOT_GUARD\n" 2631 "code();\n" 2632 "#endif", 2633 Style)); 2634 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 2635 // be outside an include guard. Examples are #pragma once and 2636 // #pragma GCC diagnostic, or anything else that does not change the meaning 2637 // of the file if it's included multiple times. 2638 EXPECT_EQ("#ifdef WIN32\n" 2639 "# pragma once\n" 2640 "#endif\n" 2641 "#ifndef HEADER_H\n" 2642 "# define HEADER_H\n" 2643 "code();\n" 2644 "#endif", 2645 format("#ifdef WIN32\n" 2646 "# pragma once\n" 2647 "#endif\n" 2648 "#ifndef HEADER_H\n" 2649 "#define HEADER_H\n" 2650 "code();\n" 2651 "#endif", 2652 Style)); 2653 // FIXME: This does not detect when there is a single non-preprocessor line 2654 // in front of an include-guard-like structure where other conditions hold 2655 // because ScopedLineState hides the line. 2656 EXPECT_EQ("code();\n" 2657 "#ifndef HEADER_H\n" 2658 "#define HEADER_H\n" 2659 "code();\n" 2660 "#endif", 2661 format("code();\n" 2662 "#ifndef HEADER_H\n" 2663 "# define HEADER_H\n" 2664 "code();\n" 2665 "#endif", 2666 Style)); 2667 // Keep comments aligned with #, otherwise indent comments normally. These 2668 // tests cannot use verifyFormat because messUp manipulates leading 2669 // whitespace. 2670 { 2671 const char *Expected = "" 2672 "void f() {\n" 2673 "#if 1\n" 2674 "// Preprocessor aligned.\n" 2675 "# define A 0\n" 2676 " // Code. Separated by blank line.\n" 2677 "\n" 2678 "# define B 0\n" 2679 " // Code. Not aligned with #\n" 2680 "# define C 0\n" 2681 "#endif"; 2682 const char *ToFormat = "" 2683 "void f() {\n" 2684 "#if 1\n" 2685 "// Preprocessor aligned.\n" 2686 "# define A 0\n" 2687 "// Code. Separated by blank line.\n" 2688 "\n" 2689 "# define B 0\n" 2690 " // Code. Not aligned with #\n" 2691 "# define C 0\n" 2692 "#endif"; 2693 EXPECT_EQ(Expected, format(ToFormat, Style)); 2694 EXPECT_EQ(Expected, format(Expected, Style)); 2695 } 2696 // Keep block quotes aligned. 2697 { 2698 const char *Expected = "" 2699 "void f() {\n" 2700 "#if 1\n" 2701 "/* Preprocessor aligned. */\n" 2702 "# define A 0\n" 2703 " /* Code. Separated by blank line. */\n" 2704 "\n" 2705 "# define B 0\n" 2706 " /* Code. Not aligned with # */\n" 2707 "# define C 0\n" 2708 "#endif"; 2709 const char *ToFormat = "" 2710 "void f() {\n" 2711 "#if 1\n" 2712 "/* Preprocessor aligned. */\n" 2713 "# define A 0\n" 2714 "/* Code. Separated by blank line. */\n" 2715 "\n" 2716 "# define B 0\n" 2717 " /* Code. Not aligned with # */\n" 2718 "# define C 0\n" 2719 "#endif"; 2720 EXPECT_EQ(Expected, format(ToFormat, Style)); 2721 EXPECT_EQ(Expected, format(Expected, Style)); 2722 } 2723 // Keep comments aligned with un-indented directives. 2724 { 2725 const char *Expected = "" 2726 "void f() {\n" 2727 "// Preprocessor aligned.\n" 2728 "#define A 0\n" 2729 " // Code. Separated by blank line.\n" 2730 "\n" 2731 "#define B 0\n" 2732 " // Code. Not aligned with #\n" 2733 "#define C 0\n"; 2734 const char *ToFormat = "" 2735 "void f() {\n" 2736 "// Preprocessor aligned.\n" 2737 "#define A 0\n" 2738 "// Code. Separated by blank line.\n" 2739 "\n" 2740 "#define B 0\n" 2741 " // Code. Not aligned with #\n" 2742 "#define C 0\n"; 2743 EXPECT_EQ(Expected, format(ToFormat, Style)); 2744 EXPECT_EQ(Expected, format(Expected, Style)); 2745 } 2746 // Test with tabs. 2747 Style.UseTab = FormatStyle::UT_Always; 2748 Style.IndentWidth = 8; 2749 Style.TabWidth = 8; 2750 verifyFormat("#ifdef _WIN32\n" 2751 "#\tdefine A 0\n" 2752 "#\tifdef VAR2\n" 2753 "#\t\tdefine B 1\n" 2754 "#\t\tinclude <someheader.h>\n" 2755 "#\t\tdefine MACRO \\\n" 2756 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 2757 "#\tendif\n" 2758 "#else\n" 2759 "#\tdefine A 1\n" 2760 "#endif", 2761 Style); 2762 2763 // Regression test: Multiline-macro inside include guards. 2764 verifyFormat("#ifndef HEADER_H\n" 2765 "#define HEADER_H\n" 2766 "#define A() \\\n" 2767 " int i; \\\n" 2768 " int j;\n" 2769 "#endif // HEADER_H", 2770 getLLVMStyleWithColumns(20)); 2771 } 2772 2773 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 2774 verifyFormat("{\n { a #c; }\n}"); 2775 } 2776 2777 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 2778 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 2779 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 2780 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 2781 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 2782 } 2783 2784 TEST_F(FormatTest, EscapedNewlines) { 2785 FormatStyle Narrow = getLLVMStyleWithColumns(11); 2786 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 2787 format("#define A \\\nint i;\\\n int j;", Narrow)); 2788 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 2789 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 2790 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 2791 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 2792 2793 FormatStyle AlignLeft = getLLVMStyle(); 2794 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 2795 EXPECT_EQ("#define MACRO(x) \\\n" 2796 "private: \\\n" 2797 " int x(int a);\n", 2798 format("#define MACRO(x) \\\n" 2799 "private: \\\n" 2800 " int x(int a);\n", 2801 AlignLeft)); 2802 2803 // CRLF line endings 2804 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 2805 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 2806 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 2807 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 2808 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 2809 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 2810 EXPECT_EQ("#define MACRO(x) \\\r\n" 2811 "private: \\\r\n" 2812 " int x(int a);\r\n", 2813 format("#define MACRO(x) \\\r\n" 2814 "private: \\\r\n" 2815 " int x(int a);\r\n", 2816 AlignLeft)); 2817 2818 FormatStyle DontAlign = getLLVMStyle(); 2819 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 2820 DontAlign.MaxEmptyLinesToKeep = 3; 2821 // FIXME: can't use verifyFormat here because the newline before 2822 // "public:" is not inserted the first time it's reformatted 2823 EXPECT_EQ("#define A \\\n" 2824 " class Foo { \\\n" 2825 " void bar(); \\\n" 2826 "\\\n" 2827 "\\\n" 2828 "\\\n" 2829 " public: \\\n" 2830 " void baz(); \\\n" 2831 " };", 2832 format("#define A \\\n" 2833 " class Foo { \\\n" 2834 " void bar(); \\\n" 2835 "\\\n" 2836 "\\\n" 2837 "\\\n" 2838 " public: \\\n" 2839 " void baz(); \\\n" 2840 " };", 2841 DontAlign)); 2842 } 2843 2844 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 2845 verifyFormat("#define A \\\n" 2846 " int v( \\\n" 2847 " a); \\\n" 2848 " int i;", 2849 getLLVMStyleWithColumns(11)); 2850 } 2851 2852 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 2853 EXPECT_EQ( 2854 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2855 " \\\n" 2856 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 2857 "\n" 2858 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 2859 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 2860 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2861 "\\\n" 2862 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 2863 " \n" 2864 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 2865 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 2866 } 2867 2868 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 2869 EXPECT_EQ("int\n" 2870 "#define A\n" 2871 " a;", 2872 format("int\n#define A\na;")); 2873 verifyFormat("functionCallTo(\n" 2874 " someOtherFunction(\n" 2875 " withSomeParameters, whichInSequence,\n" 2876 " areLongerThanALine(andAnotherCall,\n" 2877 "#define A B\n" 2878 " withMoreParamters,\n" 2879 " whichStronglyInfluenceTheLayout),\n" 2880 " andMoreParameters),\n" 2881 " trailing);", 2882 getLLVMStyleWithColumns(69)); 2883 verifyFormat("Foo::Foo()\n" 2884 "#ifdef BAR\n" 2885 " : baz(0)\n" 2886 "#endif\n" 2887 "{\n" 2888 "}"); 2889 verifyFormat("void f() {\n" 2890 " if (true)\n" 2891 "#ifdef A\n" 2892 " f(42);\n" 2893 " x();\n" 2894 "#else\n" 2895 " g();\n" 2896 " x();\n" 2897 "#endif\n" 2898 "}"); 2899 verifyFormat("void f(param1, param2,\n" 2900 " param3,\n" 2901 "#ifdef A\n" 2902 " param4(param5,\n" 2903 "#ifdef A1\n" 2904 " param6,\n" 2905 "#ifdef A2\n" 2906 " param7),\n" 2907 "#else\n" 2908 " param8),\n" 2909 " param9,\n" 2910 "#endif\n" 2911 " param10,\n" 2912 "#endif\n" 2913 " param11)\n" 2914 "#else\n" 2915 " param12)\n" 2916 "#endif\n" 2917 "{\n" 2918 " x();\n" 2919 "}", 2920 getLLVMStyleWithColumns(28)); 2921 verifyFormat("#if 1\n" 2922 "int i;"); 2923 verifyFormat("#if 1\n" 2924 "#endif\n" 2925 "#if 1\n" 2926 "#else\n" 2927 "#endif\n"); 2928 verifyFormat("DEBUG({\n" 2929 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 2930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 2931 "});\n" 2932 "#if a\n" 2933 "#else\n" 2934 "#endif"); 2935 2936 verifyIncompleteFormat("void f(\n" 2937 "#if A\n" 2938 ");\n" 2939 "#else\n" 2940 "#endif"); 2941 } 2942 2943 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 2944 verifyFormat("#endif\n" 2945 "#if B"); 2946 } 2947 2948 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 2949 FormatStyle SingleLine = getLLVMStyle(); 2950 SingleLine.AllowShortIfStatementsOnASingleLine = true; 2951 verifyFormat("#if 0\n" 2952 "#elif 1\n" 2953 "#endif\n" 2954 "void foo() {\n" 2955 " if (test) foo2();\n" 2956 "}", 2957 SingleLine); 2958 } 2959 2960 TEST_F(FormatTest, LayoutBlockInsideParens) { 2961 verifyFormat("functionCall({ int i; });"); 2962 verifyFormat("functionCall({\n" 2963 " int i;\n" 2964 " int j;\n" 2965 "});"); 2966 verifyFormat("functionCall(\n" 2967 " {\n" 2968 " int i;\n" 2969 " int j;\n" 2970 " },\n" 2971 " aaaa, bbbb, cccc);"); 2972 verifyFormat("functionA(functionB({\n" 2973 " int i;\n" 2974 " int j;\n" 2975 " }),\n" 2976 " aaaa, bbbb, cccc);"); 2977 verifyFormat("functionCall(\n" 2978 " {\n" 2979 " int i;\n" 2980 " int j;\n" 2981 " },\n" 2982 " aaaa, bbbb, // comment\n" 2983 " cccc);"); 2984 verifyFormat("functionA(functionB({\n" 2985 " int i;\n" 2986 " int j;\n" 2987 " }),\n" 2988 " aaaa, bbbb, // comment\n" 2989 " cccc);"); 2990 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 2991 verifyFormat("functionCall(aaaa, bbbb, {\n" 2992 " int i;\n" 2993 " int j;\n" 2994 "});"); 2995 verifyFormat( 2996 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 2997 " {\n" 2998 " int i; // break\n" 2999 " },\n" 3000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3001 " ccccccccccccccccc));"); 3002 verifyFormat("DEBUG({\n" 3003 " if (a)\n" 3004 " f();\n" 3005 "});"); 3006 } 3007 3008 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3009 EXPECT_EQ("SOME_MACRO { int i; }\n" 3010 "int i;", 3011 format(" SOME_MACRO {int i;} int i;")); 3012 } 3013 3014 TEST_F(FormatTest, LayoutNestedBlocks) { 3015 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3016 " struct s {\n" 3017 " int i;\n" 3018 " };\n" 3019 " s kBitsToOs[] = {{10}};\n" 3020 " for (int i = 0; i < 10; ++i)\n" 3021 " return;\n" 3022 "}"); 3023 verifyFormat("call(parameter, {\n" 3024 " something();\n" 3025 " // Comment using all columns.\n" 3026 " somethingelse();\n" 3027 "});", 3028 getLLVMStyleWithColumns(40)); 3029 verifyFormat("DEBUG( //\n" 3030 " { f(); }, a);"); 3031 verifyFormat("DEBUG( //\n" 3032 " {\n" 3033 " f(); //\n" 3034 " },\n" 3035 " a);"); 3036 3037 EXPECT_EQ("call(parameter, {\n" 3038 " something();\n" 3039 " // Comment too\n" 3040 " // looooooooooong.\n" 3041 " somethingElse();\n" 3042 "});", 3043 format("call(parameter, {\n" 3044 " something();\n" 3045 " // Comment too looooooooooong.\n" 3046 " somethingElse();\n" 3047 "});", 3048 getLLVMStyleWithColumns(29))); 3049 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3050 EXPECT_EQ("DEBUG({ // comment\n" 3051 " int i;\n" 3052 "});", 3053 format("DEBUG({ // comment\n" 3054 "int i;\n" 3055 "});")); 3056 EXPECT_EQ("DEBUG({\n" 3057 " int i;\n" 3058 "\n" 3059 " // comment\n" 3060 " int j;\n" 3061 "});", 3062 format("DEBUG({\n" 3063 " int i;\n" 3064 "\n" 3065 " // comment\n" 3066 " int j;\n" 3067 "});")); 3068 3069 verifyFormat("DEBUG({\n" 3070 " if (a)\n" 3071 " return;\n" 3072 "});"); 3073 verifyGoogleFormat("DEBUG({\n" 3074 " if (a) return;\n" 3075 "});"); 3076 FormatStyle Style = getGoogleStyle(); 3077 Style.ColumnLimit = 45; 3078 verifyFormat("Debug(aaaaa,\n" 3079 " {\n" 3080 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3081 " },\n" 3082 " a);", 3083 Style); 3084 3085 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3086 3087 verifyNoCrash("^{v^{a}}"); 3088 } 3089 3090 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3091 EXPECT_EQ("#define MACRO() \\\n" 3092 " Debug(aaa, /* force line break */ \\\n" 3093 " { \\\n" 3094 " int i; \\\n" 3095 " int j; \\\n" 3096 " })", 3097 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3098 " { int i; int j; })", 3099 getGoogleStyle())); 3100 3101 EXPECT_EQ("#define A \\\n" 3102 " [] { \\\n" 3103 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3104 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3105 " }", 3106 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3107 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3108 getGoogleStyle())); 3109 } 3110 3111 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3112 EXPECT_EQ("{}", format("{}")); 3113 verifyFormat("enum E {};"); 3114 verifyFormat("enum E {}"); 3115 } 3116 3117 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 3118 FormatStyle Style = getLLVMStyle(); 3119 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 3120 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 3121 verifyFormat("FOO_BEGIN\n" 3122 " FOO_ENTRY\n" 3123 "FOO_END", Style); 3124 verifyFormat("FOO_BEGIN\n" 3125 " NESTED_FOO_BEGIN\n" 3126 " NESTED_FOO_ENTRY\n" 3127 " NESTED_FOO_END\n" 3128 "FOO_END", Style); 3129 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 3130 " int x;\n" 3131 " x = 1;\n" 3132 "FOO_END(Baz)", Style); 3133 } 3134 3135 //===----------------------------------------------------------------------===// 3136 // Line break tests. 3137 //===----------------------------------------------------------------------===// 3138 3139 TEST_F(FormatTest, PreventConfusingIndents) { 3140 verifyFormat( 3141 "void f() {\n" 3142 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 3143 " parameter, parameter, parameter)),\n" 3144 " SecondLongCall(parameter));\n" 3145 "}"); 3146 verifyFormat( 3147 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3148 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3150 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 3151 verifyFormat( 3152 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3153 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 3154 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 3155 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 3156 verifyFormat( 3157 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 3158 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 3159 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 3160 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 3161 verifyFormat("int a = bbbb && ccc &&\n" 3162 " fffff(\n" 3163 "#define A Just forcing a new line\n" 3164 " ddd);"); 3165 } 3166 3167 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 3168 verifyFormat( 3169 "bool aaaaaaa =\n" 3170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 3171 " bbbbbbbb();"); 3172 verifyFormat( 3173 "bool aaaaaaa =\n" 3174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 3175 " bbbbbbbb();"); 3176 3177 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 3179 " ccccccccc == ddddddddddd;"); 3180 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3181 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 3182 " ccccccccc == ddddddddddd;"); 3183 verifyFormat( 3184 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 3185 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 3186 " ccccccccc == ddddddddddd;"); 3187 3188 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3189 " aaaaaa) &&\n" 3190 " bbbbbb && cccccc;"); 3191 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3192 " aaaaaa) >>\n" 3193 " bbbbbb;"); 3194 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 3195 " SourceMgr.getSpellingColumnNumber(\n" 3196 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 3197 " 1);"); 3198 3199 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3200 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 3201 " cccccc) {\n}"); 3202 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3203 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3204 " cccccc) {\n}"); 3205 verifyFormat("b = a &&\n" 3206 " // Comment\n" 3207 " b.c && d;"); 3208 3209 // If the LHS of a comparison is not a binary expression itself, the 3210 // additional linebreak confuses many people. 3211 verifyFormat( 3212 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 3214 "}"); 3215 verifyFormat( 3216 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3218 "}"); 3219 verifyFormat( 3220 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 3221 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3222 "}"); 3223 verifyFormat( 3224 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 3226 "}"); 3227 // Even explicit parentheses stress the precedence enough to make the 3228 // additional break unnecessary. 3229 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3231 "}"); 3232 // This cases is borderline, but with the indentation it is still readable. 3233 verifyFormat( 3234 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3235 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 3237 "}", 3238 getLLVMStyleWithColumns(75)); 3239 3240 // If the LHS is a binary expression, we should still use the additional break 3241 // as otherwise the formatting hides the operator precedence. 3242 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3243 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3244 " 5) {\n" 3245 "}"); 3246 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3247 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 3248 " 5) {\n" 3249 "}"); 3250 3251 FormatStyle OnePerLine = getLLVMStyle(); 3252 OnePerLine.BinPackParameters = false; 3253 verifyFormat( 3254 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3256 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 3257 OnePerLine); 3258 3259 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 3260 " .aaa(aaaaaaaaaaaaa) *\n" 3261 " aaaaaaa +\n" 3262 " aaaaaaa;", 3263 getLLVMStyleWithColumns(40)); 3264 } 3265 3266 TEST_F(FormatTest, ExpressionIndentation) { 3267 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3271 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 3272 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 3273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3274 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 3275 " ccccccccccccccccccccccccccccccccccccccccc;"); 3276 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3277 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3279 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3280 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3282 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3283 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3284 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3285 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3287 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3288 verifyFormat("if () {\n" 3289 "} else if (aaaaa && bbbbb > // break\n" 3290 " ccccc) {\n" 3291 "}"); 3292 verifyFormat("if () {\n" 3293 "} else if (aaaaa &&\n" 3294 " bbbbb > // break\n" 3295 " ccccc &&\n" 3296 " ddddd) {\n" 3297 "}"); 3298 3299 // Presence of a trailing comment used to change indentation of b. 3300 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 3301 " b;\n" 3302 "return aaaaaaaaaaaaaaaaaaa +\n" 3303 " b; //", 3304 getLLVMStyleWithColumns(30)); 3305 } 3306 3307 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 3308 // Not sure what the best system is here. Like this, the LHS can be found 3309 // immediately above an operator (everything with the same or a higher 3310 // indent). The RHS is aligned right of the operator and so compasses 3311 // everything until something with the same indent as the operator is found. 3312 // FIXME: Is this a good system? 3313 FormatStyle Style = getLLVMStyle(); 3314 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 3315 verifyFormat( 3316 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3317 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3318 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3319 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3320 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3321 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3322 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3323 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3324 " > ccccccccccccccccccccccccccccccccccccccccc;", 3325 Style); 3326 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3327 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3328 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3329 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3330 Style); 3331 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3332 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3333 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3334 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3335 Style); 3336 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3337 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3338 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3339 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3340 Style); 3341 verifyFormat("if () {\n" 3342 "} else if (aaaaa\n" 3343 " && bbbbb // break\n" 3344 " > ccccc) {\n" 3345 "}", 3346 Style); 3347 verifyFormat("return (a)\n" 3348 " // comment\n" 3349 " + b;", 3350 Style); 3351 verifyFormat( 3352 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3353 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3354 " + cc;", 3355 Style); 3356 3357 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3358 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 3359 Style); 3360 3361 // Forced by comments. 3362 verifyFormat( 3363 "unsigned ContentSize =\n" 3364 " sizeof(int16_t) // DWARF ARange version number\n" 3365 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 3366 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 3367 " + sizeof(int8_t); // Segment Size (in bytes)"); 3368 3369 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 3370 " == boost::fusion::at_c<1>(iiii).second;", 3371 Style); 3372 3373 Style.ColumnLimit = 60; 3374 verifyFormat("zzzzzzzzzz\n" 3375 " = bbbbbbbbbbbbbbbbb\n" 3376 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 3377 Style); 3378 } 3379 3380 TEST_F(FormatTest, EnforcedOperatorWraps) { 3381 // Here we'd like to wrap after the || operators, but a comment is forcing an 3382 // earlier wrap. 3383 verifyFormat("bool x = aaaaa //\n" 3384 " || bbbbb\n" 3385 " //\n" 3386 " || cccc;"); 3387 } 3388 3389 TEST_F(FormatTest, NoOperandAlignment) { 3390 FormatStyle Style = getLLVMStyle(); 3391 Style.AlignOperands = false; 3392 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 3393 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3395 Style); 3396 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 3397 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3398 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3399 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3400 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3401 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3402 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3403 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3404 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3405 " > ccccccccccccccccccccccccccccccccccccccccc;", 3406 Style); 3407 3408 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3409 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3410 " + cc;", 3411 Style); 3412 verifyFormat("int a = aa\n" 3413 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3414 " * cccccccccccccccccccccccccccccccccccc;\n", 3415 Style); 3416 3417 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 3418 verifyFormat("return (a > b\n" 3419 " // comment1\n" 3420 " // comment2\n" 3421 " || c);", 3422 Style); 3423 } 3424 3425 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 3426 FormatStyle Style = getLLVMStyle(); 3427 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 3428 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 3429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3430 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 3431 Style); 3432 } 3433 3434 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 3435 FormatStyle Style = getLLVMStyle(); 3436 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 3437 Style.BinPackArguments = false; 3438 Style.ColumnLimit = 40; 3439 verifyFormat("void test() {\n" 3440 " someFunction(\n" 3441 " this + argument + is + quite\n" 3442 " + long + so + it + gets + wrapped\n" 3443 " + but + remains + bin - packed);\n" 3444 "}", 3445 Style); 3446 verifyFormat("void test() {\n" 3447 " someFunction(arg1,\n" 3448 " this + argument + is\n" 3449 " + quite + long + so\n" 3450 " + it + gets + wrapped\n" 3451 " + but + remains + bin\n" 3452 " - packed,\n" 3453 " arg3);\n" 3454 "}", 3455 Style); 3456 verifyFormat("void test() {\n" 3457 " someFunction(\n" 3458 " arg1,\n" 3459 " this + argument + has\n" 3460 " + anotherFunc(nested,\n" 3461 " calls + whose\n" 3462 " + arguments\n" 3463 " + are + also\n" 3464 " + wrapped,\n" 3465 " in + addition)\n" 3466 " + to + being + bin - packed,\n" 3467 " arg3);\n" 3468 "}", 3469 Style); 3470 3471 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 3472 verifyFormat("void test() {\n" 3473 " someFunction(\n" 3474 " arg1,\n" 3475 " this + argument + has +\n" 3476 " anotherFunc(nested,\n" 3477 " calls + whose +\n" 3478 " arguments +\n" 3479 " are + also +\n" 3480 " wrapped,\n" 3481 " in + addition) +\n" 3482 " to + being + bin - packed,\n" 3483 " arg3);\n" 3484 "}", 3485 Style); 3486 } 3487 3488 TEST_F(FormatTest, ConstructorInitializers) { 3489 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 3490 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 3491 getLLVMStyleWithColumns(45)); 3492 verifyFormat("Constructor()\n" 3493 " : Inttializer(FitsOnTheLine) {}", 3494 getLLVMStyleWithColumns(44)); 3495 verifyFormat("Constructor()\n" 3496 " : Inttializer(FitsOnTheLine) {}", 3497 getLLVMStyleWithColumns(43)); 3498 3499 verifyFormat("template <typename T>\n" 3500 "Constructor() : Initializer(FitsOnTheLine) {}", 3501 getLLVMStyleWithColumns(45)); 3502 3503 verifyFormat( 3504 "SomeClass::Constructor()\n" 3505 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 3506 3507 verifyFormat( 3508 "SomeClass::Constructor()\n" 3509 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 3510 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 3511 verifyFormat( 3512 "SomeClass::Constructor()\n" 3513 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3514 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 3515 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3516 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 3517 " : aaaaaaaaaa(aaaaaa) {}"); 3518 3519 verifyFormat("Constructor()\n" 3520 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3521 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3522 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3523 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 3524 3525 verifyFormat("Constructor()\n" 3526 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 3528 3529 verifyFormat("Constructor(int Parameter = 0)\n" 3530 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 3531 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 3532 verifyFormat("Constructor()\n" 3533 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 3534 "}", 3535 getLLVMStyleWithColumns(60)); 3536 verifyFormat("Constructor()\n" 3537 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3538 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 3539 3540 // Here a line could be saved by splitting the second initializer onto two 3541 // lines, but that is not desirable. 3542 verifyFormat("Constructor()\n" 3543 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 3544 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 3545 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 3546 3547 FormatStyle OnePerLine = getLLVMStyle(); 3548 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 3549 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 3550 verifyFormat("SomeClass::Constructor()\n" 3551 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 3552 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 3553 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 3554 OnePerLine); 3555 verifyFormat("SomeClass::Constructor()\n" 3556 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 3557 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 3558 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 3559 OnePerLine); 3560 verifyFormat("MyClass::MyClass(int var)\n" 3561 " : some_var_(var), // 4 space indent\n" 3562 " some_other_var_(var + 1) { // lined up\n" 3563 "}", 3564 OnePerLine); 3565 verifyFormat("Constructor()\n" 3566 " : aaaaa(aaaaaa),\n" 3567 " aaaaa(aaaaaa),\n" 3568 " aaaaa(aaaaaa),\n" 3569 " aaaaa(aaaaaa),\n" 3570 " aaaaa(aaaaaa) {}", 3571 OnePerLine); 3572 verifyFormat("Constructor()\n" 3573 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 3574 " aaaaaaaaaaaaaaaaaaaaaa) {}", 3575 OnePerLine); 3576 OnePerLine.BinPackParameters = false; 3577 verifyFormat( 3578 "Constructor()\n" 3579 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3580 " aaaaaaaaaaa().aaa(),\n" 3581 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 3582 OnePerLine); 3583 OnePerLine.ColumnLimit = 60; 3584 verifyFormat("Constructor()\n" 3585 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 3586 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 3587 OnePerLine); 3588 3589 EXPECT_EQ("Constructor()\n" 3590 " : // Comment forcing unwanted break.\n" 3591 " aaaa(aaaa) {}", 3592 format("Constructor() :\n" 3593 " // Comment forcing unwanted break.\n" 3594 " aaaa(aaaa) {}")); 3595 } 3596 3597 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 3598 FormatStyle Style = getLLVMStyle(); 3599 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 3600 3601 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 3602 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 3603 getStyleWithColumns(Style, 45)); 3604 verifyFormat("Constructor() :\n" 3605 " Initializer(FitsOnTheLine) {}", 3606 getStyleWithColumns(Style, 44)); 3607 verifyFormat("Constructor() :\n" 3608 " Initializer(FitsOnTheLine) {}", 3609 getStyleWithColumns(Style, 43)); 3610 3611 verifyFormat("template <typename T>\n" 3612 "Constructor() : Initializer(FitsOnTheLine) {}", 3613 getStyleWithColumns(Style, 50)); 3614 3615 verifyFormat( 3616 "SomeClass::Constructor() :\n" 3617 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 3618 Style); 3619 3620 verifyFormat( 3621 "SomeClass::Constructor() :\n" 3622 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 3623 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 3624 Style); 3625 verifyFormat( 3626 "SomeClass::Constructor() :\n" 3627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3628 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 3629 Style); 3630 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3631 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 3632 " aaaaaaaaaa(aaaaaa) {}", 3633 Style); 3634 3635 verifyFormat("Constructor() :\n" 3636 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3637 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3638 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3639 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 3640 Style); 3641 3642 verifyFormat("Constructor() :\n" 3643 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 3645 Style); 3646 3647 verifyFormat("Constructor(int Parameter = 0) :\n" 3648 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 3649 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 3650 Style); 3651 verifyFormat("Constructor() :\n" 3652 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 3653 "}", 3654 getStyleWithColumns(Style, 60)); 3655 verifyFormat("Constructor() :\n" 3656 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3657 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 3658 Style); 3659 3660 // Here a line could be saved by splitting the second initializer onto two 3661 // lines, but that is not desirable. 3662 verifyFormat("Constructor() :\n" 3663 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 3664 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 3665 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 3666 Style); 3667 3668 FormatStyle OnePerLine = Style; 3669 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 3670 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 3671 verifyFormat("SomeClass::Constructor() :\n" 3672 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 3673 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 3674 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 3675 OnePerLine); 3676 verifyFormat("SomeClass::Constructor() :\n" 3677 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 3678 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 3679 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 3680 OnePerLine); 3681 verifyFormat("MyClass::MyClass(int var) :\n" 3682 " some_var_(var), // 4 space indent\n" 3683 " some_other_var_(var + 1) { // lined up\n" 3684 "}", 3685 OnePerLine); 3686 verifyFormat("Constructor() :\n" 3687 " aaaaa(aaaaaa),\n" 3688 " aaaaa(aaaaaa),\n" 3689 " aaaaa(aaaaaa),\n" 3690 " aaaaa(aaaaaa),\n" 3691 " aaaaa(aaaaaa) {}", 3692 OnePerLine); 3693 verifyFormat("Constructor() :\n" 3694 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 3695 " aaaaaaaaaaaaaaaaaaaaaa) {}", 3696 OnePerLine); 3697 OnePerLine.BinPackParameters = false; 3698 verifyFormat( 3699 "Constructor() :\n" 3700 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3701 " aaaaaaaaaaa().aaa(),\n" 3702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 3703 OnePerLine); 3704 OnePerLine.ColumnLimit = 60; 3705 verifyFormat("Constructor() :\n" 3706 " aaaaaaaaaaaaaaaaaaaa(a),\n" 3707 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 3708 OnePerLine); 3709 3710 EXPECT_EQ("Constructor() :\n" 3711 " // Comment forcing unwanted break.\n" 3712 " aaaa(aaaa) {}", 3713 format("Constructor() :\n" 3714 " // Comment forcing unwanted break.\n" 3715 " aaaa(aaaa) {}", 3716 Style)); 3717 3718 Style.ColumnLimit = 0; 3719 verifyFormat("SomeClass::Constructor() :\n" 3720 " a(a) {}", 3721 Style); 3722 verifyFormat("SomeClass::Constructor() noexcept :\n" 3723 " a(a) {}", 3724 Style); 3725 verifyFormat("SomeClass::Constructor() :\n" 3726 " a(a), b(b), c(c) {}", 3727 Style); 3728 verifyFormat("SomeClass::Constructor() :\n" 3729 " a(a) {\n" 3730 " foo();\n" 3731 " bar();\n" 3732 "}", 3733 Style); 3734 3735 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 3736 verifyFormat("SomeClass::Constructor() :\n" 3737 " a(a), b(b), c(c) {\n" 3738 "}", 3739 Style); 3740 verifyFormat("SomeClass::Constructor() :\n" 3741 " a(a) {\n" 3742 "}", 3743 Style); 3744 3745 Style.ColumnLimit = 80; 3746 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 3747 Style.ConstructorInitializerIndentWidth = 2; 3748 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", 3749 Style); 3750 verifyFormat("SomeClass::Constructor() :\n" 3751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3752 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 3753 Style); 3754 3755 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well 3756 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 3757 verifyFormat("class SomeClass\n" 3758 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3759 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 3760 Style); 3761 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 3762 verifyFormat("class SomeClass\n" 3763 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3764 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 3765 Style); 3766 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 3767 verifyFormat("class SomeClass :\n" 3768 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3769 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 3770 Style); 3771 } 3772 3773 #ifndef EXPENSIVE_CHECKS 3774 // Expensive checks enables libstdc++ checking which includes validating the 3775 // state of ranges used in std::priority_queue - this blows out the 3776 // runtime/scalability of the function and makes this test unacceptably slow. 3777 TEST_F(FormatTest, MemoizationTests) { 3778 // This breaks if the memoization lookup does not take \c Indent and 3779 // \c LastSpace into account. 3780 verifyFormat( 3781 "extern CFRunLoopTimerRef\n" 3782 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 3783 " CFTimeInterval interval, CFOptionFlags flags,\n" 3784 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 3785 " CFRunLoopTimerContext *context) {}"); 3786 3787 // Deep nesting somewhat works around our memoization. 3788 verifyFormat( 3789 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 3790 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 3791 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 3792 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 3793 " aaaaa())))))))))))))))))))))))))))))))))))))));", 3794 getLLVMStyleWithColumns(65)); 3795 verifyFormat( 3796 "aaaaa(\n" 3797 " aaaaa,\n" 3798 " aaaaa(\n" 3799 " aaaaa,\n" 3800 " aaaaa(\n" 3801 " aaaaa,\n" 3802 " aaaaa(\n" 3803 " aaaaa,\n" 3804 " aaaaa(\n" 3805 " aaaaa,\n" 3806 " aaaaa(\n" 3807 " aaaaa,\n" 3808 " aaaaa(\n" 3809 " aaaaa,\n" 3810 " aaaaa(\n" 3811 " aaaaa,\n" 3812 " aaaaa(\n" 3813 " aaaaa,\n" 3814 " aaaaa(\n" 3815 " aaaaa,\n" 3816 " aaaaa(\n" 3817 " aaaaa,\n" 3818 " aaaaa(\n" 3819 " aaaaa,\n" 3820 " aaaaa))))))))))));", 3821 getLLVMStyleWithColumns(65)); 3822 verifyFormat( 3823 "a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(), a), a), a), a),\n" 3824 " a),\n" 3825 " a),\n" 3826 " a),\n" 3827 " a),\n" 3828 " a),\n" 3829 " a),\n" 3830 " a),\n" 3831 " a),\n" 3832 " a),\n" 3833 " a),\n" 3834 " a),\n" 3835 " a),\n" 3836 " a),\n" 3837 " a),\n" 3838 " a),\n" 3839 " a),\n" 3840 " a)", 3841 getLLVMStyleWithColumns(65)); 3842 3843 // This test takes VERY long when memoization is broken. 3844 FormatStyle OnePerLine = getLLVMStyle(); 3845 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 3846 OnePerLine.BinPackParameters = false; 3847 std::string input = "Constructor()\n" 3848 " : aaaa(a,\n"; 3849 for (unsigned i = 0, e = 80; i != e; ++i) { 3850 input += " a,\n"; 3851 } 3852 input += " a) {}"; 3853 verifyFormat(input, OnePerLine); 3854 } 3855 #endif 3856 3857 TEST_F(FormatTest, BreaksAsHighAsPossible) { 3858 verifyFormat( 3859 "void f() {\n" 3860 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 3861 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 3862 " f();\n" 3863 "}"); 3864 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 3865 " Intervals[i - 1].getRange().getLast()) {\n}"); 3866 } 3867 3868 TEST_F(FormatTest, BreaksFunctionDeclarations) { 3869 // Principially, we break function declarations in a certain order: 3870 // 1) break amongst arguments. 3871 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 3872 " Cccccccccccccc cccccccccccccc);"); 3873 verifyFormat("template <class TemplateIt>\n" 3874 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 3875 " TemplateIt *stop) {}"); 3876 3877 // 2) break after return type. 3878 verifyFormat( 3879 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3880 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 3881 getGoogleStyle()); 3882 3883 // 3) break after (. 3884 verifyFormat( 3885 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 3886 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 3887 getGoogleStyle()); 3888 3889 // 4) break before after nested name specifiers. 3890 verifyFormat( 3891 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3892 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 3893 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 3894 getGoogleStyle()); 3895 3896 // However, there are exceptions, if a sufficient amount of lines can be 3897 // saved. 3898 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 3899 // more adjusting. 3900 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 3901 " Cccccccccccccc cccccccccc,\n" 3902 " Cccccccccccccc cccccccccc,\n" 3903 " Cccccccccccccc cccccccccc,\n" 3904 " Cccccccccccccc cccccccccc);"); 3905 verifyFormat( 3906 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3907 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 3908 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 3909 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 3910 getGoogleStyle()); 3911 verifyFormat( 3912 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 3913 " Cccccccccccccc cccccccccc,\n" 3914 " Cccccccccccccc cccccccccc,\n" 3915 " Cccccccccccccc cccccccccc,\n" 3916 " Cccccccccccccc cccccccccc,\n" 3917 " Cccccccccccccc cccccccccc,\n" 3918 " Cccccccccccccc cccccccccc);"); 3919 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 3920 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 3921 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 3922 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 3923 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 3924 3925 // Break after multi-line parameters. 3926 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3927 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3929 " bbbb bbbb);"); 3930 verifyFormat("void SomeLoooooooooooongFunction(\n" 3931 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 3932 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 3933 " int bbbbbbbbbbbbb);"); 3934 3935 // Treat overloaded operators like other functions. 3936 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 3937 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 3938 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 3939 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 3940 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 3941 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 3942 verifyGoogleFormat( 3943 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 3944 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 3945 verifyGoogleFormat( 3946 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 3947 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 3948 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3949 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 3950 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 3951 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 3952 verifyGoogleFormat( 3953 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 3954 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3955 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 3956 verifyGoogleFormat( 3957 "template <typename T>\n" 3958 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3959 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 3960 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 3961 3962 FormatStyle Style = getLLVMStyle(); 3963 Style.PointerAlignment = FormatStyle::PAS_Left; 3964 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3965 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 3966 Style); 3967 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 3968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 3969 Style); 3970 } 3971 3972 TEST_F(FormatTest, TrailingReturnType) { 3973 verifyFormat("auto foo() -> int;\n"); 3974 verifyFormat("struct S {\n" 3975 " auto bar() const -> int;\n" 3976 "};"); 3977 verifyFormat("template <size_t Order, typename T>\n" 3978 "auto load_img(const std::string &filename)\n" 3979 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 3980 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 3981 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 3982 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 3983 verifyFormat("template <typename T>\n" 3984 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 3985 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 3986 3987 // Not trailing return types. 3988 verifyFormat("void f() { auto a = b->c(); }"); 3989 } 3990 3991 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 3992 // Avoid breaking before trailing 'const' or other trailing annotations, if 3993 // they are not function-like. 3994 FormatStyle Style = getGoogleStyle(); 3995 Style.ColumnLimit = 47; 3996 verifyFormat("void someLongFunction(\n" 3997 " int someLoooooooooooooongParameter) const {\n}", 3998 getLLVMStyleWithColumns(47)); 3999 verifyFormat("LoooooongReturnType\n" 4000 "someLoooooooongFunction() const {}", 4001 getLLVMStyleWithColumns(47)); 4002 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 4003 " const {}", 4004 Style); 4005 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4006 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 4007 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4008 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 4009 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4010 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 4011 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 4012 " aaaaaaaaaaa aaaaa) const override;"); 4013 verifyGoogleFormat( 4014 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4015 " const override;"); 4016 4017 // Even if the first parameter has to be wrapped. 4018 verifyFormat("void someLongFunction(\n" 4019 " int someLongParameter) const {}", 4020 getLLVMStyleWithColumns(46)); 4021 verifyFormat("void someLongFunction(\n" 4022 " int someLongParameter) const {}", 4023 Style); 4024 verifyFormat("void someLongFunction(\n" 4025 " int someLongParameter) override {}", 4026 Style); 4027 verifyFormat("void someLongFunction(\n" 4028 " int someLongParameter) OVERRIDE {}", 4029 Style); 4030 verifyFormat("void someLongFunction(\n" 4031 " int someLongParameter) final {}", 4032 Style); 4033 verifyFormat("void someLongFunction(\n" 4034 " int someLongParameter) FINAL {}", 4035 Style); 4036 verifyFormat("void someLongFunction(\n" 4037 " int parameter) const override {}", 4038 Style); 4039 4040 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 4041 verifyFormat("void someLongFunction(\n" 4042 " int someLongParameter) const\n" 4043 "{\n" 4044 "}", 4045 Style); 4046 4047 // Unless these are unknown annotations. 4048 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 4049 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4050 " LONG_AND_UGLY_ANNOTATION;"); 4051 4052 // Breaking before function-like trailing annotations is fine to keep them 4053 // close to their arguments. 4054 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4055 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4056 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4057 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4058 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4059 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 4060 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 4061 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 4062 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 4063 4064 verifyFormat( 4065 "void aaaaaaaaaaaaaaaaaa()\n" 4066 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 4067 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 4068 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4069 " __attribute__((unused));"); 4070 verifyGoogleFormat( 4071 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4072 " GUARDED_BY(aaaaaaaaaaaa);"); 4073 verifyGoogleFormat( 4074 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4075 " GUARDED_BY(aaaaaaaaaaaa);"); 4076 verifyGoogleFormat( 4077 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4078 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4079 verifyGoogleFormat( 4080 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4081 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4082 } 4083 4084 TEST_F(FormatTest, FunctionAnnotations) { 4085 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4086 "int OldFunction(const string ¶meter) {}"); 4087 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4088 "string OldFunction(const string ¶meter) {}"); 4089 verifyFormat("template <typename T>\n" 4090 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4091 "string OldFunction(const string ¶meter) {}"); 4092 4093 // Not function annotations. 4094 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4095 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 4096 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 4097 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 4098 verifyFormat("MACRO(abc).function() // wrap\n" 4099 " << abc;"); 4100 verifyFormat("MACRO(abc)->function() // wrap\n" 4101 " << abc;"); 4102 verifyFormat("MACRO(abc)::function() // wrap\n" 4103 " << abc;"); 4104 } 4105 4106 TEST_F(FormatTest, BreaksDesireably) { 4107 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4108 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4109 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 4110 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4111 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 4112 "}"); 4113 4114 verifyFormat( 4115 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4117 4118 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4121 4122 verifyFormat( 4123 "aaaaaaaa(aaaaaaaaaaaaa,\n" 4124 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 4126 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4127 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 4128 4129 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4130 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4131 4132 verifyFormat( 4133 "void f() {\n" 4134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 4135 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 4136 "}"); 4137 verifyFormat( 4138 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4139 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4140 verifyFormat( 4141 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4143 verifyFormat( 4144 "aaaaaa(aaa,\n" 4145 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4146 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4147 " aaaa);"); 4148 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4151 4152 // Indent consistently independent of call expression and unary operator. 4153 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4154 " dddddddddddddddddddddddddddddd));"); 4155 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4156 " dddddddddddddddddddddddddddddd));"); 4157 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 4158 " dddddddddddddddddddddddddddddd));"); 4159 4160 // This test case breaks on an incorrect memoization, i.e. an optimization not 4161 // taking into account the StopAt value. 4162 verifyFormat( 4163 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4164 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4165 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4166 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4167 4168 verifyFormat("{\n {\n {\n" 4169 " Annotation.SpaceRequiredBefore =\n" 4170 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 4171 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 4172 " }\n }\n}"); 4173 4174 // Break on an outer level if there was a break on an inner level. 4175 EXPECT_EQ("f(g(h(a, // comment\n" 4176 " b, c),\n" 4177 " d, e),\n" 4178 " x, y);", 4179 format("f(g(h(a, // comment\n" 4180 " b, c), d, e), x, y);")); 4181 4182 // Prefer breaking similar line breaks. 4183 verifyFormat( 4184 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 4185 " NSTrackingMouseEnteredAndExited |\n" 4186 " NSTrackingActiveAlways;"); 4187 } 4188 4189 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 4190 FormatStyle NoBinPacking = getGoogleStyle(); 4191 NoBinPacking.BinPackParameters = false; 4192 NoBinPacking.BinPackArguments = true; 4193 verifyFormat("void f() {\n" 4194 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 4195 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 4196 "}", 4197 NoBinPacking); 4198 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 4199 " int aaaaaaaaaaaaaaaaaaaa,\n" 4200 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4201 NoBinPacking); 4202 4203 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 4204 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4205 " vector<int> bbbbbbbbbbbbbbb);", 4206 NoBinPacking); 4207 // FIXME: This behavior difference is probably not wanted. However, currently 4208 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 4209 // template arguments from BreakBeforeParameter being set because of the 4210 // one-per-line formatting. 4211 verifyFormat( 4212 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 4213 " aaaaaaaaaa> aaaaaaaaaa);", 4214 NoBinPacking); 4215 verifyFormat( 4216 "void fffffffffff(\n" 4217 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 4218 " aaaaaaaaaa);"); 4219 } 4220 4221 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 4222 FormatStyle NoBinPacking = getGoogleStyle(); 4223 NoBinPacking.BinPackParameters = false; 4224 NoBinPacking.BinPackArguments = false; 4225 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 4226 " aaaaaaaaaaaaaaaaaaaa,\n" 4227 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 4228 NoBinPacking); 4229 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 4230 " aaaaaaaaaaaaa,\n" 4231 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 4232 NoBinPacking); 4233 verifyFormat( 4234 "aaaaaaaa(aaaaaaaaaaaaa,\n" 4235 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 4237 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4238 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 4239 NoBinPacking); 4240 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 4241 " .aaaaaaaaaaaaaaaaaa();", 4242 NoBinPacking); 4243 verifyFormat("void f() {\n" 4244 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4245 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 4246 "}", 4247 NoBinPacking); 4248 4249 verifyFormat( 4250 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4251 " aaaaaaaaaaaa,\n" 4252 " aaaaaaaaaaaa);", 4253 NoBinPacking); 4254 verifyFormat( 4255 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 4256 " ddddddddddddddddddddddddddddd),\n" 4257 " test);", 4258 NoBinPacking); 4259 4260 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 4261 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 4262 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 4263 " aaaaaaaaaaaaaaaaaa;", 4264 NoBinPacking); 4265 verifyFormat("a(\"a\"\n" 4266 " \"a\",\n" 4267 " a);"); 4268 4269 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 4270 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 4271 " aaaaaaaaa,\n" 4272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4273 NoBinPacking); 4274 verifyFormat( 4275 "void f() {\n" 4276 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 4277 " .aaaaaaa();\n" 4278 "}", 4279 NoBinPacking); 4280 verifyFormat( 4281 "template <class SomeType, class SomeOtherType>\n" 4282 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 4283 NoBinPacking); 4284 } 4285 4286 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 4287 FormatStyle Style = getLLVMStyleWithColumns(15); 4288 Style.ExperimentalAutoDetectBinPacking = true; 4289 EXPECT_EQ("aaa(aaaa,\n" 4290 " aaaa,\n" 4291 " aaaa);\n" 4292 "aaa(aaaa,\n" 4293 " aaaa,\n" 4294 " aaaa);", 4295 format("aaa(aaaa,\n" // one-per-line 4296 " aaaa,\n" 4297 " aaaa );\n" 4298 "aaa(aaaa, aaaa, aaaa);", // inconclusive 4299 Style)); 4300 EXPECT_EQ("aaa(aaaa, aaaa,\n" 4301 " aaaa);\n" 4302 "aaa(aaaa, aaaa,\n" 4303 " aaaa);", 4304 format("aaa(aaaa, aaaa,\n" // bin-packed 4305 " aaaa );\n" 4306 "aaa(aaaa, aaaa, aaaa);", // inconclusive 4307 Style)); 4308 } 4309 4310 TEST_F(FormatTest, FormatsBuilderPattern) { 4311 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 4312 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 4313 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 4314 " .StartsWith(\".init\", ORDER_INIT)\n" 4315 " .StartsWith(\".fini\", ORDER_FINI)\n" 4316 " .StartsWith(\".hash\", ORDER_HASH)\n" 4317 " .Default(ORDER_TEXT);\n"); 4318 4319 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 4320 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 4321 verifyFormat( 4322 "aaaaaaa->aaaaaaa\n" 4323 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4324 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4325 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 4326 verifyFormat( 4327 "aaaaaaa->aaaaaaa\n" 4328 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4329 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 4330 verifyFormat( 4331 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 4332 " aaaaaaaaaaaaaa);"); 4333 verifyFormat( 4334 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 4335 " aaaaaa->aaaaaaaaaaaa()\n" 4336 " ->aaaaaaaaaaaaaaaa(\n" 4337 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4338 " ->aaaaaaaaaaaaaaaaa();"); 4339 verifyGoogleFormat( 4340 "void f() {\n" 4341 " someo->Add((new util::filetools::Handler(dir))\n" 4342 " ->OnEvent1(NewPermanentCallback(\n" 4343 " this, &HandlerHolderClass::EventHandlerCBA))\n" 4344 " ->OnEvent2(NewPermanentCallback(\n" 4345 " this, &HandlerHolderClass::EventHandlerCBB))\n" 4346 " ->OnEvent3(NewPermanentCallback(\n" 4347 " this, &HandlerHolderClass::EventHandlerCBC))\n" 4348 " ->OnEvent5(NewPermanentCallback(\n" 4349 " this, &HandlerHolderClass::EventHandlerCBD))\n" 4350 " ->OnEvent6(NewPermanentCallback(\n" 4351 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 4352 "}"); 4353 4354 verifyFormat( 4355 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 4356 verifyFormat("aaaaaaaaaaaaaaa()\n" 4357 " .aaaaaaaaaaaaaaa()\n" 4358 " .aaaaaaaaaaaaaaa()\n" 4359 " .aaaaaaaaaaaaaaa()\n" 4360 " .aaaaaaaaaaaaaaa();"); 4361 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 4362 " .aaaaaaaaaaaaaaa()\n" 4363 " .aaaaaaaaaaaaaaa()\n" 4364 " .aaaaaaaaaaaaaaa();"); 4365 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 4366 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 4367 " .aaaaaaaaaaaaaaa();"); 4368 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 4369 " ->aaaaaaaaaaaaaae(0)\n" 4370 " ->aaaaaaaaaaaaaaa();"); 4371 4372 // Don't linewrap after very short segments. 4373 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4374 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4375 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4376 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4377 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4378 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4379 verifyFormat("aaa()\n" 4380 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4381 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4382 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 4383 4384 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 4385 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4386 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 4387 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 4388 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 4389 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 4390 4391 // Prefer not to break after empty parentheses. 4392 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 4393 " First->LastNewlineOffset);"); 4394 4395 // Prefer not to create "hanging" indents. 4396 verifyFormat( 4397 "return !soooooooooooooome_map\n" 4398 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4399 " .second;"); 4400 verifyFormat( 4401 "return aaaaaaaaaaaaaaaa\n" 4402 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 4403 " .aaaa(aaaaaaaaaaaaaa);"); 4404 // No hanging indent here. 4405 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 4406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4407 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 4408 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4409 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 4410 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4411 getLLVMStyleWithColumns(60)); 4412 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 4413 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 4414 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4415 getLLVMStyleWithColumns(59)); 4416 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4418 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4419 } 4420 4421 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 4422 verifyFormat( 4423 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4424 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 4425 verifyFormat( 4426 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 4427 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 4428 4429 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 4430 " ccccccccccccccccccccccccc) {\n}"); 4431 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 4432 " ccccccccccccccccccccccccc) {\n}"); 4433 4434 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 4435 " ccccccccccccccccccccccccc) {\n}"); 4436 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 4437 " ccccccccccccccccccccccccc) {\n}"); 4438 4439 verifyFormat( 4440 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 4441 " ccccccccccccccccccccccccc) {\n}"); 4442 verifyFormat( 4443 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 4444 " ccccccccccccccccccccccccc) {\n}"); 4445 4446 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 4447 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 4448 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 4449 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 4450 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 4451 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 4452 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 4453 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 4454 4455 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 4456 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 4457 " aaaaaaaaaaaaaaa != aa) {\n}"); 4458 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 4459 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 4460 " aaaaaaaaaaaaaaa != aa) {\n}"); 4461 } 4462 4463 TEST_F(FormatTest, BreaksAfterAssignments) { 4464 verifyFormat( 4465 "unsigned Cost =\n" 4466 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 4467 " SI->getPointerAddressSpaceee());\n"); 4468 verifyFormat( 4469 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 4470 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 4471 4472 verifyFormat( 4473 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 4474 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 4475 verifyFormat("unsigned OriginalStartColumn =\n" 4476 " SourceMgr.getSpellingColumnNumber(\n" 4477 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 4478 " 1;"); 4479 } 4480 4481 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 4482 FormatStyle Style = getLLVMStyle(); 4483 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4484 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 4485 Style); 4486 4487 Style.PenaltyBreakAssignment = 20; 4488 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4489 " cccccccccccccccccccccccccc;", 4490 Style); 4491 } 4492 4493 TEST_F(FormatTest, AlignsAfterAssignments) { 4494 verifyFormat( 4495 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4496 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4497 verifyFormat( 4498 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4499 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4500 verifyFormat( 4501 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4502 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4503 verifyFormat( 4504 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4505 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 4506 verifyFormat( 4507 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 4508 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 4509 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 4510 } 4511 4512 TEST_F(FormatTest, AlignsAfterReturn) { 4513 verifyFormat( 4514 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4515 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4516 verifyFormat( 4517 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4518 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 4519 verifyFormat( 4520 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 4521 " aaaaaaaaaaaaaaaaaaaaaa();"); 4522 verifyFormat( 4523 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 4524 " aaaaaaaaaaaaaaaaaaaaaa());"); 4525 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4527 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4528 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 4529 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4530 verifyFormat("return\n" 4531 " // true if code is one of a or b.\n" 4532 " code == a || code == b;"); 4533 } 4534 4535 TEST_F(FormatTest, AlignsAfterOpenBracket) { 4536 verifyFormat( 4537 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 4538 " aaaaaaaaa aaaaaaa) {}"); 4539 verifyFormat( 4540 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 4541 " aaaaaaaaaaa aaaaaaaaa);"); 4542 verifyFormat( 4543 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 4544 " aaaaaaaaaaaaaaaaaaaaa));"); 4545 FormatStyle Style = getLLVMStyle(); 4546 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4547 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4548 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 4549 Style); 4550 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 4551 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 4552 Style); 4553 verifyFormat("SomeLongVariableName->someFunction(\n" 4554 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 4555 Style); 4556 verifyFormat( 4557 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 4558 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4559 Style); 4560 verifyFormat( 4561 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 4562 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4563 Style); 4564 verifyFormat( 4565 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 4566 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 4567 Style); 4568 4569 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 4570 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 4571 " b));", 4572 Style); 4573 4574 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 4575 Style.BinPackArguments = false; 4576 Style.BinPackParameters = false; 4577 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4578 " aaaaaaaaaaa aaaaaaaa,\n" 4579 " aaaaaaaaa aaaaaaa,\n" 4580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4581 Style); 4582 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 4583 " aaaaaaaaaaa aaaaaaaaa,\n" 4584 " aaaaaaaaaaa aaaaaaaaa,\n" 4585 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4586 Style); 4587 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 4588 " aaaaaaaaaaaaaaa,\n" 4589 " aaaaaaaaaaaaaaaaaaaaa,\n" 4590 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 4591 Style); 4592 verifyFormat( 4593 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 4594 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 4595 Style); 4596 verifyFormat( 4597 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 4598 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 4599 Style); 4600 verifyFormat( 4601 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4602 " aaaaaaaaaaaaaaaaaaaaa(\n" 4603 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 4604 " aaaaaaaaaaaaaaaa);", 4605 Style); 4606 verifyFormat( 4607 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4608 " aaaaaaaaaaaaaaaaaaaaa(\n" 4609 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 4610 " aaaaaaaaaaaaaaaa);", 4611 Style); 4612 } 4613 4614 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 4615 FormatStyle Style = getLLVMStyleWithColumns(40); 4616 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 4617 " bbbbbbbbbbbbbbbbbbbbbb);", 4618 Style); 4619 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 4620 Style.AlignOperands = false; 4621 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 4622 " bbbbbbbbbbbbbbbbbbbbbb);", 4623 Style); 4624 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4625 Style.AlignOperands = true; 4626 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 4627 " bbbbbbbbbbbbbbbbbbbbbb);", 4628 Style); 4629 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4630 Style.AlignOperands = false; 4631 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 4632 " bbbbbbbbbbbbbbbbbbbbbb);", 4633 Style); 4634 } 4635 4636 TEST_F(FormatTest, BreaksConditionalExpressions) { 4637 verifyFormat( 4638 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4639 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4640 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4641 verifyFormat( 4642 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 4643 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4644 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4645 verifyFormat( 4646 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4647 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4648 verifyFormat( 4649 "aaaa(aaaaaaaaa, aaaaaaaaa,\n" 4650 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4651 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4652 verifyFormat( 4653 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 4654 " : aaaaaaaaaaaaa);"); 4655 verifyFormat( 4656 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4657 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4658 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4659 " aaaaaaaaaaaaa);"); 4660 verifyFormat( 4661 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4662 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4663 " aaaaaaaaaaaaa);"); 4664 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4665 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4666 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4667 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4669 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4671 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4673 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4674 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4675 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4676 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4677 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4678 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4680 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4681 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4682 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4683 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4684 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 4685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4686 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4687 " : aaaaaaaaaaaaaaaa;"); 4688 verifyFormat( 4689 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4690 " ? aaaaaaaaaaaaaaa\n" 4691 " : aaaaaaaaaaaaaaa;"); 4692 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 4693 " aaaaaaaaa\n" 4694 " ? b\n" 4695 " : c);"); 4696 verifyFormat("return aaaa == bbbb\n" 4697 " // comment\n" 4698 " ? aaaa\n" 4699 " : bbbb;"); 4700 verifyFormat("unsigned Indent =\n" 4701 " format(TheLine.First,\n" 4702 " IndentForLevel[TheLine.Level] >= 0\n" 4703 " ? IndentForLevel[TheLine.Level]\n" 4704 " : TheLine * 2,\n" 4705 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 4706 getLLVMStyleWithColumns(60)); 4707 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 4708 " ? aaaaaaaaaaaaaaa\n" 4709 " : bbbbbbbbbbbbbbb //\n" 4710 " ? ccccccccccccccc\n" 4711 " : ddddddddddddddd;"); 4712 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 4713 " ? aaaaaaaaaaaaaaa\n" 4714 " : (bbbbbbbbbbbbbbb //\n" 4715 " ? ccccccccccccccc\n" 4716 " : ddddddddddddddd);"); 4717 verifyFormat( 4718 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4719 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4720 " aaaaaaaaaaaaaaaaaaaaa +\n" 4721 " aaaaaaaaaaaaaaaaaaaaa\n" 4722 " : aaaaaaaaaa;"); 4723 verifyFormat( 4724 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4725 " : aaaaaaaaaaaaaaaaaaaaaa\n" 4726 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4727 4728 FormatStyle NoBinPacking = getLLVMStyle(); 4729 NoBinPacking.BinPackArguments = false; 4730 verifyFormat( 4731 "void f() {\n" 4732 " g(aaa,\n" 4733 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 4734 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4735 " ? aaaaaaaaaaaaaaa\n" 4736 " : aaaaaaaaaaaaaaa);\n" 4737 "}", 4738 NoBinPacking); 4739 verifyFormat( 4740 "void f() {\n" 4741 " g(aaa,\n" 4742 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 4743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4744 " ?: aaaaaaaaaaaaaaa);\n" 4745 "}", 4746 NoBinPacking); 4747 4748 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 4749 " // comment.\n" 4750 " ccccccccccccccccccccccccccccccccccccccc\n" 4751 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4752 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 4753 4754 // Assignments in conditional expressions. Apparently not uncommon :-(. 4755 verifyFormat("return a != b\n" 4756 " // comment\n" 4757 " ? a = b\n" 4758 " : a = b;"); 4759 verifyFormat("return a != b\n" 4760 " // comment\n" 4761 " ? a = a != b\n" 4762 " // comment\n" 4763 " ? a = b\n" 4764 " : a\n" 4765 " : a;\n"); 4766 verifyFormat("return a != b\n" 4767 " // comment\n" 4768 " ? a\n" 4769 " : a = a != b\n" 4770 " // comment\n" 4771 " ? a = b\n" 4772 " : a;"); 4773 } 4774 4775 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 4776 FormatStyle Style = getLLVMStyle(); 4777 Style.BreakBeforeTernaryOperators = false; 4778 Style.ColumnLimit = 70; 4779 verifyFormat( 4780 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 4781 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 4782 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4783 Style); 4784 verifyFormat( 4785 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 4786 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 4787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4788 Style); 4789 verifyFormat( 4790 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 4791 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4792 Style); 4793 verifyFormat( 4794 "aaaa(aaaaaaaa, aaaaaaaaaa,\n" 4795 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 4796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4797 Style); 4798 verifyFormat( 4799 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 4800 " aaaaaaaaaaaaa);", 4801 Style); 4802 verifyFormat( 4803 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4804 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 4805 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4806 " aaaaaaaaaaaaa);", 4807 Style); 4808 verifyFormat( 4809 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4810 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4811 " aaaaaaaaaaaaa);", 4812 Style); 4813 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 4814 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4815 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4816 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4817 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4818 Style); 4819 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 4821 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4822 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4823 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4824 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4825 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4826 Style); 4827 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 4829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4830 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4831 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4832 Style); 4833 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 4834 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 4835 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4836 Style); 4837 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 4838 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 4839 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 4840 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4841 Style); 4842 verifyFormat( 4843 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 4844 " aaaaaaaaaaaaaaa :\n" 4845 " aaaaaaaaaaaaaaa;", 4846 Style); 4847 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 4848 " aaaaaaaaa ?\n" 4849 " b :\n" 4850 " c);", 4851 Style); 4852 verifyFormat("unsigned Indent =\n" 4853 " format(TheLine.First,\n" 4854 " IndentForLevel[TheLine.Level] >= 0 ?\n" 4855 " IndentForLevel[TheLine.Level] :\n" 4856 " TheLine * 2,\n" 4857 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 4858 Style); 4859 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 4860 " aaaaaaaaaaaaaaa :\n" 4861 " bbbbbbbbbbbbbbb ? //\n" 4862 " ccccccccccccccc :\n" 4863 " ddddddddddddddd;", 4864 Style); 4865 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 4866 " aaaaaaaaaaaaaaa :\n" 4867 " (bbbbbbbbbbbbbbb ? //\n" 4868 " ccccccccccccccc :\n" 4869 " ddddddddddddddd);", 4870 Style); 4871 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 4872 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 4873 " ccccccccccccccccccccccccccc;", 4874 Style); 4875 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 4876 " aaaaa :\n" 4877 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 4878 Style); 4879 } 4880 4881 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 4882 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 4883 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 4884 verifyFormat("bool a = true, b = false;"); 4885 4886 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 4888 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 4889 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 4890 verifyFormat( 4891 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 4892 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 4893 " d = e && f;"); 4894 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 4895 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 4896 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 4897 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 4898 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 4899 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 4900 4901 FormatStyle Style = getGoogleStyle(); 4902 Style.PointerAlignment = FormatStyle::PAS_Left; 4903 Style.DerivePointerAlignment = false; 4904 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4905 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 4906 " *b = bbbbbbbbbbbbbbbbbbb;", 4907 Style); 4908 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 4909 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 4910 Style); 4911 verifyFormat("vector<int*> a, b;", Style); 4912 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 4913 } 4914 4915 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 4916 verifyFormat("arr[foo ? bar : baz];"); 4917 verifyFormat("f()[foo ? bar : baz];"); 4918 verifyFormat("(a + b)[foo ? bar : baz];"); 4919 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 4920 } 4921 4922 TEST_F(FormatTest, AlignsStringLiterals) { 4923 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 4924 " \"short literal\");"); 4925 verifyFormat( 4926 "looooooooooooooooooooooooongFunction(\n" 4927 " \"short literal\"\n" 4928 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 4929 verifyFormat("someFunction(\"Always break between multi-line\"\n" 4930 " \" string literals\",\n" 4931 " and, other, parameters);"); 4932 EXPECT_EQ("fun + \"1243\" /* comment */\n" 4933 " \"5678\";", 4934 format("fun + \"1243\" /* comment */\n" 4935 " \"5678\";", 4936 getLLVMStyleWithColumns(28))); 4937 EXPECT_EQ( 4938 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 4939 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 4940 " \"aaaaaaaaaaaaaaaa\";", 4941 format("aaaaaa =" 4942 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 4943 "aaaaaaaaaaaaaaaaaaaaa\" " 4944 "\"aaaaaaaaaaaaaaaa\";")); 4945 verifyFormat("a = a + \"a\"\n" 4946 " \"a\"\n" 4947 " \"a\";"); 4948 verifyFormat("f(\"a\", \"b\"\n" 4949 " \"c\");"); 4950 4951 verifyFormat( 4952 "#define LL_FORMAT \"ll\"\n" 4953 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 4954 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 4955 4956 verifyFormat("#define A(X) \\\n" 4957 " \"aaaaa\" #X \"bbbbbb\" \\\n" 4958 " \"ccccc\"", 4959 getLLVMStyleWithColumns(23)); 4960 verifyFormat("#define A \"def\"\n" 4961 "f(\"abc\" A \"ghi\"\n" 4962 " \"jkl\");"); 4963 4964 verifyFormat("f(L\"a\"\n" 4965 " L\"b\");"); 4966 verifyFormat("#define A(X) \\\n" 4967 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 4968 " L\"ccccc\"", 4969 getLLVMStyleWithColumns(25)); 4970 4971 verifyFormat("f(@\"a\"\n" 4972 " @\"b\");"); 4973 verifyFormat("NSString s = @\"a\"\n" 4974 " @\"b\"\n" 4975 " @\"c\";"); 4976 verifyFormat("NSString s = @\"a\"\n" 4977 " \"b\"\n" 4978 " \"c\";"); 4979 } 4980 4981 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 4982 FormatStyle Style = getLLVMStyle(); 4983 // No declarations or definitions should be moved to own line. 4984 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 4985 verifyFormat("class A {\n" 4986 " int f() { return 1; }\n" 4987 " int g();\n" 4988 "};\n" 4989 "int f() { return 1; }\n" 4990 "int g();\n", 4991 Style); 4992 4993 // All declarations and definitions should have the return type moved to its 4994 // own 4995 // line. 4996 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 4997 verifyFormat("class E {\n" 4998 " int\n" 4999 " f() {\n" 5000 " return 1;\n" 5001 " }\n" 5002 " int\n" 5003 " g();\n" 5004 "};\n" 5005 "int\n" 5006 "f() {\n" 5007 " return 1;\n" 5008 "}\n" 5009 "int\n" 5010 "g();\n", 5011 Style); 5012 5013 // Top-level definitions, and no kinds of declarations should have the 5014 // return type moved to its own line. 5015 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 5016 verifyFormat("class B {\n" 5017 " int f() { return 1; }\n" 5018 " int g();\n" 5019 "};\n" 5020 "int\n" 5021 "f() {\n" 5022 " return 1;\n" 5023 "}\n" 5024 "int g();\n", 5025 Style); 5026 5027 // Top-level definitions and declarations should have the return type moved 5028 // to its own line. 5029 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 5030 verifyFormat("class C {\n" 5031 " int f() { return 1; }\n" 5032 " int g();\n" 5033 "};\n" 5034 "int\n" 5035 "f() {\n" 5036 " return 1;\n" 5037 "}\n" 5038 "int\n" 5039 "g();\n", 5040 Style); 5041 5042 // All definitions should have the return type moved to its own line, but no 5043 // kinds of declarations. 5044 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 5045 verifyFormat("class D {\n" 5046 " int\n" 5047 " f() {\n" 5048 " return 1;\n" 5049 " }\n" 5050 " int g();\n" 5051 "};\n" 5052 "int\n" 5053 "f() {\n" 5054 " return 1;\n" 5055 "}\n" 5056 "int g();\n", 5057 Style); 5058 verifyFormat("const char *\n" 5059 "f(void) {\n" // Break here. 5060 " return \"\";\n" 5061 "}\n" 5062 "const char *bar(void);\n", // No break here. 5063 Style); 5064 verifyFormat("template <class T>\n" 5065 "T *\n" 5066 "f(T &c) {\n" // Break here. 5067 " return NULL;\n" 5068 "}\n" 5069 "template <class T> T *f(T &c);\n", // No break here. 5070 Style); 5071 verifyFormat("class C {\n" 5072 " int\n" 5073 " operator+() {\n" 5074 " return 1;\n" 5075 " }\n" 5076 " int\n" 5077 " operator()() {\n" 5078 " return 1;\n" 5079 " }\n" 5080 "};\n", 5081 Style); 5082 verifyFormat("void\n" 5083 "A::operator()() {}\n" 5084 "void\n" 5085 "A::operator>>() {}\n" 5086 "void\n" 5087 "A::operator+() {}\n", 5088 Style); 5089 verifyFormat("void *operator new(std::size_t s);", // No break here. 5090 Style); 5091 verifyFormat("void *\n" 5092 "operator new(std::size_t s) {}", 5093 Style); 5094 verifyFormat("void *\n" 5095 "operator delete[](void *ptr) {}", 5096 Style); 5097 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 5098 verifyFormat("const char *\n" 5099 "f(void)\n" // Break here. 5100 "{\n" 5101 " return \"\";\n" 5102 "}\n" 5103 "const char *bar(void);\n", // No break here. 5104 Style); 5105 verifyFormat("template <class T>\n" 5106 "T *\n" // Problem here: no line break 5107 "f(T &c)\n" // Break here. 5108 "{\n" 5109 " return NULL;\n" 5110 "}\n" 5111 "template <class T> T *f(T &c);\n", // No break here. 5112 Style); 5113 } 5114 5115 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 5116 FormatStyle NoBreak = getLLVMStyle(); 5117 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 5118 FormatStyle Break = getLLVMStyle(); 5119 Break.AlwaysBreakBeforeMultilineStrings = true; 5120 verifyFormat("aaaa = \"bbbb\"\n" 5121 " \"cccc\";", 5122 NoBreak); 5123 verifyFormat("aaaa =\n" 5124 " \"bbbb\"\n" 5125 " \"cccc\";", 5126 Break); 5127 verifyFormat("aaaa(\"bbbb\"\n" 5128 " \"cccc\");", 5129 NoBreak); 5130 verifyFormat("aaaa(\n" 5131 " \"bbbb\"\n" 5132 " \"cccc\");", 5133 Break); 5134 verifyFormat("aaaa(qqq, \"bbbb\"\n" 5135 " \"cccc\");", 5136 NoBreak); 5137 verifyFormat("aaaa(qqq,\n" 5138 " \"bbbb\"\n" 5139 " \"cccc\");", 5140 Break); 5141 verifyFormat("aaaa(qqq,\n" 5142 " L\"bbbb\"\n" 5143 " L\"cccc\");", 5144 Break); 5145 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 5146 " \"bbbb\"));", 5147 Break); 5148 verifyFormat("string s = someFunction(\n" 5149 " \"abc\"\n" 5150 " \"abc\");", 5151 Break); 5152 5153 // As we break before unary operators, breaking right after them is bad. 5154 verifyFormat("string foo = abc ? \"x\"\n" 5155 " \"blah blah blah blah blah blah\"\n" 5156 " : \"y\";", 5157 Break); 5158 5159 // Don't break if there is no column gain. 5160 verifyFormat("f(\"aaaa\"\n" 5161 " \"bbbb\");", 5162 Break); 5163 5164 // Treat literals with escaped newlines like multi-line string literals. 5165 EXPECT_EQ("x = \"a\\\n" 5166 "b\\\n" 5167 "c\";", 5168 format("x = \"a\\\n" 5169 "b\\\n" 5170 "c\";", 5171 NoBreak)); 5172 EXPECT_EQ("xxxx =\n" 5173 " \"a\\\n" 5174 "b\\\n" 5175 "c\";", 5176 format("xxxx = \"a\\\n" 5177 "b\\\n" 5178 "c\";", 5179 Break)); 5180 5181 EXPECT_EQ("NSString *const kString =\n" 5182 " @\"aaaa\"\n" 5183 " @\"bbbb\";", 5184 format("NSString *const kString = @\"aaaa\"\n" 5185 "@\"bbbb\";", 5186 Break)); 5187 5188 Break.ColumnLimit = 0; 5189 verifyFormat("const char *hello = \"hello llvm\";", Break); 5190 } 5191 5192 TEST_F(FormatTest, AlignsPipes) { 5193 verifyFormat( 5194 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5195 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5196 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5197 verifyFormat( 5198 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 5199 " << aaaaaaaaaaaaaaaaaaaa;"); 5200 verifyFormat( 5201 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5202 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5203 verifyFormat( 5204 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5205 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5206 verifyFormat( 5207 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 5208 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 5209 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 5210 verifyFormat( 5211 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5212 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5213 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5214 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5216 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5217 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 5218 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 5219 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 5220 verifyFormat( 5221 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5223 verifyFormat( 5224 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 5225 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5226 5227 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 5228 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 5229 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5231 " aaaaaaaaaaaaaaaaaaaaa)\n" 5232 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5233 verifyFormat("LOG_IF(aaa == //\n" 5234 " bbb)\n" 5235 " << a << b;"); 5236 5237 // But sometimes, breaking before the first "<<" is desirable. 5238 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 5239 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 5240 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 5241 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5242 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5243 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 5244 " << BEF << IsTemplate << Description << E->getType();"); 5245 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 5246 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5247 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5248 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 5249 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5251 " << aaa;"); 5252 5253 verifyFormat( 5254 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5255 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5256 5257 // Incomplete string literal. 5258 EXPECT_EQ("llvm::errs() << \"\n" 5259 " << a;", 5260 format("llvm::errs() << \"\n<<a;")); 5261 5262 verifyFormat("void f() {\n" 5263 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 5264 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 5265 "}"); 5266 5267 // Handle 'endl'. 5268 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 5269 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 5270 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 5271 5272 // Handle '\n'. 5273 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 5274 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 5275 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 5276 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 5277 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 5278 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 5279 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 5280 } 5281 5282 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 5283 verifyFormat("return out << \"somepacket = {\\n\"\n" 5284 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 5285 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 5286 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 5287 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 5288 " << \"}\";"); 5289 5290 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 5291 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 5292 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 5293 verifyFormat( 5294 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 5295 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 5296 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 5297 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 5298 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 5299 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 5300 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 5301 verifyFormat( 5302 "void f() {\n" 5303 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 5304 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5305 "}"); 5306 5307 // Breaking before the first "<<" is generally not desirable. 5308 verifyFormat( 5309 "llvm::errs()\n" 5310 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5311 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5312 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5313 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5314 getLLVMStyleWithColumns(70)); 5315 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 5316 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5317 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 5318 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5319 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 5320 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5321 getLLVMStyleWithColumns(70)); 5322 5323 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 5324 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 5325 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 5326 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 5327 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 5328 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 5329 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 5330 " (aaaa + aaaa);", 5331 getLLVMStyleWithColumns(40)); 5332 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 5333 " (aaaaaaa + aaaaa));", 5334 getLLVMStyleWithColumns(40)); 5335 verifyFormat( 5336 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 5337 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 5338 " bbbbbbbbbbbbbbbbbbbbbbb);"); 5339 } 5340 5341 TEST_F(FormatTest, UnderstandsEquals) { 5342 verifyFormat( 5343 "aaaaaaaaaaaaaaaaa =\n" 5344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5345 verifyFormat( 5346 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5347 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 5348 verifyFormat( 5349 "if (a) {\n" 5350 " f();\n" 5351 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 5353 "}"); 5354 5355 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5356 " 100000000 + 10000000) {\n}"); 5357 } 5358 5359 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 5360 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 5361 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 5362 5363 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 5364 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 5365 5366 verifyFormat( 5367 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 5368 " Parameter2);"); 5369 5370 verifyFormat( 5371 "ShortObject->shortFunction(\n" 5372 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 5373 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 5374 5375 verifyFormat("loooooooooooooongFunction(\n" 5376 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 5377 5378 verifyFormat( 5379 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 5380 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 5381 5382 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 5383 " .WillRepeatedly(Return(SomeValue));"); 5384 verifyFormat("void f() {\n" 5385 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 5386 " .Times(2)\n" 5387 " .WillRepeatedly(Return(SomeValue));\n" 5388 "}"); 5389 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 5390 " ccccccccccccccccccccccc);"); 5391 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5393 " .aaaaa(aaaaa),\n" 5394 " aaaaaaaaaaaaaaaaaaaaa);"); 5395 verifyFormat("void f() {\n" 5396 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5397 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 5398 "}"); 5399 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5401 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5402 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5403 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5404 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5405 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5406 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5407 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 5408 "}"); 5409 5410 // Here, it is not necessary to wrap at "." or "->". 5411 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 5412 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 5413 verifyFormat( 5414 "aaaaaaaaaaa->aaaaaaaaa(\n" 5415 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5416 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 5417 5418 verifyFormat( 5419 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5420 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 5421 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 5422 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 5423 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 5424 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 5425 5426 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5428 " .a();"); 5429 5430 FormatStyle NoBinPacking = getLLVMStyle(); 5431 NoBinPacking.BinPackParameters = false; 5432 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 5433 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 5434 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 5435 " aaaaaaaaaaaaaaaaaaa,\n" 5436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5437 NoBinPacking); 5438 5439 // If there is a subsequent call, change to hanging indentation. 5440 verifyFormat( 5441 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5442 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 5443 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5444 verifyFormat( 5445 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5446 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 5447 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5449 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5450 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5452 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 5453 } 5454 5455 TEST_F(FormatTest, WrapsTemplateDeclarations) { 5456 verifyFormat("template <typename T>\n" 5457 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 5458 verifyFormat("template <typename T>\n" 5459 "// T should be one of {A, B}.\n" 5460 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 5461 verifyFormat( 5462 "template <typename T>\n" 5463 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 5464 verifyFormat("template <typename T>\n" 5465 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 5466 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 5467 verifyFormat( 5468 "template <typename T>\n" 5469 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 5470 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 5471 verifyFormat( 5472 "template <typename T>\n" 5473 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 5474 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 5475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5476 verifyFormat("template <typename T>\n" 5477 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5478 " int aaaaaaaaaaaaaaaaaaaaaa);"); 5479 verifyFormat( 5480 "template <typename T1, typename T2 = char, typename T3 = char,\n" 5481 " typename T4 = char>\n" 5482 "void f();"); 5483 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 5484 " template <typename> class cccccccccccccccccccccc,\n" 5485 " typename ddddddddddddd>\n" 5486 "class C {};"); 5487 verifyFormat( 5488 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 5489 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5490 5491 verifyFormat("void f() {\n" 5492 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 5493 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 5494 "}"); 5495 5496 verifyFormat("template <typename T> class C {};"); 5497 verifyFormat("template <typename T> void f();"); 5498 verifyFormat("template <typename T> void f() {}"); 5499 verifyFormat( 5500 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 5501 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 5503 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 5504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 5506 " bbbbbbbbbbbbbbbbbbbbbbbb);", 5507 getLLVMStyleWithColumns(72)); 5508 EXPECT_EQ("static_cast<A< //\n" 5509 " B> *>(\n" 5510 "\n" 5511 ");", 5512 format("static_cast<A<//\n" 5513 " B>*>(\n" 5514 "\n" 5515 " );")); 5516 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5517 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 5518 5519 FormatStyle AlwaysBreak = getLLVMStyle(); 5520 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 5521 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 5522 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 5523 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 5524 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5525 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 5526 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 5527 verifyFormat("template <template <typename> class Fooooooo,\n" 5528 " template <typename> class Baaaaaaar>\n" 5529 "struct C {};", 5530 AlwaysBreak); 5531 verifyFormat("template <typename T> // T can be A, B or C.\n" 5532 "struct C {};", 5533 AlwaysBreak); 5534 verifyFormat("template <enum E> class A {\n" 5535 "public:\n" 5536 " E *f();\n" 5537 "};"); 5538 5539 FormatStyle NeverBreak = getLLVMStyle(); 5540 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 5541 verifyFormat("template <typename T> class C {};", NeverBreak); 5542 verifyFormat("template <typename T> void f();", NeverBreak); 5543 verifyFormat("template <typename T> void f() {}", NeverBreak); 5544 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}", 5545 NeverBreak); 5546 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5547 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 5548 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 5549 NeverBreak); 5550 verifyFormat("template <template <typename> class Fooooooo,\n" 5551 " template <typename> class Baaaaaaar>\n" 5552 "struct C {};", 5553 NeverBreak); 5554 verifyFormat("template <typename T> // T can be A, B or C.\n" 5555 "struct C {};", 5556 NeverBreak); 5557 verifyFormat("template <enum E> class A {\n" 5558 "public:\n" 5559 " E *f();\n" 5560 "};", NeverBreak); 5561 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 5562 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}", 5563 NeverBreak); 5564 } 5565 5566 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 5567 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 5568 Style.ColumnLimit = 60; 5569 EXPECT_EQ("// Baseline - no comments.\n" 5570 "template <\n" 5571 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 5572 "void f() {}", 5573 format("// Baseline - no comments.\n" 5574 "template <\n" 5575 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 5576 "void f() {}", 5577 Style)); 5578 5579 EXPECT_EQ("template <\n" 5580 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 5581 "void f() {}", 5582 format("template <\n" 5583 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 5584 "void f() {}", 5585 Style)); 5586 5587 EXPECT_EQ( 5588 "template <\n" 5589 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 5590 "void f() {}", 5591 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 5592 "void f() {}", 5593 Style)); 5594 5595 EXPECT_EQ( 5596 "template <\n" 5597 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 5598 " // multiline\n" 5599 "void f() {}", 5600 format("template <\n" 5601 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 5602 " // multiline\n" 5603 "void f() {}", 5604 Style)); 5605 5606 EXPECT_EQ( 5607 "template <typename aaaaaaaaaa<\n" 5608 " bbbbbbbbbbbb>::value> // trailing loooong\n" 5609 "void f() {}", 5610 format( 5611 "template <\n" 5612 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 5613 "void f() {}", 5614 Style)); 5615 } 5616 5617 TEST_F(FormatTest, WrapsTemplateParameters) { 5618 FormatStyle Style = getLLVMStyle(); 5619 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5620 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 5621 verifyFormat( 5622 "template <typename... a> struct q {};\n" 5623 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 5624 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 5625 " y;", 5626 Style); 5627 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5628 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 5629 verifyFormat( 5630 "template <typename... a> struct r {};\n" 5631 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 5632 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 5633 " y;", 5634 Style); 5635 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5636 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 5637 verifyFormat( 5638 "template <typename... a> struct s {};\n" 5639 "extern s<\n" 5640 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 5641 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 5642 " y;", 5643 Style); 5644 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5645 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 5646 verifyFormat( 5647 "template <typename... a> struct t {};\n" 5648 "extern t<\n" 5649 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 5650 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 5651 " y;", 5652 Style); 5653 } 5654 5655 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 5656 verifyFormat( 5657 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 5658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5659 verifyFormat( 5660 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 5661 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 5663 5664 // FIXME: Should we have the extra indent after the second break? 5665 verifyFormat( 5666 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 5667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 5668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5669 5670 verifyFormat( 5671 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 5672 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 5673 5674 // Breaking at nested name specifiers is generally not desirable. 5675 verifyFormat( 5676 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5677 " aaaaaaaaaaaaaaaaaaaaaaa);"); 5678 5679 verifyFormat( 5680 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 5681 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 5682 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5683 " aaaaaaaaaaaaaaaaaaaaa);", 5684 getLLVMStyleWithColumns(74)); 5685 5686 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 5687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5688 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5689 } 5690 5691 TEST_F(FormatTest, UnderstandsTemplateParameters) { 5692 verifyFormat("A<int> a;"); 5693 verifyFormat("A<A<A<int>>> a;"); 5694 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 5695 verifyFormat("bool x = a < 1 || 2 > a;"); 5696 verifyFormat("bool x = 5 < f<int>();"); 5697 verifyFormat("bool x = f<int>() > 5;"); 5698 verifyFormat("bool x = 5 < a<int>::x;"); 5699 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 5700 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 5701 5702 verifyGoogleFormat("A<A<int>> a;"); 5703 verifyGoogleFormat("A<A<A<int>>> a;"); 5704 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 5705 verifyGoogleFormat("A<A<int> > a;"); 5706 verifyGoogleFormat("A<A<A<int> > > a;"); 5707 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 5708 verifyGoogleFormat("A<::A<int>> a;"); 5709 verifyGoogleFormat("A<::A> a;"); 5710 verifyGoogleFormat("A< ::A> a;"); 5711 verifyGoogleFormat("A< ::A<int> > a;"); 5712 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 5713 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 5714 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 5715 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 5716 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 5717 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 5718 5719 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 5720 5721 verifyFormat("test >> a >> b;"); 5722 verifyFormat("test << a >> b;"); 5723 5724 verifyFormat("f<int>();"); 5725 verifyFormat("template <typename T> void f() {}"); 5726 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 5727 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 5728 "sizeof(char)>::type>;"); 5729 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 5730 verifyFormat("f(a.operator()<A>());"); 5731 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5732 " .template operator()<A>());", 5733 getLLVMStyleWithColumns(35)); 5734 5735 // Not template parameters. 5736 verifyFormat("return a < b && c > d;"); 5737 verifyFormat("void f() {\n" 5738 " while (a < b && c > d) {\n" 5739 " }\n" 5740 "}"); 5741 verifyFormat("template <typename... Types>\n" 5742 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 5743 5744 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 5746 getLLVMStyleWithColumns(60)); 5747 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 5748 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 5749 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 5750 } 5751 5752 TEST_F(FormatTest, BitshiftOperatorWidth) { 5753 EXPECT_EQ("int a = 1 << 2; /* foo\n" 5754 " bar */", 5755 format("int a=1<<2; /* foo\n" 5756 " bar */")); 5757 5758 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 5759 " bar */", 5760 format("int b =256>>1 ; /* foo\n" 5761 " bar */")); 5762 } 5763 5764 TEST_F(FormatTest, UnderstandsBinaryOperators) { 5765 verifyFormat("COMPARE(a, ==, b);"); 5766 verifyFormat("auto s = sizeof...(Ts) - 1;"); 5767 } 5768 5769 TEST_F(FormatTest, UnderstandsPointersToMembers) { 5770 verifyFormat("int A::*x;"); 5771 verifyFormat("int (S::*func)(void *);"); 5772 verifyFormat("void f() { int (S::*func)(void *); }"); 5773 verifyFormat("typedef bool *(Class::*Member)() const;"); 5774 verifyFormat("void f() {\n" 5775 " (a->*f)();\n" 5776 " a->*x;\n" 5777 " (a.*f)();\n" 5778 " ((*a).*f)();\n" 5779 " a.*x;\n" 5780 "}"); 5781 verifyFormat("void f() {\n" 5782 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 5783 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 5784 "}"); 5785 verifyFormat( 5786 "(aaaaaaaaaa->*bbbbbbb)(\n" 5787 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5788 FormatStyle Style = getLLVMStyle(); 5789 Style.PointerAlignment = FormatStyle::PAS_Left; 5790 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 5791 } 5792 5793 TEST_F(FormatTest, UnderstandsUnaryOperators) { 5794 verifyFormat("int a = -2;"); 5795 verifyFormat("f(-1, -2, -3);"); 5796 verifyFormat("a[-1] = 5;"); 5797 verifyFormat("int a = 5 + -2;"); 5798 verifyFormat("if (i == -1) {\n}"); 5799 verifyFormat("if (i != -1) {\n}"); 5800 verifyFormat("if (i > -1) {\n}"); 5801 verifyFormat("if (i < -1) {\n}"); 5802 verifyFormat("++(a->f());"); 5803 verifyFormat("--(a->f());"); 5804 verifyFormat("(a->f())++;"); 5805 verifyFormat("a[42]++;"); 5806 verifyFormat("if (!(a->f())) {\n}"); 5807 verifyFormat("if (!+i) {\n}"); 5808 verifyFormat("~&a;"); 5809 5810 verifyFormat("a-- > b;"); 5811 verifyFormat("b ? -a : c;"); 5812 verifyFormat("n * sizeof char16;"); 5813 verifyFormat("n * alignof char16;", getGoogleStyle()); 5814 verifyFormat("sizeof(char);"); 5815 verifyFormat("alignof(char);", getGoogleStyle()); 5816 5817 verifyFormat("return -1;"); 5818 verifyFormat("switch (a) {\n" 5819 "case -1:\n" 5820 " break;\n" 5821 "}"); 5822 verifyFormat("#define X -1"); 5823 verifyFormat("#define X -kConstant"); 5824 5825 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 5826 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 5827 5828 verifyFormat("int a = /* confusing comment */ -1;"); 5829 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 5830 verifyFormat("int a = i /* confusing comment */++;"); 5831 } 5832 5833 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 5834 verifyFormat("if (!aaaaaaaaaa( // break\n" 5835 " aaaaa)) {\n" 5836 "}"); 5837 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 5838 " aaaaa));"); 5839 verifyFormat("*aaa = aaaaaaa( // break\n" 5840 " bbbbbb);"); 5841 } 5842 5843 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 5844 verifyFormat("bool operator<();"); 5845 verifyFormat("bool operator>();"); 5846 verifyFormat("bool operator=();"); 5847 verifyFormat("bool operator==();"); 5848 verifyFormat("bool operator!=();"); 5849 verifyFormat("int operator+();"); 5850 verifyFormat("int operator++();"); 5851 verifyFormat("int operator++(int) volatile noexcept;"); 5852 verifyFormat("bool operator,();"); 5853 verifyFormat("bool operator();"); 5854 verifyFormat("bool operator()();"); 5855 verifyFormat("bool operator[]();"); 5856 verifyFormat("operator bool();"); 5857 verifyFormat("operator int();"); 5858 verifyFormat("operator void *();"); 5859 verifyFormat("operator SomeType<int>();"); 5860 verifyFormat("operator SomeType<int, int>();"); 5861 verifyFormat("operator SomeType<SomeType<int>>();"); 5862 verifyFormat("void *operator new(std::size_t size);"); 5863 verifyFormat("void *operator new[](std::size_t size);"); 5864 verifyFormat("void operator delete(void *ptr);"); 5865 verifyFormat("void operator delete[](void *ptr);"); 5866 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 5867 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 5868 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 5869 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 5870 5871 verifyFormat( 5872 "ostream &operator<<(ostream &OutputStream,\n" 5873 " SomeReallyLongType WithSomeReallyLongValue);"); 5874 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 5875 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 5876 " return left.group < right.group;\n" 5877 "}"); 5878 verifyFormat("SomeType &operator=(const SomeType &S);"); 5879 verifyFormat("f.template operator()<int>();"); 5880 5881 verifyGoogleFormat("operator void*();"); 5882 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 5883 verifyGoogleFormat("operator ::A();"); 5884 5885 verifyFormat("using A::operator+;"); 5886 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 5887 "int i;"); 5888 } 5889 5890 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 5891 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 5892 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 5893 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 5894 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 5895 verifyFormat("Deleted &operator=(const Deleted &) &;"); 5896 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 5897 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 5898 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 5899 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 5900 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 5901 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 5902 verifyFormat("void Fn(T const &) const &;"); 5903 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 5904 verifyFormat("template <typename T>\n" 5905 "void F(T) && = delete;", 5906 getGoogleStyle()); 5907 5908 FormatStyle AlignLeft = getLLVMStyle(); 5909 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 5910 verifyFormat("void A::b() && {}", AlignLeft); 5911 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 5912 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 5913 AlignLeft); 5914 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 5915 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 5916 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 5917 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 5918 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 5919 verifyFormat("auto Function(T) & -> void;", AlignLeft); 5920 verifyFormat("void Fn(T const&) const&;", AlignLeft); 5921 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 5922 5923 FormatStyle Spaces = getLLVMStyle(); 5924 Spaces.SpacesInCStyleCastParentheses = true; 5925 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 5926 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 5927 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 5928 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 5929 5930 Spaces.SpacesInCStyleCastParentheses = false; 5931 Spaces.SpacesInParentheses = true; 5932 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 5933 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces); 5934 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 5935 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 5936 } 5937 5938 TEST_F(FormatTest, UnderstandsNewAndDelete) { 5939 verifyFormat("void f() {\n" 5940 " A *a = new A;\n" 5941 " A *a = new (placement) A;\n" 5942 " delete a;\n" 5943 " delete (A *)a;\n" 5944 "}"); 5945 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 5946 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 5947 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5948 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 5949 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 5950 verifyFormat("delete[] h->p;"); 5951 } 5952 5953 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 5954 verifyFormat("int *f(int *a) {}"); 5955 verifyFormat("int main(int argc, char **argv) {}"); 5956 verifyFormat("Test::Test(int b) : a(b * b) {}"); 5957 verifyIndependentOfContext("f(a, *a);"); 5958 verifyFormat("void g() { f(*a); }"); 5959 verifyIndependentOfContext("int a = b * 10;"); 5960 verifyIndependentOfContext("int a = 10 * b;"); 5961 verifyIndependentOfContext("int a = b * c;"); 5962 verifyIndependentOfContext("int a += b * c;"); 5963 verifyIndependentOfContext("int a -= b * c;"); 5964 verifyIndependentOfContext("int a *= b * c;"); 5965 verifyIndependentOfContext("int a /= b * c;"); 5966 verifyIndependentOfContext("int a = *b;"); 5967 verifyIndependentOfContext("int a = *b * c;"); 5968 verifyIndependentOfContext("int a = b * *c;"); 5969 verifyIndependentOfContext("int a = b * (10);"); 5970 verifyIndependentOfContext("S << b * (10);"); 5971 verifyIndependentOfContext("return 10 * b;"); 5972 verifyIndependentOfContext("return *b * *c;"); 5973 verifyIndependentOfContext("return a & ~b;"); 5974 verifyIndependentOfContext("f(b ? *c : *d);"); 5975 verifyIndependentOfContext("int a = b ? *c : *d;"); 5976 verifyIndependentOfContext("*b = a;"); 5977 verifyIndependentOfContext("a * ~b;"); 5978 verifyIndependentOfContext("a * !b;"); 5979 verifyIndependentOfContext("a * +b;"); 5980 verifyIndependentOfContext("a * -b;"); 5981 verifyIndependentOfContext("a * ++b;"); 5982 verifyIndependentOfContext("a * --b;"); 5983 verifyIndependentOfContext("a[4] * b;"); 5984 verifyIndependentOfContext("a[a * a] = 1;"); 5985 verifyIndependentOfContext("f() * b;"); 5986 verifyIndependentOfContext("a * [self dostuff];"); 5987 verifyIndependentOfContext("int x = a * (a + b);"); 5988 verifyIndependentOfContext("(a *)(a + b);"); 5989 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 5990 verifyIndependentOfContext("int *pa = (int *)&a;"); 5991 verifyIndependentOfContext("return sizeof(int **);"); 5992 verifyIndependentOfContext("return sizeof(int ******);"); 5993 verifyIndependentOfContext("return (int **&)a;"); 5994 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 5995 verifyFormat("void f(Type (*parameter)[10]) {}"); 5996 verifyFormat("void f(Type (¶meter)[10]) {}"); 5997 verifyGoogleFormat("return sizeof(int**);"); 5998 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 5999 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 6000 verifyFormat("auto a = [](int **&, int ***) {};"); 6001 verifyFormat("auto PointerBinding = [](const char *S) {};"); 6002 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 6003 verifyFormat("[](const decltype(*a) &value) {}"); 6004 verifyFormat("decltype(a * b) F();"); 6005 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 6006 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 6007 verifyIndependentOfContext("typedef void (*f)(int *a);"); 6008 verifyIndependentOfContext("int i{a * b};"); 6009 verifyIndependentOfContext("aaa && aaa->f();"); 6010 verifyIndependentOfContext("int x = ~*p;"); 6011 verifyFormat("Constructor() : a(a), area(width * height) {}"); 6012 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 6013 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 6014 verifyFormat("void f() { f(a, c * d); }"); 6015 verifyFormat("void f() { f(new a(), c * d); }"); 6016 verifyFormat("void f(const MyOverride &override);"); 6017 verifyFormat("void f(const MyFinal &final);"); 6018 verifyIndependentOfContext("bool a = f() && override.f();"); 6019 verifyIndependentOfContext("bool a = f() && final.f();"); 6020 6021 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 6022 6023 verifyIndependentOfContext("A<int *> a;"); 6024 verifyIndependentOfContext("A<int **> a;"); 6025 verifyIndependentOfContext("A<int *, int *> a;"); 6026 verifyIndependentOfContext("A<int *[]> a;"); 6027 verifyIndependentOfContext( 6028 "const char *const p = reinterpret_cast<const char *const>(q);"); 6029 verifyIndependentOfContext("A<int **, int **> a;"); 6030 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 6031 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 6032 verifyFormat("for (; a && b;) {\n}"); 6033 verifyFormat("bool foo = true && [] { return false; }();"); 6034 6035 verifyFormat( 6036 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6038 6039 verifyGoogleFormat("int const* a = &b;"); 6040 verifyGoogleFormat("**outparam = 1;"); 6041 verifyGoogleFormat("*outparam = a * b;"); 6042 verifyGoogleFormat("int main(int argc, char** argv) {}"); 6043 verifyGoogleFormat("A<int*> a;"); 6044 verifyGoogleFormat("A<int**> a;"); 6045 verifyGoogleFormat("A<int*, int*> a;"); 6046 verifyGoogleFormat("A<int**, int**> a;"); 6047 verifyGoogleFormat("f(b ? *c : *d);"); 6048 verifyGoogleFormat("int a = b ? *c : *d;"); 6049 verifyGoogleFormat("Type* t = **x;"); 6050 verifyGoogleFormat("Type* t = *++*x;"); 6051 verifyGoogleFormat("*++*x;"); 6052 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 6053 verifyGoogleFormat("Type* t = x++ * y;"); 6054 verifyGoogleFormat( 6055 "const char* const p = reinterpret_cast<const char* const>(q);"); 6056 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 6057 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 6058 verifyGoogleFormat("template <typename T>\n" 6059 "void f(int i = 0, SomeType** temps = NULL);"); 6060 6061 FormatStyle Left = getLLVMStyle(); 6062 Left.PointerAlignment = FormatStyle::PAS_Left; 6063 verifyFormat("x = *a(x) = *a(y);", Left); 6064 verifyFormat("for (;; *a = b) {\n}", Left); 6065 verifyFormat("return *this += 1;", Left); 6066 verifyFormat("throw *x;", Left); 6067 verifyFormat("delete *x;", Left); 6068 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 6069 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 6070 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 6071 6072 verifyIndependentOfContext("a = *(x + y);"); 6073 verifyIndependentOfContext("a = &(x + y);"); 6074 verifyIndependentOfContext("*(x + y).call();"); 6075 verifyIndependentOfContext("&(x + y)->call();"); 6076 verifyFormat("void f() { &(*I).first; }"); 6077 6078 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 6079 verifyFormat( 6080 "int *MyValues = {\n" 6081 " *A, // Operator detection might be confused by the '{'\n" 6082 " *BB // Operator detection might be confused by previous comment\n" 6083 "};"); 6084 6085 verifyIndependentOfContext("if (int *a = &b)"); 6086 verifyIndependentOfContext("if (int &a = *b)"); 6087 verifyIndependentOfContext("if (a & b[i])"); 6088 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 6089 verifyIndependentOfContext("if (*b[i])"); 6090 verifyIndependentOfContext("if (int *a = (&b))"); 6091 verifyIndependentOfContext("while (int *a = &b)"); 6092 verifyIndependentOfContext("size = sizeof *a;"); 6093 verifyIndependentOfContext("if (a && (b = c))"); 6094 verifyFormat("void f() {\n" 6095 " for (const int &v : Values) {\n" 6096 " }\n" 6097 "}"); 6098 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 6099 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 6100 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 6101 6102 verifyFormat("#define A (!a * b)"); 6103 verifyFormat("#define MACRO \\\n" 6104 " int *i = a * b; \\\n" 6105 " void f(a *b);", 6106 getLLVMStyleWithColumns(19)); 6107 6108 verifyIndependentOfContext("A = new SomeType *[Length];"); 6109 verifyIndependentOfContext("A = new SomeType *[Length]();"); 6110 verifyIndependentOfContext("T **t = new T *;"); 6111 verifyIndependentOfContext("T **t = new T *();"); 6112 verifyGoogleFormat("A = new SomeType*[Length]();"); 6113 verifyGoogleFormat("A = new SomeType*[Length];"); 6114 verifyGoogleFormat("T** t = new T*;"); 6115 verifyGoogleFormat("T** t = new T*();"); 6116 6117 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 6118 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 6119 verifyFormat("template <bool a, bool b> " 6120 "typename t::if<x && y>::type f() {}"); 6121 verifyFormat("template <int *y> f() {}"); 6122 verifyFormat("vector<int *> v;"); 6123 verifyFormat("vector<int *const> v;"); 6124 verifyFormat("vector<int *const **const *> v;"); 6125 verifyFormat("vector<int *volatile> v;"); 6126 verifyFormat("vector<a * b> v;"); 6127 verifyFormat("foo<b && false>();"); 6128 verifyFormat("foo<b & 1>();"); 6129 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 6130 verifyFormat( 6131 "template <class T, class = typename std::enable_if<\n" 6132 " std::is_integral<T>::value &&\n" 6133 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 6134 "void F();", 6135 getLLVMStyleWithColumns(70)); 6136 verifyFormat( 6137 "template <class T,\n" 6138 " class = typename std::enable_if<\n" 6139 " std::is_integral<T>::value &&\n" 6140 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 6141 " class U>\n" 6142 "void F();", 6143 getLLVMStyleWithColumns(70)); 6144 verifyFormat( 6145 "template <class T,\n" 6146 " class = typename ::std::enable_if<\n" 6147 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 6148 "void F();", 6149 getGoogleStyleWithColumns(68)); 6150 6151 verifyIndependentOfContext("MACRO(int *i);"); 6152 verifyIndependentOfContext("MACRO(auto *a);"); 6153 verifyIndependentOfContext("MACRO(const A *a);"); 6154 verifyIndependentOfContext("MACRO(A *const a);"); 6155 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 6156 verifyFormat("void f() { f(float{1}, a * a); }"); 6157 // FIXME: Is there a way to make this work? 6158 // verifyIndependentOfContext("MACRO(A *a);"); 6159 6160 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 6161 verifyFormat("return options != nullptr && operator==(*options);"); 6162 6163 EXPECT_EQ("#define OP(x) \\\n" 6164 " ostream &operator<<(ostream &s, const A &a) { \\\n" 6165 " return s << a.DebugString(); \\\n" 6166 " }", 6167 format("#define OP(x) \\\n" 6168 " ostream &operator<<(ostream &s, const A &a) { \\\n" 6169 " return s << a.DebugString(); \\\n" 6170 " }", 6171 getLLVMStyleWithColumns(50))); 6172 6173 // FIXME: We cannot handle this case yet; we might be able to figure out that 6174 // foo<x> d > v; doesn't make sense. 6175 verifyFormat("foo<a<b && c> d> v;"); 6176 6177 FormatStyle PointerMiddle = getLLVMStyle(); 6178 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 6179 verifyFormat("delete *x;", PointerMiddle); 6180 verifyFormat("int * x;", PointerMiddle); 6181 verifyFormat("int *[] x;", PointerMiddle); 6182 verifyFormat("template <int * y> f() {}", PointerMiddle); 6183 verifyFormat("int * f(int * a) {}", PointerMiddle); 6184 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 6185 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 6186 verifyFormat("A<int *> a;", PointerMiddle); 6187 verifyFormat("A<int **> a;", PointerMiddle); 6188 verifyFormat("A<int *, int *> a;", PointerMiddle); 6189 verifyFormat("A<int *[]> a;", PointerMiddle); 6190 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 6191 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 6192 verifyFormat("T ** t = new T *;", PointerMiddle); 6193 6194 // Member function reference qualifiers aren't binary operators. 6195 verifyFormat("string // break\n" 6196 "operator()() & {}"); 6197 verifyFormat("string // break\n" 6198 "operator()() && {}"); 6199 verifyGoogleFormat("template <typename T>\n" 6200 "auto x() & -> int {}"); 6201 } 6202 6203 TEST_F(FormatTest, UnderstandsAttributes) { 6204 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 6205 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 6206 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 6207 FormatStyle AfterType = getLLVMStyle(); 6208 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6209 verifyFormat("__attribute__((nodebug)) void\n" 6210 "foo() {}\n", 6211 AfterType); 6212 } 6213 6214 TEST_F(FormatTest, UnderstandsSquareAttributes) { 6215 verifyFormat("SomeType s [[unused]] (InitValue);"); 6216 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 6217 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 6218 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 6219 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 6220 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6221 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 6222 6223 // Make sure we do not mistake attributes for array subscripts. 6224 verifyFormat("int a() {}\n" 6225 "[[unused]] int b() {}\n"); 6226 6227 // On the other hand, we still need to correctly find array subscripts. 6228 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 6229 6230 // Make sure we do not parse attributes as lambda introducers. 6231 FormatStyle MultiLineFunctions = getLLVMStyle(); 6232 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 6233 verifyFormat("[[unused]] int b() {\n" 6234 " return 42;\n" 6235 "}\n", 6236 MultiLineFunctions); 6237 } 6238 6239 TEST_F(FormatTest, UnderstandsEllipsis) { 6240 verifyFormat("int printf(const char *fmt, ...);"); 6241 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 6242 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 6243 6244 FormatStyle PointersLeft = getLLVMStyle(); 6245 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 6246 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 6247 } 6248 6249 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 6250 EXPECT_EQ("int *a;\n" 6251 "int *a;\n" 6252 "int *a;", 6253 format("int *a;\n" 6254 "int* a;\n" 6255 "int *a;", 6256 getGoogleStyle())); 6257 EXPECT_EQ("int* a;\n" 6258 "int* a;\n" 6259 "int* a;", 6260 format("int* a;\n" 6261 "int* a;\n" 6262 "int *a;", 6263 getGoogleStyle())); 6264 EXPECT_EQ("int *a;\n" 6265 "int *a;\n" 6266 "int *a;", 6267 format("int *a;\n" 6268 "int * a;\n" 6269 "int * a;", 6270 getGoogleStyle())); 6271 EXPECT_EQ("auto x = [] {\n" 6272 " int *a;\n" 6273 " int *a;\n" 6274 " int *a;\n" 6275 "};", 6276 format("auto x=[]{int *a;\n" 6277 "int * a;\n" 6278 "int * a;};", 6279 getGoogleStyle())); 6280 } 6281 6282 TEST_F(FormatTest, UnderstandsRvalueReferences) { 6283 verifyFormat("int f(int &&a) {}"); 6284 verifyFormat("int f(int a, char &&b) {}"); 6285 verifyFormat("void f() { int &&a = b; }"); 6286 verifyGoogleFormat("int f(int a, char&& b) {}"); 6287 verifyGoogleFormat("void f() { int&& a = b; }"); 6288 6289 verifyIndependentOfContext("A<int &&> a;"); 6290 verifyIndependentOfContext("A<int &&, int &&> a;"); 6291 verifyGoogleFormat("A<int&&> a;"); 6292 verifyGoogleFormat("A<int&&, int&&> a;"); 6293 6294 // Not rvalue references: 6295 verifyFormat("template <bool B, bool C> class A {\n" 6296 " static_assert(B && C, \"Something is wrong\");\n" 6297 "};"); 6298 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 6299 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 6300 verifyFormat("#define A(a, b) (a && b)"); 6301 } 6302 6303 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 6304 verifyFormat("void f() {\n" 6305 " x[aaaaaaaaa -\n" 6306 " b] = 23;\n" 6307 "}", 6308 getLLVMStyleWithColumns(15)); 6309 } 6310 6311 TEST_F(FormatTest, FormatsCasts) { 6312 verifyFormat("Type *A = static_cast<Type *>(P);"); 6313 verifyFormat("Type *A = (Type *)P;"); 6314 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 6315 verifyFormat("int a = (int)(2.0f);"); 6316 verifyFormat("int a = (int)2.0f;"); 6317 verifyFormat("x[(int32)y];"); 6318 verifyFormat("x = (int32)y;"); 6319 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 6320 verifyFormat("int a = (int)*b;"); 6321 verifyFormat("int a = (int)2.0f;"); 6322 verifyFormat("int a = (int)~0;"); 6323 verifyFormat("int a = (int)++a;"); 6324 verifyFormat("int a = (int)sizeof(int);"); 6325 verifyFormat("int a = (int)+2;"); 6326 verifyFormat("my_int a = (my_int)2.0f;"); 6327 verifyFormat("my_int a = (my_int)sizeof(int);"); 6328 verifyFormat("return (my_int)aaa;"); 6329 verifyFormat("#define x ((int)-1)"); 6330 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 6331 verifyFormat("#define p(q) ((int *)&q)"); 6332 verifyFormat("fn(a)(b) + 1;"); 6333 6334 verifyFormat("void f() { my_int a = (my_int)*b; }"); 6335 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 6336 verifyFormat("my_int a = (my_int)~0;"); 6337 verifyFormat("my_int a = (my_int)++a;"); 6338 verifyFormat("my_int a = (my_int)-2;"); 6339 verifyFormat("my_int a = (my_int)1;"); 6340 verifyFormat("my_int a = (my_int *)1;"); 6341 verifyFormat("my_int a = (const my_int)-1;"); 6342 verifyFormat("my_int a = (const my_int *)-1;"); 6343 verifyFormat("my_int a = (my_int)(my_int)-1;"); 6344 verifyFormat("my_int a = (ns::my_int)-2;"); 6345 verifyFormat("case (my_int)ONE:"); 6346 verifyFormat("auto x = (X)this;"); 6347 6348 // FIXME: single value wrapped with paren will be treated as cast. 6349 verifyFormat("void f(int i = (kValue)*kMask) {}"); 6350 6351 verifyFormat("{ (void)F; }"); 6352 6353 // Don't break after a cast's 6354 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6355 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 6356 " bbbbbbbbbbbbbbbbbbbbbb);"); 6357 6358 // These are not casts. 6359 verifyFormat("void f(int *) {}"); 6360 verifyFormat("f(foo)->b;"); 6361 verifyFormat("f(foo).b;"); 6362 verifyFormat("f(foo)(b);"); 6363 verifyFormat("f(foo)[b];"); 6364 verifyFormat("[](foo) { return 4; }(bar);"); 6365 verifyFormat("(*funptr)(foo)[4];"); 6366 verifyFormat("funptrs[4](foo)[4];"); 6367 verifyFormat("void f(int *);"); 6368 verifyFormat("void f(int *) = 0;"); 6369 verifyFormat("void f(SmallVector<int>) {}"); 6370 verifyFormat("void f(SmallVector<int>);"); 6371 verifyFormat("void f(SmallVector<int>) = 0;"); 6372 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 6373 verifyFormat("int a = sizeof(int) * b;"); 6374 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 6375 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 6376 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 6377 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 6378 6379 // These are not casts, but at some point were confused with casts. 6380 verifyFormat("virtual void foo(int *) override;"); 6381 verifyFormat("virtual void foo(char &) const;"); 6382 verifyFormat("virtual void foo(int *a, char *) const;"); 6383 verifyFormat("int a = sizeof(int *) + b;"); 6384 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 6385 verifyFormat("bool b = f(g<int>) && c;"); 6386 verifyFormat("typedef void (*f)(int i) func;"); 6387 6388 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 6389 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6390 // FIXME: The indentation here is not ideal. 6391 verifyFormat( 6392 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6393 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 6394 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 6395 } 6396 6397 TEST_F(FormatTest, FormatsFunctionTypes) { 6398 verifyFormat("A<bool()> a;"); 6399 verifyFormat("A<SomeType()> a;"); 6400 verifyFormat("A<void (*)(int, std::string)> a;"); 6401 verifyFormat("A<void *(int)>;"); 6402 verifyFormat("void *(*a)(int *, SomeType *);"); 6403 verifyFormat("int (*func)(void *);"); 6404 verifyFormat("void f() { int (*func)(void *); }"); 6405 verifyFormat("template <class CallbackClass>\n" 6406 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 6407 6408 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 6409 verifyGoogleFormat("void* (*a)(int);"); 6410 verifyGoogleFormat( 6411 "template <class CallbackClass>\n" 6412 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 6413 6414 // Other constructs can look somewhat like function types: 6415 verifyFormat("A<sizeof(*x)> a;"); 6416 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 6417 verifyFormat("some_var = function(*some_pointer_var)[0];"); 6418 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 6419 verifyFormat("int x = f(&h)();"); 6420 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 6421 verifyFormat("std::function<\n" 6422 " LooooooooooongTemplatedType<\n" 6423 " SomeType>*(\n" 6424 " LooooooooooooooooongType type)>\n" 6425 " function;", 6426 getGoogleStyleWithColumns(40)); 6427 } 6428 6429 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 6430 verifyFormat("A (*foo_)[6];"); 6431 verifyFormat("vector<int> (*foo_)[6];"); 6432 } 6433 6434 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 6435 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 6436 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 6437 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 6438 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 6439 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 6440 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 6441 6442 // Different ways of ()-initializiation. 6443 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 6444 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 6445 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 6446 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 6447 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 6448 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 6449 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 6450 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 6451 6452 // Lambdas should not confuse the variable declaration heuristic. 6453 verifyFormat("LooooooooooooooooongType\n" 6454 " variable(nullptr, [](A *a) {});", 6455 getLLVMStyleWithColumns(40)); 6456 } 6457 6458 TEST_F(FormatTest, BreaksLongDeclarations) { 6459 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 6460 " AnotherNameForTheLongType;"); 6461 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 6462 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6463 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 6464 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 6465 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 6466 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 6467 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 6468 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 6469 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 6470 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 6471 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 6472 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 6473 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 6474 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 6475 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 6476 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 6477 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 6478 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 6479 FormatStyle Indented = getLLVMStyle(); 6480 Indented.IndentWrappedFunctionNames = true; 6481 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 6482 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 6483 Indented); 6484 verifyFormat( 6485 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 6486 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 6487 Indented); 6488 verifyFormat( 6489 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 6490 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 6491 Indented); 6492 verifyFormat( 6493 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 6494 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 6495 Indented); 6496 6497 // FIXME: Without the comment, this breaks after "(". 6498 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 6499 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 6500 getGoogleStyle()); 6501 6502 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 6503 " int LoooooooooooooooooooongParam2) {}"); 6504 verifyFormat( 6505 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 6506 " SourceLocation L, IdentifierIn *II,\n" 6507 " Type *T) {}"); 6508 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 6509 "ReallyReaaallyLongFunctionName(\n" 6510 " const std::string &SomeParameter,\n" 6511 " const SomeType<string, SomeOtherTemplateParameter>\n" 6512 " &ReallyReallyLongParameterName,\n" 6513 " const SomeType<string, SomeOtherTemplateParameter>\n" 6514 " &AnotherLongParameterName) {}"); 6515 verifyFormat("template <typename A>\n" 6516 "SomeLoooooooooooooooooooooongType<\n" 6517 " typename some_namespace::SomeOtherType<A>::Type>\n" 6518 "Function() {}"); 6519 6520 verifyGoogleFormat( 6521 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 6522 " aaaaaaaaaaaaaaaaaaaaaaa;"); 6523 verifyGoogleFormat( 6524 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 6525 " SourceLocation L) {}"); 6526 verifyGoogleFormat( 6527 "some_namespace::LongReturnType\n" 6528 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 6529 " int first_long_parameter, int second_parameter) {}"); 6530 6531 verifyGoogleFormat("template <typename T>\n" 6532 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 6533 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 6534 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6535 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 6536 6537 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 6538 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6539 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6540 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6541 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 6542 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 6543 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6544 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 6545 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 6546 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6547 6548 verifyFormat("template <typename T> // Templates on own line.\n" 6549 "static int // Some comment.\n" 6550 "MyFunction(int a);", 6551 getLLVMStyle()); 6552 } 6553 6554 TEST_F(FormatTest, FormatsArrays) { 6555 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 6556 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 6557 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 6558 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 6559 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 6560 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 6561 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6562 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 6563 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6564 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 6565 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6566 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 6567 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 6568 verifyFormat( 6569 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 6570 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 6571 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 6572 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 6573 " .aaaaaaaaaaaaaaaaaaaaaa();"); 6574 6575 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 6576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 6577 verifyFormat( 6578 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 6579 " .aaaaaaa[0]\n" 6580 " .aaaaaaaaaaaaaaaaaaaaaa();"); 6581 verifyFormat("a[::b::c];"); 6582 6583 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 6584 6585 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 6586 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 6587 } 6588 6589 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 6590 verifyFormat("(a)->b();"); 6591 verifyFormat("--a;"); 6592 } 6593 6594 TEST_F(FormatTest, HandlesIncludeDirectives) { 6595 verifyFormat("#include <string>\n" 6596 "#include <a/b/c.h>\n" 6597 "#include \"a/b/string\"\n" 6598 "#include \"string.h\"\n" 6599 "#include \"string.h\"\n" 6600 "#include <a-a>\n" 6601 "#include < path with space >\n" 6602 "#include_next <test.h>" 6603 "#include \"abc.h\" // this is included for ABC\n" 6604 "#include \"some long include\" // with a comment\n" 6605 "#include \"some very long include path\"\n" 6606 "#include <some/very/long/include/path>\n", 6607 getLLVMStyleWithColumns(35)); 6608 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 6609 EXPECT_EQ("#include <a>", format("#include<a>")); 6610 6611 verifyFormat("#import <string>"); 6612 verifyFormat("#import <a/b/c.h>"); 6613 verifyFormat("#import \"a/b/string\""); 6614 verifyFormat("#import \"string.h\""); 6615 verifyFormat("#import \"string.h\""); 6616 verifyFormat("#if __has_include(<strstream>)\n" 6617 "#include <strstream>\n" 6618 "#endif"); 6619 6620 verifyFormat("#define MY_IMPORT <a/b>"); 6621 6622 verifyFormat("#if __has_include(<a/b>)"); 6623 verifyFormat("#if __has_include_next(<a/b>)"); 6624 verifyFormat("#define F __has_include(<a/b>)"); 6625 verifyFormat("#define F __has_include_next(<a/b>)"); 6626 6627 // Protocol buffer definition or missing "#". 6628 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 6629 getLLVMStyleWithColumns(30)); 6630 6631 FormatStyle Style = getLLVMStyle(); 6632 Style.AlwaysBreakBeforeMultilineStrings = true; 6633 Style.ColumnLimit = 0; 6634 verifyFormat("#import \"abc.h\"", Style); 6635 6636 // But 'import' might also be a regular C++ namespace. 6637 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6638 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6639 } 6640 6641 //===----------------------------------------------------------------------===// 6642 // Error recovery tests. 6643 //===----------------------------------------------------------------------===// 6644 6645 TEST_F(FormatTest, IncompleteParameterLists) { 6646 FormatStyle NoBinPacking = getLLVMStyle(); 6647 NoBinPacking.BinPackParameters = false; 6648 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 6649 " double *min_x,\n" 6650 " double *max_x,\n" 6651 " double *min_y,\n" 6652 " double *max_y,\n" 6653 " double *min_z,\n" 6654 " double *max_z, ) {}", 6655 NoBinPacking); 6656 } 6657 6658 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 6659 verifyFormat("void f() { return; }\n42"); 6660 verifyFormat("void f() {\n" 6661 " if (0)\n" 6662 " return;\n" 6663 "}\n" 6664 "42"); 6665 verifyFormat("void f() { return }\n42"); 6666 verifyFormat("void f() {\n" 6667 " if (0)\n" 6668 " return\n" 6669 "}\n" 6670 "42"); 6671 } 6672 6673 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 6674 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 6675 EXPECT_EQ("void f() {\n" 6676 " if (a)\n" 6677 " return\n" 6678 "}", 6679 format("void f ( ) { if ( a ) return }")); 6680 EXPECT_EQ("namespace N {\n" 6681 "void f()\n" 6682 "}", 6683 format("namespace N { void f() }")); 6684 EXPECT_EQ("namespace N {\n" 6685 "void f() {}\n" 6686 "void g()\n" 6687 "} // namespace N", 6688 format("namespace N { void f( ) { } void g( ) }")); 6689 } 6690 6691 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 6692 verifyFormat("int aaaaaaaa =\n" 6693 " // Overlylongcomment\n" 6694 " b;", 6695 getLLVMStyleWithColumns(20)); 6696 verifyFormat("function(\n" 6697 " ShortArgument,\n" 6698 " LoooooooooooongArgument);\n", 6699 getLLVMStyleWithColumns(20)); 6700 } 6701 6702 TEST_F(FormatTest, IncorrectAccessSpecifier) { 6703 verifyFormat("public:"); 6704 verifyFormat("class A {\n" 6705 "public\n" 6706 " void f() {}\n" 6707 "};"); 6708 verifyFormat("public\n" 6709 "int qwerty;"); 6710 verifyFormat("public\n" 6711 "B {}"); 6712 verifyFormat("public\n" 6713 "{}"); 6714 verifyFormat("public\n" 6715 "B { int x; }"); 6716 } 6717 6718 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 6719 verifyFormat("{"); 6720 verifyFormat("#})"); 6721 verifyNoCrash("(/**/[:!] ?[)."); 6722 } 6723 6724 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 6725 // Found by oss-fuzz: 6726 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 6727 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6728 Style.ColumnLimit = 60; 6729 verifyNoCrash( 6730 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 6731 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 6732 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 6733 Style); 6734 } 6735 6736 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 6737 verifyFormat("do {\n}"); 6738 verifyFormat("do {\n}\n" 6739 "f();"); 6740 verifyFormat("do {\n}\n" 6741 "wheeee(fun);"); 6742 verifyFormat("do {\n" 6743 " f();\n" 6744 "}"); 6745 } 6746 6747 TEST_F(FormatTest, IncorrectCodeMissingParens) { 6748 verifyFormat("if {\n foo;\n foo();\n}"); 6749 verifyFormat("switch {\n foo;\n foo();\n}"); 6750 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 6751 verifyFormat("while {\n foo;\n foo();\n}"); 6752 verifyFormat("do {\n foo;\n foo();\n} while;"); 6753 } 6754 6755 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 6756 verifyIncompleteFormat("namespace {\n" 6757 "class Foo { Foo (\n" 6758 "};\n" 6759 "} // namespace"); 6760 } 6761 6762 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 6763 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 6764 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 6765 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 6766 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 6767 6768 EXPECT_EQ("{\n" 6769 " {\n" 6770 " breakme(\n" 6771 " qwe);\n" 6772 " }\n", 6773 format("{\n" 6774 " {\n" 6775 " breakme(qwe);\n" 6776 "}\n", 6777 getLLVMStyleWithColumns(10))); 6778 } 6779 6780 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 6781 verifyFormat("int x = {\n" 6782 " avariable,\n" 6783 " b(alongervariable)};", 6784 getLLVMStyleWithColumns(25)); 6785 } 6786 6787 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 6788 verifyFormat("return (a)(b){1, 2, 3};"); 6789 } 6790 6791 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 6792 verifyFormat("vector<int> x{1, 2, 3, 4};"); 6793 verifyFormat("vector<int> x{\n" 6794 " 1,\n" 6795 " 2,\n" 6796 " 3,\n" 6797 " 4,\n" 6798 "};"); 6799 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 6800 verifyFormat("f({1, 2});"); 6801 verifyFormat("auto v = Foo{-1};"); 6802 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 6803 verifyFormat("Class::Class : member{1, 2, 3} {}"); 6804 verifyFormat("new vector<int>{1, 2, 3};"); 6805 verifyFormat("new int[3]{1, 2, 3};"); 6806 verifyFormat("new int{1};"); 6807 verifyFormat("return {arg1, arg2};"); 6808 verifyFormat("return {arg1, SomeType{parameter}};"); 6809 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 6810 verifyFormat("new T{arg1, arg2};"); 6811 verifyFormat("f(MyMap[{composite, key}]);"); 6812 verifyFormat("class Class {\n" 6813 " T member = {arg1, arg2};\n" 6814 "};"); 6815 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 6816 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 6817 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 6818 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 6819 verifyFormat("int a = std::is_integral<int>{} + 0;"); 6820 6821 verifyFormat("int foo(int i) { return fo1{}(i); }"); 6822 verifyFormat("int foo(int i) { return fo1{}(i); }"); 6823 verifyFormat("auto i = decltype(x){};"); 6824 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 6825 verifyFormat("Node n{1, Node{1000}, //\n" 6826 " 2};"); 6827 verifyFormat("Aaaa aaaaaaa{\n" 6828 " {\n" 6829 " aaaa,\n" 6830 " },\n" 6831 "};"); 6832 verifyFormat("class C : public D {\n" 6833 " SomeClass SC{2};\n" 6834 "};"); 6835 verifyFormat("class C : public A {\n" 6836 " class D : public B {\n" 6837 " void f() { int i{2}; }\n" 6838 " };\n" 6839 "};"); 6840 verifyFormat("#define A {a, a},"); 6841 6842 // Avoid breaking between equal sign and opening brace 6843 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 6844 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 6845 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 6846 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 6847 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 6848 " {\"ccccccccccccccccccccc\", 2}};", 6849 AvoidBreakingFirstArgument); 6850 6851 // Binpacking only if there is no trailing comma 6852 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 6853 " cccccccccc, dddddddddd};", 6854 getLLVMStyleWithColumns(50)); 6855 verifyFormat("const Aaaaaa aaaaa = {\n" 6856 " aaaaaaaaaaa,\n" 6857 " bbbbbbbbbbb,\n" 6858 " ccccccccccc,\n" 6859 " ddddddddddd,\n" 6860 "};", getLLVMStyleWithColumns(50)); 6861 6862 // Cases where distinguising braced lists and blocks is hard. 6863 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 6864 verifyFormat("void f() {\n" 6865 " return; // comment\n" 6866 "}\n" 6867 "SomeType t;"); 6868 verifyFormat("void f() {\n" 6869 " if (a) {\n" 6870 " f();\n" 6871 " }\n" 6872 "}\n" 6873 "SomeType t;"); 6874 6875 // In combination with BinPackArguments = false. 6876 FormatStyle NoBinPacking = getLLVMStyle(); 6877 NoBinPacking.BinPackArguments = false; 6878 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 6879 " bbbbb,\n" 6880 " ccccc,\n" 6881 " ddddd,\n" 6882 " eeeee,\n" 6883 " ffffff,\n" 6884 " ggggg,\n" 6885 " hhhhhh,\n" 6886 " iiiiii,\n" 6887 " jjjjjj,\n" 6888 " kkkkkk};", 6889 NoBinPacking); 6890 verifyFormat("const Aaaaaa aaaaa = {\n" 6891 " aaaaa,\n" 6892 " bbbbb,\n" 6893 " ccccc,\n" 6894 " ddddd,\n" 6895 " eeeee,\n" 6896 " ffffff,\n" 6897 " ggggg,\n" 6898 " hhhhhh,\n" 6899 " iiiiii,\n" 6900 " jjjjjj,\n" 6901 " kkkkkk,\n" 6902 "};", 6903 NoBinPacking); 6904 verifyFormat( 6905 "const Aaaaaa aaaaa = {\n" 6906 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 6907 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 6908 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 6909 "};", 6910 NoBinPacking); 6911 6912 // FIXME: The alignment of these trailing comments might be bad. Then again, 6913 // this might be utterly useless in real code. 6914 verifyFormat("Constructor::Constructor()\n" 6915 " : some_value{ //\n" 6916 " aaaaaaa, //\n" 6917 " bbbbbbb} {}"); 6918 6919 // In braced lists, the first comment is always assumed to belong to the 6920 // first element. Thus, it can be moved to the next or previous line as 6921 // appropriate. 6922 EXPECT_EQ("function({// First element:\n" 6923 " 1,\n" 6924 " // Second element:\n" 6925 " 2});", 6926 format("function({\n" 6927 " // First element:\n" 6928 " 1,\n" 6929 " // Second element:\n" 6930 " 2});")); 6931 EXPECT_EQ("std::vector<int> MyNumbers{\n" 6932 " // First element:\n" 6933 " 1,\n" 6934 " // Second element:\n" 6935 " 2};", 6936 format("std::vector<int> MyNumbers{// First element:\n" 6937 " 1,\n" 6938 " // Second element:\n" 6939 " 2};", 6940 getLLVMStyleWithColumns(30))); 6941 // A trailing comma should still lead to an enforced line break and no 6942 // binpacking. 6943 EXPECT_EQ("vector<int> SomeVector = {\n" 6944 " // aaa\n" 6945 " 1,\n" 6946 " 2,\n" 6947 "};", 6948 format("vector<int> SomeVector = { // aaa\n" 6949 " 1, 2, };")); 6950 6951 FormatStyle ExtraSpaces = getLLVMStyle(); 6952 ExtraSpaces.Cpp11BracedListStyle = false; 6953 ExtraSpaces.ColumnLimit = 75; 6954 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 6955 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 6956 verifyFormat("f({ 1, 2 });", ExtraSpaces); 6957 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 6958 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 6959 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 6960 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 6961 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 6962 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 6963 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 6964 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 6965 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 6966 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 6967 verifyFormat("class Class {\n" 6968 " T member = { arg1, arg2 };\n" 6969 "};", 6970 ExtraSpaces); 6971 verifyFormat( 6972 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6973 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 6974 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 6975 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 6976 ExtraSpaces); 6977 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 6978 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 6979 ExtraSpaces); 6980 verifyFormat( 6981 "someFunction(OtherParam,\n" 6982 " BracedList{ // comment 1 (Forcing interesting break)\n" 6983 " param1, param2,\n" 6984 " // comment 2\n" 6985 " param3, param4 });", 6986 ExtraSpaces); 6987 verifyFormat( 6988 "std::this_thread::sleep_for(\n" 6989 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 6990 ExtraSpaces); 6991 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 6992 " aaaaaaa,\n" 6993 " aaaaaaaaaa,\n" 6994 " aaaaa,\n" 6995 " aaaaaaaaaaaaaaa,\n" 6996 " aaa,\n" 6997 " aaaaaaaaaa,\n" 6998 " a,\n" 6999 " aaaaaaaaaaaaaaaaaaaaa,\n" 7000 " aaaaaaaaaaaa,\n" 7001 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 7002 " aaaaaaa,\n" 7003 " a};"); 7004 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 7005 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 7006 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 7007 7008 // Avoid breaking between initializer/equal sign and opening brace 7009 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 7010 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 7011 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 7012 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 7013 " { \"ccccccccccccccccccccc\", 2 }\n" 7014 "};", 7015 ExtraSpaces); 7016 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 7017 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 7018 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 7019 " { \"ccccccccccccccccccccc\", 2 }\n" 7020 "};", 7021 ExtraSpaces); 7022 7023 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 7024 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 7025 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 7026 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 7027 } 7028 7029 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 7030 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7031 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7032 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7033 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7034 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7035 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 7036 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 7037 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7038 " 1, 22, 333, 4444, 55555, //\n" 7039 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7040 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 7041 verifyFormat( 7042 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7043 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7044 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 7045 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7046 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7047 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7048 " 7777777};"); 7049 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7050 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7051 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7052 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7053 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7054 " // Separating comment.\n" 7055 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7056 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7057 " // Leading comment\n" 7058 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7059 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7060 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 7061 " 1, 1, 1, 1};", 7062 getLLVMStyleWithColumns(39)); 7063 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 7064 " 1, 1, 1, 1};", 7065 getLLVMStyleWithColumns(38)); 7066 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 7067 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 7068 getLLVMStyleWithColumns(43)); 7069 verifyFormat( 7070 "static unsigned SomeValues[10][3] = {\n" 7071 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 7072 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 7073 verifyFormat("static auto fields = new vector<string>{\n" 7074 " \"aaaaaaaaaaaaa\",\n" 7075 " \"aaaaaaaaaaaaa\",\n" 7076 " \"aaaaaaaaaaaa\",\n" 7077 " \"aaaaaaaaaaaaaa\",\n" 7078 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 7079 " \"aaaaaaaaaaaa\",\n" 7080 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 7081 "};"); 7082 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 7083 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 7084 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 7085 " 3, cccccccccccccccccccccc};", 7086 getLLVMStyleWithColumns(60)); 7087 7088 // Trailing commas. 7089 verifyFormat("vector<int> x = {\n" 7090 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 7091 "};", 7092 getLLVMStyleWithColumns(39)); 7093 verifyFormat("vector<int> x = {\n" 7094 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 7095 "};", 7096 getLLVMStyleWithColumns(39)); 7097 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 7098 " 1, 1, 1, 1,\n" 7099 " /**/ /**/};", 7100 getLLVMStyleWithColumns(39)); 7101 7102 // Trailing comment in the first line. 7103 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 7104 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 7105 " 111111111, 222222222, 3333333333, 444444444, //\n" 7106 " 11111111, 22222222, 333333333, 44444444};"); 7107 // Trailing comment in the last line. 7108 verifyFormat("int aaaaa[] = {\n" 7109 " 1, 2, 3, // comment\n" 7110 " 4, 5, 6 // comment\n" 7111 "};"); 7112 7113 // With nested lists, we should either format one item per line or all nested 7114 // lists one on line. 7115 // FIXME: For some nested lists, we can do better. 7116 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 7117 " {aaaaaaaaaaaaaaaaaaa},\n" 7118 " {aaaaaaaaaaaaaaaaaaaaa},\n" 7119 " {aaaaaaaaaaaaaaaaa}};", 7120 getLLVMStyleWithColumns(60)); 7121 verifyFormat( 7122 "SomeStruct my_struct_array = {\n" 7123 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 7124 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 7125 " {aaa, aaa},\n" 7126 " {aaa, aaa},\n" 7127 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 7128 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 7129 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 7130 7131 // No column layout should be used here. 7132 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 7133 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 7134 7135 verifyNoCrash("a<,"); 7136 7137 // No braced initializer here. 7138 verifyFormat("void f() {\n" 7139 " struct Dummy {};\n" 7140 " f(v);\n" 7141 "}"); 7142 7143 // Long lists should be formatted in columns even if they are nested. 7144 verifyFormat( 7145 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7146 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7147 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7148 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7149 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7150 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 7151 7152 // Allow "single-column" layout even if that violates the column limit. There 7153 // isn't going to be a better way. 7154 verifyFormat("std::vector<int> a = {\n" 7155 " aaaaaaaa,\n" 7156 " aaaaaaaa,\n" 7157 " aaaaaaaa,\n" 7158 " aaaaaaaa,\n" 7159 " aaaaaaaaaa,\n" 7160 " aaaaaaaa,\n" 7161 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 7162 getLLVMStyleWithColumns(30)); 7163 verifyFormat("vector<int> aaaa = {\n" 7164 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7165 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7166 " aaaaaa.aaaaaaa,\n" 7167 " aaaaaa.aaaaaaa,\n" 7168 " aaaaaa.aaaaaaa,\n" 7169 " aaaaaa.aaaaaaa,\n" 7170 "};"); 7171 7172 // Don't create hanging lists. 7173 verifyFormat("someFunction(Param, {List1, List2,\n" 7174 " List3});", 7175 getLLVMStyleWithColumns(35)); 7176 verifyFormat("someFunction(Param, Param,\n" 7177 " {List1, List2,\n" 7178 " List3});", 7179 getLLVMStyleWithColumns(35)); 7180 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 7181 " aaaaaaaaaaaaaaaaaaaaaaa);"); 7182 } 7183 7184 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 7185 FormatStyle DoNotMerge = getLLVMStyle(); 7186 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7187 7188 verifyFormat("void f() { return 42; }"); 7189 verifyFormat("void f() {\n" 7190 " return 42;\n" 7191 "}", 7192 DoNotMerge); 7193 verifyFormat("void f() {\n" 7194 " // Comment\n" 7195 "}"); 7196 verifyFormat("{\n" 7197 "#error {\n" 7198 " int a;\n" 7199 "}"); 7200 verifyFormat("{\n" 7201 " int a;\n" 7202 "#error {\n" 7203 "}"); 7204 verifyFormat("void f() {} // comment"); 7205 verifyFormat("void f() { int a; } // comment"); 7206 verifyFormat("void f() {\n" 7207 "} // comment", 7208 DoNotMerge); 7209 verifyFormat("void f() {\n" 7210 " int a;\n" 7211 "} // comment", 7212 DoNotMerge); 7213 verifyFormat("void f() {\n" 7214 "} // comment", 7215 getLLVMStyleWithColumns(15)); 7216 7217 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 7218 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 7219 7220 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 7221 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 7222 verifyFormat("class C {\n" 7223 " C()\n" 7224 " : iiiiiiii(nullptr),\n" 7225 " kkkkkkk(nullptr),\n" 7226 " mmmmmmm(nullptr),\n" 7227 " nnnnnnn(nullptr) {}\n" 7228 "};", 7229 getGoogleStyle()); 7230 7231 FormatStyle NoColumnLimit = getLLVMStyle(); 7232 NoColumnLimit.ColumnLimit = 0; 7233 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 7234 EXPECT_EQ("class C {\n" 7235 " A() : b(0) {}\n" 7236 "};", 7237 format("class C{A():b(0){}};", NoColumnLimit)); 7238 EXPECT_EQ("A()\n" 7239 " : b(0) {\n" 7240 "}", 7241 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 7242 7243 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 7244 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 7245 FormatStyle::SFS_None; 7246 EXPECT_EQ("A()\n" 7247 " : b(0) {\n" 7248 "}", 7249 format("A():b(0){}", DoNotMergeNoColumnLimit)); 7250 EXPECT_EQ("A()\n" 7251 " : b(0) {\n" 7252 "}", 7253 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 7254 7255 verifyFormat("#define A \\\n" 7256 " void f() { \\\n" 7257 " int i; \\\n" 7258 " }", 7259 getLLVMStyleWithColumns(20)); 7260 verifyFormat("#define A \\\n" 7261 " void f() { int i; }", 7262 getLLVMStyleWithColumns(21)); 7263 verifyFormat("#define A \\\n" 7264 " void f() { \\\n" 7265 " int i; \\\n" 7266 " } \\\n" 7267 " int j;", 7268 getLLVMStyleWithColumns(22)); 7269 verifyFormat("#define A \\\n" 7270 " void f() { int i; } \\\n" 7271 " int j;", 7272 getLLVMStyleWithColumns(23)); 7273 } 7274 7275 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 7276 FormatStyle MergeEmptyOnly = getLLVMStyle(); 7277 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 7278 verifyFormat("class C {\n" 7279 " int f() {}\n" 7280 "};", 7281 MergeEmptyOnly); 7282 verifyFormat("class C {\n" 7283 " int f() {\n" 7284 " return 42;\n" 7285 " }\n" 7286 "};", 7287 MergeEmptyOnly); 7288 verifyFormat("int f() {}", MergeEmptyOnly); 7289 verifyFormat("int f() {\n" 7290 " return 42;\n" 7291 "}", 7292 MergeEmptyOnly); 7293 7294 // Also verify behavior when BraceWrapping.AfterFunction = true 7295 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 7296 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 7297 verifyFormat("int f() {}", MergeEmptyOnly); 7298 verifyFormat("class C {\n" 7299 " int f() {}\n" 7300 "};", 7301 MergeEmptyOnly); 7302 } 7303 7304 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 7305 FormatStyle MergeInlineOnly = getLLVMStyle(); 7306 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 7307 verifyFormat("class C {\n" 7308 " int f() { return 42; }\n" 7309 "};", 7310 MergeInlineOnly); 7311 verifyFormat("int f() {\n" 7312 " return 42;\n" 7313 "}", 7314 MergeInlineOnly); 7315 7316 // SFS_Inline implies SFS_Empty 7317 verifyFormat("class C {\n" 7318 " int f() {}\n" 7319 "};", 7320 MergeInlineOnly); 7321 verifyFormat("int f() {}", MergeInlineOnly); 7322 7323 // Also verify behavior when BraceWrapping.AfterFunction = true 7324 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 7325 MergeInlineOnly.BraceWrapping.AfterFunction = true; 7326 verifyFormat("class C {\n" 7327 " int f() { return 42; }\n" 7328 "};", 7329 MergeInlineOnly); 7330 verifyFormat("int f()\n" 7331 "{\n" 7332 " return 42;\n" 7333 "}", 7334 MergeInlineOnly); 7335 7336 // SFS_Inline implies SFS_Empty 7337 verifyFormat("int f() {}", MergeInlineOnly); 7338 verifyFormat("class C {\n" 7339 " int f() {}\n" 7340 "};", 7341 MergeInlineOnly); 7342 } 7343 7344 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 7345 FormatStyle MergeInlineOnly = getLLVMStyle(); 7346 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 7347 FormatStyle::SFS_InlineOnly; 7348 verifyFormat("class C {\n" 7349 " int f() { return 42; }\n" 7350 "};", 7351 MergeInlineOnly); 7352 verifyFormat("int f() {\n" 7353 " return 42;\n" 7354 "}", 7355 MergeInlineOnly); 7356 7357 // SFS_InlineOnly does not imply SFS_Empty 7358 verifyFormat("class C {\n" 7359 " int f() {}\n" 7360 "};", 7361 MergeInlineOnly); 7362 verifyFormat("int f() {\n" 7363 "}", 7364 MergeInlineOnly); 7365 7366 // Also verify behavior when BraceWrapping.AfterFunction = true 7367 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 7368 MergeInlineOnly.BraceWrapping.AfterFunction = true; 7369 verifyFormat("class C {\n" 7370 " int f() { return 42; }\n" 7371 "};", 7372 MergeInlineOnly); 7373 verifyFormat("int f()\n" 7374 "{\n" 7375 " return 42;\n" 7376 "}", 7377 MergeInlineOnly); 7378 7379 // SFS_InlineOnly does not imply SFS_Empty 7380 verifyFormat("int f()\n" 7381 "{\n" 7382 "}", 7383 MergeInlineOnly); 7384 verifyFormat("class C {\n" 7385 " int f() {}\n" 7386 "};", 7387 MergeInlineOnly); 7388 } 7389 7390 TEST_F(FormatTest, SplitEmptyFunction) { 7391 FormatStyle Style = getLLVMStyle(); 7392 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7393 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 7394 Style.BraceWrapping.AfterFunction = true; 7395 Style.BraceWrapping.SplitEmptyFunction = false; 7396 Style.ColumnLimit = 40; 7397 7398 verifyFormat("int f()\n" 7399 "{}", 7400 Style); 7401 verifyFormat("int f()\n" 7402 "{\n" 7403 " return 42;\n" 7404 "}", 7405 Style); 7406 verifyFormat("int f()\n" 7407 "{\n" 7408 " // some comment\n" 7409 "}", 7410 Style); 7411 7412 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 7413 verifyFormat("int f() {}", Style); 7414 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 7415 "{}", 7416 Style); 7417 verifyFormat("int f()\n" 7418 "{\n" 7419 " return 0;\n" 7420 "}", 7421 Style); 7422 7423 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 7424 verifyFormat("class Foo {\n" 7425 " int f() {}\n" 7426 "};\n", 7427 Style); 7428 verifyFormat("class Foo {\n" 7429 " int f() { return 0; }\n" 7430 "};\n", 7431 Style); 7432 verifyFormat("class Foo {\n" 7433 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 7434 " {}\n" 7435 "};\n", 7436 Style); 7437 verifyFormat("class Foo {\n" 7438 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 7439 " {\n" 7440 " return 0;\n" 7441 " }\n" 7442 "};\n", 7443 Style); 7444 7445 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 7446 verifyFormat("int f() {}", Style); 7447 verifyFormat("int f() { return 0; }", Style); 7448 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 7449 "{}", 7450 Style); 7451 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 7452 "{\n" 7453 " return 0;\n" 7454 "}", 7455 Style); 7456 } 7457 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 7458 FormatStyle Style = getLLVMStyle(); 7459 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 7460 verifyFormat("#ifdef A\n" 7461 "int f() {}\n" 7462 "#else\n" 7463 "int g() {}\n" 7464 "#endif", 7465 Style); 7466 } 7467 7468 TEST_F(FormatTest, SplitEmptyClass) { 7469 FormatStyle Style = getLLVMStyle(); 7470 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 7471 Style.BraceWrapping.AfterClass = true; 7472 Style.BraceWrapping.SplitEmptyRecord = false; 7473 7474 verifyFormat("class Foo\n" 7475 "{};", 7476 Style); 7477 verifyFormat("/* something */ class Foo\n" 7478 "{};", 7479 Style); 7480 verifyFormat("template <typename X> class Foo\n" 7481 "{};", 7482 Style); 7483 verifyFormat("class Foo\n" 7484 "{\n" 7485 " Foo();\n" 7486 "};", 7487 Style); 7488 verifyFormat("typedef class Foo\n" 7489 "{\n" 7490 "} Foo_t;", 7491 Style); 7492 } 7493 7494 TEST_F(FormatTest, SplitEmptyStruct) { 7495 FormatStyle Style = getLLVMStyle(); 7496 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 7497 Style.BraceWrapping.AfterStruct = true; 7498 Style.BraceWrapping.SplitEmptyRecord = false; 7499 7500 verifyFormat("struct Foo\n" 7501 "{};", 7502 Style); 7503 verifyFormat("/* something */ struct Foo\n" 7504 "{};", 7505 Style); 7506 verifyFormat("template <typename X> struct Foo\n" 7507 "{};", 7508 Style); 7509 verifyFormat("struct Foo\n" 7510 "{\n" 7511 " Foo();\n" 7512 "};", 7513 Style); 7514 verifyFormat("typedef struct Foo\n" 7515 "{\n" 7516 "} Foo_t;", 7517 Style); 7518 //typedef struct Bar {} Bar_t; 7519 } 7520 7521 TEST_F(FormatTest, SplitEmptyUnion) { 7522 FormatStyle Style = getLLVMStyle(); 7523 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 7524 Style.BraceWrapping.AfterUnion = true; 7525 Style.BraceWrapping.SplitEmptyRecord = false; 7526 7527 verifyFormat("union Foo\n" 7528 "{};", 7529 Style); 7530 verifyFormat("/* something */ union Foo\n" 7531 "{};", 7532 Style); 7533 verifyFormat("union Foo\n" 7534 "{\n" 7535 " A,\n" 7536 "};", 7537 Style); 7538 verifyFormat("typedef union Foo\n" 7539 "{\n" 7540 "} Foo_t;", 7541 Style); 7542 } 7543 7544 TEST_F(FormatTest, SplitEmptyNamespace) { 7545 FormatStyle Style = getLLVMStyle(); 7546 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 7547 Style.BraceWrapping.AfterNamespace = true; 7548 Style.BraceWrapping.SplitEmptyNamespace = false; 7549 7550 verifyFormat("namespace Foo\n" 7551 "{};", 7552 Style); 7553 verifyFormat("/* something */ namespace Foo\n" 7554 "{};", 7555 Style); 7556 verifyFormat("inline namespace Foo\n" 7557 "{};", 7558 Style); 7559 verifyFormat("namespace Foo\n" 7560 "{\n" 7561 "void Bar();\n" 7562 "};", 7563 Style); 7564 } 7565 7566 TEST_F(FormatTest, NeverMergeShortRecords) { 7567 FormatStyle Style = getLLVMStyle(); 7568 7569 verifyFormat("class Foo {\n" 7570 " Foo();\n" 7571 "};", 7572 Style); 7573 verifyFormat("typedef class Foo {\n" 7574 " Foo();\n" 7575 "} Foo_t;", 7576 Style); 7577 verifyFormat("struct Foo {\n" 7578 " Foo();\n" 7579 "};", 7580 Style); 7581 verifyFormat("typedef struct Foo {\n" 7582 " Foo();\n" 7583 "} Foo_t;", 7584 Style); 7585 verifyFormat("union Foo {\n" 7586 " A,\n" 7587 "};", 7588 Style); 7589 verifyFormat("typedef union Foo {\n" 7590 " A,\n" 7591 "} Foo_t;", 7592 Style); 7593 verifyFormat("namespace Foo {\n" 7594 "void Bar();\n" 7595 "};", 7596 Style); 7597 7598 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 7599 Style.BraceWrapping.AfterClass = true; 7600 Style.BraceWrapping.AfterStruct = true; 7601 Style.BraceWrapping.AfterUnion = true; 7602 Style.BraceWrapping.AfterNamespace = true; 7603 verifyFormat("class Foo\n" 7604 "{\n" 7605 " Foo();\n" 7606 "};", 7607 Style); 7608 verifyFormat("typedef class Foo\n" 7609 "{\n" 7610 " Foo();\n" 7611 "} Foo_t;", 7612 Style); 7613 verifyFormat("struct Foo\n" 7614 "{\n" 7615 " Foo();\n" 7616 "};", 7617 Style); 7618 verifyFormat("typedef struct Foo\n" 7619 "{\n" 7620 " Foo();\n" 7621 "} Foo_t;", 7622 Style); 7623 verifyFormat("union Foo\n" 7624 "{\n" 7625 " A,\n" 7626 "};", 7627 Style); 7628 verifyFormat("typedef union Foo\n" 7629 "{\n" 7630 " A,\n" 7631 "} Foo_t;", 7632 Style); 7633 verifyFormat("namespace Foo\n" 7634 "{\n" 7635 "void Bar();\n" 7636 "};", 7637 Style); 7638 } 7639 7640 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 7641 // Elaborate type variable declarations. 7642 verifyFormat("struct foo a = {bar};\nint n;"); 7643 verifyFormat("class foo a = {bar};\nint n;"); 7644 verifyFormat("union foo a = {bar};\nint n;"); 7645 7646 // Elaborate types inside function definitions. 7647 verifyFormat("struct foo f() {}\nint n;"); 7648 verifyFormat("class foo f() {}\nint n;"); 7649 verifyFormat("union foo f() {}\nint n;"); 7650 7651 // Templates. 7652 verifyFormat("template <class X> void f() {}\nint n;"); 7653 verifyFormat("template <struct X> void f() {}\nint n;"); 7654 verifyFormat("template <union X> void f() {}\nint n;"); 7655 7656 // Actual definitions... 7657 verifyFormat("struct {\n} n;"); 7658 verifyFormat( 7659 "template <template <class T, class Y>, class Z> class X {\n} n;"); 7660 verifyFormat("union Z {\n int n;\n} x;"); 7661 verifyFormat("class MACRO Z {\n} n;"); 7662 verifyFormat("class MACRO(X) Z {\n} n;"); 7663 verifyFormat("class __attribute__(X) Z {\n} n;"); 7664 verifyFormat("class __declspec(X) Z {\n} n;"); 7665 verifyFormat("class A##B##C {\n} n;"); 7666 verifyFormat("class alignas(16) Z {\n} n;"); 7667 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 7668 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 7669 7670 // Redefinition from nested context: 7671 verifyFormat("class A::B::C {\n} n;"); 7672 7673 // Template definitions. 7674 verifyFormat( 7675 "template <typename F>\n" 7676 "Matcher(const Matcher<F> &Other,\n" 7677 " typename enable_if_c<is_base_of<F, T>::value &&\n" 7678 " !is_same<F, T>::value>::type * = 0)\n" 7679 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 7680 7681 // FIXME: This is still incorrectly handled at the formatter side. 7682 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 7683 verifyFormat("int i = SomeFunction(a<b, a> b);"); 7684 7685 // FIXME: 7686 // This now gets parsed incorrectly as class definition. 7687 // verifyFormat("class A<int> f() {\n}\nint n;"); 7688 7689 // Elaborate types where incorrectly parsing the structural element would 7690 // break the indent. 7691 verifyFormat("if (true)\n" 7692 " class X x;\n" 7693 "else\n" 7694 " f();\n"); 7695 7696 // This is simply incomplete. Formatting is not important, but must not crash. 7697 verifyFormat("class A:"); 7698 } 7699 7700 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 7701 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 7702 format("#error Leave all white!!!!! space* alone!\n")); 7703 EXPECT_EQ( 7704 "#warning Leave all white!!!!! space* alone!\n", 7705 format("#warning Leave all white!!!!! space* alone!\n")); 7706 EXPECT_EQ("#error 1", format(" # error 1")); 7707 EXPECT_EQ("#warning 1", format(" # warning 1")); 7708 } 7709 7710 TEST_F(FormatTest, FormatHashIfExpressions) { 7711 verifyFormat("#if AAAA && BBBB"); 7712 verifyFormat("#if (AAAA && BBBB)"); 7713 verifyFormat("#elif (AAAA && BBBB)"); 7714 // FIXME: Come up with a better indentation for #elif. 7715 verifyFormat( 7716 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 7717 " defined(BBBBBBBB)\n" 7718 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 7719 " defined(BBBBBBBB)\n" 7720 "#endif", 7721 getLLVMStyleWithColumns(65)); 7722 } 7723 7724 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 7725 FormatStyle AllowsMergedIf = getGoogleStyle(); 7726 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true; 7727 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 7728 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 7729 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 7730 EXPECT_EQ("if (true) return 42;", 7731 format("if (true)\nreturn 42;", AllowsMergedIf)); 7732 FormatStyle ShortMergedIf = AllowsMergedIf; 7733 ShortMergedIf.ColumnLimit = 25; 7734 verifyFormat("#define A \\\n" 7735 " if (true) return 42;", 7736 ShortMergedIf); 7737 verifyFormat("#define A \\\n" 7738 " f(); \\\n" 7739 " if (true)\n" 7740 "#define B", 7741 ShortMergedIf); 7742 verifyFormat("#define A \\\n" 7743 " f(); \\\n" 7744 " if (true)\n" 7745 "g();", 7746 ShortMergedIf); 7747 verifyFormat("{\n" 7748 "#ifdef A\n" 7749 " // Comment\n" 7750 " if (true) continue;\n" 7751 "#endif\n" 7752 " // Comment\n" 7753 " if (true) continue;\n" 7754 "}", 7755 ShortMergedIf); 7756 ShortMergedIf.ColumnLimit = 33; 7757 verifyFormat("#define A \\\n" 7758 " if constexpr (true) return 42;", 7759 ShortMergedIf); 7760 ShortMergedIf.ColumnLimit = 29; 7761 verifyFormat("#define A \\\n" 7762 " if (aaaaaaaaaa) return 1; \\\n" 7763 " return 2;", 7764 ShortMergedIf); 7765 ShortMergedIf.ColumnLimit = 28; 7766 verifyFormat("#define A \\\n" 7767 " if (aaaaaaaaaa) \\\n" 7768 " return 1; \\\n" 7769 " return 2;", 7770 ShortMergedIf); 7771 verifyFormat("#define A \\\n" 7772 " if constexpr (aaaaaaa) \\\n" 7773 " return 1; \\\n" 7774 " return 2;", 7775 ShortMergedIf); 7776 } 7777 7778 TEST_F(FormatTest, FormatStarDependingOnContext) { 7779 verifyFormat("void f(int *a);"); 7780 verifyFormat("void f() { f(fint * b); }"); 7781 verifyFormat("class A {\n void f(int *a);\n};"); 7782 verifyFormat("class A {\n int *a;\n};"); 7783 verifyFormat("namespace a {\n" 7784 "namespace b {\n" 7785 "class A {\n" 7786 " void f() {}\n" 7787 " int *a;\n" 7788 "};\n" 7789 "} // namespace b\n" 7790 "} // namespace a"); 7791 } 7792 7793 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 7794 verifyFormat("while"); 7795 verifyFormat("operator"); 7796 } 7797 7798 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 7799 // This code would be painfully slow to format if we didn't skip it. 7800 std::string Code("A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" // 20x 7801 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 7802 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 7803 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 7804 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 7805 "A(1, 1)\n" 7806 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 7807 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 7808 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 7809 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 7810 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 7811 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 7812 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 7813 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 7814 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 7815 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 7816 // Deeply nested part is untouched, rest is formatted. 7817 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 7818 format(std::string("int i;\n") + Code + "int j;\n", 7819 getLLVMStyle(), SC_ExpectIncomplete)); 7820 } 7821 7822 //===----------------------------------------------------------------------===// 7823 // Objective-C tests. 7824 //===----------------------------------------------------------------------===// 7825 7826 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 7827 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 7828 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 7829 format("-(NSUInteger)indexOfObject:(id)anObject;")); 7830 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 7831 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 7832 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 7833 format("-(NSInteger)Method3:(id)anObject;")); 7834 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 7835 format("-(NSInteger)Method4:(id)anObject;")); 7836 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 7837 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 7838 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 7839 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 7840 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 7841 "forAllCells:(BOOL)flag;", 7842 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 7843 "forAllCells:(BOOL)flag;")); 7844 7845 // Very long objectiveC method declaration. 7846 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 7847 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 7848 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 7849 " inRange:(NSRange)range\n" 7850 " outRange:(NSRange)out_range\n" 7851 " outRange1:(NSRange)out_range1\n" 7852 " outRange2:(NSRange)out_range2\n" 7853 " outRange3:(NSRange)out_range3\n" 7854 " outRange4:(NSRange)out_range4\n" 7855 " outRange5:(NSRange)out_range5\n" 7856 " outRange6:(NSRange)out_range6\n" 7857 " outRange7:(NSRange)out_range7\n" 7858 " outRange8:(NSRange)out_range8\n" 7859 " outRange9:(NSRange)out_range9;"); 7860 7861 // When the function name has to be wrapped. 7862 FormatStyle Style = getLLVMStyle(); 7863 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 7864 // and always indents instead. 7865 Style.IndentWrappedFunctionNames = false; 7866 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 7867 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 7868 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 7869 "}", 7870 Style); 7871 Style.IndentWrappedFunctionNames = true; 7872 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 7873 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 7874 " anotherName:(NSString)dddddddddddddd {\n" 7875 "}", 7876 Style); 7877 7878 verifyFormat("- (int)sum:(vector<int>)numbers;"); 7879 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 7880 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 7881 // protocol lists (but not for template classes): 7882 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 7883 7884 verifyFormat("- (int (*)())foo:(int (*)())f;"); 7885 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 7886 7887 // If there's no return type (very rare in practice!), LLVM and Google style 7888 // agree. 7889 verifyFormat("- foo;"); 7890 verifyFormat("- foo:(int)f;"); 7891 verifyGoogleFormat("- foo:(int)foo;"); 7892 } 7893 7894 7895 TEST_F(FormatTest, BreaksStringLiterals) { 7896 EXPECT_EQ("\"some text \"\n" 7897 "\"other\";", 7898 format("\"some text other\";", getLLVMStyleWithColumns(12))); 7899 EXPECT_EQ("\"some text \"\n" 7900 "\"other\";", 7901 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 7902 EXPECT_EQ( 7903 "#define A \\\n" 7904 " \"some \" \\\n" 7905 " \"text \" \\\n" 7906 " \"other\";", 7907 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 7908 EXPECT_EQ( 7909 "#define A \\\n" 7910 " \"so \" \\\n" 7911 " \"text \" \\\n" 7912 " \"other\";", 7913 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 7914 7915 EXPECT_EQ("\"some text\"", 7916 format("\"some text\"", getLLVMStyleWithColumns(1))); 7917 EXPECT_EQ("\"some text\"", 7918 format("\"some text\"", getLLVMStyleWithColumns(11))); 7919 EXPECT_EQ("\"some \"\n" 7920 "\"text\"", 7921 format("\"some text\"", getLLVMStyleWithColumns(10))); 7922 EXPECT_EQ("\"some \"\n" 7923 "\"text\"", 7924 format("\"some text\"", getLLVMStyleWithColumns(7))); 7925 EXPECT_EQ("\"some\"\n" 7926 "\" tex\"\n" 7927 "\"t\"", 7928 format("\"some text\"", getLLVMStyleWithColumns(6))); 7929 EXPECT_EQ("\"some\"\n" 7930 "\" tex\"\n" 7931 "\" and\"", 7932 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 7933 EXPECT_EQ("\"some\"\n" 7934 "\"/tex\"\n" 7935 "\"/and\"", 7936 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 7937 7938 EXPECT_EQ("variable =\n" 7939 " \"long string \"\n" 7940 " \"literal\";", 7941 format("variable = \"long string literal\";", 7942 getLLVMStyleWithColumns(20))); 7943 7944 EXPECT_EQ("variable = f(\n" 7945 " \"long string \"\n" 7946 " \"literal\",\n" 7947 " short,\n" 7948 " loooooooooooooooooooong);", 7949 format("variable = f(\"long string literal\", short, " 7950 "loooooooooooooooooooong);", 7951 getLLVMStyleWithColumns(20))); 7952 7953 EXPECT_EQ( 7954 "f(g(\"long string \"\n" 7955 " \"literal\"),\n" 7956 " b);", 7957 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 7958 EXPECT_EQ("f(g(\"long string \"\n" 7959 " \"literal\",\n" 7960 " a),\n" 7961 " b);", 7962 format("f(g(\"long string literal\", a), b);", 7963 getLLVMStyleWithColumns(20))); 7964 EXPECT_EQ( 7965 "f(\"one two\".split(\n" 7966 " variable));", 7967 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 7968 EXPECT_EQ("f(\"one two three four five six \"\n" 7969 " \"seven\".split(\n" 7970 " really_looooong_variable));", 7971 format("f(\"one two three four five six seven\"." 7972 "split(really_looooong_variable));", 7973 getLLVMStyleWithColumns(33))); 7974 7975 EXPECT_EQ("f(\"some \"\n" 7976 " \"text\",\n" 7977 " other);", 7978 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 7979 7980 // Only break as a last resort. 7981 verifyFormat( 7982 "aaaaaaaaaaaaaaaaaaaa(\n" 7983 " aaaaaaaaaaaaaaaaaaaa,\n" 7984 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 7985 7986 EXPECT_EQ("\"splitmea\"\n" 7987 "\"trandomp\"\n" 7988 "\"oint\"", 7989 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 7990 7991 EXPECT_EQ("\"split/\"\n" 7992 "\"pathat/\"\n" 7993 "\"slashes\"", 7994 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 7995 7996 EXPECT_EQ("\"split/\"\n" 7997 "\"pathat/\"\n" 7998 "\"slashes\"", 7999 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 8000 EXPECT_EQ("\"split at \"\n" 8001 "\"spaces/at/\"\n" 8002 "\"slashes.at.any$\"\n" 8003 "\"non-alphanumeric%\"\n" 8004 "\"1111111111characte\"\n" 8005 "\"rs\"", 8006 format("\"split at " 8007 "spaces/at/" 8008 "slashes.at." 8009 "any$non-" 8010 "alphanumeric%" 8011 "1111111111characte" 8012 "rs\"", 8013 getLLVMStyleWithColumns(20))); 8014 8015 // Verify that splitting the strings understands 8016 // Style::AlwaysBreakBeforeMultilineStrings. 8017 EXPECT_EQ( 8018 "aaaaaaaaaaaa(\n" 8019 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 8020 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 8021 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 8022 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 8023 "aaaaaaaaaaaaaaaaaaaaaa\");", 8024 getGoogleStyle())); 8025 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8026 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 8027 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 8028 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 8029 "aaaaaaaaaaaaaaaaaaaaaa\";", 8030 getGoogleStyle())); 8031 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8032 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 8033 format("llvm::outs() << " 8034 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 8035 "aaaaaaaaaaaaaaaaaaa\";")); 8036 EXPECT_EQ("ffff(\n" 8037 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8038 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 8039 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 8040 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 8041 getGoogleStyle())); 8042 8043 FormatStyle Style = getLLVMStyleWithColumns(12); 8044 Style.BreakStringLiterals = false; 8045 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 8046 8047 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 8048 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 8049 EXPECT_EQ("#define A \\\n" 8050 " \"some \" \\\n" 8051 " \"text \" \\\n" 8052 " \"other\";", 8053 format("#define A \"some text other\";", AlignLeft)); 8054 } 8055 8056 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 8057 EXPECT_EQ("C a = \"some more \"\n" 8058 " \"text\";", 8059 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 8060 } 8061 8062 TEST_F(FormatTest, FullyRemoveEmptyLines) { 8063 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 8064 NoEmptyLines.MaxEmptyLinesToKeep = 0; 8065 EXPECT_EQ("int i = a(b());", 8066 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 8067 } 8068 8069 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 8070 EXPECT_EQ( 8071 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 8072 "(\n" 8073 " \"x\t\");", 8074 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 8075 "aaaaaaa(" 8076 "\"x\t\");")); 8077 } 8078 8079 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 8080 EXPECT_EQ( 8081 "u8\"utf8 string \"\n" 8082 "u8\"literal\";", 8083 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 8084 EXPECT_EQ( 8085 "u\"utf16 string \"\n" 8086 "u\"literal\";", 8087 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 8088 EXPECT_EQ( 8089 "U\"utf32 string \"\n" 8090 "U\"literal\";", 8091 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 8092 EXPECT_EQ("L\"wide string \"\n" 8093 "L\"literal\";", 8094 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 8095 EXPECT_EQ("@\"NSString \"\n" 8096 "@\"literal\";", 8097 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 8098 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 8099 8100 // This input makes clang-format try to split the incomplete unicode escape 8101 // sequence, which used to lead to a crasher. 8102 verifyNoCrash( 8103 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 8104 getLLVMStyleWithColumns(60)); 8105 } 8106 8107 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 8108 FormatStyle Style = getGoogleStyleWithColumns(15); 8109 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 8110 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 8111 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 8112 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 8113 EXPECT_EQ("u8R\"x(raw literal)x\";", 8114 format("u8R\"x(raw literal)x\";", Style)); 8115 } 8116 8117 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 8118 FormatStyle Style = getLLVMStyleWithColumns(20); 8119 EXPECT_EQ( 8120 "_T(\"aaaaaaaaaaaaaa\")\n" 8121 "_T(\"aaaaaaaaaaaaaa\")\n" 8122 "_T(\"aaaaaaaaaaaa\")", 8123 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 8124 EXPECT_EQ("f(x,\n" 8125 " _T(\"aaaaaaaaaaaa\")\n" 8126 " _T(\"aaa\"),\n" 8127 " z);", 8128 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 8129 8130 // FIXME: Handle embedded spaces in one iteration. 8131 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 8132 // "_T(\"aaaaaaaaaaaaa\")\n" 8133 // "_T(\"aaaaaaaaaaaaa\")\n" 8134 // "_T(\"a\")", 8135 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 8136 // getLLVMStyleWithColumns(20))); 8137 EXPECT_EQ( 8138 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 8139 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 8140 EXPECT_EQ("f(\n" 8141 "#if !TEST\n" 8142 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 8143 "#endif\n" 8144 ");", 8145 format("f(\n" 8146 "#if !TEST\n" 8147 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 8148 "#endif\n" 8149 ");")); 8150 EXPECT_EQ("f(\n" 8151 "\n" 8152 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 8153 format("f(\n" 8154 "\n" 8155 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 8156 } 8157 8158 TEST_F(FormatTest, BreaksStringLiteralOperands) { 8159 // In a function call with two operands, the second can be broken with no line 8160 // break before it. 8161 EXPECT_EQ("func(a, \"long long \"\n" 8162 " \"long long\");", 8163 format("func(a, \"long long long long\");", 8164 getLLVMStyleWithColumns(24))); 8165 // In a function call with three operands, the second must be broken with a 8166 // line break before it. 8167 EXPECT_EQ("func(a,\n" 8168 " \"long long long \"\n" 8169 " \"long\",\n" 8170 " c);", 8171 format("func(a, \"long long long long\", c);", 8172 getLLVMStyleWithColumns(24))); 8173 // In a function call with three operands, the third must be broken with a 8174 // line break before it. 8175 EXPECT_EQ("func(a, b,\n" 8176 " \"long long long \"\n" 8177 " \"long\");", 8178 format("func(a, b, \"long long long long\");", 8179 getLLVMStyleWithColumns(24))); 8180 // In a function call with three operands, both the second and the third must 8181 // be broken with a line break before them. 8182 EXPECT_EQ("func(a,\n" 8183 " \"long long long \"\n" 8184 " \"long\",\n" 8185 " \"long long long \"\n" 8186 " \"long\");", 8187 format("func(a, \"long long long long\", \"long long long long\");", 8188 getLLVMStyleWithColumns(24))); 8189 // In a chain of << with two operands, the second can be broken with no line 8190 // break before it. 8191 EXPECT_EQ("a << \"line line \"\n" 8192 " \"line\";", 8193 format("a << \"line line line\";", 8194 getLLVMStyleWithColumns(20))); 8195 // In a chain of << with three operands, the second can be broken with no line 8196 // break before it. 8197 EXPECT_EQ("abcde << \"line \"\n" 8198 " \"line line\"\n" 8199 " << c;", 8200 format("abcde << \"line line line\" << c;", 8201 getLLVMStyleWithColumns(20))); 8202 // In a chain of << with three operands, the third must be broken with a line 8203 // break before it. 8204 EXPECT_EQ("a << b\n" 8205 " << \"line line \"\n" 8206 " \"line\";", 8207 format("a << b << \"line line line\";", 8208 getLLVMStyleWithColumns(20))); 8209 // In a chain of << with three operands, the second can be broken with no line 8210 // break before it and the third must be broken with a line break before it. 8211 EXPECT_EQ("abcd << \"line line \"\n" 8212 " \"line\"\n" 8213 " << \"line line \"\n" 8214 " \"line\";", 8215 format("abcd << \"line line line\" << \"line line line\";", 8216 getLLVMStyleWithColumns(20))); 8217 // In a chain of binary operators with two operands, the second can be broken 8218 // with no line break before it. 8219 EXPECT_EQ("abcd + \"line line \"\n" 8220 " \"line line\";", 8221 format("abcd + \"line line line line\";", 8222 getLLVMStyleWithColumns(20))); 8223 // In a chain of binary operators with three operands, the second must be 8224 // broken with a line break before it. 8225 EXPECT_EQ("abcd +\n" 8226 " \"line line \"\n" 8227 " \"line line\" +\n" 8228 " e;", 8229 format("abcd + \"line line line line\" + e;", 8230 getLLVMStyleWithColumns(20))); 8231 // In a function call with two operands, with AlignAfterOpenBracket enabled, 8232 // the first must be broken with a line break before it. 8233 FormatStyle Style = getLLVMStyleWithColumns(25); 8234 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8235 EXPECT_EQ("someFunction(\n" 8236 " \"long long long \"\n" 8237 " \"long\",\n" 8238 " a);", 8239 format("someFunction(\"long long long long\", a);", Style)); 8240 } 8241 8242 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 8243 EXPECT_EQ( 8244 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 8245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 8246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 8247 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 8248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 8249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 8250 } 8251 8252 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 8253 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 8254 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 8255 EXPECT_EQ("fffffffffff(g(R\"x(\n" 8256 "multiline raw string literal xxxxxxxxxxxxxx\n" 8257 ")x\",\n" 8258 " a),\n" 8259 " b);", 8260 format("fffffffffff(g(R\"x(\n" 8261 "multiline raw string literal xxxxxxxxxxxxxx\n" 8262 ")x\", a), b);", 8263 getGoogleStyleWithColumns(20))); 8264 EXPECT_EQ("fffffffffff(\n" 8265 " g(R\"x(qqq\n" 8266 "multiline raw string literal xxxxxxxxxxxxxx\n" 8267 ")x\",\n" 8268 " a),\n" 8269 " b);", 8270 format("fffffffffff(g(R\"x(qqq\n" 8271 "multiline raw string literal xxxxxxxxxxxxxx\n" 8272 ")x\", a), b);", 8273 getGoogleStyleWithColumns(20))); 8274 8275 EXPECT_EQ("fffffffffff(R\"x(\n" 8276 "multiline raw string literal xxxxxxxxxxxxxx\n" 8277 ")x\");", 8278 format("fffffffffff(R\"x(\n" 8279 "multiline raw string literal xxxxxxxxxxxxxx\n" 8280 ")x\");", 8281 getGoogleStyleWithColumns(20))); 8282 EXPECT_EQ("fffffffffff(R\"x(\n" 8283 "multiline raw string literal xxxxxxxxxxxxxx\n" 8284 ")x\" + bbbbbb);", 8285 format("fffffffffff(R\"x(\n" 8286 "multiline raw string literal xxxxxxxxxxxxxx\n" 8287 ")x\" + bbbbbb);", 8288 getGoogleStyleWithColumns(20))); 8289 EXPECT_EQ("fffffffffff(\n" 8290 " R\"x(\n" 8291 "multiline raw string literal xxxxxxxxxxxxxx\n" 8292 ")x\" +\n" 8293 " bbbbbb);", 8294 format("fffffffffff(\n" 8295 " R\"x(\n" 8296 "multiline raw string literal xxxxxxxxxxxxxx\n" 8297 ")x\" + bbbbbb);", 8298 getGoogleStyleWithColumns(20))); 8299 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 8300 format("fffffffffff(\n" 8301 " R\"(single line raw string)\" + bbbbbb);")); 8302 } 8303 8304 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 8305 verifyFormat("string a = \"unterminated;"); 8306 EXPECT_EQ("function(\"unterminated,\n" 8307 " OtherParameter);", 8308 format("function( \"unterminated,\n" 8309 " OtherParameter);")); 8310 } 8311 8312 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 8313 FormatStyle Style = getLLVMStyle(); 8314 Style.Standard = FormatStyle::LS_Cpp03; 8315 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 8316 format("#define x(_a) printf(\"foo\"_a);", Style)); 8317 } 8318 8319 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 8320 8321 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 8322 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 8323 " \"ddeeefff\");", 8324 format("someFunction(\"aaabbbcccdddeeefff\");", 8325 getLLVMStyleWithColumns(25))); 8326 EXPECT_EQ("someFunction1234567890(\n" 8327 " \"aaabbbcccdddeeefff\");", 8328 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 8329 getLLVMStyleWithColumns(26))); 8330 EXPECT_EQ("someFunction1234567890(\n" 8331 " \"aaabbbcccdddeeeff\"\n" 8332 " \"f\");", 8333 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 8334 getLLVMStyleWithColumns(25))); 8335 EXPECT_EQ("someFunction1234567890(\n" 8336 " \"aaabbbcccdddeeeff\"\n" 8337 " \"f\");", 8338 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 8339 getLLVMStyleWithColumns(24))); 8340 EXPECT_EQ("someFunction(\n" 8341 " \"aaabbbcc ddde \"\n" 8342 " \"efff\");", 8343 format("someFunction(\"aaabbbcc ddde efff\");", 8344 getLLVMStyleWithColumns(25))); 8345 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 8346 " \"ddeeefff\");", 8347 format("someFunction(\"aaabbbccc ddeeefff\");", 8348 getLLVMStyleWithColumns(25))); 8349 EXPECT_EQ("someFunction1234567890(\n" 8350 " \"aaabb \"\n" 8351 " \"cccdddeeefff\");", 8352 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 8353 getLLVMStyleWithColumns(25))); 8354 EXPECT_EQ("#define A \\\n" 8355 " string s = \\\n" 8356 " \"123456789\" \\\n" 8357 " \"0\"; \\\n" 8358 " int i;", 8359 format("#define A string s = \"1234567890\"; int i;", 8360 getLLVMStyleWithColumns(20))); 8361 EXPECT_EQ("someFunction(\n" 8362 " \"aaabbbcc \"\n" 8363 " \"dddeeefff\");", 8364 format("someFunction(\"aaabbbcc dddeeefff\");", 8365 getLLVMStyleWithColumns(25))); 8366 } 8367 8368 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 8369 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 8370 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 8371 EXPECT_EQ("\"test\"\n" 8372 "\"\\n\"", 8373 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 8374 EXPECT_EQ("\"tes\\\\\"\n" 8375 "\"n\"", 8376 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 8377 EXPECT_EQ("\"\\\\\\\\\"\n" 8378 "\"\\n\"", 8379 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 8380 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 8381 EXPECT_EQ("\"\\uff01\"\n" 8382 "\"test\"", 8383 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 8384 EXPECT_EQ("\"\\Uff01ff02\"", 8385 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 8386 EXPECT_EQ("\"\\x000000000001\"\n" 8387 "\"next\"", 8388 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 8389 EXPECT_EQ("\"\\x000000000001next\"", 8390 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 8391 EXPECT_EQ("\"\\x000000000001\"", 8392 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 8393 EXPECT_EQ("\"test\"\n" 8394 "\"\\000000\"\n" 8395 "\"000001\"", 8396 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 8397 EXPECT_EQ("\"test\\000\"\n" 8398 "\"00000000\"\n" 8399 "\"1\"", 8400 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 8401 } 8402 8403 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 8404 verifyFormat("void f() {\n" 8405 " return g() {}\n" 8406 " void h() {}"); 8407 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 8408 "g();\n" 8409 "}"); 8410 } 8411 8412 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 8413 verifyFormat( 8414 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 8415 } 8416 8417 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 8418 verifyFormat("class X {\n" 8419 " void f() {\n" 8420 " }\n" 8421 "};", 8422 getLLVMStyleWithColumns(12)); 8423 } 8424 8425 TEST_F(FormatTest, ConfigurableIndentWidth) { 8426 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 8427 EightIndent.IndentWidth = 8; 8428 EightIndent.ContinuationIndentWidth = 8; 8429 verifyFormat("void f() {\n" 8430 " someFunction();\n" 8431 " if (true) {\n" 8432 " f();\n" 8433 " }\n" 8434 "}", 8435 EightIndent); 8436 verifyFormat("class X {\n" 8437 " void f() {\n" 8438 " }\n" 8439 "};", 8440 EightIndent); 8441 verifyFormat("int x[] = {\n" 8442 " call(),\n" 8443 " call()};", 8444 EightIndent); 8445 } 8446 8447 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 8448 verifyFormat("double\n" 8449 "f();", 8450 getLLVMStyleWithColumns(8)); 8451 } 8452 8453 TEST_F(FormatTest, ConfigurableUseOfTab) { 8454 FormatStyle Tab = getLLVMStyleWithColumns(42); 8455 Tab.IndentWidth = 8; 8456 Tab.UseTab = FormatStyle::UT_Always; 8457 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 8458 8459 EXPECT_EQ("if (aaaaaaaa && // q\n" 8460 " bb)\t\t// w\n" 8461 "\t;", 8462 format("if (aaaaaaaa &&// q\n" 8463 "bb)// w\n" 8464 ";", 8465 Tab)); 8466 EXPECT_EQ("if (aaa && bbb) // w\n" 8467 "\t;", 8468 format("if(aaa&&bbb)// w\n" 8469 ";", 8470 Tab)); 8471 8472 verifyFormat("class X {\n" 8473 "\tvoid f() {\n" 8474 "\t\tsomeFunction(parameter1,\n" 8475 "\t\t\t parameter2);\n" 8476 "\t}\n" 8477 "};", 8478 Tab); 8479 verifyFormat("#define A \\\n" 8480 "\tvoid f() { \\\n" 8481 "\t\tsomeFunction( \\\n" 8482 "\t\t parameter1, \\\n" 8483 "\t\t parameter2); \\\n" 8484 "\t}", 8485 Tab); 8486 8487 Tab.TabWidth = 4; 8488 Tab.IndentWidth = 8; 8489 verifyFormat("class TabWidth4Indent8 {\n" 8490 "\t\tvoid f() {\n" 8491 "\t\t\t\tsomeFunction(parameter1,\n" 8492 "\t\t\t\t\t\t\t parameter2);\n" 8493 "\t\t}\n" 8494 "};", 8495 Tab); 8496 8497 Tab.TabWidth = 4; 8498 Tab.IndentWidth = 4; 8499 verifyFormat("class TabWidth4Indent4 {\n" 8500 "\tvoid f() {\n" 8501 "\t\tsomeFunction(parameter1,\n" 8502 "\t\t\t\t\t parameter2);\n" 8503 "\t}\n" 8504 "};", 8505 Tab); 8506 8507 Tab.TabWidth = 8; 8508 Tab.IndentWidth = 4; 8509 verifyFormat("class TabWidth8Indent4 {\n" 8510 " void f() {\n" 8511 "\tsomeFunction(parameter1,\n" 8512 "\t\t parameter2);\n" 8513 " }\n" 8514 "};", 8515 Tab); 8516 8517 Tab.TabWidth = 8; 8518 Tab.IndentWidth = 8; 8519 EXPECT_EQ("/*\n" 8520 "\t a\t\tcomment\n" 8521 "\t in multiple lines\n" 8522 " */", 8523 format(" /*\t \t \n" 8524 " \t \t a\t\tcomment\t \t\n" 8525 " \t \t in multiple lines\t\n" 8526 " \t */", 8527 Tab)); 8528 8529 Tab.UseTab = FormatStyle::UT_ForIndentation; 8530 verifyFormat("{\n" 8531 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8532 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8533 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8534 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8535 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8536 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8537 "};", 8538 Tab); 8539 verifyFormat("enum AA {\n" 8540 "\ta1, // Force multiple lines\n" 8541 "\ta2,\n" 8542 "\ta3\n" 8543 "};", 8544 Tab); 8545 EXPECT_EQ("if (aaaaaaaa && // q\n" 8546 " bb) // w\n" 8547 "\t;", 8548 format("if (aaaaaaaa &&// q\n" 8549 "bb)// w\n" 8550 ";", 8551 Tab)); 8552 verifyFormat("class X {\n" 8553 "\tvoid f() {\n" 8554 "\t\tsomeFunction(parameter1,\n" 8555 "\t\t parameter2);\n" 8556 "\t}\n" 8557 "};", 8558 Tab); 8559 verifyFormat("{\n" 8560 "\tQ(\n" 8561 "\t {\n" 8562 "\t\t int a;\n" 8563 "\t\t someFunction(aaaaaaaa,\n" 8564 "\t\t bbbbbbb);\n" 8565 "\t },\n" 8566 "\t p);\n" 8567 "}", 8568 Tab); 8569 EXPECT_EQ("{\n" 8570 "\t/* aaaa\n" 8571 "\t bbbb */\n" 8572 "}", 8573 format("{\n" 8574 "/* aaaa\n" 8575 " bbbb */\n" 8576 "}", 8577 Tab)); 8578 EXPECT_EQ("{\n" 8579 "\t/*\n" 8580 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8581 "\t bbbbbbbbbbbbb\n" 8582 "\t*/\n" 8583 "}", 8584 format("{\n" 8585 "/*\n" 8586 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 8587 "*/\n" 8588 "}", 8589 Tab)); 8590 EXPECT_EQ("{\n" 8591 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8592 "\t// bbbbbbbbbbbbb\n" 8593 "}", 8594 format("{\n" 8595 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 8596 "}", 8597 Tab)); 8598 EXPECT_EQ("{\n" 8599 "\t/*\n" 8600 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8601 "\t bbbbbbbbbbbbb\n" 8602 "\t*/\n" 8603 "}", 8604 format("{\n" 8605 "\t/*\n" 8606 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 8607 "\t*/\n" 8608 "}", 8609 Tab)); 8610 EXPECT_EQ("{\n" 8611 "\t/*\n" 8612 "\n" 8613 "\t*/\n" 8614 "}", 8615 format("{\n" 8616 "\t/*\n" 8617 "\n" 8618 "\t*/\n" 8619 "}", 8620 Tab)); 8621 EXPECT_EQ("{\n" 8622 "\t/*\n" 8623 " asdf\n" 8624 "\t*/\n" 8625 "}", 8626 format("{\n" 8627 "\t/*\n" 8628 " asdf\n" 8629 "\t*/\n" 8630 "}", 8631 Tab)); 8632 8633 Tab.UseTab = FormatStyle::UT_Never; 8634 EXPECT_EQ("/*\n" 8635 " a\t\tcomment\n" 8636 " in multiple lines\n" 8637 " */", 8638 format(" /*\t \t \n" 8639 " \t \t a\t\tcomment\t \t\n" 8640 " \t \t in multiple lines\t\n" 8641 " \t */", 8642 Tab)); 8643 EXPECT_EQ("/* some\n" 8644 " comment */", 8645 format(" \t \t /* some\n" 8646 " \t \t comment */", 8647 Tab)); 8648 EXPECT_EQ("int a; /* some\n" 8649 " comment */", 8650 format(" \t \t int a; /* some\n" 8651 " \t \t comment */", 8652 Tab)); 8653 8654 EXPECT_EQ("int a; /* some\n" 8655 "comment */", 8656 format(" \t \t int\ta; /* some\n" 8657 " \t \t comment */", 8658 Tab)); 8659 EXPECT_EQ("f(\"\t\t\"); /* some\n" 8660 " comment */", 8661 format(" \t \t f(\"\t\t\"); /* some\n" 8662 " \t \t comment */", 8663 Tab)); 8664 EXPECT_EQ("{\n" 8665 " /*\n" 8666 " * Comment\n" 8667 " */\n" 8668 " int i;\n" 8669 "}", 8670 format("{\n" 8671 "\t/*\n" 8672 "\t * Comment\n" 8673 "\t */\n" 8674 "\t int i;\n" 8675 "}")); 8676 8677 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 8678 Tab.TabWidth = 8; 8679 Tab.IndentWidth = 8; 8680 EXPECT_EQ("if (aaaaaaaa && // q\n" 8681 " bb) // w\n" 8682 "\t;", 8683 format("if (aaaaaaaa &&// q\n" 8684 "bb)// w\n" 8685 ";", 8686 Tab)); 8687 EXPECT_EQ("if (aaa && bbb) // w\n" 8688 "\t;", 8689 format("if(aaa&&bbb)// w\n" 8690 ";", 8691 Tab)); 8692 verifyFormat("class X {\n" 8693 "\tvoid f() {\n" 8694 "\t\tsomeFunction(parameter1,\n" 8695 "\t\t\t parameter2);\n" 8696 "\t}\n" 8697 "};", 8698 Tab); 8699 verifyFormat("#define A \\\n" 8700 "\tvoid f() { \\\n" 8701 "\t\tsomeFunction( \\\n" 8702 "\t\t parameter1, \\\n" 8703 "\t\t parameter2); \\\n" 8704 "\t}", 8705 Tab); 8706 Tab.TabWidth = 4; 8707 Tab.IndentWidth = 8; 8708 verifyFormat("class TabWidth4Indent8 {\n" 8709 "\t\tvoid f() {\n" 8710 "\t\t\t\tsomeFunction(parameter1,\n" 8711 "\t\t\t\t\t\t\t parameter2);\n" 8712 "\t\t}\n" 8713 "};", 8714 Tab); 8715 Tab.TabWidth = 4; 8716 Tab.IndentWidth = 4; 8717 verifyFormat("class TabWidth4Indent4 {\n" 8718 "\tvoid f() {\n" 8719 "\t\tsomeFunction(parameter1,\n" 8720 "\t\t\t\t\t parameter2);\n" 8721 "\t}\n" 8722 "};", 8723 Tab); 8724 Tab.TabWidth = 8; 8725 Tab.IndentWidth = 4; 8726 verifyFormat("class TabWidth8Indent4 {\n" 8727 " void f() {\n" 8728 "\tsomeFunction(parameter1,\n" 8729 "\t\t parameter2);\n" 8730 " }\n" 8731 "};", 8732 Tab); 8733 Tab.TabWidth = 8; 8734 Tab.IndentWidth = 8; 8735 EXPECT_EQ("/*\n" 8736 "\t a\t\tcomment\n" 8737 "\t in multiple lines\n" 8738 " */", 8739 format(" /*\t \t \n" 8740 " \t \t a\t\tcomment\t \t\n" 8741 " \t \t in multiple lines\t\n" 8742 " \t */", 8743 Tab)); 8744 verifyFormat("{\n" 8745 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8746 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8747 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8748 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8749 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8750 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 8751 "};", 8752 Tab); 8753 verifyFormat("enum AA {\n" 8754 "\ta1, // Force multiple lines\n" 8755 "\ta2,\n" 8756 "\ta3\n" 8757 "};", 8758 Tab); 8759 EXPECT_EQ("if (aaaaaaaa && // q\n" 8760 " bb) // w\n" 8761 "\t;", 8762 format("if (aaaaaaaa &&// q\n" 8763 "bb)// w\n" 8764 ";", 8765 Tab)); 8766 verifyFormat("class X {\n" 8767 "\tvoid f() {\n" 8768 "\t\tsomeFunction(parameter1,\n" 8769 "\t\t\t parameter2);\n" 8770 "\t}\n" 8771 "};", 8772 Tab); 8773 verifyFormat("{\n" 8774 "\tQ(\n" 8775 "\t {\n" 8776 "\t\t int a;\n" 8777 "\t\t someFunction(aaaaaaaa,\n" 8778 "\t\t\t\t bbbbbbb);\n" 8779 "\t },\n" 8780 "\t p);\n" 8781 "}", 8782 Tab); 8783 EXPECT_EQ("{\n" 8784 "\t/* aaaa\n" 8785 "\t bbbb */\n" 8786 "}", 8787 format("{\n" 8788 "/* aaaa\n" 8789 " bbbb */\n" 8790 "}", 8791 Tab)); 8792 EXPECT_EQ("{\n" 8793 "\t/*\n" 8794 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8795 "\t bbbbbbbbbbbbb\n" 8796 "\t*/\n" 8797 "}", 8798 format("{\n" 8799 "/*\n" 8800 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 8801 "*/\n" 8802 "}", 8803 Tab)); 8804 EXPECT_EQ("{\n" 8805 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8806 "\t// bbbbbbbbbbbbb\n" 8807 "}", 8808 format("{\n" 8809 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 8810 "}", 8811 Tab)); 8812 EXPECT_EQ("{\n" 8813 "\t/*\n" 8814 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8815 "\t bbbbbbbbbbbbb\n" 8816 "\t*/\n" 8817 "}", 8818 format("{\n" 8819 "\t/*\n" 8820 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 8821 "\t*/\n" 8822 "}", 8823 Tab)); 8824 EXPECT_EQ("{\n" 8825 "\t/*\n" 8826 "\n" 8827 "\t*/\n" 8828 "}", 8829 format("{\n" 8830 "\t/*\n" 8831 "\n" 8832 "\t*/\n" 8833 "}", 8834 Tab)); 8835 EXPECT_EQ("{\n" 8836 "\t/*\n" 8837 " asdf\n" 8838 "\t*/\n" 8839 "}", 8840 format("{\n" 8841 "\t/*\n" 8842 " asdf\n" 8843 "\t*/\n" 8844 "}", 8845 Tab)); 8846 EXPECT_EQ("/*\n" 8847 "\t a\t\tcomment\n" 8848 "\t in multiple lines\n" 8849 " */", 8850 format(" /*\t \t \n" 8851 " \t \t a\t\tcomment\t \t\n" 8852 " \t \t in multiple lines\t\n" 8853 " \t */", 8854 Tab)); 8855 EXPECT_EQ("/* some\n" 8856 " comment */", 8857 format(" \t \t /* some\n" 8858 " \t \t comment */", 8859 Tab)); 8860 EXPECT_EQ("int a; /* some\n" 8861 " comment */", 8862 format(" \t \t int a; /* some\n" 8863 " \t \t comment */", 8864 Tab)); 8865 EXPECT_EQ("int a; /* some\n" 8866 "comment */", 8867 format(" \t \t int\ta; /* some\n" 8868 " \t \t comment */", 8869 Tab)); 8870 EXPECT_EQ("f(\"\t\t\"); /* some\n" 8871 " comment */", 8872 format(" \t \t f(\"\t\t\"); /* some\n" 8873 " \t \t comment */", 8874 Tab)); 8875 EXPECT_EQ("{\n" 8876 " /*\n" 8877 " * Comment\n" 8878 " */\n" 8879 " int i;\n" 8880 "}", 8881 format("{\n" 8882 "\t/*\n" 8883 "\t * Comment\n" 8884 "\t */\n" 8885 "\t int i;\n" 8886 "}")); 8887 Tab.AlignConsecutiveAssignments = true; 8888 Tab.AlignConsecutiveDeclarations = true; 8889 Tab.TabWidth = 4; 8890 Tab.IndentWidth = 4; 8891 verifyFormat("class Assign {\n" 8892 "\tvoid f() {\n" 8893 "\t\tint x = 123;\n" 8894 "\t\tint random = 4;\n" 8895 "\t\tstd::string alphabet =\n" 8896 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 8897 "\t}\n" 8898 "};", 8899 Tab); 8900 } 8901 8902 TEST_F(FormatTest, CalculatesOriginalColumn) { 8903 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 8904 "q\"; /* some\n" 8905 " comment */", 8906 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 8907 "q\"; /* some\n" 8908 " comment */", 8909 getLLVMStyle())); 8910 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 8911 "/* some\n" 8912 " comment */", 8913 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 8914 " /* some\n" 8915 " comment */", 8916 getLLVMStyle())); 8917 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 8918 "qqq\n" 8919 "/* some\n" 8920 " comment */", 8921 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 8922 "qqq\n" 8923 " /* some\n" 8924 " comment */", 8925 getLLVMStyle())); 8926 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 8927 "wwww; /* some\n" 8928 " comment */", 8929 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 8930 "wwww; /* some\n" 8931 " comment */", 8932 getLLVMStyle())); 8933 } 8934 8935 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 8936 FormatStyle NoSpace = getLLVMStyle(); 8937 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 8938 8939 verifyFormat("while(true)\n" 8940 " continue;", 8941 NoSpace); 8942 verifyFormat("for(;;)\n" 8943 " continue;", 8944 NoSpace); 8945 verifyFormat("if(true)\n" 8946 " f();\n" 8947 "else if(true)\n" 8948 " f();", 8949 NoSpace); 8950 verifyFormat("do {\n" 8951 " do_something();\n" 8952 "} while(something());", 8953 NoSpace); 8954 verifyFormat("switch(x) {\n" 8955 "default:\n" 8956 " break;\n" 8957 "}", 8958 NoSpace); 8959 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 8960 verifyFormat("size_t x = sizeof(x);", NoSpace); 8961 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 8962 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 8963 verifyFormat("alignas(128) char a[128];", NoSpace); 8964 verifyFormat("size_t x = alignof(MyType);", NoSpace); 8965 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 8966 verifyFormat("int f() throw(Deprecated);", NoSpace); 8967 verifyFormat("typedef void (*cb)(int);", NoSpace); 8968 verifyFormat("T A::operator()();", NoSpace); 8969 verifyFormat("X A::operator++(T);", NoSpace); 8970 8971 FormatStyle Space = getLLVMStyle(); 8972 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 8973 8974 verifyFormat("int f ();", Space); 8975 verifyFormat("void f (int a, T b) {\n" 8976 " while (true)\n" 8977 " continue;\n" 8978 "}", 8979 Space); 8980 verifyFormat("if (true)\n" 8981 " f ();\n" 8982 "else if (true)\n" 8983 " f ();", 8984 Space); 8985 verifyFormat("do {\n" 8986 " do_something ();\n" 8987 "} while (something ());", 8988 Space); 8989 verifyFormat("switch (x) {\n" 8990 "default:\n" 8991 " break;\n" 8992 "}", 8993 Space); 8994 verifyFormat("A::A () : a (1) {}", Space); 8995 verifyFormat("void f () __attribute__ ((asdf));", Space); 8996 verifyFormat("*(&a + 1);\n" 8997 "&((&a)[1]);\n" 8998 "a[(b + c) * d];\n" 8999 "(((a + 1) * 2) + 3) * 4;", 9000 Space); 9001 verifyFormat("#define A(x) x", Space); 9002 verifyFormat("#define A (x) x", Space); 9003 verifyFormat("#if defined(x)\n" 9004 "#endif", 9005 Space); 9006 verifyFormat("auto i = std::make_unique<int> (5);", Space); 9007 verifyFormat("size_t x = sizeof (x);", Space); 9008 verifyFormat("auto f (int x) -> decltype (x);", Space); 9009 verifyFormat("int f (T x) noexcept (x.create ());", Space); 9010 verifyFormat("alignas (128) char a[128];", Space); 9011 verifyFormat("size_t x = alignof (MyType);", Space); 9012 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 9013 verifyFormat("int f () throw (Deprecated);", Space); 9014 verifyFormat("typedef void (*cb) (int);", Space); 9015 verifyFormat("T A::operator() ();", Space); 9016 verifyFormat("X A::operator++ (T);", Space); 9017 } 9018 9019 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 9020 FormatStyle Spaces = getLLVMStyle(); 9021 9022 Spaces.SpacesInParentheses = true; 9023 verifyFormat("do_something( ::globalVar );", Spaces); 9024 verifyFormat("call( x, y, z );", Spaces); 9025 verifyFormat("call();", Spaces); 9026 verifyFormat("std::function<void( int, int )> callback;", Spaces); 9027 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 9028 Spaces); 9029 verifyFormat("while ( (bool)1 )\n" 9030 " continue;", 9031 Spaces); 9032 verifyFormat("for ( ;; )\n" 9033 " continue;", 9034 Spaces); 9035 verifyFormat("if ( true )\n" 9036 " f();\n" 9037 "else if ( true )\n" 9038 " f();", 9039 Spaces); 9040 verifyFormat("do {\n" 9041 " do_something( (int)i );\n" 9042 "} while ( something() );", 9043 Spaces); 9044 verifyFormat("switch ( x ) {\n" 9045 "default:\n" 9046 " break;\n" 9047 "}", 9048 Spaces); 9049 9050 Spaces.SpacesInParentheses = false; 9051 Spaces.SpacesInCStyleCastParentheses = true; 9052 verifyFormat("Type *A = ( Type * )P;", Spaces); 9053 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 9054 verifyFormat("x = ( int32 )y;", Spaces); 9055 verifyFormat("int a = ( int )(2.0f);", Spaces); 9056 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 9057 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 9058 verifyFormat("#define x (( int )-1)", Spaces); 9059 9060 // Run the first set of tests again with: 9061 Spaces.SpacesInParentheses = false; 9062 Spaces.SpaceInEmptyParentheses = true; 9063 Spaces.SpacesInCStyleCastParentheses = true; 9064 verifyFormat("call(x, y, z);", Spaces); 9065 verifyFormat("call( );", Spaces); 9066 verifyFormat("std::function<void(int, int)> callback;", Spaces); 9067 verifyFormat("while (( bool )1)\n" 9068 " continue;", 9069 Spaces); 9070 verifyFormat("for (;;)\n" 9071 " continue;", 9072 Spaces); 9073 verifyFormat("if (true)\n" 9074 " f( );\n" 9075 "else if (true)\n" 9076 " f( );", 9077 Spaces); 9078 verifyFormat("do {\n" 9079 " do_something(( int )i);\n" 9080 "} while (something( ));", 9081 Spaces); 9082 verifyFormat("switch (x) {\n" 9083 "default:\n" 9084 " break;\n" 9085 "}", 9086 Spaces); 9087 9088 // Run the first set of tests again with: 9089 Spaces.SpaceAfterCStyleCast = true; 9090 verifyFormat("call(x, y, z);", Spaces); 9091 verifyFormat("call( );", Spaces); 9092 verifyFormat("std::function<void(int, int)> callback;", Spaces); 9093 verifyFormat("while (( bool ) 1)\n" 9094 " continue;", 9095 Spaces); 9096 verifyFormat("for (;;)\n" 9097 " continue;", 9098 Spaces); 9099 verifyFormat("if (true)\n" 9100 " f( );\n" 9101 "else if (true)\n" 9102 " f( );", 9103 Spaces); 9104 verifyFormat("do {\n" 9105 " do_something(( int ) i);\n" 9106 "} while (something( ));", 9107 Spaces); 9108 verifyFormat("switch (x) {\n" 9109 "default:\n" 9110 " break;\n" 9111 "}", 9112 Spaces); 9113 9114 // Run subset of tests again with: 9115 Spaces.SpacesInCStyleCastParentheses = false; 9116 Spaces.SpaceAfterCStyleCast = true; 9117 verifyFormat("while ((bool) 1)\n" 9118 " continue;", 9119 Spaces); 9120 verifyFormat("do {\n" 9121 " do_something((int) i);\n" 9122 "} while (something( ));", 9123 Spaces); 9124 } 9125 9126 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 9127 verifyFormat("int a[5];"); 9128 verifyFormat("a[3] += 42;"); 9129 9130 FormatStyle Spaces = getLLVMStyle(); 9131 Spaces.SpacesInSquareBrackets = true; 9132 // Lambdas unchanged. 9133 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 9134 verifyFormat("return [i, args...] {};", Spaces); 9135 9136 // Not lambdas. 9137 verifyFormat("int a[ 5 ];", Spaces); 9138 verifyFormat("a[ 3 ] += 42;", Spaces); 9139 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 9140 verifyFormat("double &operator[](int i) { return 0; }\n" 9141 "int i;", 9142 Spaces); 9143 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 9144 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 9145 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 9146 } 9147 9148 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 9149 verifyFormat("int a = 5;"); 9150 verifyFormat("a += 42;"); 9151 verifyFormat("a or_eq 8;"); 9152 9153 FormatStyle Spaces = getLLVMStyle(); 9154 Spaces.SpaceBeforeAssignmentOperators = false; 9155 verifyFormat("int a= 5;", Spaces); 9156 verifyFormat("a+= 42;", Spaces); 9157 verifyFormat("a or_eq 8;", Spaces); 9158 } 9159 9160 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 9161 verifyFormat("class Foo : public Bar {};"); 9162 verifyFormat("Foo::Foo() : foo(1) {}"); 9163 verifyFormat("for (auto a : b) {\n}"); 9164 verifyFormat("int x = a ? b : c;"); 9165 verifyFormat("{\n" 9166 "label0:\n" 9167 " int x = 0;\n" 9168 "}"); 9169 verifyFormat("switch (x) {\n" 9170 "case 1:\n" 9171 "default:\n" 9172 "}"); 9173 9174 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 9175 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 9176 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 9177 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 9178 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 9179 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 9180 verifyFormat("{\n" 9181 "label1:\n" 9182 " int x = 0;\n" 9183 "}", 9184 CtorInitializerStyle); 9185 verifyFormat("switch (x) {\n" 9186 "case 1:\n" 9187 "default:\n" 9188 "}", 9189 CtorInitializerStyle); 9190 CtorInitializerStyle.BreakConstructorInitializers = 9191 FormatStyle::BCIS_AfterColon; 9192 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 9193 " aaaaaaaaaaaaaaaa(1),\n" 9194 " bbbbbbbbbbbbbbbb(2) {}", 9195 CtorInitializerStyle); 9196 CtorInitializerStyle.BreakConstructorInitializers = 9197 FormatStyle::BCIS_BeforeComma; 9198 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 9199 " : aaaaaaaaaaaaaaaa(1)\n" 9200 " , bbbbbbbbbbbbbbbb(2) {}", 9201 CtorInitializerStyle); 9202 CtorInitializerStyle.BreakConstructorInitializers = 9203 FormatStyle::BCIS_BeforeColon; 9204 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 9205 " : aaaaaaaaaaaaaaaa(1),\n" 9206 " bbbbbbbbbbbbbbbb(2) {}", 9207 CtorInitializerStyle); 9208 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 9209 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 9210 ": aaaaaaaaaaaaaaaa(1),\n" 9211 " bbbbbbbbbbbbbbbb(2) {}", 9212 CtorInitializerStyle); 9213 9214 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 9215 InheritanceStyle.SpaceBeforeInheritanceColon = false; 9216 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 9217 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 9218 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 9219 verifyFormat("int x = a ? b : c;", InheritanceStyle); 9220 verifyFormat("{\n" 9221 "label2:\n" 9222 " int x = 0;\n" 9223 "}", 9224 InheritanceStyle); 9225 verifyFormat("switch (x) {\n" 9226 "case 1:\n" 9227 "default:\n" 9228 "}", 9229 InheritanceStyle); 9230 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 9231 verifyFormat("class Foooooooooooooooooooooo:\n" 9232 " public aaaaaaaaaaaaaaaaaa,\n" 9233 " public bbbbbbbbbbbbbbbbbb {\n" 9234 "}", 9235 InheritanceStyle); 9236 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 9237 verifyFormat("class Foooooooooooooooooooooo\n" 9238 " : public aaaaaaaaaaaaaaaaaa\n" 9239 " , public bbbbbbbbbbbbbbbbbb {\n" 9240 "}", 9241 InheritanceStyle); 9242 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 9243 verifyFormat("class Foooooooooooooooooooooo\n" 9244 " : public aaaaaaaaaaaaaaaaaa,\n" 9245 " public bbbbbbbbbbbbbbbbbb {\n" 9246 "}", 9247 InheritanceStyle); 9248 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 9249 verifyFormat("class Foooooooooooooooooooooo\n" 9250 ": public aaaaaaaaaaaaaaaaaa,\n" 9251 " public bbbbbbbbbbbbbbbbbb {}", 9252 InheritanceStyle); 9253 9254 FormatStyle ForLoopStyle = getLLVMStyle(); 9255 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 9256 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 9257 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 9258 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 9259 verifyFormat("int x = a ? b : c;", ForLoopStyle); 9260 verifyFormat("{\n" 9261 "label2:\n" 9262 " int x = 0;\n" 9263 "}", 9264 ForLoopStyle); 9265 verifyFormat("switch (x) {\n" 9266 "case 1:\n" 9267 "default:\n" 9268 "}", 9269 ForLoopStyle); 9270 9271 FormatStyle NoSpaceStyle = getLLVMStyle(); 9272 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 9273 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 9274 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 9275 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 9276 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 9277 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 9278 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 9279 verifyFormat("{\n" 9280 "label3:\n" 9281 " int x = 0;\n" 9282 "}", 9283 NoSpaceStyle); 9284 verifyFormat("switch (x) {\n" 9285 "case 1:\n" 9286 "default:\n" 9287 "}", 9288 NoSpaceStyle); 9289 } 9290 9291 TEST_F(FormatTest, AlignConsecutiveAssignments) { 9292 FormatStyle Alignment = getLLVMStyle(); 9293 Alignment.AlignConsecutiveAssignments = false; 9294 verifyFormat("int a = 5;\n" 9295 "int oneTwoThree = 123;", 9296 Alignment); 9297 verifyFormat("int a = 5;\n" 9298 "int oneTwoThree = 123;", 9299 Alignment); 9300 9301 Alignment.AlignConsecutiveAssignments = true; 9302 verifyFormat("int a = 5;\n" 9303 "int oneTwoThree = 123;", 9304 Alignment); 9305 verifyFormat("int a = method();\n" 9306 "int oneTwoThree = 133;", 9307 Alignment); 9308 verifyFormat("a &= 5;\n" 9309 "bcd *= 5;\n" 9310 "ghtyf += 5;\n" 9311 "dvfvdb -= 5;\n" 9312 "a /= 5;\n" 9313 "vdsvsv %= 5;\n" 9314 "sfdbddfbdfbb ^= 5;\n" 9315 "dvsdsv |= 5;\n" 9316 "int dsvvdvsdvvv = 123;", 9317 Alignment); 9318 verifyFormat("int i = 1, j = 10;\n" 9319 "something = 2000;", 9320 Alignment); 9321 verifyFormat("something = 2000;\n" 9322 "int i = 1, j = 10;\n", 9323 Alignment); 9324 verifyFormat("something = 2000;\n" 9325 "another = 911;\n" 9326 "int i = 1, j = 10;\n" 9327 "oneMore = 1;\n" 9328 "i = 2;", 9329 Alignment); 9330 verifyFormat("int a = 5;\n" 9331 "int one = 1;\n" 9332 "method();\n" 9333 "int oneTwoThree = 123;\n" 9334 "int oneTwo = 12;", 9335 Alignment); 9336 verifyFormat("int oneTwoThree = 123;\n" 9337 "int oneTwo = 12;\n" 9338 "method();\n", 9339 Alignment); 9340 verifyFormat("int oneTwoThree = 123; // comment\n" 9341 "int oneTwo = 12; // comment", 9342 Alignment); 9343 EXPECT_EQ("int a = 5;\n" 9344 "\n" 9345 "int oneTwoThree = 123;", 9346 format("int a = 5;\n" 9347 "\n" 9348 "int oneTwoThree= 123;", 9349 Alignment)); 9350 EXPECT_EQ("int a = 5;\n" 9351 "int one = 1;\n" 9352 "\n" 9353 "int oneTwoThree = 123;", 9354 format("int a = 5;\n" 9355 "int one = 1;\n" 9356 "\n" 9357 "int oneTwoThree = 123;", 9358 Alignment)); 9359 EXPECT_EQ("int a = 5;\n" 9360 "int one = 1;\n" 9361 "\n" 9362 "int oneTwoThree = 123;\n" 9363 "int oneTwo = 12;", 9364 format("int a = 5;\n" 9365 "int one = 1;\n" 9366 "\n" 9367 "int oneTwoThree = 123;\n" 9368 "int oneTwo = 12;", 9369 Alignment)); 9370 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 9371 verifyFormat("#define A \\\n" 9372 " int aaaa = 12; \\\n" 9373 " int b = 23; \\\n" 9374 " int ccc = 234; \\\n" 9375 " int dddddddddd = 2345;", 9376 Alignment); 9377 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9378 verifyFormat("#define A \\\n" 9379 " int aaaa = 12; \\\n" 9380 " int b = 23; \\\n" 9381 " int ccc = 234; \\\n" 9382 " int dddddddddd = 2345;", 9383 Alignment); 9384 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 9385 verifyFormat("#define A " 9386 " \\\n" 9387 " int aaaa = 12; " 9388 " \\\n" 9389 " int b = 23; " 9390 " \\\n" 9391 " int ccc = 234; " 9392 " \\\n" 9393 " int dddddddddd = 2345;", 9394 Alignment); 9395 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 9396 "k = 4, int l = 5,\n" 9397 " int m = 6) {\n" 9398 " int j = 10;\n" 9399 " otherThing = 1;\n" 9400 "}", 9401 Alignment); 9402 verifyFormat("void SomeFunction(int parameter = 0) {\n" 9403 " int i = 1;\n" 9404 " int j = 2;\n" 9405 " int big = 10000;\n" 9406 "}", 9407 Alignment); 9408 verifyFormat("class C {\n" 9409 "public:\n" 9410 " int i = 1;\n" 9411 " virtual void f() = 0;\n" 9412 "};", 9413 Alignment); 9414 verifyFormat("int i = 1;\n" 9415 "if (SomeType t = getSomething()) {\n" 9416 "}\n" 9417 "int j = 2;\n" 9418 "int big = 10000;", 9419 Alignment); 9420 verifyFormat("int j = 7;\n" 9421 "for (int k = 0; k < N; ++k) {\n" 9422 "}\n" 9423 "int j = 2;\n" 9424 "int big = 10000;\n" 9425 "}", 9426 Alignment); 9427 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 9428 verifyFormat("int i = 1;\n" 9429 "LooooooooooongType loooooooooooooooooooooongVariable\n" 9430 " = someLooooooooooooooooongFunction();\n" 9431 "int j = 2;", 9432 Alignment); 9433 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 9434 verifyFormat("int i = 1;\n" 9435 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 9436 " someLooooooooooooooooongFunction();\n" 9437 "int j = 2;", 9438 Alignment); 9439 9440 verifyFormat("auto lambda = []() {\n" 9441 " auto i = 0;\n" 9442 " return 0;\n" 9443 "};\n" 9444 "int i = 0;\n" 9445 "auto v = type{\n" 9446 " i = 1, //\n" 9447 " (i = 2), //\n" 9448 " i = 3 //\n" 9449 "};", 9450 Alignment); 9451 9452 verifyFormat( 9453 "int i = 1;\n" 9454 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 9455 " loooooooooooooooooooooongParameterB);\n" 9456 "int j = 2;", 9457 Alignment); 9458 9459 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 9460 " typename B = very_long_type_name_1,\n" 9461 " typename T_2 = very_long_type_name_2>\n" 9462 "auto foo() {}\n", 9463 Alignment); 9464 verifyFormat("int a, b = 1;\n" 9465 "int c = 2;\n" 9466 "int dd = 3;\n", 9467 Alignment); 9468 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 9469 "float b[1][] = {{3.f}};\n", 9470 Alignment); 9471 verifyFormat("for (int i = 0; i < 1; i++)\n" 9472 " int x = 1;\n", 9473 Alignment); 9474 verifyFormat("for (i = 0; i < 1; i++)\n" 9475 " x = 1;\n" 9476 "y = 1;\n", 9477 Alignment); 9478 } 9479 9480 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 9481 FormatStyle Alignment = getLLVMStyle(); 9482 Alignment.AlignConsecutiveDeclarations = false; 9483 verifyFormat("float const a = 5;\n" 9484 "int oneTwoThree = 123;", 9485 Alignment); 9486 verifyFormat("int a = 5;\n" 9487 "float const oneTwoThree = 123;", 9488 Alignment); 9489 9490 Alignment.AlignConsecutiveDeclarations = true; 9491 verifyFormat("float const a = 5;\n" 9492 "int oneTwoThree = 123;", 9493 Alignment); 9494 verifyFormat("int a = method();\n" 9495 "float const oneTwoThree = 133;", 9496 Alignment); 9497 verifyFormat("int i = 1, j = 10;\n" 9498 "something = 2000;", 9499 Alignment); 9500 verifyFormat("something = 2000;\n" 9501 "int i = 1, j = 10;\n", 9502 Alignment); 9503 verifyFormat("float something = 2000;\n" 9504 "double another = 911;\n" 9505 "int i = 1, j = 10;\n" 9506 "const int *oneMore = 1;\n" 9507 "unsigned i = 2;", 9508 Alignment); 9509 verifyFormat("float a = 5;\n" 9510 "int one = 1;\n" 9511 "method();\n" 9512 "const double oneTwoThree = 123;\n" 9513 "const unsigned int oneTwo = 12;", 9514 Alignment); 9515 verifyFormat("int oneTwoThree{0}; // comment\n" 9516 "unsigned oneTwo; // comment", 9517 Alignment); 9518 EXPECT_EQ("float const a = 5;\n" 9519 "\n" 9520 "int oneTwoThree = 123;", 9521 format("float const a = 5;\n" 9522 "\n" 9523 "int oneTwoThree= 123;", 9524 Alignment)); 9525 EXPECT_EQ("float a = 5;\n" 9526 "int one = 1;\n" 9527 "\n" 9528 "unsigned oneTwoThree = 123;", 9529 format("float a = 5;\n" 9530 "int one = 1;\n" 9531 "\n" 9532 "unsigned oneTwoThree = 123;", 9533 Alignment)); 9534 EXPECT_EQ("float a = 5;\n" 9535 "int one = 1;\n" 9536 "\n" 9537 "unsigned oneTwoThree = 123;\n" 9538 "int oneTwo = 12;", 9539 format("float a = 5;\n" 9540 "int one = 1;\n" 9541 "\n" 9542 "unsigned oneTwoThree = 123;\n" 9543 "int oneTwo = 12;", 9544 Alignment)); 9545 // Function prototype alignment 9546 verifyFormat("int a();\n" 9547 "double b();", 9548 Alignment); 9549 verifyFormat("int a(int x);\n" 9550 "double b();", 9551 Alignment); 9552 unsigned OldColumnLimit = Alignment.ColumnLimit; 9553 // We need to set ColumnLimit to zero, in order to stress nested alignments, 9554 // otherwise the function parameters will be re-flowed onto a single line. 9555 Alignment.ColumnLimit = 0; 9556 EXPECT_EQ("int a(int x,\n" 9557 " float y);\n" 9558 "double b(int x,\n" 9559 " double y);", 9560 format("int a(int x,\n" 9561 " float y);\n" 9562 "double b(int x,\n" 9563 " double y);", 9564 Alignment)); 9565 // This ensures that function parameters of function declarations are 9566 // correctly indented when their owning functions are indented. 9567 // The failure case here is for 'double y' to not be indented enough. 9568 EXPECT_EQ("double a(int x);\n" 9569 "int b(int y,\n" 9570 " double z);", 9571 format("double a(int x);\n" 9572 "int b(int y,\n" 9573 " double z);", 9574 Alignment)); 9575 // Set ColumnLimit low so that we induce wrapping immediately after 9576 // the function name and opening paren. 9577 Alignment.ColumnLimit = 13; 9578 verifyFormat("int function(\n" 9579 " int x,\n" 9580 " bool y);", 9581 Alignment); 9582 Alignment.ColumnLimit = OldColumnLimit; 9583 // Ensure function pointers don't screw up recursive alignment 9584 verifyFormat("int a(int x, void (*fp)(int y));\n" 9585 "double b();", 9586 Alignment); 9587 Alignment.AlignConsecutiveAssignments = true; 9588 // Ensure recursive alignment is broken by function braces, so that the 9589 // "a = 1" does not align with subsequent assignments inside the function 9590 // body. 9591 verifyFormat("int func(int a = 1) {\n" 9592 " int b = 2;\n" 9593 " int cc = 3;\n" 9594 "}", 9595 Alignment); 9596 verifyFormat("float something = 2000;\n" 9597 "double another = 911;\n" 9598 "int i = 1, j = 10;\n" 9599 "const int *oneMore = 1;\n" 9600 "unsigned i = 2;", 9601 Alignment); 9602 verifyFormat("int oneTwoThree = {0}; // comment\n" 9603 "unsigned oneTwo = 0; // comment", 9604 Alignment); 9605 // Make sure that scope is correctly tracked, in the absence of braces 9606 verifyFormat("for (int i = 0; i < n; i++)\n" 9607 " j = i;\n" 9608 "double x = 1;\n", 9609 Alignment); 9610 verifyFormat("if (int i = 0)\n" 9611 " j = i;\n" 9612 "double x = 1;\n", 9613 Alignment); 9614 // Ensure operator[] and operator() are comprehended 9615 verifyFormat("struct test {\n" 9616 " long long int foo();\n" 9617 " int operator[](int a);\n" 9618 " double bar();\n" 9619 "};\n", 9620 Alignment); 9621 verifyFormat("struct test {\n" 9622 " long long int foo();\n" 9623 " int operator()(int a);\n" 9624 " double bar();\n" 9625 "};\n", 9626 Alignment); 9627 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 9628 " int const i = 1;\n" 9629 " int * j = 2;\n" 9630 " int big = 10000;\n" 9631 "\n" 9632 " unsigned oneTwoThree = 123;\n" 9633 " int oneTwo = 12;\n" 9634 " method();\n" 9635 " float k = 2;\n" 9636 " int ll = 10000;\n" 9637 "}", 9638 format("void SomeFunction(int parameter= 0) {\n" 9639 " int const i= 1;\n" 9640 " int *j=2;\n" 9641 " int big = 10000;\n" 9642 "\n" 9643 "unsigned oneTwoThree =123;\n" 9644 "int oneTwo = 12;\n" 9645 " method();\n" 9646 "float k= 2;\n" 9647 "int ll=10000;\n" 9648 "}", 9649 Alignment)); 9650 Alignment.AlignConsecutiveAssignments = false; 9651 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 9652 verifyFormat("#define A \\\n" 9653 " int aaaa = 12; \\\n" 9654 " float b = 23; \\\n" 9655 " const int ccc = 234; \\\n" 9656 " unsigned dddddddddd = 2345;", 9657 Alignment); 9658 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9659 verifyFormat("#define A \\\n" 9660 " int aaaa = 12; \\\n" 9661 " float b = 23; \\\n" 9662 " const int ccc = 234; \\\n" 9663 " unsigned dddddddddd = 2345;", 9664 Alignment); 9665 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 9666 Alignment.ColumnLimit = 30; 9667 verifyFormat("#define A \\\n" 9668 " int aaaa = 12; \\\n" 9669 " float b = 23; \\\n" 9670 " const int ccc = 234; \\\n" 9671 " int dddddddddd = 2345;", 9672 Alignment); 9673 Alignment.ColumnLimit = 80; 9674 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 9675 "k = 4, int l = 5,\n" 9676 " int m = 6) {\n" 9677 " const int j = 10;\n" 9678 " otherThing = 1;\n" 9679 "}", 9680 Alignment); 9681 verifyFormat("void SomeFunction(int parameter = 0) {\n" 9682 " int const i = 1;\n" 9683 " int * j = 2;\n" 9684 " int big = 10000;\n" 9685 "}", 9686 Alignment); 9687 verifyFormat("class C {\n" 9688 "public:\n" 9689 " int i = 1;\n" 9690 " virtual void f() = 0;\n" 9691 "};", 9692 Alignment); 9693 verifyFormat("float i = 1;\n" 9694 "if (SomeType t = getSomething()) {\n" 9695 "}\n" 9696 "const unsigned j = 2;\n" 9697 "int big = 10000;", 9698 Alignment); 9699 verifyFormat("float j = 7;\n" 9700 "for (int k = 0; k < N; ++k) {\n" 9701 "}\n" 9702 "unsigned j = 2;\n" 9703 "int big = 10000;\n" 9704 "}", 9705 Alignment); 9706 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 9707 verifyFormat("float i = 1;\n" 9708 "LooooooooooongType loooooooooooooooooooooongVariable\n" 9709 " = someLooooooooooooooooongFunction();\n" 9710 "int j = 2;", 9711 Alignment); 9712 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 9713 verifyFormat("int i = 1;\n" 9714 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 9715 " someLooooooooooooooooongFunction();\n" 9716 "int j = 2;", 9717 Alignment); 9718 9719 Alignment.AlignConsecutiveAssignments = true; 9720 verifyFormat("auto lambda = []() {\n" 9721 " auto ii = 0;\n" 9722 " float j = 0;\n" 9723 " return 0;\n" 9724 "};\n" 9725 "int i = 0;\n" 9726 "float i2 = 0;\n" 9727 "auto v = type{\n" 9728 " i = 1, //\n" 9729 " (i = 2), //\n" 9730 " i = 3 //\n" 9731 "};", 9732 Alignment); 9733 Alignment.AlignConsecutiveAssignments = false; 9734 9735 verifyFormat( 9736 "int i = 1;\n" 9737 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 9738 " loooooooooooooooooooooongParameterB);\n" 9739 "int j = 2;", 9740 Alignment); 9741 9742 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 9743 // We expect declarations and assignments to align, as long as it doesn't 9744 // exceed the column limit, starting a new alignment sequence whenever it 9745 // happens. 9746 Alignment.AlignConsecutiveAssignments = true; 9747 Alignment.ColumnLimit = 30; 9748 verifyFormat("float ii = 1;\n" 9749 "unsigned j = 2;\n" 9750 "int someVerylongVariable = 1;\n" 9751 "AnotherLongType ll = 123456;\n" 9752 "VeryVeryLongType k = 2;\n" 9753 "int myvar = 1;", 9754 Alignment); 9755 Alignment.ColumnLimit = 80; 9756 Alignment.AlignConsecutiveAssignments = false; 9757 9758 verifyFormat( 9759 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 9760 " typename LongType, typename B>\n" 9761 "auto foo() {}\n", 9762 Alignment); 9763 verifyFormat("float a, b = 1;\n" 9764 "int c = 2;\n" 9765 "int dd = 3;\n", 9766 Alignment); 9767 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 9768 "float b[1][] = {{3.f}};\n", 9769 Alignment); 9770 Alignment.AlignConsecutiveAssignments = true; 9771 verifyFormat("float a, b = 1;\n" 9772 "int c = 2;\n" 9773 "int dd = 3;\n", 9774 Alignment); 9775 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 9776 "float b[1][] = {{3.f}};\n", 9777 Alignment); 9778 Alignment.AlignConsecutiveAssignments = false; 9779 9780 Alignment.ColumnLimit = 30; 9781 Alignment.BinPackParameters = false; 9782 verifyFormat("void foo(float a,\n" 9783 " float b,\n" 9784 " int c,\n" 9785 " uint32_t *d) {\n" 9786 " int * e = 0;\n" 9787 " float f = 0;\n" 9788 " double g = 0;\n" 9789 "}\n" 9790 "void bar(ino_t a,\n" 9791 " int b,\n" 9792 " uint32_t *c,\n" 9793 " bool d) {}\n", 9794 Alignment); 9795 Alignment.BinPackParameters = true; 9796 Alignment.ColumnLimit = 80; 9797 9798 // Bug 33507 9799 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 9800 verifyFormat( 9801 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 9802 " static const Version verVs2017;\n" 9803 " return true;\n" 9804 "});\n", 9805 Alignment); 9806 Alignment.PointerAlignment = FormatStyle::PAS_Right; 9807 } 9808 9809 TEST_F(FormatTest, LinuxBraceBreaking) { 9810 FormatStyle LinuxBraceStyle = getLLVMStyle(); 9811 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 9812 verifyFormat("namespace a\n" 9813 "{\n" 9814 "class A\n" 9815 "{\n" 9816 " void f()\n" 9817 " {\n" 9818 " if (true) {\n" 9819 " a();\n" 9820 " b();\n" 9821 " } else {\n" 9822 " a();\n" 9823 " }\n" 9824 " }\n" 9825 " void g() { return; }\n" 9826 "};\n" 9827 "struct B {\n" 9828 " int x;\n" 9829 "};\n" 9830 "} // namespace a\n", 9831 LinuxBraceStyle); 9832 verifyFormat("enum X {\n" 9833 " Y = 0,\n" 9834 "}\n", 9835 LinuxBraceStyle); 9836 verifyFormat("struct S {\n" 9837 " int Type;\n" 9838 " union {\n" 9839 " int x;\n" 9840 " double y;\n" 9841 " } Value;\n" 9842 " class C\n" 9843 " {\n" 9844 " MyFavoriteType Value;\n" 9845 " } Class;\n" 9846 "}\n", 9847 LinuxBraceStyle); 9848 } 9849 9850 TEST_F(FormatTest, MozillaBraceBreaking) { 9851 FormatStyle MozillaBraceStyle = getLLVMStyle(); 9852 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 9853 MozillaBraceStyle.FixNamespaceComments = false; 9854 verifyFormat("namespace a {\n" 9855 "class A\n" 9856 "{\n" 9857 " void f()\n" 9858 " {\n" 9859 " if (true) {\n" 9860 " a();\n" 9861 " b();\n" 9862 " }\n" 9863 " }\n" 9864 " void g() { return; }\n" 9865 "};\n" 9866 "enum E\n" 9867 "{\n" 9868 " A,\n" 9869 " // foo\n" 9870 " B,\n" 9871 " C\n" 9872 "};\n" 9873 "struct B\n" 9874 "{\n" 9875 " int x;\n" 9876 "};\n" 9877 "}\n", 9878 MozillaBraceStyle); 9879 verifyFormat("struct S\n" 9880 "{\n" 9881 " int Type;\n" 9882 " union\n" 9883 " {\n" 9884 " int x;\n" 9885 " double y;\n" 9886 " } Value;\n" 9887 " class C\n" 9888 " {\n" 9889 " MyFavoriteType Value;\n" 9890 " } Class;\n" 9891 "}\n", 9892 MozillaBraceStyle); 9893 } 9894 9895 TEST_F(FormatTest, StroustrupBraceBreaking) { 9896 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 9897 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 9898 verifyFormat("namespace a {\n" 9899 "class A {\n" 9900 " void f()\n" 9901 " {\n" 9902 " if (true) {\n" 9903 " a();\n" 9904 " b();\n" 9905 " }\n" 9906 " }\n" 9907 " void g() { return; }\n" 9908 "};\n" 9909 "struct B {\n" 9910 " int x;\n" 9911 "};\n" 9912 "} // namespace a\n", 9913 StroustrupBraceStyle); 9914 9915 verifyFormat("void foo()\n" 9916 "{\n" 9917 " if (a) {\n" 9918 " a();\n" 9919 " }\n" 9920 " else {\n" 9921 " b();\n" 9922 " }\n" 9923 "}\n", 9924 StroustrupBraceStyle); 9925 9926 verifyFormat("#ifdef _DEBUG\n" 9927 "int foo(int i = 0)\n" 9928 "#else\n" 9929 "int foo(int i = 5)\n" 9930 "#endif\n" 9931 "{\n" 9932 " return i;\n" 9933 "}", 9934 StroustrupBraceStyle); 9935 9936 verifyFormat("void foo() {}\n" 9937 "void bar()\n" 9938 "#ifdef _DEBUG\n" 9939 "{\n" 9940 " foo();\n" 9941 "}\n" 9942 "#else\n" 9943 "{\n" 9944 "}\n" 9945 "#endif", 9946 StroustrupBraceStyle); 9947 9948 verifyFormat("void foobar() { int i = 5; }\n" 9949 "#ifdef _DEBUG\n" 9950 "void bar() {}\n" 9951 "#else\n" 9952 "void bar() { foobar(); }\n" 9953 "#endif", 9954 StroustrupBraceStyle); 9955 } 9956 9957 TEST_F(FormatTest, AllmanBraceBreaking) { 9958 FormatStyle AllmanBraceStyle = getLLVMStyle(); 9959 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 9960 9961 EXPECT_EQ("namespace a\n" 9962 "{\n" 9963 "void f();\n" 9964 "void g();\n" 9965 "} // namespace a\n", 9966 format("namespace a\n" 9967 "{\n" 9968 "void f();\n" 9969 "void g();\n" 9970 "}\n", 9971 AllmanBraceStyle)); 9972 9973 verifyFormat("namespace a\n" 9974 "{\n" 9975 "class A\n" 9976 "{\n" 9977 " void f()\n" 9978 " {\n" 9979 " if (true)\n" 9980 " {\n" 9981 " a();\n" 9982 " b();\n" 9983 " }\n" 9984 " }\n" 9985 " void g() { return; }\n" 9986 "};\n" 9987 "struct B\n" 9988 "{\n" 9989 " int x;\n" 9990 "};\n" 9991 "} // namespace a", 9992 AllmanBraceStyle); 9993 9994 verifyFormat("void f()\n" 9995 "{\n" 9996 " if (true)\n" 9997 " {\n" 9998 " a();\n" 9999 " }\n" 10000 " else if (false)\n" 10001 " {\n" 10002 " b();\n" 10003 " }\n" 10004 " else\n" 10005 " {\n" 10006 " c();\n" 10007 " }\n" 10008 "}\n", 10009 AllmanBraceStyle); 10010 10011 verifyFormat("void f()\n" 10012 "{\n" 10013 " for (int i = 0; i < 10; ++i)\n" 10014 " {\n" 10015 " a();\n" 10016 " }\n" 10017 " while (false)\n" 10018 " {\n" 10019 " b();\n" 10020 " }\n" 10021 " do\n" 10022 " {\n" 10023 " c();\n" 10024 " } while (false)\n" 10025 "}\n", 10026 AllmanBraceStyle); 10027 10028 verifyFormat("void f(int a)\n" 10029 "{\n" 10030 " switch (a)\n" 10031 " {\n" 10032 " case 0:\n" 10033 " break;\n" 10034 " case 1:\n" 10035 " {\n" 10036 " break;\n" 10037 " }\n" 10038 " case 2:\n" 10039 " {\n" 10040 " }\n" 10041 " break;\n" 10042 " default:\n" 10043 " break;\n" 10044 " }\n" 10045 "}\n", 10046 AllmanBraceStyle); 10047 10048 verifyFormat("enum X\n" 10049 "{\n" 10050 " Y = 0,\n" 10051 "}\n", 10052 AllmanBraceStyle); 10053 verifyFormat("enum X\n" 10054 "{\n" 10055 " Y = 0\n" 10056 "}\n", 10057 AllmanBraceStyle); 10058 10059 verifyFormat("@interface BSApplicationController ()\n" 10060 "{\n" 10061 "@private\n" 10062 " id _extraIvar;\n" 10063 "}\n" 10064 "@end\n", 10065 AllmanBraceStyle); 10066 10067 verifyFormat("#ifdef _DEBUG\n" 10068 "int foo(int i = 0)\n" 10069 "#else\n" 10070 "int foo(int i = 5)\n" 10071 "#endif\n" 10072 "{\n" 10073 " return i;\n" 10074 "}", 10075 AllmanBraceStyle); 10076 10077 verifyFormat("void foo() {}\n" 10078 "void bar()\n" 10079 "#ifdef _DEBUG\n" 10080 "{\n" 10081 " foo();\n" 10082 "}\n" 10083 "#else\n" 10084 "{\n" 10085 "}\n" 10086 "#endif", 10087 AllmanBraceStyle); 10088 10089 verifyFormat("void foobar() { int i = 5; }\n" 10090 "#ifdef _DEBUG\n" 10091 "void bar() {}\n" 10092 "#else\n" 10093 "void bar() { foobar(); }\n" 10094 "#endif", 10095 AllmanBraceStyle); 10096 10097 // This shouldn't affect ObjC blocks.. 10098 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 10099 " // ...\n" 10100 " int i;\n" 10101 "}];", 10102 AllmanBraceStyle); 10103 verifyFormat("void (^block)(void) = ^{\n" 10104 " // ...\n" 10105 " int i;\n" 10106 "};", 10107 AllmanBraceStyle); 10108 // .. or dict literals. 10109 verifyFormat("void f()\n" 10110 "{\n" 10111 " // ...\n" 10112 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 10113 "}", 10114 AllmanBraceStyle); 10115 verifyFormat("void f()\n" 10116 "{\n" 10117 " // ...\n" 10118 " [object someMethod:@{a : @\"b\"}];\n" 10119 "}", 10120 AllmanBraceStyle); 10121 verifyFormat("int f()\n" 10122 "{ // comment\n" 10123 " return 42;\n" 10124 "}", 10125 AllmanBraceStyle); 10126 10127 AllmanBraceStyle.ColumnLimit = 19; 10128 verifyFormat("void f() { int i; }", AllmanBraceStyle); 10129 AllmanBraceStyle.ColumnLimit = 18; 10130 verifyFormat("void f()\n" 10131 "{\n" 10132 " int i;\n" 10133 "}", 10134 AllmanBraceStyle); 10135 AllmanBraceStyle.ColumnLimit = 80; 10136 10137 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 10138 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true; 10139 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 10140 verifyFormat("void f(bool b)\n" 10141 "{\n" 10142 " if (b)\n" 10143 " {\n" 10144 " return;\n" 10145 " }\n" 10146 "}\n", 10147 BreakBeforeBraceShortIfs); 10148 verifyFormat("void f(bool b)\n" 10149 "{\n" 10150 " if constexpr (b)\n" 10151 " {\n" 10152 " return;\n" 10153 " }\n" 10154 "}\n", 10155 BreakBeforeBraceShortIfs); 10156 verifyFormat("void f(bool b)\n" 10157 "{\n" 10158 " if (b) return;\n" 10159 "}\n", 10160 BreakBeforeBraceShortIfs); 10161 verifyFormat("void f(bool b)\n" 10162 "{\n" 10163 " if constexpr (b) return;\n" 10164 "}\n", 10165 BreakBeforeBraceShortIfs); 10166 verifyFormat("void f(bool b)\n" 10167 "{\n" 10168 " while (b)\n" 10169 " {\n" 10170 " return;\n" 10171 " }\n" 10172 "}\n", 10173 BreakBeforeBraceShortIfs); 10174 } 10175 10176 TEST_F(FormatTest, GNUBraceBreaking) { 10177 FormatStyle GNUBraceStyle = getLLVMStyle(); 10178 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 10179 verifyFormat("namespace a\n" 10180 "{\n" 10181 "class A\n" 10182 "{\n" 10183 " void f()\n" 10184 " {\n" 10185 " int a;\n" 10186 " {\n" 10187 " int b;\n" 10188 " }\n" 10189 " if (true)\n" 10190 " {\n" 10191 " a();\n" 10192 " b();\n" 10193 " }\n" 10194 " }\n" 10195 " void g() { return; }\n" 10196 "}\n" 10197 "} // namespace a", 10198 GNUBraceStyle); 10199 10200 verifyFormat("void f()\n" 10201 "{\n" 10202 " if (true)\n" 10203 " {\n" 10204 " a();\n" 10205 " }\n" 10206 " else if (false)\n" 10207 " {\n" 10208 " b();\n" 10209 " }\n" 10210 " else\n" 10211 " {\n" 10212 " c();\n" 10213 " }\n" 10214 "}\n", 10215 GNUBraceStyle); 10216 10217 verifyFormat("void f()\n" 10218 "{\n" 10219 " for (int i = 0; i < 10; ++i)\n" 10220 " {\n" 10221 " a();\n" 10222 " }\n" 10223 " while (false)\n" 10224 " {\n" 10225 " b();\n" 10226 " }\n" 10227 " do\n" 10228 " {\n" 10229 " c();\n" 10230 " }\n" 10231 " while (false);\n" 10232 "}\n", 10233 GNUBraceStyle); 10234 10235 verifyFormat("void f(int a)\n" 10236 "{\n" 10237 " switch (a)\n" 10238 " {\n" 10239 " case 0:\n" 10240 " break;\n" 10241 " case 1:\n" 10242 " {\n" 10243 " break;\n" 10244 " }\n" 10245 " case 2:\n" 10246 " {\n" 10247 " }\n" 10248 " break;\n" 10249 " default:\n" 10250 " break;\n" 10251 " }\n" 10252 "}\n", 10253 GNUBraceStyle); 10254 10255 verifyFormat("enum X\n" 10256 "{\n" 10257 " Y = 0,\n" 10258 "}\n", 10259 GNUBraceStyle); 10260 10261 verifyFormat("@interface BSApplicationController ()\n" 10262 "{\n" 10263 "@private\n" 10264 " id _extraIvar;\n" 10265 "}\n" 10266 "@end\n", 10267 GNUBraceStyle); 10268 10269 verifyFormat("#ifdef _DEBUG\n" 10270 "int foo(int i = 0)\n" 10271 "#else\n" 10272 "int foo(int i = 5)\n" 10273 "#endif\n" 10274 "{\n" 10275 " return i;\n" 10276 "}", 10277 GNUBraceStyle); 10278 10279 verifyFormat("void foo() {}\n" 10280 "void bar()\n" 10281 "#ifdef _DEBUG\n" 10282 "{\n" 10283 " foo();\n" 10284 "}\n" 10285 "#else\n" 10286 "{\n" 10287 "}\n" 10288 "#endif", 10289 GNUBraceStyle); 10290 10291 verifyFormat("void foobar() { int i = 5; }\n" 10292 "#ifdef _DEBUG\n" 10293 "void bar() {}\n" 10294 "#else\n" 10295 "void bar() { foobar(); }\n" 10296 "#endif", 10297 GNUBraceStyle); 10298 } 10299 10300 TEST_F(FormatTest, WebKitBraceBreaking) { 10301 FormatStyle WebKitBraceStyle = getLLVMStyle(); 10302 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 10303 WebKitBraceStyle.FixNamespaceComments = false; 10304 verifyFormat("namespace a {\n" 10305 "class A {\n" 10306 " void f()\n" 10307 " {\n" 10308 " if (true) {\n" 10309 " a();\n" 10310 " b();\n" 10311 " }\n" 10312 " }\n" 10313 " void g() { return; }\n" 10314 "};\n" 10315 "enum E {\n" 10316 " A,\n" 10317 " // foo\n" 10318 " B,\n" 10319 " C\n" 10320 "};\n" 10321 "struct B {\n" 10322 " int x;\n" 10323 "};\n" 10324 "}\n", 10325 WebKitBraceStyle); 10326 verifyFormat("struct S {\n" 10327 " int Type;\n" 10328 " union {\n" 10329 " int x;\n" 10330 " double y;\n" 10331 " } Value;\n" 10332 " class C {\n" 10333 " MyFavoriteType Value;\n" 10334 " } Class;\n" 10335 "};\n", 10336 WebKitBraceStyle); 10337 } 10338 10339 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 10340 verifyFormat("void f() {\n" 10341 " try {\n" 10342 " } catch (const Exception &e) {\n" 10343 " }\n" 10344 "}\n", 10345 getLLVMStyle()); 10346 } 10347 10348 TEST_F(FormatTest, UnderstandsPragmas) { 10349 verifyFormat("#pragma omp reduction(| : var)"); 10350 verifyFormat("#pragma omp reduction(+ : var)"); 10351 10352 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 10353 "(including parentheses).", 10354 format("#pragma mark Any non-hyphenated or hyphenated string " 10355 "(including parentheses).")); 10356 } 10357 10358 TEST_F(FormatTest, UnderstandPragmaOption) { 10359 verifyFormat("#pragma option -C -A"); 10360 10361 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 10362 } 10363 10364 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 10365 FormatStyle Style = getLLVMStyle(); 10366 Style.ColumnLimit = 20; 10367 10368 verifyFormat("int a; // the\n" 10369 " // comment", Style); 10370 EXPECT_EQ("int a; /* first line\n" 10371 " * second\n" 10372 " * line third\n" 10373 " * line\n" 10374 " */", 10375 format("int a; /* first line\n" 10376 " * second\n" 10377 " * line third\n" 10378 " * line\n" 10379 " */", 10380 Style)); 10381 EXPECT_EQ("int a; // first line\n" 10382 " // second\n" 10383 " // line third\n" 10384 " // line", 10385 format("int a; // first line\n" 10386 " // second line\n" 10387 " // third line", 10388 Style)); 10389 10390 Style.PenaltyExcessCharacter = 90; 10391 verifyFormat("int a; // the comment", Style); 10392 EXPECT_EQ("int a; // the comment\n" 10393 " // aaa", 10394 format("int a; // the comment aaa", Style)); 10395 EXPECT_EQ("int a; /* first line\n" 10396 " * second line\n" 10397 " * third line\n" 10398 " */", 10399 format("int a; /* first line\n" 10400 " * second line\n" 10401 " * third line\n" 10402 " */", 10403 Style)); 10404 EXPECT_EQ("int a; // first line\n" 10405 " // second line\n" 10406 " // third line", 10407 format("int a; // first line\n" 10408 " // second line\n" 10409 " // third line", 10410 Style)); 10411 // FIXME: Investigate why this is not getting the same layout as the test 10412 // above. 10413 EXPECT_EQ("int a; /* first line\n" 10414 " * second line\n" 10415 " * third line\n" 10416 " */", 10417 format("int a; /* first line second line third line" 10418 "\n*/", 10419 Style)); 10420 10421 EXPECT_EQ("// foo bar baz bazfoo\n" 10422 "// foo bar foo bar\n", 10423 format("// foo bar baz bazfoo\n" 10424 "// foo bar foo bar\n", 10425 Style)); 10426 EXPECT_EQ("// foo bar baz bazfoo\n" 10427 "// foo bar foo bar\n", 10428 format("// foo bar baz bazfoo\n" 10429 "// foo bar foo bar\n", 10430 Style)); 10431 10432 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 10433 // next one. 10434 EXPECT_EQ("// foo bar baz bazfoo\n" 10435 "// bar foo bar\n", 10436 format("// foo bar baz bazfoo bar\n" 10437 "// foo bar\n", 10438 Style)); 10439 10440 EXPECT_EQ("// foo bar baz bazfoo\n" 10441 "// foo bar baz bazfoo\n" 10442 "// bar foo bar\n", 10443 format("// foo bar baz bazfoo\n" 10444 "// foo bar baz bazfoo bar\n" 10445 "// foo bar\n", 10446 Style)); 10447 10448 EXPECT_EQ("// foo bar baz bazfoo\n" 10449 "// foo bar baz bazfoo\n" 10450 "// bar foo bar\n", 10451 format("// foo bar baz bazfoo\n" 10452 "// foo bar baz bazfoo bar\n" 10453 "// foo bar\n", 10454 Style)); 10455 10456 // Make sure we do not keep protruding characters if strict mode reflow is 10457 // cheaper than keeping protruding characters. 10458 Style.ColumnLimit = 21; 10459 EXPECT_EQ("// foo foo foo foo\n" 10460 "// foo foo foo foo\n" 10461 "// foo foo foo foo\n", 10462 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", 10463 Style)); 10464 10465 EXPECT_EQ("int a = /* long block\n" 10466 " comment */\n" 10467 " 42;", 10468 format("int a = /* long block comment */ 42;", Style)); 10469 } 10470 10471 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 10472 for (size_t i = 1; i < Styles.size(); ++i) \ 10473 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \ 10474 << " differs from Style #0" 10475 10476 TEST_F(FormatTest, GetsPredefinedStyleByName) { 10477 SmallVector<FormatStyle, 3> Styles; 10478 Styles.resize(3); 10479 10480 Styles[0] = getLLVMStyle(); 10481 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 10482 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 10483 EXPECT_ALL_STYLES_EQUAL(Styles); 10484 10485 Styles[0] = getGoogleStyle(); 10486 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 10487 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 10488 EXPECT_ALL_STYLES_EQUAL(Styles); 10489 10490 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 10491 EXPECT_TRUE( 10492 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 10493 EXPECT_TRUE( 10494 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 10495 EXPECT_ALL_STYLES_EQUAL(Styles); 10496 10497 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 10498 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 10499 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 10500 EXPECT_ALL_STYLES_EQUAL(Styles); 10501 10502 Styles[0] = getMozillaStyle(); 10503 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 10504 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 10505 EXPECT_ALL_STYLES_EQUAL(Styles); 10506 10507 Styles[0] = getWebKitStyle(); 10508 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 10509 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 10510 EXPECT_ALL_STYLES_EQUAL(Styles); 10511 10512 Styles[0] = getGNUStyle(); 10513 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 10514 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 10515 EXPECT_ALL_STYLES_EQUAL(Styles); 10516 10517 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 10518 } 10519 10520 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 10521 SmallVector<FormatStyle, 8> Styles; 10522 Styles.resize(2); 10523 10524 Styles[0] = getGoogleStyle(); 10525 Styles[1] = getLLVMStyle(); 10526 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 10527 EXPECT_ALL_STYLES_EQUAL(Styles); 10528 10529 Styles.resize(5); 10530 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 10531 Styles[1] = getLLVMStyle(); 10532 Styles[1].Language = FormatStyle::LK_JavaScript; 10533 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 10534 10535 Styles[2] = getLLVMStyle(); 10536 Styles[2].Language = FormatStyle::LK_JavaScript; 10537 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 10538 "BasedOnStyle: Google", 10539 &Styles[2]) 10540 .value()); 10541 10542 Styles[3] = getLLVMStyle(); 10543 Styles[3].Language = FormatStyle::LK_JavaScript; 10544 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 10545 "Language: JavaScript", 10546 &Styles[3]) 10547 .value()); 10548 10549 Styles[4] = getLLVMStyle(); 10550 Styles[4].Language = FormatStyle::LK_JavaScript; 10551 EXPECT_EQ(0, parseConfiguration("---\n" 10552 "BasedOnStyle: LLVM\n" 10553 "IndentWidth: 123\n" 10554 "---\n" 10555 "BasedOnStyle: Google\n" 10556 "Language: JavaScript", 10557 &Styles[4]) 10558 .value()); 10559 EXPECT_ALL_STYLES_EQUAL(Styles); 10560 } 10561 10562 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 10563 Style.FIELD = false; \ 10564 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 10565 EXPECT_TRUE(Style.FIELD); \ 10566 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 10567 EXPECT_FALSE(Style.FIELD); 10568 10569 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 10570 10571 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 10572 Style.STRUCT.FIELD = false; \ 10573 EXPECT_EQ(0, \ 10574 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 10575 .value()); \ 10576 EXPECT_TRUE(Style.STRUCT.FIELD); \ 10577 EXPECT_EQ(0, \ 10578 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 10579 .value()); \ 10580 EXPECT_FALSE(Style.STRUCT.FIELD); 10581 10582 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 10583 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 10584 10585 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 10586 EXPECT_NE(VALUE, Style.FIELD); \ 10587 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 10588 EXPECT_EQ(VALUE, Style.FIELD) 10589 10590 TEST_F(FormatTest, ParsesConfigurationBools) { 10591 FormatStyle Style = {}; 10592 Style.Language = FormatStyle::LK_Cpp; 10593 CHECK_PARSE_BOOL(AlignOperands); 10594 CHECK_PARSE_BOOL(AlignTrailingComments); 10595 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 10596 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 10597 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 10598 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine); 10599 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 10600 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine); 10601 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 10602 CHECK_PARSE_BOOL(BinPackArguments); 10603 CHECK_PARSE_BOOL(BinPackParameters); 10604 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 10605 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 10606 CHECK_PARSE_BOOL(BreakStringLiterals); 10607 CHECK_PARSE_BOOL(CompactNamespaces); 10608 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 10609 CHECK_PARSE_BOOL(DerivePointerAlignment); 10610 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 10611 CHECK_PARSE_BOOL(DisableFormat); 10612 CHECK_PARSE_BOOL(IndentCaseLabels); 10613 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 10614 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 10615 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 10616 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 10617 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 10618 CHECK_PARSE_BOOL(ReflowComments); 10619 CHECK_PARSE_BOOL(SortIncludes); 10620 CHECK_PARSE_BOOL(SortUsingDeclarations); 10621 CHECK_PARSE_BOOL(SpacesInParentheses); 10622 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 10623 CHECK_PARSE_BOOL(SpacesInAngles); 10624 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 10625 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 10626 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 10627 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 10628 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 10629 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 10630 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 10631 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 10632 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 10633 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 10634 10635 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 10636 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement); 10637 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 10638 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 10639 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 10640 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 10641 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 10642 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 10643 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 10644 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 10645 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 10646 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 10647 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 10648 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 10649 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 10650 } 10651 10652 #undef CHECK_PARSE_BOOL 10653 10654 TEST_F(FormatTest, ParsesConfiguration) { 10655 FormatStyle Style = {}; 10656 Style.Language = FormatStyle::LK_Cpp; 10657 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 10658 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 10659 ConstructorInitializerIndentWidth, 1234u); 10660 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 10661 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 10662 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 10663 CHECK_PARSE("PenaltyBreakAssignment: 1234", 10664 PenaltyBreakAssignment, 1234u); 10665 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 10666 PenaltyBreakBeforeFirstCallParameter, 1234u); 10667 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 10668 PenaltyBreakTemplateDeclaration, 1234u); 10669 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 10670 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 10671 PenaltyReturnTypeOnItsOwnLine, 1234u); 10672 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 10673 SpacesBeforeTrailingComments, 1234u); 10674 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 10675 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 10676 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 10677 10678 Style.PointerAlignment = FormatStyle::PAS_Middle; 10679 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 10680 FormatStyle::PAS_Left); 10681 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 10682 FormatStyle::PAS_Right); 10683 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 10684 FormatStyle::PAS_Middle); 10685 // For backward compatibility: 10686 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 10687 FormatStyle::PAS_Left); 10688 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 10689 FormatStyle::PAS_Right); 10690 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 10691 FormatStyle::PAS_Middle); 10692 10693 Style.Standard = FormatStyle::LS_Auto; 10694 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 10695 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11); 10696 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 10697 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 10698 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 10699 10700 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10701 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 10702 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 10703 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 10704 FormatStyle::BOS_None); 10705 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 10706 FormatStyle::BOS_All); 10707 // For backward compatibility: 10708 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 10709 FormatStyle::BOS_None); 10710 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 10711 FormatStyle::BOS_All); 10712 10713 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 10714 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 10715 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 10716 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 10717 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 10718 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 10719 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 10720 // For backward compatibility: 10721 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 10722 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 10723 10724 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10725 CHECK_PARSE("BreakInheritanceList: BeforeComma", 10726 BreakInheritanceList, FormatStyle::BILS_BeforeComma); 10727 CHECK_PARSE("BreakInheritanceList: AfterColon", 10728 BreakInheritanceList, FormatStyle::BILS_AfterColon); 10729 CHECK_PARSE("BreakInheritanceList: BeforeColon", 10730 BreakInheritanceList, FormatStyle::BILS_BeforeColon); 10731 // For backward compatibility: 10732 CHECK_PARSE("BreakBeforeInheritanceComma: true", 10733 BreakInheritanceList, FormatStyle::BILS_BeforeComma); 10734 10735 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 10736 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 10737 FormatStyle::BAS_Align); 10738 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 10739 FormatStyle::BAS_DontAlign); 10740 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 10741 FormatStyle::BAS_AlwaysBreak); 10742 // For backward compatibility: 10743 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 10744 FormatStyle::BAS_DontAlign); 10745 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 10746 FormatStyle::BAS_Align); 10747 10748 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10749 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 10750 FormatStyle::ENAS_DontAlign); 10751 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 10752 FormatStyle::ENAS_Left); 10753 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 10754 FormatStyle::ENAS_Right); 10755 // For backward compatibility: 10756 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 10757 FormatStyle::ENAS_Left); 10758 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 10759 FormatStyle::ENAS_Right); 10760 10761 Style.UseTab = FormatStyle::UT_ForIndentation; 10762 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 10763 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 10764 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 10765 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 10766 FormatStyle::UT_ForContinuationAndIndentation); 10767 // For backward compatibility: 10768 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 10769 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 10770 10771 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 10772 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 10773 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 10774 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 10775 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 10776 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 10777 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 10778 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 10779 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 10780 // For backward compatibility: 10781 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 10782 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 10783 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 10784 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 10785 10786 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 10787 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 10788 FormatStyle::SBPO_Never); 10789 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 10790 FormatStyle::SBPO_Always); 10791 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 10792 FormatStyle::SBPO_ControlStatements); 10793 // For backward compatibility: 10794 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 10795 FormatStyle::SBPO_Never); 10796 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 10797 FormatStyle::SBPO_ControlStatements); 10798 10799 Style.ColumnLimit = 123; 10800 FormatStyle BaseStyle = getLLVMStyle(); 10801 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 10802 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 10803 10804 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 10805 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 10806 FormatStyle::BS_Attach); 10807 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 10808 FormatStyle::BS_Linux); 10809 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 10810 FormatStyle::BS_Mozilla); 10811 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 10812 FormatStyle::BS_Stroustrup); 10813 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 10814 FormatStyle::BS_Allman); 10815 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 10816 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 10817 FormatStyle::BS_WebKit); 10818 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 10819 FormatStyle::BS_Custom); 10820 10821 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 10822 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 10823 FormatStyle::RTBS_None); 10824 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 10825 FormatStyle::RTBS_All); 10826 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 10827 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 10828 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 10829 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 10830 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 10831 AlwaysBreakAfterReturnType, 10832 FormatStyle::RTBS_TopLevelDefinitions); 10833 10834 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 10835 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations, 10836 FormatStyle::BTDS_No); 10837 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations, 10838 FormatStyle::BTDS_MultiLine); 10839 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations, 10840 FormatStyle::BTDS_Yes); 10841 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations, 10842 FormatStyle::BTDS_MultiLine); 10843 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations, 10844 FormatStyle::BTDS_Yes); 10845 10846 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 10847 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 10848 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 10849 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 10850 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 10851 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 10852 AlwaysBreakAfterDefinitionReturnType, 10853 FormatStyle::DRTBS_TopLevel); 10854 10855 Style.NamespaceIndentation = FormatStyle::NI_All; 10856 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 10857 FormatStyle::NI_None); 10858 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 10859 FormatStyle::NI_Inner); 10860 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 10861 FormatStyle::NI_All); 10862 10863 // FIXME: This is required because parsing a configuration simply overwrites 10864 // the first N elements of the list instead of resetting it. 10865 Style.ForEachMacros.clear(); 10866 std::vector<std::string> BoostForeach; 10867 BoostForeach.push_back("BOOST_FOREACH"); 10868 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 10869 std::vector<std::string> BoostAndQForeach; 10870 BoostAndQForeach.push_back("BOOST_FOREACH"); 10871 BoostAndQForeach.push_back("Q_FOREACH"); 10872 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 10873 BoostAndQForeach); 10874 10875 Style.IncludeStyle.IncludeCategories.clear(); 10876 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 10877 {"abc/.*", 2}, {".*", 1}}; 10878 CHECK_PARSE("IncludeCategories:\n" 10879 " - Regex: abc/.*\n" 10880 " Priority: 2\n" 10881 " - Regex: .*\n" 10882 " Priority: 1", 10883 IncludeStyle.IncludeCategories, ExpectedCategories); 10884 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 10885 "abc$"); 10886 10887 Style.RawStringFormats.clear(); 10888 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 10889 { 10890 FormatStyle::LK_TextProto, 10891 {"pb", "proto"}, 10892 {"PARSE_TEXT_PROTO"}, 10893 /*CanonicalDelimiter=*/"", 10894 "llvm", 10895 }, 10896 { 10897 FormatStyle::LK_Cpp, 10898 {"cc", "cpp"}, 10899 {"C_CODEBLOCK", "CPPEVAL"}, 10900 /*CanonicalDelimiter=*/"cc", 10901 /*BasedOnStyle=*/"", 10902 }, 10903 }; 10904 10905 CHECK_PARSE("RawStringFormats:\n" 10906 " - Language: TextProto\n" 10907 " Delimiters:\n" 10908 " - 'pb'\n" 10909 " - 'proto'\n" 10910 " EnclosingFunctions:\n" 10911 " - 'PARSE_TEXT_PROTO'\n" 10912 " BasedOnStyle: llvm\n" 10913 " - Language: Cpp\n" 10914 " Delimiters:\n" 10915 " - 'cc'\n" 10916 " - 'cpp'\n" 10917 " EnclosingFunctions:\n" 10918 " - 'C_CODEBLOCK'\n" 10919 " - 'CPPEVAL'\n" 10920 " CanonicalDelimiter: 'cc'", 10921 RawStringFormats, ExpectedRawStringFormats); 10922 } 10923 10924 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 10925 FormatStyle Style = {}; 10926 Style.Language = FormatStyle::LK_Cpp; 10927 CHECK_PARSE("Language: Cpp\n" 10928 "IndentWidth: 12", 10929 IndentWidth, 12u); 10930 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 10931 "IndentWidth: 34", 10932 &Style), 10933 ParseError::Unsuitable); 10934 EXPECT_EQ(12u, Style.IndentWidth); 10935 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 10936 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 10937 10938 Style.Language = FormatStyle::LK_JavaScript; 10939 CHECK_PARSE("Language: JavaScript\n" 10940 "IndentWidth: 12", 10941 IndentWidth, 12u); 10942 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 10943 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 10944 "IndentWidth: 34", 10945 &Style), 10946 ParseError::Unsuitable); 10947 EXPECT_EQ(23u, Style.IndentWidth); 10948 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 10949 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 10950 10951 CHECK_PARSE("BasedOnStyle: LLVM\n" 10952 "IndentWidth: 67", 10953 IndentWidth, 67u); 10954 10955 CHECK_PARSE("---\n" 10956 "Language: JavaScript\n" 10957 "IndentWidth: 12\n" 10958 "---\n" 10959 "Language: Cpp\n" 10960 "IndentWidth: 34\n" 10961 "...\n", 10962 IndentWidth, 12u); 10963 10964 Style.Language = FormatStyle::LK_Cpp; 10965 CHECK_PARSE("---\n" 10966 "Language: JavaScript\n" 10967 "IndentWidth: 12\n" 10968 "---\n" 10969 "Language: Cpp\n" 10970 "IndentWidth: 34\n" 10971 "...\n", 10972 IndentWidth, 34u); 10973 CHECK_PARSE("---\n" 10974 "IndentWidth: 78\n" 10975 "---\n" 10976 "Language: JavaScript\n" 10977 "IndentWidth: 56\n" 10978 "...\n", 10979 IndentWidth, 78u); 10980 10981 Style.ColumnLimit = 123; 10982 Style.IndentWidth = 234; 10983 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 10984 Style.TabWidth = 345; 10985 EXPECT_FALSE(parseConfiguration("---\n" 10986 "IndentWidth: 456\n" 10987 "BreakBeforeBraces: Allman\n" 10988 "---\n" 10989 "Language: JavaScript\n" 10990 "IndentWidth: 111\n" 10991 "TabWidth: 111\n" 10992 "---\n" 10993 "Language: Cpp\n" 10994 "BreakBeforeBraces: Stroustrup\n" 10995 "TabWidth: 789\n" 10996 "...\n", 10997 &Style)); 10998 EXPECT_EQ(123u, Style.ColumnLimit); 10999 EXPECT_EQ(456u, Style.IndentWidth); 11000 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 11001 EXPECT_EQ(789u, Style.TabWidth); 11002 11003 EXPECT_EQ(parseConfiguration("---\n" 11004 "Language: JavaScript\n" 11005 "IndentWidth: 56\n" 11006 "---\n" 11007 "IndentWidth: 78\n" 11008 "...\n", 11009 &Style), 11010 ParseError::Error); 11011 EXPECT_EQ(parseConfiguration("---\n" 11012 "Language: JavaScript\n" 11013 "IndentWidth: 56\n" 11014 "---\n" 11015 "Language: JavaScript\n" 11016 "IndentWidth: 78\n" 11017 "...\n", 11018 &Style), 11019 ParseError::Error); 11020 11021 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 11022 } 11023 11024 #undef CHECK_PARSE 11025 11026 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 11027 FormatStyle Style = {}; 11028 Style.Language = FormatStyle::LK_JavaScript; 11029 Style.BreakBeforeTernaryOperators = true; 11030 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 11031 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 11032 11033 Style.BreakBeforeTernaryOperators = true; 11034 EXPECT_EQ(0, parseConfiguration("---\n" 11035 "BasedOnStyle: Google\n" 11036 "---\n" 11037 "Language: JavaScript\n" 11038 "IndentWidth: 76\n" 11039 "...\n", 11040 &Style) 11041 .value()); 11042 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 11043 EXPECT_EQ(76u, Style.IndentWidth); 11044 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 11045 } 11046 11047 TEST_F(FormatTest, ConfigurationRoundTripTest) { 11048 FormatStyle Style = getLLVMStyle(); 11049 std::string YAML = configurationAsText(Style); 11050 FormatStyle ParsedStyle = {}; 11051 ParsedStyle.Language = FormatStyle::LK_Cpp; 11052 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 11053 EXPECT_EQ(Style, ParsedStyle); 11054 } 11055 11056 TEST_F(FormatTest, WorksFor8bitEncodings) { 11057 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 11058 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 11059 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 11060 "\"\xef\xee\xf0\xf3...\"", 11061 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 11062 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 11063 "\xef\xee\xf0\xf3...\"", 11064 getLLVMStyleWithColumns(12))); 11065 } 11066 11067 TEST_F(FormatTest, HandlesUTF8BOM) { 11068 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 11069 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 11070 format("\xef\xbb\xbf#include <iostream>")); 11071 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 11072 format("\xef\xbb\xbf\n#include <iostream>")); 11073 } 11074 11075 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 11076 #if !defined(_MSC_VER) 11077 11078 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 11079 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 11080 getLLVMStyleWithColumns(35)); 11081 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 11082 getLLVMStyleWithColumns(31)); 11083 verifyFormat("// Однажды в студёную зимнюю пору...", 11084 getLLVMStyleWithColumns(36)); 11085 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 11086 verifyFormat("/* Однажды в студёную зимнюю пору... */", 11087 getLLVMStyleWithColumns(39)); 11088 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 11089 getLLVMStyleWithColumns(35)); 11090 } 11091 11092 TEST_F(FormatTest, SplitsUTF8Strings) { 11093 // Non-printable characters' width is currently considered to be the length in 11094 // bytes in UTF8. The characters can be displayed in very different manner 11095 // (zero-width, single width with a substitution glyph, expanded to their code 11096 // (e.g. "<8d>"), so there's no single correct way to handle them. 11097 EXPECT_EQ("\"aaaaÄ\"\n" 11098 "\"\xc2\x8d\";", 11099 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 11100 EXPECT_EQ("\"aaaaaaaÄ\"\n" 11101 "\"\xc2\x8d\";", 11102 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 11103 EXPECT_EQ("\"Однажды, в \"\n" 11104 "\"студёную \"\n" 11105 "\"зимнюю \"\n" 11106 "\"пору,\"", 11107 format("\"Однажды, в студёную зимнюю пору,\"", 11108 getLLVMStyleWithColumns(13))); 11109 EXPECT_EQ( 11110 "\"一 二 三 \"\n" 11111 "\"四 五六 \"\n" 11112 "\"七 八 九 \"\n" 11113 "\"十\"", 11114 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 11115 EXPECT_EQ("\"一\t\"\n" 11116 "\"二 \t\"\n" 11117 "\"三 四 \"\n" 11118 "\"五\t\"\n" 11119 "\"六 \t\"\n" 11120 "\"七 \"\n" 11121 "\"八九十\tqq\"", 11122 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 11123 getLLVMStyleWithColumns(11))); 11124 11125 // UTF8 character in an escape sequence. 11126 EXPECT_EQ("\"aaaaaa\"\n" 11127 "\"\\\xC2\x8D\"", 11128 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 11129 } 11130 11131 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 11132 EXPECT_EQ("const char *sssss =\n" 11133 " \"一二三四五六七八\\\n" 11134 " 九 十\";", 11135 format("const char *sssss = \"一二三四五六七八\\\n" 11136 " 九 十\";", 11137 getLLVMStyleWithColumns(30))); 11138 } 11139 11140 TEST_F(FormatTest, SplitsUTF8LineComments) { 11141 EXPECT_EQ("// aaaaÄ\xc2\x8d", 11142 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 11143 EXPECT_EQ("// Я из лесу\n" 11144 "// вышел; был\n" 11145 "// сильный\n" 11146 "// мороз.", 11147 format("// Я из лесу вышел; был сильный мороз.", 11148 getLLVMStyleWithColumns(13))); 11149 EXPECT_EQ("// 一二三\n" 11150 "// 四五六七\n" 11151 "// 八 九\n" 11152 "// 十", 11153 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 11154 } 11155 11156 TEST_F(FormatTest, SplitsUTF8BlockComments) { 11157 EXPECT_EQ("/* Гляжу,\n" 11158 " * поднимается\n" 11159 " * медленно в\n" 11160 " * гору\n" 11161 " * Лошадка,\n" 11162 " * везущая\n" 11163 " * хворосту\n" 11164 " * воз. */", 11165 format("/* Гляжу, поднимается медленно в гору\n" 11166 " * Лошадка, везущая хворосту воз. */", 11167 getLLVMStyleWithColumns(13))); 11168 EXPECT_EQ( 11169 "/* 一二三\n" 11170 " * 四五六七\n" 11171 " * 八 九\n" 11172 " * 十 */", 11173 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 11174 EXPECT_EQ("/* \n" 11175 " * \n" 11176 " * - */", 11177 format("/* - */", getLLVMStyleWithColumns(12))); 11178 } 11179 11180 #endif // _MSC_VER 11181 11182 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 11183 FormatStyle Style = getLLVMStyle(); 11184 11185 Style.ConstructorInitializerIndentWidth = 4; 11186 verifyFormat( 11187 "SomeClass::Constructor()\n" 11188 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 11189 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 11190 Style); 11191 11192 Style.ConstructorInitializerIndentWidth = 2; 11193 verifyFormat( 11194 "SomeClass::Constructor()\n" 11195 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 11196 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 11197 Style); 11198 11199 Style.ConstructorInitializerIndentWidth = 0; 11200 verifyFormat( 11201 "SomeClass::Constructor()\n" 11202 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 11203 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 11204 Style); 11205 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 11206 verifyFormat( 11207 "SomeLongTemplateVariableName<\n" 11208 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 11209 Style); 11210 verifyFormat( 11211 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 11212 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 11213 Style); 11214 } 11215 11216 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 11217 FormatStyle Style = getLLVMStyle(); 11218 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 11219 Style.ConstructorInitializerIndentWidth = 4; 11220 verifyFormat("SomeClass::Constructor()\n" 11221 " : a(a)\n" 11222 " , b(b)\n" 11223 " , c(c) {}", 11224 Style); 11225 verifyFormat("SomeClass::Constructor()\n" 11226 " : a(a) {}", 11227 Style); 11228 11229 Style.ColumnLimit = 0; 11230 verifyFormat("SomeClass::Constructor()\n" 11231 " : a(a) {}", 11232 Style); 11233 verifyFormat("SomeClass::Constructor() noexcept\n" 11234 " : a(a) {}", 11235 Style); 11236 verifyFormat("SomeClass::Constructor()\n" 11237 " : a(a)\n" 11238 " , b(b)\n" 11239 " , c(c) {}", 11240 Style); 11241 verifyFormat("SomeClass::Constructor()\n" 11242 " : a(a) {\n" 11243 " foo();\n" 11244 " bar();\n" 11245 "}", 11246 Style); 11247 11248 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 11249 verifyFormat("SomeClass::Constructor()\n" 11250 " : a(a)\n" 11251 " , b(b)\n" 11252 " , c(c) {\n}", 11253 Style); 11254 verifyFormat("SomeClass::Constructor()\n" 11255 " : a(a) {\n}", 11256 Style); 11257 11258 Style.ColumnLimit = 80; 11259 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 11260 Style.ConstructorInitializerIndentWidth = 2; 11261 verifyFormat("SomeClass::Constructor()\n" 11262 " : a(a)\n" 11263 " , b(b)\n" 11264 " , c(c) {}", 11265 Style); 11266 11267 Style.ConstructorInitializerIndentWidth = 0; 11268 verifyFormat("SomeClass::Constructor()\n" 11269 ": a(a)\n" 11270 ", b(b)\n" 11271 ", c(c) {}", 11272 Style); 11273 11274 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 11275 Style.ConstructorInitializerIndentWidth = 4; 11276 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 11277 verifyFormat( 11278 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 11279 Style); 11280 verifyFormat( 11281 "SomeClass::Constructor()\n" 11282 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 11283 Style); 11284 Style.ConstructorInitializerIndentWidth = 4; 11285 Style.ColumnLimit = 60; 11286 verifyFormat("SomeClass::Constructor()\n" 11287 " : aaaaaaaa(aaaaaaaa)\n" 11288 " , aaaaaaaa(aaaaaaaa)\n" 11289 " , aaaaaaaa(aaaaaaaa) {}", 11290 Style); 11291 } 11292 11293 TEST_F(FormatTest, Destructors) { 11294 verifyFormat("void F(int &i) { i.~int(); }"); 11295 verifyFormat("void F(int &i) { i->~int(); }"); 11296 } 11297 11298 TEST_F(FormatTest, FormatsWithWebKitStyle) { 11299 FormatStyle Style = getWebKitStyle(); 11300 11301 // Don't indent in outer namespaces. 11302 verifyFormat("namespace outer {\n" 11303 "int i;\n" 11304 "namespace inner {\n" 11305 " int i;\n" 11306 "} // namespace inner\n" 11307 "} // namespace outer\n" 11308 "namespace other_outer {\n" 11309 "int i;\n" 11310 "}", 11311 Style); 11312 11313 // Don't indent case labels. 11314 verifyFormat("switch (variable) {\n" 11315 "case 1:\n" 11316 "case 2:\n" 11317 " doSomething();\n" 11318 " break;\n" 11319 "default:\n" 11320 " ++variable;\n" 11321 "}", 11322 Style); 11323 11324 // Wrap before binary operators. 11325 EXPECT_EQ("void f()\n" 11326 "{\n" 11327 " if (aaaaaaaaaaaaaaaa\n" 11328 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 11329 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 11330 " return;\n" 11331 "}", 11332 format("void f() {\n" 11333 "if (aaaaaaaaaaaaaaaa\n" 11334 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 11335 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 11336 "return;\n" 11337 "}", 11338 Style)); 11339 11340 // Allow functions on a single line. 11341 verifyFormat("void f() { return; }", Style); 11342 11343 // Constructor initializers are formatted one per line with the "," on the 11344 // new line. 11345 verifyFormat("Constructor()\n" 11346 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 11347 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 11348 " aaaaaaaaaaaaaa)\n" 11349 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 11350 "{\n" 11351 "}", 11352 Style); 11353 verifyFormat("SomeClass::Constructor()\n" 11354 " : a(a)\n" 11355 "{\n" 11356 "}", 11357 Style); 11358 EXPECT_EQ("SomeClass::Constructor()\n" 11359 " : a(a)\n" 11360 "{\n" 11361 "}", 11362 format("SomeClass::Constructor():a(a){}", Style)); 11363 verifyFormat("SomeClass::Constructor()\n" 11364 " : a(a)\n" 11365 " , b(b)\n" 11366 " , c(c)\n" 11367 "{\n" 11368 "}", 11369 Style); 11370 verifyFormat("SomeClass::Constructor()\n" 11371 " : a(a)\n" 11372 "{\n" 11373 " foo();\n" 11374 " bar();\n" 11375 "}", 11376 Style); 11377 11378 // Access specifiers should be aligned left. 11379 verifyFormat("class C {\n" 11380 "public:\n" 11381 " int i;\n" 11382 "};", 11383 Style); 11384 11385 // Do not align comments. 11386 verifyFormat("int a; // Do not\n" 11387 "double b; // align comments.", 11388 Style); 11389 11390 // Do not align operands. 11391 EXPECT_EQ("ASSERT(aaaa\n" 11392 " || bbbb);", 11393 format("ASSERT ( aaaa\n||bbbb);", Style)); 11394 11395 // Accept input's line breaks. 11396 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 11397 " || bbbbbbbbbbbbbbb) {\n" 11398 " i++;\n" 11399 "}", 11400 format("if (aaaaaaaaaaaaaaa\n" 11401 "|| bbbbbbbbbbbbbbb) { i++; }", 11402 Style)); 11403 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 11404 " i++;\n" 11405 "}", 11406 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 11407 11408 // Don't automatically break all macro definitions (llvm.org/PR17842). 11409 verifyFormat("#define aNumber 10", Style); 11410 // However, generally keep the line breaks that the user authored. 11411 EXPECT_EQ("#define aNumber \\\n" 11412 " 10", 11413 format("#define aNumber \\\n" 11414 " 10", 11415 Style)); 11416 11417 // Keep empty and one-element array literals on a single line. 11418 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 11419 " copyItems:YES];", 11420 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 11421 "copyItems:YES];", 11422 Style)); 11423 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 11424 " copyItems:YES];", 11425 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 11426 " copyItems:YES];", 11427 Style)); 11428 // FIXME: This does not seem right, there should be more indentation before 11429 // the array literal's entries. Nested blocks have the same problem. 11430 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 11431 " @\"a\",\n" 11432 " @\"a\"\n" 11433 "]\n" 11434 " copyItems:YES];", 11435 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 11436 " @\"a\",\n" 11437 " @\"a\"\n" 11438 " ]\n" 11439 " copyItems:YES];", 11440 Style)); 11441 EXPECT_EQ( 11442 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 11443 " copyItems:YES];", 11444 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 11445 " copyItems:YES];", 11446 Style)); 11447 11448 verifyFormat("[self.a b:c c:d];", Style); 11449 EXPECT_EQ("[self.a b:c\n" 11450 " c:d];", 11451 format("[self.a b:c\n" 11452 "c:d];", 11453 Style)); 11454 } 11455 11456 TEST_F(FormatTest, FormatsLambdas) { 11457 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 11458 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 11459 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 11460 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 11461 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 11462 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 11463 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 11464 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 11465 verifyFormat("int x = f(*+[] {});"); 11466 verifyFormat("void f() {\n" 11467 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 11468 "}\n"); 11469 verifyFormat("void f() {\n" 11470 " other(x.begin(), //\n" 11471 " x.end(), //\n" 11472 " [&](int, int) { return 1; });\n" 11473 "}\n"); 11474 verifyFormat("SomeFunction([]() { // A cool function...\n" 11475 " return 43;\n" 11476 "});"); 11477 EXPECT_EQ("SomeFunction([]() {\n" 11478 "#define A a\n" 11479 " return 43;\n" 11480 "});", 11481 format("SomeFunction([](){\n" 11482 "#define A a\n" 11483 "return 43;\n" 11484 "});")); 11485 verifyFormat("void f() {\n" 11486 " SomeFunction([](decltype(x), A *a) {});\n" 11487 "}"); 11488 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 11489 " [](const aaaaaaaaaa &a) { return a; });"); 11490 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 11491 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 11492 "});"); 11493 verifyFormat("Constructor()\n" 11494 " : Field([] { // comment\n" 11495 " int i;\n" 11496 " }) {}"); 11497 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 11498 " return some_parameter.size();\n" 11499 "};"); 11500 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 11501 " [](const string &s) { return s; };"); 11502 verifyFormat("int i = aaaaaa ? 1 //\n" 11503 " : [] {\n" 11504 " return 2; //\n" 11505 " }();"); 11506 verifyFormat("llvm::errs() << \"number of twos is \"\n" 11507 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 11508 " return x == 2; // force break\n" 11509 " });"); 11510 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 11511 " [=](int iiiiiiiiiiii) {\n" 11512 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 11513 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 11514 " });", 11515 getLLVMStyleWithColumns(60)); 11516 verifyFormat("SomeFunction({[&] {\n" 11517 " // comment\n" 11518 " },\n" 11519 " [&] {\n" 11520 " // comment\n" 11521 " }});"); 11522 verifyFormat("SomeFunction({[&] {\n" 11523 " // comment\n" 11524 "}});"); 11525 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n" 11526 " [&]() { return true; },\n" 11527 " aaaaa aaaaaaaaa);"); 11528 11529 // Lambdas with return types. 11530 verifyFormat("int c = []() -> int { return 2; }();\n"); 11531 verifyFormat("int c = []() -> int * { return 2; }();\n"); 11532 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 11533 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 11534 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 11535 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 11536 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 11537 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 11538 verifyFormat("[a, a]() -> a<1> {};"); 11539 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 11540 " int j) -> int {\n" 11541 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 11542 "};"); 11543 verifyFormat( 11544 "aaaaaaaaaaaaaaaaaaaaaa(\n" 11545 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 11546 " return aaaaaaaaaaaaaaaaa;\n" 11547 " });", 11548 getLLVMStyleWithColumns(70)); 11549 verifyFormat("[]() //\n" 11550 " -> int {\n" 11551 " return 1; //\n" 11552 "};"); 11553 11554 // Multiple lambdas in the same parentheses change indentation rules. 11555 verifyFormat("SomeFunction(\n" 11556 " []() {\n" 11557 " int i = 42;\n" 11558 " return i;\n" 11559 " },\n" 11560 " []() {\n" 11561 " int j = 43;\n" 11562 " return j;\n" 11563 " });"); 11564 11565 // More complex introducers. 11566 verifyFormat("return [i, args...] {};"); 11567 11568 // Not lambdas. 11569 verifyFormat("constexpr char hello[]{\"hello\"};"); 11570 verifyFormat("double &operator[](int i) { return 0; }\n" 11571 "int i;"); 11572 verifyFormat("std::unique_ptr<int[]> foo() {}"); 11573 verifyFormat("int i = a[a][a]->f();"); 11574 verifyFormat("int i = (*b)[a]->f();"); 11575 11576 // Other corner cases. 11577 verifyFormat("void f() {\n" 11578 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 11579 " );\n" 11580 "}"); 11581 11582 // Lambdas created through weird macros. 11583 verifyFormat("void f() {\n" 11584 " MACRO((const AA &a) { return 1; });\n" 11585 " MACRO((AA &a) { return 1; });\n" 11586 "}"); 11587 11588 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 11589 " doo_dah();\n" 11590 " doo_dah();\n" 11591 " })) {\n" 11592 "}"); 11593 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 11594 " doo_dah();\n" 11595 " doo_dah();\n" 11596 " })) {\n" 11597 "}"); 11598 verifyFormat("auto lambda = []() {\n" 11599 " int a = 2\n" 11600 "#if A\n" 11601 " + 2\n" 11602 "#endif\n" 11603 " ;\n" 11604 "};"); 11605 11606 // Lambdas with complex multiline introducers. 11607 verifyFormat( 11608 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 11609 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 11610 " -> ::std::unordered_set<\n" 11611 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 11612 " //\n" 11613 " });"); 11614 } 11615 11616 TEST_F(FormatTest, EmptyLinesInLambdas) { 11617 verifyFormat("auto lambda = []() {\n" 11618 " x(); //\n" 11619 "};", 11620 "auto lambda = []() {\n" 11621 "\n" 11622 " x(); //\n" 11623 "\n" 11624 "};"); 11625 } 11626 11627 TEST_F(FormatTest, FormatsBlocks) { 11628 FormatStyle ShortBlocks = getLLVMStyle(); 11629 ShortBlocks.AllowShortBlocksOnASingleLine = true; 11630 verifyFormat("int (^Block)(int, int);", ShortBlocks); 11631 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 11632 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 11633 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 11634 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 11635 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 11636 11637 verifyFormat("foo(^{ bar(); });", ShortBlocks); 11638 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 11639 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 11640 11641 verifyFormat("[operation setCompletionBlock:^{\n" 11642 " [self onOperationDone];\n" 11643 "}];"); 11644 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 11645 " [self onOperationDone];\n" 11646 "}]};"); 11647 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 11648 " f();\n" 11649 "}];"); 11650 verifyFormat("int a = [operation block:^int(int *i) {\n" 11651 " return 1;\n" 11652 "}];"); 11653 verifyFormat("[myObject doSomethingWith:arg1\n" 11654 " aaa:^int(int *a) {\n" 11655 " return 1;\n" 11656 " }\n" 11657 " bbb:f(a * bbbbbbbb)];"); 11658 11659 verifyFormat("[operation setCompletionBlock:^{\n" 11660 " [self.delegate newDataAvailable];\n" 11661 "}];", 11662 getLLVMStyleWithColumns(60)); 11663 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 11664 " NSString *path = [self sessionFilePath];\n" 11665 " if (path) {\n" 11666 " // ...\n" 11667 " }\n" 11668 "});"); 11669 verifyFormat("[[SessionService sharedService]\n" 11670 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 11671 " if (window) {\n" 11672 " [self windowDidLoad:window];\n" 11673 " } else {\n" 11674 " [self errorLoadingWindow];\n" 11675 " }\n" 11676 " }];"); 11677 verifyFormat("void (^largeBlock)(void) = ^{\n" 11678 " // ...\n" 11679 "};\n", 11680 getLLVMStyleWithColumns(40)); 11681 verifyFormat("[[SessionService sharedService]\n" 11682 " loadWindowWithCompletionBlock: //\n" 11683 " ^(SessionWindow *window) {\n" 11684 " if (window) {\n" 11685 " [self windowDidLoad:window];\n" 11686 " } else {\n" 11687 " [self errorLoadingWindow];\n" 11688 " }\n" 11689 " }];", 11690 getLLVMStyleWithColumns(60)); 11691 verifyFormat("[myObject doSomethingWith:arg1\n" 11692 " firstBlock:^(Foo *a) {\n" 11693 " // ...\n" 11694 " int i;\n" 11695 " }\n" 11696 " secondBlock:^(Bar *b) {\n" 11697 " // ...\n" 11698 " int i;\n" 11699 " }\n" 11700 " thirdBlock:^Foo(Bar *b) {\n" 11701 " // ...\n" 11702 " int i;\n" 11703 " }];"); 11704 verifyFormat("[myObject doSomethingWith:arg1\n" 11705 " firstBlock:-1\n" 11706 " secondBlock:^(Bar *b) {\n" 11707 " // ...\n" 11708 " int i;\n" 11709 " }];"); 11710 11711 verifyFormat("f(^{\n" 11712 " @autoreleasepool {\n" 11713 " if (a) {\n" 11714 " g();\n" 11715 " }\n" 11716 " }\n" 11717 "});"); 11718 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 11719 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 11720 "};"); 11721 11722 FormatStyle FourIndent = getLLVMStyle(); 11723 FourIndent.ObjCBlockIndentWidth = 4; 11724 verifyFormat("[operation setCompletionBlock:^{\n" 11725 " [self onOperationDone];\n" 11726 "}];", 11727 FourIndent); 11728 } 11729 11730 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 11731 FormatStyle ZeroColumn = getLLVMStyle(); 11732 ZeroColumn.ColumnLimit = 0; 11733 11734 verifyFormat("[[SessionService sharedService] " 11735 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 11736 " if (window) {\n" 11737 " [self windowDidLoad:window];\n" 11738 " } else {\n" 11739 " [self errorLoadingWindow];\n" 11740 " }\n" 11741 "}];", 11742 ZeroColumn); 11743 EXPECT_EQ("[[SessionService sharedService]\n" 11744 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 11745 " if (window) {\n" 11746 " [self windowDidLoad:window];\n" 11747 " } else {\n" 11748 " [self errorLoadingWindow];\n" 11749 " }\n" 11750 " }];", 11751 format("[[SessionService sharedService]\n" 11752 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 11753 " if (window) {\n" 11754 " [self windowDidLoad:window];\n" 11755 " } else {\n" 11756 " [self errorLoadingWindow];\n" 11757 " }\n" 11758 "}];", 11759 ZeroColumn)); 11760 verifyFormat("[myObject doSomethingWith:arg1\n" 11761 " firstBlock:^(Foo *a) {\n" 11762 " // ...\n" 11763 " int i;\n" 11764 " }\n" 11765 " secondBlock:^(Bar *b) {\n" 11766 " // ...\n" 11767 " int i;\n" 11768 " }\n" 11769 " thirdBlock:^Foo(Bar *b) {\n" 11770 " // ...\n" 11771 " int i;\n" 11772 " }];", 11773 ZeroColumn); 11774 verifyFormat("f(^{\n" 11775 " @autoreleasepool {\n" 11776 " if (a) {\n" 11777 " g();\n" 11778 " }\n" 11779 " }\n" 11780 "});", 11781 ZeroColumn); 11782 verifyFormat("void (^largeBlock)(void) = ^{\n" 11783 " // ...\n" 11784 "};", 11785 ZeroColumn); 11786 11787 ZeroColumn.AllowShortBlocksOnASingleLine = true; 11788 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 11789 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 11790 ZeroColumn.AllowShortBlocksOnASingleLine = false; 11791 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 11792 " int i;\n" 11793 "};", 11794 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 11795 } 11796 11797 TEST_F(FormatTest, SupportsCRLF) { 11798 EXPECT_EQ("int a;\r\n" 11799 "int b;\r\n" 11800 "int c;\r\n", 11801 format("int a;\r\n" 11802 " int b;\r\n" 11803 " int c;\r\n", 11804 getLLVMStyle())); 11805 EXPECT_EQ("int a;\r\n" 11806 "int b;\r\n" 11807 "int c;\r\n", 11808 format("int a;\r\n" 11809 " int b;\n" 11810 " int c;\r\n", 11811 getLLVMStyle())); 11812 EXPECT_EQ("int a;\n" 11813 "int b;\n" 11814 "int c;\n", 11815 format("int a;\r\n" 11816 " int b;\n" 11817 " int c;\n", 11818 getLLVMStyle())); 11819 EXPECT_EQ("\"aaaaaaa \"\r\n" 11820 "\"bbbbbbb\";\r\n", 11821 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 11822 EXPECT_EQ("#define A \\\r\n" 11823 " b; \\\r\n" 11824 " c; \\\r\n" 11825 " d;\r\n", 11826 format("#define A \\\r\n" 11827 " b; \\\r\n" 11828 " c; d; \r\n", 11829 getGoogleStyle())); 11830 11831 EXPECT_EQ("/*\r\n" 11832 "multi line block comments\r\n" 11833 "should not introduce\r\n" 11834 "an extra carriage return\r\n" 11835 "*/\r\n", 11836 format("/*\r\n" 11837 "multi line block comments\r\n" 11838 "should not introduce\r\n" 11839 "an extra carriage return\r\n" 11840 "*/\r\n")); 11841 } 11842 11843 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 11844 verifyFormat("MY_CLASS(C) {\n" 11845 " int i;\n" 11846 " int j;\n" 11847 "};"); 11848 } 11849 11850 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 11851 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 11852 TwoIndent.ContinuationIndentWidth = 2; 11853 11854 EXPECT_EQ("int i =\n" 11855 " longFunction(\n" 11856 " arg);", 11857 format("int i = longFunction(arg);", TwoIndent)); 11858 11859 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 11860 SixIndent.ContinuationIndentWidth = 6; 11861 11862 EXPECT_EQ("int i =\n" 11863 " longFunction(\n" 11864 " arg);", 11865 format("int i = longFunction(arg);", SixIndent)); 11866 } 11867 11868 TEST_F(FormatTest, SpacesInAngles) { 11869 FormatStyle Spaces = getLLVMStyle(); 11870 Spaces.SpacesInAngles = true; 11871 11872 verifyFormat("static_cast< int >(arg);", Spaces); 11873 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 11874 verifyFormat("f< int, float >();", Spaces); 11875 verifyFormat("template <> g() {}", Spaces); 11876 verifyFormat("template < std::vector< int > > f() {}", Spaces); 11877 verifyFormat("std::function< void(int, int) > fct;", Spaces); 11878 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 11879 Spaces); 11880 11881 Spaces.Standard = FormatStyle::LS_Cpp03; 11882 Spaces.SpacesInAngles = true; 11883 verifyFormat("A< A< int > >();", Spaces); 11884 11885 Spaces.SpacesInAngles = false; 11886 verifyFormat("A<A<int> >();", Spaces); 11887 11888 Spaces.Standard = FormatStyle::LS_Cpp11; 11889 Spaces.SpacesInAngles = true; 11890 verifyFormat("A< A< int > >();", Spaces); 11891 11892 Spaces.SpacesInAngles = false; 11893 verifyFormat("A<A<int>>();", Spaces); 11894 } 11895 11896 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 11897 FormatStyle Style = getLLVMStyle(); 11898 Style.SpaceAfterTemplateKeyword = false; 11899 verifyFormat("template<int> void foo();", Style); 11900 } 11901 11902 TEST_F(FormatTest, TripleAngleBrackets) { 11903 verifyFormat("f<<<1, 1>>>();"); 11904 verifyFormat("f<<<1, 1, 1, s>>>();"); 11905 verifyFormat("f<<<a, b, c, d>>>();"); 11906 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 11907 verifyFormat("f<param><<<1, 1>>>();"); 11908 verifyFormat("f<1><<<1, 1>>>();"); 11909 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 11910 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 11911 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 11912 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 11913 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 11914 } 11915 11916 TEST_F(FormatTest, MergeLessLessAtEnd) { 11917 verifyFormat("<<"); 11918 EXPECT_EQ("< < <", format("\\\n<<<")); 11919 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 11920 "aaallvm::outs() <<"); 11921 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 11922 "aaaallvm::outs()\n <<"); 11923 } 11924 11925 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 11926 std::string code = "#if A\n" 11927 "#if B\n" 11928 "a.\n" 11929 "#endif\n" 11930 " a = 1;\n" 11931 "#else\n" 11932 "#endif\n" 11933 "#if C\n" 11934 "#else\n" 11935 "#endif\n"; 11936 EXPECT_EQ(code, format(code)); 11937 } 11938 11939 TEST_F(FormatTest, HandleConflictMarkers) { 11940 // Git/SVN conflict markers. 11941 EXPECT_EQ("int a;\n" 11942 "void f() {\n" 11943 " callme(some(parameter1,\n" 11944 "<<<<<<< text by the vcs\n" 11945 " parameter2),\n" 11946 "||||||| text by the vcs\n" 11947 " parameter2),\n" 11948 " parameter3,\n" 11949 "======= text by the vcs\n" 11950 " parameter2, parameter3),\n" 11951 ">>>>>>> text by the vcs\n" 11952 " otherparameter);\n", 11953 format("int a;\n" 11954 "void f() {\n" 11955 " callme(some(parameter1,\n" 11956 "<<<<<<< text by the vcs\n" 11957 " parameter2),\n" 11958 "||||||| text by the vcs\n" 11959 " parameter2),\n" 11960 " parameter3,\n" 11961 "======= text by the vcs\n" 11962 " parameter2,\n" 11963 " parameter3),\n" 11964 ">>>>>>> text by the vcs\n" 11965 " otherparameter);\n")); 11966 11967 // Perforce markers. 11968 EXPECT_EQ("void f() {\n" 11969 " function(\n" 11970 ">>>> text by the vcs\n" 11971 " parameter,\n" 11972 "==== text by the vcs\n" 11973 " parameter,\n" 11974 "==== text by the vcs\n" 11975 " parameter,\n" 11976 "<<<< text by the vcs\n" 11977 " parameter);\n", 11978 format("void f() {\n" 11979 " function(\n" 11980 ">>>> text by the vcs\n" 11981 " parameter,\n" 11982 "==== text by the vcs\n" 11983 " parameter,\n" 11984 "==== text by the vcs\n" 11985 " parameter,\n" 11986 "<<<< text by the vcs\n" 11987 " parameter);\n")); 11988 11989 EXPECT_EQ("<<<<<<<\n" 11990 "|||||||\n" 11991 "=======\n" 11992 ">>>>>>>", 11993 format("<<<<<<<\n" 11994 "|||||||\n" 11995 "=======\n" 11996 ">>>>>>>")); 11997 11998 EXPECT_EQ("<<<<<<<\n" 11999 "|||||||\n" 12000 "int i;\n" 12001 "=======\n" 12002 ">>>>>>>", 12003 format("<<<<<<<\n" 12004 "|||||||\n" 12005 "int i;\n" 12006 "=======\n" 12007 ">>>>>>>")); 12008 12009 // FIXME: Handle parsing of macros around conflict markers correctly: 12010 EXPECT_EQ("#define Macro \\\n" 12011 "<<<<<<<\n" 12012 "Something \\\n" 12013 "|||||||\n" 12014 "Else \\\n" 12015 "=======\n" 12016 "Other \\\n" 12017 ">>>>>>>\n" 12018 " End int i;\n", 12019 format("#define Macro \\\n" 12020 "<<<<<<<\n" 12021 " Something \\\n" 12022 "|||||||\n" 12023 " Else \\\n" 12024 "=======\n" 12025 " Other \\\n" 12026 ">>>>>>>\n" 12027 " End\n" 12028 "int i;\n")); 12029 } 12030 12031 TEST_F(FormatTest, DisableRegions) { 12032 EXPECT_EQ("int i;\n" 12033 "// clang-format off\n" 12034 " int j;\n" 12035 "// clang-format on\n" 12036 "int k;", 12037 format(" int i;\n" 12038 " // clang-format off\n" 12039 " int j;\n" 12040 " // clang-format on\n" 12041 " int k;")); 12042 EXPECT_EQ("int i;\n" 12043 "/* clang-format off */\n" 12044 " int j;\n" 12045 "/* clang-format on */\n" 12046 "int k;", 12047 format(" int i;\n" 12048 " /* clang-format off */\n" 12049 " int j;\n" 12050 " /* clang-format on */\n" 12051 " int k;")); 12052 12053 // Don't reflow comments within disabled regions. 12054 EXPECT_EQ( 12055 "// clang-format off\n" 12056 "// long long long long long long line\n" 12057 "/* clang-format on */\n" 12058 "/* long long long\n" 12059 " * long long long\n" 12060 " * line */\n" 12061 "int i;\n" 12062 "/* clang-format off */\n" 12063 "/* long long long long long long line */\n", 12064 format("// clang-format off\n" 12065 "// long long long long long long line\n" 12066 "/* clang-format on */\n" 12067 "/* long long long long long long line */\n" 12068 "int i;\n" 12069 "/* clang-format off */\n" 12070 "/* long long long long long long line */\n", 12071 getLLVMStyleWithColumns(20))); 12072 } 12073 12074 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 12075 format("? ) ="); 12076 verifyNoCrash("#define a\\\n /**/}"); 12077 } 12078 12079 TEST_F(FormatTest, FormatsTableGenCode) { 12080 FormatStyle Style = getLLVMStyle(); 12081 Style.Language = FormatStyle::LK_TableGen; 12082 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 12083 } 12084 12085 TEST_F(FormatTest, ArrayOfTemplates) { 12086 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 12087 format("auto a = new unique_ptr<int > [ 10];")); 12088 12089 FormatStyle Spaces = getLLVMStyle(); 12090 Spaces.SpacesInSquareBrackets = true; 12091 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 12092 format("auto a = new unique_ptr<int > [10];", Spaces)); 12093 } 12094 12095 TEST_F(FormatTest, ArrayAsTemplateType) { 12096 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 12097 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 12098 12099 FormatStyle Spaces = getLLVMStyle(); 12100 Spaces.SpacesInSquareBrackets = true; 12101 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 12102 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 12103 } 12104 12105 TEST_F(FormatTest, NoSpaceAfterSuper) { 12106 verifyFormat("__super::FooBar();"); 12107 } 12108 12109 TEST(FormatStyle, GetStyleWithEmptyFileName) { 12110 vfs::InMemoryFileSystem FS; 12111 auto Style1 = getStyle("file", "", "Google", "", &FS); 12112 ASSERT_TRUE((bool)Style1); 12113 ASSERT_EQ(*Style1, getGoogleStyle()); 12114 } 12115 12116 TEST(FormatStyle, GetStyleOfFile) { 12117 vfs::InMemoryFileSystem FS; 12118 // Test 1: format file in the same directory. 12119 ASSERT_TRUE( 12120 FS.addFile("/a/.clang-format", 0, 12121 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 12122 ASSERT_TRUE( 12123 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 12124 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 12125 ASSERT_TRUE((bool)Style1); 12126 ASSERT_EQ(*Style1, getLLVMStyle()); 12127 12128 // Test 2.1: fallback to default. 12129 ASSERT_TRUE( 12130 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 12131 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 12132 ASSERT_TRUE((bool)Style2); 12133 ASSERT_EQ(*Style2, getMozillaStyle()); 12134 12135 // Test 2.2: no format on 'none' fallback style. 12136 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 12137 ASSERT_TRUE((bool)Style2); 12138 ASSERT_EQ(*Style2, getNoStyle()); 12139 12140 // Test 2.3: format if config is found with no based style while fallback is 12141 // 'none'. 12142 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 12143 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 12144 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 12145 ASSERT_TRUE((bool)Style2); 12146 ASSERT_EQ(*Style2, getLLVMStyle()); 12147 12148 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 12149 Style2 = getStyle("{}", "a.h", "none", "", &FS); 12150 ASSERT_TRUE((bool)Style2); 12151 ASSERT_EQ(*Style2, getLLVMStyle()); 12152 12153 // Test 3: format file in parent directory. 12154 ASSERT_TRUE( 12155 FS.addFile("/c/.clang-format", 0, 12156 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 12157 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 12158 llvm::MemoryBuffer::getMemBuffer("int i;"))); 12159 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 12160 ASSERT_TRUE((bool)Style3); 12161 ASSERT_EQ(*Style3, getGoogleStyle()); 12162 12163 // Test 4: error on invalid fallback style 12164 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 12165 ASSERT_FALSE((bool)Style4); 12166 llvm::consumeError(Style4.takeError()); 12167 12168 // Test 5: error on invalid yaml on command line 12169 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 12170 ASSERT_FALSE((bool)Style5); 12171 llvm::consumeError(Style5.takeError()); 12172 12173 // Test 6: error on invalid style 12174 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 12175 ASSERT_FALSE((bool)Style6); 12176 llvm::consumeError(Style6.takeError()); 12177 12178 // Test 7: found config file, error on parsing it 12179 ASSERT_TRUE( 12180 FS.addFile("/d/.clang-format", 0, 12181 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 12182 "InvalidKey: InvalidValue"))); 12183 ASSERT_TRUE( 12184 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 12185 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 12186 ASSERT_FALSE((bool)Style7); 12187 llvm::consumeError(Style7.takeError()); 12188 } 12189 12190 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 12191 // Column limit is 20. 12192 std::string Code = "Type *a =\n" 12193 " new Type();\n" 12194 "g(iiiii, 0, jjjjj,\n" 12195 " 0, kkkkk, 0, mm);\n" 12196 "int bad = format ;"; 12197 std::string Expected = "auto a = new Type();\n" 12198 "g(iiiii, nullptr,\n" 12199 " jjjjj, nullptr,\n" 12200 " kkkkk, nullptr,\n" 12201 " mm);\n" 12202 "int bad = format ;"; 12203 FileID ID = Context.createInMemoryFile("format.cpp", Code); 12204 tooling::Replacements Replaces = toReplacements( 12205 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 12206 "auto "), 12207 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 12208 "nullptr"), 12209 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 12210 "nullptr"), 12211 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 12212 "nullptr")}); 12213 12214 format::FormatStyle Style = format::getLLVMStyle(); 12215 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 12216 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 12217 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 12218 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 12219 auto Result = applyAllReplacements(Code, *FormattedReplaces); 12220 EXPECT_TRUE(static_cast<bool>(Result)); 12221 EXPECT_EQ(Expected, *Result); 12222 } 12223 12224 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 12225 std::string Code = "#include \"a.h\"\n" 12226 "#include \"c.h\"\n" 12227 "\n" 12228 "int main() {\n" 12229 " return 0;\n" 12230 "}"; 12231 std::string Expected = "#include \"a.h\"\n" 12232 "#include \"b.h\"\n" 12233 "#include \"c.h\"\n" 12234 "\n" 12235 "int main() {\n" 12236 " return 0;\n" 12237 "}"; 12238 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 12239 tooling::Replacements Replaces = toReplacements( 12240 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 12241 "#include \"b.h\"\n")}); 12242 12243 format::FormatStyle Style = format::getLLVMStyle(); 12244 Style.SortIncludes = true; 12245 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 12246 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 12247 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 12248 auto Result = applyAllReplacements(Code, *FormattedReplaces); 12249 EXPECT_TRUE(static_cast<bool>(Result)); 12250 EXPECT_EQ(Expected, *Result); 12251 } 12252 12253 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 12254 EXPECT_EQ("using std::cin;\n" 12255 "using std::cout;", 12256 format("using std::cout;\n" 12257 "using std::cin;", getGoogleStyle())); 12258 } 12259 12260 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 12261 format::FormatStyle Style = format::getLLVMStyle(); 12262 Style.Standard = FormatStyle::LS_Cpp03; 12263 // cpp03 recognize this string as identifier u8 and literal character 'a' 12264 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 12265 } 12266 12267 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 12268 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 12269 // all modes, including C++11, C++14 and C++17 12270 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 12271 } 12272 12273 TEST_F(FormatTest, DoNotFormatLikelyXml) { 12274 EXPECT_EQ("<!-- ;> -->", 12275 format("<!-- ;> -->", getGoogleStyle())); 12276 EXPECT_EQ(" <!-- >; -->", 12277 format(" <!-- >; -->", getGoogleStyle())); 12278 } 12279 12280 TEST_F(FormatTest, StructuredBindings) { 12281 // Structured bindings is a C++17 feature. 12282 // all modes, including C++11, C++14 and C++17 12283 verifyFormat("auto [a, b] = f();"); 12284 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 12285 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 12286 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 12287 EXPECT_EQ("auto const volatile [a, b] = f();", 12288 format("auto const volatile[a, b] = f();")); 12289 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 12290 EXPECT_EQ("auto &[a, b, c] = f();", 12291 format("auto &[ a , b,c ] = f();")); 12292 EXPECT_EQ("auto &&[a, b, c] = f();", 12293 format("auto &&[ a , b,c ] = f();")); 12294 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 12295 EXPECT_EQ("auto const volatile &&[a, b] = f();", 12296 format("auto const volatile &&[a, b] = f();")); 12297 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();")); 12298 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();")); 12299 EXPECT_EQ("const auto volatile &&[a, b] = f();", 12300 format("const auto volatile &&[a, b] = f();")); 12301 EXPECT_EQ("volatile const auto &&[a, b] = f();", 12302 format("volatile const auto &&[a, b] = f();")); 12303 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();")); 12304 12305 // Make sure we don't mistake structured bindings for lambdas. 12306 FormatStyle PointerMiddle = getLLVMStyle(); 12307 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 12308 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 12309 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 12310 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 12311 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 12312 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 12313 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 12314 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 12315 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 12316 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 12317 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 12318 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 12319 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 12320 12321 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 12322 format("for (const auto && [a, b] : some_range) {\n}")); 12323 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 12324 format("for (const auto & [a, b] : some_range) {\n}")); 12325 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 12326 format("for (const auto[a, b] : some_range) {\n}")); 12327 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 12328 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 12329 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 12330 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);")); 12331 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);")); 12332 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 12333 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};")); 12334 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};")); 12335 12336 format::FormatStyle Spaces = format::getLLVMStyle(); 12337 Spaces.SpacesInSquareBrackets = true; 12338 verifyFormat("auto [ a, b ] = f();", Spaces); 12339 verifyFormat("auto &&[ a, b ] = f();", Spaces); 12340 verifyFormat("auto &[ a, b ] = f();", Spaces); 12341 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 12342 verifyFormat("auto const &[ a, b ] = f();", Spaces); 12343 } 12344 12345 TEST_F(FormatTest, FileAndCode) { 12346 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 12347 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 12348 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 12349 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 12350 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n")); 12351 EXPECT_EQ( 12352 FormatStyle::LK_ObjC, 12353 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 12354 EXPECT_EQ(FormatStyle::LK_ObjC, 12355 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 12356 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 12357 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 12358 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n")); 12359 EXPECT_EQ(FormatStyle::LK_ObjC, 12360 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 12361 EXPECT_EQ( 12362 FormatStyle::LK_ObjC, 12363 guessLanguage("foo.h", 12364 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 12365 EXPECT_EQ( 12366 FormatStyle::LK_Cpp, 12367 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 12368 } 12369 12370 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 12371 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 12372 EXPECT_EQ(FormatStyle::LK_ObjC, 12373 guessLanguage("foo.h", "array[[calculator getIndex]];")); 12374 EXPECT_EQ(FormatStyle::LK_Cpp, 12375 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 12376 EXPECT_EQ( 12377 FormatStyle::LK_Cpp, 12378 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 12379 EXPECT_EQ(FormatStyle::LK_ObjC, 12380 guessLanguage("foo.h", "[[noreturn foo] bar];")); 12381 EXPECT_EQ(FormatStyle::LK_Cpp, 12382 guessLanguage("foo.h", "[[clang::fallthrough]];")); 12383 EXPECT_EQ(FormatStyle::LK_ObjC, 12384 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 12385 EXPECT_EQ(FormatStyle::LK_Cpp, 12386 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 12387 EXPECT_EQ(FormatStyle::LK_Cpp, 12388 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 12389 EXPECT_EQ(FormatStyle::LK_ObjC, 12390 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 12391 EXPECT_EQ(FormatStyle::LK_Cpp, 12392 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 12393 EXPECT_EQ( 12394 FormatStyle::LK_Cpp, 12395 guessLanguage("foo.h", 12396 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 12397 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 12398 } 12399 12400 TEST_F(FormatTest, GuessLanguageWithCaret) { 12401 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 12402 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 12403 EXPECT_EQ(FormatStyle::LK_ObjC, 12404 guessLanguage("foo.h", "int(^)(char, float);")); 12405 EXPECT_EQ(FormatStyle::LK_ObjC, 12406 guessLanguage("foo.h", "int(^foo)(char, float);")); 12407 EXPECT_EQ(FormatStyle::LK_ObjC, 12408 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 12409 EXPECT_EQ(FormatStyle::LK_ObjC, 12410 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 12411 EXPECT_EQ( 12412 FormatStyle::LK_ObjC, 12413 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 12414 } 12415 12416 TEST_F(FormatTest, GuessLanguageWithChildLines) { 12417 EXPECT_EQ(FormatStyle::LK_Cpp, 12418 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 12419 EXPECT_EQ(FormatStyle::LK_ObjC, 12420 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 12421 EXPECT_EQ( 12422 FormatStyle::LK_Cpp, 12423 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 12424 EXPECT_EQ( 12425 FormatStyle::LK_ObjC, 12426 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 12427 } 12428 12429 } // end namespace 12430 } // end namespace format 12431 } // end namespace clang 12432