1 //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "clang/Format/Format.h" 10 11 #include "../Tooling/ReplacementTest.h" 12 #include "FormatTestUtils.h" 13 14 #include "clang/Frontend/TextDiagnosticPrinter.h" 15 #include "llvm/Support/Debug.h" 16 #include "llvm/Support/MemoryBuffer.h" 17 #include "gtest/gtest.h" 18 19 #define DEBUG_TYPE "format-test" 20 21 using clang::tooling::ReplacementTest; 22 using clang::tooling::toReplacements; 23 24 namespace clang { 25 namespace format { 26 namespace { 27 28 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); } 29 30 class FormatTest : public ::testing::Test { 31 protected: 32 enum StatusCheck { 33 SC_ExpectComplete, 34 SC_ExpectIncomplete, 35 SC_DoNotCheck 36 }; 37 38 std::string format(llvm::StringRef Code, 39 const FormatStyle &Style = getLLVMStyle(), 40 StatusCheck CheckComplete = SC_ExpectComplete) { 41 LLVM_DEBUG(llvm::errs() << "---\n"); 42 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 43 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 44 FormattingAttemptStatus Status; 45 tooling::Replacements Replaces = 46 reformat(Style, Code, Ranges, "<stdin>", &Status); 47 if (CheckComplete != SC_DoNotCheck) { 48 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete; 49 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete) 50 << Code << "\n\n"; 51 } 52 ReplacementCount = Replaces.size(); 53 auto Result = applyAllReplacements(Code, Replaces); 54 EXPECT_TRUE(static_cast<bool>(Result)); 55 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 56 return *Result; 57 } 58 59 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) { 60 Style.ColumnLimit = ColumnLimit; 61 return Style; 62 } 63 64 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) { 65 return getStyleWithColumns(getLLVMStyle(), ColumnLimit); 66 } 67 68 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) { 69 return getStyleWithColumns(getGoogleStyle(), ColumnLimit); 70 } 71 72 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code, 73 const FormatStyle &Style = getLLVMStyle()) { 74 EXPECT_EQ(Expected.str(), format(Expected, Style)) 75 << "Expected code is not stable"; 76 EXPECT_EQ(Expected.str(), format(Code, Style)); 77 if (Style.Language == FormatStyle::LK_Cpp) { 78 // Objective-C++ is a superset of C++, so everything checked for C++ 79 // needs to be checked for Objective-C++ as well. 80 FormatStyle ObjCStyle = Style; 81 ObjCStyle.Language = FormatStyle::LK_ObjC; 82 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle)); 83 } 84 } 85 86 void verifyFormat(llvm::StringRef Code, 87 const FormatStyle &Style = getLLVMStyle()) { 88 verifyFormat(Code, test::messUp(Code), Style); 89 } 90 91 void verifyIncompleteFormat(llvm::StringRef Code, 92 const FormatStyle &Style = getLLVMStyle()) { 93 EXPECT_EQ(Code.str(), 94 format(test::messUp(Code), Style, SC_ExpectIncomplete)); 95 } 96 97 void verifyGoogleFormat(llvm::StringRef Code) { 98 verifyFormat(Code, getGoogleStyle()); 99 } 100 101 void verifyIndependentOfContext(llvm::StringRef text) { 102 verifyFormat(text); 103 verifyFormat(llvm::Twine("void f() { " + text + " }").str()); 104 } 105 106 /// \brief Verify that clang-format does not crash on the given input. 107 void verifyNoCrash(llvm::StringRef Code, 108 const FormatStyle &Style = getLLVMStyle()) { 109 format(Code, Style, SC_DoNotCheck); 110 } 111 112 int ReplacementCount; 113 }; 114 115 TEST_F(FormatTest, MessUp) { 116 EXPECT_EQ("1 2 3", test::messUp("1 2 3")); 117 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n")); 118 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc")); 119 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc")); 120 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne")); 121 } 122 123 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) { 124 EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language); 125 } 126 127 TEST_F(FormatTest, LLVMStyleOverride) { 128 EXPECT_EQ(FormatStyle::LK_Proto, 129 getLLVMStyle(FormatStyle::LK_Proto).Language); 130 } 131 132 //===----------------------------------------------------------------------===// 133 // Basic function tests. 134 //===----------------------------------------------------------------------===// 135 136 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) { 137 EXPECT_EQ(";", format(";")); 138 } 139 140 TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 141 EXPECT_EQ("int i;", format(" int i;")); 142 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;")); 143 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 144 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 145 } 146 147 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 148 EXPECT_EQ("int i;", format("int\ni;")); 149 } 150 151 TEST_F(FormatTest, FormatsNestedBlockStatements) { 152 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}")); 153 } 154 155 TEST_F(FormatTest, FormatsNestedCall) { 156 verifyFormat("Method(f1, f2(f3));"); 157 verifyFormat("Method(f1(f2, f3()));"); 158 verifyFormat("Method(f1(f2, (f3())));"); 159 } 160 161 TEST_F(FormatTest, NestedNameSpecifiers) { 162 verifyFormat("vector<::Type> v;"); 163 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); 164 verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); 165 verifyFormat("bool a = 2 < ::SomeFunction();"); 166 verifyFormat("ALWAYS_INLINE ::std::string getName();"); 167 verifyFormat("some::string getName();"); 168 } 169 170 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { 171 EXPECT_EQ("if (a) {\n" 172 " f();\n" 173 "}", 174 format("if(a){f();}")); 175 EXPECT_EQ(4, ReplacementCount); 176 EXPECT_EQ("if (a) {\n" 177 " f();\n" 178 "}", 179 format("if (a) {\n" 180 " f();\n" 181 "}")); 182 EXPECT_EQ(0, ReplacementCount); 183 EXPECT_EQ("/*\r\n" 184 "\r\n" 185 "*/\r\n", 186 format("/*\r\n" 187 "\r\n" 188 "*/\r\n")); 189 EXPECT_EQ(0, ReplacementCount); 190 } 191 192 TEST_F(FormatTest, RemovesEmptyLines) { 193 EXPECT_EQ("class C {\n" 194 " int i;\n" 195 "};", 196 format("class C {\n" 197 " int i;\n" 198 "\n" 199 "};")); 200 201 // Don't remove empty lines at the start of namespaces or extern "C" blocks. 202 EXPECT_EQ("namespace N {\n" 203 "\n" 204 "int i;\n" 205 "}", 206 format("namespace N {\n" 207 "\n" 208 "int i;\n" 209 "}", 210 getGoogleStyle())); 211 EXPECT_EQ("/* something */ namespace N {\n" 212 "\n" 213 "int i;\n" 214 "}", 215 format("/* something */ namespace N {\n" 216 "\n" 217 "int i;\n" 218 "}", 219 getGoogleStyle())); 220 EXPECT_EQ("inline namespace N {\n" 221 "\n" 222 "int i;\n" 223 "}", 224 format("inline namespace N {\n" 225 "\n" 226 "int i;\n" 227 "}", 228 getGoogleStyle())); 229 EXPECT_EQ("/* something */ inline namespace N {\n" 230 "\n" 231 "int i;\n" 232 "}", 233 format("/* something */ inline namespace N {\n" 234 "\n" 235 "int i;\n" 236 "}", 237 getGoogleStyle())); 238 EXPECT_EQ("export namespace N {\n" 239 "\n" 240 "int i;\n" 241 "}", 242 format("export namespace N {\n" 243 "\n" 244 "int i;\n" 245 "}", 246 getGoogleStyle())); 247 EXPECT_EQ("extern /**/ \"C\" /**/ {\n" 248 "\n" 249 "int i;\n" 250 "}", 251 format("extern /**/ \"C\" /**/ {\n" 252 "\n" 253 "int i;\n" 254 "}", 255 getGoogleStyle())); 256 257 // ...but do keep inlining and removing empty lines for non-block extern "C" 258 // functions. 259 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); 260 EXPECT_EQ("extern \"C\" int f() {\n" 261 " int i = 42;\n" 262 " return i;\n" 263 "}", 264 format("extern \"C\" int f() {\n" 265 "\n" 266 " int i = 42;\n" 267 " return i;\n" 268 "}", 269 getGoogleStyle())); 270 271 // Remove empty lines at the beginning and end of blocks. 272 EXPECT_EQ("void f() {\n" 273 "\n" 274 " if (a) {\n" 275 "\n" 276 " f();\n" 277 " }\n" 278 "}", 279 format("void f() {\n" 280 "\n" 281 " if (a) {\n" 282 "\n" 283 " f();\n" 284 "\n" 285 " }\n" 286 "\n" 287 "}", 288 getLLVMStyle())); 289 EXPECT_EQ("void f() {\n" 290 " if (a) {\n" 291 " f();\n" 292 " }\n" 293 "}", 294 format("void f() {\n" 295 "\n" 296 " if (a) {\n" 297 "\n" 298 " f();\n" 299 "\n" 300 " }\n" 301 "\n" 302 "}", 303 getGoogleStyle())); 304 305 // Don't remove empty lines in more complex control statements. 306 EXPECT_EQ("void f() {\n" 307 " if (a) {\n" 308 " f();\n" 309 "\n" 310 " } else if (b) {\n" 311 " f();\n" 312 " }\n" 313 "}", 314 format("void f() {\n" 315 " if (a) {\n" 316 " f();\n" 317 "\n" 318 " } else if (b) {\n" 319 " f();\n" 320 "\n" 321 " }\n" 322 "\n" 323 "}")); 324 325 // Don't remove empty lines before namespace endings. 326 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 327 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 328 EXPECT_EQ("namespace {\n" 329 "int i;\n" 330 "\n" 331 "}", 332 format("namespace {\n" 333 "int i;\n" 334 "\n" 335 "}", LLVMWithNoNamespaceFix)); 336 EXPECT_EQ("namespace {\n" 337 "int i;\n" 338 "}", 339 format("namespace {\n" 340 "int i;\n" 341 "}", LLVMWithNoNamespaceFix)); 342 EXPECT_EQ("namespace {\n" 343 "int i;\n" 344 "\n" 345 "};", 346 format("namespace {\n" 347 "int i;\n" 348 "\n" 349 "};", LLVMWithNoNamespaceFix)); 350 EXPECT_EQ("namespace {\n" 351 "int i;\n" 352 "};", 353 format("namespace {\n" 354 "int i;\n" 355 "};", LLVMWithNoNamespaceFix)); 356 EXPECT_EQ("namespace {\n" 357 "int i;\n" 358 "\n" 359 "}", 360 format("namespace {\n" 361 "int i;\n" 362 "\n" 363 "}")); 364 EXPECT_EQ("namespace {\n" 365 "int i;\n" 366 "\n" 367 "} // namespace", 368 format("namespace {\n" 369 "int i;\n" 370 "\n" 371 "} // namespace")); 372 373 FormatStyle Style = getLLVMStyle(); 374 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 375 Style.MaxEmptyLinesToKeep = 2; 376 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 377 Style.BraceWrapping.AfterClass = true; 378 Style.BraceWrapping.AfterFunction = true; 379 Style.KeepEmptyLinesAtTheStartOfBlocks = false; 380 381 EXPECT_EQ("class Foo\n" 382 "{\n" 383 " Foo() {}\n" 384 "\n" 385 " void funk() {}\n" 386 "};", 387 format("class Foo\n" 388 "{\n" 389 " Foo()\n" 390 " {\n" 391 " }\n" 392 "\n" 393 " void funk() {}\n" 394 "};", 395 Style)); 396 } 397 398 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) { 399 verifyFormat("x = (a) and (b);"); 400 verifyFormat("x = (a) or (b);"); 401 verifyFormat("x = (a) bitand (b);"); 402 verifyFormat("x = (a) bitor (b);"); 403 verifyFormat("x = (a) not_eq (b);"); 404 verifyFormat("x = (a) and_eq (b);"); 405 verifyFormat("x = (a) or_eq (b);"); 406 verifyFormat("x = (a) xor (b);"); 407 } 408 409 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) { 410 verifyFormat("x = compl(a);"); 411 verifyFormat("x = not(a);"); 412 verifyFormat("x = bitand(a);"); 413 // Unary operator must not be merged with the next identifier 414 verifyFormat("x = compl a;"); 415 verifyFormat("x = not a;"); 416 verifyFormat("x = bitand a;"); 417 } 418 419 //===----------------------------------------------------------------------===// 420 // Tests for control statements. 421 //===----------------------------------------------------------------------===// 422 423 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) { 424 verifyFormat("if (true)\n f();\ng();"); 425 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();"); 426 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();"); 427 verifyFormat("if constexpr (true)\n" 428 " f();\ng();"); 429 verifyFormat("if CONSTEXPR (true)\n" 430 " f();\ng();"); 431 verifyFormat("if constexpr (a)\n" 432 " if constexpr (b)\n" 433 " if constexpr (c)\n" 434 " g();\n" 435 "h();"); 436 verifyFormat("if CONSTEXPR (a)\n" 437 " if CONSTEXPR (b)\n" 438 " if CONSTEXPR (c)\n" 439 " g();\n" 440 "h();"); 441 verifyFormat("if constexpr (a)\n" 442 " if constexpr (b) {\n" 443 " f();\n" 444 " }\n" 445 "g();"); 446 verifyFormat("if CONSTEXPR (a)\n" 447 " if CONSTEXPR (b) {\n" 448 " f();\n" 449 " }\n" 450 "g();"); 451 452 FormatStyle AllowsMergedIf = getLLVMStyle(); 453 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 454 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 455 FormatStyle::SIS_WithoutElse; 456 verifyFormat("if (a)\n" 457 " // comment\n" 458 " f();", 459 AllowsMergedIf); 460 verifyFormat("{\n" 461 " if (a)\n" 462 " label:\n" 463 " f();\n" 464 "}", 465 AllowsMergedIf); 466 verifyFormat("#define A \\\n" 467 " if (a) \\\n" 468 " label: \\\n" 469 " f()", 470 AllowsMergedIf); 471 verifyFormat("if (a)\n" 472 " ;", 473 AllowsMergedIf); 474 verifyFormat("if (a)\n" 475 " if (b) return;", 476 AllowsMergedIf); 477 478 verifyFormat("if (a) // Can't merge this\n" 479 " f();\n", 480 AllowsMergedIf); 481 verifyFormat("if (a) /* still don't merge */\n" 482 " f();", 483 AllowsMergedIf); 484 verifyFormat("if (a) { // Never merge this\n" 485 " f();\n" 486 "}", 487 AllowsMergedIf); 488 verifyFormat("if (a) { /* Never merge this */\n" 489 " f();\n" 490 "}", 491 AllowsMergedIf); 492 493 AllowsMergedIf.ColumnLimit = 14; 494 verifyFormat("if (a) return;", AllowsMergedIf); 495 verifyFormat("if (aaaaaaaaa)\n" 496 " return;", 497 AllowsMergedIf); 498 499 AllowsMergedIf.ColumnLimit = 13; 500 verifyFormat("if (a)\n return;", AllowsMergedIf); 501 } 502 503 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) { 504 FormatStyle AllowsMergedIf = getLLVMStyle(); 505 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 506 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 507 FormatStyle::SIS_WithoutElse; 508 verifyFormat("if (a)\n" 509 " f();\n" 510 "else {\n" 511 " g();\n" 512 "}", 513 AllowsMergedIf); 514 verifyFormat("if (a)\n" 515 " f();\n" 516 "else\n" 517 " g();\n", 518 AllowsMergedIf); 519 520 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 521 522 verifyFormat("if (a) f();\n" 523 "else {\n" 524 " g();\n" 525 "}", 526 AllowsMergedIf); 527 verifyFormat("if (a) f();\n" 528 "else {\n" 529 " if (a) f();\n" 530 " else {\n" 531 " g();\n" 532 " }\n" 533 " g();\n" 534 "}", 535 AllowsMergedIf); 536 } 537 538 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) { 539 FormatStyle AllowsMergedLoops = getLLVMStyle(); 540 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true; 541 verifyFormat("while (true) continue;", AllowsMergedLoops); 542 verifyFormat("for (;;) continue;", AllowsMergedLoops); 543 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops); 544 verifyFormat("while (true)\n" 545 " ;", 546 AllowsMergedLoops); 547 verifyFormat("for (;;)\n" 548 " ;", 549 AllowsMergedLoops); 550 verifyFormat("for (;;)\n" 551 " for (;;) continue;", 552 AllowsMergedLoops); 553 verifyFormat("for (;;) // Can't merge this\n" 554 " continue;", 555 AllowsMergedLoops); 556 verifyFormat("for (;;) /* still don't merge */\n" 557 " continue;", 558 AllowsMergedLoops); 559 } 560 561 TEST_F(FormatTest, FormatShortBracedStatements) { 562 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 563 AllowSimpleBracedStatements.ColumnLimit = 40; 564 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = 565 FormatStyle::SBS_Always; 566 567 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 568 FormatStyle::SIS_WithoutElse; 569 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 570 571 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom; 572 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true; 573 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false; 574 575 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 576 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 577 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 578 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 579 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 580 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 581 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 582 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 583 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 584 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 585 verifyFormat("if (true) {\n" 586 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 587 "}", 588 AllowSimpleBracedStatements); 589 verifyFormat("if (true) { //\n" 590 " f();\n" 591 "}", 592 AllowSimpleBracedStatements); 593 verifyFormat("if (true) {\n" 594 " f();\n" 595 " f();\n" 596 "}", 597 AllowSimpleBracedStatements); 598 verifyFormat("if (true) {\n" 599 " f();\n" 600 "} else {\n" 601 " f();\n" 602 "}", 603 AllowSimpleBracedStatements); 604 605 verifyFormat("struct A2 {\n" 606 " int X;\n" 607 "};", 608 AllowSimpleBracedStatements); 609 verifyFormat("typedef struct A2 {\n" 610 " int X;\n" 611 "} A2_t;", 612 AllowSimpleBracedStatements); 613 verifyFormat("template <int> struct A2 {\n" 614 " struct B {};\n" 615 "};", 616 AllowSimpleBracedStatements); 617 618 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 619 FormatStyle::SIS_Never; 620 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 621 verifyFormat("if (true) {\n" 622 " f();\n" 623 "}", 624 AllowSimpleBracedStatements); 625 verifyFormat("if (true) {\n" 626 " f();\n" 627 "} else {\n" 628 " f();\n" 629 "}", 630 AllowSimpleBracedStatements); 631 632 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 633 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 634 verifyFormat("while (true) {\n" 635 " f();\n" 636 "}", 637 AllowSimpleBracedStatements); 638 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 639 verifyFormat("for (;;) {\n" 640 " f();\n" 641 "}", 642 AllowSimpleBracedStatements); 643 644 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 645 FormatStyle::SIS_WithoutElse; 646 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 647 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true; 648 649 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 650 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 651 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 652 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 653 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 654 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 655 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 656 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 657 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 658 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 659 verifyFormat("if (true)\n" 660 "{\n" 661 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 662 "}", 663 AllowSimpleBracedStatements); 664 verifyFormat("if (true)\n" 665 "{ //\n" 666 " f();\n" 667 "}", 668 AllowSimpleBracedStatements); 669 verifyFormat("if (true)\n" 670 "{\n" 671 " f();\n" 672 " f();\n" 673 "}", 674 AllowSimpleBracedStatements); 675 verifyFormat("if (true)\n" 676 "{\n" 677 " f();\n" 678 "} else\n" 679 "{\n" 680 " f();\n" 681 "}", 682 AllowSimpleBracedStatements); 683 684 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 685 FormatStyle::SIS_Never; 686 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 687 verifyFormat("if (true)\n" 688 "{\n" 689 " f();\n" 690 "}", 691 AllowSimpleBracedStatements); 692 verifyFormat("if (true)\n" 693 "{\n" 694 " f();\n" 695 "} else\n" 696 "{\n" 697 " f();\n" 698 "}", 699 AllowSimpleBracedStatements); 700 701 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 702 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 703 verifyFormat("while (true)\n" 704 "{\n" 705 " f();\n" 706 "}", 707 AllowSimpleBracedStatements); 708 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 709 verifyFormat("for (;;)\n" 710 "{\n" 711 " f();\n" 712 "}", 713 AllowSimpleBracedStatements); 714 } 715 716 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 717 FormatStyle Style = getLLVMStyleWithColumns(60); 718 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 719 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 720 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 721 EXPECT_EQ("#define A \\\n" 722 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 723 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 724 "X;", 725 format("#define A \\\n" 726 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 727 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 728 " }\n" 729 "X;", 730 Style)); 731 } 732 733 TEST_F(FormatTest, ParseIfElse) { 734 verifyFormat("if (true)\n" 735 " if (true)\n" 736 " if (true)\n" 737 " f();\n" 738 " else\n" 739 " g();\n" 740 " else\n" 741 " h();\n" 742 "else\n" 743 " i();"); 744 verifyFormat("if (true)\n" 745 " if (true)\n" 746 " if (true) {\n" 747 " if (true)\n" 748 " f();\n" 749 " } else {\n" 750 " g();\n" 751 " }\n" 752 " else\n" 753 " h();\n" 754 "else {\n" 755 " i();\n" 756 "}"); 757 verifyFormat("if (true)\n" 758 " if constexpr (true)\n" 759 " if (true) {\n" 760 " if constexpr (true)\n" 761 " f();\n" 762 " } else {\n" 763 " g();\n" 764 " }\n" 765 " else\n" 766 " h();\n" 767 "else {\n" 768 " i();\n" 769 "}"); 770 verifyFormat("if (true)\n" 771 " if CONSTEXPR (true)\n" 772 " if (true) {\n" 773 " if CONSTEXPR (true)\n" 774 " f();\n" 775 " } else {\n" 776 " g();\n" 777 " }\n" 778 " else\n" 779 " h();\n" 780 "else {\n" 781 " i();\n" 782 "}"); 783 verifyFormat("void f() {\n" 784 " if (a) {\n" 785 " } else {\n" 786 " }\n" 787 "}"); 788 } 789 790 TEST_F(FormatTest, ElseIf) { 791 verifyFormat("if (a) {\n} else if (b) {\n}"); 792 verifyFormat("if (a)\n" 793 " f();\n" 794 "else if (b)\n" 795 " g();\n" 796 "else\n" 797 " h();"); 798 verifyFormat("if constexpr (a)\n" 799 " f();\n" 800 "else if constexpr (b)\n" 801 " g();\n" 802 "else\n" 803 " h();"); 804 verifyFormat("if CONSTEXPR (a)\n" 805 " f();\n" 806 "else if CONSTEXPR (b)\n" 807 " g();\n" 808 "else\n" 809 " h();"); 810 verifyFormat("if (a) {\n" 811 " f();\n" 812 "}\n" 813 "// or else ..\n" 814 "else {\n" 815 " g()\n" 816 "}"); 817 818 verifyFormat("if (a) {\n" 819 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 821 "}"); 822 verifyFormat("if (a) {\n" 823 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 824 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 825 "}"); 826 verifyFormat("if (a) {\n" 827 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 829 "}"); 830 verifyFormat("if (a) {\n" 831 "} else if (\n" 832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 833 "}", 834 getLLVMStyleWithColumns(62)); 835 verifyFormat("if (a) {\n" 836 "} else if constexpr (\n" 837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 838 "}", 839 getLLVMStyleWithColumns(62)); 840 verifyFormat("if (a) {\n" 841 "} else if CONSTEXPR (\n" 842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 843 "}", 844 getLLVMStyleWithColumns(62)); 845 } 846 847 TEST_F(FormatTest, FormatsForLoop) { 848 verifyFormat( 849 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 850 " ++VeryVeryLongLoopVariable)\n" 851 " ;"); 852 verifyFormat("for (;;)\n" 853 " f();"); 854 verifyFormat("for (;;) {\n}"); 855 verifyFormat("for (;;) {\n" 856 " f();\n" 857 "}"); 858 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 859 860 verifyFormat( 861 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 862 " E = UnwrappedLines.end();\n" 863 " I != E; ++I) {\n}"); 864 865 verifyFormat( 866 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 867 " ++IIIII) {\n}"); 868 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 869 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 870 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 871 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 872 " I = FD->getDeclsInPrototypeScope().begin(),\n" 873 " E = FD->getDeclsInPrototypeScope().end();\n" 874 " I != E; ++I) {\n}"); 875 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 876 " I = Container.begin(),\n" 877 " E = Container.end();\n" 878 " I != E; ++I) {\n}", 879 getLLVMStyleWithColumns(76)); 880 881 verifyFormat( 882 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 883 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 886 " ++aaaaaaaaaaa) {\n}"); 887 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 888 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 889 " ++i) {\n}"); 890 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 891 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 892 "}"); 893 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 894 " aaaaaaaaaa);\n" 895 " iter; ++iter) {\n" 896 "}"); 897 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 899 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 900 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 901 902 // These should not be formatted as Objective-C for-in loops. 903 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 904 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 905 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 906 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 907 908 FormatStyle NoBinPacking = getLLVMStyle(); 909 NoBinPacking.BinPackParameters = false; 910 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 911 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 912 " aaaaaaaaaaaaaaaa,\n" 913 " aaaaaaaaaaaaaaaa,\n" 914 " aaaaaaaaaaaaaaaa);\n" 915 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 916 "}", 917 NoBinPacking); 918 verifyFormat( 919 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 920 " E = UnwrappedLines.end();\n" 921 " I != E;\n" 922 " ++I) {\n}", 923 NoBinPacking); 924 925 FormatStyle AlignLeft = getLLVMStyle(); 926 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 927 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 928 } 929 930 TEST_F(FormatTest, RangeBasedForLoops) { 931 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 933 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 934 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 935 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 936 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 937 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 938 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 939 } 940 941 TEST_F(FormatTest, ForEachLoops) { 942 verifyFormat("void f() {\n" 943 " foreach (Item *item, itemlist) {}\n" 944 " Q_FOREACH (Item *item, itemlist) {}\n" 945 " BOOST_FOREACH (Item *item, itemlist) {}\n" 946 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 947 "}"); 948 949 // As function-like macros. 950 verifyFormat("#define foreach(x, y)\n" 951 "#define Q_FOREACH(x, y)\n" 952 "#define BOOST_FOREACH(x, y)\n" 953 "#define UNKNOWN_FOREACH(x, y)\n"); 954 955 // Not as function-like macros. 956 verifyFormat("#define foreach (x, y)\n" 957 "#define Q_FOREACH (x, y)\n" 958 "#define BOOST_FOREACH (x, y)\n" 959 "#define UNKNOWN_FOREACH (x, y)\n"); 960 } 961 962 TEST_F(FormatTest, FormatsWhileLoop) { 963 verifyFormat("while (true) {\n}"); 964 verifyFormat("while (true)\n" 965 " f();"); 966 verifyFormat("while () {\n}"); 967 verifyFormat("while () {\n" 968 " f();\n" 969 "}"); 970 } 971 972 TEST_F(FormatTest, FormatsDoWhile) { 973 verifyFormat("do {\n" 974 " do_something();\n" 975 "} while (something());"); 976 verifyFormat("do\n" 977 " do_something();\n" 978 "while (something());"); 979 } 980 981 TEST_F(FormatTest, FormatsSwitchStatement) { 982 verifyFormat("switch (x) {\n" 983 "case 1:\n" 984 " f();\n" 985 " break;\n" 986 "case kFoo:\n" 987 "case ns::kBar:\n" 988 "case kBaz:\n" 989 " break;\n" 990 "default:\n" 991 " g();\n" 992 " break;\n" 993 "}"); 994 verifyFormat("switch (x) {\n" 995 "case 1: {\n" 996 " f();\n" 997 " break;\n" 998 "}\n" 999 "case 2: {\n" 1000 " break;\n" 1001 "}\n" 1002 "}"); 1003 verifyFormat("switch (x) {\n" 1004 "case 1: {\n" 1005 " f();\n" 1006 " {\n" 1007 " g();\n" 1008 " h();\n" 1009 " }\n" 1010 " break;\n" 1011 "}\n" 1012 "}"); 1013 verifyFormat("switch (x) {\n" 1014 "case 1: {\n" 1015 " f();\n" 1016 " if (foo) {\n" 1017 " g();\n" 1018 " h();\n" 1019 " }\n" 1020 " break;\n" 1021 "}\n" 1022 "}"); 1023 verifyFormat("switch (x) {\n" 1024 "case 1: {\n" 1025 " f();\n" 1026 " g();\n" 1027 "} break;\n" 1028 "}"); 1029 verifyFormat("switch (test)\n" 1030 " ;"); 1031 verifyFormat("switch (x) {\n" 1032 "default: {\n" 1033 " // Do nothing.\n" 1034 "}\n" 1035 "}"); 1036 verifyFormat("switch (x) {\n" 1037 "// comment\n" 1038 "// if 1, do f()\n" 1039 "case 1:\n" 1040 " f();\n" 1041 "}"); 1042 verifyFormat("switch (x) {\n" 1043 "case 1:\n" 1044 " // Do amazing stuff\n" 1045 " {\n" 1046 " f();\n" 1047 " g();\n" 1048 " }\n" 1049 " break;\n" 1050 "}"); 1051 verifyFormat("#define A \\\n" 1052 " switch (x) { \\\n" 1053 " case a: \\\n" 1054 " foo = b; \\\n" 1055 " }", 1056 getLLVMStyleWithColumns(20)); 1057 verifyFormat("#define OPERATION_CASE(name) \\\n" 1058 " case OP_name: \\\n" 1059 " return operations::Operation##name\n", 1060 getLLVMStyleWithColumns(40)); 1061 verifyFormat("switch (x) {\n" 1062 "case 1:;\n" 1063 "default:;\n" 1064 " int i;\n" 1065 "}"); 1066 1067 verifyGoogleFormat("switch (x) {\n" 1068 " case 1:\n" 1069 " f();\n" 1070 " break;\n" 1071 " case kFoo:\n" 1072 " case ns::kBar:\n" 1073 " case kBaz:\n" 1074 " break;\n" 1075 " default:\n" 1076 " g();\n" 1077 " break;\n" 1078 "}"); 1079 verifyGoogleFormat("switch (x) {\n" 1080 " case 1: {\n" 1081 " f();\n" 1082 " break;\n" 1083 " }\n" 1084 "}"); 1085 verifyGoogleFormat("switch (test)\n" 1086 " ;"); 1087 1088 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1089 " case OP_name: \\\n" 1090 " return operations::Operation##name\n"); 1091 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1092 " // Get the correction operation class.\n" 1093 " switch (OpCode) {\n" 1094 " CASE(Add);\n" 1095 " CASE(Subtract);\n" 1096 " default:\n" 1097 " return operations::Unknown;\n" 1098 " }\n" 1099 "#undef OPERATION_CASE\n" 1100 "}"); 1101 verifyFormat("DEBUG({\n" 1102 " switch (x) {\n" 1103 " case A:\n" 1104 " f();\n" 1105 " break;\n" 1106 " // fallthrough\n" 1107 " case B:\n" 1108 " g();\n" 1109 " break;\n" 1110 " }\n" 1111 "});"); 1112 EXPECT_EQ("DEBUG({\n" 1113 " switch (x) {\n" 1114 " case A:\n" 1115 " f();\n" 1116 " break;\n" 1117 " // On B:\n" 1118 " case B:\n" 1119 " g();\n" 1120 " break;\n" 1121 " }\n" 1122 "});", 1123 format("DEBUG({\n" 1124 " switch (x) {\n" 1125 " case A:\n" 1126 " f();\n" 1127 " break;\n" 1128 " // On B:\n" 1129 " case B:\n" 1130 " g();\n" 1131 " break;\n" 1132 " }\n" 1133 "});", 1134 getLLVMStyle())); 1135 EXPECT_EQ("switch (n) {\n" 1136 "case 0: {\n" 1137 " return false;\n" 1138 "}\n" 1139 "default: {\n" 1140 " return true;\n" 1141 "}\n" 1142 "}", 1143 format("switch (n)\n" 1144 "{\n" 1145 "case 0: {\n" 1146 " return false;\n" 1147 "}\n" 1148 "default: {\n" 1149 " return true;\n" 1150 "}\n" 1151 "}", 1152 getLLVMStyle())); 1153 verifyFormat("switch (a) {\n" 1154 "case (b):\n" 1155 " return;\n" 1156 "}"); 1157 1158 verifyFormat("switch (a) {\n" 1159 "case some_namespace::\n" 1160 " some_constant:\n" 1161 " return;\n" 1162 "}", 1163 getLLVMStyleWithColumns(34)); 1164 1165 FormatStyle Style = getLLVMStyle(); 1166 Style.IndentCaseLabels = true; 1167 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1168 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1169 Style.BraceWrapping.AfterCaseLabel = true; 1170 Style.BraceWrapping.AfterControlStatement = true; 1171 EXPECT_EQ("switch (n)\n" 1172 "{\n" 1173 " case 0:\n" 1174 " {\n" 1175 " return false;\n" 1176 " }\n" 1177 " default:\n" 1178 " {\n" 1179 " return true;\n" 1180 " }\n" 1181 "}", 1182 format("switch (n) {\n" 1183 " case 0: {\n" 1184 " return false;\n" 1185 " }\n" 1186 " default: {\n" 1187 " return true;\n" 1188 " }\n" 1189 "}", 1190 Style)); 1191 Style.BraceWrapping.AfterCaseLabel = false; 1192 EXPECT_EQ("switch (n)\n" 1193 "{\n" 1194 " case 0: {\n" 1195 " return false;\n" 1196 " }\n" 1197 " default: {\n" 1198 " return true;\n" 1199 " }\n" 1200 "}", 1201 format("switch (n) {\n" 1202 " case 0:\n" 1203 " {\n" 1204 " return false;\n" 1205 " }\n" 1206 " default:\n" 1207 " {\n" 1208 " return true;\n" 1209 " }\n" 1210 "}", 1211 Style)); 1212 } 1213 1214 TEST_F(FormatTest, CaseRanges) { 1215 verifyFormat("switch (x) {\n" 1216 "case 'A' ... 'Z':\n" 1217 "case 1 ... 5:\n" 1218 "case a ... b:\n" 1219 " break;\n" 1220 "}"); 1221 } 1222 1223 TEST_F(FormatTest, ShortCaseLabels) { 1224 FormatStyle Style = getLLVMStyle(); 1225 Style.AllowShortCaseLabelsOnASingleLine = true; 1226 verifyFormat("switch (a) {\n" 1227 "case 1: x = 1; break;\n" 1228 "case 2: return;\n" 1229 "case 3:\n" 1230 "case 4:\n" 1231 "case 5: return;\n" 1232 "case 6: // comment\n" 1233 " return;\n" 1234 "case 7:\n" 1235 " // comment\n" 1236 " return;\n" 1237 "case 8:\n" 1238 " x = 8; // comment\n" 1239 " break;\n" 1240 "default: y = 1; break;\n" 1241 "}", 1242 Style); 1243 verifyFormat("switch (a) {\n" 1244 "case 0: return; // comment\n" 1245 "case 1: break; // comment\n" 1246 "case 2: return;\n" 1247 "// comment\n" 1248 "case 3: return;\n" 1249 "// comment 1\n" 1250 "// comment 2\n" 1251 "// comment 3\n" 1252 "case 4: break; /* comment */\n" 1253 "case 5:\n" 1254 " // comment\n" 1255 " break;\n" 1256 "case 6: /* comment */ x = 1; break;\n" 1257 "case 7: x = /* comment */ 1; break;\n" 1258 "case 8:\n" 1259 " x = 1; /* comment */\n" 1260 " break;\n" 1261 "case 9:\n" 1262 " break; // comment line 1\n" 1263 " // comment line 2\n" 1264 "}", 1265 Style); 1266 EXPECT_EQ("switch (a) {\n" 1267 "case 1:\n" 1268 " x = 8;\n" 1269 " // fall through\n" 1270 "case 2: x = 8;\n" 1271 "// comment\n" 1272 "case 3:\n" 1273 " return; /* comment line 1\n" 1274 " * comment line 2 */\n" 1275 "case 4: i = 8;\n" 1276 "// something else\n" 1277 "#if FOO\n" 1278 "case 5: break;\n" 1279 "#endif\n" 1280 "}", 1281 format("switch (a) {\n" 1282 "case 1: x = 8;\n" 1283 " // fall through\n" 1284 "case 2:\n" 1285 " x = 8;\n" 1286 "// comment\n" 1287 "case 3:\n" 1288 " return; /* comment line 1\n" 1289 " * comment line 2 */\n" 1290 "case 4:\n" 1291 " i = 8;\n" 1292 "// something else\n" 1293 "#if FOO\n" 1294 "case 5: break;\n" 1295 "#endif\n" 1296 "}", 1297 Style)); 1298 EXPECT_EQ("switch (a) {\n" "case 0:\n" 1299 " return; // long long long long long long long long long long long long comment\n" 1300 " // line\n" "}", 1301 format("switch (a) {\n" 1302 "case 0: return; // long long long long long long long long long long long long comment line\n" 1303 "}", 1304 Style)); 1305 EXPECT_EQ("switch (a) {\n" 1306 "case 0:\n" 1307 " return; /* long long long long long long long long long long long long comment\n" 1308 " line */\n" 1309 "}", 1310 format("switch (a) {\n" 1311 "case 0: return; /* long long long long long long long long long long long long comment line */\n" 1312 "}", 1313 Style)); 1314 verifyFormat("switch (a) {\n" 1315 "#if FOO\n" 1316 "case 0: return 0;\n" 1317 "#endif\n" 1318 "}", 1319 Style); 1320 verifyFormat("switch (a) {\n" 1321 "case 1: {\n" 1322 "}\n" 1323 "case 2: {\n" 1324 " return;\n" 1325 "}\n" 1326 "case 3: {\n" 1327 " x = 1;\n" 1328 " return;\n" 1329 "}\n" 1330 "case 4:\n" 1331 " if (x)\n" 1332 " return;\n" 1333 "}", 1334 Style); 1335 Style.ColumnLimit = 21; 1336 verifyFormat("switch (a) {\n" 1337 "case 1: x = 1; break;\n" 1338 "case 2: return;\n" 1339 "case 3:\n" 1340 "case 4:\n" 1341 "case 5: return;\n" 1342 "default:\n" 1343 " y = 1;\n" 1344 " break;\n" 1345 "}", 1346 Style); 1347 Style.ColumnLimit = 80; 1348 Style.AllowShortCaseLabelsOnASingleLine = false; 1349 Style.IndentCaseLabels = true; 1350 EXPECT_EQ("switch (n) {\n" 1351 " default /*comments*/:\n" 1352 " return true;\n" 1353 " case 0:\n" 1354 " return false;\n" 1355 "}", 1356 format("switch (n) {\n" 1357 "default/*comments*/:\n" 1358 " return true;\n" 1359 "case 0:\n" 1360 " return false;\n" 1361 "}", 1362 Style)); 1363 Style.AllowShortCaseLabelsOnASingleLine = true; 1364 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1365 Style.BraceWrapping.AfterCaseLabel = true; 1366 Style.BraceWrapping.AfterControlStatement = true; 1367 EXPECT_EQ("switch (n)\n" 1368 "{\n" 1369 " case 0:\n" 1370 " {\n" 1371 " return false;\n" 1372 " }\n" 1373 " default:\n" 1374 " {\n" 1375 " return true;\n" 1376 " }\n" 1377 "}", 1378 format("switch (n) {\n" 1379 " case 0: {\n" 1380 " return false;\n" 1381 " }\n" 1382 " default:\n" 1383 " {\n" 1384 " return true;\n" 1385 " }\n" 1386 "}", 1387 Style)); 1388 } 1389 1390 TEST_F(FormatTest, FormatsLabels) { 1391 verifyFormat("void f() {\n" 1392 " some_code();\n" 1393 "test_label:\n" 1394 " some_other_code();\n" 1395 " {\n" 1396 " some_more_code();\n" 1397 " another_label:\n" 1398 " some_more_code();\n" 1399 " }\n" 1400 "}"); 1401 verifyFormat("{\n" 1402 " some_code();\n" 1403 "test_label:\n" 1404 " some_other_code();\n" 1405 "}"); 1406 verifyFormat("{\n" 1407 " some_code();\n" 1408 "test_label:;\n" 1409 " int i = 0;\n" 1410 "}"); 1411 FormatStyle Style = getLLVMStyle(); 1412 Style.IndentGotoLabels = false; 1413 verifyFormat("void f() {\n" 1414 " some_code();\n" 1415 "test_label:\n" 1416 " some_other_code();\n" 1417 " {\n" 1418 " some_more_code();\n" 1419 "another_label:\n" 1420 " some_more_code();\n" 1421 " }\n" 1422 "}", 1423 Style); 1424 verifyFormat("{\n" 1425 " some_code();\n" 1426 "test_label:\n" 1427 " some_other_code();\n" 1428 "}", 1429 Style); 1430 verifyFormat("{\n" 1431 " some_code();\n" 1432 "test_label:;\n" 1433 " int i = 0;\n" 1434 "}"); 1435 } 1436 1437 //===----------------------------------------------------------------------===// 1438 // Tests for classes, namespaces, etc. 1439 //===----------------------------------------------------------------------===// 1440 1441 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1442 verifyFormat("class A {};"); 1443 } 1444 1445 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1446 verifyFormat("class A {\n" 1447 "public:\n" 1448 "public: // comment\n" 1449 "protected:\n" 1450 "private:\n" 1451 " void f() {}\n" 1452 "};"); 1453 verifyFormat("export class A {\n" 1454 "public:\n" 1455 "public: // comment\n" 1456 "protected:\n" 1457 "private:\n" 1458 " void f() {}\n" 1459 "};"); 1460 verifyGoogleFormat("class A {\n" 1461 " public:\n" 1462 " protected:\n" 1463 " private:\n" 1464 " void f() {}\n" 1465 "};"); 1466 verifyGoogleFormat("export class A {\n" 1467 " public:\n" 1468 " protected:\n" 1469 " private:\n" 1470 " void f() {}\n" 1471 "};"); 1472 verifyFormat("class A {\n" 1473 "public slots:\n" 1474 " void f1() {}\n" 1475 "public Q_SLOTS:\n" 1476 " void f2() {}\n" 1477 "protected slots:\n" 1478 " void f3() {}\n" 1479 "protected Q_SLOTS:\n" 1480 " void f4() {}\n" 1481 "private slots:\n" 1482 " void f5() {}\n" 1483 "private Q_SLOTS:\n" 1484 " void f6() {}\n" 1485 "signals:\n" 1486 " void g1();\n" 1487 "Q_SIGNALS:\n" 1488 " void g2();\n" 1489 "};"); 1490 1491 // Don't interpret 'signals' the wrong way. 1492 verifyFormat("signals.set();"); 1493 verifyFormat("for (Signals signals : f()) {\n}"); 1494 verifyFormat("{\n" 1495 " signals.set(); // This needs indentation.\n" 1496 "}"); 1497 verifyFormat("void f() {\n" 1498 "label:\n" 1499 " signals.baz();\n" 1500 "}"); 1501 } 1502 1503 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1504 EXPECT_EQ("class A {\n" 1505 "public:\n" 1506 " void f();\n" 1507 "\n" 1508 "private:\n" 1509 " void g() {}\n" 1510 " // test\n" 1511 "protected:\n" 1512 " int h;\n" 1513 "};", 1514 format("class A {\n" 1515 "public:\n" 1516 "void f();\n" 1517 "private:\n" 1518 "void g() {}\n" 1519 "// test\n" 1520 "protected:\n" 1521 "int h;\n" 1522 "};")); 1523 EXPECT_EQ("class A {\n" 1524 "protected:\n" 1525 "public:\n" 1526 " void f();\n" 1527 "};", 1528 format("class A {\n" 1529 "protected:\n" 1530 "\n" 1531 "public:\n" 1532 "\n" 1533 " void f();\n" 1534 "};")); 1535 1536 // Even ensure proper spacing inside macros. 1537 EXPECT_EQ("#define B \\\n" 1538 " class A { \\\n" 1539 " protected: \\\n" 1540 " public: \\\n" 1541 " void f(); \\\n" 1542 " };", 1543 format("#define B \\\n" 1544 " class A { \\\n" 1545 " protected: \\\n" 1546 " \\\n" 1547 " public: \\\n" 1548 " \\\n" 1549 " void f(); \\\n" 1550 " };", 1551 getGoogleStyle())); 1552 // But don't remove empty lines after macros ending in access specifiers. 1553 EXPECT_EQ("#define A private:\n" 1554 "\n" 1555 "int i;", 1556 format("#define A private:\n" 1557 "\n" 1558 "int i;")); 1559 } 1560 1561 TEST_F(FormatTest, FormatsClasses) { 1562 verifyFormat("class A : public B {};"); 1563 verifyFormat("class A : public ::B {};"); 1564 1565 verifyFormat( 1566 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1567 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1568 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1569 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1570 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1571 verifyFormat( 1572 "class A : public B, public C, public D, public E, public F {};"); 1573 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1574 " public C,\n" 1575 " public D,\n" 1576 " public E,\n" 1577 " public F,\n" 1578 " public G {};"); 1579 1580 verifyFormat("class\n" 1581 " ReallyReallyLongClassName {\n" 1582 " int i;\n" 1583 "};", 1584 getLLVMStyleWithColumns(32)); 1585 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1586 " aaaaaaaaaaaaaaaa> {};"); 1587 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1588 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1589 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1590 verifyFormat("template <class R, class C>\n" 1591 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1592 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1593 verifyFormat("class ::A::B {};"); 1594 } 1595 1596 TEST_F(FormatTest, BreakInheritanceStyle) { 1597 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1598 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1599 FormatStyle::BILS_BeforeComma; 1600 verifyFormat("class MyClass : public X {};", 1601 StyleWithInheritanceBreakBeforeComma); 1602 verifyFormat("class MyClass\n" 1603 " : public X\n" 1604 " , public Y {};", 1605 StyleWithInheritanceBreakBeforeComma); 1606 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1607 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1608 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1609 StyleWithInheritanceBreakBeforeComma); 1610 verifyFormat("struct aaaaaaaaaaaaa\n" 1611 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1612 " aaaaaaaaaaaaaaaa> {};", 1613 StyleWithInheritanceBreakBeforeComma); 1614 1615 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1616 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1617 FormatStyle::BILS_AfterColon; 1618 verifyFormat("class MyClass : public X {};", 1619 StyleWithInheritanceBreakAfterColon); 1620 verifyFormat("class MyClass : public X, public Y {};", 1621 StyleWithInheritanceBreakAfterColon); 1622 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1623 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1624 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1625 StyleWithInheritanceBreakAfterColon); 1626 verifyFormat("struct aaaaaaaaaaaaa :\n" 1627 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1628 " aaaaaaaaaaaaaaaa> {};", 1629 StyleWithInheritanceBreakAfterColon); 1630 } 1631 1632 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1633 verifyFormat("class A {\n} a, b;"); 1634 verifyFormat("struct A {\n} a, b;"); 1635 verifyFormat("union A {\n} a;"); 1636 } 1637 1638 TEST_F(FormatTest, FormatsEnum) { 1639 verifyFormat("enum {\n" 1640 " Zero,\n" 1641 " One = 1,\n" 1642 " Two = One + 1,\n" 1643 " Three = (One + Two),\n" 1644 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1645 " Five = (One, Two, Three, Four, 5)\n" 1646 "};"); 1647 verifyGoogleFormat("enum {\n" 1648 " Zero,\n" 1649 " One = 1,\n" 1650 " Two = One + 1,\n" 1651 " Three = (One + Two),\n" 1652 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1653 " Five = (One, Two, Three, Four, 5)\n" 1654 "};"); 1655 verifyFormat("enum Enum {};"); 1656 verifyFormat("enum {};"); 1657 verifyFormat("enum X E {} d;"); 1658 verifyFormat("enum __attribute__((...)) E {} d;"); 1659 verifyFormat("enum __declspec__((...)) E {} d;"); 1660 verifyFormat("enum {\n" 1661 " Bar = Foo<int, int>::value\n" 1662 "};", 1663 getLLVMStyleWithColumns(30)); 1664 1665 verifyFormat("enum ShortEnum { A, B, C };"); 1666 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1667 1668 EXPECT_EQ("enum KeepEmptyLines {\n" 1669 " ONE,\n" 1670 "\n" 1671 " TWO,\n" 1672 "\n" 1673 " THREE\n" 1674 "}", 1675 format("enum KeepEmptyLines {\n" 1676 " ONE,\n" 1677 "\n" 1678 " TWO,\n" 1679 "\n" 1680 "\n" 1681 " THREE\n" 1682 "}")); 1683 verifyFormat("enum E { // comment\n" 1684 " ONE,\n" 1685 " TWO\n" 1686 "};\n" 1687 "int i;"); 1688 // Not enums. 1689 verifyFormat("enum X f() {\n" 1690 " a();\n" 1691 " return 42;\n" 1692 "}"); 1693 verifyFormat("enum X Type::f() {\n" 1694 " a();\n" 1695 " return 42;\n" 1696 "}"); 1697 verifyFormat("enum ::X f() {\n" 1698 " a();\n" 1699 " return 42;\n" 1700 "}"); 1701 verifyFormat("enum ns::X f() {\n" 1702 " a();\n" 1703 " return 42;\n" 1704 "}"); 1705 } 1706 1707 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1708 verifyFormat("enum Type {\n" 1709 " One = 0; // These semicolons should be commas.\n" 1710 " Two = 1;\n" 1711 "};"); 1712 verifyFormat("namespace n {\n" 1713 "enum Type {\n" 1714 " One,\n" 1715 " Two, // missing };\n" 1716 " int i;\n" 1717 "}\n" 1718 "void g() {}"); 1719 } 1720 1721 TEST_F(FormatTest, FormatsEnumStruct) { 1722 verifyFormat("enum struct {\n" 1723 " Zero,\n" 1724 " One = 1,\n" 1725 " Two = One + 1,\n" 1726 " Three = (One + Two),\n" 1727 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1728 " Five = (One, Two, Three, Four, 5)\n" 1729 "};"); 1730 verifyFormat("enum struct Enum {};"); 1731 verifyFormat("enum struct {};"); 1732 verifyFormat("enum struct X E {} d;"); 1733 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1734 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1735 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1736 } 1737 1738 TEST_F(FormatTest, FormatsEnumClass) { 1739 verifyFormat("enum class {\n" 1740 " Zero,\n" 1741 " One = 1,\n" 1742 " Two = One + 1,\n" 1743 " Three = (One + Two),\n" 1744 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1745 " Five = (One, Two, Three, Four, 5)\n" 1746 "};"); 1747 verifyFormat("enum class Enum {};"); 1748 verifyFormat("enum class {};"); 1749 verifyFormat("enum class X E {} d;"); 1750 verifyFormat("enum class __attribute__((...)) E {} d;"); 1751 verifyFormat("enum class __declspec__((...)) E {} d;"); 1752 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1753 } 1754 1755 TEST_F(FormatTest, FormatsEnumTypes) { 1756 verifyFormat("enum X : int {\n" 1757 " A, // Force multiple lines.\n" 1758 " B\n" 1759 "};"); 1760 verifyFormat("enum X : int { A, B };"); 1761 verifyFormat("enum X : std::uint32_t { A, B };"); 1762 } 1763 1764 TEST_F(FormatTest, FormatsTypedefEnum) { 1765 FormatStyle Style = getLLVMStyle(); 1766 Style.ColumnLimit = 40; 1767 verifyFormat("typedef enum {} EmptyEnum;"); 1768 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1769 verifyFormat("typedef enum {\n" 1770 " ZERO = 0,\n" 1771 " ONE = 1,\n" 1772 " TWO = 2,\n" 1773 " THREE = 3\n" 1774 "} LongEnum;", 1775 Style); 1776 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1777 Style.BraceWrapping.AfterEnum = true; 1778 verifyFormat("typedef enum {} EmptyEnum;"); 1779 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1780 verifyFormat("typedef enum\n" 1781 "{\n" 1782 " ZERO = 0,\n" 1783 " ONE = 1,\n" 1784 " TWO = 2,\n" 1785 " THREE = 3\n" 1786 "} LongEnum;", 1787 Style); 1788 } 1789 1790 TEST_F(FormatTest, FormatsNSEnums) { 1791 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1792 verifyGoogleFormat( 1793 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1794 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 1795 " // Information about someDecentlyLongValue.\n" 1796 " someDecentlyLongValue,\n" 1797 " // Information about anotherDecentlyLongValue.\n" 1798 " anotherDecentlyLongValue,\n" 1799 " // Information about aThirdDecentlyLongValue.\n" 1800 " aThirdDecentlyLongValue\n" 1801 "};"); 1802 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 1803 " // Information about someDecentlyLongValue.\n" 1804 " someDecentlyLongValue,\n" 1805 " // Information about anotherDecentlyLongValue.\n" 1806 " anotherDecentlyLongValue,\n" 1807 " // Information about aThirdDecentlyLongValue.\n" 1808 " aThirdDecentlyLongValue\n" 1809 "};"); 1810 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 1811 " a = 1,\n" 1812 " b = 2,\n" 1813 " c = 3,\n" 1814 "};"); 1815 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 1816 " a = 1,\n" 1817 " b = 2,\n" 1818 " c = 3,\n" 1819 "};"); 1820 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 1821 " a = 1,\n" 1822 " b = 2,\n" 1823 " c = 3,\n" 1824 "};"); 1825 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 1826 " a = 1,\n" 1827 " b = 2,\n" 1828 " c = 3,\n" 1829 "};"); 1830 } 1831 1832 TEST_F(FormatTest, FormatsBitfields) { 1833 verifyFormat("struct Bitfields {\n" 1834 " unsigned sClass : 8;\n" 1835 " unsigned ValueKind : 2;\n" 1836 "};"); 1837 verifyFormat("struct A {\n" 1838 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 1839 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 1840 "};"); 1841 verifyFormat("struct MyStruct {\n" 1842 " uchar data;\n" 1843 " uchar : 8;\n" 1844 " uchar : 8;\n" 1845 " uchar other;\n" 1846 "};"); 1847 } 1848 1849 TEST_F(FormatTest, FormatsNamespaces) { 1850 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 1851 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 1852 1853 verifyFormat("namespace some_namespace {\n" 1854 "class A {};\n" 1855 "void f() { f(); }\n" 1856 "}", 1857 LLVMWithNoNamespaceFix); 1858 verifyFormat("namespace N::inline D {\n" 1859 "class A {};\n" 1860 "void f() { f(); }\n" 1861 "}", 1862 LLVMWithNoNamespaceFix); 1863 verifyFormat("namespace N::inline D::E {\n" 1864 "class A {};\n" 1865 "void f() { f(); }\n" 1866 "}", 1867 LLVMWithNoNamespaceFix); 1868 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 1869 "class A {};\n" 1870 "void f() { f(); }\n" 1871 "}", 1872 LLVMWithNoNamespaceFix); 1873 verifyFormat("/* something */ namespace some_namespace {\n" 1874 "class A {};\n" 1875 "void f() { f(); }\n" 1876 "}", 1877 LLVMWithNoNamespaceFix); 1878 verifyFormat("namespace {\n" 1879 "class A {};\n" 1880 "void f() { f(); }\n" 1881 "}", 1882 LLVMWithNoNamespaceFix); 1883 verifyFormat("/* something */ namespace {\n" 1884 "class A {};\n" 1885 "void f() { f(); }\n" 1886 "}", 1887 LLVMWithNoNamespaceFix); 1888 verifyFormat("inline namespace X {\n" 1889 "class A {};\n" 1890 "void f() { f(); }\n" 1891 "}", 1892 LLVMWithNoNamespaceFix); 1893 verifyFormat("/* something */ inline namespace X {\n" 1894 "class A {};\n" 1895 "void f() { f(); }\n" 1896 "}", 1897 LLVMWithNoNamespaceFix); 1898 verifyFormat("export namespace X {\n" 1899 "class A {};\n" 1900 "void f() { f(); }\n" 1901 "}", 1902 LLVMWithNoNamespaceFix); 1903 verifyFormat("using namespace some_namespace;\n" 1904 "class A {};\n" 1905 "void f() { f(); }", 1906 LLVMWithNoNamespaceFix); 1907 1908 // This code is more common than we thought; if we 1909 // layout this correctly the semicolon will go into 1910 // its own line, which is undesirable. 1911 verifyFormat("namespace {};", 1912 LLVMWithNoNamespaceFix); 1913 verifyFormat("namespace {\n" 1914 "class A {};\n" 1915 "};", 1916 LLVMWithNoNamespaceFix); 1917 1918 verifyFormat("namespace {\n" 1919 "int SomeVariable = 0; // comment\n" 1920 "} // namespace", 1921 LLVMWithNoNamespaceFix); 1922 EXPECT_EQ("#ifndef HEADER_GUARD\n" 1923 "#define HEADER_GUARD\n" 1924 "namespace my_namespace {\n" 1925 "int i;\n" 1926 "} // my_namespace\n" 1927 "#endif // HEADER_GUARD", 1928 format("#ifndef HEADER_GUARD\n" 1929 " #define HEADER_GUARD\n" 1930 " namespace my_namespace {\n" 1931 "int i;\n" 1932 "} // my_namespace\n" 1933 "#endif // HEADER_GUARD", 1934 LLVMWithNoNamespaceFix)); 1935 1936 EXPECT_EQ("namespace A::B {\n" 1937 "class C {};\n" 1938 "}", 1939 format("namespace A::B {\n" 1940 "class C {};\n" 1941 "}", 1942 LLVMWithNoNamespaceFix)); 1943 1944 FormatStyle Style = getLLVMStyle(); 1945 Style.NamespaceIndentation = FormatStyle::NI_All; 1946 EXPECT_EQ("namespace out {\n" 1947 " int i;\n" 1948 " namespace in {\n" 1949 " int i;\n" 1950 " } // namespace in\n" 1951 "} // namespace out", 1952 format("namespace out {\n" 1953 "int i;\n" 1954 "namespace in {\n" 1955 "int i;\n" 1956 "} // namespace in\n" 1957 "} // namespace out", 1958 Style)); 1959 1960 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1961 EXPECT_EQ("namespace out {\n" 1962 "int i;\n" 1963 "namespace in {\n" 1964 " int i;\n" 1965 "} // namespace in\n" 1966 "} // namespace out", 1967 format("namespace out {\n" 1968 "int i;\n" 1969 "namespace in {\n" 1970 "int i;\n" 1971 "} // namespace in\n" 1972 "} // namespace out", 1973 Style)); 1974 } 1975 1976 TEST_F(FormatTest, NamespaceMacros) { 1977 FormatStyle Style = getLLVMStyle(); 1978 Style.NamespaceMacros.push_back("TESTSUITE"); 1979 1980 verifyFormat("TESTSUITE(A) {\n" 1981 "int foo();\n" 1982 "} // TESTSUITE(A)", 1983 Style); 1984 1985 verifyFormat("TESTSUITE(A, B) {\n" 1986 "int foo();\n" 1987 "} // TESTSUITE(A)", 1988 Style); 1989 1990 // Properly indent according to NamespaceIndentation style 1991 Style.NamespaceIndentation = FormatStyle::NI_All; 1992 verifyFormat("TESTSUITE(A) {\n" 1993 " int foo();\n" 1994 "} // TESTSUITE(A)", 1995 Style); 1996 verifyFormat("TESTSUITE(A) {\n" 1997 " namespace B {\n" 1998 " int foo();\n" 1999 " } // namespace B\n" 2000 "} // TESTSUITE(A)", 2001 Style); 2002 verifyFormat("namespace A {\n" 2003 " TESTSUITE(B) {\n" 2004 " int foo();\n" 2005 " } // TESTSUITE(B)\n" 2006 "} // namespace A", 2007 Style); 2008 2009 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2010 verifyFormat("TESTSUITE(A) {\n" 2011 "TESTSUITE(B) {\n" 2012 " int foo();\n" 2013 "} // TESTSUITE(B)\n" 2014 "} // TESTSUITE(A)", 2015 Style); 2016 verifyFormat("TESTSUITE(A) {\n" 2017 "namespace B {\n" 2018 " int foo();\n" 2019 "} // namespace B\n" 2020 "} // TESTSUITE(A)", 2021 Style); 2022 verifyFormat("namespace A {\n" 2023 "TESTSUITE(B) {\n" 2024 " int foo();\n" 2025 "} // TESTSUITE(B)\n" 2026 "} // namespace A", 2027 Style); 2028 2029 // Properly merge namespace-macros blocks in CompactNamespaces mode 2030 Style.NamespaceIndentation = FormatStyle::NI_None; 2031 Style.CompactNamespaces = true; 2032 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2033 "}} // TESTSUITE(A::B)", 2034 Style); 2035 2036 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2037 "}} // TESTSUITE(out::in)", 2038 format("TESTSUITE(out) {\n" 2039 "TESTSUITE(in) {\n" 2040 "} // TESTSUITE(in)\n" 2041 "} // TESTSUITE(out)", 2042 Style)); 2043 2044 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2045 "}} // TESTSUITE(out::in)", 2046 format("TESTSUITE(out) {\n" 2047 "TESTSUITE(in) {\n" 2048 "} // TESTSUITE(in)\n" 2049 "} // TESTSUITE(out)", 2050 Style)); 2051 2052 // Do not merge different namespaces/macros 2053 EXPECT_EQ("namespace out {\n" 2054 "TESTSUITE(in) {\n" 2055 "} // TESTSUITE(in)\n" 2056 "} // namespace out", 2057 format("namespace out {\n" 2058 "TESTSUITE(in) {\n" 2059 "} // TESTSUITE(in)\n" 2060 "} // namespace out", 2061 Style)); 2062 EXPECT_EQ("TESTSUITE(out) {\n" 2063 "namespace in {\n" 2064 "} // namespace in\n" 2065 "} // TESTSUITE(out)", 2066 format("TESTSUITE(out) {\n" 2067 "namespace in {\n" 2068 "} // namespace in\n" 2069 "} // TESTSUITE(out)", 2070 Style)); 2071 Style.NamespaceMacros.push_back("FOOBAR"); 2072 EXPECT_EQ("TESTSUITE(out) {\n" 2073 "FOOBAR(in) {\n" 2074 "} // FOOBAR(in)\n" 2075 "} // TESTSUITE(out)", 2076 format("TESTSUITE(out) {\n" 2077 "FOOBAR(in) {\n" 2078 "} // FOOBAR(in)\n" 2079 "} // TESTSUITE(out)", 2080 Style)); 2081 } 2082 2083 TEST_F(FormatTest, FormatsCompactNamespaces) { 2084 FormatStyle Style = getLLVMStyle(); 2085 Style.CompactNamespaces = true; 2086 Style.NamespaceMacros.push_back("TESTSUITE"); 2087 2088 verifyFormat("namespace A { namespace B {\n" 2089 "}} // namespace A::B", 2090 Style); 2091 2092 EXPECT_EQ("namespace out { namespace in {\n" 2093 "}} // namespace out::in", 2094 format("namespace out {\n" 2095 "namespace in {\n" 2096 "} // namespace in\n" 2097 "} // namespace out", 2098 Style)); 2099 2100 // Only namespaces which have both consecutive opening and end get compacted 2101 EXPECT_EQ("namespace out {\n" 2102 "namespace in1 {\n" 2103 "} // namespace in1\n" 2104 "namespace in2 {\n" 2105 "} // namespace in2\n" 2106 "} // namespace out", 2107 format("namespace out {\n" 2108 "namespace in1 {\n" 2109 "} // namespace in1\n" 2110 "namespace in2 {\n" 2111 "} // namespace in2\n" 2112 "} // namespace out", 2113 Style)); 2114 2115 EXPECT_EQ("namespace out {\n" 2116 "int i;\n" 2117 "namespace in {\n" 2118 "int j;\n" 2119 "} // namespace in\n" 2120 "int k;\n" 2121 "} // namespace out", 2122 format("namespace out { int i;\n" 2123 "namespace in { int j; } // namespace in\n" 2124 "int k; } // namespace out", 2125 Style)); 2126 2127 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2128 "}}} // namespace A::B::C\n", 2129 format("namespace A { namespace B {\n" 2130 "namespace C {\n" 2131 "}} // namespace B::C\n" 2132 "} // namespace A\n", 2133 Style)); 2134 2135 Style.ColumnLimit = 40; 2136 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2137 "namespace bbbbbbbbbb {\n" 2138 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2139 format("namespace aaaaaaaaaa {\n" 2140 "namespace bbbbbbbbbb {\n" 2141 "} // namespace bbbbbbbbbb\n" 2142 "} // namespace aaaaaaaaaa", 2143 Style)); 2144 2145 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2146 "namespace cccccc {\n" 2147 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2148 format("namespace aaaaaa {\n" 2149 "namespace bbbbbb {\n" 2150 "namespace cccccc {\n" 2151 "} // namespace cccccc\n" 2152 "} // namespace bbbbbb\n" 2153 "} // namespace aaaaaa", 2154 Style)); 2155 Style.ColumnLimit = 80; 2156 2157 // Extra semicolon after 'inner' closing brace prevents merging 2158 EXPECT_EQ("namespace out { namespace in {\n" 2159 "}; } // namespace out::in", 2160 format("namespace out {\n" 2161 "namespace in {\n" 2162 "}; // namespace in\n" 2163 "} // namespace out", 2164 Style)); 2165 2166 // Extra semicolon after 'outer' closing brace is conserved 2167 EXPECT_EQ("namespace out { namespace in {\n" 2168 "}}; // namespace out::in", 2169 format("namespace out {\n" 2170 "namespace in {\n" 2171 "} // namespace in\n" 2172 "}; // namespace out", 2173 Style)); 2174 2175 Style.NamespaceIndentation = FormatStyle::NI_All; 2176 EXPECT_EQ("namespace out { namespace in {\n" 2177 " int i;\n" 2178 "}} // namespace out::in", 2179 format("namespace out {\n" 2180 "namespace in {\n" 2181 "int i;\n" 2182 "} // namespace in\n" 2183 "} // namespace out", 2184 Style)); 2185 EXPECT_EQ("namespace out { namespace mid {\n" 2186 " namespace in {\n" 2187 " int j;\n" 2188 " } // namespace in\n" 2189 " int k;\n" 2190 "}} // namespace out::mid", 2191 format("namespace out { namespace mid {\n" 2192 "namespace in { int j; } // namespace in\n" 2193 "int k; }} // namespace out::mid", 2194 Style)); 2195 2196 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2197 EXPECT_EQ("namespace out { namespace in {\n" 2198 " int i;\n" 2199 "}} // namespace out::in", 2200 format("namespace out {\n" 2201 "namespace in {\n" 2202 "int i;\n" 2203 "} // namespace in\n" 2204 "} // namespace out", 2205 Style)); 2206 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2207 " int i;\n" 2208 "}}} // namespace out::mid::in", 2209 format("namespace out {\n" 2210 "namespace mid {\n" 2211 "namespace in {\n" 2212 "int i;\n" 2213 "} // namespace in\n" 2214 "} // namespace mid\n" 2215 "} // namespace out", 2216 Style)); 2217 } 2218 2219 TEST_F(FormatTest, FormatsExternC) { 2220 verifyFormat("extern \"C\" {\nint a;"); 2221 verifyFormat("extern \"C\" {}"); 2222 verifyFormat("extern \"C\" {\n" 2223 "int foo();\n" 2224 "}"); 2225 verifyFormat("extern \"C\" int foo() {}"); 2226 verifyFormat("extern \"C\" int foo();"); 2227 verifyFormat("extern \"C\" int foo() {\n" 2228 " int i = 42;\n" 2229 " return i;\n" 2230 "}"); 2231 2232 FormatStyle Style = getLLVMStyle(); 2233 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2234 Style.BraceWrapping.AfterFunction = true; 2235 verifyFormat("extern \"C\" int foo() {}", Style); 2236 verifyFormat("extern \"C\" int foo();", Style); 2237 verifyFormat("extern \"C\" int foo()\n" 2238 "{\n" 2239 " int i = 42;\n" 2240 " return i;\n" 2241 "}", 2242 Style); 2243 2244 Style.BraceWrapping.AfterExternBlock = true; 2245 Style.BraceWrapping.SplitEmptyRecord = false; 2246 verifyFormat("extern \"C\"\n" 2247 "{}", 2248 Style); 2249 verifyFormat("extern \"C\"\n" 2250 "{\n" 2251 " int foo();\n" 2252 "}", 2253 Style); 2254 } 2255 2256 TEST_F(FormatTest, FormatsInlineASM) { 2257 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2258 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2259 verifyFormat( 2260 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2261 " \"cpuid\\n\\t\"\n" 2262 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2263 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2264 " : \"a\"(value));"); 2265 EXPECT_EQ( 2266 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2267 " __asm {\n" 2268 " mov edx,[that] // vtable in edx\n" 2269 " mov eax,methodIndex\n" 2270 " call [edx][eax*4] // stdcall\n" 2271 " }\n" 2272 "}", 2273 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2274 " __asm {\n" 2275 " mov edx,[that] // vtable in edx\n" 2276 " mov eax,methodIndex\n" 2277 " call [edx][eax*4] // stdcall\n" 2278 " }\n" 2279 "}")); 2280 EXPECT_EQ("_asm {\n" 2281 " xor eax, eax;\n" 2282 " cpuid;\n" 2283 "}", 2284 format("_asm {\n" 2285 " xor eax, eax;\n" 2286 " cpuid;\n" 2287 "}")); 2288 verifyFormat("void function() {\n" 2289 " // comment\n" 2290 " asm(\"\");\n" 2291 "}"); 2292 EXPECT_EQ("__asm {\n" 2293 "}\n" 2294 "int i;", 2295 format("__asm {\n" 2296 "}\n" 2297 "int i;")); 2298 } 2299 2300 TEST_F(FormatTest, FormatTryCatch) { 2301 verifyFormat("try {\n" 2302 " throw a * b;\n" 2303 "} catch (int a) {\n" 2304 " // Do nothing.\n" 2305 "} catch (...) {\n" 2306 " exit(42);\n" 2307 "}"); 2308 2309 // Function-level try statements. 2310 verifyFormat("int f() try { return 4; } catch (...) {\n" 2311 " return 5;\n" 2312 "}"); 2313 verifyFormat("class A {\n" 2314 " int a;\n" 2315 " A() try : a(0) {\n" 2316 " } catch (...) {\n" 2317 " throw;\n" 2318 " }\n" 2319 "};\n"); 2320 2321 // Incomplete try-catch blocks. 2322 verifyIncompleteFormat("try {} catch ("); 2323 } 2324 2325 TEST_F(FormatTest, FormatSEHTryCatch) { 2326 verifyFormat("__try {\n" 2327 " int a = b * c;\n" 2328 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2329 " // Do nothing.\n" 2330 "}"); 2331 2332 verifyFormat("__try {\n" 2333 " int a = b * c;\n" 2334 "} __finally {\n" 2335 " // Do nothing.\n" 2336 "}"); 2337 2338 verifyFormat("DEBUG({\n" 2339 " __try {\n" 2340 " } __finally {\n" 2341 " }\n" 2342 "});\n"); 2343 } 2344 2345 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2346 verifyFormat("try {\n" 2347 " f();\n" 2348 "} catch {\n" 2349 " g();\n" 2350 "}"); 2351 verifyFormat("try {\n" 2352 " f();\n" 2353 "} catch (A a) MACRO(x) {\n" 2354 " g();\n" 2355 "} catch (B b) MACRO(x) {\n" 2356 " g();\n" 2357 "}"); 2358 } 2359 2360 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2361 FormatStyle Style = getLLVMStyle(); 2362 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2363 FormatStyle::BS_WebKit}) { 2364 Style.BreakBeforeBraces = BraceStyle; 2365 verifyFormat("try {\n" 2366 " // something\n" 2367 "} catch (...) {\n" 2368 " // something\n" 2369 "}", 2370 Style); 2371 } 2372 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2373 verifyFormat("try {\n" 2374 " // something\n" 2375 "}\n" 2376 "catch (...) {\n" 2377 " // something\n" 2378 "}", 2379 Style); 2380 verifyFormat("__try {\n" 2381 " // something\n" 2382 "}\n" 2383 "__finally {\n" 2384 " // something\n" 2385 "}", 2386 Style); 2387 verifyFormat("@try {\n" 2388 " // something\n" 2389 "}\n" 2390 "@finally {\n" 2391 " // something\n" 2392 "}", 2393 Style); 2394 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2395 verifyFormat("try\n" 2396 "{\n" 2397 " // something\n" 2398 "}\n" 2399 "catch (...)\n" 2400 "{\n" 2401 " // something\n" 2402 "}", 2403 Style); 2404 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2405 verifyFormat("try\n" 2406 " {\n" 2407 " // something\n" 2408 " }\n" 2409 "catch (...)\n" 2410 " {\n" 2411 " // something\n" 2412 " }", 2413 Style); 2414 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2415 Style.BraceWrapping.BeforeCatch = true; 2416 verifyFormat("try {\n" 2417 " // something\n" 2418 "}\n" 2419 "catch (...) {\n" 2420 " // something\n" 2421 "}", 2422 Style); 2423 } 2424 2425 TEST_F(FormatTest, StaticInitializers) { 2426 verifyFormat("static SomeClass SC = {1, 'a'};"); 2427 2428 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2429 " 100000000, " 2430 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2431 2432 // Here, everything other than the "}" would fit on a line. 2433 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2434 " 10000000000000000000000000};"); 2435 EXPECT_EQ("S s = {a,\n" 2436 "\n" 2437 " b};", 2438 format("S s = {\n" 2439 " a,\n" 2440 "\n" 2441 " b\n" 2442 "};")); 2443 2444 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2445 // line. However, the formatting looks a bit off and this probably doesn't 2446 // happen often in practice. 2447 verifyFormat("static int Variable[1] = {\n" 2448 " {1000000000000000000000000000000000000}};", 2449 getLLVMStyleWithColumns(40)); 2450 } 2451 2452 TEST_F(FormatTest, DesignatedInitializers) { 2453 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2454 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2455 " .bbbbbbbbbb = 2,\n" 2456 " .cccccccccc = 3,\n" 2457 " .dddddddddd = 4,\n" 2458 " .eeeeeeeeee = 5};"); 2459 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2460 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2461 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2462 " .ccccccccccccccccccccccccccc = 3,\n" 2463 " .ddddddddddddddddddddddddddd = 4,\n" 2464 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2465 2466 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2467 2468 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2469 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2470 " [2] = bbbbbbbbbb,\n" 2471 " [3] = cccccccccc,\n" 2472 " [4] = dddddddddd,\n" 2473 " [5] = eeeeeeeeee};"); 2474 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2475 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2476 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2477 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2478 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2479 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2480 } 2481 2482 TEST_F(FormatTest, NestedStaticInitializers) { 2483 verifyFormat("static A x = {{{}}};\n"); 2484 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2485 " {init1, init2, init3, init4}}};", 2486 getLLVMStyleWithColumns(50)); 2487 2488 verifyFormat("somes Status::global_reps[3] = {\n" 2489 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2490 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2491 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2492 getLLVMStyleWithColumns(60)); 2493 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2494 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2495 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2496 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2497 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2498 " {rect.fRight - rect.fLeft, rect.fBottom - " 2499 "rect.fTop}};"); 2500 2501 verifyFormat( 2502 "SomeArrayOfSomeType a = {\n" 2503 " {{1, 2, 3},\n" 2504 " {1, 2, 3},\n" 2505 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2506 " 333333333333333333333333333333},\n" 2507 " {1, 2, 3},\n" 2508 " {1, 2, 3}}};"); 2509 verifyFormat( 2510 "SomeArrayOfSomeType a = {\n" 2511 " {{1, 2, 3}},\n" 2512 " {{1, 2, 3}},\n" 2513 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2514 " 333333333333333333333333333333}},\n" 2515 " {{1, 2, 3}},\n" 2516 " {{1, 2, 3}}};"); 2517 2518 verifyFormat("struct {\n" 2519 " unsigned bit;\n" 2520 " const char *const name;\n" 2521 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2522 " {kOsWin, \"Windows\"},\n" 2523 " {kOsLinux, \"Linux\"},\n" 2524 " {kOsCrOS, \"Chrome OS\"}};"); 2525 verifyFormat("struct {\n" 2526 " unsigned bit;\n" 2527 " const char *const name;\n" 2528 "} kBitsToOs[] = {\n" 2529 " {kOsMac, \"Mac\"},\n" 2530 " {kOsWin, \"Windows\"},\n" 2531 " {kOsLinux, \"Linux\"},\n" 2532 " {kOsCrOS, \"Chrome OS\"},\n" 2533 "};"); 2534 } 2535 2536 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2537 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2538 " \\\n" 2539 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2540 } 2541 2542 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2543 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2544 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2545 2546 // Do break defaulted and deleted functions. 2547 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2548 " default;", 2549 getLLVMStyleWithColumns(40)); 2550 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2551 " delete;", 2552 getLLVMStyleWithColumns(40)); 2553 } 2554 2555 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2556 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2557 getLLVMStyleWithColumns(40)); 2558 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2559 getLLVMStyleWithColumns(40)); 2560 EXPECT_EQ("#define Q \\\n" 2561 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2562 " \"aaaaaaaa.cpp\"", 2563 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2564 getLLVMStyleWithColumns(40))); 2565 } 2566 2567 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2568 EXPECT_EQ("# 123 \"A string literal\"", 2569 format(" # 123 \"A string literal\"")); 2570 } 2571 2572 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2573 EXPECT_EQ("#;", format("#;")); 2574 verifyFormat("#\n;\n;\n;"); 2575 } 2576 2577 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2578 EXPECT_EQ("#line 42 \"test\"\n", 2579 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2580 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2581 getLLVMStyleWithColumns(12))); 2582 } 2583 2584 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2585 EXPECT_EQ("#line 42 \"test\"", 2586 format("# \\\n line \\\n 42 \\\n \"test\"")); 2587 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2588 } 2589 2590 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2591 verifyFormat("#define A \\x20"); 2592 verifyFormat("#define A \\ x20"); 2593 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2594 verifyFormat("#define A ''"); 2595 verifyFormat("#define A ''qqq"); 2596 verifyFormat("#define A `qqq"); 2597 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2598 EXPECT_EQ("const char *c = STRINGIFY(\n" 2599 "\\na : b);", 2600 format("const char * c = STRINGIFY(\n" 2601 "\\na : b);")); 2602 2603 verifyFormat("a\r\\"); 2604 verifyFormat("a\v\\"); 2605 verifyFormat("a\f\\"); 2606 } 2607 2608 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2609 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2610 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2611 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2612 // FIXME: We never break before the macro name. 2613 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2614 2615 verifyFormat("#define A A\n#define A A"); 2616 verifyFormat("#define A(X) A\n#define A A"); 2617 2618 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2619 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2620 } 2621 2622 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2623 EXPECT_EQ("// somecomment\n" 2624 "#include \"a.h\"\n" 2625 "#define A( \\\n" 2626 " A, B)\n" 2627 "#include \"b.h\"\n" 2628 "// somecomment\n", 2629 format(" // somecomment\n" 2630 " #include \"a.h\"\n" 2631 "#define A(A,\\\n" 2632 " B)\n" 2633 " #include \"b.h\"\n" 2634 " // somecomment\n", 2635 getLLVMStyleWithColumns(13))); 2636 } 2637 2638 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2639 2640 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2641 EXPECT_EQ("#define A \\\n" 2642 " c; \\\n" 2643 " e;\n" 2644 "f;", 2645 format("#define A c; e;\n" 2646 "f;", 2647 getLLVMStyleWithColumns(14))); 2648 } 2649 2650 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2651 2652 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2653 EXPECT_EQ("int x,\n" 2654 "#define A\n" 2655 " y;", 2656 format("int x,\n#define A\ny;")); 2657 } 2658 2659 TEST_F(FormatTest, HashInMacroDefinition) { 2660 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2661 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2662 verifyFormat("#define A \\\n" 2663 " { \\\n" 2664 " f(#c); \\\n" 2665 " }", 2666 getLLVMStyleWithColumns(11)); 2667 2668 verifyFormat("#define A(X) \\\n" 2669 " void function##X()", 2670 getLLVMStyleWithColumns(22)); 2671 2672 verifyFormat("#define A(a, b, c) \\\n" 2673 " void a##b##c()", 2674 getLLVMStyleWithColumns(22)); 2675 2676 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2677 } 2678 2679 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2680 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2681 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2682 2683 FormatStyle Style = getLLVMStyle(); 2684 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2685 verifyFormat("#define true ((foo)1)", Style); 2686 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2687 verifyFormat("#define false((foo)0)", Style); 2688 } 2689 2690 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2691 EXPECT_EQ("#define A b;", format("#define A \\\n" 2692 " \\\n" 2693 " b;", 2694 getLLVMStyleWithColumns(25))); 2695 EXPECT_EQ("#define A \\\n" 2696 " \\\n" 2697 " a; \\\n" 2698 " b;", 2699 format("#define A \\\n" 2700 " \\\n" 2701 " a; \\\n" 2702 " b;", 2703 getLLVMStyleWithColumns(11))); 2704 EXPECT_EQ("#define A \\\n" 2705 " a; \\\n" 2706 " \\\n" 2707 " b;", 2708 format("#define A \\\n" 2709 " a; \\\n" 2710 " \\\n" 2711 " b;", 2712 getLLVMStyleWithColumns(11))); 2713 } 2714 2715 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2716 verifyIncompleteFormat("#define A :"); 2717 verifyFormat("#define SOMECASES \\\n" 2718 " case 1: \\\n" 2719 " case 2\n", 2720 getLLVMStyleWithColumns(20)); 2721 verifyFormat("#define MACRO(a) \\\n" 2722 " if (a) \\\n" 2723 " f(); \\\n" 2724 " else \\\n" 2725 " g()", 2726 getLLVMStyleWithColumns(18)); 2727 verifyFormat("#define A template <typename T>"); 2728 verifyIncompleteFormat("#define STR(x) #x\n" 2729 "f(STR(this_is_a_string_literal{));"); 2730 verifyFormat("#pragma omp threadprivate( \\\n" 2731 " y)), // expected-warning", 2732 getLLVMStyleWithColumns(28)); 2733 verifyFormat("#d, = };"); 2734 verifyFormat("#if \"a"); 2735 verifyIncompleteFormat("({\n" 2736 "#define b \\\n" 2737 " } \\\n" 2738 " a\n" 2739 "a", 2740 getLLVMStyleWithColumns(15)); 2741 verifyFormat("#define A \\\n" 2742 " { \\\n" 2743 " {\n" 2744 "#define B \\\n" 2745 " } \\\n" 2746 " }", 2747 getLLVMStyleWithColumns(15)); 2748 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 2749 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 2750 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 2751 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 2752 } 2753 2754 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 2755 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 2756 EXPECT_EQ("class A : public QObject {\n" 2757 " Q_OBJECT\n" 2758 "\n" 2759 " A() {}\n" 2760 "};", 2761 format("class A : public QObject {\n" 2762 " Q_OBJECT\n" 2763 "\n" 2764 " A() {\n}\n" 2765 "} ;")); 2766 EXPECT_EQ("MACRO\n" 2767 "/*static*/ int i;", 2768 format("MACRO\n" 2769 " /*static*/ int i;")); 2770 EXPECT_EQ("SOME_MACRO\n" 2771 "namespace {\n" 2772 "void f();\n" 2773 "} // namespace", 2774 format("SOME_MACRO\n" 2775 " namespace {\n" 2776 "void f( );\n" 2777 "} // namespace")); 2778 // Only if the identifier contains at least 5 characters. 2779 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 2780 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 2781 // Only if everything is upper case. 2782 EXPECT_EQ("class A : public QObject {\n" 2783 " Q_Object A() {}\n" 2784 "};", 2785 format("class A : public QObject {\n" 2786 " Q_Object\n" 2787 " A() {\n}\n" 2788 "} ;")); 2789 2790 // Only if the next line can actually start an unwrapped line. 2791 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 2792 format("SOME_WEIRD_LOG_MACRO\n" 2793 "<< SomeThing;")); 2794 2795 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 2796 "(n, buffers))\n", 2797 getChromiumStyle(FormatStyle::LK_Cpp)); 2798 2799 // See PR41483 2800 EXPECT_EQ("/**/ FOO(a)\n" 2801 "FOO(b)", 2802 format("/**/ FOO(a)\n" 2803 "FOO(b)")); 2804 } 2805 2806 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 2807 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2808 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2809 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2810 "class X {};\n" 2811 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2812 "int *createScopDetectionPass() { return 0; }", 2813 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2814 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2815 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2816 " class X {};\n" 2817 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2818 " int *createScopDetectionPass() { return 0; }")); 2819 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 2820 // braces, so that inner block is indented one level more. 2821 EXPECT_EQ("int q() {\n" 2822 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2823 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2824 " IPC_END_MESSAGE_MAP()\n" 2825 "}", 2826 format("int q() {\n" 2827 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2828 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2829 " IPC_END_MESSAGE_MAP()\n" 2830 "}")); 2831 2832 // Same inside macros. 2833 EXPECT_EQ("#define LIST(L) \\\n" 2834 " L(A) \\\n" 2835 " L(B) \\\n" 2836 " L(C)", 2837 format("#define LIST(L) \\\n" 2838 " L(A) \\\n" 2839 " L(B) \\\n" 2840 " L(C)", 2841 getGoogleStyle())); 2842 2843 // These must not be recognized as macros. 2844 EXPECT_EQ("int q() {\n" 2845 " f(x);\n" 2846 " f(x) {}\n" 2847 " f(x)->g();\n" 2848 " f(x)->*g();\n" 2849 " f(x).g();\n" 2850 " f(x) = x;\n" 2851 " f(x) += x;\n" 2852 " f(x) -= x;\n" 2853 " f(x) *= x;\n" 2854 " f(x) /= x;\n" 2855 " f(x) %= x;\n" 2856 " f(x) &= x;\n" 2857 " f(x) |= x;\n" 2858 " f(x) ^= x;\n" 2859 " f(x) >>= x;\n" 2860 " f(x) <<= x;\n" 2861 " f(x)[y].z();\n" 2862 " LOG(INFO) << x;\n" 2863 " ifstream(x) >> x;\n" 2864 "}\n", 2865 format("int q() {\n" 2866 " f(x)\n;\n" 2867 " f(x)\n {}\n" 2868 " f(x)\n->g();\n" 2869 " f(x)\n->*g();\n" 2870 " f(x)\n.g();\n" 2871 " f(x)\n = x;\n" 2872 " f(x)\n += x;\n" 2873 " f(x)\n -= x;\n" 2874 " f(x)\n *= x;\n" 2875 " f(x)\n /= x;\n" 2876 " f(x)\n %= x;\n" 2877 " f(x)\n &= x;\n" 2878 " f(x)\n |= x;\n" 2879 " f(x)\n ^= x;\n" 2880 " f(x)\n >>= x;\n" 2881 " f(x)\n <<= x;\n" 2882 " f(x)\n[y].z();\n" 2883 " LOG(INFO)\n << x;\n" 2884 " ifstream(x)\n >> x;\n" 2885 "}\n")); 2886 EXPECT_EQ("int q() {\n" 2887 " F(x)\n" 2888 " if (1) {\n" 2889 " }\n" 2890 " F(x)\n" 2891 " while (1) {\n" 2892 " }\n" 2893 " F(x)\n" 2894 " G(x);\n" 2895 " F(x)\n" 2896 " try {\n" 2897 " Q();\n" 2898 " } catch (...) {\n" 2899 " }\n" 2900 "}\n", 2901 format("int q() {\n" 2902 "F(x)\n" 2903 "if (1) {}\n" 2904 "F(x)\n" 2905 "while (1) {}\n" 2906 "F(x)\n" 2907 "G(x);\n" 2908 "F(x)\n" 2909 "try { Q(); } catch (...) {}\n" 2910 "}\n")); 2911 EXPECT_EQ("class A {\n" 2912 " A() : t(0) {}\n" 2913 " A(int i) noexcept() : {}\n" 2914 " A(X x)\n" // FIXME: function-level try blocks are broken. 2915 " try : t(0) {\n" 2916 " } catch (...) {\n" 2917 " }\n" 2918 "};", 2919 format("class A {\n" 2920 " A()\n : t(0) {}\n" 2921 " A(int i)\n noexcept() : {}\n" 2922 " A(X x)\n" 2923 " try : t(0) {} catch (...) {}\n" 2924 "};")); 2925 FormatStyle Style = getLLVMStyle(); 2926 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2927 Style.BraceWrapping.AfterControlStatement = true; 2928 Style.BraceWrapping.AfterFunction = true; 2929 EXPECT_EQ("void f()\n" 2930 "try\n" 2931 "{\n" 2932 "}", 2933 format("void f() try {\n" 2934 "}", Style)); 2935 EXPECT_EQ("class SomeClass {\n" 2936 "public:\n" 2937 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2938 "};", 2939 format("class SomeClass {\n" 2940 "public:\n" 2941 " SomeClass()\n" 2942 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2943 "};")); 2944 EXPECT_EQ("class SomeClass {\n" 2945 "public:\n" 2946 " SomeClass()\n" 2947 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2948 "};", 2949 format("class SomeClass {\n" 2950 "public:\n" 2951 " SomeClass()\n" 2952 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2953 "};", 2954 getLLVMStyleWithColumns(40))); 2955 2956 verifyFormat("MACRO(>)"); 2957 2958 // Some macros contain an implicit semicolon. 2959 Style = getLLVMStyle(); 2960 Style.StatementMacros.push_back("FOO"); 2961 verifyFormat("FOO(a) int b = 0;"); 2962 verifyFormat("FOO(a)\n" 2963 "int b = 0;", 2964 Style); 2965 verifyFormat("FOO(a);\n" 2966 "int b = 0;", 2967 Style); 2968 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 2969 "int b = 0;", 2970 Style); 2971 verifyFormat("FOO()\n" 2972 "int b = 0;", 2973 Style); 2974 verifyFormat("FOO\n" 2975 "int b = 0;", 2976 Style); 2977 verifyFormat("void f() {\n" 2978 " FOO(a)\n" 2979 " return a;\n" 2980 "}", 2981 Style); 2982 verifyFormat("FOO(a)\n" 2983 "FOO(b)", 2984 Style); 2985 verifyFormat("int a = 0;\n" 2986 "FOO(b)\n" 2987 "int c = 0;", 2988 Style); 2989 verifyFormat("int a = 0;\n" 2990 "int x = FOO(a)\n" 2991 "int b = 0;", 2992 Style); 2993 verifyFormat("void foo(int a) { FOO(a) }\n" 2994 "uint32_t bar() {}", 2995 Style); 2996 } 2997 2998 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 2999 verifyFormat("#define A \\\n" 3000 " f({ \\\n" 3001 " g(); \\\n" 3002 " });", 3003 getLLVMStyleWithColumns(11)); 3004 } 3005 3006 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3007 FormatStyle Style = getLLVMStyle(); 3008 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3009 Style.ColumnLimit = 40; 3010 verifyFormat("#ifdef _WIN32\n" 3011 "#define A 0\n" 3012 "#ifdef VAR2\n" 3013 "#define B 1\n" 3014 "#include <someheader.h>\n" 3015 "#define MACRO \\\n" 3016 " some_very_long_func_aaaaaaaaaa();\n" 3017 "#endif\n" 3018 "#else\n" 3019 "#define A 1\n" 3020 "#endif", 3021 Style); 3022 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3023 verifyFormat("#ifdef _WIN32\n" 3024 "# define A 0\n" 3025 "# ifdef VAR2\n" 3026 "# define B 1\n" 3027 "# include <someheader.h>\n" 3028 "# define MACRO \\\n" 3029 " some_very_long_func_aaaaaaaaaa();\n" 3030 "# endif\n" 3031 "#else\n" 3032 "# define A 1\n" 3033 "#endif", 3034 Style); 3035 verifyFormat("#if A\n" 3036 "# define MACRO \\\n" 3037 " void a(int x) { \\\n" 3038 " b(); \\\n" 3039 " c(); \\\n" 3040 " d(); \\\n" 3041 " e(); \\\n" 3042 " f(); \\\n" 3043 " }\n" 3044 "#endif", 3045 Style); 3046 // Comments before include guard. 3047 verifyFormat("// file comment\n" 3048 "// file comment\n" 3049 "#ifndef HEADER_H\n" 3050 "#define HEADER_H\n" 3051 "code();\n" 3052 "#endif", 3053 Style); 3054 // Test with include guards. 3055 verifyFormat("#ifndef HEADER_H\n" 3056 "#define HEADER_H\n" 3057 "code();\n" 3058 "#endif", 3059 Style); 3060 // Include guards must have a #define with the same variable immediately 3061 // after #ifndef. 3062 verifyFormat("#ifndef NOT_GUARD\n" 3063 "# define FOO\n" 3064 "code();\n" 3065 "#endif", 3066 Style); 3067 3068 // Include guards must cover the entire file. 3069 verifyFormat("code();\n" 3070 "code();\n" 3071 "#ifndef NOT_GUARD\n" 3072 "# define NOT_GUARD\n" 3073 "code();\n" 3074 "#endif", 3075 Style); 3076 verifyFormat("#ifndef NOT_GUARD\n" 3077 "# define NOT_GUARD\n" 3078 "code();\n" 3079 "#endif\n" 3080 "code();", 3081 Style); 3082 // Test with trailing blank lines. 3083 verifyFormat("#ifndef HEADER_H\n" 3084 "#define HEADER_H\n" 3085 "code();\n" 3086 "#endif\n", 3087 Style); 3088 // Include guards don't have #else. 3089 verifyFormat("#ifndef NOT_GUARD\n" 3090 "# define NOT_GUARD\n" 3091 "code();\n" 3092 "#else\n" 3093 "#endif", 3094 Style); 3095 verifyFormat("#ifndef NOT_GUARD\n" 3096 "# define NOT_GUARD\n" 3097 "code();\n" 3098 "#elif FOO\n" 3099 "#endif", 3100 Style); 3101 // Non-identifier #define after potential include guard. 3102 verifyFormat("#ifndef FOO\n" 3103 "# define 1\n" 3104 "#endif\n", 3105 Style); 3106 // #if closes past last non-preprocessor line. 3107 verifyFormat("#ifndef FOO\n" 3108 "#define FOO\n" 3109 "#if 1\n" 3110 "int i;\n" 3111 "# define A 0\n" 3112 "#endif\n" 3113 "#endif\n", 3114 Style); 3115 // Don't crash if there is an #elif directive without a condition. 3116 verifyFormat("#if 1\n" 3117 "int x;\n" 3118 "#elif\n" 3119 "int y;\n" 3120 "#else\n" 3121 "int z;\n" 3122 "#endif", 3123 Style); 3124 // FIXME: This doesn't handle the case where there's code between the 3125 // #ifndef and #define but all other conditions hold. This is because when 3126 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3127 // previous code line yet, so we can't detect it. 3128 EXPECT_EQ("#ifndef NOT_GUARD\n" 3129 "code();\n" 3130 "#define NOT_GUARD\n" 3131 "code();\n" 3132 "#endif", 3133 format("#ifndef NOT_GUARD\n" 3134 "code();\n" 3135 "# define NOT_GUARD\n" 3136 "code();\n" 3137 "#endif", 3138 Style)); 3139 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3140 // be outside an include guard. Examples are #pragma once and 3141 // #pragma GCC diagnostic, or anything else that does not change the meaning 3142 // of the file if it's included multiple times. 3143 EXPECT_EQ("#ifdef WIN32\n" 3144 "# pragma once\n" 3145 "#endif\n" 3146 "#ifndef HEADER_H\n" 3147 "# define HEADER_H\n" 3148 "code();\n" 3149 "#endif", 3150 format("#ifdef WIN32\n" 3151 "# pragma once\n" 3152 "#endif\n" 3153 "#ifndef HEADER_H\n" 3154 "#define HEADER_H\n" 3155 "code();\n" 3156 "#endif", 3157 Style)); 3158 // FIXME: This does not detect when there is a single non-preprocessor line 3159 // in front of an include-guard-like structure where other conditions hold 3160 // because ScopedLineState hides the line. 3161 EXPECT_EQ("code();\n" 3162 "#ifndef HEADER_H\n" 3163 "#define HEADER_H\n" 3164 "code();\n" 3165 "#endif", 3166 format("code();\n" 3167 "#ifndef HEADER_H\n" 3168 "# define HEADER_H\n" 3169 "code();\n" 3170 "#endif", 3171 Style)); 3172 // Keep comments aligned with #, otherwise indent comments normally. These 3173 // tests cannot use verifyFormat because messUp manipulates leading 3174 // whitespace. 3175 { 3176 const char *Expected = "" 3177 "void f() {\n" 3178 "#if 1\n" 3179 "// Preprocessor aligned.\n" 3180 "# define A 0\n" 3181 " // Code. Separated by blank line.\n" 3182 "\n" 3183 "# define B 0\n" 3184 " // Code. Not aligned with #\n" 3185 "# define C 0\n" 3186 "#endif"; 3187 const char *ToFormat = "" 3188 "void f() {\n" 3189 "#if 1\n" 3190 "// Preprocessor aligned.\n" 3191 "# define A 0\n" 3192 "// Code. Separated by blank line.\n" 3193 "\n" 3194 "# define B 0\n" 3195 " // Code. Not aligned with #\n" 3196 "# define C 0\n" 3197 "#endif"; 3198 EXPECT_EQ(Expected, format(ToFormat, Style)); 3199 EXPECT_EQ(Expected, format(Expected, Style)); 3200 } 3201 // Keep block quotes aligned. 3202 { 3203 const char *Expected = "" 3204 "void f() {\n" 3205 "#if 1\n" 3206 "/* Preprocessor aligned. */\n" 3207 "# define A 0\n" 3208 " /* Code. Separated by blank line. */\n" 3209 "\n" 3210 "# define B 0\n" 3211 " /* Code. Not aligned with # */\n" 3212 "# define C 0\n" 3213 "#endif"; 3214 const char *ToFormat = "" 3215 "void f() {\n" 3216 "#if 1\n" 3217 "/* Preprocessor aligned. */\n" 3218 "# define A 0\n" 3219 "/* Code. Separated by blank line. */\n" 3220 "\n" 3221 "# define B 0\n" 3222 " /* Code. Not aligned with # */\n" 3223 "# define C 0\n" 3224 "#endif"; 3225 EXPECT_EQ(Expected, format(ToFormat, Style)); 3226 EXPECT_EQ(Expected, format(Expected, Style)); 3227 } 3228 // Keep comments aligned with un-indented directives. 3229 { 3230 const char *Expected = "" 3231 "void f() {\n" 3232 "// Preprocessor aligned.\n" 3233 "#define A 0\n" 3234 " // Code. Separated by blank line.\n" 3235 "\n" 3236 "#define B 0\n" 3237 " // Code. Not aligned with #\n" 3238 "#define C 0\n"; 3239 const char *ToFormat = "" 3240 "void f() {\n" 3241 "// Preprocessor aligned.\n" 3242 "#define A 0\n" 3243 "// Code. Separated by blank line.\n" 3244 "\n" 3245 "#define B 0\n" 3246 " // Code. Not aligned with #\n" 3247 "#define C 0\n"; 3248 EXPECT_EQ(Expected, format(ToFormat, Style)); 3249 EXPECT_EQ(Expected, format(Expected, Style)); 3250 } 3251 // Test AfterHash with tabs. 3252 { 3253 FormatStyle Tabbed = Style; 3254 Tabbed.UseTab = FormatStyle::UT_Always; 3255 Tabbed.IndentWidth = 8; 3256 Tabbed.TabWidth = 8; 3257 verifyFormat("#ifdef _WIN32\n" 3258 "#\tdefine A 0\n" 3259 "#\tifdef VAR2\n" 3260 "#\t\tdefine B 1\n" 3261 "#\t\tinclude <someheader.h>\n" 3262 "#\t\tdefine MACRO \\\n" 3263 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3264 "#\tendif\n" 3265 "#else\n" 3266 "#\tdefine A 1\n" 3267 "#endif", 3268 Tabbed); 3269 } 3270 3271 // Regression test: Multiline-macro inside include guards. 3272 verifyFormat("#ifndef HEADER_H\n" 3273 "#define HEADER_H\n" 3274 "#define A() \\\n" 3275 " int i; \\\n" 3276 " int j;\n" 3277 "#endif // HEADER_H", 3278 getLLVMStyleWithColumns(20)); 3279 3280 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3281 // Basic before hash indent tests 3282 verifyFormat("#ifdef _WIN32\n" 3283 " #define A 0\n" 3284 " #ifdef VAR2\n" 3285 " #define B 1\n" 3286 " #include <someheader.h>\n" 3287 " #define MACRO \\\n" 3288 " some_very_long_func_aaaaaaaaaa();\n" 3289 " #endif\n" 3290 "#else\n" 3291 " #define A 1\n" 3292 "#endif", 3293 Style); 3294 verifyFormat("#if A\n" 3295 " #define MACRO \\\n" 3296 " void a(int x) { \\\n" 3297 " b(); \\\n" 3298 " c(); \\\n" 3299 " d(); \\\n" 3300 " e(); \\\n" 3301 " f(); \\\n" 3302 " }\n" 3303 "#endif", 3304 Style); 3305 // Keep comments aligned with indented directives. These 3306 // tests cannot use verifyFormat because messUp manipulates leading 3307 // whitespace. 3308 { 3309 const char *Expected = "void f() {\n" 3310 "// Aligned to preprocessor.\n" 3311 "#if 1\n" 3312 " // Aligned to code.\n" 3313 " int a;\n" 3314 " #if 1\n" 3315 " // Aligned to preprocessor.\n" 3316 " #define A 0\n" 3317 " // Aligned to code.\n" 3318 " int b;\n" 3319 " #endif\n" 3320 "#endif\n" 3321 "}"; 3322 const char *ToFormat = "void f() {\n" 3323 "// Aligned to preprocessor.\n" 3324 "#if 1\n" 3325 "// Aligned to code.\n" 3326 "int a;\n" 3327 "#if 1\n" 3328 "// Aligned to preprocessor.\n" 3329 "#define A 0\n" 3330 "// Aligned to code.\n" 3331 "int b;\n" 3332 "#endif\n" 3333 "#endif\n" 3334 "}"; 3335 EXPECT_EQ(Expected, format(ToFormat, Style)); 3336 EXPECT_EQ(Expected, format(Expected, Style)); 3337 } 3338 { 3339 const char *Expected = "void f() {\n" 3340 "/* Aligned to preprocessor. */\n" 3341 "#if 1\n" 3342 " /* Aligned to code. */\n" 3343 " int a;\n" 3344 " #if 1\n" 3345 " /* Aligned to preprocessor. */\n" 3346 " #define A 0\n" 3347 " /* Aligned to code. */\n" 3348 " int b;\n" 3349 " #endif\n" 3350 "#endif\n" 3351 "}"; 3352 const char *ToFormat = "void f() {\n" 3353 "/* Aligned to preprocessor. */\n" 3354 "#if 1\n" 3355 "/* Aligned to code. */\n" 3356 "int a;\n" 3357 "#if 1\n" 3358 "/* Aligned to preprocessor. */\n" 3359 "#define A 0\n" 3360 "/* Aligned to code. */\n" 3361 "int b;\n" 3362 "#endif\n" 3363 "#endif\n" 3364 "}"; 3365 EXPECT_EQ(Expected, format(ToFormat, Style)); 3366 EXPECT_EQ(Expected, format(Expected, Style)); 3367 } 3368 3369 // Test single comment before preprocessor 3370 verifyFormat("// Comment\n" 3371 "\n" 3372 "#if 1\n" 3373 "#endif", 3374 Style); 3375 } 3376 3377 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3378 verifyFormat("{\n { a #c; }\n}"); 3379 } 3380 3381 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3382 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3383 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3384 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3385 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3386 } 3387 3388 TEST_F(FormatTest, EscapedNewlines) { 3389 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3390 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3391 format("#define A \\\nint i;\\\n int j;", Narrow)); 3392 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3393 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3394 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3395 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3396 3397 FormatStyle AlignLeft = getLLVMStyle(); 3398 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3399 EXPECT_EQ("#define MACRO(x) \\\n" 3400 "private: \\\n" 3401 " int x(int a);\n", 3402 format("#define MACRO(x) \\\n" 3403 "private: \\\n" 3404 " int x(int a);\n", 3405 AlignLeft)); 3406 3407 // CRLF line endings 3408 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3409 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3410 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3411 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3412 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3413 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3414 EXPECT_EQ("#define MACRO(x) \\\r\n" 3415 "private: \\\r\n" 3416 " int x(int a);\r\n", 3417 format("#define MACRO(x) \\\r\n" 3418 "private: \\\r\n" 3419 " int x(int a);\r\n", 3420 AlignLeft)); 3421 3422 FormatStyle DontAlign = getLLVMStyle(); 3423 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3424 DontAlign.MaxEmptyLinesToKeep = 3; 3425 // FIXME: can't use verifyFormat here because the newline before 3426 // "public:" is not inserted the first time it's reformatted 3427 EXPECT_EQ("#define A \\\n" 3428 " class Foo { \\\n" 3429 " void bar(); \\\n" 3430 "\\\n" 3431 "\\\n" 3432 "\\\n" 3433 " public: \\\n" 3434 " void baz(); \\\n" 3435 " };", 3436 format("#define A \\\n" 3437 " class Foo { \\\n" 3438 " void bar(); \\\n" 3439 "\\\n" 3440 "\\\n" 3441 "\\\n" 3442 " public: \\\n" 3443 " void baz(); \\\n" 3444 " };", 3445 DontAlign)); 3446 } 3447 3448 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3449 verifyFormat("#define A \\\n" 3450 " int v( \\\n" 3451 " a); \\\n" 3452 " int i;", 3453 getLLVMStyleWithColumns(11)); 3454 } 3455 3456 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3457 EXPECT_EQ( 3458 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3459 " \\\n" 3460 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3461 "\n" 3462 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3463 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3464 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3465 "\\\n" 3466 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3467 " \n" 3468 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3469 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3470 } 3471 3472 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3473 EXPECT_EQ("int\n" 3474 "#define A\n" 3475 " a;", 3476 format("int\n#define A\na;")); 3477 verifyFormat("functionCallTo(\n" 3478 " someOtherFunction(\n" 3479 " withSomeParameters, whichInSequence,\n" 3480 " areLongerThanALine(andAnotherCall,\n" 3481 "#define A B\n" 3482 " withMoreParamters,\n" 3483 " whichStronglyInfluenceTheLayout),\n" 3484 " andMoreParameters),\n" 3485 " trailing);", 3486 getLLVMStyleWithColumns(69)); 3487 verifyFormat("Foo::Foo()\n" 3488 "#ifdef BAR\n" 3489 " : baz(0)\n" 3490 "#endif\n" 3491 "{\n" 3492 "}"); 3493 verifyFormat("void f() {\n" 3494 " if (true)\n" 3495 "#ifdef A\n" 3496 " f(42);\n" 3497 " x();\n" 3498 "#else\n" 3499 " g();\n" 3500 " x();\n" 3501 "#endif\n" 3502 "}"); 3503 verifyFormat("void f(param1, param2,\n" 3504 " param3,\n" 3505 "#ifdef A\n" 3506 " param4(param5,\n" 3507 "#ifdef A1\n" 3508 " param6,\n" 3509 "#ifdef A2\n" 3510 " param7),\n" 3511 "#else\n" 3512 " param8),\n" 3513 " param9,\n" 3514 "#endif\n" 3515 " param10,\n" 3516 "#endif\n" 3517 " param11)\n" 3518 "#else\n" 3519 " param12)\n" 3520 "#endif\n" 3521 "{\n" 3522 " x();\n" 3523 "}", 3524 getLLVMStyleWithColumns(28)); 3525 verifyFormat("#if 1\n" 3526 "int i;"); 3527 verifyFormat("#if 1\n" 3528 "#endif\n" 3529 "#if 1\n" 3530 "#else\n" 3531 "#endif\n"); 3532 verifyFormat("DEBUG({\n" 3533 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3534 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3535 "});\n" 3536 "#if a\n" 3537 "#else\n" 3538 "#endif"); 3539 3540 verifyIncompleteFormat("void f(\n" 3541 "#if A\n" 3542 ");\n" 3543 "#else\n" 3544 "#endif"); 3545 } 3546 3547 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3548 verifyFormat("#endif\n" 3549 "#if B"); 3550 } 3551 3552 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3553 FormatStyle SingleLine = getLLVMStyle(); 3554 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3555 verifyFormat("#if 0\n" 3556 "#elif 1\n" 3557 "#endif\n" 3558 "void foo() {\n" 3559 " if (test) foo2();\n" 3560 "}", 3561 SingleLine); 3562 } 3563 3564 TEST_F(FormatTest, LayoutBlockInsideParens) { 3565 verifyFormat("functionCall({ int i; });"); 3566 verifyFormat("functionCall({\n" 3567 " int i;\n" 3568 " int j;\n" 3569 "});"); 3570 verifyFormat("functionCall(\n" 3571 " {\n" 3572 " int i;\n" 3573 " int j;\n" 3574 " },\n" 3575 " aaaa, bbbb, cccc);"); 3576 verifyFormat("functionA(functionB({\n" 3577 " int i;\n" 3578 " int j;\n" 3579 " }),\n" 3580 " aaaa, bbbb, cccc);"); 3581 verifyFormat("functionCall(\n" 3582 " {\n" 3583 " int i;\n" 3584 " int j;\n" 3585 " },\n" 3586 " aaaa, bbbb, // comment\n" 3587 " cccc);"); 3588 verifyFormat("functionA(functionB({\n" 3589 " int i;\n" 3590 " int j;\n" 3591 " }),\n" 3592 " aaaa, bbbb, // comment\n" 3593 " cccc);"); 3594 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3595 verifyFormat("functionCall(aaaa, bbbb, {\n" 3596 " int i;\n" 3597 " int j;\n" 3598 "});"); 3599 verifyFormat( 3600 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3601 " {\n" 3602 " int i; // break\n" 3603 " },\n" 3604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3605 " ccccccccccccccccc));"); 3606 verifyFormat("DEBUG({\n" 3607 " if (a)\n" 3608 " f();\n" 3609 "});"); 3610 } 3611 3612 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3613 EXPECT_EQ("SOME_MACRO { int i; }\n" 3614 "int i;", 3615 format(" SOME_MACRO {int i;} int i;")); 3616 } 3617 3618 TEST_F(FormatTest, LayoutNestedBlocks) { 3619 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3620 " struct s {\n" 3621 " int i;\n" 3622 " };\n" 3623 " s kBitsToOs[] = {{10}};\n" 3624 " for (int i = 0; i < 10; ++i)\n" 3625 " return;\n" 3626 "}"); 3627 verifyFormat("call(parameter, {\n" 3628 " something();\n" 3629 " // Comment using all columns.\n" 3630 " somethingelse();\n" 3631 "});", 3632 getLLVMStyleWithColumns(40)); 3633 verifyFormat("DEBUG( //\n" 3634 " { f(); }, a);"); 3635 verifyFormat("DEBUG( //\n" 3636 " {\n" 3637 " f(); //\n" 3638 " },\n" 3639 " a);"); 3640 3641 EXPECT_EQ("call(parameter, {\n" 3642 " something();\n" 3643 " // Comment too\n" 3644 " // looooooooooong.\n" 3645 " somethingElse();\n" 3646 "});", 3647 format("call(parameter, {\n" 3648 " something();\n" 3649 " // Comment too looooooooooong.\n" 3650 " somethingElse();\n" 3651 "});", 3652 getLLVMStyleWithColumns(29))); 3653 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3654 EXPECT_EQ("DEBUG({ // comment\n" 3655 " int i;\n" 3656 "});", 3657 format("DEBUG({ // comment\n" 3658 "int i;\n" 3659 "});")); 3660 EXPECT_EQ("DEBUG({\n" 3661 " int i;\n" 3662 "\n" 3663 " // comment\n" 3664 " int j;\n" 3665 "});", 3666 format("DEBUG({\n" 3667 " int i;\n" 3668 "\n" 3669 " // comment\n" 3670 " int j;\n" 3671 "});")); 3672 3673 verifyFormat("DEBUG({\n" 3674 " if (a)\n" 3675 " return;\n" 3676 "});"); 3677 verifyGoogleFormat("DEBUG({\n" 3678 " if (a) return;\n" 3679 "});"); 3680 FormatStyle Style = getGoogleStyle(); 3681 Style.ColumnLimit = 45; 3682 verifyFormat("Debug(\n" 3683 " aaaaa,\n" 3684 " {\n" 3685 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3686 " },\n" 3687 " a);", 3688 Style); 3689 3690 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3691 3692 verifyNoCrash("^{v^{a}}"); 3693 } 3694 3695 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3696 EXPECT_EQ("#define MACRO() \\\n" 3697 " Debug(aaa, /* force line break */ \\\n" 3698 " { \\\n" 3699 " int i; \\\n" 3700 " int j; \\\n" 3701 " })", 3702 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3703 " { int i; int j; })", 3704 getGoogleStyle())); 3705 3706 EXPECT_EQ("#define A \\\n" 3707 " [] { \\\n" 3708 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3709 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3710 " }", 3711 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3712 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3713 getGoogleStyle())); 3714 } 3715 3716 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3717 EXPECT_EQ("{}", format("{}")); 3718 verifyFormat("enum E {};"); 3719 verifyFormat("enum E {}"); 3720 FormatStyle Style = getLLVMStyle(); 3721 Style.SpaceInEmptyBlock = true; 3722 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 3723 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 3724 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 3725 } 3726 3727 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 3728 FormatStyle Style = getLLVMStyle(); 3729 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 3730 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 3731 verifyFormat("FOO_BEGIN\n" 3732 " FOO_ENTRY\n" 3733 "FOO_END", Style); 3734 verifyFormat("FOO_BEGIN\n" 3735 " NESTED_FOO_BEGIN\n" 3736 " NESTED_FOO_ENTRY\n" 3737 " NESTED_FOO_END\n" 3738 "FOO_END", Style); 3739 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 3740 " int x;\n" 3741 " x = 1;\n" 3742 "FOO_END(Baz)", Style); 3743 } 3744 3745 //===----------------------------------------------------------------------===// 3746 // Line break tests. 3747 //===----------------------------------------------------------------------===// 3748 3749 TEST_F(FormatTest, PreventConfusingIndents) { 3750 verifyFormat( 3751 "void f() {\n" 3752 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 3753 " parameter, parameter, parameter)),\n" 3754 " SecondLongCall(parameter));\n" 3755 "}"); 3756 verifyFormat( 3757 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3758 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3759 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3760 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 3761 verifyFormat( 3762 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3763 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 3764 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 3765 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 3766 verifyFormat( 3767 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 3768 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 3769 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 3770 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 3771 verifyFormat("int a = bbbb && ccc &&\n" 3772 " fffff(\n" 3773 "#define A Just forcing a new line\n" 3774 " ddd);"); 3775 } 3776 3777 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 3778 verifyFormat( 3779 "bool aaaaaaa =\n" 3780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 3781 " bbbbbbbb();"); 3782 verifyFormat( 3783 "bool aaaaaaa =\n" 3784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 3785 " bbbbbbbb();"); 3786 3787 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 3789 " ccccccccc == ddddddddddd;"); 3790 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3791 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 3792 " ccccccccc == ddddddddddd;"); 3793 verifyFormat( 3794 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 3795 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 3796 " ccccccccc == ddddddddddd;"); 3797 3798 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3799 " aaaaaa) &&\n" 3800 " bbbbbb && cccccc;"); 3801 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3802 " aaaaaa) >>\n" 3803 " bbbbbb;"); 3804 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 3805 " SourceMgr.getSpellingColumnNumber(\n" 3806 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 3807 " 1);"); 3808 3809 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3810 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 3811 " cccccc) {\n}"); 3812 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3813 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3814 " cccccc) {\n}"); 3815 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3816 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3817 " cccccc) {\n}"); 3818 verifyFormat("b = a &&\n" 3819 " // Comment\n" 3820 " b.c && d;"); 3821 3822 // If the LHS of a comparison is not a binary expression itself, the 3823 // additional linebreak confuses many people. 3824 verifyFormat( 3825 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3826 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 3827 "}"); 3828 verifyFormat( 3829 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3830 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3831 "}"); 3832 verifyFormat( 3833 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 3834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3835 "}"); 3836 verifyFormat( 3837 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3838 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 3839 "}"); 3840 // Even explicit parentheses stress the precedence enough to make the 3841 // additional break unnecessary. 3842 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3844 "}"); 3845 // This cases is borderline, but with the indentation it is still readable. 3846 verifyFormat( 3847 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3848 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3849 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 3850 "}", 3851 getLLVMStyleWithColumns(75)); 3852 3853 // If the LHS is a binary expression, we should still use the additional break 3854 // as otherwise the formatting hides the operator precedence. 3855 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3857 " 5) {\n" 3858 "}"); 3859 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3860 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 3861 " 5) {\n" 3862 "}"); 3863 3864 FormatStyle OnePerLine = getLLVMStyle(); 3865 OnePerLine.BinPackParameters = false; 3866 verifyFormat( 3867 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3868 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3869 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 3870 OnePerLine); 3871 3872 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 3873 " .aaa(aaaaaaaaaaaaa) *\n" 3874 " aaaaaaa +\n" 3875 " aaaaaaa;", 3876 getLLVMStyleWithColumns(40)); 3877 } 3878 3879 TEST_F(FormatTest, ExpressionIndentation) { 3880 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3882 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3883 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3884 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 3885 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 3886 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 3888 " ccccccccccccccccccccccccccccccccccccccccc;"); 3889 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3890 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3891 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3892 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3893 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3894 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3895 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3896 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3897 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3899 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3900 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3901 verifyFormat("if () {\n" 3902 "} else if (aaaaa && bbbbb > // break\n" 3903 " ccccc) {\n" 3904 "}"); 3905 verifyFormat("if () {\n" 3906 "} else if constexpr (aaaaa && bbbbb > // break\n" 3907 " ccccc) {\n" 3908 "}"); 3909 verifyFormat("if () {\n" 3910 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 3911 " ccccc) {\n" 3912 "}"); 3913 verifyFormat("if () {\n" 3914 "} else if (aaaaa &&\n" 3915 " bbbbb > // break\n" 3916 " ccccc &&\n" 3917 " ddddd) {\n" 3918 "}"); 3919 3920 // Presence of a trailing comment used to change indentation of b. 3921 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 3922 " b;\n" 3923 "return aaaaaaaaaaaaaaaaaaa +\n" 3924 " b; //", 3925 getLLVMStyleWithColumns(30)); 3926 } 3927 3928 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 3929 // Not sure what the best system is here. Like this, the LHS can be found 3930 // immediately above an operator (everything with the same or a higher 3931 // indent). The RHS is aligned right of the operator and so compasses 3932 // everything until something with the same indent as the operator is found. 3933 // FIXME: Is this a good system? 3934 FormatStyle Style = getLLVMStyle(); 3935 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 3936 verifyFormat( 3937 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3938 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3939 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3940 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3941 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3942 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3943 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3944 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3945 " > ccccccccccccccccccccccccccccccccccccccccc;", 3946 Style); 3947 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3948 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3949 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3950 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3951 Style); 3952 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3953 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3954 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3955 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3956 Style); 3957 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3958 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3959 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3960 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3961 Style); 3962 verifyFormat("if () {\n" 3963 "} else if (aaaaa\n" 3964 " && bbbbb // break\n" 3965 " > ccccc) {\n" 3966 "}", 3967 Style); 3968 verifyFormat("return (a)\n" 3969 " // comment\n" 3970 " + b;", 3971 Style); 3972 verifyFormat( 3973 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3974 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3975 " + cc;", 3976 Style); 3977 3978 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3979 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 3980 Style); 3981 3982 // Forced by comments. 3983 verifyFormat( 3984 "unsigned ContentSize =\n" 3985 " sizeof(int16_t) // DWARF ARange version number\n" 3986 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 3987 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 3988 " + sizeof(int8_t); // Segment Size (in bytes)"); 3989 3990 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 3991 " == boost::fusion::at_c<1>(iiii).second;", 3992 Style); 3993 3994 Style.ColumnLimit = 60; 3995 verifyFormat("zzzzzzzzzz\n" 3996 " = bbbbbbbbbbbbbbbbb\n" 3997 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 3998 Style); 3999 4000 Style.ColumnLimit = 80; 4001 Style.IndentWidth = 4; 4002 Style.TabWidth = 4; 4003 Style.UseTab = FormatStyle::UT_Always; 4004 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4005 Style.AlignOperands = false; 4006 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4007 "\t&& (someOtherLongishConditionPart1\n" 4008 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4009 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);", 4010 Style)); 4011 } 4012 4013 TEST_F(FormatTest, EnforcedOperatorWraps) { 4014 // Here we'd like to wrap after the || operators, but a comment is forcing an 4015 // earlier wrap. 4016 verifyFormat("bool x = aaaaa //\n" 4017 " || bbbbb\n" 4018 " //\n" 4019 " || cccc;"); 4020 } 4021 4022 TEST_F(FormatTest, NoOperandAlignment) { 4023 FormatStyle Style = getLLVMStyle(); 4024 Style.AlignOperands = false; 4025 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4028 Style); 4029 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4030 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4031 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4032 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4033 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4034 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4035 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4036 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4037 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4038 " > ccccccccccccccccccccccccccccccccccccccccc;", 4039 Style); 4040 4041 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4042 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4043 " + cc;", 4044 Style); 4045 verifyFormat("int a = aa\n" 4046 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4047 " * cccccccccccccccccccccccccccccccccccc;\n", 4048 Style); 4049 4050 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4051 verifyFormat("return (a > b\n" 4052 " // comment1\n" 4053 " // comment2\n" 4054 " || c);", 4055 Style); 4056 } 4057 4058 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4059 FormatStyle Style = getLLVMStyle(); 4060 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4061 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4063 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4064 Style); 4065 } 4066 4067 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4068 FormatStyle Style = getLLVMStyle(); 4069 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4070 Style.BinPackArguments = false; 4071 Style.ColumnLimit = 40; 4072 verifyFormat("void test() {\n" 4073 " someFunction(\n" 4074 " this + argument + is + quite\n" 4075 " + long + so + it + gets + wrapped\n" 4076 " + but + remains + bin - packed);\n" 4077 "}", 4078 Style); 4079 verifyFormat("void test() {\n" 4080 " someFunction(arg1,\n" 4081 " this + argument + is\n" 4082 " + quite + long + so\n" 4083 " + it + gets + wrapped\n" 4084 " + but + remains + bin\n" 4085 " - packed,\n" 4086 " arg3);\n" 4087 "}", 4088 Style); 4089 verifyFormat("void test() {\n" 4090 " someFunction(\n" 4091 " arg1,\n" 4092 " this + argument + has\n" 4093 " + anotherFunc(nested,\n" 4094 " calls + whose\n" 4095 " + arguments\n" 4096 " + are + also\n" 4097 " + wrapped,\n" 4098 " in + addition)\n" 4099 " + to + being + bin - packed,\n" 4100 " arg3);\n" 4101 "}", 4102 Style); 4103 4104 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4105 verifyFormat("void test() {\n" 4106 " someFunction(\n" 4107 " arg1,\n" 4108 " this + argument + has +\n" 4109 " anotherFunc(nested,\n" 4110 " calls + whose +\n" 4111 " arguments +\n" 4112 " are + also +\n" 4113 " wrapped,\n" 4114 " in + addition) +\n" 4115 " to + being + bin - packed,\n" 4116 " arg3);\n" 4117 "}", 4118 Style); 4119 } 4120 4121 TEST_F(FormatTest, ConstructorInitializers) { 4122 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4123 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4124 getLLVMStyleWithColumns(45)); 4125 verifyFormat("Constructor()\n" 4126 " : Inttializer(FitsOnTheLine) {}", 4127 getLLVMStyleWithColumns(44)); 4128 verifyFormat("Constructor()\n" 4129 " : Inttializer(FitsOnTheLine) {}", 4130 getLLVMStyleWithColumns(43)); 4131 4132 verifyFormat("template <typename T>\n" 4133 "Constructor() : Initializer(FitsOnTheLine) {}", 4134 getLLVMStyleWithColumns(45)); 4135 4136 verifyFormat( 4137 "SomeClass::Constructor()\n" 4138 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4139 4140 verifyFormat( 4141 "SomeClass::Constructor()\n" 4142 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4143 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4144 verifyFormat( 4145 "SomeClass::Constructor()\n" 4146 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4147 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4148 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4149 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4150 " : aaaaaaaaaa(aaaaaa) {}"); 4151 4152 verifyFormat("Constructor()\n" 4153 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4154 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4155 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4156 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4157 4158 verifyFormat("Constructor()\n" 4159 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4161 4162 verifyFormat("Constructor(int Parameter = 0)\n" 4163 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4164 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4165 verifyFormat("Constructor()\n" 4166 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4167 "}", 4168 getLLVMStyleWithColumns(60)); 4169 verifyFormat("Constructor()\n" 4170 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4171 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4172 4173 // Here a line could be saved by splitting the second initializer onto two 4174 // lines, but that is not desirable. 4175 verifyFormat("Constructor()\n" 4176 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4177 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4178 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4179 4180 FormatStyle OnePerLine = getLLVMStyle(); 4181 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4182 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4183 verifyFormat("SomeClass::Constructor()\n" 4184 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4185 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4186 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4187 OnePerLine); 4188 verifyFormat("SomeClass::Constructor()\n" 4189 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4190 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4191 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4192 OnePerLine); 4193 verifyFormat("MyClass::MyClass(int var)\n" 4194 " : some_var_(var), // 4 space indent\n" 4195 " some_other_var_(var + 1) { // lined up\n" 4196 "}", 4197 OnePerLine); 4198 verifyFormat("Constructor()\n" 4199 " : aaaaa(aaaaaa),\n" 4200 " aaaaa(aaaaaa),\n" 4201 " aaaaa(aaaaaa),\n" 4202 " aaaaa(aaaaaa),\n" 4203 " aaaaa(aaaaaa) {}", 4204 OnePerLine); 4205 verifyFormat("Constructor()\n" 4206 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4207 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4208 OnePerLine); 4209 OnePerLine.BinPackParameters = false; 4210 verifyFormat( 4211 "Constructor()\n" 4212 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4213 " aaaaaaaaaaa().aaa(),\n" 4214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4215 OnePerLine); 4216 OnePerLine.ColumnLimit = 60; 4217 verifyFormat("Constructor()\n" 4218 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4219 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4220 OnePerLine); 4221 4222 EXPECT_EQ("Constructor()\n" 4223 " : // Comment forcing unwanted break.\n" 4224 " aaaa(aaaa) {}", 4225 format("Constructor() :\n" 4226 " // Comment forcing unwanted break.\n" 4227 " aaaa(aaaa) {}")); 4228 } 4229 4230 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4231 FormatStyle Style = getLLVMStyle(); 4232 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4233 Style.ColumnLimit = 60; 4234 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4235 Style.AllowAllConstructorInitializersOnNextLine = true; 4236 Style.BinPackParameters = false; 4237 4238 for (int i = 0; i < 4; ++i) { 4239 // Test all combinations of parameters that should not have an effect. 4240 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4241 Style.AllowAllArgumentsOnNextLine = i & 2; 4242 4243 Style.AllowAllConstructorInitializersOnNextLine = true; 4244 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4245 verifyFormat("Constructor()\n" 4246 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4247 Style); 4248 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4249 4250 Style.AllowAllConstructorInitializersOnNextLine = false; 4251 verifyFormat("Constructor()\n" 4252 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4253 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4254 Style); 4255 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4256 4257 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4258 Style.AllowAllConstructorInitializersOnNextLine = true; 4259 verifyFormat("Constructor()\n" 4260 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4261 Style); 4262 4263 Style.AllowAllConstructorInitializersOnNextLine = false; 4264 verifyFormat("Constructor()\n" 4265 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4266 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4267 Style); 4268 4269 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4270 Style.AllowAllConstructorInitializersOnNextLine = true; 4271 verifyFormat("Constructor() :\n" 4272 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4273 Style); 4274 4275 Style.AllowAllConstructorInitializersOnNextLine = false; 4276 verifyFormat("Constructor() :\n" 4277 " aaaaaaaaaaaaaaaaaa(a),\n" 4278 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4279 Style); 4280 } 4281 4282 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4283 // AllowAllConstructorInitializersOnNextLine in all 4284 // BreakConstructorInitializers modes 4285 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4286 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4287 Style.AllowAllConstructorInitializersOnNextLine = false; 4288 verifyFormat("SomeClassWithALongName::Constructor(\n" 4289 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4290 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4291 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4292 Style); 4293 4294 Style.AllowAllConstructorInitializersOnNextLine = true; 4295 verifyFormat("SomeClassWithALongName::Constructor(\n" 4296 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4297 " int bbbbbbbbbbbbb,\n" 4298 " int cccccccccccccccc)\n" 4299 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4300 Style); 4301 4302 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4303 Style.AllowAllConstructorInitializersOnNextLine = false; 4304 verifyFormat("SomeClassWithALongName::Constructor(\n" 4305 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4306 " int bbbbbbbbbbbbb)\n" 4307 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4308 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4309 Style); 4310 4311 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4312 4313 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4314 verifyFormat("SomeClassWithALongName::Constructor(\n" 4315 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4316 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4317 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4318 Style); 4319 4320 Style.AllowAllConstructorInitializersOnNextLine = true; 4321 verifyFormat("SomeClassWithALongName::Constructor(\n" 4322 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4323 " int bbbbbbbbbbbbb,\n" 4324 " int cccccccccccccccc)\n" 4325 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4326 Style); 4327 4328 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4329 Style.AllowAllConstructorInitializersOnNextLine = false; 4330 verifyFormat("SomeClassWithALongName::Constructor(\n" 4331 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4332 " int bbbbbbbbbbbbb)\n" 4333 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4334 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4335 Style); 4336 4337 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4338 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4339 verifyFormat("SomeClassWithALongName::Constructor(\n" 4340 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4341 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4342 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4343 Style); 4344 4345 Style.AllowAllConstructorInitializersOnNextLine = true; 4346 verifyFormat("SomeClassWithALongName::Constructor(\n" 4347 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4348 " int bbbbbbbbbbbbb,\n" 4349 " int cccccccccccccccc) :\n" 4350 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4351 Style); 4352 4353 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4354 Style.AllowAllConstructorInitializersOnNextLine = false; 4355 verifyFormat("SomeClassWithALongName::Constructor(\n" 4356 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4357 " int bbbbbbbbbbbbb) :\n" 4358 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4359 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4360 Style); 4361 } 4362 4363 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4364 FormatStyle Style = getLLVMStyle(); 4365 Style.ColumnLimit = 60; 4366 Style.BinPackArguments = false; 4367 for (int i = 0; i < 4; ++i) { 4368 // Test all combinations of parameters that should not have an effect. 4369 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4370 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4371 4372 Style.AllowAllArgumentsOnNextLine = true; 4373 verifyFormat("void foo() {\n" 4374 " FunctionCallWithReallyLongName(\n" 4375 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4376 "}", 4377 Style); 4378 Style.AllowAllArgumentsOnNextLine = false; 4379 verifyFormat("void foo() {\n" 4380 " FunctionCallWithReallyLongName(\n" 4381 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4382 " bbbbbbbbbbbb);\n" 4383 "}", 4384 Style); 4385 4386 Style.AllowAllArgumentsOnNextLine = true; 4387 verifyFormat("void foo() {\n" 4388 " auto VariableWithReallyLongName = {\n" 4389 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4390 "}", 4391 Style); 4392 Style.AllowAllArgumentsOnNextLine = false; 4393 verifyFormat("void foo() {\n" 4394 " auto VariableWithReallyLongName = {\n" 4395 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4396 " bbbbbbbbbbbb};\n" 4397 "}", 4398 Style); 4399 } 4400 4401 // This parameter should not affect declarations. 4402 Style.BinPackParameters = false; 4403 Style.AllowAllArgumentsOnNextLine = false; 4404 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4405 verifyFormat("void FunctionCallWithReallyLongName(\n" 4406 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4407 Style); 4408 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4409 verifyFormat("void FunctionCallWithReallyLongName(\n" 4410 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4411 " int bbbbbbbbbbbb);", 4412 Style); 4413 } 4414 4415 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4416 FormatStyle Style = getLLVMStyle(); 4417 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4418 4419 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4420 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4421 getStyleWithColumns(Style, 45)); 4422 verifyFormat("Constructor() :\n" 4423 " Initializer(FitsOnTheLine) {}", 4424 getStyleWithColumns(Style, 44)); 4425 verifyFormat("Constructor() :\n" 4426 " Initializer(FitsOnTheLine) {}", 4427 getStyleWithColumns(Style, 43)); 4428 4429 verifyFormat("template <typename T>\n" 4430 "Constructor() : Initializer(FitsOnTheLine) {}", 4431 getStyleWithColumns(Style, 50)); 4432 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4433 verifyFormat( 4434 "SomeClass::Constructor() :\n" 4435 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4436 Style); 4437 4438 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4439 verifyFormat( 4440 "SomeClass::Constructor() :\n" 4441 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4442 Style); 4443 4444 verifyFormat( 4445 "SomeClass::Constructor() :\n" 4446 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4447 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4448 Style); 4449 verifyFormat( 4450 "SomeClass::Constructor() :\n" 4451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4452 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4453 Style); 4454 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4455 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4456 " aaaaaaaaaa(aaaaaa) {}", 4457 Style); 4458 4459 verifyFormat("Constructor() :\n" 4460 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4461 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4462 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4463 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4464 Style); 4465 4466 verifyFormat("Constructor() :\n" 4467 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4468 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4469 Style); 4470 4471 verifyFormat("Constructor(int Parameter = 0) :\n" 4472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4473 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4474 Style); 4475 verifyFormat("Constructor() :\n" 4476 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4477 "}", 4478 getStyleWithColumns(Style, 60)); 4479 verifyFormat("Constructor() :\n" 4480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4481 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4482 Style); 4483 4484 // Here a line could be saved by splitting the second initializer onto two 4485 // lines, but that is not desirable. 4486 verifyFormat("Constructor() :\n" 4487 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4488 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4489 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4490 Style); 4491 4492 FormatStyle OnePerLine = Style; 4493 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4494 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4495 verifyFormat("SomeClass::Constructor() :\n" 4496 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4497 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4498 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4499 OnePerLine); 4500 verifyFormat("SomeClass::Constructor() :\n" 4501 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4502 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4503 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4504 OnePerLine); 4505 verifyFormat("MyClass::MyClass(int var) :\n" 4506 " some_var_(var), // 4 space indent\n" 4507 " some_other_var_(var + 1) { // lined up\n" 4508 "}", 4509 OnePerLine); 4510 verifyFormat("Constructor() :\n" 4511 " aaaaa(aaaaaa),\n" 4512 " aaaaa(aaaaaa),\n" 4513 " aaaaa(aaaaaa),\n" 4514 " aaaaa(aaaaaa),\n" 4515 " aaaaa(aaaaaa) {}", 4516 OnePerLine); 4517 verifyFormat("Constructor() :\n" 4518 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4519 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4520 OnePerLine); 4521 OnePerLine.BinPackParameters = false; 4522 verifyFormat( 4523 "Constructor() :\n" 4524 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4525 " aaaaaaaaaaa().aaa(),\n" 4526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4527 OnePerLine); 4528 OnePerLine.ColumnLimit = 60; 4529 verifyFormat("Constructor() :\n" 4530 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4531 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4532 OnePerLine); 4533 4534 EXPECT_EQ("Constructor() :\n" 4535 " // Comment forcing unwanted break.\n" 4536 " aaaa(aaaa) {}", 4537 format("Constructor() :\n" 4538 " // Comment forcing unwanted break.\n" 4539 " aaaa(aaaa) {}", 4540 Style)); 4541 4542 Style.ColumnLimit = 0; 4543 verifyFormat("SomeClass::Constructor() :\n" 4544 " a(a) {}", 4545 Style); 4546 verifyFormat("SomeClass::Constructor() noexcept :\n" 4547 " a(a) {}", 4548 Style); 4549 verifyFormat("SomeClass::Constructor() :\n" 4550 " a(a), b(b), c(c) {}", 4551 Style); 4552 verifyFormat("SomeClass::Constructor() :\n" 4553 " a(a) {\n" 4554 " foo();\n" 4555 " bar();\n" 4556 "}", 4557 Style); 4558 4559 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4560 verifyFormat("SomeClass::Constructor() :\n" 4561 " a(a), b(b), c(c) {\n" 4562 "}", 4563 Style); 4564 verifyFormat("SomeClass::Constructor() :\n" 4565 " a(a) {\n" 4566 "}", 4567 Style); 4568 4569 Style.ColumnLimit = 80; 4570 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4571 Style.ConstructorInitializerIndentWidth = 2; 4572 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", 4573 Style); 4574 verifyFormat("SomeClass::Constructor() :\n" 4575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4576 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4577 Style); 4578 4579 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well 4580 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4581 verifyFormat("class SomeClass\n" 4582 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4583 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4584 Style); 4585 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4586 verifyFormat("class SomeClass\n" 4587 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4588 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4589 Style); 4590 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4591 verifyFormat("class SomeClass :\n" 4592 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4593 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4594 Style); 4595 } 4596 4597 #ifndef EXPENSIVE_CHECKS 4598 // Expensive checks enables libstdc++ checking which includes validating the 4599 // state of ranges used in std::priority_queue - this blows out the 4600 // runtime/scalability of the function and makes this test unacceptably slow. 4601 TEST_F(FormatTest, MemoizationTests) { 4602 // This breaks if the memoization lookup does not take \c Indent and 4603 // \c LastSpace into account. 4604 verifyFormat( 4605 "extern CFRunLoopTimerRef\n" 4606 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4607 " CFTimeInterval interval, CFOptionFlags flags,\n" 4608 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4609 " CFRunLoopTimerContext *context) {}"); 4610 4611 // Deep nesting somewhat works around our memoization. 4612 verifyFormat( 4613 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4614 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4615 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4616 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4617 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4618 getLLVMStyleWithColumns(65)); 4619 verifyFormat( 4620 "aaaaa(\n" 4621 " aaaaa,\n" 4622 " aaaaa(\n" 4623 " aaaaa,\n" 4624 " aaaaa(\n" 4625 " aaaaa,\n" 4626 " aaaaa(\n" 4627 " aaaaa,\n" 4628 " aaaaa(\n" 4629 " aaaaa,\n" 4630 " aaaaa(\n" 4631 " aaaaa,\n" 4632 " aaaaa(\n" 4633 " aaaaa,\n" 4634 " aaaaa(\n" 4635 " aaaaa,\n" 4636 " aaaaa(\n" 4637 " aaaaa,\n" 4638 " aaaaa(\n" 4639 " aaaaa,\n" 4640 " aaaaa(\n" 4641 " aaaaa,\n" 4642 " aaaaa(\n" 4643 " aaaaa,\n" 4644 " aaaaa))))))))))));", 4645 getLLVMStyleWithColumns(65)); 4646 verifyFormat( 4647 "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" 4648 " a),\n" 4649 " a),\n" 4650 " a),\n" 4651 " a),\n" 4652 " a),\n" 4653 " a),\n" 4654 " a),\n" 4655 " a),\n" 4656 " a),\n" 4657 " a),\n" 4658 " a),\n" 4659 " a),\n" 4660 " a),\n" 4661 " a),\n" 4662 " a),\n" 4663 " a),\n" 4664 " a)", 4665 getLLVMStyleWithColumns(65)); 4666 4667 // This test takes VERY long when memoization is broken. 4668 FormatStyle OnePerLine = getLLVMStyle(); 4669 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4670 OnePerLine.BinPackParameters = false; 4671 std::string input = "Constructor()\n" 4672 " : aaaa(a,\n"; 4673 for (unsigned i = 0, e = 80; i != e; ++i) { 4674 input += " a,\n"; 4675 } 4676 input += " a) {}"; 4677 verifyFormat(input, OnePerLine); 4678 } 4679 #endif 4680 4681 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4682 verifyFormat( 4683 "void f() {\n" 4684 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4685 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4686 " f();\n" 4687 "}"); 4688 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4689 " Intervals[i - 1].getRange().getLast()) {\n}"); 4690 } 4691 4692 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4693 // Principially, we break function declarations in a certain order: 4694 // 1) break amongst arguments. 4695 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 4696 " Cccccccccccccc cccccccccccccc);"); 4697 verifyFormat("template <class TemplateIt>\n" 4698 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 4699 " TemplateIt *stop) {}"); 4700 4701 // 2) break after return type. 4702 verifyFormat( 4703 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4704 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 4705 getGoogleStyle()); 4706 4707 // 3) break after (. 4708 verifyFormat( 4709 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 4710 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 4711 getGoogleStyle()); 4712 4713 // 4) break before after nested name specifiers. 4714 verifyFormat( 4715 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4716 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 4717 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 4718 getGoogleStyle()); 4719 4720 // However, there are exceptions, if a sufficient amount of lines can be 4721 // saved. 4722 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 4723 // more adjusting. 4724 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4725 " Cccccccccccccc cccccccccc,\n" 4726 " Cccccccccccccc cccccccccc,\n" 4727 " Cccccccccccccc cccccccccc,\n" 4728 " Cccccccccccccc cccccccccc);"); 4729 verifyFormat( 4730 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4731 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4732 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4733 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 4734 getGoogleStyle()); 4735 verifyFormat( 4736 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4737 " Cccccccccccccc cccccccccc,\n" 4738 " Cccccccccccccc cccccccccc,\n" 4739 " Cccccccccccccc cccccccccc,\n" 4740 " Cccccccccccccc cccccccccc,\n" 4741 " Cccccccccccccc cccccccccc,\n" 4742 " Cccccccccccccc cccccccccc);"); 4743 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4744 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4745 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4746 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4747 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 4748 4749 // Break after multi-line parameters. 4750 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4753 " bbbb bbbb);"); 4754 verifyFormat("void SomeLoooooooooooongFunction(\n" 4755 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 4756 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4757 " int bbbbbbbbbbbbb);"); 4758 4759 // Treat overloaded operators like other functions. 4760 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4761 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 4762 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4763 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 4764 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4765 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 4766 verifyGoogleFormat( 4767 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 4768 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4769 verifyGoogleFormat( 4770 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 4771 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4772 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4773 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4774 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 4775 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4776 verifyGoogleFormat( 4777 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 4778 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4779 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 4780 verifyGoogleFormat( 4781 "template <typename T>\n" 4782 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4783 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 4784 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 4785 4786 FormatStyle Style = getLLVMStyle(); 4787 Style.PointerAlignment = FormatStyle::PAS_Left; 4788 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4789 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 4790 Style); 4791 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 4792 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4793 Style); 4794 } 4795 4796 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 4797 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 4798 // Prefer keeping `::` followed by `operator` together. 4799 EXPECT_EQ("const aaaa::bbbbbbb &\n" 4800 "ccccccccc::operator++() {\n" 4801 " stuff();\n" 4802 "}", 4803 format("const aaaa::bbbbbbb\n" 4804 "&ccccccccc::operator++() { stuff(); }", 4805 getLLVMStyleWithColumns(40))); 4806 } 4807 4808 TEST_F(FormatTest, TrailingReturnType) { 4809 verifyFormat("auto foo() -> int;\n"); 4810 verifyFormat("struct S {\n" 4811 " auto bar() const -> int;\n" 4812 "};"); 4813 verifyFormat("template <size_t Order, typename T>\n" 4814 "auto load_img(const std::string &filename)\n" 4815 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 4816 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 4817 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 4818 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 4819 verifyFormat("template <typename T>\n" 4820 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 4821 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 4822 4823 // Not trailing return types. 4824 verifyFormat("void f() { auto a = b->c(); }"); 4825 } 4826 4827 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 4828 // Avoid breaking before trailing 'const' or other trailing annotations, if 4829 // they are not function-like. 4830 FormatStyle Style = getGoogleStyle(); 4831 Style.ColumnLimit = 47; 4832 verifyFormat("void someLongFunction(\n" 4833 " int someLoooooooooooooongParameter) const {\n}", 4834 getLLVMStyleWithColumns(47)); 4835 verifyFormat("LoooooongReturnType\n" 4836 "someLoooooooongFunction() const {}", 4837 getLLVMStyleWithColumns(47)); 4838 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 4839 " const {}", 4840 Style); 4841 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4842 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 4843 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4844 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 4845 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4846 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 4847 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 4848 " aaaaaaaaaaa aaaaa) const override;"); 4849 verifyGoogleFormat( 4850 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4851 " const override;"); 4852 4853 // Even if the first parameter has to be wrapped. 4854 verifyFormat("void someLongFunction(\n" 4855 " int someLongParameter) const {}", 4856 getLLVMStyleWithColumns(46)); 4857 verifyFormat("void someLongFunction(\n" 4858 " int someLongParameter) const {}", 4859 Style); 4860 verifyFormat("void someLongFunction(\n" 4861 " int someLongParameter) override {}", 4862 Style); 4863 verifyFormat("void someLongFunction(\n" 4864 " int someLongParameter) OVERRIDE {}", 4865 Style); 4866 verifyFormat("void someLongFunction(\n" 4867 " int someLongParameter) final {}", 4868 Style); 4869 verifyFormat("void someLongFunction(\n" 4870 " int someLongParameter) FINAL {}", 4871 Style); 4872 verifyFormat("void someLongFunction(\n" 4873 " int parameter) const override {}", 4874 Style); 4875 4876 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 4877 verifyFormat("void someLongFunction(\n" 4878 " int someLongParameter) const\n" 4879 "{\n" 4880 "}", 4881 Style); 4882 4883 // Unless these are unknown annotations. 4884 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 4885 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4886 " LONG_AND_UGLY_ANNOTATION;"); 4887 4888 // Breaking before function-like trailing annotations is fine to keep them 4889 // close to their arguments. 4890 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4891 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4892 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4893 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4894 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4895 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 4896 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 4897 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 4898 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 4899 4900 verifyFormat( 4901 "void aaaaaaaaaaaaaaaaaa()\n" 4902 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 4903 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 4904 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4905 " __attribute__((unused));"); 4906 verifyGoogleFormat( 4907 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4908 " GUARDED_BY(aaaaaaaaaaaa);"); 4909 verifyGoogleFormat( 4910 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4911 " GUARDED_BY(aaaaaaaaaaaa);"); 4912 verifyGoogleFormat( 4913 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4914 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4915 verifyGoogleFormat( 4916 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4917 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4918 } 4919 4920 TEST_F(FormatTest, FunctionAnnotations) { 4921 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4922 "int OldFunction(const string ¶meter) {}"); 4923 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4924 "string OldFunction(const string ¶meter) {}"); 4925 verifyFormat("template <typename T>\n" 4926 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4927 "string OldFunction(const string ¶meter) {}"); 4928 4929 // Not function annotations. 4930 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4931 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 4932 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 4933 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 4934 verifyFormat("MACRO(abc).function() // wrap\n" 4935 " << abc;"); 4936 verifyFormat("MACRO(abc)->function() // wrap\n" 4937 " << abc;"); 4938 verifyFormat("MACRO(abc)::function() // wrap\n" 4939 " << abc;"); 4940 } 4941 4942 TEST_F(FormatTest, BreaksDesireably) { 4943 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4944 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4945 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 4946 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 4948 "}"); 4949 4950 verifyFormat( 4951 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4953 4954 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4955 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4956 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4957 4958 verifyFormat( 4959 "aaaaaaaa(aaaaaaaaaaaaa,\n" 4960 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 4962 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 4964 4965 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4966 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4967 4968 verifyFormat( 4969 "void f() {\n" 4970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 4971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 4972 "}"); 4973 verifyFormat( 4974 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4976 verifyFormat( 4977 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4978 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4979 verifyFormat( 4980 "aaaaaa(aaa,\n" 4981 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4982 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4983 " aaaa);"); 4984 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4986 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4987 4988 // Indent consistently independent of call expression and unary operator. 4989 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4990 " dddddddddddddddddddddddddddddd));"); 4991 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4992 " dddddddddddddddddddddddddddddd));"); 4993 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 4994 " dddddddddddddddddddddddddddddd));"); 4995 4996 // This test case breaks on an incorrect memoization, i.e. an optimization not 4997 // taking into account the StopAt value. 4998 verifyFormat( 4999 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5000 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5001 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5002 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5003 5004 verifyFormat("{\n {\n {\n" 5005 " Annotation.SpaceRequiredBefore =\n" 5006 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5007 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5008 " }\n }\n}"); 5009 5010 // Break on an outer level if there was a break on an inner level. 5011 EXPECT_EQ("f(g(h(a, // comment\n" 5012 " b, c),\n" 5013 " d, e),\n" 5014 " x, y);", 5015 format("f(g(h(a, // comment\n" 5016 " b, c), d, e), x, y);")); 5017 5018 // Prefer breaking similar line breaks. 5019 verifyFormat( 5020 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5021 " NSTrackingMouseEnteredAndExited |\n" 5022 " NSTrackingActiveAlways;"); 5023 } 5024 5025 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5026 FormatStyle NoBinPacking = getGoogleStyle(); 5027 NoBinPacking.BinPackParameters = false; 5028 NoBinPacking.BinPackArguments = true; 5029 verifyFormat("void f() {\n" 5030 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5032 "}", 5033 NoBinPacking); 5034 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5035 " int aaaaaaaaaaaaaaaaaaaa,\n" 5036 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5037 NoBinPacking); 5038 5039 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5040 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5041 " vector<int> bbbbbbbbbbbbbbb);", 5042 NoBinPacking); 5043 // FIXME: This behavior difference is probably not wanted. However, currently 5044 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5045 // template arguments from BreakBeforeParameter being set because of the 5046 // one-per-line formatting. 5047 verifyFormat( 5048 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5049 " aaaaaaaaaa> aaaaaaaaaa);", 5050 NoBinPacking); 5051 verifyFormat( 5052 "void fffffffffff(\n" 5053 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5054 " aaaaaaaaaa);"); 5055 } 5056 5057 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5058 FormatStyle NoBinPacking = getGoogleStyle(); 5059 NoBinPacking.BinPackParameters = false; 5060 NoBinPacking.BinPackArguments = false; 5061 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5062 " aaaaaaaaaaaaaaaaaaaa,\n" 5063 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5064 NoBinPacking); 5065 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5066 " aaaaaaaaaaaaa,\n" 5067 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5068 NoBinPacking); 5069 verifyFormat( 5070 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5071 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5073 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5075 NoBinPacking); 5076 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5077 " .aaaaaaaaaaaaaaaaaa();", 5078 NoBinPacking); 5079 verifyFormat("void f() {\n" 5080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5081 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5082 "}", 5083 NoBinPacking); 5084 5085 verifyFormat( 5086 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5087 " aaaaaaaaaaaa,\n" 5088 " aaaaaaaaaaaa);", 5089 NoBinPacking); 5090 verifyFormat( 5091 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5092 " ddddddddddddddddddddddddddddd),\n" 5093 " test);", 5094 NoBinPacking); 5095 5096 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5097 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5098 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5099 " aaaaaaaaaaaaaaaaaa;", 5100 NoBinPacking); 5101 verifyFormat("a(\"a\"\n" 5102 " \"a\",\n" 5103 " a);"); 5104 5105 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5106 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5107 " aaaaaaaaa,\n" 5108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5109 NoBinPacking); 5110 verifyFormat( 5111 "void f() {\n" 5112 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5113 " .aaaaaaa();\n" 5114 "}", 5115 NoBinPacking); 5116 verifyFormat( 5117 "template <class SomeType, class SomeOtherType>\n" 5118 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5119 NoBinPacking); 5120 } 5121 5122 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5123 FormatStyle Style = getLLVMStyleWithColumns(15); 5124 Style.ExperimentalAutoDetectBinPacking = true; 5125 EXPECT_EQ("aaa(aaaa,\n" 5126 " aaaa,\n" 5127 " aaaa);\n" 5128 "aaa(aaaa,\n" 5129 " aaaa,\n" 5130 " aaaa);", 5131 format("aaa(aaaa,\n" // one-per-line 5132 " aaaa,\n" 5133 " aaaa );\n" 5134 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5135 Style)); 5136 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5137 " aaaa);\n" 5138 "aaa(aaaa, aaaa,\n" 5139 " aaaa);", 5140 format("aaa(aaaa, aaaa,\n" // bin-packed 5141 " aaaa );\n" 5142 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5143 Style)); 5144 } 5145 5146 TEST_F(FormatTest, FormatsBuilderPattern) { 5147 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5148 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5149 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5150 " .StartsWith(\".init\", ORDER_INIT)\n" 5151 " .StartsWith(\".fini\", ORDER_FINI)\n" 5152 " .StartsWith(\".hash\", ORDER_HASH)\n" 5153 " .Default(ORDER_TEXT);\n"); 5154 5155 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5156 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5157 verifyFormat( 5158 "aaaaaaa->aaaaaaa\n" 5159 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5161 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5162 verifyFormat( 5163 "aaaaaaa->aaaaaaa\n" 5164 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5165 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5166 verifyFormat( 5167 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5168 " aaaaaaaaaaaaaa);"); 5169 verifyFormat( 5170 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5171 " aaaaaa->aaaaaaaaaaaa()\n" 5172 " ->aaaaaaaaaaaaaaaa(\n" 5173 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5174 " ->aaaaaaaaaaaaaaaaa();"); 5175 verifyGoogleFormat( 5176 "void f() {\n" 5177 " someo->Add((new util::filetools::Handler(dir))\n" 5178 " ->OnEvent1(NewPermanentCallback(\n" 5179 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5180 " ->OnEvent2(NewPermanentCallback(\n" 5181 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5182 " ->OnEvent3(NewPermanentCallback(\n" 5183 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5184 " ->OnEvent5(NewPermanentCallback(\n" 5185 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5186 " ->OnEvent6(NewPermanentCallback(\n" 5187 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5188 "}"); 5189 5190 verifyFormat( 5191 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5192 verifyFormat("aaaaaaaaaaaaaaa()\n" 5193 " .aaaaaaaaaaaaaaa()\n" 5194 " .aaaaaaaaaaaaaaa()\n" 5195 " .aaaaaaaaaaaaaaa()\n" 5196 " .aaaaaaaaaaaaaaa();"); 5197 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5198 " .aaaaaaaaaaaaaaa()\n" 5199 " .aaaaaaaaaaaaaaa()\n" 5200 " .aaaaaaaaaaaaaaa();"); 5201 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5202 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5203 " .aaaaaaaaaaaaaaa();"); 5204 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5205 " ->aaaaaaaaaaaaaae(0)\n" 5206 " ->aaaaaaaaaaaaaaa();"); 5207 5208 // Don't linewrap after very short segments. 5209 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5210 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5211 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5212 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5213 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5214 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5215 verifyFormat("aaa()\n" 5216 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5217 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5218 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5219 5220 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5221 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5222 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5223 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5224 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5226 5227 // Prefer not to break after empty parentheses. 5228 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5229 " First->LastNewlineOffset);"); 5230 5231 // Prefer not to create "hanging" indents. 5232 verifyFormat( 5233 "return !soooooooooooooome_map\n" 5234 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5235 " .second;"); 5236 verifyFormat( 5237 "return aaaaaaaaaaaaaaaa\n" 5238 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5239 " .aaaa(aaaaaaaaaaaaaa);"); 5240 // No hanging indent here. 5241 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5243 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5244 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5245 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5246 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5247 getLLVMStyleWithColumns(60)); 5248 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5249 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5250 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5251 getLLVMStyleWithColumns(59)); 5252 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5253 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5254 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5255 5256 // Dont break if only closing statements before member call 5257 verifyFormat("test() {\n" 5258 " ([]() -> {\n" 5259 " int b = 32;\n" 5260 " return 3;\n" 5261 " }).foo();\n" 5262 "}"); 5263 verifyFormat("test() {\n" 5264 " (\n" 5265 " []() -> {\n" 5266 " int b = 32;\n" 5267 " return 3;\n" 5268 " },\n" 5269 " foo, bar)\n" 5270 " .foo();\n" 5271 "}"); 5272 verifyFormat("test() {\n" 5273 " ([]() -> {\n" 5274 " int b = 32;\n" 5275 " return 3;\n" 5276 " })\n" 5277 " .foo()\n" 5278 " .bar();\n" 5279 "}"); 5280 verifyFormat("test() {\n" 5281 " ([]() -> {\n" 5282 " int b = 32;\n" 5283 " return 3;\n" 5284 " })\n" 5285 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5286 " \"bbbb\");\n" 5287 "}", 5288 getLLVMStyleWithColumns(30)); 5289 } 5290 5291 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5292 verifyFormat( 5293 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5294 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5295 verifyFormat( 5296 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5297 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5298 5299 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5300 " ccccccccccccccccccccccccc) {\n}"); 5301 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5302 " ccccccccccccccccccccccccc) {\n}"); 5303 5304 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5305 " ccccccccccccccccccccccccc) {\n}"); 5306 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5307 " ccccccccccccccccccccccccc) {\n}"); 5308 5309 verifyFormat( 5310 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5311 " ccccccccccccccccccccccccc) {\n}"); 5312 verifyFormat( 5313 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5314 " ccccccccccccccccccccccccc) {\n}"); 5315 5316 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5317 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5318 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5319 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5320 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5321 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5322 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5323 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5324 5325 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5326 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5327 " aaaaaaaaaaaaaaa != aa) {\n}"); 5328 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5329 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5330 " aaaaaaaaaaaaaaa != aa) {\n}"); 5331 } 5332 5333 TEST_F(FormatTest, BreaksAfterAssignments) { 5334 verifyFormat( 5335 "unsigned Cost =\n" 5336 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5337 " SI->getPointerAddressSpaceee());\n"); 5338 verifyFormat( 5339 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5340 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5341 5342 verifyFormat( 5343 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5344 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5345 verifyFormat("unsigned OriginalStartColumn =\n" 5346 " SourceMgr.getSpellingColumnNumber(\n" 5347 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5348 " 1;"); 5349 } 5350 5351 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5352 FormatStyle Style = getLLVMStyle(); 5353 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5354 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5355 Style); 5356 5357 Style.PenaltyBreakAssignment = 20; 5358 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5359 " cccccccccccccccccccccccccc;", 5360 Style); 5361 } 5362 5363 TEST_F(FormatTest, AlignsAfterAssignments) { 5364 verifyFormat( 5365 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5366 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5367 verifyFormat( 5368 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5369 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5370 verifyFormat( 5371 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5372 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5373 verifyFormat( 5374 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5375 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5376 verifyFormat( 5377 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5378 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5379 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5380 } 5381 5382 TEST_F(FormatTest, AlignsAfterReturn) { 5383 verifyFormat( 5384 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5385 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5386 verifyFormat( 5387 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5388 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5389 verifyFormat( 5390 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5391 " aaaaaaaaaaaaaaaaaaaaaa();"); 5392 verifyFormat( 5393 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5394 " aaaaaaaaaaaaaaaaaaaaaa());"); 5395 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5396 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5397 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5400 verifyFormat("return\n" 5401 " // true if code is one of a or b.\n" 5402 " code == a || code == b;"); 5403 } 5404 5405 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5406 verifyFormat( 5407 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5408 " aaaaaaaaa aaaaaaa) {}"); 5409 verifyFormat( 5410 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5411 " aaaaaaaaaaa aaaaaaaaa);"); 5412 verifyFormat( 5413 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5414 " aaaaaaaaaaaaaaaaaaaaa));"); 5415 FormatStyle Style = getLLVMStyle(); 5416 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5417 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5418 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5419 Style); 5420 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5421 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5422 Style); 5423 verifyFormat("SomeLongVariableName->someFunction(\n" 5424 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5425 Style); 5426 verifyFormat( 5427 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5428 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5429 Style); 5430 verifyFormat( 5431 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5432 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5433 Style); 5434 verifyFormat( 5435 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5436 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5437 Style); 5438 5439 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5440 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5441 " b));", 5442 Style); 5443 5444 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5445 Style.BinPackArguments = false; 5446 Style.BinPackParameters = false; 5447 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5448 " aaaaaaaaaaa aaaaaaaa,\n" 5449 " aaaaaaaaa aaaaaaa,\n" 5450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5451 Style); 5452 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5453 " aaaaaaaaaaa aaaaaaaaa,\n" 5454 " aaaaaaaaaaa aaaaaaaaa,\n" 5455 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5456 Style); 5457 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5458 " aaaaaaaaaaaaaaa,\n" 5459 " aaaaaaaaaaaaaaaaaaaaa,\n" 5460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5461 Style); 5462 verifyFormat( 5463 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5464 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5465 Style); 5466 verifyFormat( 5467 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5468 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5469 Style); 5470 verifyFormat( 5471 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5472 " aaaaaaaaaaaaaaaaaaaaa(\n" 5473 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5474 " aaaaaaaaaaaaaaaa);", 5475 Style); 5476 verifyFormat( 5477 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5478 " aaaaaaaaaaaaaaaaaaaaa(\n" 5479 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5480 " aaaaaaaaaaaaaaaa);", 5481 Style); 5482 } 5483 5484 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5485 FormatStyle Style = getLLVMStyleWithColumns(40); 5486 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5487 " bbbbbbbbbbbbbbbbbbbbbb);", 5488 Style); 5489 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5490 Style.AlignOperands = false; 5491 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5492 " bbbbbbbbbbbbbbbbbbbbbb);", 5493 Style); 5494 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5495 Style.AlignOperands = true; 5496 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5497 " bbbbbbbbbbbbbbbbbbbbbb);", 5498 Style); 5499 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5500 Style.AlignOperands = false; 5501 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5502 " bbbbbbbbbbbbbbbbbbbbbb);", 5503 Style); 5504 } 5505 5506 TEST_F(FormatTest, BreaksConditionalExpressions) { 5507 verifyFormat( 5508 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5509 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5510 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5511 verifyFormat( 5512 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5513 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5514 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5515 verifyFormat( 5516 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5517 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5518 verifyFormat( 5519 "aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5520 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5521 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5522 verifyFormat( 5523 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5524 " : aaaaaaaaaaaaa);"); 5525 verifyFormat( 5526 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5527 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5528 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5529 " aaaaaaaaaaaaa);"); 5530 verifyFormat( 5531 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5532 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5533 " aaaaaaaaaaaaa);"); 5534 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5535 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5536 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5537 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5539 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5540 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5541 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5542 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5543 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5544 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5545 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5546 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5548 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5550 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5551 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5552 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5553 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5554 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5555 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5556 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5557 " : aaaaaaaaaaaaaaaa;"); 5558 verifyFormat( 5559 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5560 " ? aaaaaaaaaaaaaaa\n" 5561 " : aaaaaaaaaaaaaaa;"); 5562 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5563 " aaaaaaaaa\n" 5564 " ? b\n" 5565 " : c);"); 5566 verifyFormat("return aaaa == bbbb\n" 5567 " // comment\n" 5568 " ? aaaa\n" 5569 " : bbbb;"); 5570 verifyFormat("unsigned Indent =\n" 5571 " format(TheLine.First,\n" 5572 " IndentForLevel[TheLine.Level] >= 0\n" 5573 " ? IndentForLevel[TheLine.Level]\n" 5574 " : TheLine * 2,\n" 5575 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5576 getLLVMStyleWithColumns(60)); 5577 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5578 " ? aaaaaaaaaaaaaaa\n" 5579 " : bbbbbbbbbbbbbbb //\n" 5580 " ? ccccccccccccccc\n" 5581 " : ddddddddddddddd;"); 5582 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5583 " ? aaaaaaaaaaaaaaa\n" 5584 " : (bbbbbbbbbbbbbbb //\n" 5585 " ? ccccccccccccccc\n" 5586 " : ddddddddddddddd);"); 5587 verifyFormat( 5588 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5589 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5590 " aaaaaaaaaaaaaaaaaaaaa +\n" 5591 " aaaaaaaaaaaaaaaaaaaaa\n" 5592 " : aaaaaaaaaa;"); 5593 verifyFormat( 5594 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5595 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5596 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5597 5598 FormatStyle NoBinPacking = getLLVMStyle(); 5599 NoBinPacking.BinPackArguments = false; 5600 verifyFormat( 5601 "void f() {\n" 5602 " g(aaa,\n" 5603 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5605 " ? aaaaaaaaaaaaaaa\n" 5606 " : aaaaaaaaaaaaaaa);\n" 5607 "}", 5608 NoBinPacking); 5609 verifyFormat( 5610 "void f() {\n" 5611 " g(aaa,\n" 5612 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5614 " ?: aaaaaaaaaaaaaaa);\n" 5615 "}", 5616 NoBinPacking); 5617 5618 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5619 " // comment.\n" 5620 " ccccccccccccccccccccccccccccccccccccccc\n" 5621 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5622 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5623 5624 // Assignments in conditional expressions. Apparently not uncommon :-(. 5625 verifyFormat("return a != b\n" 5626 " // comment\n" 5627 " ? a = b\n" 5628 " : a = b;"); 5629 verifyFormat("return a != b\n" 5630 " // comment\n" 5631 " ? a = a != b\n" 5632 " // comment\n" 5633 " ? a = b\n" 5634 " : a\n" 5635 " : a;\n"); 5636 verifyFormat("return a != b\n" 5637 " // comment\n" 5638 " ? a\n" 5639 " : a = a != b\n" 5640 " // comment\n" 5641 " ? a = b\n" 5642 " : a;"); 5643 } 5644 5645 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5646 FormatStyle Style = getLLVMStyle(); 5647 Style.BreakBeforeTernaryOperators = false; 5648 Style.ColumnLimit = 70; 5649 verifyFormat( 5650 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5651 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5652 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5653 Style); 5654 verifyFormat( 5655 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5656 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5657 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5658 Style); 5659 verifyFormat( 5660 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5661 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5662 Style); 5663 verifyFormat( 5664 "aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5665 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5666 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5667 Style); 5668 verifyFormat( 5669 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 5670 " aaaaaaaaaaaaa);", 5671 Style); 5672 verifyFormat( 5673 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5674 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5676 " aaaaaaaaaaaaa);", 5677 Style); 5678 verifyFormat( 5679 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5680 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5681 " aaaaaaaaaaaaa);", 5682 Style); 5683 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5688 Style); 5689 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5691 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5695 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5696 Style); 5697 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5698 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 5699 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5701 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5702 Style); 5703 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5704 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5705 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5706 Style); 5707 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5708 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5711 Style); 5712 verifyFormat( 5713 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5714 " aaaaaaaaaaaaaaa :\n" 5715 " aaaaaaaaaaaaaaa;", 5716 Style); 5717 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5718 " aaaaaaaaa ?\n" 5719 " b :\n" 5720 " c);", 5721 Style); 5722 verifyFormat("unsigned Indent =\n" 5723 " format(TheLine.First,\n" 5724 " IndentForLevel[TheLine.Level] >= 0 ?\n" 5725 " IndentForLevel[TheLine.Level] :\n" 5726 " TheLine * 2,\n" 5727 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5728 Style); 5729 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5730 " aaaaaaaaaaaaaaa :\n" 5731 " bbbbbbbbbbbbbbb ? //\n" 5732 " ccccccccccccccc :\n" 5733 " ddddddddddddddd;", 5734 Style); 5735 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5736 " aaaaaaaaaaaaaaa :\n" 5737 " (bbbbbbbbbbbbbbb ? //\n" 5738 " ccccccccccccccc :\n" 5739 " ddddddddddddddd);", 5740 Style); 5741 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5742 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 5743 " ccccccccccccccccccccccccccc;", 5744 Style); 5745 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5746 " aaaaa :\n" 5747 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 5748 Style); 5749 } 5750 5751 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 5752 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 5753 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 5754 verifyFormat("bool a = true, b = false;"); 5755 5756 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5757 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 5758 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 5759 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 5760 verifyFormat( 5761 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 5762 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 5763 " d = e && f;"); 5764 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 5765 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 5766 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5767 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 5768 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 5769 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 5770 5771 FormatStyle Style = getGoogleStyle(); 5772 Style.PointerAlignment = FormatStyle::PAS_Left; 5773 Style.DerivePointerAlignment = false; 5774 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5775 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 5776 " *b = bbbbbbbbbbbbbbbbbbb;", 5777 Style); 5778 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5779 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 5780 Style); 5781 verifyFormat("vector<int*> a, b;", Style); 5782 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 5783 } 5784 5785 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 5786 verifyFormat("arr[foo ? bar : baz];"); 5787 verifyFormat("f()[foo ? bar : baz];"); 5788 verifyFormat("(a + b)[foo ? bar : baz];"); 5789 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 5790 } 5791 5792 TEST_F(FormatTest, AlignsStringLiterals) { 5793 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 5794 " \"short literal\");"); 5795 verifyFormat( 5796 "looooooooooooooooooooooooongFunction(\n" 5797 " \"short literal\"\n" 5798 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 5799 verifyFormat("someFunction(\"Always break between multi-line\"\n" 5800 " \" string literals\",\n" 5801 " and, other, parameters);"); 5802 EXPECT_EQ("fun + \"1243\" /* comment */\n" 5803 " \"5678\";", 5804 format("fun + \"1243\" /* comment */\n" 5805 " \"5678\";", 5806 getLLVMStyleWithColumns(28))); 5807 EXPECT_EQ( 5808 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 5809 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 5810 " \"aaaaaaaaaaaaaaaa\";", 5811 format("aaaaaa =" 5812 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 5813 "aaaaaaaaaaaaaaaaaaaaa\" " 5814 "\"aaaaaaaaaaaaaaaa\";")); 5815 verifyFormat("a = a + \"a\"\n" 5816 " \"a\"\n" 5817 " \"a\";"); 5818 verifyFormat("f(\"a\", \"b\"\n" 5819 " \"c\");"); 5820 5821 verifyFormat( 5822 "#define LL_FORMAT \"ll\"\n" 5823 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 5824 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 5825 5826 verifyFormat("#define A(X) \\\n" 5827 " \"aaaaa\" #X \"bbbbbb\" \\\n" 5828 " \"ccccc\"", 5829 getLLVMStyleWithColumns(23)); 5830 verifyFormat("#define A \"def\"\n" 5831 "f(\"abc\" A \"ghi\"\n" 5832 " \"jkl\");"); 5833 5834 verifyFormat("f(L\"a\"\n" 5835 " L\"b\");"); 5836 verifyFormat("#define A(X) \\\n" 5837 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 5838 " L\"ccccc\"", 5839 getLLVMStyleWithColumns(25)); 5840 5841 verifyFormat("f(@\"a\"\n" 5842 " @\"b\");"); 5843 verifyFormat("NSString s = @\"a\"\n" 5844 " @\"b\"\n" 5845 " @\"c\";"); 5846 verifyFormat("NSString s = @\"a\"\n" 5847 " \"b\"\n" 5848 " \"c\";"); 5849 } 5850 5851 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 5852 FormatStyle Style = getLLVMStyle(); 5853 // No declarations or definitions should be moved to own line. 5854 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 5855 verifyFormat("class A {\n" 5856 " int f() { return 1; }\n" 5857 " int g();\n" 5858 "};\n" 5859 "int f() { return 1; }\n" 5860 "int g();\n", 5861 Style); 5862 5863 // All declarations and definitions should have the return type moved to its 5864 // own 5865 // line. 5866 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 5867 verifyFormat("class E {\n" 5868 " int\n" 5869 " f() {\n" 5870 " return 1;\n" 5871 " }\n" 5872 " int\n" 5873 " g();\n" 5874 "};\n" 5875 "int\n" 5876 "f() {\n" 5877 " return 1;\n" 5878 "}\n" 5879 "int\n" 5880 "g();\n", 5881 Style); 5882 5883 // Top-level definitions, and no kinds of declarations should have the 5884 // return type moved to its own line. 5885 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 5886 verifyFormat("class B {\n" 5887 " int f() { return 1; }\n" 5888 " int g();\n" 5889 "};\n" 5890 "int\n" 5891 "f() {\n" 5892 " return 1;\n" 5893 "}\n" 5894 "int g();\n", 5895 Style); 5896 5897 // Top-level definitions and declarations should have the return type moved 5898 // to its own line. 5899 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 5900 verifyFormat("class C {\n" 5901 " int f() { return 1; }\n" 5902 " int g();\n" 5903 "};\n" 5904 "int\n" 5905 "f() {\n" 5906 " return 1;\n" 5907 "}\n" 5908 "int\n" 5909 "g();\n", 5910 Style); 5911 5912 // All definitions should have the return type moved to its own line, but no 5913 // kinds of declarations. 5914 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 5915 verifyFormat("class D {\n" 5916 " int\n" 5917 " f() {\n" 5918 " return 1;\n" 5919 " }\n" 5920 " int g();\n" 5921 "};\n" 5922 "int\n" 5923 "f() {\n" 5924 " return 1;\n" 5925 "}\n" 5926 "int g();\n", 5927 Style); 5928 verifyFormat("const char *\n" 5929 "f(void) {\n" // Break here. 5930 " return \"\";\n" 5931 "}\n" 5932 "const char *bar(void);\n", // No break here. 5933 Style); 5934 verifyFormat("template <class T>\n" 5935 "T *\n" 5936 "f(T &c) {\n" // Break here. 5937 " return NULL;\n" 5938 "}\n" 5939 "template <class T> T *f(T &c);\n", // No break here. 5940 Style); 5941 verifyFormat("class C {\n" 5942 " int\n" 5943 " operator+() {\n" 5944 " return 1;\n" 5945 " }\n" 5946 " int\n" 5947 " operator()() {\n" 5948 " return 1;\n" 5949 " }\n" 5950 "};\n", 5951 Style); 5952 verifyFormat("void\n" 5953 "A::operator()() {}\n" 5954 "void\n" 5955 "A::operator>>() {}\n" 5956 "void\n" 5957 "A::operator+() {}\n", 5958 Style); 5959 verifyFormat("void *operator new(std::size_t s);", // No break here. 5960 Style); 5961 verifyFormat("void *\n" 5962 "operator new(std::size_t s) {}", 5963 Style); 5964 verifyFormat("void *\n" 5965 "operator delete[](void *ptr) {}", 5966 Style); 5967 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 5968 verifyFormat("const char *\n" 5969 "f(void)\n" // Break here. 5970 "{\n" 5971 " return \"\";\n" 5972 "}\n" 5973 "const char *bar(void);\n", // No break here. 5974 Style); 5975 verifyFormat("template <class T>\n" 5976 "T *\n" // Problem here: no line break 5977 "f(T &c)\n" // Break here. 5978 "{\n" 5979 " return NULL;\n" 5980 "}\n" 5981 "template <class T> T *f(T &c);\n", // No break here. 5982 Style); 5983 verifyFormat("int\n" 5984 "foo(A<bool> a)\n" 5985 "{\n" 5986 " return a;\n" 5987 "}\n", 5988 Style); 5989 verifyFormat("int\n" 5990 "foo(A<8> a)\n" 5991 "{\n" 5992 " return a;\n" 5993 "}\n", 5994 Style); 5995 verifyFormat("int\n" 5996 "foo(A<B<bool>, 8> a)\n" 5997 "{\n" 5998 " return a;\n" 5999 "}\n", 6000 Style); 6001 verifyFormat("int\n" 6002 "foo(A<B<8>, bool> a)\n" 6003 "{\n" 6004 " return a;\n" 6005 "}\n", 6006 Style); 6007 verifyFormat("int\n" 6008 "foo(A<B<bool>, bool> a)\n" 6009 "{\n" 6010 " return a;\n" 6011 "}\n", 6012 Style); 6013 verifyFormat("int\n" 6014 "foo(A<B<8>, 8> a)\n" 6015 "{\n" 6016 " return a;\n" 6017 "}\n", 6018 Style); 6019 6020 Style = getGNUStyle(); 6021 6022 // Test for comments at the end of function declarations. 6023 verifyFormat("void\n" 6024 "foo (int a, /*abc*/ int b) // def\n" 6025 "{\n" 6026 "}\n", 6027 Style); 6028 6029 verifyFormat("void\n" 6030 "foo (int a, /* abc */ int b) /* def */\n" 6031 "{\n" 6032 "}\n", 6033 Style); 6034 6035 // Definitions that should not break after return type 6036 verifyFormat("void foo (int a, int b); // def\n", Style); 6037 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6038 verifyFormat("void foo (int a, int b);\n", Style); 6039 } 6040 6041 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6042 FormatStyle NoBreak = getLLVMStyle(); 6043 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6044 FormatStyle Break = getLLVMStyle(); 6045 Break.AlwaysBreakBeforeMultilineStrings = true; 6046 verifyFormat("aaaa = \"bbbb\"\n" 6047 " \"cccc\";", 6048 NoBreak); 6049 verifyFormat("aaaa =\n" 6050 " \"bbbb\"\n" 6051 " \"cccc\";", 6052 Break); 6053 verifyFormat("aaaa(\"bbbb\"\n" 6054 " \"cccc\");", 6055 NoBreak); 6056 verifyFormat("aaaa(\n" 6057 " \"bbbb\"\n" 6058 " \"cccc\");", 6059 Break); 6060 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6061 " \"cccc\");", 6062 NoBreak); 6063 verifyFormat("aaaa(qqq,\n" 6064 " \"bbbb\"\n" 6065 " \"cccc\");", 6066 Break); 6067 verifyFormat("aaaa(qqq,\n" 6068 " L\"bbbb\"\n" 6069 " L\"cccc\");", 6070 Break); 6071 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6072 " \"bbbb\"));", 6073 Break); 6074 verifyFormat("string s = someFunction(\n" 6075 " \"abc\"\n" 6076 " \"abc\");", 6077 Break); 6078 6079 // As we break before unary operators, breaking right after them is bad. 6080 verifyFormat("string foo = abc ? \"x\"\n" 6081 " \"blah blah blah blah blah blah\"\n" 6082 " : \"y\";", 6083 Break); 6084 6085 // Don't break if there is no column gain. 6086 verifyFormat("f(\"aaaa\"\n" 6087 " \"bbbb\");", 6088 Break); 6089 6090 // Treat literals with escaped newlines like multi-line string literals. 6091 EXPECT_EQ("x = \"a\\\n" 6092 "b\\\n" 6093 "c\";", 6094 format("x = \"a\\\n" 6095 "b\\\n" 6096 "c\";", 6097 NoBreak)); 6098 EXPECT_EQ("xxxx =\n" 6099 " \"a\\\n" 6100 "b\\\n" 6101 "c\";", 6102 format("xxxx = \"a\\\n" 6103 "b\\\n" 6104 "c\";", 6105 Break)); 6106 6107 EXPECT_EQ("NSString *const kString =\n" 6108 " @\"aaaa\"\n" 6109 " @\"bbbb\";", 6110 format("NSString *const kString = @\"aaaa\"\n" 6111 "@\"bbbb\";", 6112 Break)); 6113 6114 Break.ColumnLimit = 0; 6115 verifyFormat("const char *hello = \"hello llvm\";", Break); 6116 } 6117 6118 TEST_F(FormatTest, AlignsPipes) { 6119 verifyFormat( 6120 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6121 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6122 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6123 verifyFormat( 6124 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6125 " << aaaaaaaaaaaaaaaaaaaa;"); 6126 verifyFormat( 6127 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6128 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6129 verifyFormat( 6130 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6131 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6132 verifyFormat( 6133 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6134 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6135 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6136 verifyFormat( 6137 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6138 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6139 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6140 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6143 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6144 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6145 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6146 verifyFormat( 6147 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6148 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6149 verifyFormat( 6150 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6151 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6152 6153 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6154 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6155 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6157 " aaaaaaaaaaaaaaaaaaaaa)\n" 6158 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6159 verifyFormat("LOG_IF(aaa == //\n" 6160 " bbb)\n" 6161 " << a << b;"); 6162 6163 // But sometimes, breaking before the first "<<" is desirable. 6164 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6165 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6166 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6167 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6168 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6169 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6170 " << BEF << IsTemplate << Description << E->getType();"); 6171 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6172 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6173 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6174 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6175 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6176 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6177 " << aaa;"); 6178 6179 verifyFormat( 6180 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6181 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6182 6183 // Incomplete string literal. 6184 EXPECT_EQ("llvm::errs() << \"\n" 6185 " << a;", 6186 format("llvm::errs() << \"\n<<a;")); 6187 6188 verifyFormat("void f() {\n" 6189 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6190 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6191 "}"); 6192 6193 // Handle 'endl'. 6194 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6195 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6196 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6197 6198 // Handle '\n'. 6199 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6200 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6201 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6202 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6203 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6204 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6205 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6206 } 6207 6208 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6209 verifyFormat("return out << \"somepacket = {\\n\"\n" 6210 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6211 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6212 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6213 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6214 " << \"}\";"); 6215 6216 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6217 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6218 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6219 verifyFormat( 6220 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6221 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6222 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6223 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6224 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6225 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6226 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6227 verifyFormat( 6228 "void f() {\n" 6229 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6230 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6231 "}"); 6232 6233 // Breaking before the first "<<" is generally not desirable. 6234 verifyFormat( 6235 "llvm::errs()\n" 6236 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6237 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6238 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6239 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6240 getLLVMStyleWithColumns(70)); 6241 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6242 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6243 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6244 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6245 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6246 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6247 getLLVMStyleWithColumns(70)); 6248 6249 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6250 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6251 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6252 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6253 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6254 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6255 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6256 " (aaaa + aaaa);", 6257 getLLVMStyleWithColumns(40)); 6258 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6259 " (aaaaaaa + aaaaa));", 6260 getLLVMStyleWithColumns(40)); 6261 verifyFormat( 6262 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6263 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6264 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6265 } 6266 6267 TEST_F(FormatTest, UnderstandsEquals) { 6268 verifyFormat( 6269 "aaaaaaaaaaaaaaaaa =\n" 6270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6271 verifyFormat( 6272 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6274 verifyFormat( 6275 "if (a) {\n" 6276 " f();\n" 6277 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6279 "}"); 6280 6281 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6282 " 100000000 + 10000000) {\n}"); 6283 } 6284 6285 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6286 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6287 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6288 6289 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6290 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6291 6292 verifyFormat( 6293 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6294 " Parameter2);"); 6295 6296 verifyFormat( 6297 "ShortObject->shortFunction(\n" 6298 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6299 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6300 6301 verifyFormat("loooooooooooooongFunction(\n" 6302 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6303 6304 verifyFormat( 6305 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6306 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6307 6308 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6309 " .WillRepeatedly(Return(SomeValue));"); 6310 verifyFormat("void f() {\n" 6311 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6312 " .Times(2)\n" 6313 " .WillRepeatedly(Return(SomeValue));\n" 6314 "}"); 6315 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6316 " ccccccccccccccccccccccc);"); 6317 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6318 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6319 " .aaaaa(aaaaa),\n" 6320 " aaaaaaaaaaaaaaaaaaaaa);"); 6321 verifyFormat("void f() {\n" 6322 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6323 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6324 "}"); 6325 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6327 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6328 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6329 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6330 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6331 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6332 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6333 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6334 "}"); 6335 6336 // Here, it is not necessary to wrap at "." or "->". 6337 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6338 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6339 verifyFormat( 6340 "aaaaaaaaaaa->aaaaaaaaa(\n" 6341 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6342 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6343 6344 verifyFormat( 6345 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6346 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6347 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6348 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6349 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6350 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6351 6352 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6354 " .a();"); 6355 6356 FormatStyle NoBinPacking = getLLVMStyle(); 6357 NoBinPacking.BinPackParameters = false; 6358 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6359 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6360 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6361 " aaaaaaaaaaaaaaaaaaa,\n" 6362 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6363 NoBinPacking); 6364 6365 // If there is a subsequent call, change to hanging indentation. 6366 verifyFormat( 6367 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6368 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6369 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6370 verifyFormat( 6371 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6372 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6373 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6375 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6376 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6378 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6379 } 6380 6381 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6382 verifyFormat("template <typename T>\n" 6383 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6384 verifyFormat("template <typename T>\n" 6385 "// T should be one of {A, B}.\n" 6386 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6387 verifyFormat( 6388 "template <typename T>\n" 6389 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6390 verifyFormat("template <typename T>\n" 6391 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6392 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6393 verifyFormat( 6394 "template <typename T>\n" 6395 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6396 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6397 verifyFormat( 6398 "template <typename T>\n" 6399 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6400 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6402 verifyFormat("template <typename T>\n" 6403 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6404 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6405 verifyFormat( 6406 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6407 " typename T4 = char>\n" 6408 "void f();"); 6409 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6410 " template <typename> class cccccccccccccccccccccc,\n" 6411 " typename ddddddddddddd>\n" 6412 "class C {};"); 6413 verifyFormat( 6414 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6415 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6416 6417 verifyFormat("void f() {\n" 6418 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6419 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6420 "}"); 6421 6422 verifyFormat("template <typename T> class C {};"); 6423 verifyFormat("template <typename T> void f();"); 6424 verifyFormat("template <typename T> void f() {}"); 6425 verifyFormat( 6426 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6429 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6432 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6433 getLLVMStyleWithColumns(72)); 6434 EXPECT_EQ("static_cast<A< //\n" 6435 " B> *>(\n" 6436 "\n" 6437 ");", 6438 format("static_cast<A<//\n" 6439 " B>*>(\n" 6440 "\n" 6441 " );")); 6442 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6443 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6444 6445 FormatStyle AlwaysBreak = getLLVMStyle(); 6446 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6447 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6448 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6449 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6450 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6451 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6452 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6453 verifyFormat("template <template <typename> class Fooooooo,\n" 6454 " template <typename> class Baaaaaaar>\n" 6455 "struct C {};", 6456 AlwaysBreak); 6457 verifyFormat("template <typename T> // T can be A, B or C.\n" 6458 "struct C {};", 6459 AlwaysBreak); 6460 verifyFormat("template <enum E> class A {\n" 6461 "public:\n" 6462 " E *f();\n" 6463 "};"); 6464 6465 FormatStyle NeverBreak = getLLVMStyle(); 6466 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6467 verifyFormat("template <typename T> class C {};", NeverBreak); 6468 verifyFormat("template <typename T> void f();", NeverBreak); 6469 verifyFormat("template <typename T> void f() {}", NeverBreak); 6470 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}", 6471 NeverBreak); 6472 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6473 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6474 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6475 NeverBreak); 6476 verifyFormat("template <template <typename> class Fooooooo,\n" 6477 " template <typename> class Baaaaaaar>\n" 6478 "struct C {};", 6479 NeverBreak); 6480 verifyFormat("template <typename T> // T can be A, B or C.\n" 6481 "struct C {};", 6482 NeverBreak); 6483 verifyFormat("template <enum E> class A {\n" 6484 "public:\n" 6485 " E *f();\n" 6486 "};", NeverBreak); 6487 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6488 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}", 6489 NeverBreak); 6490 } 6491 6492 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6493 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6494 Style.ColumnLimit = 60; 6495 EXPECT_EQ("// Baseline - no comments.\n" 6496 "template <\n" 6497 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6498 "void f() {}", 6499 format("// Baseline - no comments.\n" 6500 "template <\n" 6501 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6502 "void f() {}", 6503 Style)); 6504 6505 EXPECT_EQ("template <\n" 6506 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6507 "void f() {}", 6508 format("template <\n" 6509 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6510 "void f() {}", 6511 Style)); 6512 6513 EXPECT_EQ( 6514 "template <\n" 6515 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6516 "void f() {}", 6517 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6518 "void f() {}", 6519 Style)); 6520 6521 EXPECT_EQ( 6522 "template <\n" 6523 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6524 " // multiline\n" 6525 "void f() {}", 6526 format("template <\n" 6527 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6528 " // multiline\n" 6529 "void f() {}", 6530 Style)); 6531 6532 EXPECT_EQ( 6533 "template <typename aaaaaaaaaa<\n" 6534 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6535 "void f() {}", 6536 format( 6537 "template <\n" 6538 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6539 "void f() {}", 6540 Style)); 6541 } 6542 6543 TEST_F(FormatTest, WrapsTemplateParameters) { 6544 FormatStyle Style = getLLVMStyle(); 6545 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6546 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6547 verifyFormat( 6548 "template <typename... a> struct q {};\n" 6549 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6550 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6551 " y;", 6552 Style); 6553 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6554 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6555 verifyFormat( 6556 "template <typename... a> struct r {};\n" 6557 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6558 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6559 " y;", 6560 Style); 6561 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6562 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6563 verifyFormat( 6564 "template <typename... a> struct s {};\n" 6565 "extern s<\n" 6566 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 6567 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 6568 " y;", 6569 Style); 6570 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6571 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6572 verifyFormat( 6573 "template <typename... a> struct t {};\n" 6574 "extern t<\n" 6575 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 6576 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 6577 " y;", 6578 Style); 6579 } 6580 6581 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6582 verifyFormat( 6583 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6585 verifyFormat( 6586 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6587 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6589 6590 // FIXME: Should we have the extra indent after the second break? 6591 verifyFormat( 6592 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6595 6596 verifyFormat( 6597 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6598 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6599 6600 // Breaking at nested name specifiers is generally not desirable. 6601 verifyFormat( 6602 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6603 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6604 6605 verifyFormat( 6606 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 6607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6608 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6609 " aaaaaaaaaaaaaaaaaaaaa);", 6610 getLLVMStyleWithColumns(74)); 6611 6612 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6614 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6615 } 6616 6617 TEST_F(FormatTest, UnderstandsTemplateParameters) { 6618 verifyFormat("A<int> a;"); 6619 verifyFormat("A<A<A<int>>> a;"); 6620 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 6621 verifyFormat("bool x = a < 1 || 2 > a;"); 6622 verifyFormat("bool x = 5 < f<int>();"); 6623 verifyFormat("bool x = f<int>() > 5;"); 6624 verifyFormat("bool x = 5 < a<int>::x;"); 6625 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 6626 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 6627 6628 verifyGoogleFormat("A<A<int>> a;"); 6629 verifyGoogleFormat("A<A<A<int>>> a;"); 6630 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 6631 verifyGoogleFormat("A<A<int> > a;"); 6632 verifyGoogleFormat("A<A<A<int> > > a;"); 6633 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 6634 verifyGoogleFormat("A<::A<int>> a;"); 6635 verifyGoogleFormat("A<::A> a;"); 6636 verifyGoogleFormat("A< ::A> a;"); 6637 verifyGoogleFormat("A< ::A<int> > a;"); 6638 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 6639 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 6640 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 6641 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 6642 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 6643 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 6644 6645 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 6646 6647 // template closer followed by a token that starts with > or = 6648 verifyFormat("bool b = a<1> > 1;"); 6649 verifyFormat("bool b = a<1> >= 1;"); 6650 verifyFormat("int i = a<1> >> 1;"); 6651 FormatStyle Style = getLLVMStyle(); 6652 Style.SpaceBeforeAssignmentOperators = false; 6653 verifyFormat("bool b= a<1> == 1;", Style); 6654 verifyFormat("a<int> = 1;", Style); 6655 verifyFormat("a<int> >>= 1;", Style); 6656 6657 verifyFormat("test >> a >> b;"); 6658 verifyFormat("test << a >> b;"); 6659 6660 verifyFormat("f<int>();"); 6661 verifyFormat("template <typename T> void f() {}"); 6662 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 6663 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 6664 "sizeof(char)>::type>;"); 6665 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 6666 verifyFormat("f(a.operator()<A>());"); 6667 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6668 " .template operator()<A>());", 6669 getLLVMStyleWithColumns(35)); 6670 6671 // Not template parameters. 6672 verifyFormat("return a < b && c > d;"); 6673 verifyFormat("void f() {\n" 6674 " while (a < b && c > d) {\n" 6675 " }\n" 6676 "}"); 6677 verifyFormat("template <typename... Types>\n" 6678 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 6679 6680 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6681 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 6682 getLLVMStyleWithColumns(60)); 6683 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 6684 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 6685 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 6686 } 6687 6688 TEST_F(FormatTest, BitshiftOperatorWidth) { 6689 EXPECT_EQ("int a = 1 << 2; /* foo\n" 6690 " bar */", 6691 format("int a=1<<2; /* foo\n" 6692 " bar */")); 6693 6694 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 6695 " bar */", 6696 format("int b =256>>1 ; /* foo\n" 6697 " bar */")); 6698 } 6699 6700 TEST_F(FormatTest, UnderstandsBinaryOperators) { 6701 verifyFormat("COMPARE(a, ==, b);"); 6702 verifyFormat("auto s = sizeof...(Ts) - 1;"); 6703 } 6704 6705 TEST_F(FormatTest, UnderstandsPointersToMembers) { 6706 verifyFormat("int A::*x;"); 6707 verifyFormat("int (S::*func)(void *);"); 6708 verifyFormat("void f() { int (S::*func)(void *); }"); 6709 verifyFormat("typedef bool *(Class::*Member)() const;"); 6710 verifyFormat("void f() {\n" 6711 " (a->*f)();\n" 6712 " a->*x;\n" 6713 " (a.*f)();\n" 6714 " ((*a).*f)();\n" 6715 " a.*x;\n" 6716 "}"); 6717 verifyFormat("void f() {\n" 6718 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 6719 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 6720 "}"); 6721 verifyFormat( 6722 "(aaaaaaaaaa->*bbbbbbb)(\n" 6723 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6724 FormatStyle Style = getLLVMStyle(); 6725 Style.PointerAlignment = FormatStyle::PAS_Left; 6726 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 6727 } 6728 6729 TEST_F(FormatTest, UnderstandsUnaryOperators) { 6730 verifyFormat("int a = -2;"); 6731 verifyFormat("f(-1, -2, -3);"); 6732 verifyFormat("a[-1] = 5;"); 6733 verifyFormat("int a = 5 + -2;"); 6734 verifyFormat("if (i == -1) {\n}"); 6735 verifyFormat("if (i != -1) {\n}"); 6736 verifyFormat("if (i > -1) {\n}"); 6737 verifyFormat("if (i < -1) {\n}"); 6738 verifyFormat("++(a->f());"); 6739 verifyFormat("--(a->f());"); 6740 verifyFormat("(a->f())++;"); 6741 verifyFormat("a[42]++;"); 6742 verifyFormat("if (!(a->f())) {\n}"); 6743 verifyFormat("if (!+i) {\n}"); 6744 verifyFormat("~&a;"); 6745 6746 verifyFormat("a-- > b;"); 6747 verifyFormat("b ? -a : c;"); 6748 verifyFormat("n * sizeof char16;"); 6749 verifyFormat("n * alignof char16;", getGoogleStyle()); 6750 verifyFormat("sizeof(char);"); 6751 verifyFormat("alignof(char);", getGoogleStyle()); 6752 6753 verifyFormat("return -1;"); 6754 verifyFormat("switch (a) {\n" 6755 "case -1:\n" 6756 " break;\n" 6757 "}"); 6758 verifyFormat("#define X -1"); 6759 verifyFormat("#define X -kConstant"); 6760 6761 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 6762 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 6763 6764 verifyFormat("int a = /* confusing comment */ -1;"); 6765 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 6766 verifyFormat("int a = i /* confusing comment */++;"); 6767 } 6768 6769 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 6770 verifyFormat("if (!aaaaaaaaaa( // break\n" 6771 " aaaaa)) {\n" 6772 "}"); 6773 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 6774 " aaaaa));"); 6775 verifyFormat("*aaa = aaaaaaa( // break\n" 6776 " bbbbbb);"); 6777 } 6778 6779 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 6780 verifyFormat("bool operator<();"); 6781 verifyFormat("bool operator>();"); 6782 verifyFormat("bool operator=();"); 6783 verifyFormat("bool operator==();"); 6784 verifyFormat("bool operator!=();"); 6785 verifyFormat("int operator+();"); 6786 verifyFormat("int operator++();"); 6787 verifyFormat("int operator++(int) volatile noexcept;"); 6788 verifyFormat("bool operator,();"); 6789 verifyFormat("bool operator();"); 6790 verifyFormat("bool operator()();"); 6791 verifyFormat("bool operator[]();"); 6792 verifyFormat("operator bool();"); 6793 verifyFormat("operator int();"); 6794 verifyFormat("operator void *();"); 6795 verifyFormat("operator SomeType<int>();"); 6796 verifyFormat("operator SomeType<int, int>();"); 6797 verifyFormat("operator SomeType<SomeType<int>>();"); 6798 verifyFormat("void *operator new(std::size_t size);"); 6799 verifyFormat("void *operator new[](std::size_t size);"); 6800 verifyFormat("void operator delete(void *ptr);"); 6801 verifyFormat("void operator delete[](void *ptr);"); 6802 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 6803 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 6804 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 6805 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 6806 6807 verifyFormat( 6808 "ostream &operator<<(ostream &OutputStream,\n" 6809 " SomeReallyLongType WithSomeReallyLongValue);"); 6810 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 6811 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 6812 " return left.group < right.group;\n" 6813 "}"); 6814 verifyFormat("SomeType &operator=(const SomeType &S);"); 6815 verifyFormat("f.template operator()<int>();"); 6816 6817 verifyGoogleFormat("operator void*();"); 6818 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 6819 verifyGoogleFormat("operator ::A();"); 6820 6821 verifyFormat("using A::operator+;"); 6822 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 6823 "int i;"); 6824 } 6825 6826 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 6827 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 6828 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 6829 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 6830 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 6831 verifyFormat("Deleted &operator=(const Deleted &) &;"); 6832 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 6833 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 6834 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 6835 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 6836 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 6837 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 6838 verifyFormat("void Fn(T const &) const &;"); 6839 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 6840 verifyFormat("template <typename T>\n" 6841 "void F(T) && = delete;", 6842 getGoogleStyle()); 6843 6844 FormatStyle AlignLeft = getLLVMStyle(); 6845 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 6846 verifyFormat("void A::b() && {}", AlignLeft); 6847 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 6848 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 6849 AlignLeft); 6850 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 6851 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 6852 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 6853 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 6854 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 6855 verifyFormat("auto Function(T) & -> void;", AlignLeft); 6856 verifyFormat("void Fn(T const&) const&;", AlignLeft); 6857 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 6858 6859 FormatStyle Spaces = getLLVMStyle(); 6860 Spaces.SpacesInCStyleCastParentheses = true; 6861 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 6862 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 6863 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 6864 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 6865 6866 Spaces.SpacesInCStyleCastParentheses = false; 6867 Spaces.SpacesInParentheses = true; 6868 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 6869 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces); 6870 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 6871 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 6872 } 6873 6874 TEST_F(FormatTest, UnderstandsNewAndDelete) { 6875 verifyFormat("void f() {\n" 6876 " A *a = new A;\n" 6877 " A *a = new (placement) A;\n" 6878 " delete a;\n" 6879 " delete (A *)a;\n" 6880 "}"); 6881 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 6882 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 6883 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6884 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 6885 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 6886 verifyFormat("delete[] h->p;"); 6887 } 6888 6889 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 6890 verifyFormat("int *f(int *a) {}"); 6891 verifyFormat("int main(int argc, char **argv) {}"); 6892 verifyFormat("Test::Test(int b) : a(b * b) {}"); 6893 verifyIndependentOfContext("f(a, *a);"); 6894 verifyFormat("void g() { f(*a); }"); 6895 verifyIndependentOfContext("int a = b * 10;"); 6896 verifyIndependentOfContext("int a = 10 * b;"); 6897 verifyIndependentOfContext("int a = b * c;"); 6898 verifyIndependentOfContext("int a += b * c;"); 6899 verifyIndependentOfContext("int a -= b * c;"); 6900 verifyIndependentOfContext("int a *= b * c;"); 6901 verifyIndependentOfContext("int a /= b * c;"); 6902 verifyIndependentOfContext("int a = *b;"); 6903 verifyIndependentOfContext("int a = *b * c;"); 6904 verifyIndependentOfContext("int a = b * *c;"); 6905 verifyIndependentOfContext("int a = b * (10);"); 6906 verifyIndependentOfContext("S << b * (10);"); 6907 verifyIndependentOfContext("return 10 * b;"); 6908 verifyIndependentOfContext("return *b * *c;"); 6909 verifyIndependentOfContext("return a & ~b;"); 6910 verifyIndependentOfContext("f(b ? *c : *d);"); 6911 verifyIndependentOfContext("int a = b ? *c : *d;"); 6912 verifyIndependentOfContext("*b = a;"); 6913 verifyIndependentOfContext("a * ~b;"); 6914 verifyIndependentOfContext("a * !b;"); 6915 verifyIndependentOfContext("a * +b;"); 6916 verifyIndependentOfContext("a * -b;"); 6917 verifyIndependentOfContext("a * ++b;"); 6918 verifyIndependentOfContext("a * --b;"); 6919 verifyIndependentOfContext("a[4] * b;"); 6920 verifyIndependentOfContext("a[a * a] = 1;"); 6921 verifyIndependentOfContext("f() * b;"); 6922 verifyIndependentOfContext("a * [self dostuff];"); 6923 verifyIndependentOfContext("int x = a * (a + b);"); 6924 verifyIndependentOfContext("(a *)(a + b);"); 6925 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 6926 verifyIndependentOfContext("int *pa = (int *)&a;"); 6927 verifyIndependentOfContext("return sizeof(int **);"); 6928 verifyIndependentOfContext("return sizeof(int ******);"); 6929 verifyIndependentOfContext("return (int **&)a;"); 6930 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 6931 verifyFormat("void f(Type (*parameter)[10]) {}"); 6932 verifyFormat("void f(Type (¶meter)[10]) {}"); 6933 verifyGoogleFormat("return sizeof(int**);"); 6934 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 6935 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 6936 verifyFormat("auto a = [](int **&, int ***) {};"); 6937 verifyFormat("auto PointerBinding = [](const char *S) {};"); 6938 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 6939 verifyFormat("[](const decltype(*a) &value) {}"); 6940 verifyFormat("decltype(a * b) F();"); 6941 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 6942 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 6943 verifyIndependentOfContext("typedef void (*f)(int *a);"); 6944 verifyIndependentOfContext("int i{a * b};"); 6945 verifyIndependentOfContext("aaa && aaa->f();"); 6946 verifyIndependentOfContext("int x = ~*p;"); 6947 verifyFormat("Constructor() : a(a), area(width * height) {}"); 6948 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 6949 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 6950 verifyFormat("void f() { f(a, c * d); }"); 6951 verifyFormat("void f() { f(new a(), c * d); }"); 6952 verifyFormat("void f(const MyOverride &override);"); 6953 verifyFormat("void f(const MyFinal &final);"); 6954 verifyIndependentOfContext("bool a = f() && override.f();"); 6955 verifyIndependentOfContext("bool a = f() && final.f();"); 6956 6957 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 6958 6959 verifyIndependentOfContext("A<int *> a;"); 6960 verifyIndependentOfContext("A<int **> a;"); 6961 verifyIndependentOfContext("A<int *, int *> a;"); 6962 verifyIndependentOfContext("A<int *[]> a;"); 6963 verifyIndependentOfContext( 6964 "const char *const p = reinterpret_cast<const char *const>(q);"); 6965 verifyIndependentOfContext("A<int **, int **> a;"); 6966 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 6967 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 6968 verifyFormat("for (; a && b;) {\n}"); 6969 verifyFormat("bool foo = true && [] { return false; }();"); 6970 6971 verifyFormat( 6972 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6973 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6974 6975 verifyGoogleFormat("int const* a = &b;"); 6976 verifyGoogleFormat("**outparam = 1;"); 6977 verifyGoogleFormat("*outparam = a * b;"); 6978 verifyGoogleFormat("int main(int argc, char** argv) {}"); 6979 verifyGoogleFormat("A<int*> a;"); 6980 verifyGoogleFormat("A<int**> a;"); 6981 verifyGoogleFormat("A<int*, int*> a;"); 6982 verifyGoogleFormat("A<int**, int**> a;"); 6983 verifyGoogleFormat("f(b ? *c : *d);"); 6984 verifyGoogleFormat("int a = b ? *c : *d;"); 6985 verifyGoogleFormat("Type* t = **x;"); 6986 verifyGoogleFormat("Type* t = *++*x;"); 6987 verifyGoogleFormat("*++*x;"); 6988 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 6989 verifyGoogleFormat("Type* t = x++ * y;"); 6990 verifyGoogleFormat( 6991 "const char* const p = reinterpret_cast<const char* const>(q);"); 6992 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 6993 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 6994 verifyGoogleFormat("template <typename T>\n" 6995 "void f(int i = 0, SomeType** temps = NULL);"); 6996 6997 FormatStyle Left = getLLVMStyle(); 6998 Left.PointerAlignment = FormatStyle::PAS_Left; 6999 verifyFormat("x = *a(x) = *a(y);", Left); 7000 verifyFormat("for (;; *a = b) {\n}", Left); 7001 verifyFormat("return *this += 1;", Left); 7002 verifyFormat("throw *x;", Left); 7003 verifyFormat("delete *x;", Left); 7004 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7005 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7006 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7007 7008 verifyIndependentOfContext("a = *(x + y);"); 7009 verifyIndependentOfContext("a = &(x + y);"); 7010 verifyIndependentOfContext("*(x + y).call();"); 7011 verifyIndependentOfContext("&(x + y)->call();"); 7012 verifyFormat("void f() { &(*I).first; }"); 7013 7014 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7015 verifyFormat( 7016 "int *MyValues = {\n" 7017 " *A, // Operator detection might be confused by the '{'\n" 7018 " *BB // Operator detection might be confused by previous comment\n" 7019 "};"); 7020 7021 verifyIndependentOfContext("if (int *a = &b)"); 7022 verifyIndependentOfContext("if (int &a = *b)"); 7023 verifyIndependentOfContext("if (a & b[i])"); 7024 verifyIndependentOfContext("if constexpr (a & b[i])"); 7025 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7026 verifyIndependentOfContext("if (a * (b * c))"); 7027 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7028 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7029 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7030 verifyIndependentOfContext("if (*b[i])"); 7031 verifyIndependentOfContext("if (int *a = (&b))"); 7032 verifyIndependentOfContext("while (int *a = &b)"); 7033 verifyIndependentOfContext("while (a * (b * c))"); 7034 verifyIndependentOfContext("size = sizeof *a;"); 7035 verifyIndependentOfContext("if (a && (b = c))"); 7036 verifyFormat("void f() {\n" 7037 " for (const int &v : Values) {\n" 7038 " }\n" 7039 "}"); 7040 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7041 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7042 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7043 7044 verifyFormat("#define A (!a * b)"); 7045 verifyFormat("#define MACRO \\\n" 7046 " int *i = a * b; \\\n" 7047 " void f(a *b);", 7048 getLLVMStyleWithColumns(19)); 7049 7050 verifyIndependentOfContext("A = new SomeType *[Length];"); 7051 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7052 verifyIndependentOfContext("T **t = new T *;"); 7053 verifyIndependentOfContext("T **t = new T *();"); 7054 verifyGoogleFormat("A = new SomeType*[Length]();"); 7055 verifyGoogleFormat("A = new SomeType*[Length];"); 7056 verifyGoogleFormat("T** t = new T*;"); 7057 verifyGoogleFormat("T** t = new T*();"); 7058 7059 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7060 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7061 verifyFormat("template <bool a, bool b> " 7062 "typename t::if<x && y>::type f() {}"); 7063 verifyFormat("template <int *y> f() {}"); 7064 verifyFormat("vector<int *> v;"); 7065 verifyFormat("vector<int *const> v;"); 7066 verifyFormat("vector<int *const **const *> v;"); 7067 verifyFormat("vector<int *volatile> v;"); 7068 verifyFormat("vector<a * b> v;"); 7069 verifyFormat("foo<b && false>();"); 7070 verifyFormat("foo<b & 1>();"); 7071 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7072 verifyFormat( 7073 "template <class T, class = typename std::enable_if<\n" 7074 " std::is_integral<T>::value &&\n" 7075 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7076 "void F();", 7077 getLLVMStyleWithColumns(70)); 7078 verifyFormat( 7079 "template <class T,\n" 7080 " class = typename std::enable_if<\n" 7081 " std::is_integral<T>::value &&\n" 7082 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7083 " class U>\n" 7084 "void F();", 7085 getLLVMStyleWithColumns(70)); 7086 verifyFormat( 7087 "template <class T,\n" 7088 " class = typename ::std::enable_if<\n" 7089 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7090 "void F();", 7091 getGoogleStyleWithColumns(68)); 7092 7093 verifyIndependentOfContext("MACRO(int *i);"); 7094 verifyIndependentOfContext("MACRO(auto *a);"); 7095 verifyIndependentOfContext("MACRO(const A *a);"); 7096 verifyIndependentOfContext("MACRO(A *const a);"); 7097 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7098 verifyFormat("void f() { f(float{1}, a * a); }"); 7099 // FIXME: Is there a way to make this work? 7100 // verifyIndependentOfContext("MACRO(A *a);"); 7101 7102 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7103 verifyFormat("return options != nullptr && operator==(*options);"); 7104 7105 EXPECT_EQ("#define OP(x) \\\n" 7106 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7107 " return s << a.DebugString(); \\\n" 7108 " }", 7109 format("#define OP(x) \\\n" 7110 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7111 " return s << a.DebugString(); \\\n" 7112 " }", 7113 getLLVMStyleWithColumns(50))); 7114 7115 // FIXME: We cannot handle this case yet; we might be able to figure out that 7116 // foo<x> d > v; doesn't make sense. 7117 verifyFormat("foo<a<b && c> d> v;"); 7118 7119 FormatStyle PointerMiddle = getLLVMStyle(); 7120 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7121 verifyFormat("delete *x;", PointerMiddle); 7122 verifyFormat("int * x;", PointerMiddle); 7123 verifyFormat("int *[] x;", PointerMiddle); 7124 verifyFormat("template <int * y> f() {}", PointerMiddle); 7125 verifyFormat("int * f(int * a) {}", PointerMiddle); 7126 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7127 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7128 verifyFormat("A<int *> a;", PointerMiddle); 7129 verifyFormat("A<int **> a;", PointerMiddle); 7130 verifyFormat("A<int *, int *> a;", PointerMiddle); 7131 verifyFormat("A<int *[]> a;", PointerMiddle); 7132 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7133 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7134 verifyFormat("T ** t = new T *;", PointerMiddle); 7135 7136 // Member function reference qualifiers aren't binary operators. 7137 verifyFormat("string // break\n" 7138 "operator()() & {}"); 7139 verifyFormat("string // break\n" 7140 "operator()() && {}"); 7141 verifyGoogleFormat("template <typename T>\n" 7142 "auto x() & -> int {}"); 7143 } 7144 7145 TEST_F(FormatTest, UnderstandsAttributes) { 7146 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7147 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7148 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7149 FormatStyle AfterType = getLLVMStyle(); 7150 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7151 verifyFormat("__attribute__((nodebug)) void\n" 7152 "foo() {}\n", 7153 AfterType); 7154 } 7155 7156 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7157 verifyFormat("SomeType s [[unused]] (InitValue);"); 7158 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7159 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7160 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7161 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7162 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7163 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7164 7165 // Make sure we do not mistake attributes for array subscripts. 7166 verifyFormat("int a() {}\n" 7167 "[[unused]] int b() {}\n"); 7168 verifyFormat("NSArray *arr;\n" 7169 "arr[[Foo() bar]];"); 7170 7171 // On the other hand, we still need to correctly find array subscripts. 7172 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7173 7174 // Make sure that we do not mistake Objective-C method inside array literals 7175 // as attributes, even if those method names are also keywords. 7176 verifyFormat("@[ [foo bar] ];"); 7177 verifyFormat("@[ [NSArray class] ];"); 7178 verifyFormat("@[ [foo enum] ];"); 7179 7180 // Make sure we do not parse attributes as lambda introducers. 7181 FormatStyle MultiLineFunctions = getLLVMStyle(); 7182 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7183 verifyFormat("[[unused]] int b() {\n" 7184 " return 42;\n" 7185 "}\n", 7186 MultiLineFunctions); 7187 } 7188 7189 TEST_F(FormatTest, UnderstandsEllipsis) { 7190 verifyFormat("int printf(const char *fmt, ...);"); 7191 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7192 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7193 7194 FormatStyle PointersLeft = getLLVMStyle(); 7195 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7196 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7197 } 7198 7199 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7200 EXPECT_EQ("int *a;\n" 7201 "int *a;\n" 7202 "int *a;", 7203 format("int *a;\n" 7204 "int* a;\n" 7205 "int *a;", 7206 getGoogleStyle())); 7207 EXPECT_EQ("int* a;\n" 7208 "int* a;\n" 7209 "int* a;", 7210 format("int* a;\n" 7211 "int* a;\n" 7212 "int *a;", 7213 getGoogleStyle())); 7214 EXPECT_EQ("int *a;\n" 7215 "int *a;\n" 7216 "int *a;", 7217 format("int *a;\n" 7218 "int * a;\n" 7219 "int * a;", 7220 getGoogleStyle())); 7221 EXPECT_EQ("auto x = [] {\n" 7222 " int *a;\n" 7223 " int *a;\n" 7224 " int *a;\n" 7225 "};", 7226 format("auto x=[]{int *a;\n" 7227 "int * a;\n" 7228 "int * a;};", 7229 getGoogleStyle())); 7230 } 7231 7232 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7233 verifyFormat("int f(int &&a) {}"); 7234 verifyFormat("int f(int a, char &&b) {}"); 7235 verifyFormat("void f() { int &&a = b; }"); 7236 verifyGoogleFormat("int f(int a, char&& b) {}"); 7237 verifyGoogleFormat("void f() { int&& a = b; }"); 7238 7239 verifyIndependentOfContext("A<int &&> a;"); 7240 verifyIndependentOfContext("A<int &&, int &&> a;"); 7241 verifyGoogleFormat("A<int&&> a;"); 7242 verifyGoogleFormat("A<int&&, int&&> a;"); 7243 7244 // Not rvalue references: 7245 verifyFormat("template <bool B, bool C> class A {\n" 7246 " static_assert(B && C, \"Something is wrong\");\n" 7247 "};"); 7248 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7249 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7250 verifyFormat("#define A(a, b) (a && b)"); 7251 } 7252 7253 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7254 verifyFormat("void f() {\n" 7255 " x[aaaaaaaaa -\n" 7256 " b] = 23;\n" 7257 "}", 7258 getLLVMStyleWithColumns(15)); 7259 } 7260 7261 TEST_F(FormatTest, FormatsCasts) { 7262 verifyFormat("Type *A = static_cast<Type *>(P);"); 7263 verifyFormat("Type *A = (Type *)P;"); 7264 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7265 verifyFormat("int a = (int)(2.0f);"); 7266 verifyFormat("int a = (int)2.0f;"); 7267 verifyFormat("x[(int32)y];"); 7268 verifyFormat("x = (int32)y;"); 7269 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7270 verifyFormat("int a = (int)*b;"); 7271 verifyFormat("int a = (int)2.0f;"); 7272 verifyFormat("int a = (int)~0;"); 7273 verifyFormat("int a = (int)++a;"); 7274 verifyFormat("int a = (int)sizeof(int);"); 7275 verifyFormat("int a = (int)+2;"); 7276 verifyFormat("my_int a = (my_int)2.0f;"); 7277 verifyFormat("my_int a = (my_int)sizeof(int);"); 7278 verifyFormat("return (my_int)aaa;"); 7279 verifyFormat("#define x ((int)-1)"); 7280 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7281 verifyFormat("#define p(q) ((int *)&q)"); 7282 verifyFormat("fn(a)(b) + 1;"); 7283 7284 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7285 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7286 verifyFormat("my_int a = (my_int)~0;"); 7287 verifyFormat("my_int a = (my_int)++a;"); 7288 verifyFormat("my_int a = (my_int)-2;"); 7289 verifyFormat("my_int a = (my_int)1;"); 7290 verifyFormat("my_int a = (my_int *)1;"); 7291 verifyFormat("my_int a = (const my_int)-1;"); 7292 verifyFormat("my_int a = (const my_int *)-1;"); 7293 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7294 verifyFormat("my_int a = (ns::my_int)-2;"); 7295 verifyFormat("case (my_int)ONE:"); 7296 verifyFormat("auto x = (X)this;"); 7297 7298 // FIXME: single value wrapped with paren will be treated as cast. 7299 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7300 7301 verifyFormat("{ (void)F; }"); 7302 7303 // Don't break after a cast's 7304 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7305 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7306 " bbbbbbbbbbbbbbbbbbbbbb);"); 7307 7308 // These are not casts. 7309 verifyFormat("void f(int *) {}"); 7310 verifyFormat("f(foo)->b;"); 7311 verifyFormat("f(foo).b;"); 7312 verifyFormat("f(foo)(b);"); 7313 verifyFormat("f(foo)[b];"); 7314 verifyFormat("[](foo) { return 4; }(bar);"); 7315 verifyFormat("(*funptr)(foo)[4];"); 7316 verifyFormat("funptrs[4](foo)[4];"); 7317 verifyFormat("void f(int *);"); 7318 verifyFormat("void f(int *) = 0;"); 7319 verifyFormat("void f(SmallVector<int>) {}"); 7320 verifyFormat("void f(SmallVector<int>);"); 7321 verifyFormat("void f(SmallVector<int>) = 0;"); 7322 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7323 verifyFormat("int a = sizeof(int) * b;"); 7324 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7325 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7326 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7327 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7328 7329 // These are not casts, but at some point were confused with casts. 7330 verifyFormat("virtual void foo(int *) override;"); 7331 verifyFormat("virtual void foo(char &) const;"); 7332 verifyFormat("virtual void foo(int *a, char *) const;"); 7333 verifyFormat("int a = sizeof(int *) + b;"); 7334 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7335 verifyFormat("bool b = f(g<int>) && c;"); 7336 verifyFormat("typedef void (*f)(int i) func;"); 7337 7338 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7339 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7340 // FIXME: The indentation here is not ideal. 7341 verifyFormat( 7342 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7343 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7344 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7345 } 7346 7347 TEST_F(FormatTest, FormatsFunctionTypes) { 7348 verifyFormat("A<bool()> a;"); 7349 verifyFormat("A<SomeType()> a;"); 7350 verifyFormat("A<void (*)(int, std::string)> a;"); 7351 verifyFormat("A<void *(int)>;"); 7352 verifyFormat("void *(*a)(int *, SomeType *);"); 7353 verifyFormat("int (*func)(void *);"); 7354 verifyFormat("void f() { int (*func)(void *); }"); 7355 verifyFormat("template <class CallbackClass>\n" 7356 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7357 7358 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7359 verifyGoogleFormat("void* (*a)(int);"); 7360 verifyGoogleFormat( 7361 "template <class CallbackClass>\n" 7362 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7363 7364 // Other constructs can look somewhat like function types: 7365 verifyFormat("A<sizeof(*x)> a;"); 7366 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7367 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7368 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7369 verifyFormat("int x = f(&h)();"); 7370 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7371 verifyFormat("std::function<\n" 7372 " LooooooooooongTemplatedType<\n" 7373 " SomeType>*(\n" 7374 " LooooooooooooooooongType type)>\n" 7375 " function;", 7376 getGoogleStyleWithColumns(40)); 7377 } 7378 7379 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7380 verifyFormat("A (*foo_)[6];"); 7381 verifyFormat("vector<int> (*foo_)[6];"); 7382 } 7383 7384 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7385 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7386 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7387 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7388 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7389 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7390 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7391 7392 // Different ways of ()-initializiation. 7393 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7394 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7395 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7396 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7397 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7398 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7399 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7400 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7401 7402 // Lambdas should not confuse the variable declaration heuristic. 7403 verifyFormat("LooooooooooooooooongType\n" 7404 " variable(nullptr, [](A *a) {});", 7405 getLLVMStyleWithColumns(40)); 7406 } 7407 7408 TEST_F(FormatTest, BreaksLongDeclarations) { 7409 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7410 " AnotherNameForTheLongType;"); 7411 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7413 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7414 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7415 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7416 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7417 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7418 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7419 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7420 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7421 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7422 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7423 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7424 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7425 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7426 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7427 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7428 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7429 FormatStyle Indented = getLLVMStyle(); 7430 Indented.IndentWrappedFunctionNames = true; 7431 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7432 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7433 Indented); 7434 verifyFormat( 7435 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7436 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7437 Indented); 7438 verifyFormat( 7439 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7440 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7441 Indented); 7442 verifyFormat( 7443 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7444 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7445 Indented); 7446 7447 // FIXME: Without the comment, this breaks after "(". 7448 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7449 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7450 getGoogleStyle()); 7451 7452 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7453 " int LoooooooooooooooooooongParam2) {}"); 7454 verifyFormat( 7455 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7456 " SourceLocation L, IdentifierIn *II,\n" 7457 " Type *T) {}"); 7458 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7459 "ReallyReaaallyLongFunctionName(\n" 7460 " const std::string &SomeParameter,\n" 7461 " const SomeType<string, SomeOtherTemplateParameter>\n" 7462 " &ReallyReallyLongParameterName,\n" 7463 " const SomeType<string, SomeOtherTemplateParameter>\n" 7464 " &AnotherLongParameterName) {}"); 7465 verifyFormat("template <typename A>\n" 7466 "SomeLoooooooooooooooooooooongType<\n" 7467 " typename some_namespace::SomeOtherType<A>::Type>\n" 7468 "Function() {}"); 7469 7470 verifyGoogleFormat( 7471 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7472 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7473 verifyGoogleFormat( 7474 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7475 " SourceLocation L) {}"); 7476 verifyGoogleFormat( 7477 "some_namespace::LongReturnType\n" 7478 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7479 " int first_long_parameter, int second_parameter) {}"); 7480 7481 verifyGoogleFormat("template <typename T>\n" 7482 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7483 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7484 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7485 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7486 7487 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7488 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7489 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7490 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7491 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7492 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7493 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7494 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7495 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7497 7498 verifyFormat("template <typename T> // Templates on own line.\n" 7499 "static int // Some comment.\n" 7500 "MyFunction(int a);", 7501 getLLVMStyle()); 7502 } 7503 7504 TEST_F(FormatTest, FormatsArrays) { 7505 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7506 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7507 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7508 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7509 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7510 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7511 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7512 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7513 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7514 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7515 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7516 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7517 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7518 verifyFormat( 7519 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7520 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7521 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7522 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7523 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7524 7525 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7527 verifyFormat( 7528 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 7529 " .aaaaaaa[0]\n" 7530 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7531 verifyFormat("a[::b::c];"); 7532 7533 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 7534 7535 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 7536 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 7537 } 7538 7539 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 7540 verifyFormat("(a)->b();"); 7541 verifyFormat("--a;"); 7542 } 7543 7544 TEST_F(FormatTest, HandlesIncludeDirectives) { 7545 verifyFormat("#include <string>\n" 7546 "#include <a/b/c.h>\n" 7547 "#include \"a/b/string\"\n" 7548 "#include \"string.h\"\n" 7549 "#include \"string.h\"\n" 7550 "#include <a-a>\n" 7551 "#include < path with space >\n" 7552 "#include_next <test.h>" 7553 "#include \"abc.h\" // this is included for ABC\n" 7554 "#include \"some long include\" // with a comment\n" 7555 "#include \"some very long include path\"\n" 7556 "#include <some/very/long/include/path>\n", 7557 getLLVMStyleWithColumns(35)); 7558 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 7559 EXPECT_EQ("#include <a>", format("#include<a>")); 7560 7561 verifyFormat("#import <string>"); 7562 verifyFormat("#import <a/b/c.h>"); 7563 verifyFormat("#import \"a/b/string\""); 7564 verifyFormat("#import \"string.h\""); 7565 verifyFormat("#import \"string.h\""); 7566 verifyFormat("#if __has_include(<strstream>)\n" 7567 "#include <strstream>\n" 7568 "#endif"); 7569 7570 verifyFormat("#define MY_IMPORT <a/b>"); 7571 7572 verifyFormat("#if __has_include(<a/b>)"); 7573 verifyFormat("#if __has_include_next(<a/b>)"); 7574 verifyFormat("#define F __has_include(<a/b>)"); 7575 verifyFormat("#define F __has_include_next(<a/b>)"); 7576 7577 // Protocol buffer definition or missing "#". 7578 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 7579 getLLVMStyleWithColumns(30)); 7580 7581 FormatStyle Style = getLLVMStyle(); 7582 Style.AlwaysBreakBeforeMultilineStrings = true; 7583 Style.ColumnLimit = 0; 7584 verifyFormat("#import \"abc.h\"", Style); 7585 7586 // But 'import' might also be a regular C++ namespace. 7587 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7589 } 7590 7591 //===----------------------------------------------------------------------===// 7592 // Error recovery tests. 7593 //===----------------------------------------------------------------------===// 7594 7595 TEST_F(FormatTest, IncompleteParameterLists) { 7596 FormatStyle NoBinPacking = getLLVMStyle(); 7597 NoBinPacking.BinPackParameters = false; 7598 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 7599 " double *min_x,\n" 7600 " double *max_x,\n" 7601 " double *min_y,\n" 7602 " double *max_y,\n" 7603 " double *min_z,\n" 7604 " double *max_z, ) {}", 7605 NoBinPacking); 7606 } 7607 7608 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 7609 verifyFormat("void f() { return; }\n42"); 7610 verifyFormat("void f() {\n" 7611 " if (0)\n" 7612 " return;\n" 7613 "}\n" 7614 "42"); 7615 verifyFormat("void f() { return }\n42"); 7616 verifyFormat("void f() {\n" 7617 " if (0)\n" 7618 " return\n" 7619 "}\n" 7620 "42"); 7621 } 7622 7623 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 7624 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 7625 EXPECT_EQ("void f() {\n" 7626 " if (a)\n" 7627 " return\n" 7628 "}", 7629 format("void f ( ) { if ( a ) return }")); 7630 EXPECT_EQ("namespace N {\n" 7631 "void f()\n" 7632 "}", 7633 format("namespace N { void f() }")); 7634 EXPECT_EQ("namespace N {\n" 7635 "void f() {}\n" 7636 "void g()\n" 7637 "} // namespace N", 7638 format("namespace N { void f( ) { } void g( ) }")); 7639 } 7640 7641 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 7642 verifyFormat("int aaaaaaaa =\n" 7643 " // Overlylongcomment\n" 7644 " b;", 7645 getLLVMStyleWithColumns(20)); 7646 verifyFormat("function(\n" 7647 " ShortArgument,\n" 7648 " LoooooooooooongArgument);\n", 7649 getLLVMStyleWithColumns(20)); 7650 } 7651 7652 TEST_F(FormatTest, IncorrectAccessSpecifier) { 7653 verifyFormat("public:"); 7654 verifyFormat("class A {\n" 7655 "public\n" 7656 " void f() {}\n" 7657 "};"); 7658 verifyFormat("public\n" 7659 "int qwerty;"); 7660 verifyFormat("public\n" 7661 "B {}"); 7662 verifyFormat("public\n" 7663 "{}"); 7664 verifyFormat("public\n" 7665 "B { int x; }"); 7666 } 7667 7668 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 7669 verifyFormat("{"); 7670 verifyFormat("#})"); 7671 verifyNoCrash("(/**/[:!] ?[)."); 7672 } 7673 7674 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 7675 // Found by oss-fuzz: 7676 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 7677 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7678 Style.ColumnLimit = 60; 7679 verifyNoCrash( 7680 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 7681 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 7682 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 7683 Style); 7684 } 7685 7686 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 7687 verifyFormat("do {\n}"); 7688 verifyFormat("do {\n}\n" 7689 "f();"); 7690 verifyFormat("do {\n}\n" 7691 "wheeee(fun);"); 7692 verifyFormat("do {\n" 7693 " f();\n" 7694 "}"); 7695 } 7696 7697 TEST_F(FormatTest, IncorrectCodeMissingParens) { 7698 verifyFormat("if {\n foo;\n foo();\n}"); 7699 verifyFormat("switch {\n foo;\n foo();\n}"); 7700 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 7701 verifyFormat("while {\n foo;\n foo();\n}"); 7702 verifyFormat("do {\n foo;\n foo();\n} while;"); 7703 } 7704 7705 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 7706 verifyIncompleteFormat("namespace {\n" 7707 "class Foo { Foo (\n" 7708 "};\n" 7709 "} // namespace"); 7710 } 7711 7712 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 7713 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 7714 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 7715 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 7716 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 7717 7718 EXPECT_EQ("{\n" 7719 " {\n" 7720 " breakme(\n" 7721 " qwe);\n" 7722 " }\n", 7723 format("{\n" 7724 " {\n" 7725 " breakme(qwe);\n" 7726 "}\n", 7727 getLLVMStyleWithColumns(10))); 7728 } 7729 7730 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 7731 verifyFormat("int x = {\n" 7732 " avariable,\n" 7733 " b(alongervariable)};", 7734 getLLVMStyleWithColumns(25)); 7735 } 7736 7737 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 7738 verifyFormat("return (a)(b){1, 2, 3};"); 7739 } 7740 7741 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 7742 verifyFormat("vector<int> x{1, 2, 3, 4};"); 7743 verifyFormat("vector<int> x{\n" 7744 " 1,\n" 7745 " 2,\n" 7746 " 3,\n" 7747 " 4,\n" 7748 "};"); 7749 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 7750 verifyFormat("f({1, 2});"); 7751 verifyFormat("auto v = Foo{-1};"); 7752 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 7753 verifyFormat("Class::Class : member{1, 2, 3} {}"); 7754 verifyFormat("new vector<int>{1, 2, 3};"); 7755 verifyFormat("new int[3]{1, 2, 3};"); 7756 verifyFormat("new int{1};"); 7757 verifyFormat("return {arg1, arg2};"); 7758 verifyFormat("return {arg1, SomeType{parameter}};"); 7759 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 7760 verifyFormat("new T{arg1, arg2};"); 7761 verifyFormat("f(MyMap[{composite, key}]);"); 7762 verifyFormat("class Class {\n" 7763 " T member = {arg1, arg2};\n" 7764 "};"); 7765 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 7766 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 7767 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 7768 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 7769 verifyFormat("int a = std::is_integral<int>{} + 0;"); 7770 7771 verifyFormat("int foo(int i) { return fo1{}(i); }"); 7772 verifyFormat("int foo(int i) { return fo1{}(i); }"); 7773 verifyFormat("auto i = decltype(x){};"); 7774 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 7775 verifyFormat("Node n{1, Node{1000}, //\n" 7776 " 2};"); 7777 verifyFormat("Aaaa aaaaaaa{\n" 7778 " {\n" 7779 " aaaa,\n" 7780 " },\n" 7781 "};"); 7782 verifyFormat("class C : public D {\n" 7783 " SomeClass SC{2};\n" 7784 "};"); 7785 verifyFormat("class C : public A {\n" 7786 " class D : public B {\n" 7787 " void f() { int i{2}; }\n" 7788 " };\n" 7789 "};"); 7790 verifyFormat("#define A {a, a},"); 7791 7792 // Avoid breaking between equal sign and opening brace 7793 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 7794 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 7795 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 7796 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 7797 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 7798 " {\"ccccccccccccccccccccc\", 2}};", 7799 AvoidBreakingFirstArgument); 7800 7801 // Binpacking only if there is no trailing comma 7802 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 7803 " cccccccccc, dddddddddd};", 7804 getLLVMStyleWithColumns(50)); 7805 verifyFormat("const Aaaaaa aaaaa = {\n" 7806 " aaaaaaaaaaa,\n" 7807 " bbbbbbbbbbb,\n" 7808 " ccccccccccc,\n" 7809 " ddddddddddd,\n" 7810 "};", getLLVMStyleWithColumns(50)); 7811 7812 // Cases where distinguising braced lists and blocks is hard. 7813 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 7814 verifyFormat("void f() {\n" 7815 " return; // comment\n" 7816 "}\n" 7817 "SomeType t;"); 7818 verifyFormat("void f() {\n" 7819 " if (a) {\n" 7820 " f();\n" 7821 " }\n" 7822 "}\n" 7823 "SomeType t;"); 7824 7825 // In combination with BinPackArguments = false. 7826 FormatStyle NoBinPacking = getLLVMStyle(); 7827 NoBinPacking.BinPackArguments = false; 7828 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 7829 " bbbbb,\n" 7830 " ccccc,\n" 7831 " ddddd,\n" 7832 " eeeee,\n" 7833 " ffffff,\n" 7834 " ggggg,\n" 7835 " hhhhhh,\n" 7836 " iiiiii,\n" 7837 " jjjjjj,\n" 7838 " kkkkkk};", 7839 NoBinPacking); 7840 verifyFormat("const Aaaaaa aaaaa = {\n" 7841 " aaaaa,\n" 7842 " bbbbb,\n" 7843 " ccccc,\n" 7844 " ddddd,\n" 7845 " eeeee,\n" 7846 " ffffff,\n" 7847 " ggggg,\n" 7848 " hhhhhh,\n" 7849 " iiiiii,\n" 7850 " jjjjjj,\n" 7851 " kkkkkk,\n" 7852 "};", 7853 NoBinPacking); 7854 verifyFormat( 7855 "const Aaaaaa aaaaa = {\n" 7856 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 7857 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 7858 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 7859 "};", 7860 NoBinPacking); 7861 7862 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7863 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 7864 " CDDDP83848_BMCR_REGISTER,\n" 7865 " CDDDP83848_BMSR_REGISTER,\n" 7866 " CDDDP83848_RBR_REGISTER};", 7867 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 7868 " CDDDP83848_BMSR_REGISTER,\n" 7869 " CDDDP83848_RBR_REGISTER};", 7870 NoBinPacking)); 7871 7872 // FIXME: The alignment of these trailing comments might be bad. Then again, 7873 // this might be utterly useless in real code. 7874 verifyFormat("Constructor::Constructor()\n" 7875 " : some_value{ //\n" 7876 " aaaaaaa, //\n" 7877 " bbbbbbb} {}"); 7878 7879 // In braced lists, the first comment is always assumed to belong to the 7880 // first element. Thus, it can be moved to the next or previous line as 7881 // appropriate. 7882 EXPECT_EQ("function({// First element:\n" 7883 " 1,\n" 7884 " // Second element:\n" 7885 " 2});", 7886 format("function({\n" 7887 " // First element:\n" 7888 " 1,\n" 7889 " // Second element:\n" 7890 " 2});")); 7891 EXPECT_EQ("std::vector<int> MyNumbers{\n" 7892 " // First element:\n" 7893 " 1,\n" 7894 " // Second element:\n" 7895 " 2};", 7896 format("std::vector<int> MyNumbers{// First element:\n" 7897 " 1,\n" 7898 " // Second element:\n" 7899 " 2};", 7900 getLLVMStyleWithColumns(30))); 7901 // A trailing comma should still lead to an enforced line break and no 7902 // binpacking. 7903 EXPECT_EQ("vector<int> SomeVector = {\n" 7904 " // aaa\n" 7905 " 1,\n" 7906 " 2,\n" 7907 "};", 7908 format("vector<int> SomeVector = { // aaa\n" 7909 " 1, 2, };")); 7910 7911 FormatStyle ExtraSpaces = getLLVMStyle(); 7912 ExtraSpaces.Cpp11BracedListStyle = false; 7913 ExtraSpaces.ColumnLimit = 75; 7914 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 7915 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 7916 verifyFormat("f({ 1, 2 });", ExtraSpaces); 7917 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 7918 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 7919 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 7920 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 7921 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 7922 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 7923 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 7924 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 7925 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 7926 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 7927 verifyFormat("class Class {\n" 7928 " T member = { arg1, arg2 };\n" 7929 "};", 7930 ExtraSpaces); 7931 verifyFormat( 7932 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7933 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 7934 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 7935 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 7936 ExtraSpaces); 7937 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 7938 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 7939 ExtraSpaces); 7940 verifyFormat( 7941 "someFunction(OtherParam,\n" 7942 " BracedList{ // comment 1 (Forcing interesting break)\n" 7943 " param1, param2,\n" 7944 " // comment 2\n" 7945 " param3, param4 });", 7946 ExtraSpaces); 7947 verifyFormat( 7948 "std::this_thread::sleep_for(\n" 7949 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 7950 ExtraSpaces); 7951 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 7952 " aaaaaaa,\n" 7953 " aaaaaaaaaa,\n" 7954 " aaaaa,\n" 7955 " aaaaaaaaaaaaaaa,\n" 7956 " aaa,\n" 7957 " aaaaaaaaaa,\n" 7958 " a,\n" 7959 " aaaaaaaaaaaaaaaaaaaaa,\n" 7960 " aaaaaaaaaaaa,\n" 7961 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 7962 " aaaaaaa,\n" 7963 " a};"); 7964 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 7965 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 7966 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 7967 7968 // Avoid breaking between initializer/equal sign and opening brace 7969 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 7970 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 7971 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 7972 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 7973 " { \"ccccccccccccccccccccc\", 2 }\n" 7974 "};", 7975 ExtraSpaces); 7976 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 7977 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 7978 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 7979 " { \"ccccccccccccccccccccc\", 2 }\n" 7980 "};", 7981 ExtraSpaces); 7982 7983 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 7984 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 7985 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 7986 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 7987 } 7988 7989 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 7990 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7991 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7992 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7993 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7994 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7995 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 7996 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 7997 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7998 " 1, 22, 333, 4444, 55555, //\n" 7999 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8000 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8001 verifyFormat( 8002 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8003 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8004 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 8005 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8006 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8007 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8008 " 7777777};"); 8009 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8010 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8011 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8012 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8013 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8014 " // Separating comment.\n" 8015 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8016 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8017 " // Leading comment\n" 8018 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8019 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8020 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8021 " 1, 1, 1, 1};", 8022 getLLVMStyleWithColumns(39)); 8023 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8024 " 1, 1, 1, 1};", 8025 getLLVMStyleWithColumns(38)); 8026 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 8027 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 8028 getLLVMStyleWithColumns(43)); 8029 verifyFormat( 8030 "static unsigned SomeValues[10][3] = {\n" 8031 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 8032 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 8033 verifyFormat("static auto fields = new vector<string>{\n" 8034 " \"aaaaaaaaaaaaa\",\n" 8035 " \"aaaaaaaaaaaaa\",\n" 8036 " \"aaaaaaaaaaaa\",\n" 8037 " \"aaaaaaaaaaaaaa\",\n" 8038 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8039 " \"aaaaaaaaaaaa\",\n" 8040 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8041 "};"); 8042 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8043 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8044 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8045 " 3, cccccccccccccccccccccc};", 8046 getLLVMStyleWithColumns(60)); 8047 8048 // Trailing commas. 8049 verifyFormat("vector<int> x = {\n" 8050 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8051 "};", 8052 getLLVMStyleWithColumns(39)); 8053 verifyFormat("vector<int> x = {\n" 8054 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8055 "};", 8056 getLLVMStyleWithColumns(39)); 8057 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8058 " 1, 1, 1, 1,\n" 8059 " /**/ /**/};", 8060 getLLVMStyleWithColumns(39)); 8061 8062 // Trailing comment in the first line. 8063 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8064 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8065 " 111111111, 222222222, 3333333333, 444444444, //\n" 8066 " 11111111, 22222222, 333333333, 44444444};"); 8067 // Trailing comment in the last line. 8068 verifyFormat("int aaaaa[] = {\n" 8069 " 1, 2, 3, // comment\n" 8070 " 4, 5, 6 // comment\n" 8071 "};"); 8072 8073 // With nested lists, we should either format one item per line or all nested 8074 // lists one on line. 8075 // FIXME: For some nested lists, we can do better. 8076 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8077 " {aaaaaaaaaaaaaaaaaaa},\n" 8078 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8079 " {aaaaaaaaaaaaaaaaa}};", 8080 getLLVMStyleWithColumns(60)); 8081 verifyFormat( 8082 "SomeStruct my_struct_array = {\n" 8083 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8084 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8085 " {aaa, aaa},\n" 8086 " {aaa, aaa},\n" 8087 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8088 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8089 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8090 8091 // No column layout should be used here. 8092 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8093 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8094 8095 verifyNoCrash("a<,"); 8096 8097 // No braced initializer here. 8098 verifyFormat("void f() {\n" 8099 " struct Dummy {};\n" 8100 " f(v);\n" 8101 "}"); 8102 8103 // Long lists should be formatted in columns even if they are nested. 8104 verifyFormat( 8105 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8106 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8107 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8108 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8109 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8110 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8111 8112 // Allow "single-column" layout even if that violates the column limit. There 8113 // isn't going to be a better way. 8114 verifyFormat("std::vector<int> a = {\n" 8115 " aaaaaaaa,\n" 8116 " aaaaaaaa,\n" 8117 " aaaaaaaa,\n" 8118 " aaaaaaaa,\n" 8119 " aaaaaaaaaa,\n" 8120 " aaaaaaaa,\n" 8121 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8122 getLLVMStyleWithColumns(30)); 8123 verifyFormat("vector<int> aaaa = {\n" 8124 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8125 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8126 " aaaaaa.aaaaaaa,\n" 8127 " aaaaaa.aaaaaaa,\n" 8128 " aaaaaa.aaaaaaa,\n" 8129 " aaaaaa.aaaaaaa,\n" 8130 "};"); 8131 8132 // Don't create hanging lists. 8133 verifyFormat("someFunction(Param, {List1, List2,\n" 8134 " List3});", 8135 getLLVMStyleWithColumns(35)); 8136 verifyFormat("someFunction(Param, Param,\n" 8137 " {List1, List2,\n" 8138 " List3});", 8139 getLLVMStyleWithColumns(35)); 8140 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8141 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8142 } 8143 8144 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8145 FormatStyle DoNotMerge = getLLVMStyle(); 8146 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8147 8148 verifyFormat("void f() { return 42; }"); 8149 verifyFormat("void f() {\n" 8150 " return 42;\n" 8151 "}", 8152 DoNotMerge); 8153 verifyFormat("void f() {\n" 8154 " // Comment\n" 8155 "}"); 8156 verifyFormat("{\n" 8157 "#error {\n" 8158 " int a;\n" 8159 "}"); 8160 verifyFormat("{\n" 8161 " int a;\n" 8162 "#error {\n" 8163 "}"); 8164 verifyFormat("void f() {} // comment"); 8165 verifyFormat("void f() { int a; } // comment"); 8166 verifyFormat("void f() {\n" 8167 "} // comment", 8168 DoNotMerge); 8169 verifyFormat("void f() {\n" 8170 " int a;\n" 8171 "} // comment", 8172 DoNotMerge); 8173 verifyFormat("void f() {\n" 8174 "} // comment", 8175 getLLVMStyleWithColumns(15)); 8176 8177 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8178 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8179 8180 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8181 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8182 verifyFormat("class C {\n" 8183 " C()\n" 8184 " : iiiiiiii(nullptr),\n" 8185 " kkkkkkk(nullptr),\n" 8186 " mmmmmmm(nullptr),\n" 8187 " nnnnnnn(nullptr) {}\n" 8188 "};", 8189 getGoogleStyle()); 8190 8191 FormatStyle NoColumnLimit = getLLVMStyle(); 8192 NoColumnLimit.ColumnLimit = 0; 8193 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8194 EXPECT_EQ("class C {\n" 8195 " A() : b(0) {}\n" 8196 "};", 8197 format("class C{A():b(0){}};", NoColumnLimit)); 8198 EXPECT_EQ("A()\n" 8199 " : b(0) {\n" 8200 "}", 8201 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8202 8203 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8204 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8205 FormatStyle::SFS_None; 8206 EXPECT_EQ("A()\n" 8207 " : b(0) {\n" 8208 "}", 8209 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8210 EXPECT_EQ("A()\n" 8211 " : b(0) {\n" 8212 "}", 8213 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8214 8215 verifyFormat("#define A \\\n" 8216 " void f() { \\\n" 8217 " int i; \\\n" 8218 " }", 8219 getLLVMStyleWithColumns(20)); 8220 verifyFormat("#define A \\\n" 8221 " void f() { int i; }", 8222 getLLVMStyleWithColumns(21)); 8223 verifyFormat("#define A \\\n" 8224 " void f() { \\\n" 8225 " int i; \\\n" 8226 " } \\\n" 8227 " int j;", 8228 getLLVMStyleWithColumns(22)); 8229 verifyFormat("#define A \\\n" 8230 " void f() { int i; } \\\n" 8231 " int j;", 8232 getLLVMStyleWithColumns(23)); 8233 } 8234 8235 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8236 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8237 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8238 verifyFormat("class C {\n" 8239 " int f() {}\n" 8240 "};", 8241 MergeEmptyOnly); 8242 verifyFormat("class C {\n" 8243 " int f() {\n" 8244 " return 42;\n" 8245 " }\n" 8246 "};", 8247 MergeEmptyOnly); 8248 verifyFormat("int f() {}", MergeEmptyOnly); 8249 verifyFormat("int f() {\n" 8250 " return 42;\n" 8251 "}", 8252 MergeEmptyOnly); 8253 8254 // Also verify behavior when BraceWrapping.AfterFunction = true 8255 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8256 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8257 verifyFormat("int f() {}", MergeEmptyOnly); 8258 verifyFormat("class C {\n" 8259 " int f() {}\n" 8260 "};", 8261 MergeEmptyOnly); 8262 } 8263 8264 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8265 FormatStyle MergeInlineOnly = getLLVMStyle(); 8266 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8267 verifyFormat("class C {\n" 8268 " int f() { return 42; }\n" 8269 "};", 8270 MergeInlineOnly); 8271 verifyFormat("int f() {\n" 8272 " return 42;\n" 8273 "}", 8274 MergeInlineOnly); 8275 8276 // SFS_Inline implies SFS_Empty 8277 verifyFormat("class C {\n" 8278 " int f() {}\n" 8279 "};", 8280 MergeInlineOnly); 8281 verifyFormat("int f() {}", MergeInlineOnly); 8282 8283 // Also verify behavior when BraceWrapping.AfterFunction = true 8284 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8285 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8286 verifyFormat("class C {\n" 8287 " int f() { return 42; }\n" 8288 "};", 8289 MergeInlineOnly); 8290 verifyFormat("int f()\n" 8291 "{\n" 8292 " return 42;\n" 8293 "}", 8294 MergeInlineOnly); 8295 8296 // SFS_Inline implies SFS_Empty 8297 verifyFormat("int f() {}", MergeInlineOnly); 8298 verifyFormat("class C {\n" 8299 " int f() {}\n" 8300 "};", 8301 MergeInlineOnly); 8302 } 8303 8304 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8305 FormatStyle MergeInlineOnly = getLLVMStyle(); 8306 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8307 FormatStyle::SFS_InlineOnly; 8308 verifyFormat("class C {\n" 8309 " int f() { return 42; }\n" 8310 "};", 8311 MergeInlineOnly); 8312 verifyFormat("int f() {\n" 8313 " return 42;\n" 8314 "}", 8315 MergeInlineOnly); 8316 8317 // SFS_InlineOnly does not imply SFS_Empty 8318 verifyFormat("class C {\n" 8319 " int f() {}\n" 8320 "};", 8321 MergeInlineOnly); 8322 verifyFormat("int f() {\n" 8323 "}", 8324 MergeInlineOnly); 8325 8326 // Also verify behavior when BraceWrapping.AfterFunction = true 8327 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8328 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8329 verifyFormat("class C {\n" 8330 " int f() { return 42; }\n" 8331 "};", 8332 MergeInlineOnly); 8333 verifyFormat("int f()\n" 8334 "{\n" 8335 " return 42;\n" 8336 "}", 8337 MergeInlineOnly); 8338 8339 // SFS_InlineOnly does not imply SFS_Empty 8340 verifyFormat("int f()\n" 8341 "{\n" 8342 "}", 8343 MergeInlineOnly); 8344 verifyFormat("class C {\n" 8345 " int f() {}\n" 8346 "};", 8347 MergeInlineOnly); 8348 } 8349 8350 TEST_F(FormatTest, SplitEmptyFunction) { 8351 FormatStyle Style = getLLVMStyle(); 8352 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8353 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8354 Style.BraceWrapping.AfterFunction = true; 8355 Style.BraceWrapping.SplitEmptyFunction = false; 8356 Style.ColumnLimit = 40; 8357 8358 verifyFormat("int f()\n" 8359 "{}", 8360 Style); 8361 verifyFormat("int f()\n" 8362 "{\n" 8363 " return 42;\n" 8364 "}", 8365 Style); 8366 verifyFormat("int f()\n" 8367 "{\n" 8368 " // some comment\n" 8369 "}", 8370 Style); 8371 8372 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8373 verifyFormat("int f() {}", Style); 8374 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8375 "{}", 8376 Style); 8377 verifyFormat("int f()\n" 8378 "{\n" 8379 " return 0;\n" 8380 "}", 8381 Style); 8382 8383 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8384 verifyFormat("class Foo {\n" 8385 " int f() {}\n" 8386 "};\n", 8387 Style); 8388 verifyFormat("class Foo {\n" 8389 " int f() { return 0; }\n" 8390 "};\n", 8391 Style); 8392 verifyFormat("class Foo {\n" 8393 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8394 " {}\n" 8395 "};\n", 8396 Style); 8397 verifyFormat("class Foo {\n" 8398 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8399 " {\n" 8400 " return 0;\n" 8401 " }\n" 8402 "};\n", 8403 Style); 8404 8405 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8406 verifyFormat("int f() {}", Style); 8407 verifyFormat("int f() { return 0; }", Style); 8408 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8409 "{}", 8410 Style); 8411 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8412 "{\n" 8413 " return 0;\n" 8414 "}", 8415 Style); 8416 } 8417 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8418 FormatStyle Style = getLLVMStyle(); 8419 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8420 verifyFormat("#ifdef A\n" 8421 "int f() {}\n" 8422 "#else\n" 8423 "int g() {}\n" 8424 "#endif", 8425 Style); 8426 } 8427 8428 TEST_F(FormatTest, SplitEmptyClass) { 8429 FormatStyle Style = getLLVMStyle(); 8430 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8431 Style.BraceWrapping.AfterClass = true; 8432 Style.BraceWrapping.SplitEmptyRecord = false; 8433 8434 verifyFormat("class Foo\n" 8435 "{};", 8436 Style); 8437 verifyFormat("/* something */ class Foo\n" 8438 "{};", 8439 Style); 8440 verifyFormat("template <typename X> class Foo\n" 8441 "{};", 8442 Style); 8443 verifyFormat("class Foo\n" 8444 "{\n" 8445 " Foo();\n" 8446 "};", 8447 Style); 8448 verifyFormat("typedef class Foo\n" 8449 "{\n" 8450 "} Foo_t;", 8451 Style); 8452 } 8453 8454 TEST_F(FormatTest, SplitEmptyStruct) { 8455 FormatStyle Style = getLLVMStyle(); 8456 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8457 Style.BraceWrapping.AfterStruct = true; 8458 Style.BraceWrapping.SplitEmptyRecord = false; 8459 8460 verifyFormat("struct Foo\n" 8461 "{};", 8462 Style); 8463 verifyFormat("/* something */ struct Foo\n" 8464 "{};", 8465 Style); 8466 verifyFormat("template <typename X> struct Foo\n" 8467 "{};", 8468 Style); 8469 verifyFormat("struct Foo\n" 8470 "{\n" 8471 " Foo();\n" 8472 "};", 8473 Style); 8474 verifyFormat("typedef struct Foo\n" 8475 "{\n" 8476 "} Foo_t;", 8477 Style); 8478 //typedef struct Bar {} Bar_t; 8479 } 8480 8481 TEST_F(FormatTest, SplitEmptyUnion) { 8482 FormatStyle Style = getLLVMStyle(); 8483 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8484 Style.BraceWrapping.AfterUnion = true; 8485 Style.BraceWrapping.SplitEmptyRecord = false; 8486 8487 verifyFormat("union Foo\n" 8488 "{};", 8489 Style); 8490 verifyFormat("/* something */ union Foo\n" 8491 "{};", 8492 Style); 8493 verifyFormat("union Foo\n" 8494 "{\n" 8495 " A,\n" 8496 "};", 8497 Style); 8498 verifyFormat("typedef union Foo\n" 8499 "{\n" 8500 "} Foo_t;", 8501 Style); 8502 } 8503 8504 TEST_F(FormatTest, SplitEmptyNamespace) { 8505 FormatStyle Style = getLLVMStyle(); 8506 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8507 Style.BraceWrapping.AfterNamespace = true; 8508 Style.BraceWrapping.SplitEmptyNamespace = false; 8509 8510 verifyFormat("namespace Foo\n" 8511 "{};", 8512 Style); 8513 verifyFormat("/* something */ namespace Foo\n" 8514 "{};", 8515 Style); 8516 verifyFormat("inline namespace Foo\n" 8517 "{};", 8518 Style); 8519 verifyFormat("/* something */ inline namespace Foo\n" 8520 "{};", 8521 Style); 8522 verifyFormat("export namespace Foo\n" 8523 "{};", 8524 Style); 8525 verifyFormat("namespace Foo\n" 8526 "{\n" 8527 "void Bar();\n" 8528 "};", 8529 Style); 8530 } 8531 8532 TEST_F(FormatTest, NeverMergeShortRecords) { 8533 FormatStyle Style = getLLVMStyle(); 8534 8535 verifyFormat("class Foo {\n" 8536 " Foo();\n" 8537 "};", 8538 Style); 8539 verifyFormat("typedef class Foo {\n" 8540 " Foo();\n" 8541 "} Foo_t;", 8542 Style); 8543 verifyFormat("struct Foo {\n" 8544 " Foo();\n" 8545 "};", 8546 Style); 8547 verifyFormat("typedef struct Foo {\n" 8548 " Foo();\n" 8549 "} Foo_t;", 8550 Style); 8551 verifyFormat("union Foo {\n" 8552 " A,\n" 8553 "};", 8554 Style); 8555 verifyFormat("typedef union Foo {\n" 8556 " A,\n" 8557 "} Foo_t;", 8558 Style); 8559 verifyFormat("namespace Foo {\n" 8560 "void Bar();\n" 8561 "};", 8562 Style); 8563 8564 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8565 Style.BraceWrapping.AfterClass = true; 8566 Style.BraceWrapping.AfterStruct = true; 8567 Style.BraceWrapping.AfterUnion = true; 8568 Style.BraceWrapping.AfterNamespace = true; 8569 verifyFormat("class Foo\n" 8570 "{\n" 8571 " Foo();\n" 8572 "};", 8573 Style); 8574 verifyFormat("typedef class Foo\n" 8575 "{\n" 8576 " Foo();\n" 8577 "} Foo_t;", 8578 Style); 8579 verifyFormat("struct Foo\n" 8580 "{\n" 8581 " Foo();\n" 8582 "};", 8583 Style); 8584 verifyFormat("typedef struct Foo\n" 8585 "{\n" 8586 " Foo();\n" 8587 "} Foo_t;", 8588 Style); 8589 verifyFormat("union Foo\n" 8590 "{\n" 8591 " A,\n" 8592 "};", 8593 Style); 8594 verifyFormat("typedef union Foo\n" 8595 "{\n" 8596 " A,\n" 8597 "} Foo_t;", 8598 Style); 8599 verifyFormat("namespace Foo\n" 8600 "{\n" 8601 "void Bar();\n" 8602 "};", 8603 Style); 8604 } 8605 8606 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 8607 // Elaborate type variable declarations. 8608 verifyFormat("struct foo a = {bar};\nint n;"); 8609 verifyFormat("class foo a = {bar};\nint n;"); 8610 verifyFormat("union foo a = {bar};\nint n;"); 8611 8612 // Elaborate types inside function definitions. 8613 verifyFormat("struct foo f() {}\nint n;"); 8614 verifyFormat("class foo f() {}\nint n;"); 8615 verifyFormat("union foo f() {}\nint n;"); 8616 8617 // Templates. 8618 verifyFormat("template <class X> void f() {}\nint n;"); 8619 verifyFormat("template <struct X> void f() {}\nint n;"); 8620 verifyFormat("template <union X> void f() {}\nint n;"); 8621 8622 // Actual definitions... 8623 verifyFormat("struct {\n} n;"); 8624 verifyFormat( 8625 "template <template <class T, class Y>, class Z> class X {\n} n;"); 8626 verifyFormat("union Z {\n int n;\n} x;"); 8627 verifyFormat("class MACRO Z {\n} n;"); 8628 verifyFormat("class MACRO(X) Z {\n} n;"); 8629 verifyFormat("class __attribute__(X) Z {\n} n;"); 8630 verifyFormat("class __declspec(X) Z {\n} n;"); 8631 verifyFormat("class A##B##C {\n} n;"); 8632 verifyFormat("class alignas(16) Z {\n} n;"); 8633 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 8634 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 8635 8636 // Redefinition from nested context: 8637 verifyFormat("class A::B::C {\n} n;"); 8638 8639 // Template definitions. 8640 verifyFormat( 8641 "template <typename F>\n" 8642 "Matcher(const Matcher<F> &Other,\n" 8643 " typename enable_if_c<is_base_of<F, T>::value &&\n" 8644 " !is_same<F, T>::value>::type * = 0)\n" 8645 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 8646 8647 // FIXME: This is still incorrectly handled at the formatter side. 8648 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 8649 verifyFormat("int i = SomeFunction(a<b, a> b);"); 8650 8651 // FIXME: 8652 // This now gets parsed incorrectly as class definition. 8653 // verifyFormat("class A<int> f() {\n}\nint n;"); 8654 8655 // Elaborate types where incorrectly parsing the structural element would 8656 // break the indent. 8657 verifyFormat("if (true)\n" 8658 " class X x;\n" 8659 "else\n" 8660 " f();\n"); 8661 8662 // This is simply incomplete. Formatting is not important, but must not crash. 8663 verifyFormat("class A:"); 8664 } 8665 8666 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 8667 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 8668 format("#error Leave all white!!!!! space* alone!\n")); 8669 EXPECT_EQ( 8670 "#warning Leave all white!!!!! space* alone!\n", 8671 format("#warning Leave all white!!!!! space* alone!\n")); 8672 EXPECT_EQ("#error 1", format(" # error 1")); 8673 EXPECT_EQ("#warning 1", format(" # warning 1")); 8674 } 8675 8676 TEST_F(FormatTest, FormatHashIfExpressions) { 8677 verifyFormat("#if AAAA && BBBB"); 8678 verifyFormat("#if (AAAA && BBBB)"); 8679 verifyFormat("#elif (AAAA && BBBB)"); 8680 // FIXME: Come up with a better indentation for #elif. 8681 verifyFormat( 8682 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 8683 " defined(BBBBBBBB)\n" 8684 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 8685 " defined(BBBBBBBB)\n" 8686 "#endif", 8687 getLLVMStyleWithColumns(65)); 8688 } 8689 8690 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 8691 FormatStyle AllowsMergedIf = getGoogleStyle(); 8692 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 8693 FormatStyle::SIS_WithoutElse; 8694 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 8695 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 8696 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 8697 EXPECT_EQ("if (true) return 42;", 8698 format("if (true)\nreturn 42;", AllowsMergedIf)); 8699 FormatStyle ShortMergedIf = AllowsMergedIf; 8700 ShortMergedIf.ColumnLimit = 25; 8701 verifyFormat("#define A \\\n" 8702 " if (true) return 42;", 8703 ShortMergedIf); 8704 verifyFormat("#define A \\\n" 8705 " f(); \\\n" 8706 " if (true)\n" 8707 "#define B", 8708 ShortMergedIf); 8709 verifyFormat("#define A \\\n" 8710 " f(); \\\n" 8711 " if (true)\n" 8712 "g();", 8713 ShortMergedIf); 8714 verifyFormat("{\n" 8715 "#ifdef A\n" 8716 " // Comment\n" 8717 " if (true) continue;\n" 8718 "#endif\n" 8719 " // Comment\n" 8720 " if (true) continue;\n" 8721 "}", 8722 ShortMergedIf); 8723 ShortMergedIf.ColumnLimit = 33; 8724 verifyFormat("#define A \\\n" 8725 " if constexpr (true) return 42;", 8726 ShortMergedIf); 8727 verifyFormat("#define A \\\n" 8728 " if CONSTEXPR (true) return 42;", 8729 ShortMergedIf); 8730 ShortMergedIf.ColumnLimit = 29; 8731 verifyFormat("#define A \\\n" 8732 " if (aaaaaaaaaa) return 1; \\\n" 8733 " return 2;", 8734 ShortMergedIf); 8735 ShortMergedIf.ColumnLimit = 28; 8736 verifyFormat("#define A \\\n" 8737 " if (aaaaaaaaaa) \\\n" 8738 " return 1; \\\n" 8739 " return 2;", 8740 ShortMergedIf); 8741 verifyFormat("#define A \\\n" 8742 " if constexpr (aaaaaaa) \\\n" 8743 " return 1; \\\n" 8744 " return 2;", 8745 ShortMergedIf); 8746 verifyFormat("#define A \\\n" 8747 " if CONSTEXPR (aaaaaaa) \\\n" 8748 " return 1; \\\n" 8749 " return 2;", 8750 ShortMergedIf); 8751 } 8752 8753 TEST_F(FormatTest, FormatStarDependingOnContext) { 8754 verifyFormat("void f(int *a);"); 8755 verifyFormat("void f() { f(fint * b); }"); 8756 verifyFormat("class A {\n void f(int *a);\n};"); 8757 verifyFormat("class A {\n int *a;\n};"); 8758 verifyFormat("namespace a {\n" 8759 "namespace b {\n" 8760 "class A {\n" 8761 " void f() {}\n" 8762 " int *a;\n" 8763 "};\n" 8764 "} // namespace b\n" 8765 "} // namespace a"); 8766 } 8767 8768 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 8769 verifyFormat("while"); 8770 verifyFormat("operator"); 8771 } 8772 8773 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 8774 // This code would be painfully slow to format if we didn't skip it. 8775 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 8776 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8777 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8778 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8779 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8780 "A(1, 1)\n" 8781 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 8782 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8783 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8784 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8785 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8786 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8787 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8788 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8789 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8790 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 8791 // Deeply nested part is untouched, rest is formatted. 8792 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 8793 format(std::string("int i;\n") + Code + "int j;\n", 8794 getLLVMStyle(), SC_ExpectIncomplete)); 8795 } 8796 8797 //===----------------------------------------------------------------------===// 8798 // Objective-C tests. 8799 //===----------------------------------------------------------------------===// 8800 8801 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 8802 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 8803 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 8804 format("-(NSUInteger)indexOfObject:(id)anObject;")); 8805 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 8806 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 8807 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 8808 format("-(NSInteger)Method3:(id)anObject;")); 8809 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 8810 format("-(NSInteger)Method4:(id)anObject;")); 8811 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 8812 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 8813 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 8814 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 8815 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 8816 "forAllCells:(BOOL)flag;", 8817 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 8818 "forAllCells:(BOOL)flag;")); 8819 8820 // Very long objectiveC method declaration. 8821 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 8822 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 8823 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 8824 " inRange:(NSRange)range\n" 8825 " outRange:(NSRange)out_range\n" 8826 " outRange1:(NSRange)out_range1\n" 8827 " outRange2:(NSRange)out_range2\n" 8828 " outRange3:(NSRange)out_range3\n" 8829 " outRange4:(NSRange)out_range4\n" 8830 " outRange5:(NSRange)out_range5\n" 8831 " outRange6:(NSRange)out_range6\n" 8832 " outRange7:(NSRange)out_range7\n" 8833 " outRange8:(NSRange)out_range8\n" 8834 " outRange9:(NSRange)out_range9;"); 8835 8836 // When the function name has to be wrapped. 8837 FormatStyle Style = getLLVMStyle(); 8838 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 8839 // and always indents instead. 8840 Style.IndentWrappedFunctionNames = false; 8841 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 8842 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 8843 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 8844 "}", 8845 Style); 8846 Style.IndentWrappedFunctionNames = true; 8847 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 8848 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 8849 " anotherName:(NSString)dddddddddddddd {\n" 8850 "}", 8851 Style); 8852 8853 verifyFormat("- (int)sum:(vector<int>)numbers;"); 8854 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 8855 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 8856 // protocol lists (but not for template classes): 8857 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 8858 8859 verifyFormat("- (int (*)())foo:(int (*)())f;"); 8860 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 8861 8862 // If there's no return type (very rare in practice!), LLVM and Google style 8863 // agree. 8864 verifyFormat("- foo;"); 8865 verifyFormat("- foo:(int)f;"); 8866 verifyGoogleFormat("- foo:(int)foo;"); 8867 } 8868 8869 8870 TEST_F(FormatTest, BreaksStringLiterals) { 8871 EXPECT_EQ("\"some text \"\n" 8872 "\"other\";", 8873 format("\"some text other\";", getLLVMStyleWithColumns(12))); 8874 EXPECT_EQ("\"some text \"\n" 8875 "\"other\";", 8876 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 8877 EXPECT_EQ( 8878 "#define A \\\n" 8879 " \"some \" \\\n" 8880 " \"text \" \\\n" 8881 " \"other\";", 8882 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 8883 EXPECT_EQ( 8884 "#define A \\\n" 8885 " \"so \" \\\n" 8886 " \"text \" \\\n" 8887 " \"other\";", 8888 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 8889 8890 EXPECT_EQ("\"some text\"", 8891 format("\"some text\"", getLLVMStyleWithColumns(1))); 8892 EXPECT_EQ("\"some text\"", 8893 format("\"some text\"", getLLVMStyleWithColumns(11))); 8894 EXPECT_EQ("\"some \"\n" 8895 "\"text\"", 8896 format("\"some text\"", getLLVMStyleWithColumns(10))); 8897 EXPECT_EQ("\"some \"\n" 8898 "\"text\"", 8899 format("\"some text\"", getLLVMStyleWithColumns(7))); 8900 EXPECT_EQ("\"some\"\n" 8901 "\" tex\"\n" 8902 "\"t\"", 8903 format("\"some text\"", getLLVMStyleWithColumns(6))); 8904 EXPECT_EQ("\"some\"\n" 8905 "\" tex\"\n" 8906 "\" and\"", 8907 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 8908 EXPECT_EQ("\"some\"\n" 8909 "\"/tex\"\n" 8910 "\"/and\"", 8911 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 8912 8913 EXPECT_EQ("variable =\n" 8914 " \"long string \"\n" 8915 " \"literal\";", 8916 format("variable = \"long string literal\";", 8917 getLLVMStyleWithColumns(20))); 8918 8919 EXPECT_EQ("variable = f(\n" 8920 " \"long string \"\n" 8921 " \"literal\",\n" 8922 " short,\n" 8923 " loooooooooooooooooooong);", 8924 format("variable = f(\"long string literal\", short, " 8925 "loooooooooooooooooooong);", 8926 getLLVMStyleWithColumns(20))); 8927 8928 EXPECT_EQ( 8929 "f(g(\"long string \"\n" 8930 " \"literal\"),\n" 8931 " b);", 8932 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 8933 EXPECT_EQ("f(g(\"long string \"\n" 8934 " \"literal\",\n" 8935 " a),\n" 8936 " b);", 8937 format("f(g(\"long string literal\", a), b);", 8938 getLLVMStyleWithColumns(20))); 8939 EXPECT_EQ( 8940 "f(\"one two\".split(\n" 8941 " variable));", 8942 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 8943 EXPECT_EQ("f(\"one two three four five six \"\n" 8944 " \"seven\".split(\n" 8945 " really_looooong_variable));", 8946 format("f(\"one two three four five six seven\"." 8947 "split(really_looooong_variable));", 8948 getLLVMStyleWithColumns(33))); 8949 8950 EXPECT_EQ("f(\"some \"\n" 8951 " \"text\",\n" 8952 " other);", 8953 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 8954 8955 // Only break as a last resort. 8956 verifyFormat( 8957 "aaaaaaaaaaaaaaaaaaaa(\n" 8958 " aaaaaaaaaaaaaaaaaaaa,\n" 8959 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 8960 8961 EXPECT_EQ("\"splitmea\"\n" 8962 "\"trandomp\"\n" 8963 "\"oint\"", 8964 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 8965 8966 EXPECT_EQ("\"split/\"\n" 8967 "\"pathat/\"\n" 8968 "\"slashes\"", 8969 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 8970 8971 EXPECT_EQ("\"split/\"\n" 8972 "\"pathat/\"\n" 8973 "\"slashes\"", 8974 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 8975 EXPECT_EQ("\"split at \"\n" 8976 "\"spaces/at/\"\n" 8977 "\"slashes.at.any$\"\n" 8978 "\"non-alphanumeric%\"\n" 8979 "\"1111111111characte\"\n" 8980 "\"rs\"", 8981 format("\"split at " 8982 "spaces/at/" 8983 "slashes.at." 8984 "any$non-" 8985 "alphanumeric%" 8986 "1111111111characte" 8987 "rs\"", 8988 getLLVMStyleWithColumns(20))); 8989 8990 // Verify that splitting the strings understands 8991 // Style::AlwaysBreakBeforeMultilineStrings. 8992 EXPECT_EQ( 8993 "aaaaaaaaaaaa(\n" 8994 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 8995 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 8996 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 8997 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 8998 "aaaaaaaaaaaaaaaaaaaaaa\");", 8999 getGoogleStyle())); 9000 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9001 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9002 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9003 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9004 "aaaaaaaaaaaaaaaaaaaaaa\";", 9005 getGoogleStyle())); 9006 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9007 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9008 format("llvm::outs() << " 9009 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 9010 "aaaaaaaaaaaaaaaaaaa\";")); 9011 EXPECT_EQ("ffff(\n" 9012 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9013 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9014 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 9015 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9016 getGoogleStyle())); 9017 9018 FormatStyle Style = getLLVMStyleWithColumns(12); 9019 Style.BreakStringLiterals = false; 9020 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 9021 9022 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 9023 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9024 EXPECT_EQ("#define A \\\n" 9025 " \"some \" \\\n" 9026 " \"text \" \\\n" 9027 " \"other\";", 9028 format("#define A \"some text other\";", AlignLeft)); 9029 } 9030 9031 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 9032 EXPECT_EQ("C a = \"some more \"\n" 9033 " \"text\";", 9034 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9035 } 9036 9037 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9038 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9039 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9040 EXPECT_EQ("int i = a(b());", 9041 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9042 } 9043 9044 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9045 EXPECT_EQ( 9046 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9047 "(\n" 9048 " \"x\t\");", 9049 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9050 "aaaaaaa(" 9051 "\"x\t\");")); 9052 } 9053 9054 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9055 EXPECT_EQ( 9056 "u8\"utf8 string \"\n" 9057 "u8\"literal\";", 9058 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9059 EXPECT_EQ( 9060 "u\"utf16 string \"\n" 9061 "u\"literal\";", 9062 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9063 EXPECT_EQ( 9064 "U\"utf32 string \"\n" 9065 "U\"literal\";", 9066 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9067 EXPECT_EQ("L\"wide string \"\n" 9068 "L\"literal\";", 9069 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9070 EXPECT_EQ("@\"NSString \"\n" 9071 "@\"literal\";", 9072 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9073 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9074 9075 // This input makes clang-format try to split the incomplete unicode escape 9076 // sequence, which used to lead to a crasher. 9077 verifyNoCrash( 9078 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9079 getLLVMStyleWithColumns(60)); 9080 } 9081 9082 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9083 FormatStyle Style = getGoogleStyleWithColumns(15); 9084 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9085 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9086 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9087 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9088 EXPECT_EQ("u8R\"x(raw literal)x\";", 9089 format("u8R\"x(raw literal)x\";", Style)); 9090 } 9091 9092 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9093 FormatStyle Style = getLLVMStyleWithColumns(20); 9094 EXPECT_EQ( 9095 "_T(\"aaaaaaaaaaaaaa\")\n" 9096 "_T(\"aaaaaaaaaaaaaa\")\n" 9097 "_T(\"aaaaaaaaaaaa\")", 9098 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9099 EXPECT_EQ("f(x,\n" 9100 " _T(\"aaaaaaaaaaaa\")\n" 9101 " _T(\"aaa\"),\n" 9102 " z);", 9103 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9104 9105 // FIXME: Handle embedded spaces in one iteration. 9106 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9107 // "_T(\"aaaaaaaaaaaaa\")\n" 9108 // "_T(\"aaaaaaaaaaaaa\")\n" 9109 // "_T(\"a\")", 9110 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9111 // getLLVMStyleWithColumns(20))); 9112 EXPECT_EQ( 9113 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9114 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9115 EXPECT_EQ("f(\n" 9116 "#if !TEST\n" 9117 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9118 "#endif\n" 9119 ");", 9120 format("f(\n" 9121 "#if !TEST\n" 9122 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9123 "#endif\n" 9124 ");")); 9125 EXPECT_EQ("f(\n" 9126 "\n" 9127 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9128 format("f(\n" 9129 "\n" 9130 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9131 } 9132 9133 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9134 // In a function call with two operands, the second can be broken with no line 9135 // break before it. 9136 EXPECT_EQ("func(a, \"long long \"\n" 9137 " \"long long\");", 9138 format("func(a, \"long long long long\");", 9139 getLLVMStyleWithColumns(24))); 9140 // In a function call with three operands, the second must be broken with a 9141 // line break before it. 9142 EXPECT_EQ("func(a,\n" 9143 " \"long long long \"\n" 9144 " \"long\",\n" 9145 " c);", 9146 format("func(a, \"long long long long\", c);", 9147 getLLVMStyleWithColumns(24))); 9148 // In a function call with three operands, the third must be broken with a 9149 // line break before it. 9150 EXPECT_EQ("func(a, b,\n" 9151 " \"long long long \"\n" 9152 " \"long\");", 9153 format("func(a, b, \"long long long long\");", 9154 getLLVMStyleWithColumns(24))); 9155 // In a function call with three operands, both the second and the third must 9156 // be broken with a line break before them. 9157 EXPECT_EQ("func(a,\n" 9158 " \"long long long \"\n" 9159 " \"long\",\n" 9160 " \"long long long \"\n" 9161 " \"long\");", 9162 format("func(a, \"long long long long\", \"long long long long\");", 9163 getLLVMStyleWithColumns(24))); 9164 // In a chain of << with two operands, the second can be broken with no line 9165 // break before it. 9166 EXPECT_EQ("a << \"line line \"\n" 9167 " \"line\";", 9168 format("a << \"line line line\";", 9169 getLLVMStyleWithColumns(20))); 9170 // In a chain of << with three operands, the second can be broken with no line 9171 // break before it. 9172 EXPECT_EQ("abcde << \"line \"\n" 9173 " \"line line\"\n" 9174 " << c;", 9175 format("abcde << \"line line line\" << c;", 9176 getLLVMStyleWithColumns(20))); 9177 // In a chain of << with three operands, the third must be broken with a line 9178 // break before it. 9179 EXPECT_EQ("a << b\n" 9180 " << \"line line \"\n" 9181 " \"line\";", 9182 format("a << b << \"line line line\";", 9183 getLLVMStyleWithColumns(20))); 9184 // In a chain of << with three operands, the second can be broken with no line 9185 // break before it and the third must be broken with a line break before it. 9186 EXPECT_EQ("abcd << \"line line \"\n" 9187 " \"line\"\n" 9188 " << \"line line \"\n" 9189 " \"line\";", 9190 format("abcd << \"line line line\" << \"line line line\";", 9191 getLLVMStyleWithColumns(20))); 9192 // In a chain of binary operators with two operands, the second can be broken 9193 // with no line break before it. 9194 EXPECT_EQ("abcd + \"line line \"\n" 9195 " \"line line\";", 9196 format("abcd + \"line line line line\";", 9197 getLLVMStyleWithColumns(20))); 9198 // In a chain of binary operators with three operands, the second must be 9199 // broken with a line break before it. 9200 EXPECT_EQ("abcd +\n" 9201 " \"line line \"\n" 9202 " \"line line\" +\n" 9203 " e;", 9204 format("abcd + \"line line line line\" + e;", 9205 getLLVMStyleWithColumns(20))); 9206 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9207 // the first must be broken with a line break before it. 9208 FormatStyle Style = getLLVMStyleWithColumns(25); 9209 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9210 EXPECT_EQ("someFunction(\n" 9211 " \"long long long \"\n" 9212 " \"long\",\n" 9213 " a);", 9214 format("someFunction(\"long long long long\", a);", Style)); 9215 } 9216 9217 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9218 EXPECT_EQ( 9219 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9221 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9222 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9223 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9224 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9225 } 9226 9227 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9228 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9229 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9230 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9231 "multiline raw string literal xxxxxxxxxxxxxx\n" 9232 ")x\",\n" 9233 " a),\n" 9234 " b);", 9235 format("fffffffffff(g(R\"x(\n" 9236 "multiline raw string literal xxxxxxxxxxxxxx\n" 9237 ")x\", a), b);", 9238 getGoogleStyleWithColumns(20))); 9239 EXPECT_EQ("fffffffffff(\n" 9240 " g(R\"x(qqq\n" 9241 "multiline raw string literal xxxxxxxxxxxxxx\n" 9242 ")x\",\n" 9243 " a),\n" 9244 " b);", 9245 format("fffffffffff(g(R\"x(qqq\n" 9246 "multiline raw string literal xxxxxxxxxxxxxx\n" 9247 ")x\", a), b);", 9248 getGoogleStyleWithColumns(20))); 9249 9250 EXPECT_EQ("fffffffffff(R\"x(\n" 9251 "multiline raw string literal xxxxxxxxxxxxxx\n" 9252 ")x\");", 9253 format("fffffffffff(R\"x(\n" 9254 "multiline raw string literal xxxxxxxxxxxxxx\n" 9255 ")x\");", 9256 getGoogleStyleWithColumns(20))); 9257 EXPECT_EQ("fffffffffff(R\"x(\n" 9258 "multiline raw string literal xxxxxxxxxxxxxx\n" 9259 ")x\" + bbbbbb);", 9260 format("fffffffffff(R\"x(\n" 9261 "multiline raw string literal xxxxxxxxxxxxxx\n" 9262 ")x\" + bbbbbb);", 9263 getGoogleStyleWithColumns(20))); 9264 EXPECT_EQ("fffffffffff(\n" 9265 " R\"x(\n" 9266 "multiline raw string literal xxxxxxxxxxxxxx\n" 9267 ")x\" +\n" 9268 " bbbbbb);", 9269 format("fffffffffff(\n" 9270 " R\"x(\n" 9271 "multiline raw string literal xxxxxxxxxxxxxx\n" 9272 ")x\" + bbbbbb);", 9273 getGoogleStyleWithColumns(20))); 9274 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9275 format("fffffffffff(\n" 9276 " R\"(single line raw string)\" + bbbbbb);")); 9277 } 9278 9279 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9280 verifyFormat("string a = \"unterminated;"); 9281 EXPECT_EQ("function(\"unterminated,\n" 9282 " OtherParameter);", 9283 format("function( \"unterminated,\n" 9284 " OtherParameter);")); 9285 } 9286 9287 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9288 FormatStyle Style = getLLVMStyle(); 9289 Style.Standard = FormatStyle::LS_Cpp03; 9290 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9291 format("#define x(_a) printf(\"foo\"_a);", Style)); 9292 } 9293 9294 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9295 9296 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9297 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9298 " \"ddeeefff\");", 9299 format("someFunction(\"aaabbbcccdddeeefff\");", 9300 getLLVMStyleWithColumns(25))); 9301 EXPECT_EQ("someFunction1234567890(\n" 9302 " \"aaabbbcccdddeeefff\");", 9303 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9304 getLLVMStyleWithColumns(26))); 9305 EXPECT_EQ("someFunction1234567890(\n" 9306 " \"aaabbbcccdddeeeff\"\n" 9307 " \"f\");", 9308 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9309 getLLVMStyleWithColumns(25))); 9310 EXPECT_EQ("someFunction1234567890(\n" 9311 " \"aaabbbcccdddeeeff\"\n" 9312 " \"f\");", 9313 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9314 getLLVMStyleWithColumns(24))); 9315 EXPECT_EQ("someFunction(\n" 9316 " \"aaabbbcc ddde \"\n" 9317 " \"efff\");", 9318 format("someFunction(\"aaabbbcc ddde efff\");", 9319 getLLVMStyleWithColumns(25))); 9320 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9321 " \"ddeeefff\");", 9322 format("someFunction(\"aaabbbccc ddeeefff\");", 9323 getLLVMStyleWithColumns(25))); 9324 EXPECT_EQ("someFunction1234567890(\n" 9325 " \"aaabb \"\n" 9326 " \"cccdddeeefff\");", 9327 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9328 getLLVMStyleWithColumns(25))); 9329 EXPECT_EQ("#define A \\\n" 9330 " string s = \\\n" 9331 " \"123456789\" \\\n" 9332 " \"0\"; \\\n" 9333 " int i;", 9334 format("#define A string s = \"1234567890\"; int i;", 9335 getLLVMStyleWithColumns(20))); 9336 EXPECT_EQ("someFunction(\n" 9337 " \"aaabbbcc \"\n" 9338 " \"dddeeefff\");", 9339 format("someFunction(\"aaabbbcc dddeeefff\");", 9340 getLLVMStyleWithColumns(25))); 9341 } 9342 9343 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9344 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9345 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9346 EXPECT_EQ("\"test\"\n" 9347 "\"\\n\"", 9348 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9349 EXPECT_EQ("\"tes\\\\\"\n" 9350 "\"n\"", 9351 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9352 EXPECT_EQ("\"\\\\\\\\\"\n" 9353 "\"\\n\"", 9354 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9355 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9356 EXPECT_EQ("\"\\uff01\"\n" 9357 "\"test\"", 9358 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9359 EXPECT_EQ("\"\\Uff01ff02\"", 9360 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9361 EXPECT_EQ("\"\\x000000000001\"\n" 9362 "\"next\"", 9363 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9364 EXPECT_EQ("\"\\x000000000001next\"", 9365 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9366 EXPECT_EQ("\"\\x000000000001\"", 9367 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9368 EXPECT_EQ("\"test\"\n" 9369 "\"\\000000\"\n" 9370 "\"000001\"", 9371 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9372 EXPECT_EQ("\"test\\000\"\n" 9373 "\"00000000\"\n" 9374 "\"1\"", 9375 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9376 } 9377 9378 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9379 verifyFormat("void f() {\n" 9380 " return g() {}\n" 9381 " void h() {}"); 9382 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9383 "g();\n" 9384 "}"); 9385 } 9386 9387 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9388 verifyFormat( 9389 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9390 } 9391 9392 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9393 verifyFormat("class X {\n" 9394 " void f() {\n" 9395 " }\n" 9396 "};", 9397 getLLVMStyleWithColumns(12)); 9398 } 9399 9400 TEST_F(FormatTest, ConfigurableIndentWidth) { 9401 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9402 EightIndent.IndentWidth = 8; 9403 EightIndent.ContinuationIndentWidth = 8; 9404 verifyFormat("void f() {\n" 9405 " someFunction();\n" 9406 " if (true) {\n" 9407 " f();\n" 9408 " }\n" 9409 "}", 9410 EightIndent); 9411 verifyFormat("class X {\n" 9412 " void f() {\n" 9413 " }\n" 9414 "};", 9415 EightIndent); 9416 verifyFormat("int x[] = {\n" 9417 " call(),\n" 9418 " call()};", 9419 EightIndent); 9420 } 9421 9422 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9423 verifyFormat("double\n" 9424 "f();", 9425 getLLVMStyleWithColumns(8)); 9426 } 9427 9428 TEST_F(FormatTest, ConfigurableUseOfTab) { 9429 FormatStyle Tab = getLLVMStyleWithColumns(42); 9430 Tab.IndentWidth = 8; 9431 Tab.UseTab = FormatStyle::UT_Always; 9432 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9433 9434 EXPECT_EQ("if (aaaaaaaa && // q\n" 9435 " bb)\t\t// w\n" 9436 "\t;", 9437 format("if (aaaaaaaa &&// q\n" 9438 "bb)// w\n" 9439 ";", 9440 Tab)); 9441 EXPECT_EQ("if (aaa && bbb) // w\n" 9442 "\t;", 9443 format("if(aaa&&bbb)// w\n" 9444 ";", 9445 Tab)); 9446 9447 verifyFormat("class X {\n" 9448 "\tvoid f() {\n" 9449 "\t\tsomeFunction(parameter1,\n" 9450 "\t\t\t parameter2);\n" 9451 "\t}\n" 9452 "};", 9453 Tab); 9454 verifyFormat("#define A \\\n" 9455 "\tvoid f() { \\\n" 9456 "\t\tsomeFunction( \\\n" 9457 "\t\t parameter1, \\\n" 9458 "\t\t parameter2); \\\n" 9459 "\t}", 9460 Tab); 9461 verifyFormat("int a;\t // x\n" 9462 "int bbbbbbbb; // x\n", 9463 Tab); 9464 9465 Tab.TabWidth = 4; 9466 Tab.IndentWidth = 8; 9467 verifyFormat("class TabWidth4Indent8 {\n" 9468 "\t\tvoid f() {\n" 9469 "\t\t\t\tsomeFunction(parameter1,\n" 9470 "\t\t\t\t\t\t\t parameter2);\n" 9471 "\t\t}\n" 9472 "};", 9473 Tab); 9474 9475 Tab.TabWidth = 4; 9476 Tab.IndentWidth = 4; 9477 verifyFormat("class TabWidth4Indent4 {\n" 9478 "\tvoid f() {\n" 9479 "\t\tsomeFunction(parameter1,\n" 9480 "\t\t\t\t\t parameter2);\n" 9481 "\t}\n" 9482 "};", 9483 Tab); 9484 9485 Tab.TabWidth = 8; 9486 Tab.IndentWidth = 4; 9487 verifyFormat("class TabWidth8Indent4 {\n" 9488 " void f() {\n" 9489 "\tsomeFunction(parameter1,\n" 9490 "\t\t parameter2);\n" 9491 " }\n" 9492 "};", 9493 Tab); 9494 9495 Tab.TabWidth = 8; 9496 Tab.IndentWidth = 8; 9497 EXPECT_EQ("/*\n" 9498 "\t a\t\tcomment\n" 9499 "\t in multiple lines\n" 9500 " */", 9501 format(" /*\t \t \n" 9502 " \t \t a\t\tcomment\t \t\n" 9503 " \t \t in multiple lines\t\n" 9504 " \t */", 9505 Tab)); 9506 9507 Tab.UseTab = FormatStyle::UT_ForIndentation; 9508 verifyFormat("{\n" 9509 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9510 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9511 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9512 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9513 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9514 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9515 "};", 9516 Tab); 9517 verifyFormat("enum AA {\n" 9518 "\ta1, // Force multiple lines\n" 9519 "\ta2,\n" 9520 "\ta3\n" 9521 "};", 9522 Tab); 9523 EXPECT_EQ("if (aaaaaaaa && // q\n" 9524 " bb) // w\n" 9525 "\t;", 9526 format("if (aaaaaaaa &&// q\n" 9527 "bb)// w\n" 9528 ";", 9529 Tab)); 9530 verifyFormat("class X {\n" 9531 "\tvoid f() {\n" 9532 "\t\tsomeFunction(parameter1,\n" 9533 "\t\t parameter2);\n" 9534 "\t}\n" 9535 "};", 9536 Tab); 9537 verifyFormat("{\n" 9538 "\tQ(\n" 9539 "\t {\n" 9540 "\t\t int a;\n" 9541 "\t\t someFunction(aaaaaaaa,\n" 9542 "\t\t bbbbbbb);\n" 9543 "\t },\n" 9544 "\t p);\n" 9545 "}", 9546 Tab); 9547 EXPECT_EQ("{\n" 9548 "\t/* aaaa\n" 9549 "\t bbbb */\n" 9550 "}", 9551 format("{\n" 9552 "/* aaaa\n" 9553 " bbbb */\n" 9554 "}", 9555 Tab)); 9556 EXPECT_EQ("{\n" 9557 "\t/*\n" 9558 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9559 "\t bbbbbbbbbbbbb\n" 9560 "\t*/\n" 9561 "}", 9562 format("{\n" 9563 "/*\n" 9564 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9565 "*/\n" 9566 "}", 9567 Tab)); 9568 EXPECT_EQ("{\n" 9569 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9570 "\t// bbbbbbbbbbbbb\n" 9571 "}", 9572 format("{\n" 9573 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9574 "}", 9575 Tab)); 9576 EXPECT_EQ("{\n" 9577 "\t/*\n" 9578 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9579 "\t bbbbbbbbbbbbb\n" 9580 "\t*/\n" 9581 "}", 9582 format("{\n" 9583 "\t/*\n" 9584 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9585 "\t*/\n" 9586 "}", 9587 Tab)); 9588 EXPECT_EQ("{\n" 9589 "\t/*\n" 9590 "\n" 9591 "\t*/\n" 9592 "}", 9593 format("{\n" 9594 "\t/*\n" 9595 "\n" 9596 "\t*/\n" 9597 "}", 9598 Tab)); 9599 EXPECT_EQ("{\n" 9600 "\t/*\n" 9601 " asdf\n" 9602 "\t*/\n" 9603 "}", 9604 format("{\n" 9605 "\t/*\n" 9606 " asdf\n" 9607 "\t*/\n" 9608 "}", 9609 Tab)); 9610 9611 Tab.UseTab = FormatStyle::UT_Never; 9612 EXPECT_EQ("/*\n" 9613 " a\t\tcomment\n" 9614 " in multiple lines\n" 9615 " */", 9616 format(" /*\t \t \n" 9617 " \t \t a\t\tcomment\t \t\n" 9618 " \t \t in multiple lines\t\n" 9619 " \t */", 9620 Tab)); 9621 EXPECT_EQ("/* some\n" 9622 " comment */", 9623 format(" \t \t /* some\n" 9624 " \t \t comment */", 9625 Tab)); 9626 EXPECT_EQ("int a; /* some\n" 9627 " comment */", 9628 format(" \t \t int a; /* some\n" 9629 " \t \t comment */", 9630 Tab)); 9631 9632 EXPECT_EQ("int a; /* some\n" 9633 "comment */", 9634 format(" \t \t int\ta; /* some\n" 9635 " \t \t comment */", 9636 Tab)); 9637 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9638 " comment */", 9639 format(" \t \t f(\"\t\t\"); /* some\n" 9640 " \t \t comment */", 9641 Tab)); 9642 EXPECT_EQ("{\n" 9643 " /*\n" 9644 " * Comment\n" 9645 " */\n" 9646 " int i;\n" 9647 "}", 9648 format("{\n" 9649 "\t/*\n" 9650 "\t * Comment\n" 9651 "\t */\n" 9652 "\t int i;\n" 9653 "}")); 9654 9655 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 9656 Tab.TabWidth = 8; 9657 Tab.IndentWidth = 8; 9658 EXPECT_EQ("if (aaaaaaaa && // q\n" 9659 " bb) // w\n" 9660 "\t;", 9661 format("if (aaaaaaaa &&// q\n" 9662 "bb)// w\n" 9663 ";", 9664 Tab)); 9665 EXPECT_EQ("if (aaa && bbb) // w\n" 9666 "\t;", 9667 format("if(aaa&&bbb)// w\n" 9668 ";", 9669 Tab)); 9670 verifyFormat("class X {\n" 9671 "\tvoid f() {\n" 9672 "\t\tsomeFunction(parameter1,\n" 9673 "\t\t\t parameter2);\n" 9674 "\t}\n" 9675 "};", 9676 Tab); 9677 verifyFormat("#define A \\\n" 9678 "\tvoid f() { \\\n" 9679 "\t\tsomeFunction( \\\n" 9680 "\t\t parameter1, \\\n" 9681 "\t\t parameter2); \\\n" 9682 "\t}", 9683 Tab); 9684 Tab.TabWidth = 4; 9685 Tab.IndentWidth = 8; 9686 verifyFormat("class TabWidth4Indent8 {\n" 9687 "\t\tvoid f() {\n" 9688 "\t\t\t\tsomeFunction(parameter1,\n" 9689 "\t\t\t\t\t\t\t parameter2);\n" 9690 "\t\t}\n" 9691 "};", 9692 Tab); 9693 Tab.TabWidth = 4; 9694 Tab.IndentWidth = 4; 9695 verifyFormat("class TabWidth4Indent4 {\n" 9696 "\tvoid f() {\n" 9697 "\t\tsomeFunction(parameter1,\n" 9698 "\t\t\t\t\t parameter2);\n" 9699 "\t}\n" 9700 "};", 9701 Tab); 9702 Tab.TabWidth = 8; 9703 Tab.IndentWidth = 4; 9704 verifyFormat("class TabWidth8Indent4 {\n" 9705 " void f() {\n" 9706 "\tsomeFunction(parameter1,\n" 9707 "\t\t parameter2);\n" 9708 " }\n" 9709 "};", 9710 Tab); 9711 Tab.TabWidth = 8; 9712 Tab.IndentWidth = 8; 9713 EXPECT_EQ("/*\n" 9714 "\t a\t\tcomment\n" 9715 "\t in multiple lines\n" 9716 " */", 9717 format(" /*\t \t \n" 9718 " \t \t a\t\tcomment\t \t\n" 9719 " \t \t in multiple lines\t\n" 9720 " \t */", 9721 Tab)); 9722 verifyFormat("{\n" 9723 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9724 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9725 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9726 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9727 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9728 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9729 "};", 9730 Tab); 9731 verifyFormat("enum AA {\n" 9732 "\ta1, // Force multiple lines\n" 9733 "\ta2,\n" 9734 "\ta3\n" 9735 "};", 9736 Tab); 9737 EXPECT_EQ("if (aaaaaaaa && // q\n" 9738 " bb) // w\n" 9739 "\t;", 9740 format("if (aaaaaaaa &&// q\n" 9741 "bb)// w\n" 9742 ";", 9743 Tab)); 9744 verifyFormat("class X {\n" 9745 "\tvoid f() {\n" 9746 "\t\tsomeFunction(parameter1,\n" 9747 "\t\t\t parameter2);\n" 9748 "\t}\n" 9749 "};", 9750 Tab); 9751 verifyFormat("{\n" 9752 "\tQ(\n" 9753 "\t {\n" 9754 "\t\t int a;\n" 9755 "\t\t someFunction(aaaaaaaa,\n" 9756 "\t\t\t\t bbbbbbb);\n" 9757 "\t },\n" 9758 "\t p);\n" 9759 "}", 9760 Tab); 9761 EXPECT_EQ("{\n" 9762 "\t/* aaaa\n" 9763 "\t bbbb */\n" 9764 "}", 9765 format("{\n" 9766 "/* aaaa\n" 9767 " bbbb */\n" 9768 "}", 9769 Tab)); 9770 EXPECT_EQ("{\n" 9771 "\t/*\n" 9772 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9773 "\t bbbbbbbbbbbbb\n" 9774 "\t*/\n" 9775 "}", 9776 format("{\n" 9777 "/*\n" 9778 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9779 "*/\n" 9780 "}", 9781 Tab)); 9782 EXPECT_EQ("{\n" 9783 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9784 "\t// bbbbbbbbbbbbb\n" 9785 "}", 9786 format("{\n" 9787 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9788 "}", 9789 Tab)); 9790 EXPECT_EQ("{\n" 9791 "\t/*\n" 9792 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9793 "\t bbbbbbbbbbbbb\n" 9794 "\t*/\n" 9795 "}", 9796 format("{\n" 9797 "\t/*\n" 9798 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9799 "\t*/\n" 9800 "}", 9801 Tab)); 9802 EXPECT_EQ("{\n" 9803 "\t/*\n" 9804 "\n" 9805 "\t*/\n" 9806 "}", 9807 format("{\n" 9808 "\t/*\n" 9809 "\n" 9810 "\t*/\n" 9811 "}", 9812 Tab)); 9813 EXPECT_EQ("{\n" 9814 "\t/*\n" 9815 " asdf\n" 9816 "\t*/\n" 9817 "}", 9818 format("{\n" 9819 "\t/*\n" 9820 " asdf\n" 9821 "\t*/\n" 9822 "}", 9823 Tab)); 9824 EXPECT_EQ("/*\n" 9825 "\t a\t\tcomment\n" 9826 "\t in multiple lines\n" 9827 " */", 9828 format(" /*\t \t \n" 9829 " \t \t a\t\tcomment\t \t\n" 9830 " \t \t in multiple lines\t\n" 9831 " \t */", 9832 Tab)); 9833 EXPECT_EQ("/* some\n" 9834 " comment */", 9835 format(" \t \t /* some\n" 9836 " \t \t comment */", 9837 Tab)); 9838 EXPECT_EQ("int a; /* some\n" 9839 " comment */", 9840 format(" \t \t int a; /* some\n" 9841 " \t \t comment */", 9842 Tab)); 9843 EXPECT_EQ("int a; /* some\n" 9844 "comment */", 9845 format(" \t \t int\ta; /* some\n" 9846 " \t \t comment */", 9847 Tab)); 9848 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9849 " comment */", 9850 format(" \t \t f(\"\t\t\"); /* some\n" 9851 " \t \t comment */", 9852 Tab)); 9853 EXPECT_EQ("{\n" 9854 " /*\n" 9855 " * Comment\n" 9856 " */\n" 9857 " int i;\n" 9858 "}", 9859 format("{\n" 9860 "\t/*\n" 9861 "\t * Comment\n" 9862 "\t */\n" 9863 "\t int i;\n" 9864 "}")); 9865 Tab.AlignConsecutiveAssignments = true; 9866 Tab.AlignConsecutiveDeclarations = true; 9867 Tab.TabWidth = 4; 9868 Tab.IndentWidth = 4; 9869 verifyFormat("class Assign {\n" 9870 "\tvoid f() {\n" 9871 "\t\tint x = 123;\n" 9872 "\t\tint random = 4;\n" 9873 "\t\tstd::string alphabet =\n" 9874 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 9875 "\t}\n" 9876 "};", 9877 Tab); 9878 } 9879 9880 TEST_F(FormatTest, CalculatesOriginalColumn) { 9881 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9882 "q\"; /* some\n" 9883 " comment */", 9884 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9885 "q\"; /* some\n" 9886 " comment */", 9887 getLLVMStyle())); 9888 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 9889 "/* some\n" 9890 " comment */", 9891 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 9892 " /* some\n" 9893 " comment */", 9894 getLLVMStyle())); 9895 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9896 "qqq\n" 9897 "/* some\n" 9898 " comment */", 9899 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9900 "qqq\n" 9901 " /* some\n" 9902 " comment */", 9903 getLLVMStyle())); 9904 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9905 "wwww; /* some\n" 9906 " comment */", 9907 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9908 "wwww; /* some\n" 9909 " comment */", 9910 getLLVMStyle())); 9911 } 9912 9913 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 9914 FormatStyle NoSpace = getLLVMStyle(); 9915 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 9916 9917 verifyFormat("while(true)\n" 9918 " continue;", 9919 NoSpace); 9920 verifyFormat("for(;;)\n" 9921 " continue;", 9922 NoSpace); 9923 verifyFormat("if(true)\n" 9924 " f();\n" 9925 "else if(true)\n" 9926 " f();", 9927 NoSpace); 9928 verifyFormat("do {\n" 9929 " do_something();\n" 9930 "} while(something());", 9931 NoSpace); 9932 verifyFormat("switch(x) {\n" 9933 "default:\n" 9934 " break;\n" 9935 "}", 9936 NoSpace); 9937 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 9938 verifyFormat("size_t x = sizeof(x);", NoSpace); 9939 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 9940 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 9941 verifyFormat("alignas(128) char a[128];", NoSpace); 9942 verifyFormat("size_t x = alignof(MyType);", NoSpace); 9943 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 9944 verifyFormat("int f() throw(Deprecated);", NoSpace); 9945 verifyFormat("typedef void (*cb)(int);", NoSpace); 9946 verifyFormat("T A::operator()();", NoSpace); 9947 verifyFormat("X A::operator++(T);", NoSpace); 9948 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 9949 9950 FormatStyle Space = getLLVMStyle(); 9951 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 9952 9953 verifyFormat("int f ();", Space); 9954 verifyFormat("void f (int a, T b) {\n" 9955 " while (true)\n" 9956 " continue;\n" 9957 "}", 9958 Space); 9959 verifyFormat("if (true)\n" 9960 " f ();\n" 9961 "else if (true)\n" 9962 " f ();", 9963 Space); 9964 verifyFormat("do {\n" 9965 " do_something ();\n" 9966 "} while (something ());", 9967 Space); 9968 verifyFormat("switch (x) {\n" 9969 "default:\n" 9970 " break;\n" 9971 "}", 9972 Space); 9973 verifyFormat("A::A () : a (1) {}", Space); 9974 verifyFormat("void f () __attribute__ ((asdf));", Space); 9975 verifyFormat("*(&a + 1);\n" 9976 "&((&a)[1]);\n" 9977 "a[(b + c) * d];\n" 9978 "(((a + 1) * 2) + 3) * 4;", 9979 Space); 9980 verifyFormat("#define A(x) x", Space); 9981 verifyFormat("#define A (x) x", Space); 9982 verifyFormat("#if defined(x)\n" 9983 "#endif", 9984 Space); 9985 verifyFormat("auto i = std::make_unique<int> (5);", Space); 9986 verifyFormat("size_t x = sizeof (x);", Space); 9987 verifyFormat("auto f (int x) -> decltype (x);", Space); 9988 verifyFormat("int f (T x) noexcept (x.create ());", Space); 9989 verifyFormat("alignas (128) char a[128];", Space); 9990 verifyFormat("size_t x = alignof (MyType);", Space); 9991 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 9992 verifyFormat("int f () throw (Deprecated);", Space); 9993 verifyFormat("typedef void (*cb) (int);", Space); 9994 verifyFormat("T A::operator() ();", Space); 9995 verifyFormat("X A::operator++ (T);", Space); 9996 verifyFormat("auto lambda = [] () { return 0; };", Space); 9997 verifyFormat("int x = int (y);", Space); 9998 9999 FormatStyle SomeSpace = getLLVMStyle(); 10000 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 10001 10002 verifyFormat("[]() -> float {}", SomeSpace); 10003 verifyFormat("[] (auto foo) {}", SomeSpace); 10004 verifyFormat("[foo]() -> int {}", SomeSpace); 10005 verifyFormat("int f();", SomeSpace); 10006 verifyFormat("void f (int a, T b) {\n" 10007 " while (true)\n" 10008 " continue;\n" 10009 "}", 10010 SomeSpace); 10011 verifyFormat("if (true)\n" 10012 " f();\n" 10013 "else if (true)\n" 10014 " f();", 10015 SomeSpace); 10016 verifyFormat("do {\n" 10017 " do_something();\n" 10018 "} while (something());", 10019 SomeSpace); 10020 verifyFormat("switch (x) {\n" 10021 "default:\n" 10022 " break;\n" 10023 "}", 10024 SomeSpace); 10025 verifyFormat("A::A() : a (1) {}", SomeSpace); 10026 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 10027 verifyFormat("*(&a + 1);\n" 10028 "&((&a)[1]);\n" 10029 "a[(b + c) * d];\n" 10030 "(((a + 1) * 2) + 3) * 4;", 10031 SomeSpace); 10032 verifyFormat("#define A(x) x", SomeSpace); 10033 verifyFormat("#define A (x) x", SomeSpace); 10034 verifyFormat("#if defined(x)\n" 10035 "#endif", 10036 SomeSpace); 10037 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10038 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10039 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10040 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10041 verifyFormat("alignas (128) char a[128];", SomeSpace); 10042 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10043 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10044 SomeSpace); 10045 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10046 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10047 verifyFormat("T A::operator()();", SomeSpace); 10048 verifyFormat("X A::operator++ (T);", SomeSpace); 10049 verifyFormat("int x = int (y);", SomeSpace); 10050 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10051 } 10052 10053 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10054 FormatStyle Spaces = getLLVMStyle(); 10055 Spaces.SpaceAfterLogicalNot = true; 10056 10057 verifyFormat("bool x = ! y", Spaces); 10058 verifyFormat("if (! isFailure())", Spaces); 10059 verifyFormat("if (! (a && b))", Spaces); 10060 verifyFormat("\"Error!\"", Spaces); 10061 verifyFormat("! ! x", Spaces); 10062 } 10063 10064 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10065 FormatStyle Spaces = getLLVMStyle(); 10066 10067 Spaces.SpacesInParentheses = true; 10068 verifyFormat("do_something( ::globalVar );", Spaces); 10069 verifyFormat("call( x, y, z );", Spaces); 10070 verifyFormat("call();", Spaces); 10071 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10072 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10073 Spaces); 10074 verifyFormat("while ( (bool)1 )\n" 10075 " continue;", 10076 Spaces); 10077 verifyFormat("for ( ;; )\n" 10078 " continue;", 10079 Spaces); 10080 verifyFormat("if ( true )\n" 10081 " f();\n" 10082 "else if ( true )\n" 10083 " f();", 10084 Spaces); 10085 verifyFormat("do {\n" 10086 " do_something( (int)i );\n" 10087 "} while ( something() );", 10088 Spaces); 10089 verifyFormat("switch ( x ) {\n" 10090 "default:\n" 10091 " break;\n" 10092 "}", 10093 Spaces); 10094 10095 Spaces.SpacesInParentheses = false; 10096 Spaces.SpacesInCStyleCastParentheses = true; 10097 verifyFormat("Type *A = ( Type * )P;", Spaces); 10098 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 10099 verifyFormat("x = ( int32 )y;", Spaces); 10100 verifyFormat("int a = ( int )(2.0f);", Spaces); 10101 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 10102 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 10103 verifyFormat("#define x (( int )-1)", Spaces); 10104 10105 // Run the first set of tests again with: 10106 Spaces.SpacesInParentheses = false; 10107 Spaces.SpaceInEmptyParentheses = true; 10108 Spaces.SpacesInCStyleCastParentheses = true; 10109 verifyFormat("call(x, y, z);", Spaces); 10110 verifyFormat("call( );", Spaces); 10111 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10112 verifyFormat("while (( bool )1)\n" 10113 " continue;", 10114 Spaces); 10115 verifyFormat("for (;;)\n" 10116 " continue;", 10117 Spaces); 10118 verifyFormat("if (true)\n" 10119 " f( );\n" 10120 "else if (true)\n" 10121 " f( );", 10122 Spaces); 10123 verifyFormat("do {\n" 10124 " do_something(( int )i);\n" 10125 "} while (something( ));", 10126 Spaces); 10127 verifyFormat("switch (x) {\n" 10128 "default:\n" 10129 " break;\n" 10130 "}", 10131 Spaces); 10132 10133 // Run the first set of tests again with: 10134 Spaces.SpaceAfterCStyleCast = true; 10135 verifyFormat("call(x, y, z);", Spaces); 10136 verifyFormat("call( );", Spaces); 10137 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10138 verifyFormat("while (( bool ) 1)\n" 10139 " continue;", 10140 Spaces); 10141 verifyFormat("for (;;)\n" 10142 " continue;", 10143 Spaces); 10144 verifyFormat("if (true)\n" 10145 " f( );\n" 10146 "else if (true)\n" 10147 " f( );", 10148 Spaces); 10149 verifyFormat("do {\n" 10150 " do_something(( int ) i);\n" 10151 "} while (something( ));", 10152 Spaces); 10153 verifyFormat("switch (x) {\n" 10154 "default:\n" 10155 " break;\n" 10156 "}", 10157 Spaces); 10158 10159 // Run subset of tests again with: 10160 Spaces.SpacesInCStyleCastParentheses = false; 10161 Spaces.SpaceAfterCStyleCast = true; 10162 verifyFormat("while ((bool) 1)\n" 10163 " continue;", 10164 Spaces); 10165 verifyFormat("do {\n" 10166 " do_something((int) i);\n" 10167 "} while (something( ));", 10168 Spaces); 10169 } 10170 10171 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 10172 verifyFormat("int a[5];"); 10173 verifyFormat("a[3] += 42;"); 10174 10175 FormatStyle Spaces = getLLVMStyle(); 10176 Spaces.SpacesInSquareBrackets = true; 10177 // Lambdas unchanged. 10178 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 10179 verifyFormat("return [i, args...] {};", Spaces); 10180 10181 // Not lambdas. 10182 verifyFormat("int a[ 5 ];", Spaces); 10183 verifyFormat("a[ 3 ] += 42;", Spaces); 10184 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 10185 verifyFormat("double &operator[](int i) { return 0; }\n" 10186 "int i;", 10187 Spaces); 10188 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 10189 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 10190 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 10191 } 10192 10193 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10194 verifyFormat("int a = 5;"); 10195 verifyFormat("a += 42;"); 10196 verifyFormat("a or_eq 8;"); 10197 10198 FormatStyle Spaces = getLLVMStyle(); 10199 Spaces.SpaceBeforeAssignmentOperators = false; 10200 verifyFormat("int a= 5;", Spaces); 10201 verifyFormat("a+= 42;", Spaces); 10202 verifyFormat("a or_eq 8;", Spaces); 10203 } 10204 10205 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10206 verifyFormat("class Foo : public Bar {};"); 10207 verifyFormat("Foo::Foo() : foo(1) {}"); 10208 verifyFormat("for (auto a : b) {\n}"); 10209 verifyFormat("int x = a ? b : c;"); 10210 verifyFormat("{\n" 10211 "label0:\n" 10212 " int x = 0;\n" 10213 "}"); 10214 verifyFormat("switch (x) {\n" 10215 "case 1:\n" 10216 "default:\n" 10217 "}"); 10218 10219 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10220 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10221 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10222 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10223 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10224 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10225 verifyFormat("{\n" 10226 "label1:\n" 10227 " int x = 0;\n" 10228 "}", 10229 CtorInitializerStyle); 10230 verifyFormat("switch (x) {\n" 10231 "case 1:\n" 10232 "default:\n" 10233 "}", 10234 CtorInitializerStyle); 10235 CtorInitializerStyle.BreakConstructorInitializers = 10236 FormatStyle::BCIS_AfterColon; 10237 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10238 " aaaaaaaaaaaaaaaa(1),\n" 10239 " bbbbbbbbbbbbbbbb(2) {}", 10240 CtorInitializerStyle); 10241 CtorInitializerStyle.BreakConstructorInitializers = 10242 FormatStyle::BCIS_BeforeComma; 10243 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10244 " : aaaaaaaaaaaaaaaa(1)\n" 10245 " , bbbbbbbbbbbbbbbb(2) {}", 10246 CtorInitializerStyle); 10247 CtorInitializerStyle.BreakConstructorInitializers = 10248 FormatStyle::BCIS_BeforeColon; 10249 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10250 " : aaaaaaaaaaaaaaaa(1),\n" 10251 " bbbbbbbbbbbbbbbb(2) {}", 10252 CtorInitializerStyle); 10253 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10254 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10255 ": aaaaaaaaaaaaaaaa(1),\n" 10256 " bbbbbbbbbbbbbbbb(2) {}", 10257 CtorInitializerStyle); 10258 10259 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10260 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10261 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10262 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10263 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10264 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10265 verifyFormat("{\n" 10266 "label2:\n" 10267 " int x = 0;\n" 10268 "}", 10269 InheritanceStyle); 10270 verifyFormat("switch (x) {\n" 10271 "case 1:\n" 10272 "default:\n" 10273 "}", 10274 InheritanceStyle); 10275 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10276 verifyFormat("class Foooooooooooooooooooooo:\n" 10277 " public aaaaaaaaaaaaaaaaaa,\n" 10278 " public bbbbbbbbbbbbbbbbbb {\n" 10279 "}", 10280 InheritanceStyle); 10281 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10282 verifyFormat("class Foooooooooooooooooooooo\n" 10283 " : public aaaaaaaaaaaaaaaaaa\n" 10284 " , public bbbbbbbbbbbbbbbbbb {\n" 10285 "}", 10286 InheritanceStyle); 10287 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10288 verifyFormat("class Foooooooooooooooooooooo\n" 10289 " : public aaaaaaaaaaaaaaaaaa,\n" 10290 " public bbbbbbbbbbbbbbbbbb {\n" 10291 "}", 10292 InheritanceStyle); 10293 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10294 verifyFormat("class Foooooooooooooooooooooo\n" 10295 ": public aaaaaaaaaaaaaaaaaa,\n" 10296 " public bbbbbbbbbbbbbbbbbb {}", 10297 InheritanceStyle); 10298 10299 FormatStyle ForLoopStyle = getLLVMStyle(); 10300 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10301 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10302 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10303 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10304 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10305 verifyFormat("{\n" 10306 "label2:\n" 10307 " int x = 0;\n" 10308 "}", 10309 ForLoopStyle); 10310 verifyFormat("switch (x) {\n" 10311 "case 1:\n" 10312 "default:\n" 10313 "}", 10314 ForLoopStyle); 10315 10316 FormatStyle NoSpaceStyle = getLLVMStyle(); 10317 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10318 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10319 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10320 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10321 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10322 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10323 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10324 verifyFormat("{\n" 10325 "label3:\n" 10326 " int x = 0;\n" 10327 "}", 10328 NoSpaceStyle); 10329 verifyFormat("switch (x) {\n" 10330 "case 1:\n" 10331 "default:\n" 10332 "}", 10333 NoSpaceStyle); 10334 } 10335 10336 TEST_F(FormatTest, AlignConsecutiveMacros) { 10337 FormatStyle Style = getLLVMStyle(); 10338 Style.AlignConsecutiveAssignments = true; 10339 Style.AlignConsecutiveDeclarations = true; 10340 Style.AlignConsecutiveMacros = false; 10341 10342 verifyFormat("#define a 3\n" 10343 "#define bbbb 4\n" 10344 "#define ccc (5)", 10345 Style); 10346 10347 verifyFormat("#define f(x) (x * x)\n" 10348 "#define fff(x, y, z) (x * y + z)\n" 10349 "#define ffff(x, y) (x - y)", 10350 Style); 10351 10352 verifyFormat("#define foo(x, y) (x + y)\n" 10353 "#define bar (5, 6)(2 + 2)", 10354 Style); 10355 10356 verifyFormat("#define a 3\n" 10357 "#define bbbb 4\n" 10358 "#define ccc (5)\n" 10359 "#define f(x) (x * x)\n" 10360 "#define fff(x, y, z) (x * y + z)\n" 10361 "#define ffff(x, y) (x - y)", 10362 Style); 10363 10364 Style.AlignConsecutiveMacros = true; 10365 verifyFormat("#define a 3\n" 10366 "#define bbbb 4\n" 10367 "#define ccc (5)", 10368 Style); 10369 10370 verifyFormat("#define f(x) (x * x)\n" 10371 "#define fff(x, y, z) (x * y + z)\n" 10372 "#define ffff(x, y) (x - y)", 10373 Style); 10374 10375 verifyFormat("#define foo(x, y) (x + y)\n" 10376 "#define bar (5, 6)(2 + 2)", 10377 Style); 10378 10379 verifyFormat("#define a 3\n" 10380 "#define bbbb 4\n" 10381 "#define ccc (5)\n" 10382 "#define f(x) (x * x)\n" 10383 "#define fff(x, y, z) (x * y + z)\n" 10384 "#define ffff(x, y) (x - y)", 10385 Style); 10386 10387 verifyFormat("#define a 5\n" 10388 "#define foo(x, y) (x + y)\n" 10389 "#define CCC (6)\n" 10390 "auto lambda = []() {\n" 10391 " auto ii = 0;\n" 10392 " float j = 0;\n" 10393 " return 0;\n" 10394 "};\n" 10395 "int i = 0;\n" 10396 "float i2 = 0;\n" 10397 "auto v = type{\n" 10398 " i = 1, //\n" 10399 " (i = 2), //\n" 10400 " i = 3 //\n" 10401 "};", 10402 Style); 10403 10404 Style.AlignConsecutiveMacros = false; 10405 Style.ColumnLimit = 20; 10406 10407 verifyFormat("#define a \\\n" 10408 " \"aabbbbbbbbbbbb\"\n" 10409 "#define D \\\n" 10410 " \"aabbbbbbbbbbbb\" \\\n" 10411 " \"ccddeeeeeeeee\"\n" 10412 "#define B \\\n" 10413 " \"QQQQQQQQQQQQQ\" \\\n" 10414 " \"FFFFFFFFFFFFF\" \\\n" 10415 " \"LLLLLLLL\"\n", 10416 Style); 10417 10418 Style.AlignConsecutiveMacros = true; 10419 verifyFormat("#define a \\\n" 10420 " \"aabbbbbbbbbbbb\"\n" 10421 "#define D \\\n" 10422 " \"aabbbbbbbbbbbb\" \\\n" 10423 " \"ccddeeeeeeeee\"\n" 10424 "#define B \\\n" 10425 " \"QQQQQQQQQQQQQ\" \\\n" 10426 " \"FFFFFFFFFFFFF\" \\\n" 10427 " \"LLLLLLLL\"\n", 10428 Style); 10429 } 10430 10431 TEST_F(FormatTest, AlignConsecutiveAssignments) { 10432 FormatStyle Alignment = getLLVMStyle(); 10433 Alignment.AlignConsecutiveMacros = true; 10434 Alignment.AlignConsecutiveAssignments = false; 10435 verifyFormat("int a = 5;\n" 10436 "int oneTwoThree = 123;", 10437 Alignment); 10438 verifyFormat("int a = 5;\n" 10439 "int oneTwoThree = 123;", 10440 Alignment); 10441 10442 Alignment.AlignConsecutiveAssignments = true; 10443 verifyFormat("int a = 5;\n" 10444 "int oneTwoThree = 123;", 10445 Alignment); 10446 verifyFormat("int a = method();\n" 10447 "int oneTwoThree = 133;", 10448 Alignment); 10449 verifyFormat("a &= 5;\n" 10450 "bcd *= 5;\n" 10451 "ghtyf += 5;\n" 10452 "dvfvdb -= 5;\n" 10453 "a /= 5;\n" 10454 "vdsvsv %= 5;\n" 10455 "sfdbddfbdfbb ^= 5;\n" 10456 "dvsdsv |= 5;\n" 10457 "int dsvvdvsdvvv = 123;", 10458 Alignment); 10459 verifyFormat("int i = 1, j = 10;\n" 10460 "something = 2000;", 10461 Alignment); 10462 verifyFormat("something = 2000;\n" 10463 "int i = 1, j = 10;\n", 10464 Alignment); 10465 verifyFormat("something = 2000;\n" 10466 "another = 911;\n" 10467 "int i = 1, j = 10;\n" 10468 "oneMore = 1;\n" 10469 "i = 2;", 10470 Alignment); 10471 verifyFormat("int a = 5;\n" 10472 "int one = 1;\n" 10473 "method();\n" 10474 "int oneTwoThree = 123;\n" 10475 "int oneTwo = 12;", 10476 Alignment); 10477 verifyFormat("int oneTwoThree = 123;\n" 10478 "int oneTwo = 12;\n" 10479 "method();\n", 10480 Alignment); 10481 verifyFormat("int oneTwoThree = 123; // comment\n" 10482 "int oneTwo = 12; // comment", 10483 Alignment); 10484 EXPECT_EQ("int a = 5;\n" 10485 "\n" 10486 "int oneTwoThree = 123;", 10487 format("int a = 5;\n" 10488 "\n" 10489 "int oneTwoThree= 123;", 10490 Alignment)); 10491 EXPECT_EQ("int a = 5;\n" 10492 "int one = 1;\n" 10493 "\n" 10494 "int oneTwoThree = 123;", 10495 format("int a = 5;\n" 10496 "int one = 1;\n" 10497 "\n" 10498 "int oneTwoThree = 123;", 10499 Alignment)); 10500 EXPECT_EQ("int a = 5;\n" 10501 "int one = 1;\n" 10502 "\n" 10503 "int oneTwoThree = 123;\n" 10504 "int oneTwo = 12;", 10505 format("int a = 5;\n" 10506 "int one = 1;\n" 10507 "\n" 10508 "int oneTwoThree = 123;\n" 10509 "int oneTwo = 12;", 10510 Alignment)); 10511 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10512 verifyFormat("#define A \\\n" 10513 " int aaaa = 12; \\\n" 10514 " int b = 23; \\\n" 10515 " int ccc = 234; \\\n" 10516 " int dddddddddd = 2345;", 10517 Alignment); 10518 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10519 verifyFormat("#define A \\\n" 10520 " int aaaa = 12; \\\n" 10521 " int b = 23; \\\n" 10522 " int ccc = 234; \\\n" 10523 " int dddddddddd = 2345;", 10524 Alignment); 10525 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10526 verifyFormat("#define A " 10527 " \\\n" 10528 " int aaaa = 12; " 10529 " \\\n" 10530 " int b = 23; " 10531 " \\\n" 10532 " int ccc = 234; " 10533 " \\\n" 10534 " int dddddddddd = 2345;", 10535 Alignment); 10536 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10537 "k = 4, int l = 5,\n" 10538 " int m = 6) {\n" 10539 " int j = 10;\n" 10540 " otherThing = 1;\n" 10541 "}", 10542 Alignment); 10543 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10544 " int i = 1;\n" 10545 " int j = 2;\n" 10546 " int big = 10000;\n" 10547 "}", 10548 Alignment); 10549 verifyFormat("class C {\n" 10550 "public:\n" 10551 " int i = 1;\n" 10552 " virtual void f() = 0;\n" 10553 "};", 10554 Alignment); 10555 verifyFormat("int i = 1;\n" 10556 "if (SomeType t = getSomething()) {\n" 10557 "}\n" 10558 "int j = 2;\n" 10559 "int big = 10000;", 10560 Alignment); 10561 verifyFormat("int j = 7;\n" 10562 "for (int k = 0; k < N; ++k) {\n" 10563 "}\n" 10564 "int j = 2;\n" 10565 "int big = 10000;\n" 10566 "}", 10567 Alignment); 10568 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10569 verifyFormat("int i = 1;\n" 10570 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10571 " = someLooooooooooooooooongFunction();\n" 10572 "int j = 2;", 10573 Alignment); 10574 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10575 verifyFormat("int i = 1;\n" 10576 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10577 " someLooooooooooooooooongFunction();\n" 10578 "int j = 2;", 10579 Alignment); 10580 10581 verifyFormat("auto lambda = []() {\n" 10582 " auto i = 0;\n" 10583 " return 0;\n" 10584 "};\n" 10585 "int i = 0;\n" 10586 "auto v = type{\n" 10587 " i = 1, //\n" 10588 " (i = 2), //\n" 10589 " i = 3 //\n" 10590 "};", 10591 Alignment); 10592 10593 verifyFormat( 10594 "int i = 1;\n" 10595 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10596 " loooooooooooooooooooooongParameterB);\n" 10597 "int j = 2;", 10598 Alignment); 10599 10600 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 10601 " typename B = very_long_type_name_1,\n" 10602 " typename T_2 = very_long_type_name_2>\n" 10603 "auto foo() {}\n", 10604 Alignment); 10605 verifyFormat("int a, b = 1;\n" 10606 "int c = 2;\n" 10607 "int dd = 3;\n", 10608 Alignment); 10609 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10610 "float b[1][] = {{3.f}};\n", 10611 Alignment); 10612 verifyFormat("for (int i = 0; i < 1; i++)\n" 10613 " int x = 1;\n", 10614 Alignment); 10615 verifyFormat("for (i = 0; i < 1; i++)\n" 10616 " x = 1;\n" 10617 "y = 1;\n", 10618 Alignment); 10619 } 10620 10621 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 10622 FormatStyle Alignment = getLLVMStyle(); 10623 Alignment.AlignConsecutiveMacros = true; 10624 Alignment.AlignConsecutiveDeclarations = false; 10625 verifyFormat("float const a = 5;\n" 10626 "int oneTwoThree = 123;", 10627 Alignment); 10628 verifyFormat("int a = 5;\n" 10629 "float const oneTwoThree = 123;", 10630 Alignment); 10631 10632 Alignment.AlignConsecutiveDeclarations = true; 10633 verifyFormat("float const a = 5;\n" 10634 "int oneTwoThree = 123;", 10635 Alignment); 10636 verifyFormat("int a = method();\n" 10637 "float const oneTwoThree = 133;", 10638 Alignment); 10639 verifyFormat("int i = 1, j = 10;\n" 10640 "something = 2000;", 10641 Alignment); 10642 verifyFormat("something = 2000;\n" 10643 "int i = 1, j = 10;\n", 10644 Alignment); 10645 verifyFormat("float something = 2000;\n" 10646 "double another = 911;\n" 10647 "int i = 1, j = 10;\n" 10648 "const int *oneMore = 1;\n" 10649 "unsigned i = 2;", 10650 Alignment); 10651 verifyFormat("float a = 5;\n" 10652 "int one = 1;\n" 10653 "method();\n" 10654 "const double oneTwoThree = 123;\n" 10655 "const unsigned int oneTwo = 12;", 10656 Alignment); 10657 verifyFormat("int oneTwoThree{0}; // comment\n" 10658 "unsigned oneTwo; // comment", 10659 Alignment); 10660 EXPECT_EQ("float const a = 5;\n" 10661 "\n" 10662 "int oneTwoThree = 123;", 10663 format("float const a = 5;\n" 10664 "\n" 10665 "int oneTwoThree= 123;", 10666 Alignment)); 10667 EXPECT_EQ("float a = 5;\n" 10668 "int one = 1;\n" 10669 "\n" 10670 "unsigned oneTwoThree = 123;", 10671 format("float a = 5;\n" 10672 "int one = 1;\n" 10673 "\n" 10674 "unsigned oneTwoThree = 123;", 10675 Alignment)); 10676 EXPECT_EQ("float a = 5;\n" 10677 "int one = 1;\n" 10678 "\n" 10679 "unsigned oneTwoThree = 123;\n" 10680 "int oneTwo = 12;", 10681 format("float a = 5;\n" 10682 "int one = 1;\n" 10683 "\n" 10684 "unsigned oneTwoThree = 123;\n" 10685 "int oneTwo = 12;", 10686 Alignment)); 10687 // Function prototype alignment 10688 verifyFormat("int a();\n" 10689 "double b();", 10690 Alignment); 10691 verifyFormat("int a(int x);\n" 10692 "double b();", 10693 Alignment); 10694 unsigned OldColumnLimit = Alignment.ColumnLimit; 10695 // We need to set ColumnLimit to zero, in order to stress nested alignments, 10696 // otherwise the function parameters will be re-flowed onto a single line. 10697 Alignment.ColumnLimit = 0; 10698 EXPECT_EQ("int a(int x,\n" 10699 " float y);\n" 10700 "double b(int x,\n" 10701 " double y);", 10702 format("int a(int x,\n" 10703 " float y);\n" 10704 "double b(int x,\n" 10705 " double y);", 10706 Alignment)); 10707 // This ensures that function parameters of function declarations are 10708 // correctly indented when their owning functions are indented. 10709 // The failure case here is for 'double y' to not be indented enough. 10710 EXPECT_EQ("double a(int x);\n" 10711 "int b(int y,\n" 10712 " double z);", 10713 format("double a(int x);\n" 10714 "int b(int y,\n" 10715 " double z);", 10716 Alignment)); 10717 // Set ColumnLimit low so that we induce wrapping immediately after 10718 // the function name and opening paren. 10719 Alignment.ColumnLimit = 13; 10720 verifyFormat("int function(\n" 10721 " int x,\n" 10722 " bool y);", 10723 Alignment); 10724 Alignment.ColumnLimit = OldColumnLimit; 10725 // Ensure function pointers don't screw up recursive alignment 10726 verifyFormat("int a(int x, void (*fp)(int y));\n" 10727 "double b();", 10728 Alignment); 10729 Alignment.AlignConsecutiveAssignments = true; 10730 // Ensure recursive alignment is broken by function braces, so that the 10731 // "a = 1" does not align with subsequent assignments inside the function 10732 // body. 10733 verifyFormat("int func(int a = 1) {\n" 10734 " int b = 2;\n" 10735 " int cc = 3;\n" 10736 "}", 10737 Alignment); 10738 verifyFormat("float something = 2000;\n" 10739 "double another = 911;\n" 10740 "int i = 1, j = 10;\n" 10741 "const int *oneMore = 1;\n" 10742 "unsigned i = 2;", 10743 Alignment); 10744 verifyFormat("int oneTwoThree = {0}; // comment\n" 10745 "unsigned oneTwo = 0; // comment", 10746 Alignment); 10747 // Make sure that scope is correctly tracked, in the absence of braces 10748 verifyFormat("for (int i = 0; i < n; i++)\n" 10749 " j = i;\n" 10750 "double x = 1;\n", 10751 Alignment); 10752 verifyFormat("if (int i = 0)\n" 10753 " j = i;\n" 10754 "double x = 1;\n", 10755 Alignment); 10756 // Ensure operator[] and operator() are comprehended 10757 verifyFormat("struct test {\n" 10758 " long long int foo();\n" 10759 " int operator[](int a);\n" 10760 " double bar();\n" 10761 "};\n", 10762 Alignment); 10763 verifyFormat("struct test {\n" 10764 " long long int foo();\n" 10765 " int operator()(int a);\n" 10766 " double bar();\n" 10767 "};\n", 10768 Alignment); 10769 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 10770 " int const i = 1;\n" 10771 " int * j = 2;\n" 10772 " int big = 10000;\n" 10773 "\n" 10774 " unsigned oneTwoThree = 123;\n" 10775 " int oneTwo = 12;\n" 10776 " method();\n" 10777 " float k = 2;\n" 10778 " int ll = 10000;\n" 10779 "}", 10780 format("void SomeFunction(int parameter= 0) {\n" 10781 " int const i= 1;\n" 10782 " int *j=2;\n" 10783 " int big = 10000;\n" 10784 "\n" 10785 "unsigned oneTwoThree =123;\n" 10786 "int oneTwo = 12;\n" 10787 " method();\n" 10788 "float k= 2;\n" 10789 "int ll=10000;\n" 10790 "}", 10791 Alignment)); 10792 Alignment.AlignConsecutiveAssignments = false; 10793 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10794 verifyFormat("#define A \\\n" 10795 " int aaaa = 12; \\\n" 10796 " float b = 23; \\\n" 10797 " const int ccc = 234; \\\n" 10798 " unsigned dddddddddd = 2345;", 10799 Alignment); 10800 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10801 verifyFormat("#define A \\\n" 10802 " int aaaa = 12; \\\n" 10803 " float b = 23; \\\n" 10804 " const int ccc = 234; \\\n" 10805 " unsigned dddddddddd = 2345;", 10806 Alignment); 10807 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10808 Alignment.ColumnLimit = 30; 10809 verifyFormat("#define A \\\n" 10810 " int aaaa = 12; \\\n" 10811 " float b = 23; \\\n" 10812 " const int ccc = 234; \\\n" 10813 " int dddddddddd = 2345;", 10814 Alignment); 10815 Alignment.ColumnLimit = 80; 10816 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10817 "k = 4, int l = 5,\n" 10818 " int m = 6) {\n" 10819 " const int j = 10;\n" 10820 " otherThing = 1;\n" 10821 "}", 10822 Alignment); 10823 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10824 " int const i = 1;\n" 10825 " int * j = 2;\n" 10826 " int big = 10000;\n" 10827 "}", 10828 Alignment); 10829 verifyFormat("class C {\n" 10830 "public:\n" 10831 " int i = 1;\n" 10832 " virtual void f() = 0;\n" 10833 "};", 10834 Alignment); 10835 verifyFormat("float i = 1;\n" 10836 "if (SomeType t = getSomething()) {\n" 10837 "}\n" 10838 "const unsigned j = 2;\n" 10839 "int big = 10000;", 10840 Alignment); 10841 verifyFormat("float j = 7;\n" 10842 "for (int k = 0; k < N; ++k) {\n" 10843 "}\n" 10844 "unsigned j = 2;\n" 10845 "int big = 10000;\n" 10846 "}", 10847 Alignment); 10848 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10849 verifyFormat("float i = 1;\n" 10850 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10851 " = someLooooooooooooooooongFunction();\n" 10852 "int j = 2;", 10853 Alignment); 10854 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10855 verifyFormat("int i = 1;\n" 10856 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10857 " someLooooooooooooooooongFunction();\n" 10858 "int j = 2;", 10859 Alignment); 10860 10861 Alignment.AlignConsecutiveAssignments = true; 10862 verifyFormat("auto lambda = []() {\n" 10863 " auto ii = 0;\n" 10864 " float j = 0;\n" 10865 " return 0;\n" 10866 "};\n" 10867 "int i = 0;\n" 10868 "float i2 = 0;\n" 10869 "auto v = type{\n" 10870 " i = 1, //\n" 10871 " (i = 2), //\n" 10872 " i = 3 //\n" 10873 "};", 10874 Alignment); 10875 Alignment.AlignConsecutiveAssignments = false; 10876 10877 verifyFormat( 10878 "int i = 1;\n" 10879 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10880 " loooooooooooooooooooooongParameterB);\n" 10881 "int j = 2;", 10882 Alignment); 10883 10884 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 10885 // We expect declarations and assignments to align, as long as it doesn't 10886 // exceed the column limit, starting a new alignment sequence whenever it 10887 // happens. 10888 Alignment.AlignConsecutiveAssignments = true; 10889 Alignment.ColumnLimit = 30; 10890 verifyFormat("float ii = 1;\n" 10891 "unsigned j = 2;\n" 10892 "int someVerylongVariable = 1;\n" 10893 "AnotherLongType ll = 123456;\n" 10894 "VeryVeryLongType k = 2;\n" 10895 "int myvar = 1;", 10896 Alignment); 10897 Alignment.ColumnLimit = 80; 10898 Alignment.AlignConsecutiveAssignments = false; 10899 10900 verifyFormat( 10901 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 10902 " typename LongType, typename B>\n" 10903 "auto foo() {}\n", 10904 Alignment); 10905 verifyFormat("float a, b = 1;\n" 10906 "int c = 2;\n" 10907 "int dd = 3;\n", 10908 Alignment); 10909 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10910 "float b[1][] = {{3.f}};\n", 10911 Alignment); 10912 Alignment.AlignConsecutiveAssignments = true; 10913 verifyFormat("float a, b = 1;\n" 10914 "int c = 2;\n" 10915 "int dd = 3;\n", 10916 Alignment); 10917 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10918 "float b[1][] = {{3.f}};\n", 10919 Alignment); 10920 Alignment.AlignConsecutiveAssignments = false; 10921 10922 Alignment.ColumnLimit = 30; 10923 Alignment.BinPackParameters = false; 10924 verifyFormat("void foo(float a,\n" 10925 " float b,\n" 10926 " int c,\n" 10927 " uint32_t *d) {\n" 10928 " int * e = 0;\n" 10929 " float f = 0;\n" 10930 " double g = 0;\n" 10931 "}\n" 10932 "void bar(ino_t a,\n" 10933 " int b,\n" 10934 " uint32_t *c,\n" 10935 " bool d) {}\n", 10936 Alignment); 10937 Alignment.BinPackParameters = true; 10938 Alignment.ColumnLimit = 80; 10939 10940 // Bug 33507 10941 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 10942 verifyFormat( 10943 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 10944 " static const Version verVs2017;\n" 10945 " return true;\n" 10946 "});\n", 10947 Alignment); 10948 Alignment.PointerAlignment = FormatStyle::PAS_Right; 10949 10950 // See llvm.org/PR35641 10951 Alignment.AlignConsecutiveDeclarations = true; 10952 verifyFormat("int func() { //\n" 10953 " int b;\n" 10954 " unsigned c;\n" 10955 "}", 10956 Alignment); 10957 10958 // See PR37175 10959 FormatStyle Style = getMozillaStyle(); 10960 Style.AlignConsecutiveDeclarations = true; 10961 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 10962 "foo(int a);", 10963 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 10964 } 10965 10966 TEST_F(FormatTest, LinuxBraceBreaking) { 10967 FormatStyle LinuxBraceStyle = getLLVMStyle(); 10968 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 10969 verifyFormat("namespace a\n" 10970 "{\n" 10971 "class A\n" 10972 "{\n" 10973 " void f()\n" 10974 " {\n" 10975 " if (true) {\n" 10976 " a();\n" 10977 " b();\n" 10978 " } else {\n" 10979 " a();\n" 10980 " }\n" 10981 " }\n" 10982 " void g() { return; }\n" 10983 "};\n" 10984 "struct B {\n" 10985 " int x;\n" 10986 "};\n" 10987 "} // namespace a\n", 10988 LinuxBraceStyle); 10989 verifyFormat("enum X {\n" 10990 " Y = 0,\n" 10991 "}\n", 10992 LinuxBraceStyle); 10993 verifyFormat("struct S {\n" 10994 " int Type;\n" 10995 " union {\n" 10996 " int x;\n" 10997 " double y;\n" 10998 " } Value;\n" 10999 " class C\n" 11000 " {\n" 11001 " MyFavoriteType Value;\n" 11002 " } Class;\n" 11003 "}\n", 11004 LinuxBraceStyle); 11005 } 11006 11007 TEST_F(FormatTest, MozillaBraceBreaking) { 11008 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11009 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11010 MozillaBraceStyle.FixNamespaceComments = false; 11011 verifyFormat("namespace a {\n" 11012 "class A\n" 11013 "{\n" 11014 " void f()\n" 11015 " {\n" 11016 " if (true) {\n" 11017 " a();\n" 11018 " b();\n" 11019 " }\n" 11020 " }\n" 11021 " void g() { return; }\n" 11022 "};\n" 11023 "enum E\n" 11024 "{\n" 11025 " A,\n" 11026 " // foo\n" 11027 " B,\n" 11028 " C\n" 11029 "};\n" 11030 "struct B\n" 11031 "{\n" 11032 " int x;\n" 11033 "};\n" 11034 "}\n", 11035 MozillaBraceStyle); 11036 verifyFormat("struct S\n" 11037 "{\n" 11038 " int Type;\n" 11039 " union\n" 11040 " {\n" 11041 " int x;\n" 11042 " double y;\n" 11043 " } Value;\n" 11044 " class C\n" 11045 " {\n" 11046 " MyFavoriteType Value;\n" 11047 " } Class;\n" 11048 "}\n", 11049 MozillaBraceStyle); 11050 } 11051 11052 TEST_F(FormatTest, StroustrupBraceBreaking) { 11053 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11054 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11055 verifyFormat("namespace a {\n" 11056 "class A {\n" 11057 " void f()\n" 11058 " {\n" 11059 " if (true) {\n" 11060 " a();\n" 11061 " b();\n" 11062 " }\n" 11063 " }\n" 11064 " void g() { return; }\n" 11065 "};\n" 11066 "struct B {\n" 11067 " int x;\n" 11068 "};\n" 11069 "} // namespace a\n", 11070 StroustrupBraceStyle); 11071 11072 verifyFormat("void foo()\n" 11073 "{\n" 11074 " if (a) {\n" 11075 " a();\n" 11076 " }\n" 11077 " else {\n" 11078 " b();\n" 11079 " }\n" 11080 "}\n", 11081 StroustrupBraceStyle); 11082 11083 verifyFormat("#ifdef _DEBUG\n" 11084 "int foo(int i = 0)\n" 11085 "#else\n" 11086 "int foo(int i = 5)\n" 11087 "#endif\n" 11088 "{\n" 11089 " return i;\n" 11090 "}", 11091 StroustrupBraceStyle); 11092 11093 verifyFormat("void foo() {}\n" 11094 "void bar()\n" 11095 "#ifdef _DEBUG\n" 11096 "{\n" 11097 " foo();\n" 11098 "}\n" 11099 "#else\n" 11100 "{\n" 11101 "}\n" 11102 "#endif", 11103 StroustrupBraceStyle); 11104 11105 verifyFormat("void foobar() { int i = 5; }\n" 11106 "#ifdef _DEBUG\n" 11107 "void bar() {}\n" 11108 "#else\n" 11109 "void bar() { foobar(); }\n" 11110 "#endif", 11111 StroustrupBraceStyle); 11112 } 11113 11114 TEST_F(FormatTest, AllmanBraceBreaking) { 11115 FormatStyle AllmanBraceStyle = getLLVMStyle(); 11116 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 11117 11118 EXPECT_EQ("namespace a\n" 11119 "{\n" 11120 "void f();\n" 11121 "void g();\n" 11122 "} // namespace a\n", 11123 format("namespace a\n" 11124 "{\n" 11125 "void f();\n" 11126 "void g();\n" 11127 "}\n", 11128 AllmanBraceStyle)); 11129 11130 verifyFormat("namespace a\n" 11131 "{\n" 11132 "class A\n" 11133 "{\n" 11134 " void f()\n" 11135 " {\n" 11136 " if (true)\n" 11137 " {\n" 11138 " a();\n" 11139 " b();\n" 11140 " }\n" 11141 " }\n" 11142 " void g() { return; }\n" 11143 "};\n" 11144 "struct B\n" 11145 "{\n" 11146 " int x;\n" 11147 "};\n" 11148 "union C\n" 11149 "{\n" 11150 "};\n" 11151 "} // namespace a", 11152 AllmanBraceStyle); 11153 11154 verifyFormat("void f()\n" 11155 "{\n" 11156 " if (true)\n" 11157 " {\n" 11158 " a();\n" 11159 " }\n" 11160 " else if (false)\n" 11161 " {\n" 11162 " b();\n" 11163 " }\n" 11164 " else\n" 11165 " {\n" 11166 " c();\n" 11167 " }\n" 11168 "}\n", 11169 AllmanBraceStyle); 11170 11171 verifyFormat("void f()\n" 11172 "{\n" 11173 " for (int i = 0; i < 10; ++i)\n" 11174 " {\n" 11175 " a();\n" 11176 " }\n" 11177 " while (false)\n" 11178 " {\n" 11179 " b();\n" 11180 " }\n" 11181 " do\n" 11182 " {\n" 11183 " c();\n" 11184 " } while (false)\n" 11185 "}\n", 11186 AllmanBraceStyle); 11187 11188 verifyFormat("void f(int a)\n" 11189 "{\n" 11190 " switch (a)\n" 11191 " {\n" 11192 " case 0:\n" 11193 " break;\n" 11194 " case 1:\n" 11195 " {\n" 11196 " break;\n" 11197 " }\n" 11198 " case 2:\n" 11199 " {\n" 11200 " }\n" 11201 " break;\n" 11202 " default:\n" 11203 " break;\n" 11204 " }\n" 11205 "}\n", 11206 AllmanBraceStyle); 11207 11208 verifyFormat("enum X\n" 11209 "{\n" 11210 " Y = 0,\n" 11211 "}\n", 11212 AllmanBraceStyle); 11213 verifyFormat("enum X\n" 11214 "{\n" 11215 " Y = 0\n" 11216 "}\n", 11217 AllmanBraceStyle); 11218 11219 verifyFormat("@interface BSApplicationController ()\n" 11220 "{\n" 11221 "@private\n" 11222 " id _extraIvar;\n" 11223 "}\n" 11224 "@end\n", 11225 AllmanBraceStyle); 11226 11227 verifyFormat("#ifdef _DEBUG\n" 11228 "int foo(int i = 0)\n" 11229 "#else\n" 11230 "int foo(int i = 5)\n" 11231 "#endif\n" 11232 "{\n" 11233 " return i;\n" 11234 "}", 11235 AllmanBraceStyle); 11236 11237 verifyFormat("void foo() {}\n" 11238 "void bar()\n" 11239 "#ifdef _DEBUG\n" 11240 "{\n" 11241 " foo();\n" 11242 "}\n" 11243 "#else\n" 11244 "{\n" 11245 "}\n" 11246 "#endif", 11247 AllmanBraceStyle); 11248 11249 verifyFormat("void foobar() { int i = 5; }\n" 11250 "#ifdef _DEBUG\n" 11251 "void bar() {}\n" 11252 "#else\n" 11253 "void bar() { foobar(); }\n" 11254 "#endif", 11255 AllmanBraceStyle); 11256 11257 // This shouldn't affect ObjC blocks.. 11258 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11259 " // ...\n" 11260 " int i;\n" 11261 "}];", 11262 AllmanBraceStyle); 11263 verifyFormat("void (^block)(void) = ^{\n" 11264 " // ...\n" 11265 " int i;\n" 11266 "};", 11267 AllmanBraceStyle); 11268 // .. or dict literals. 11269 verifyFormat("void f()\n" 11270 "{\n" 11271 " // ...\n" 11272 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11273 "}", 11274 AllmanBraceStyle); 11275 verifyFormat("void f()\n" 11276 "{\n" 11277 " // ...\n" 11278 " [object someMethod:@{a : @\"b\"}];\n" 11279 "}", 11280 AllmanBraceStyle); 11281 verifyFormat("int f()\n" 11282 "{ // comment\n" 11283 " return 42;\n" 11284 "}", 11285 AllmanBraceStyle); 11286 11287 AllmanBraceStyle.ColumnLimit = 19; 11288 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11289 AllmanBraceStyle.ColumnLimit = 18; 11290 verifyFormat("void f()\n" 11291 "{\n" 11292 " int i;\n" 11293 "}", 11294 AllmanBraceStyle); 11295 AllmanBraceStyle.ColumnLimit = 80; 11296 11297 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11298 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11299 FormatStyle::SIS_WithoutElse; 11300 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11301 verifyFormat("void f(bool b)\n" 11302 "{\n" 11303 " if (b)\n" 11304 " {\n" 11305 " return;\n" 11306 " }\n" 11307 "}\n", 11308 BreakBeforeBraceShortIfs); 11309 verifyFormat("void f(bool b)\n" 11310 "{\n" 11311 " if constexpr (b)\n" 11312 " {\n" 11313 " return;\n" 11314 " }\n" 11315 "}\n", 11316 BreakBeforeBraceShortIfs); 11317 verifyFormat("void f(bool b)\n" 11318 "{\n" 11319 " if CONSTEXPR (b)\n" 11320 " {\n" 11321 " return;\n" 11322 " }\n" 11323 "}\n", 11324 BreakBeforeBraceShortIfs); 11325 verifyFormat("void f(bool b)\n" 11326 "{\n" 11327 " if (b) return;\n" 11328 "}\n", 11329 BreakBeforeBraceShortIfs); 11330 verifyFormat("void f(bool b)\n" 11331 "{\n" 11332 " if constexpr (b) return;\n" 11333 "}\n", 11334 BreakBeforeBraceShortIfs); 11335 verifyFormat("void f(bool b)\n" 11336 "{\n" 11337 " if CONSTEXPR (b) return;\n" 11338 "}\n", 11339 BreakBeforeBraceShortIfs); 11340 verifyFormat("void f(bool b)\n" 11341 "{\n" 11342 " while (b)\n" 11343 " {\n" 11344 " return;\n" 11345 " }\n" 11346 "}\n", 11347 BreakBeforeBraceShortIfs); 11348 } 11349 11350 TEST_F(FormatTest, GNUBraceBreaking) { 11351 FormatStyle GNUBraceStyle = getLLVMStyle(); 11352 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 11353 verifyFormat("namespace a\n" 11354 "{\n" 11355 "class A\n" 11356 "{\n" 11357 " void f()\n" 11358 " {\n" 11359 " int a;\n" 11360 " {\n" 11361 " int b;\n" 11362 " }\n" 11363 " if (true)\n" 11364 " {\n" 11365 " a();\n" 11366 " b();\n" 11367 " }\n" 11368 " }\n" 11369 " void g() { return; }\n" 11370 "}\n" 11371 "} // namespace a", 11372 GNUBraceStyle); 11373 11374 verifyFormat("void f()\n" 11375 "{\n" 11376 " if (true)\n" 11377 " {\n" 11378 " a();\n" 11379 " }\n" 11380 " else if (false)\n" 11381 " {\n" 11382 " b();\n" 11383 " }\n" 11384 " else\n" 11385 " {\n" 11386 " c();\n" 11387 " }\n" 11388 "}\n", 11389 GNUBraceStyle); 11390 11391 verifyFormat("void f()\n" 11392 "{\n" 11393 " for (int i = 0; i < 10; ++i)\n" 11394 " {\n" 11395 " a();\n" 11396 " }\n" 11397 " while (false)\n" 11398 " {\n" 11399 " b();\n" 11400 " }\n" 11401 " do\n" 11402 " {\n" 11403 " c();\n" 11404 " }\n" 11405 " while (false);\n" 11406 "}\n", 11407 GNUBraceStyle); 11408 11409 verifyFormat("void f(int a)\n" 11410 "{\n" 11411 " switch (a)\n" 11412 " {\n" 11413 " case 0:\n" 11414 " break;\n" 11415 " case 1:\n" 11416 " {\n" 11417 " break;\n" 11418 " }\n" 11419 " case 2:\n" 11420 " {\n" 11421 " }\n" 11422 " break;\n" 11423 " default:\n" 11424 " break;\n" 11425 " }\n" 11426 "}\n", 11427 GNUBraceStyle); 11428 11429 verifyFormat("enum X\n" 11430 "{\n" 11431 " Y = 0,\n" 11432 "}\n", 11433 GNUBraceStyle); 11434 11435 verifyFormat("@interface BSApplicationController ()\n" 11436 "{\n" 11437 "@private\n" 11438 " id _extraIvar;\n" 11439 "}\n" 11440 "@end\n", 11441 GNUBraceStyle); 11442 11443 verifyFormat("#ifdef _DEBUG\n" 11444 "int foo(int i = 0)\n" 11445 "#else\n" 11446 "int foo(int i = 5)\n" 11447 "#endif\n" 11448 "{\n" 11449 " return i;\n" 11450 "}", 11451 GNUBraceStyle); 11452 11453 verifyFormat("void foo() {}\n" 11454 "void bar()\n" 11455 "#ifdef _DEBUG\n" 11456 "{\n" 11457 " foo();\n" 11458 "}\n" 11459 "#else\n" 11460 "{\n" 11461 "}\n" 11462 "#endif", 11463 GNUBraceStyle); 11464 11465 verifyFormat("void foobar() { int i = 5; }\n" 11466 "#ifdef _DEBUG\n" 11467 "void bar() {}\n" 11468 "#else\n" 11469 "void bar() { foobar(); }\n" 11470 "#endif", 11471 GNUBraceStyle); 11472 } 11473 11474 TEST_F(FormatTest, WebKitBraceBreaking) { 11475 FormatStyle WebKitBraceStyle = getLLVMStyle(); 11476 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 11477 WebKitBraceStyle.FixNamespaceComments = false; 11478 verifyFormat("namespace a {\n" 11479 "class A {\n" 11480 " void f()\n" 11481 " {\n" 11482 " if (true) {\n" 11483 " a();\n" 11484 " b();\n" 11485 " }\n" 11486 " }\n" 11487 " void g() { return; }\n" 11488 "};\n" 11489 "enum E {\n" 11490 " A,\n" 11491 " // foo\n" 11492 " B,\n" 11493 " C\n" 11494 "};\n" 11495 "struct B {\n" 11496 " int x;\n" 11497 "};\n" 11498 "}\n", 11499 WebKitBraceStyle); 11500 verifyFormat("struct S {\n" 11501 " int Type;\n" 11502 " union {\n" 11503 " int x;\n" 11504 " double y;\n" 11505 " } Value;\n" 11506 " class C {\n" 11507 " MyFavoriteType Value;\n" 11508 " } Class;\n" 11509 "};\n", 11510 WebKitBraceStyle); 11511 } 11512 11513 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 11514 verifyFormat("void f() {\n" 11515 " try {\n" 11516 " } catch (const Exception &e) {\n" 11517 " }\n" 11518 "}\n", 11519 getLLVMStyle()); 11520 } 11521 11522 TEST_F(FormatTest, UnderstandsPragmas) { 11523 verifyFormat("#pragma omp reduction(| : var)"); 11524 verifyFormat("#pragma omp reduction(+ : var)"); 11525 11526 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 11527 "(including parentheses).", 11528 format("#pragma mark Any non-hyphenated or hyphenated string " 11529 "(including parentheses).")); 11530 } 11531 11532 TEST_F(FormatTest, UnderstandPragmaOption) { 11533 verifyFormat("#pragma option -C -A"); 11534 11535 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 11536 } 11537 11538 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 11539 FormatStyle Style = getLLVMStyle(); 11540 Style.ColumnLimit = 20; 11541 11542 // See PR41213 11543 EXPECT_EQ("/*\n" 11544 " *\t9012345\n" 11545 " * /8901\n" 11546 " */", 11547 format("/*\n" 11548 " *\t9012345 /8901\n" 11549 " */", 11550 Style)); 11551 EXPECT_EQ("/*\n" 11552 " *345678\n" 11553 " *\t/8901\n" 11554 " */", 11555 format("/*\n" 11556 " *345678\t/8901\n" 11557 " */", 11558 Style)); 11559 11560 verifyFormat("int a; // the\n" 11561 " // comment", Style); 11562 EXPECT_EQ("int a; /* first line\n" 11563 " * second\n" 11564 " * line third\n" 11565 " * line\n" 11566 " */", 11567 format("int a; /* first line\n" 11568 " * second\n" 11569 " * line third\n" 11570 " * line\n" 11571 " */", 11572 Style)); 11573 EXPECT_EQ("int a; // first line\n" 11574 " // second\n" 11575 " // line third\n" 11576 " // line", 11577 format("int a; // first line\n" 11578 " // second line\n" 11579 " // third line", 11580 Style)); 11581 11582 Style.PenaltyExcessCharacter = 90; 11583 verifyFormat("int a; // the comment", Style); 11584 EXPECT_EQ("int a; // the comment\n" 11585 " // aaa", 11586 format("int a; // the comment aaa", Style)); 11587 EXPECT_EQ("int a; /* first line\n" 11588 " * second line\n" 11589 " * third line\n" 11590 " */", 11591 format("int a; /* first line\n" 11592 " * second line\n" 11593 " * third line\n" 11594 " */", 11595 Style)); 11596 EXPECT_EQ("int a; // first line\n" 11597 " // second line\n" 11598 " // third line", 11599 format("int a; // first line\n" 11600 " // second line\n" 11601 " // third line", 11602 Style)); 11603 // FIXME: Investigate why this is not getting the same layout as the test 11604 // above. 11605 EXPECT_EQ("int a; /* first line\n" 11606 " * second line\n" 11607 " * third line\n" 11608 " */", 11609 format("int a; /* first line second line third line" 11610 "\n*/", 11611 Style)); 11612 11613 EXPECT_EQ("// foo bar baz bazfoo\n" 11614 "// foo bar foo bar\n", 11615 format("// foo bar baz bazfoo\n" 11616 "// foo bar foo bar\n", 11617 Style)); 11618 EXPECT_EQ("// foo bar baz bazfoo\n" 11619 "// foo bar foo bar\n", 11620 format("// foo bar baz bazfoo\n" 11621 "// foo bar foo bar\n", 11622 Style)); 11623 11624 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 11625 // next one. 11626 EXPECT_EQ("// foo bar baz bazfoo\n" 11627 "// bar foo bar\n", 11628 format("// foo bar baz bazfoo bar\n" 11629 "// foo bar\n", 11630 Style)); 11631 11632 EXPECT_EQ("// foo bar baz bazfoo\n" 11633 "// foo bar baz bazfoo\n" 11634 "// bar foo bar\n", 11635 format("// foo bar baz bazfoo\n" 11636 "// foo bar baz bazfoo bar\n" 11637 "// foo bar\n", 11638 Style)); 11639 11640 EXPECT_EQ("// foo bar baz bazfoo\n" 11641 "// foo bar baz bazfoo\n" 11642 "// bar foo bar\n", 11643 format("// foo bar baz bazfoo\n" 11644 "// foo bar baz bazfoo bar\n" 11645 "// foo bar\n", 11646 Style)); 11647 11648 // Make sure we do not keep protruding characters if strict mode reflow is 11649 // cheaper than keeping protruding characters. 11650 Style.ColumnLimit = 21; 11651 EXPECT_EQ("// foo foo foo foo\n" 11652 "// foo foo foo foo\n" 11653 "// foo foo foo foo\n", 11654 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", 11655 Style)); 11656 11657 EXPECT_EQ("int a = /* long block\n" 11658 " comment */\n" 11659 " 42;", 11660 format("int a = /* long block comment */ 42;", Style)); 11661 } 11662 11663 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 11664 for (size_t i = 1; i < Styles.size(); ++i) \ 11665 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \ 11666 << " differs from Style #0" 11667 11668 TEST_F(FormatTest, GetsPredefinedStyleByName) { 11669 SmallVector<FormatStyle, 3> Styles; 11670 Styles.resize(3); 11671 11672 Styles[0] = getLLVMStyle(); 11673 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 11674 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 11675 EXPECT_ALL_STYLES_EQUAL(Styles); 11676 11677 Styles[0] = getGoogleStyle(); 11678 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 11679 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 11680 EXPECT_ALL_STYLES_EQUAL(Styles); 11681 11682 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 11683 EXPECT_TRUE( 11684 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 11685 EXPECT_TRUE( 11686 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 11687 EXPECT_ALL_STYLES_EQUAL(Styles); 11688 11689 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 11690 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 11691 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 11692 EXPECT_ALL_STYLES_EQUAL(Styles); 11693 11694 Styles[0] = getMozillaStyle(); 11695 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 11696 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 11697 EXPECT_ALL_STYLES_EQUAL(Styles); 11698 11699 Styles[0] = getWebKitStyle(); 11700 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 11701 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 11702 EXPECT_ALL_STYLES_EQUAL(Styles); 11703 11704 Styles[0] = getGNUStyle(); 11705 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 11706 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 11707 EXPECT_ALL_STYLES_EQUAL(Styles); 11708 11709 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 11710 } 11711 11712 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 11713 SmallVector<FormatStyle, 8> Styles; 11714 Styles.resize(2); 11715 11716 Styles[0] = getGoogleStyle(); 11717 Styles[1] = getLLVMStyle(); 11718 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 11719 EXPECT_ALL_STYLES_EQUAL(Styles); 11720 11721 Styles.resize(5); 11722 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 11723 Styles[1] = getLLVMStyle(); 11724 Styles[1].Language = FormatStyle::LK_JavaScript; 11725 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 11726 11727 Styles[2] = getLLVMStyle(); 11728 Styles[2].Language = FormatStyle::LK_JavaScript; 11729 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 11730 "BasedOnStyle: Google", 11731 &Styles[2]) 11732 .value()); 11733 11734 Styles[3] = getLLVMStyle(); 11735 Styles[3].Language = FormatStyle::LK_JavaScript; 11736 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 11737 "Language: JavaScript", 11738 &Styles[3]) 11739 .value()); 11740 11741 Styles[4] = getLLVMStyle(); 11742 Styles[4].Language = FormatStyle::LK_JavaScript; 11743 EXPECT_EQ(0, parseConfiguration("---\n" 11744 "BasedOnStyle: LLVM\n" 11745 "IndentWidth: 123\n" 11746 "---\n" 11747 "BasedOnStyle: Google\n" 11748 "Language: JavaScript", 11749 &Styles[4]) 11750 .value()); 11751 EXPECT_ALL_STYLES_EQUAL(Styles); 11752 } 11753 11754 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 11755 Style.FIELD = false; \ 11756 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 11757 EXPECT_TRUE(Style.FIELD); \ 11758 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 11759 EXPECT_FALSE(Style.FIELD); 11760 11761 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 11762 11763 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 11764 Style.STRUCT.FIELD = false; \ 11765 EXPECT_EQ(0, \ 11766 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 11767 .value()); \ 11768 EXPECT_TRUE(Style.STRUCT.FIELD); \ 11769 EXPECT_EQ(0, \ 11770 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 11771 .value()); \ 11772 EXPECT_FALSE(Style.STRUCT.FIELD); 11773 11774 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 11775 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 11776 11777 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 11778 EXPECT_NE(VALUE, Style.FIELD); \ 11779 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 11780 EXPECT_EQ(VALUE, Style.FIELD) 11781 11782 TEST_F(FormatTest, ParsesConfigurationBools) { 11783 FormatStyle Style = {}; 11784 Style.Language = FormatStyle::LK_Cpp; 11785 CHECK_PARSE_BOOL(AlignOperands); 11786 CHECK_PARSE_BOOL(AlignTrailingComments); 11787 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 11788 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 11789 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 11790 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 11791 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 11792 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 11793 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 11794 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 11795 CHECK_PARSE_BOOL(BinPackArguments); 11796 CHECK_PARSE_BOOL(BinPackParameters); 11797 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 11798 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 11799 CHECK_PARSE_BOOL(BreakStringLiterals); 11800 CHECK_PARSE_BOOL(CompactNamespaces); 11801 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 11802 CHECK_PARSE_BOOL(DerivePointerAlignment); 11803 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 11804 CHECK_PARSE_BOOL(DisableFormat); 11805 CHECK_PARSE_BOOL(IndentCaseLabels); 11806 CHECK_PARSE_BOOL(IndentGotoLabels); 11807 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 11808 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 11809 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 11810 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 11811 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 11812 CHECK_PARSE_BOOL(ReflowComments); 11813 CHECK_PARSE_BOOL(SortIncludes); 11814 CHECK_PARSE_BOOL(SortUsingDeclarations); 11815 CHECK_PARSE_BOOL(SpacesInParentheses); 11816 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 11817 CHECK_PARSE_BOOL(SpacesInAngles); 11818 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 11819 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 11820 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 11821 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 11822 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 11823 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 11824 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 11825 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 11826 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 11827 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 11828 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 11829 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 11830 11831 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 11832 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 11833 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement); 11834 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 11835 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 11836 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 11837 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 11838 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 11839 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 11840 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 11841 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 11842 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 11843 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 11844 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 11845 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 11846 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 11847 } 11848 11849 #undef CHECK_PARSE_BOOL 11850 11851 TEST_F(FormatTest, ParsesConfiguration) { 11852 FormatStyle Style = {}; 11853 Style.Language = FormatStyle::LK_Cpp; 11854 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 11855 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 11856 ConstructorInitializerIndentWidth, 1234u); 11857 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 11858 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 11859 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 11860 CHECK_PARSE("PenaltyBreakAssignment: 1234", 11861 PenaltyBreakAssignment, 1234u); 11862 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 11863 PenaltyBreakBeforeFirstCallParameter, 1234u); 11864 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 11865 PenaltyBreakTemplateDeclaration, 1234u); 11866 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 11867 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 11868 PenaltyReturnTypeOnItsOwnLine, 1234u); 11869 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 11870 SpacesBeforeTrailingComments, 1234u); 11871 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 11872 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 11873 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 11874 11875 Style.PointerAlignment = FormatStyle::PAS_Middle; 11876 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 11877 FormatStyle::PAS_Left); 11878 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 11879 FormatStyle::PAS_Right); 11880 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 11881 FormatStyle::PAS_Middle); 11882 // For backward compatibility: 11883 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 11884 FormatStyle::PAS_Left); 11885 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 11886 FormatStyle::PAS_Right); 11887 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 11888 FormatStyle::PAS_Middle); 11889 11890 Style.Standard = FormatStyle::LS_Auto; 11891 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 11892 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11); 11893 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 11894 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 11895 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 11896 11897 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11898 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 11899 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 11900 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 11901 FormatStyle::BOS_None); 11902 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 11903 FormatStyle::BOS_All); 11904 // For backward compatibility: 11905 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 11906 FormatStyle::BOS_None); 11907 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 11908 FormatStyle::BOS_All); 11909 11910 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 11911 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 11912 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 11913 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 11914 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 11915 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 11916 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 11917 // For backward compatibility: 11918 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 11919 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 11920 11921 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 11922 CHECK_PARSE("BreakInheritanceList: BeforeComma", 11923 BreakInheritanceList, FormatStyle::BILS_BeforeComma); 11924 CHECK_PARSE("BreakInheritanceList: AfterColon", 11925 BreakInheritanceList, FormatStyle::BILS_AfterColon); 11926 CHECK_PARSE("BreakInheritanceList: BeforeColon", 11927 BreakInheritanceList, FormatStyle::BILS_BeforeColon); 11928 // For backward compatibility: 11929 CHECK_PARSE("BreakBeforeInheritanceComma: true", 11930 BreakInheritanceList, FormatStyle::BILS_BeforeComma); 11931 11932 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 11933 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 11934 FormatStyle::BAS_Align); 11935 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 11936 FormatStyle::BAS_DontAlign); 11937 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 11938 FormatStyle::BAS_AlwaysBreak); 11939 // For backward compatibility: 11940 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 11941 FormatStyle::BAS_DontAlign); 11942 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 11943 FormatStyle::BAS_Align); 11944 11945 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11946 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 11947 FormatStyle::ENAS_DontAlign); 11948 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 11949 FormatStyle::ENAS_Left); 11950 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 11951 FormatStyle::ENAS_Right); 11952 // For backward compatibility: 11953 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 11954 FormatStyle::ENAS_Left); 11955 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 11956 FormatStyle::ENAS_Right); 11957 11958 Style.UseTab = FormatStyle::UT_ForIndentation; 11959 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 11960 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 11961 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 11962 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 11963 FormatStyle::UT_ForContinuationAndIndentation); 11964 // For backward compatibility: 11965 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 11966 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 11967 11968 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 11969 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 11970 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 11971 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 11972 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 11973 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 11974 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 11975 // For backward compatibility: 11976 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 11977 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 11978 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 11979 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 11980 11981 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 11982 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 11983 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 11984 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 11985 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 11986 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 11987 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 11988 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 11989 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 11990 // For backward compatibility: 11991 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 11992 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 11993 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 11994 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 11995 11996 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 11997 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 11998 FormatStyle::SBPO_Never); 11999 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 12000 FormatStyle::SBPO_Always); 12001 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 12002 FormatStyle::SBPO_ControlStatements); 12003 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 12004 FormatStyle::SBPO_NonEmptyParentheses); 12005 // For backward compatibility: 12006 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 12007 FormatStyle::SBPO_Never); 12008 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 12009 FormatStyle::SBPO_ControlStatements); 12010 12011 Style.ColumnLimit = 123; 12012 FormatStyle BaseStyle = getLLVMStyle(); 12013 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 12014 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 12015 12016 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12017 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 12018 FormatStyle::BS_Attach); 12019 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 12020 FormatStyle::BS_Linux); 12021 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 12022 FormatStyle::BS_Mozilla); 12023 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 12024 FormatStyle::BS_Stroustrup); 12025 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 12026 FormatStyle::BS_Allman); 12027 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 12028 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 12029 FormatStyle::BS_WebKit); 12030 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 12031 FormatStyle::BS_Custom); 12032 12033 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 12034 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 12035 FormatStyle::RTBS_None); 12036 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 12037 FormatStyle::RTBS_All); 12038 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 12039 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 12040 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 12041 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 12042 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 12043 AlwaysBreakAfterReturnType, 12044 FormatStyle::RTBS_TopLevelDefinitions); 12045 12046 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 12047 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations, 12048 FormatStyle::BTDS_No); 12049 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations, 12050 FormatStyle::BTDS_MultiLine); 12051 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations, 12052 FormatStyle::BTDS_Yes); 12053 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations, 12054 FormatStyle::BTDS_MultiLine); 12055 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations, 12056 FormatStyle::BTDS_Yes); 12057 12058 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 12059 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 12060 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 12061 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 12062 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 12063 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 12064 AlwaysBreakAfterDefinitionReturnType, 12065 FormatStyle::DRTBS_TopLevel); 12066 12067 Style.NamespaceIndentation = FormatStyle::NI_All; 12068 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 12069 FormatStyle::NI_None); 12070 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 12071 FormatStyle::NI_Inner); 12072 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 12073 FormatStyle::NI_All); 12074 12075 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 12076 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 12077 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12078 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 12079 AllowShortIfStatementsOnASingleLine, 12080 FormatStyle::SIS_WithoutElse); 12081 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 12082 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 12083 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 12084 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12085 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 12086 AllowShortIfStatementsOnASingleLine, 12087 FormatStyle::SIS_WithoutElse); 12088 12089 // FIXME: This is required because parsing a configuration simply overwrites 12090 // the first N elements of the list instead of resetting it. 12091 Style.ForEachMacros.clear(); 12092 std::vector<std::string> BoostForeach; 12093 BoostForeach.push_back("BOOST_FOREACH"); 12094 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 12095 std::vector<std::string> BoostAndQForeach; 12096 BoostAndQForeach.push_back("BOOST_FOREACH"); 12097 BoostAndQForeach.push_back("Q_FOREACH"); 12098 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 12099 BoostAndQForeach); 12100 12101 Style.StatementMacros.clear(); 12102 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 12103 std::vector<std::string>{"QUNUSED"}); 12104 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 12105 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 12106 12107 Style.NamespaceMacros.clear(); 12108 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 12109 std::vector<std::string>{"TESTSUITE"}); 12110 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 12111 std::vector<std::string>({"TESTSUITE", "SUITE"})); 12112 12113 Style.IncludeStyle.IncludeCategories.clear(); 12114 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 12115 {"abc/.*", 2}, {".*", 1}}; 12116 CHECK_PARSE("IncludeCategories:\n" 12117 " - Regex: abc/.*\n" 12118 " Priority: 2\n" 12119 " - Regex: .*\n" 12120 " Priority: 1", 12121 IncludeStyle.IncludeCategories, ExpectedCategories); 12122 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 12123 "abc$"); 12124 12125 Style.RawStringFormats.clear(); 12126 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 12127 { 12128 FormatStyle::LK_TextProto, 12129 {"pb", "proto"}, 12130 {"PARSE_TEXT_PROTO"}, 12131 /*CanonicalDelimiter=*/"", 12132 "llvm", 12133 }, 12134 { 12135 FormatStyle::LK_Cpp, 12136 {"cc", "cpp"}, 12137 {"C_CODEBLOCK", "CPPEVAL"}, 12138 /*CanonicalDelimiter=*/"cc", 12139 /*BasedOnStyle=*/"", 12140 }, 12141 }; 12142 12143 CHECK_PARSE("RawStringFormats:\n" 12144 " - Language: TextProto\n" 12145 " Delimiters:\n" 12146 " - 'pb'\n" 12147 " - 'proto'\n" 12148 " EnclosingFunctions:\n" 12149 " - 'PARSE_TEXT_PROTO'\n" 12150 " BasedOnStyle: llvm\n" 12151 " - Language: Cpp\n" 12152 " Delimiters:\n" 12153 " - 'cc'\n" 12154 " - 'cpp'\n" 12155 " EnclosingFunctions:\n" 12156 " - 'C_CODEBLOCK'\n" 12157 " - 'CPPEVAL'\n" 12158 " CanonicalDelimiter: 'cc'", 12159 RawStringFormats, ExpectedRawStringFormats); 12160 } 12161 12162 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 12163 FormatStyle Style = {}; 12164 Style.Language = FormatStyle::LK_Cpp; 12165 CHECK_PARSE("Language: Cpp\n" 12166 "IndentWidth: 12", 12167 IndentWidth, 12u); 12168 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 12169 "IndentWidth: 34", 12170 &Style), 12171 ParseError::Unsuitable); 12172 EXPECT_EQ(12u, Style.IndentWidth); 12173 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12174 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12175 12176 Style.Language = FormatStyle::LK_JavaScript; 12177 CHECK_PARSE("Language: JavaScript\n" 12178 "IndentWidth: 12", 12179 IndentWidth, 12u); 12180 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 12181 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 12182 "IndentWidth: 34", 12183 &Style), 12184 ParseError::Unsuitable); 12185 EXPECT_EQ(23u, Style.IndentWidth); 12186 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12187 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12188 12189 CHECK_PARSE("BasedOnStyle: LLVM\n" 12190 "IndentWidth: 67", 12191 IndentWidth, 67u); 12192 12193 CHECK_PARSE("---\n" 12194 "Language: JavaScript\n" 12195 "IndentWidth: 12\n" 12196 "---\n" 12197 "Language: Cpp\n" 12198 "IndentWidth: 34\n" 12199 "...\n", 12200 IndentWidth, 12u); 12201 12202 Style.Language = FormatStyle::LK_Cpp; 12203 CHECK_PARSE("---\n" 12204 "Language: JavaScript\n" 12205 "IndentWidth: 12\n" 12206 "---\n" 12207 "Language: Cpp\n" 12208 "IndentWidth: 34\n" 12209 "...\n", 12210 IndentWidth, 34u); 12211 CHECK_PARSE("---\n" 12212 "IndentWidth: 78\n" 12213 "---\n" 12214 "Language: JavaScript\n" 12215 "IndentWidth: 56\n" 12216 "...\n", 12217 IndentWidth, 78u); 12218 12219 Style.ColumnLimit = 123; 12220 Style.IndentWidth = 234; 12221 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 12222 Style.TabWidth = 345; 12223 EXPECT_FALSE(parseConfiguration("---\n" 12224 "IndentWidth: 456\n" 12225 "BreakBeforeBraces: Allman\n" 12226 "---\n" 12227 "Language: JavaScript\n" 12228 "IndentWidth: 111\n" 12229 "TabWidth: 111\n" 12230 "---\n" 12231 "Language: Cpp\n" 12232 "BreakBeforeBraces: Stroustrup\n" 12233 "TabWidth: 789\n" 12234 "...\n", 12235 &Style)); 12236 EXPECT_EQ(123u, Style.ColumnLimit); 12237 EXPECT_EQ(456u, Style.IndentWidth); 12238 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 12239 EXPECT_EQ(789u, Style.TabWidth); 12240 12241 EXPECT_EQ(parseConfiguration("---\n" 12242 "Language: JavaScript\n" 12243 "IndentWidth: 56\n" 12244 "---\n" 12245 "IndentWidth: 78\n" 12246 "...\n", 12247 &Style), 12248 ParseError::Error); 12249 EXPECT_EQ(parseConfiguration("---\n" 12250 "Language: JavaScript\n" 12251 "IndentWidth: 56\n" 12252 "---\n" 12253 "Language: JavaScript\n" 12254 "IndentWidth: 78\n" 12255 "...\n", 12256 &Style), 12257 ParseError::Error); 12258 12259 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12260 } 12261 12262 #undef CHECK_PARSE 12263 12264 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 12265 FormatStyle Style = {}; 12266 Style.Language = FormatStyle::LK_JavaScript; 12267 Style.BreakBeforeTernaryOperators = true; 12268 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 12269 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12270 12271 Style.BreakBeforeTernaryOperators = true; 12272 EXPECT_EQ(0, parseConfiguration("---\n" 12273 "BasedOnStyle: Google\n" 12274 "---\n" 12275 "Language: JavaScript\n" 12276 "IndentWidth: 76\n" 12277 "...\n", 12278 &Style) 12279 .value()); 12280 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12281 EXPECT_EQ(76u, Style.IndentWidth); 12282 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12283 } 12284 12285 TEST_F(FormatTest, ConfigurationRoundTripTest) { 12286 FormatStyle Style = getLLVMStyle(); 12287 std::string YAML = configurationAsText(Style); 12288 FormatStyle ParsedStyle = {}; 12289 ParsedStyle.Language = FormatStyle::LK_Cpp; 12290 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 12291 EXPECT_EQ(Style, ParsedStyle); 12292 } 12293 12294 TEST_F(FormatTest, WorksFor8bitEncodings) { 12295 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 12296 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 12297 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 12298 "\"\xef\xee\xf0\xf3...\"", 12299 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 12300 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 12301 "\xef\xee\xf0\xf3...\"", 12302 getLLVMStyleWithColumns(12))); 12303 } 12304 12305 TEST_F(FormatTest, HandlesUTF8BOM) { 12306 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 12307 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 12308 format("\xef\xbb\xbf#include <iostream>")); 12309 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 12310 format("\xef\xbb\xbf\n#include <iostream>")); 12311 } 12312 12313 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 12314 #if !defined(_MSC_VER) 12315 12316 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 12317 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 12318 getLLVMStyleWithColumns(35)); 12319 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 12320 getLLVMStyleWithColumns(31)); 12321 verifyFormat("// Однажды в студёную зимнюю пору...", 12322 getLLVMStyleWithColumns(36)); 12323 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 12324 verifyFormat("/* Однажды в студёную зимнюю пору... */", 12325 getLLVMStyleWithColumns(39)); 12326 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 12327 getLLVMStyleWithColumns(35)); 12328 } 12329 12330 TEST_F(FormatTest, SplitsUTF8Strings) { 12331 // Non-printable characters' width is currently considered to be the length in 12332 // bytes in UTF8. The characters can be displayed in very different manner 12333 // (zero-width, single width with a substitution glyph, expanded to their code 12334 // (e.g. "<8d>"), so there's no single correct way to handle them. 12335 EXPECT_EQ("\"aaaaÄ\"\n" 12336 "\"\xc2\x8d\";", 12337 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12338 EXPECT_EQ("\"aaaaaaaÄ\"\n" 12339 "\"\xc2\x8d\";", 12340 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12341 EXPECT_EQ("\"Однажды, в \"\n" 12342 "\"студёную \"\n" 12343 "\"зимнюю \"\n" 12344 "\"пору,\"", 12345 format("\"Однажды, в студёную зимнюю пору,\"", 12346 getLLVMStyleWithColumns(13))); 12347 EXPECT_EQ( 12348 "\"一 二 三 \"\n" 12349 "\"四 五六 \"\n" 12350 "\"七 八 九 \"\n" 12351 "\"十\"", 12352 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 12353 EXPECT_EQ("\"一\t\"\n" 12354 "\"二 \t\"\n" 12355 "\"三 四 \"\n" 12356 "\"五\t\"\n" 12357 "\"六 \t\"\n" 12358 "\"七 \"\n" 12359 "\"八九十\tqq\"", 12360 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 12361 getLLVMStyleWithColumns(11))); 12362 12363 // UTF8 character in an escape sequence. 12364 EXPECT_EQ("\"aaaaaa\"\n" 12365 "\"\\\xC2\x8D\"", 12366 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 12367 } 12368 12369 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 12370 EXPECT_EQ("const char *sssss =\n" 12371 " \"一二三四五六七八\\\n" 12372 " 九 十\";", 12373 format("const char *sssss = \"一二三四五六七八\\\n" 12374 " 九 十\";", 12375 getLLVMStyleWithColumns(30))); 12376 } 12377 12378 TEST_F(FormatTest, SplitsUTF8LineComments) { 12379 EXPECT_EQ("// aaaaÄ\xc2\x8d", 12380 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 12381 EXPECT_EQ("// Я из лесу\n" 12382 "// вышел; был\n" 12383 "// сильный\n" 12384 "// мороз.", 12385 format("// Я из лесу вышел; был сильный мороз.", 12386 getLLVMStyleWithColumns(13))); 12387 EXPECT_EQ("// 一二三\n" 12388 "// 四五六七\n" 12389 "// 八 九\n" 12390 "// 十", 12391 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 12392 } 12393 12394 TEST_F(FormatTest, SplitsUTF8BlockComments) { 12395 EXPECT_EQ("/* Гляжу,\n" 12396 " * поднимается\n" 12397 " * медленно в\n" 12398 " * гору\n" 12399 " * Лошадка,\n" 12400 " * везущая\n" 12401 " * хворосту\n" 12402 " * воз. */", 12403 format("/* Гляжу, поднимается медленно в гору\n" 12404 " * Лошадка, везущая хворосту воз. */", 12405 getLLVMStyleWithColumns(13))); 12406 EXPECT_EQ( 12407 "/* 一二三\n" 12408 " * 四五六七\n" 12409 " * 八 九\n" 12410 " * 十 */", 12411 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 12412 EXPECT_EQ("/* \n" 12413 " * \n" 12414 " * - */", 12415 format("/* - */", getLLVMStyleWithColumns(12))); 12416 } 12417 12418 #endif // _MSC_VER 12419 12420 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 12421 FormatStyle Style = getLLVMStyle(); 12422 12423 Style.ConstructorInitializerIndentWidth = 4; 12424 verifyFormat( 12425 "SomeClass::Constructor()\n" 12426 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12427 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12428 Style); 12429 12430 Style.ConstructorInitializerIndentWidth = 2; 12431 verifyFormat( 12432 "SomeClass::Constructor()\n" 12433 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12434 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12435 Style); 12436 12437 Style.ConstructorInitializerIndentWidth = 0; 12438 verifyFormat( 12439 "SomeClass::Constructor()\n" 12440 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12441 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12442 Style); 12443 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12444 verifyFormat( 12445 "SomeLongTemplateVariableName<\n" 12446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 12447 Style); 12448 verifyFormat( 12449 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 12450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 12451 Style); 12452 12453 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 12454 verifyFormat( 12455 "SomeClass::Constructor() :\n" 12456 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 12457 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 12458 Style); 12459 } 12460 12461 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 12462 FormatStyle Style = getLLVMStyle(); 12463 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 12464 Style.ConstructorInitializerIndentWidth = 4; 12465 verifyFormat("SomeClass::Constructor()\n" 12466 " : a(a)\n" 12467 " , b(b)\n" 12468 " , c(c) {}", 12469 Style); 12470 verifyFormat("SomeClass::Constructor()\n" 12471 " : a(a) {}", 12472 Style); 12473 12474 Style.ColumnLimit = 0; 12475 verifyFormat("SomeClass::Constructor()\n" 12476 " : a(a) {}", 12477 Style); 12478 verifyFormat("SomeClass::Constructor() noexcept\n" 12479 " : a(a) {}", 12480 Style); 12481 verifyFormat("SomeClass::Constructor()\n" 12482 " : a(a)\n" 12483 " , b(b)\n" 12484 " , c(c) {}", 12485 Style); 12486 verifyFormat("SomeClass::Constructor()\n" 12487 " : a(a) {\n" 12488 " foo();\n" 12489 " bar();\n" 12490 "}", 12491 Style); 12492 12493 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 12494 verifyFormat("SomeClass::Constructor()\n" 12495 " : a(a)\n" 12496 " , b(b)\n" 12497 " , c(c) {\n}", 12498 Style); 12499 verifyFormat("SomeClass::Constructor()\n" 12500 " : a(a) {\n}", 12501 Style); 12502 12503 Style.ColumnLimit = 80; 12504 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 12505 Style.ConstructorInitializerIndentWidth = 2; 12506 verifyFormat("SomeClass::Constructor()\n" 12507 " : a(a)\n" 12508 " , b(b)\n" 12509 " , c(c) {}", 12510 Style); 12511 12512 Style.ConstructorInitializerIndentWidth = 0; 12513 verifyFormat("SomeClass::Constructor()\n" 12514 ": a(a)\n" 12515 ", b(b)\n" 12516 ", c(c) {}", 12517 Style); 12518 12519 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 12520 Style.ConstructorInitializerIndentWidth = 4; 12521 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 12522 verifyFormat( 12523 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 12524 Style); 12525 verifyFormat( 12526 "SomeClass::Constructor()\n" 12527 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 12528 Style); 12529 Style.ConstructorInitializerIndentWidth = 4; 12530 Style.ColumnLimit = 60; 12531 verifyFormat("SomeClass::Constructor()\n" 12532 " : aaaaaaaa(aaaaaaaa)\n" 12533 " , aaaaaaaa(aaaaaaaa)\n" 12534 " , aaaaaaaa(aaaaaaaa) {}", 12535 Style); 12536 } 12537 12538 TEST_F(FormatTest, Destructors) { 12539 verifyFormat("void F(int &i) { i.~int(); }"); 12540 verifyFormat("void F(int &i) { i->~int(); }"); 12541 } 12542 12543 TEST_F(FormatTest, FormatsWithWebKitStyle) { 12544 FormatStyle Style = getWebKitStyle(); 12545 12546 // Don't indent in outer namespaces. 12547 verifyFormat("namespace outer {\n" 12548 "int i;\n" 12549 "namespace inner {\n" 12550 " int i;\n" 12551 "} // namespace inner\n" 12552 "} // namespace outer\n" 12553 "namespace other_outer {\n" 12554 "int i;\n" 12555 "}", 12556 Style); 12557 12558 // Don't indent case labels. 12559 verifyFormat("switch (variable) {\n" 12560 "case 1:\n" 12561 "case 2:\n" 12562 " doSomething();\n" 12563 " break;\n" 12564 "default:\n" 12565 " ++variable;\n" 12566 "}", 12567 Style); 12568 12569 // Wrap before binary operators. 12570 EXPECT_EQ("void f()\n" 12571 "{\n" 12572 " if (aaaaaaaaaaaaaaaa\n" 12573 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 12574 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 12575 " return;\n" 12576 "}", 12577 format("void f() {\n" 12578 "if (aaaaaaaaaaaaaaaa\n" 12579 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 12580 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 12581 "return;\n" 12582 "}", 12583 Style)); 12584 12585 // Allow functions on a single line. 12586 verifyFormat("void f() { return; }", Style); 12587 12588 // Allow empty blocks on a single line and insert a space in empty blocks. 12589 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 12590 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 12591 // However, don't merge non-empty short loops. 12592 EXPECT_EQ("while (true) {\n" 12593 " continue;\n" 12594 "}", format("while (true) { continue; }", Style)); 12595 12596 // Constructor initializers are formatted one per line with the "," on the 12597 // new line. 12598 verifyFormat("Constructor()\n" 12599 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 12600 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 12601 " aaaaaaaaaaaaaa)\n" 12602 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 12603 "{\n" 12604 "}", 12605 Style); 12606 verifyFormat("SomeClass::Constructor()\n" 12607 " : a(a)\n" 12608 "{\n" 12609 "}", 12610 Style); 12611 EXPECT_EQ("SomeClass::Constructor()\n" 12612 " : a(a)\n" 12613 "{\n" 12614 "}", 12615 format("SomeClass::Constructor():a(a){}", Style)); 12616 verifyFormat("SomeClass::Constructor()\n" 12617 " : a(a)\n" 12618 " , b(b)\n" 12619 " , c(c)\n" 12620 "{\n" 12621 "}", 12622 Style); 12623 verifyFormat("SomeClass::Constructor()\n" 12624 " : a(a)\n" 12625 "{\n" 12626 " foo();\n" 12627 " bar();\n" 12628 "}", 12629 Style); 12630 12631 // Access specifiers should be aligned left. 12632 verifyFormat("class C {\n" 12633 "public:\n" 12634 " int i;\n" 12635 "};", 12636 Style); 12637 12638 // Do not align comments. 12639 verifyFormat("int a; // Do not\n" 12640 "double b; // align comments.", 12641 Style); 12642 12643 // Do not align operands. 12644 EXPECT_EQ("ASSERT(aaaa\n" 12645 " || bbbb);", 12646 format("ASSERT ( aaaa\n||bbbb);", Style)); 12647 12648 // Accept input's line breaks. 12649 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 12650 " || bbbbbbbbbbbbbbb) {\n" 12651 " i++;\n" 12652 "}", 12653 format("if (aaaaaaaaaaaaaaa\n" 12654 "|| bbbbbbbbbbbbbbb) { i++; }", 12655 Style)); 12656 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 12657 " i++;\n" 12658 "}", 12659 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 12660 12661 // Don't automatically break all macro definitions (llvm.org/PR17842). 12662 verifyFormat("#define aNumber 10", Style); 12663 // However, generally keep the line breaks that the user authored. 12664 EXPECT_EQ("#define aNumber \\\n" 12665 " 10", 12666 format("#define aNumber \\\n" 12667 " 10", 12668 Style)); 12669 12670 // Keep empty and one-element array literals on a single line. 12671 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 12672 " copyItems:YES];", 12673 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 12674 "copyItems:YES];", 12675 Style)); 12676 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 12677 " copyItems:YES];", 12678 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 12679 " copyItems:YES];", 12680 Style)); 12681 // FIXME: This does not seem right, there should be more indentation before 12682 // the array literal's entries. Nested blocks have the same problem. 12683 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 12684 " @\"a\",\n" 12685 " @\"a\"\n" 12686 "]\n" 12687 " copyItems:YES];", 12688 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 12689 " @\"a\",\n" 12690 " @\"a\"\n" 12691 " ]\n" 12692 " copyItems:YES];", 12693 Style)); 12694 EXPECT_EQ( 12695 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 12696 " copyItems:YES];", 12697 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 12698 " copyItems:YES];", 12699 Style)); 12700 12701 verifyFormat("[self.a b:c c:d];", Style); 12702 EXPECT_EQ("[self.a b:c\n" 12703 " c:d];", 12704 format("[self.a b:c\n" 12705 "c:d];", 12706 Style)); 12707 } 12708 12709 TEST_F(FormatTest, FormatsLambdas) { 12710 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 12711 verifyFormat( 12712 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 12713 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 12714 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 12715 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 12716 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 12717 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 12718 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 12719 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 12720 verifyFormat("int x = f(*+[] {});"); 12721 verifyFormat("void f() {\n" 12722 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 12723 "}\n"); 12724 verifyFormat("void f() {\n" 12725 " other(x.begin(), //\n" 12726 " x.end(), //\n" 12727 " [&](int, int) { return 1; });\n" 12728 "}\n"); 12729 verifyFormat("void f() {\n" 12730 " other.other.other.other.other(\n" 12731 " x.begin(), x.end(),\n" 12732 " [something, rather](int, int, int, int, int, int, int) { return 1; });\n" 12733 "}\n"); 12734 verifyFormat("void f() {\n" 12735 " other.other.other.other.other(\n" 12736 " x.begin(), x.end(),\n" 12737 " [something, rather](int, int, int, int, int, int, int) {\n" 12738 " //\n" 12739 " });\n" 12740 "}\n"); 12741 verifyFormat("SomeFunction([]() { // A cool function...\n" 12742 " return 43;\n" 12743 "});"); 12744 EXPECT_EQ("SomeFunction([]() {\n" 12745 "#define A a\n" 12746 " return 43;\n" 12747 "});", 12748 format("SomeFunction([](){\n" 12749 "#define A a\n" 12750 "return 43;\n" 12751 "});")); 12752 verifyFormat("void f() {\n" 12753 " SomeFunction([](decltype(x), A *a) {});\n" 12754 "}"); 12755 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 12756 " [](const aaaaaaaaaa &a) { return a; });"); 12757 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 12758 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 12759 "});"); 12760 verifyFormat("Constructor()\n" 12761 " : Field([] { // comment\n" 12762 " int i;\n" 12763 " }) {}"); 12764 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 12765 " return some_parameter.size();\n" 12766 "};"); 12767 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 12768 " [](const string &s) { return s; };"); 12769 verifyFormat("int i = aaaaaa ? 1 //\n" 12770 " : [] {\n" 12771 " return 2; //\n" 12772 " }();"); 12773 verifyFormat("llvm::errs() << \"number of twos is \"\n" 12774 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 12775 " return x == 2; // force break\n" 12776 " });"); 12777 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 12778 " [=](int iiiiiiiiiiii) {\n" 12779 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 12780 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 12781 " });", 12782 getLLVMStyleWithColumns(60)); 12783 verifyFormat("SomeFunction({[&] {\n" 12784 " // comment\n" 12785 " },\n" 12786 " [&] {\n" 12787 " // comment\n" 12788 " }});"); 12789 verifyFormat("SomeFunction({[&] {\n" 12790 " // comment\n" 12791 "}});"); 12792 verifyFormat("virtual aaaaaaaaaaaaaaaa(\n" 12793 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 12794 " aaaaa aaaaaaaaa);"); 12795 12796 // Lambdas with return types. 12797 verifyFormat("int c = []() -> int { return 2; }();\n"); 12798 verifyFormat("int c = []() -> int * { return 2; }();\n"); 12799 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 12800 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 12801 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 12802 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 12803 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 12804 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 12805 verifyFormat("[a, a]() -> a<1> {};"); 12806 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 12807 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 12808 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 12809 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 12810 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 12811 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 12812 verifyFormat("[]() -> foo<!5> { return {}; };"); 12813 verifyFormat("[]() -> foo<~5> { return {}; };"); 12814 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 12815 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 12816 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 12817 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 12818 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 12819 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 12820 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 12821 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 12822 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 12823 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 12824 verifyFormat("namespace bar {\n" 12825 "// broken:\n" 12826 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 12827 "} // namespace bar"); 12828 verifyFormat("namespace bar {\n" 12829 "// broken:\n" 12830 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 12831 "} // namespace bar"); 12832 verifyFormat("namespace bar {\n" 12833 "// broken:\n" 12834 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 12835 "} // namespace bar"); 12836 verifyFormat("namespace bar {\n" 12837 "// broken:\n" 12838 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 12839 "} // namespace bar"); 12840 verifyFormat("namespace bar {\n" 12841 "// broken:\n" 12842 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 12843 "} // namespace bar"); 12844 verifyFormat("namespace bar {\n" 12845 "// broken:\n" 12846 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 12847 "} // namespace bar"); 12848 verifyFormat("namespace bar {\n" 12849 "// broken:\n" 12850 "auto foo{[]() -> foo<!5> { return {}; }};\n" 12851 "} // namespace bar"); 12852 verifyFormat("namespace bar {\n" 12853 "// broken:\n" 12854 "auto foo{[]() -> foo<~5> { return {}; }};\n" 12855 "} // namespace bar"); 12856 verifyFormat("namespace bar {\n" 12857 "// broken:\n" 12858 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 12859 "} // namespace bar"); 12860 verifyFormat("namespace bar {\n" 12861 "// broken:\n" 12862 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 12863 "} // namespace bar"); 12864 verifyFormat("namespace bar {\n" 12865 "// broken:\n" 12866 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 12867 "} // namespace bar"); 12868 verifyFormat("namespace bar {\n" 12869 "// broken:\n" 12870 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 12871 "} // namespace bar"); 12872 verifyFormat("namespace bar {\n" 12873 "// broken:\n" 12874 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 12875 "} // namespace bar"); 12876 verifyFormat("namespace bar {\n" 12877 "// broken:\n" 12878 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 12879 "} // namespace bar"); 12880 verifyFormat("namespace bar {\n" 12881 "// broken:\n" 12882 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 12883 "} // namespace bar"); 12884 verifyFormat("namespace bar {\n" 12885 "// broken:\n" 12886 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 12887 "} // namespace bar"); 12888 verifyFormat("namespace bar {\n" 12889 "// broken:\n" 12890 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 12891 "} // namespace bar"); 12892 verifyFormat("namespace bar {\n" 12893 "// broken:\n" 12894 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 12895 "} // namespace bar"); 12896 verifyFormat("[]() -> a<1> {};"); 12897 verifyFormat("[]() -> a<1> { ; };"); 12898 verifyFormat("[]() -> a<1> { ; }();"); 12899 verifyFormat("[a, a]() -> a<true> {};"); 12900 verifyFormat("[]() -> a<true> {};"); 12901 verifyFormat("[]() -> a<true> { ; };"); 12902 verifyFormat("[]() -> a<true> { ; }();"); 12903 verifyFormat("[a, a]() -> a<false> {};"); 12904 verifyFormat("[]() -> a<false> {};"); 12905 verifyFormat("[]() -> a<false> { ; };"); 12906 verifyFormat("[]() -> a<false> { ; }();"); 12907 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 12908 verifyFormat("namespace bar {\n" 12909 "auto foo{[]() -> foo<false> { ; }};\n" 12910 "} // namespace bar"); 12911 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 12912 " int j) -> int {\n" 12913 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 12914 "};"); 12915 verifyFormat( 12916 "aaaaaaaaaaaaaaaaaaaaaa(\n" 12917 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 12918 " return aaaaaaaaaaaaaaaaa;\n" 12919 " });", 12920 getLLVMStyleWithColumns(70)); 12921 verifyFormat("[]() //\n" 12922 " -> int {\n" 12923 " return 1; //\n" 12924 "};"); 12925 12926 // Lambdas with explicit template argument lists. 12927 verifyFormat( 12928 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 12929 12930 // Multiple lambdas in the same parentheses change indentation rules. These 12931 // lambdas are forced to start on new lines. 12932 verifyFormat("SomeFunction(\n" 12933 " []() {\n" 12934 " //\n" 12935 " },\n" 12936 " []() {\n" 12937 " //\n" 12938 " });"); 12939 12940 // A lambda passed as arg0 is always pushed to the next line. 12941 verifyFormat("SomeFunction(\n" 12942 " [this] {\n" 12943 " //\n" 12944 " },\n" 12945 " 1);\n"); 12946 12947 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 12948 // the arg0 case above. 12949 auto Style = getGoogleStyle(); 12950 Style.BinPackArguments = false; 12951 verifyFormat("SomeFunction(\n" 12952 " a,\n" 12953 " [this] {\n" 12954 " //\n" 12955 " },\n" 12956 " b);\n", 12957 Style); 12958 verifyFormat("SomeFunction(\n" 12959 " a,\n" 12960 " [this] {\n" 12961 " //\n" 12962 " },\n" 12963 " b);\n"); 12964 12965 // A lambda with a very long line forces arg0 to be pushed out irrespective of 12966 // the BinPackArguments value (as long as the code is wide enough). 12967 verifyFormat("something->SomeFunction(\n" 12968 " a,\n" 12969 " [this] {\n" 12970 " D0000000000000000000000000000000000000000000000000000000000001();\n" 12971 " },\n" 12972 " b);\n"); 12973 12974 // A multi-line lambda is pulled up as long as the introducer fits on the previous 12975 // line and there are no further args. 12976 verifyFormat("function(1, [this, that] {\n" 12977 " //\n" 12978 "});\n"); 12979 verifyFormat("function([this, that] {\n" 12980 " //\n" 12981 "});\n"); 12982 // FIXME: this format is not ideal and we should consider forcing the first arg 12983 // onto its own line. 12984 verifyFormat("function(a, b, c, //\n" 12985 " d, [this, that] {\n" 12986 " //\n" 12987 " });\n"); 12988 12989 // Multiple lambdas are treated correctly even when there is a short arg0. 12990 verifyFormat("SomeFunction(\n" 12991 " 1,\n" 12992 " [this] {\n" 12993 " //\n" 12994 " },\n" 12995 " [this] {\n" 12996 " //\n" 12997 " },\n" 12998 " 1);\n"); 12999 13000 // More complex introducers. 13001 verifyFormat("return [i, args...] {};"); 13002 13003 // Not lambdas. 13004 verifyFormat("constexpr char hello[]{\"hello\"};"); 13005 verifyFormat("double &operator[](int i) { return 0; }\n" 13006 "int i;"); 13007 verifyFormat("std::unique_ptr<int[]> foo() {}"); 13008 verifyFormat("int i = a[a][a]->f();"); 13009 verifyFormat("int i = (*b)[a]->f();"); 13010 13011 // Other corner cases. 13012 verifyFormat("void f() {\n" 13013 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 13014 " );\n" 13015 "}"); 13016 13017 // Lambdas created through weird macros. 13018 verifyFormat("void f() {\n" 13019 " MACRO((const AA &a) { return 1; });\n" 13020 " MACRO((AA &a) { return 1; });\n" 13021 "}"); 13022 13023 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 13024 " doo_dah();\n" 13025 " doo_dah();\n" 13026 " })) {\n" 13027 "}"); 13028 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 13029 " doo_dah();\n" 13030 " doo_dah();\n" 13031 " })) {\n" 13032 "}"); 13033 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 13034 " doo_dah();\n" 13035 " doo_dah();\n" 13036 " })) {\n" 13037 "}"); 13038 verifyFormat("auto lambda = []() {\n" 13039 " int a = 2\n" 13040 "#if A\n" 13041 " + 2\n" 13042 "#endif\n" 13043 " ;\n" 13044 "};"); 13045 13046 // Lambdas with complex multiline introducers. 13047 verifyFormat( 13048 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13049 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 13050 " -> ::std::unordered_set<\n" 13051 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 13052 " //\n" 13053 " });"); 13054 13055 FormatStyle DoNotMerge = getLLVMStyle(); 13056 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13057 verifyFormat("auto c = []() {\n" 13058 " return b;\n" 13059 "};", 13060 "auto c = []() { return b; };", DoNotMerge); 13061 verifyFormat("auto c = []() {\n" 13062 "};", 13063 " auto c = []() {};", DoNotMerge); 13064 13065 FormatStyle MergeEmptyOnly = getLLVMStyle(); 13066 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 13067 verifyFormat("auto c = []() {\n" 13068 " return b;\n" 13069 "};", 13070 "auto c = []() {\n" 13071 " return b;\n" 13072 " };", 13073 MergeEmptyOnly); 13074 verifyFormat("auto c = []() {};", 13075 "auto c = []() {\n" 13076 "};", 13077 MergeEmptyOnly); 13078 13079 FormatStyle MergeInline = getLLVMStyle(); 13080 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 13081 verifyFormat("auto c = []() {\n" 13082 " return b;\n" 13083 "};", 13084 "auto c = []() { return b; };", MergeInline); 13085 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 13086 MergeInline); 13087 verifyFormat("function([]() { return b; }, a)", 13088 "function([]() { return b; }, a)", MergeInline); 13089 verifyFormat("function(a, []() { return b; })", 13090 "function(a, []() { return b; })", MergeInline); 13091 } 13092 13093 TEST_F(FormatTest, EmptyLinesInLambdas) { 13094 verifyFormat("auto lambda = []() {\n" 13095 " x(); //\n" 13096 "};", 13097 "auto lambda = []() {\n" 13098 "\n" 13099 " x(); //\n" 13100 "\n" 13101 "};"); 13102 } 13103 13104 TEST_F(FormatTest, FormatsBlocks) { 13105 FormatStyle ShortBlocks = getLLVMStyle(); 13106 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13107 verifyFormat("int (^Block)(int, int);", ShortBlocks); 13108 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 13109 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 13110 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 13111 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 13112 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 13113 13114 verifyFormat("foo(^{ bar(); });", ShortBlocks); 13115 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 13116 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 13117 13118 verifyFormat("[operation setCompletionBlock:^{\n" 13119 " [self onOperationDone];\n" 13120 "}];"); 13121 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 13122 " [self onOperationDone];\n" 13123 "}]};"); 13124 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 13125 " f();\n" 13126 "}];"); 13127 verifyFormat("int a = [operation block:^int(int *i) {\n" 13128 " return 1;\n" 13129 "}];"); 13130 verifyFormat("[myObject doSomethingWith:arg1\n" 13131 " aaa:^int(int *a) {\n" 13132 " return 1;\n" 13133 " }\n" 13134 " bbb:f(a * bbbbbbbb)];"); 13135 13136 verifyFormat("[operation setCompletionBlock:^{\n" 13137 " [self.delegate newDataAvailable];\n" 13138 "}];", 13139 getLLVMStyleWithColumns(60)); 13140 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 13141 " NSString *path = [self sessionFilePath];\n" 13142 " if (path) {\n" 13143 " // ...\n" 13144 " }\n" 13145 "});"); 13146 verifyFormat("[[SessionService sharedService]\n" 13147 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13148 " if (window) {\n" 13149 " [self windowDidLoad:window];\n" 13150 " } else {\n" 13151 " [self errorLoadingWindow];\n" 13152 " }\n" 13153 " }];"); 13154 verifyFormat("void (^largeBlock)(void) = ^{\n" 13155 " // ...\n" 13156 "};\n", 13157 getLLVMStyleWithColumns(40)); 13158 verifyFormat("[[SessionService sharedService]\n" 13159 " loadWindowWithCompletionBlock: //\n" 13160 " ^(SessionWindow *window) {\n" 13161 " if (window) {\n" 13162 " [self windowDidLoad:window];\n" 13163 " } else {\n" 13164 " [self errorLoadingWindow];\n" 13165 " }\n" 13166 " }];", 13167 getLLVMStyleWithColumns(60)); 13168 verifyFormat("[myObject doSomethingWith:arg1\n" 13169 " firstBlock:^(Foo *a) {\n" 13170 " // ...\n" 13171 " int i;\n" 13172 " }\n" 13173 " secondBlock:^(Bar *b) {\n" 13174 " // ...\n" 13175 " int i;\n" 13176 " }\n" 13177 " thirdBlock:^Foo(Bar *b) {\n" 13178 " // ...\n" 13179 " int i;\n" 13180 " }];"); 13181 verifyFormat("[myObject doSomethingWith:arg1\n" 13182 " firstBlock:-1\n" 13183 " secondBlock:^(Bar *b) {\n" 13184 " // ...\n" 13185 " int i;\n" 13186 " }];"); 13187 13188 verifyFormat("f(^{\n" 13189 " @autoreleasepool {\n" 13190 " if (a) {\n" 13191 " g();\n" 13192 " }\n" 13193 " }\n" 13194 "});"); 13195 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 13196 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 13197 "};"); 13198 13199 FormatStyle FourIndent = getLLVMStyle(); 13200 FourIndent.ObjCBlockIndentWidth = 4; 13201 verifyFormat("[operation setCompletionBlock:^{\n" 13202 " [self onOperationDone];\n" 13203 "}];", 13204 FourIndent); 13205 } 13206 13207 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 13208 FormatStyle ZeroColumn = getLLVMStyle(); 13209 ZeroColumn.ColumnLimit = 0; 13210 13211 verifyFormat("[[SessionService sharedService] " 13212 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13213 " if (window) {\n" 13214 " [self windowDidLoad:window];\n" 13215 " } else {\n" 13216 " [self errorLoadingWindow];\n" 13217 " }\n" 13218 "}];", 13219 ZeroColumn); 13220 EXPECT_EQ("[[SessionService sharedService]\n" 13221 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13222 " if (window) {\n" 13223 " [self windowDidLoad:window];\n" 13224 " } else {\n" 13225 " [self errorLoadingWindow];\n" 13226 " }\n" 13227 " }];", 13228 format("[[SessionService sharedService]\n" 13229 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13230 " if (window) {\n" 13231 " [self windowDidLoad:window];\n" 13232 " } else {\n" 13233 " [self errorLoadingWindow];\n" 13234 " }\n" 13235 "}];", 13236 ZeroColumn)); 13237 verifyFormat("[myObject doSomethingWith:arg1\n" 13238 " firstBlock:^(Foo *a) {\n" 13239 " // ...\n" 13240 " int i;\n" 13241 " }\n" 13242 " secondBlock:^(Bar *b) {\n" 13243 " // ...\n" 13244 " int i;\n" 13245 " }\n" 13246 " thirdBlock:^Foo(Bar *b) {\n" 13247 " // ...\n" 13248 " int i;\n" 13249 " }];", 13250 ZeroColumn); 13251 verifyFormat("f(^{\n" 13252 " @autoreleasepool {\n" 13253 " if (a) {\n" 13254 " g();\n" 13255 " }\n" 13256 " }\n" 13257 "});", 13258 ZeroColumn); 13259 verifyFormat("void (^largeBlock)(void) = ^{\n" 13260 " // ...\n" 13261 "};", 13262 ZeroColumn); 13263 13264 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13265 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 13266 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13267 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 13268 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 13269 " int i;\n" 13270 "};", 13271 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13272 } 13273 13274 TEST_F(FormatTest, SupportsCRLF) { 13275 EXPECT_EQ("int a;\r\n" 13276 "int b;\r\n" 13277 "int c;\r\n", 13278 format("int a;\r\n" 13279 " int b;\r\n" 13280 " int c;\r\n", 13281 getLLVMStyle())); 13282 EXPECT_EQ("int a;\r\n" 13283 "int b;\r\n" 13284 "int c;\r\n", 13285 format("int a;\r\n" 13286 " int b;\n" 13287 " int c;\r\n", 13288 getLLVMStyle())); 13289 EXPECT_EQ("int a;\n" 13290 "int b;\n" 13291 "int c;\n", 13292 format("int a;\r\n" 13293 " int b;\n" 13294 " int c;\n", 13295 getLLVMStyle())); 13296 EXPECT_EQ("\"aaaaaaa \"\r\n" 13297 "\"bbbbbbb\";\r\n", 13298 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 13299 EXPECT_EQ("#define A \\\r\n" 13300 " b; \\\r\n" 13301 " c; \\\r\n" 13302 " d;\r\n", 13303 format("#define A \\\r\n" 13304 " b; \\\r\n" 13305 " c; d; \r\n", 13306 getGoogleStyle())); 13307 13308 EXPECT_EQ("/*\r\n" 13309 "multi line block comments\r\n" 13310 "should not introduce\r\n" 13311 "an extra carriage return\r\n" 13312 "*/\r\n", 13313 format("/*\r\n" 13314 "multi line block comments\r\n" 13315 "should not introduce\r\n" 13316 "an extra carriage return\r\n" 13317 "*/\r\n")); 13318 EXPECT_EQ("/*\r\n" 13319 "\r\n" 13320 "*/", 13321 format("/*\r\n" 13322 " \r\r\r\n" 13323 "*/")); 13324 } 13325 13326 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 13327 verifyFormat("MY_CLASS(C) {\n" 13328 " int i;\n" 13329 " int j;\n" 13330 "};"); 13331 } 13332 13333 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 13334 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 13335 TwoIndent.ContinuationIndentWidth = 2; 13336 13337 EXPECT_EQ("int i =\n" 13338 " longFunction(\n" 13339 " arg);", 13340 format("int i = longFunction(arg);", TwoIndent)); 13341 13342 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 13343 SixIndent.ContinuationIndentWidth = 6; 13344 13345 EXPECT_EQ("int i =\n" 13346 " longFunction(\n" 13347 " arg);", 13348 format("int i = longFunction(arg);", SixIndent)); 13349 } 13350 13351 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 13352 FormatStyle Style = getLLVMStyle(); 13353 verifyFormat("int Foo::getter(\n" 13354 " //\n" 13355 ") const {\n" 13356 " return foo;\n" 13357 "}", 13358 Style); 13359 verifyFormat("void Foo::setter(\n" 13360 " //\n" 13361 ") {\n" 13362 " foo = 1;\n" 13363 "}", 13364 Style); 13365 } 13366 13367 TEST_F(FormatTest, SpacesInAngles) { 13368 FormatStyle Spaces = getLLVMStyle(); 13369 Spaces.SpacesInAngles = true; 13370 13371 verifyFormat("static_cast< int >(arg);", Spaces); 13372 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 13373 verifyFormat("f< int, float >();", Spaces); 13374 verifyFormat("template <> g() {}", Spaces); 13375 verifyFormat("template < std::vector< int > > f() {}", Spaces); 13376 verifyFormat("std::function< void(int, int) > fct;", Spaces); 13377 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 13378 Spaces); 13379 13380 Spaces.Standard = FormatStyle::LS_Cpp03; 13381 Spaces.SpacesInAngles = true; 13382 verifyFormat("A< A< int > >();", Spaces); 13383 13384 Spaces.SpacesInAngles = false; 13385 verifyFormat("A<A<int> >();", Spaces); 13386 13387 Spaces.Standard = FormatStyle::LS_Cpp11; 13388 Spaces.SpacesInAngles = true; 13389 verifyFormat("A< A< int > >();", Spaces); 13390 13391 Spaces.SpacesInAngles = false; 13392 verifyFormat("A<A<int>>();", Spaces); 13393 } 13394 13395 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 13396 FormatStyle Style = getLLVMStyle(); 13397 Style.SpaceAfterTemplateKeyword = false; 13398 verifyFormat("template<int> void foo();", Style); 13399 } 13400 13401 TEST_F(FormatTest, TripleAngleBrackets) { 13402 verifyFormat("f<<<1, 1>>>();"); 13403 verifyFormat("f<<<1, 1, 1, s>>>();"); 13404 verifyFormat("f<<<a, b, c, d>>>();"); 13405 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 13406 verifyFormat("f<param><<<1, 1>>>();"); 13407 verifyFormat("f<1><<<1, 1>>>();"); 13408 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 13409 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13410 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 13411 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 13412 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 13413 } 13414 13415 TEST_F(FormatTest, MergeLessLessAtEnd) { 13416 verifyFormat("<<"); 13417 EXPECT_EQ("< < <", format("\\\n<<<")); 13418 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13419 "aaallvm::outs() <<"); 13420 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13421 "aaaallvm::outs()\n <<"); 13422 } 13423 13424 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 13425 std::string code = "#if A\n" 13426 "#if B\n" 13427 "a.\n" 13428 "#endif\n" 13429 " a = 1;\n" 13430 "#else\n" 13431 "#endif\n" 13432 "#if C\n" 13433 "#else\n" 13434 "#endif\n"; 13435 EXPECT_EQ(code, format(code)); 13436 } 13437 13438 TEST_F(FormatTest, HandleConflictMarkers) { 13439 // Git/SVN conflict markers. 13440 EXPECT_EQ("int a;\n" 13441 "void f() {\n" 13442 " callme(some(parameter1,\n" 13443 "<<<<<<< text by the vcs\n" 13444 " parameter2),\n" 13445 "||||||| text by the vcs\n" 13446 " parameter2),\n" 13447 " parameter3,\n" 13448 "======= text by the vcs\n" 13449 " parameter2, parameter3),\n" 13450 ">>>>>>> text by the vcs\n" 13451 " otherparameter);\n", 13452 format("int a;\n" 13453 "void f() {\n" 13454 " callme(some(parameter1,\n" 13455 "<<<<<<< text by the vcs\n" 13456 " parameter2),\n" 13457 "||||||| text by the vcs\n" 13458 " parameter2),\n" 13459 " parameter3,\n" 13460 "======= text by the vcs\n" 13461 " parameter2,\n" 13462 " parameter3),\n" 13463 ">>>>>>> text by the vcs\n" 13464 " otherparameter);\n")); 13465 13466 // Perforce markers. 13467 EXPECT_EQ("void f() {\n" 13468 " function(\n" 13469 ">>>> text by the vcs\n" 13470 " parameter,\n" 13471 "==== text by the vcs\n" 13472 " parameter,\n" 13473 "==== text by the vcs\n" 13474 " parameter,\n" 13475 "<<<< text by the vcs\n" 13476 " parameter);\n", 13477 format("void f() {\n" 13478 " function(\n" 13479 ">>>> text by the vcs\n" 13480 " parameter,\n" 13481 "==== text by the vcs\n" 13482 " parameter,\n" 13483 "==== text by the vcs\n" 13484 " parameter,\n" 13485 "<<<< text by the vcs\n" 13486 " parameter);\n")); 13487 13488 EXPECT_EQ("<<<<<<<\n" 13489 "|||||||\n" 13490 "=======\n" 13491 ">>>>>>>", 13492 format("<<<<<<<\n" 13493 "|||||||\n" 13494 "=======\n" 13495 ">>>>>>>")); 13496 13497 EXPECT_EQ("<<<<<<<\n" 13498 "|||||||\n" 13499 "int i;\n" 13500 "=======\n" 13501 ">>>>>>>", 13502 format("<<<<<<<\n" 13503 "|||||||\n" 13504 "int i;\n" 13505 "=======\n" 13506 ">>>>>>>")); 13507 13508 // FIXME: Handle parsing of macros around conflict markers correctly: 13509 EXPECT_EQ("#define Macro \\\n" 13510 "<<<<<<<\n" 13511 "Something \\\n" 13512 "|||||||\n" 13513 "Else \\\n" 13514 "=======\n" 13515 "Other \\\n" 13516 ">>>>>>>\n" 13517 " End int i;\n", 13518 format("#define Macro \\\n" 13519 "<<<<<<<\n" 13520 " Something \\\n" 13521 "|||||||\n" 13522 " Else \\\n" 13523 "=======\n" 13524 " Other \\\n" 13525 ">>>>>>>\n" 13526 " End\n" 13527 "int i;\n")); 13528 } 13529 13530 TEST_F(FormatTest, DisableRegions) { 13531 EXPECT_EQ("int i;\n" 13532 "// clang-format off\n" 13533 " int j;\n" 13534 "// clang-format on\n" 13535 "int k;", 13536 format(" int i;\n" 13537 " // clang-format off\n" 13538 " int j;\n" 13539 " // clang-format on\n" 13540 " int k;")); 13541 EXPECT_EQ("int i;\n" 13542 "/* clang-format off */\n" 13543 " int j;\n" 13544 "/* clang-format on */\n" 13545 "int k;", 13546 format(" int i;\n" 13547 " /* clang-format off */\n" 13548 " int j;\n" 13549 " /* clang-format on */\n" 13550 " int k;")); 13551 13552 // Don't reflow comments within disabled regions. 13553 EXPECT_EQ( 13554 "// clang-format off\n" 13555 "// long long long long long long line\n" 13556 "/* clang-format on */\n" 13557 "/* long long long\n" 13558 " * long long long\n" 13559 " * line */\n" 13560 "int i;\n" 13561 "/* clang-format off */\n" 13562 "/* long long long long long long line */\n", 13563 format("// clang-format off\n" 13564 "// long long long long long long line\n" 13565 "/* clang-format on */\n" 13566 "/* long long long long long long line */\n" 13567 "int i;\n" 13568 "/* clang-format off */\n" 13569 "/* long long long long long long line */\n", 13570 getLLVMStyleWithColumns(20))); 13571 } 13572 13573 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 13574 format("? ) ="); 13575 verifyNoCrash("#define a\\\n /**/}"); 13576 } 13577 13578 TEST_F(FormatTest, FormatsTableGenCode) { 13579 FormatStyle Style = getLLVMStyle(); 13580 Style.Language = FormatStyle::LK_TableGen; 13581 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 13582 } 13583 13584 TEST_F(FormatTest, ArrayOfTemplates) { 13585 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 13586 format("auto a = new unique_ptr<int > [ 10];")); 13587 13588 FormatStyle Spaces = getLLVMStyle(); 13589 Spaces.SpacesInSquareBrackets = true; 13590 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 13591 format("auto a = new unique_ptr<int > [10];", Spaces)); 13592 } 13593 13594 TEST_F(FormatTest, ArrayAsTemplateType) { 13595 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 13596 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 13597 13598 FormatStyle Spaces = getLLVMStyle(); 13599 Spaces.SpacesInSquareBrackets = true; 13600 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 13601 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 13602 } 13603 13604 TEST_F(FormatTest, NoSpaceAfterSuper) { 13605 verifyFormat("__super::FooBar();"); 13606 } 13607 13608 TEST(FormatStyle, GetStyleWithEmptyFileName) { 13609 llvm::vfs::InMemoryFileSystem FS; 13610 auto Style1 = getStyle("file", "", "Google", "", &FS); 13611 ASSERT_TRUE((bool)Style1); 13612 ASSERT_EQ(*Style1, getGoogleStyle()); 13613 } 13614 13615 TEST(FormatStyle, GetStyleOfFile) { 13616 llvm::vfs::InMemoryFileSystem FS; 13617 // Test 1: format file in the same directory. 13618 ASSERT_TRUE( 13619 FS.addFile("/a/.clang-format", 0, 13620 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 13621 ASSERT_TRUE( 13622 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13623 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 13624 ASSERT_TRUE((bool)Style1); 13625 ASSERT_EQ(*Style1, getLLVMStyle()); 13626 13627 // Test 2.1: fallback to default. 13628 ASSERT_TRUE( 13629 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13630 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 13631 ASSERT_TRUE((bool)Style2); 13632 ASSERT_EQ(*Style2, getMozillaStyle()); 13633 13634 // Test 2.2: no format on 'none' fallback style. 13635 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 13636 ASSERT_TRUE((bool)Style2); 13637 ASSERT_EQ(*Style2, getNoStyle()); 13638 13639 // Test 2.3: format if config is found with no based style while fallback is 13640 // 'none'. 13641 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 13642 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 13643 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 13644 ASSERT_TRUE((bool)Style2); 13645 ASSERT_EQ(*Style2, getLLVMStyle()); 13646 13647 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 13648 Style2 = getStyle("{}", "a.h", "none", "", &FS); 13649 ASSERT_TRUE((bool)Style2); 13650 ASSERT_EQ(*Style2, getLLVMStyle()); 13651 13652 // Test 3: format file in parent directory. 13653 ASSERT_TRUE( 13654 FS.addFile("/c/.clang-format", 0, 13655 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 13656 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 13657 llvm::MemoryBuffer::getMemBuffer("int i;"))); 13658 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 13659 ASSERT_TRUE((bool)Style3); 13660 ASSERT_EQ(*Style3, getGoogleStyle()); 13661 13662 // Test 4: error on invalid fallback style 13663 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 13664 ASSERT_FALSE((bool)Style4); 13665 llvm::consumeError(Style4.takeError()); 13666 13667 // Test 5: error on invalid yaml on command line 13668 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 13669 ASSERT_FALSE((bool)Style5); 13670 llvm::consumeError(Style5.takeError()); 13671 13672 // Test 6: error on invalid style 13673 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 13674 ASSERT_FALSE((bool)Style6); 13675 llvm::consumeError(Style6.takeError()); 13676 13677 // Test 7: found config file, error on parsing it 13678 ASSERT_TRUE( 13679 FS.addFile("/d/.clang-format", 0, 13680 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 13681 "InvalidKey: InvalidValue"))); 13682 ASSERT_TRUE( 13683 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13684 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 13685 ASSERT_FALSE((bool)Style7); 13686 llvm::consumeError(Style7.takeError()); 13687 13688 // Test 8: inferred per-language defaults apply. 13689 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 13690 ASSERT_TRUE((bool)StyleTd); 13691 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 13692 } 13693 13694 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 13695 // Column limit is 20. 13696 std::string Code = "Type *a =\n" 13697 " new Type();\n" 13698 "g(iiiii, 0, jjjjj,\n" 13699 " 0, kkkkk, 0, mm);\n" 13700 "int bad = format ;"; 13701 std::string Expected = "auto a = new Type();\n" 13702 "g(iiiii, nullptr,\n" 13703 " jjjjj, nullptr,\n" 13704 " kkkkk, nullptr,\n" 13705 " mm);\n" 13706 "int bad = format ;"; 13707 FileID ID = Context.createInMemoryFile("format.cpp", Code); 13708 tooling::Replacements Replaces = toReplacements( 13709 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 13710 "auto "), 13711 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 13712 "nullptr"), 13713 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 13714 "nullptr"), 13715 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 13716 "nullptr")}); 13717 13718 format::FormatStyle Style = format::getLLVMStyle(); 13719 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 13720 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 13721 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 13722 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 13723 auto Result = applyAllReplacements(Code, *FormattedReplaces); 13724 EXPECT_TRUE(static_cast<bool>(Result)); 13725 EXPECT_EQ(Expected, *Result); 13726 } 13727 13728 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 13729 std::string Code = "#include \"a.h\"\n" 13730 "#include \"c.h\"\n" 13731 "\n" 13732 "int main() {\n" 13733 " return 0;\n" 13734 "}"; 13735 std::string Expected = "#include \"a.h\"\n" 13736 "#include \"b.h\"\n" 13737 "#include \"c.h\"\n" 13738 "\n" 13739 "int main() {\n" 13740 " return 0;\n" 13741 "}"; 13742 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 13743 tooling::Replacements Replaces = toReplacements( 13744 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 13745 "#include \"b.h\"\n")}); 13746 13747 format::FormatStyle Style = format::getLLVMStyle(); 13748 Style.SortIncludes = true; 13749 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 13750 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 13751 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 13752 auto Result = applyAllReplacements(Code, *FormattedReplaces); 13753 EXPECT_TRUE(static_cast<bool>(Result)); 13754 EXPECT_EQ(Expected, *Result); 13755 } 13756 13757 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 13758 EXPECT_EQ("using std::cin;\n" 13759 "using std::cout;", 13760 format("using std::cout;\n" 13761 "using std::cin;", getGoogleStyle())); 13762 } 13763 13764 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 13765 format::FormatStyle Style = format::getLLVMStyle(); 13766 Style.Standard = FormatStyle::LS_Cpp03; 13767 // cpp03 recognize this string as identifier u8 and literal character 'a' 13768 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 13769 } 13770 13771 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 13772 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 13773 // all modes, including C++11, C++14 and C++17 13774 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 13775 } 13776 13777 TEST_F(FormatTest, DoNotFormatLikelyXml) { 13778 EXPECT_EQ("<!-- ;> -->", 13779 format("<!-- ;> -->", getGoogleStyle())); 13780 EXPECT_EQ(" <!-- >; -->", 13781 format(" <!-- >; -->", getGoogleStyle())); 13782 } 13783 13784 TEST_F(FormatTest, StructuredBindings) { 13785 // Structured bindings is a C++17 feature. 13786 // all modes, including C++11, C++14 and C++17 13787 verifyFormat("auto [a, b] = f();"); 13788 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 13789 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 13790 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 13791 EXPECT_EQ("auto const volatile [a, b] = f();", 13792 format("auto const volatile[a, b] = f();")); 13793 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 13794 EXPECT_EQ("auto &[a, b, c] = f();", 13795 format("auto &[ a , b,c ] = f();")); 13796 EXPECT_EQ("auto &&[a, b, c] = f();", 13797 format("auto &&[ a , b,c ] = f();")); 13798 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 13799 EXPECT_EQ("auto const volatile &&[a, b] = f();", 13800 format("auto const volatile &&[a, b] = f();")); 13801 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();")); 13802 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();")); 13803 EXPECT_EQ("const auto volatile &&[a, b] = f();", 13804 format("const auto volatile &&[a, b] = f();")); 13805 EXPECT_EQ("volatile const auto &&[a, b] = f();", 13806 format("volatile const auto &&[a, b] = f();")); 13807 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();")); 13808 13809 // Make sure we don't mistake structured bindings for lambdas. 13810 FormatStyle PointerMiddle = getLLVMStyle(); 13811 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 13812 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 13813 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 13814 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 13815 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 13816 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 13817 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 13818 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 13819 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 13820 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 13821 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 13822 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 13823 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 13824 13825 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 13826 format("for (const auto && [a, b] : some_range) {\n}")); 13827 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 13828 format("for (const auto & [a, b] : some_range) {\n}")); 13829 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 13830 format("for (const auto[a, b] : some_range) {\n}")); 13831 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 13832 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 13833 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 13834 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);")); 13835 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);")); 13836 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 13837 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};")); 13838 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};")); 13839 13840 format::FormatStyle Spaces = format::getLLVMStyle(); 13841 Spaces.SpacesInSquareBrackets = true; 13842 verifyFormat("auto [ a, b ] = f();", Spaces); 13843 verifyFormat("auto &&[ a, b ] = f();", Spaces); 13844 verifyFormat("auto &[ a, b ] = f();", Spaces); 13845 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 13846 verifyFormat("auto const &[ a, b ] = f();", Spaces); 13847 } 13848 13849 TEST_F(FormatTest, FileAndCode) { 13850 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 13851 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 13852 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 13853 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 13854 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n")); 13855 EXPECT_EQ( 13856 FormatStyle::LK_ObjC, 13857 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 13858 EXPECT_EQ(FormatStyle::LK_ObjC, 13859 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 13860 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 13861 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 13862 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n")); 13863 EXPECT_EQ(FormatStyle::LK_ObjC, 13864 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 13865 EXPECT_EQ( 13866 FormatStyle::LK_ObjC, 13867 guessLanguage("foo.h", 13868 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 13869 EXPECT_EQ( 13870 FormatStyle::LK_Cpp, 13871 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 13872 } 13873 13874 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 13875 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 13876 EXPECT_EQ(FormatStyle::LK_ObjC, 13877 guessLanguage("foo.h", "array[[calculator getIndex]];")); 13878 EXPECT_EQ(FormatStyle::LK_Cpp, 13879 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 13880 EXPECT_EQ( 13881 FormatStyle::LK_Cpp, 13882 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 13883 EXPECT_EQ(FormatStyle::LK_ObjC, 13884 guessLanguage("foo.h", "[[noreturn foo] bar];")); 13885 EXPECT_EQ(FormatStyle::LK_Cpp, 13886 guessLanguage("foo.h", "[[clang::fallthrough]];")); 13887 EXPECT_EQ(FormatStyle::LK_ObjC, 13888 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 13889 EXPECT_EQ(FormatStyle::LK_Cpp, 13890 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 13891 EXPECT_EQ(FormatStyle::LK_Cpp, 13892 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 13893 EXPECT_EQ(FormatStyle::LK_ObjC, 13894 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 13895 EXPECT_EQ(FormatStyle::LK_Cpp, 13896 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 13897 EXPECT_EQ( 13898 FormatStyle::LK_Cpp, 13899 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 13900 EXPECT_EQ( 13901 FormatStyle::LK_Cpp, 13902 guessLanguage("foo.h", 13903 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 13904 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 13905 } 13906 13907 TEST_F(FormatTest, GuessLanguageWithCaret) { 13908 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 13909 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 13910 EXPECT_EQ(FormatStyle::LK_ObjC, 13911 guessLanguage("foo.h", "int(^)(char, float);")); 13912 EXPECT_EQ(FormatStyle::LK_ObjC, 13913 guessLanguage("foo.h", "int(^foo)(char, float);")); 13914 EXPECT_EQ(FormatStyle::LK_ObjC, 13915 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 13916 EXPECT_EQ(FormatStyle::LK_ObjC, 13917 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 13918 EXPECT_EQ( 13919 FormatStyle::LK_ObjC, 13920 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 13921 } 13922 13923 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 13924 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13925 "void f() {\n" 13926 " asm (\"mov %[e], %[d]\"\n" 13927 " : [d] \"=rm\" (d)\n" 13928 " [e] \"rm\" (*e));\n" 13929 "}")); 13930 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13931 "void f() {\n" 13932 " _asm (\"mov %[e], %[d]\"\n" 13933 " : [d] \"=rm\" (d)\n" 13934 " [e] \"rm\" (*e));\n" 13935 "}")); 13936 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13937 "void f() {\n" 13938 " __asm (\"mov %[e], %[d]\"\n" 13939 " : [d] \"=rm\" (d)\n" 13940 " [e] \"rm\" (*e));\n" 13941 "}")); 13942 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13943 "void f() {\n" 13944 " __asm__ (\"mov %[e], %[d]\"\n" 13945 " : [d] \"=rm\" (d)\n" 13946 " [e] \"rm\" (*e));\n" 13947 "}")); 13948 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13949 "void f() {\n" 13950 " asm (\"mov %[e], %[d]\"\n" 13951 " : [d] \"=rm\" (d),\n" 13952 " [e] \"rm\" (*e));\n" 13953 "}")); 13954 EXPECT_EQ(FormatStyle::LK_Cpp, 13955 guessLanguage("foo.h", "void f() {\n" 13956 " asm volatile (\"mov %[e], %[d]\"\n" 13957 " : [d] \"=rm\" (d)\n" 13958 " [e] \"rm\" (*e));\n" 13959 "}")); 13960 } 13961 13962 TEST_F(FormatTest, GuessLanguageWithChildLines) { 13963 EXPECT_EQ(FormatStyle::LK_Cpp, 13964 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 13965 EXPECT_EQ(FormatStyle::LK_ObjC, 13966 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 13967 EXPECT_EQ( 13968 FormatStyle::LK_Cpp, 13969 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 13970 EXPECT_EQ( 13971 FormatStyle::LK_ObjC, 13972 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 13973 } 13974 13975 TEST_F(FormatTest, TypenameMacros) { 13976 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 13977 13978 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 13979 FormatStyle Google = getGoogleStyleWithColumns(0); 13980 Google.TypenameMacros = TypenameMacros; 13981 verifyFormat("struct foo {\n" 13982 " int bar;\n" 13983 " TAILQ_ENTRY(a) bleh;\n" 13984 "};", Google); 13985 13986 FormatStyle Macros = getLLVMStyle(); 13987 Macros.TypenameMacros = TypenameMacros; 13988 13989 verifyFormat("STACK_OF(int) a;", Macros); 13990 verifyFormat("STACK_OF(int) *a;", Macros); 13991 verifyFormat("STACK_OF(int const *) *a;", Macros); 13992 verifyFormat("STACK_OF(int *const) *a;", Macros); 13993 verifyFormat("STACK_OF(int, string) a;", Macros); 13994 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 13995 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 13996 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 13997 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 13998 13999 Macros.PointerAlignment = FormatStyle::PAS_Left; 14000 verifyFormat("STACK_OF(int)* a;", Macros); 14001 verifyFormat("STACK_OF(int*)* a;", Macros); 14002 } 14003 14004 } // end namespace 14005 } // end namespace format 14006 } // end namespace clang 14007