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 { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck }; 33 34 std::string format(llvm::StringRef Code, 35 const FormatStyle &Style = getLLVMStyle(), 36 StatusCheck CheckComplete = SC_ExpectComplete) { 37 LLVM_DEBUG(llvm::errs() << "---\n"); 38 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 39 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 40 FormattingAttemptStatus Status; 41 tooling::Replacements Replaces = 42 reformat(Style, Code, Ranges, "<stdin>", &Status); 43 if (CheckComplete != SC_DoNotCheck) { 44 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete; 45 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete) 46 << Code << "\n\n"; 47 } 48 ReplacementCount = Replaces.size(); 49 auto Result = applyAllReplacements(Code, Replaces); 50 EXPECT_TRUE(static_cast<bool>(Result)); 51 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 52 return *Result; 53 } 54 55 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) { 56 Style.ColumnLimit = ColumnLimit; 57 return Style; 58 } 59 60 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) { 61 return getStyleWithColumns(getLLVMStyle(), ColumnLimit); 62 } 63 64 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) { 65 return getStyleWithColumns(getGoogleStyle(), ColumnLimit); 66 } 67 68 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code, 69 const FormatStyle &Style = getLLVMStyle()) { 70 EXPECT_EQ(Expected.str(), format(Expected, Style)) 71 << "Expected code is not stable"; 72 EXPECT_EQ(Expected.str(), format(Code, Style)); 73 if (Style.Language == FormatStyle::LK_Cpp) { 74 // Objective-C++ is a superset of C++, so everything checked for C++ 75 // needs to be checked for Objective-C++ as well. 76 FormatStyle ObjCStyle = Style; 77 ObjCStyle.Language = FormatStyle::LK_ObjC; 78 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle)); 79 } 80 } 81 82 void verifyFormat(llvm::StringRef Code, 83 const FormatStyle &Style = getLLVMStyle()) { 84 verifyFormat(Code, test::messUp(Code), Style); 85 } 86 87 void verifyIncompleteFormat(llvm::StringRef Code, 88 const FormatStyle &Style = getLLVMStyle()) { 89 EXPECT_EQ(Code.str(), 90 format(test::messUp(Code), Style, SC_ExpectIncomplete)); 91 } 92 93 void verifyGoogleFormat(llvm::StringRef Code) { 94 verifyFormat(Code, getGoogleStyle()); 95 } 96 97 void verifyIndependentOfContext(llvm::StringRef text) { 98 verifyFormat(text); 99 verifyFormat(llvm::Twine("void f() { " + text + " }").str()); 100 } 101 102 /// \brief Verify that clang-format does not crash on the given input. 103 void verifyNoCrash(llvm::StringRef Code, 104 const FormatStyle &Style = getLLVMStyle()) { 105 format(Code, Style, SC_DoNotCheck); 106 } 107 108 int ReplacementCount; 109 }; 110 111 TEST_F(FormatTest, MessUp) { 112 EXPECT_EQ("1 2 3", test::messUp("1 2 3")); 113 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n")); 114 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc")); 115 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc")); 116 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne")); 117 } 118 119 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) { 120 EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language); 121 } 122 123 TEST_F(FormatTest, LLVMStyleOverride) { 124 EXPECT_EQ(FormatStyle::LK_Proto, 125 getLLVMStyle(FormatStyle::LK_Proto).Language); 126 } 127 128 //===----------------------------------------------------------------------===// 129 // Basic function tests. 130 //===----------------------------------------------------------------------===// 131 132 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) { 133 EXPECT_EQ(";", format(";")); 134 } 135 136 TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 137 EXPECT_EQ("int i;", format(" int i;")); 138 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;")); 139 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 140 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 141 } 142 143 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 144 EXPECT_EQ("int i;", format("int\ni;")); 145 } 146 147 TEST_F(FormatTest, FormatsNestedBlockStatements) { 148 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}")); 149 } 150 151 TEST_F(FormatTest, FormatsNestedCall) { 152 verifyFormat("Method(f1, f2(f3));"); 153 verifyFormat("Method(f1(f2, f3()));"); 154 verifyFormat("Method(f1(f2, (f3())));"); 155 } 156 157 TEST_F(FormatTest, NestedNameSpecifiers) { 158 verifyFormat("vector<::Type> v;"); 159 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); 160 verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); 161 verifyFormat("bool a = 2 < ::SomeFunction();"); 162 verifyFormat("ALWAYS_INLINE ::std::string getName();"); 163 verifyFormat("some::string getName();"); 164 } 165 166 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { 167 EXPECT_EQ("if (a) {\n" 168 " f();\n" 169 "}", 170 format("if(a){f();}")); 171 EXPECT_EQ(4, ReplacementCount); 172 EXPECT_EQ("if (a) {\n" 173 " f();\n" 174 "}", 175 format("if (a) {\n" 176 " f();\n" 177 "}")); 178 EXPECT_EQ(0, ReplacementCount); 179 EXPECT_EQ("/*\r\n" 180 "\r\n" 181 "*/\r\n", 182 format("/*\r\n" 183 "\r\n" 184 "*/\r\n")); 185 EXPECT_EQ(0, ReplacementCount); 186 } 187 188 TEST_F(FormatTest, RemovesEmptyLines) { 189 EXPECT_EQ("class C {\n" 190 " int i;\n" 191 "};", 192 format("class C {\n" 193 " int i;\n" 194 "\n" 195 "};")); 196 197 // Don't remove empty lines at the start of namespaces or extern "C" blocks. 198 EXPECT_EQ("namespace N {\n" 199 "\n" 200 "int i;\n" 201 "}", 202 format("namespace N {\n" 203 "\n" 204 "int i;\n" 205 "}", 206 getGoogleStyle())); 207 EXPECT_EQ("/* something */ namespace N {\n" 208 "\n" 209 "int i;\n" 210 "}", 211 format("/* something */ namespace N {\n" 212 "\n" 213 "int i;\n" 214 "}", 215 getGoogleStyle())); 216 EXPECT_EQ("inline namespace N {\n" 217 "\n" 218 "int i;\n" 219 "}", 220 format("inline namespace N {\n" 221 "\n" 222 "int i;\n" 223 "}", 224 getGoogleStyle())); 225 EXPECT_EQ("/* something */ inline namespace N {\n" 226 "\n" 227 "int i;\n" 228 "}", 229 format("/* something */ inline namespace N {\n" 230 "\n" 231 "int i;\n" 232 "}", 233 getGoogleStyle())); 234 EXPECT_EQ("export namespace N {\n" 235 "\n" 236 "int i;\n" 237 "}", 238 format("export namespace N {\n" 239 "\n" 240 "int i;\n" 241 "}", 242 getGoogleStyle())); 243 EXPECT_EQ("extern /**/ \"C\" /**/ {\n" 244 "\n" 245 "int i;\n" 246 "}", 247 format("extern /**/ \"C\" /**/ {\n" 248 "\n" 249 "int i;\n" 250 "}", 251 getGoogleStyle())); 252 253 // ...but do keep inlining and removing empty lines for non-block extern "C" 254 // functions. 255 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); 256 EXPECT_EQ("extern \"C\" int f() {\n" 257 " int i = 42;\n" 258 " return i;\n" 259 "}", 260 format("extern \"C\" int f() {\n" 261 "\n" 262 " int i = 42;\n" 263 " return i;\n" 264 "}", 265 getGoogleStyle())); 266 267 // Remove empty lines at the beginning and end of blocks. 268 EXPECT_EQ("void f() {\n" 269 "\n" 270 " if (a) {\n" 271 "\n" 272 " f();\n" 273 " }\n" 274 "}", 275 format("void f() {\n" 276 "\n" 277 " if (a) {\n" 278 "\n" 279 " f();\n" 280 "\n" 281 " }\n" 282 "\n" 283 "}", 284 getLLVMStyle())); 285 EXPECT_EQ("void f() {\n" 286 " if (a) {\n" 287 " f();\n" 288 " }\n" 289 "}", 290 format("void f() {\n" 291 "\n" 292 " if (a) {\n" 293 "\n" 294 " f();\n" 295 "\n" 296 " }\n" 297 "\n" 298 "}", 299 getGoogleStyle())); 300 301 // Don't remove empty lines in more complex control statements. 302 EXPECT_EQ("void f() {\n" 303 " if (a) {\n" 304 " f();\n" 305 "\n" 306 " } else if (b) {\n" 307 " f();\n" 308 " }\n" 309 "}", 310 format("void f() {\n" 311 " if (a) {\n" 312 " f();\n" 313 "\n" 314 " } else if (b) {\n" 315 " f();\n" 316 "\n" 317 " }\n" 318 "\n" 319 "}")); 320 321 // Don't remove empty lines before namespace endings. 322 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 323 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 324 EXPECT_EQ("namespace {\n" 325 "int i;\n" 326 "\n" 327 "}", 328 format("namespace {\n" 329 "int i;\n" 330 "\n" 331 "}", 332 LLVMWithNoNamespaceFix)); 333 EXPECT_EQ("namespace {\n" 334 "int i;\n" 335 "}", 336 format("namespace {\n" 337 "int i;\n" 338 "}", 339 LLVMWithNoNamespaceFix)); 340 EXPECT_EQ("namespace {\n" 341 "int i;\n" 342 "\n" 343 "};", 344 format("namespace {\n" 345 "int i;\n" 346 "\n" 347 "};", 348 LLVMWithNoNamespaceFix)); 349 EXPECT_EQ("namespace {\n" 350 "int i;\n" 351 "};", 352 format("namespace {\n" 353 "int i;\n" 354 "};", 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 verifyFormat("do a++;\n" 560 "while (true);", 561 AllowsMergedLoops); 562 verifyFormat("do /* Don't merge */\n" 563 " a++;\n" 564 "while (true);", 565 AllowsMergedLoops); 566 verifyFormat("do // Don't merge\n" 567 " a++;\n" 568 "while (true);", 569 AllowsMergedLoops); 570 verifyFormat("do\n" 571 " // Don't merge\n" 572 " a++;\n" 573 "while (true);", 574 AllowsMergedLoops); 575 // Without braces labels are interpreted differently. 576 verifyFormat("{\n" 577 " do\n" 578 " label:\n" 579 " a++;\n" 580 " while (true);\n" 581 "}", 582 AllowsMergedLoops); 583 } 584 585 TEST_F(FormatTest, FormatShortBracedStatements) { 586 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 587 AllowSimpleBracedStatements.ColumnLimit = 40; 588 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = 589 FormatStyle::SBS_Always; 590 591 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 592 FormatStyle::SIS_WithoutElse; 593 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 594 595 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom; 596 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true; 597 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false; 598 599 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 600 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 601 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 602 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 603 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 604 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 605 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 606 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 607 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 608 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 609 verifyFormat("if (true) {\n" 610 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 611 "}", 612 AllowSimpleBracedStatements); 613 verifyFormat("if (true) { //\n" 614 " f();\n" 615 "}", 616 AllowSimpleBracedStatements); 617 verifyFormat("if (true) {\n" 618 " f();\n" 619 " f();\n" 620 "}", 621 AllowSimpleBracedStatements); 622 verifyFormat("if (true) {\n" 623 " f();\n" 624 "} else {\n" 625 " f();\n" 626 "}", 627 AllowSimpleBracedStatements); 628 629 verifyFormat("struct A2 {\n" 630 " int X;\n" 631 "};", 632 AllowSimpleBracedStatements); 633 verifyFormat("typedef struct A2 {\n" 634 " int X;\n" 635 "} A2_t;", 636 AllowSimpleBracedStatements); 637 verifyFormat("template <int> struct A2 {\n" 638 " struct B {};\n" 639 "};", 640 AllowSimpleBracedStatements); 641 642 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 643 FormatStyle::SIS_Never; 644 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 645 verifyFormat("if (true) {\n" 646 " f();\n" 647 "}", 648 AllowSimpleBracedStatements); 649 verifyFormat("if (true) {\n" 650 " f();\n" 651 "} else {\n" 652 " f();\n" 653 "}", 654 AllowSimpleBracedStatements); 655 656 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 657 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 658 verifyFormat("while (true) {\n" 659 " f();\n" 660 "}", 661 AllowSimpleBracedStatements); 662 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 663 verifyFormat("for (;;) {\n" 664 " f();\n" 665 "}", 666 AllowSimpleBracedStatements); 667 668 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 669 FormatStyle::SIS_WithoutElse; 670 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 671 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = 672 FormatStyle::BWACS_Always; 673 674 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 675 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 676 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 677 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 678 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 679 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 680 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 681 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 682 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 683 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 684 verifyFormat("if (true)\n" 685 "{\n" 686 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 687 "}", 688 AllowSimpleBracedStatements); 689 verifyFormat("if (true)\n" 690 "{ //\n" 691 " f();\n" 692 "}", 693 AllowSimpleBracedStatements); 694 verifyFormat("if (true)\n" 695 "{\n" 696 " f();\n" 697 " f();\n" 698 "}", 699 AllowSimpleBracedStatements); 700 verifyFormat("if (true)\n" 701 "{\n" 702 " f();\n" 703 "} else\n" 704 "{\n" 705 " f();\n" 706 "}", 707 AllowSimpleBracedStatements); 708 709 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 710 FormatStyle::SIS_Never; 711 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 712 verifyFormat("if (true)\n" 713 "{\n" 714 " f();\n" 715 "}", 716 AllowSimpleBracedStatements); 717 verifyFormat("if (true)\n" 718 "{\n" 719 " f();\n" 720 "} else\n" 721 "{\n" 722 " f();\n" 723 "}", 724 AllowSimpleBracedStatements); 725 726 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 727 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 728 verifyFormat("while (true)\n" 729 "{\n" 730 " f();\n" 731 "}", 732 AllowSimpleBracedStatements); 733 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 734 verifyFormat("for (;;)\n" 735 "{\n" 736 " f();\n" 737 "}", 738 AllowSimpleBracedStatements); 739 } 740 741 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 742 FormatStyle Style = getLLVMStyleWithColumns(60); 743 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 744 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 745 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 746 EXPECT_EQ("#define A \\\n" 747 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 748 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 749 "X;", 750 format("#define A \\\n" 751 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 752 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 753 " }\n" 754 "X;", 755 Style)); 756 } 757 758 TEST_F(FormatTest, ParseIfElse) { 759 verifyFormat("if (true)\n" 760 " if (true)\n" 761 " if (true)\n" 762 " f();\n" 763 " else\n" 764 " g();\n" 765 " else\n" 766 " h();\n" 767 "else\n" 768 " i();"); 769 verifyFormat("if (true)\n" 770 " if (true)\n" 771 " if (true) {\n" 772 " if (true)\n" 773 " f();\n" 774 " } else {\n" 775 " g();\n" 776 " }\n" 777 " else\n" 778 " h();\n" 779 "else {\n" 780 " i();\n" 781 "}"); 782 verifyFormat("if (true)\n" 783 " if constexpr (true)\n" 784 " if (true) {\n" 785 " if constexpr (true)\n" 786 " f();\n" 787 " } else {\n" 788 " g();\n" 789 " }\n" 790 " else\n" 791 " h();\n" 792 "else {\n" 793 " i();\n" 794 "}"); 795 verifyFormat("if (true)\n" 796 " if CONSTEXPR (true)\n" 797 " if (true) {\n" 798 " if CONSTEXPR (true)\n" 799 " f();\n" 800 " } else {\n" 801 " g();\n" 802 " }\n" 803 " else\n" 804 " h();\n" 805 "else {\n" 806 " i();\n" 807 "}"); 808 verifyFormat("void f() {\n" 809 " if (a) {\n" 810 " } else {\n" 811 " }\n" 812 "}"); 813 } 814 815 TEST_F(FormatTest, ElseIf) { 816 verifyFormat("if (a) {\n} else if (b) {\n}"); 817 verifyFormat("if (a)\n" 818 " f();\n" 819 "else if (b)\n" 820 " g();\n" 821 "else\n" 822 " h();"); 823 verifyFormat("if constexpr (a)\n" 824 " f();\n" 825 "else if constexpr (b)\n" 826 " g();\n" 827 "else\n" 828 " h();"); 829 verifyFormat("if CONSTEXPR (a)\n" 830 " f();\n" 831 "else if CONSTEXPR (b)\n" 832 " g();\n" 833 "else\n" 834 " h();"); 835 verifyFormat("if (a) {\n" 836 " f();\n" 837 "}\n" 838 "// or else ..\n" 839 "else {\n" 840 " g()\n" 841 "}"); 842 843 verifyFormat("if (a) {\n" 844 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 845 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 846 "}"); 847 verifyFormat("if (a) {\n" 848 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 849 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 850 "}"); 851 verifyFormat("if (a) {\n" 852 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 853 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 854 "}"); 855 verifyFormat("if (a) {\n" 856 "} else if (\n" 857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 858 "}", 859 getLLVMStyleWithColumns(62)); 860 verifyFormat("if (a) {\n" 861 "} else if constexpr (\n" 862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 863 "}", 864 getLLVMStyleWithColumns(62)); 865 verifyFormat("if (a) {\n" 866 "} else if CONSTEXPR (\n" 867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 868 "}", 869 getLLVMStyleWithColumns(62)); 870 } 871 872 TEST_F(FormatTest, FormatsForLoop) { 873 verifyFormat( 874 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 875 " ++VeryVeryLongLoopVariable)\n" 876 " ;"); 877 verifyFormat("for (;;)\n" 878 " f();"); 879 verifyFormat("for (;;) {\n}"); 880 verifyFormat("for (;;) {\n" 881 " f();\n" 882 "}"); 883 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 884 885 verifyFormat( 886 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 887 " E = UnwrappedLines.end();\n" 888 " I != E; ++I) {\n}"); 889 890 verifyFormat( 891 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 892 " ++IIIII) {\n}"); 893 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 894 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 895 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 896 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 897 " I = FD->getDeclsInPrototypeScope().begin(),\n" 898 " E = FD->getDeclsInPrototypeScope().end();\n" 899 " I != E; ++I) {\n}"); 900 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 901 " I = Container.begin(),\n" 902 " E = Container.end();\n" 903 " I != E; ++I) {\n}", 904 getLLVMStyleWithColumns(76)); 905 906 verifyFormat( 907 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 908 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 909 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 911 " ++aaaaaaaaaaa) {\n}"); 912 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 913 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 914 " ++i) {\n}"); 915 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 916 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 917 "}"); 918 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 919 " aaaaaaaaaa);\n" 920 " iter; ++iter) {\n" 921 "}"); 922 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 924 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 925 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 926 927 // These should not be formatted as Objective-C for-in loops. 928 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 929 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 930 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 931 verifyFormat( 932 "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 933 934 FormatStyle NoBinPacking = getLLVMStyle(); 935 NoBinPacking.BinPackParameters = false; 936 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 937 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 938 " aaaaaaaaaaaaaaaa,\n" 939 " aaaaaaaaaaaaaaaa,\n" 940 " aaaaaaaaaaaaaaaa);\n" 941 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 942 "}", 943 NoBinPacking); 944 verifyFormat( 945 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 946 " E = UnwrappedLines.end();\n" 947 " I != E;\n" 948 " ++I) {\n}", 949 NoBinPacking); 950 951 FormatStyle AlignLeft = getLLVMStyle(); 952 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 953 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 954 } 955 956 TEST_F(FormatTest, RangeBasedForLoops) { 957 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 958 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 959 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 960 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 961 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 963 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 964 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 965 } 966 967 TEST_F(FormatTest, ForEachLoops) { 968 verifyFormat("void f() {\n" 969 " foreach (Item *item, itemlist) {}\n" 970 " Q_FOREACH (Item *item, itemlist) {}\n" 971 " BOOST_FOREACH (Item *item, itemlist) {}\n" 972 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 973 "}"); 974 975 FormatStyle Style = getLLVMStyle(); 976 Style.SpaceBeforeParens = 977 FormatStyle::SBPO_ControlStatementsExceptForEachMacros; 978 verifyFormat("void f() {\n" 979 " foreach(Item *item, itemlist) {}\n" 980 " Q_FOREACH(Item *item, itemlist) {}\n" 981 " BOOST_FOREACH(Item *item, itemlist) {}\n" 982 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 983 "}", 984 Style); 985 986 // As function-like macros. 987 verifyFormat("#define foreach(x, y)\n" 988 "#define Q_FOREACH(x, y)\n" 989 "#define BOOST_FOREACH(x, y)\n" 990 "#define UNKNOWN_FOREACH(x, y)\n"); 991 992 // Not as function-like macros. 993 verifyFormat("#define foreach (x, y)\n" 994 "#define Q_FOREACH (x, y)\n" 995 "#define BOOST_FOREACH (x, y)\n" 996 "#define UNKNOWN_FOREACH (x, y)\n"); 997 998 // handle microsoft non standard extension 999 verifyFormat("for each (char c in x->MyStringProperty)"); 1000 } 1001 1002 TEST_F(FormatTest, FormatsWhileLoop) { 1003 verifyFormat("while (true) {\n}"); 1004 verifyFormat("while (true)\n" 1005 " f();"); 1006 verifyFormat("while () {\n}"); 1007 verifyFormat("while () {\n" 1008 " f();\n" 1009 "}"); 1010 } 1011 1012 TEST_F(FormatTest, FormatsDoWhile) { 1013 verifyFormat("do {\n" 1014 " do_something();\n" 1015 "} while (something());"); 1016 verifyFormat("do\n" 1017 " do_something();\n" 1018 "while (something());"); 1019 } 1020 1021 TEST_F(FormatTest, FormatsSwitchStatement) { 1022 verifyFormat("switch (x) {\n" 1023 "case 1:\n" 1024 " f();\n" 1025 " break;\n" 1026 "case kFoo:\n" 1027 "case ns::kBar:\n" 1028 "case kBaz:\n" 1029 " break;\n" 1030 "default:\n" 1031 " g();\n" 1032 " break;\n" 1033 "}"); 1034 verifyFormat("switch (x) {\n" 1035 "case 1: {\n" 1036 " f();\n" 1037 " break;\n" 1038 "}\n" 1039 "case 2: {\n" 1040 " break;\n" 1041 "}\n" 1042 "}"); 1043 verifyFormat("switch (x) {\n" 1044 "case 1: {\n" 1045 " f();\n" 1046 " {\n" 1047 " g();\n" 1048 " h();\n" 1049 " }\n" 1050 " break;\n" 1051 "}\n" 1052 "}"); 1053 verifyFormat("switch (x) {\n" 1054 "case 1: {\n" 1055 " f();\n" 1056 " if (foo) {\n" 1057 " g();\n" 1058 " h();\n" 1059 " }\n" 1060 " break;\n" 1061 "}\n" 1062 "}"); 1063 verifyFormat("switch (x) {\n" 1064 "case 1: {\n" 1065 " f();\n" 1066 " g();\n" 1067 "} break;\n" 1068 "}"); 1069 verifyFormat("switch (test)\n" 1070 " ;"); 1071 verifyFormat("switch (x) {\n" 1072 "default: {\n" 1073 " // Do nothing.\n" 1074 "}\n" 1075 "}"); 1076 verifyFormat("switch (x) {\n" 1077 "// comment\n" 1078 "// if 1, do f()\n" 1079 "case 1:\n" 1080 " f();\n" 1081 "}"); 1082 verifyFormat("switch (x) {\n" 1083 "case 1:\n" 1084 " // Do amazing stuff\n" 1085 " {\n" 1086 " f();\n" 1087 " g();\n" 1088 " }\n" 1089 " break;\n" 1090 "}"); 1091 verifyFormat("#define A \\\n" 1092 " switch (x) { \\\n" 1093 " case a: \\\n" 1094 " foo = b; \\\n" 1095 " }", 1096 getLLVMStyleWithColumns(20)); 1097 verifyFormat("#define OPERATION_CASE(name) \\\n" 1098 " case OP_name: \\\n" 1099 " return operations::Operation##name\n", 1100 getLLVMStyleWithColumns(40)); 1101 verifyFormat("switch (x) {\n" 1102 "case 1:;\n" 1103 "default:;\n" 1104 " int i;\n" 1105 "}"); 1106 1107 verifyGoogleFormat("switch (x) {\n" 1108 " case 1:\n" 1109 " f();\n" 1110 " break;\n" 1111 " case kFoo:\n" 1112 " case ns::kBar:\n" 1113 " case kBaz:\n" 1114 " break;\n" 1115 " default:\n" 1116 " g();\n" 1117 " break;\n" 1118 "}"); 1119 verifyGoogleFormat("switch (x) {\n" 1120 " case 1: {\n" 1121 " f();\n" 1122 " break;\n" 1123 " }\n" 1124 "}"); 1125 verifyGoogleFormat("switch (test)\n" 1126 " ;"); 1127 1128 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1129 " case OP_name: \\\n" 1130 " return operations::Operation##name\n"); 1131 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1132 " // Get the correction operation class.\n" 1133 " switch (OpCode) {\n" 1134 " CASE(Add);\n" 1135 " CASE(Subtract);\n" 1136 " default:\n" 1137 " return operations::Unknown;\n" 1138 " }\n" 1139 "#undef OPERATION_CASE\n" 1140 "}"); 1141 verifyFormat("DEBUG({\n" 1142 " switch (x) {\n" 1143 " case A:\n" 1144 " f();\n" 1145 " break;\n" 1146 " // fallthrough\n" 1147 " case B:\n" 1148 " g();\n" 1149 " break;\n" 1150 " }\n" 1151 "});"); 1152 EXPECT_EQ("DEBUG({\n" 1153 " switch (x) {\n" 1154 " case A:\n" 1155 " f();\n" 1156 " break;\n" 1157 " // On B:\n" 1158 " case B:\n" 1159 " g();\n" 1160 " break;\n" 1161 " }\n" 1162 "});", 1163 format("DEBUG({\n" 1164 " switch (x) {\n" 1165 " case A:\n" 1166 " f();\n" 1167 " break;\n" 1168 " // On B:\n" 1169 " case B:\n" 1170 " g();\n" 1171 " break;\n" 1172 " }\n" 1173 "});", 1174 getLLVMStyle())); 1175 EXPECT_EQ("switch (n) {\n" 1176 "case 0: {\n" 1177 " return false;\n" 1178 "}\n" 1179 "default: {\n" 1180 " return true;\n" 1181 "}\n" 1182 "}", 1183 format("switch (n)\n" 1184 "{\n" 1185 "case 0: {\n" 1186 " return false;\n" 1187 "}\n" 1188 "default: {\n" 1189 " return true;\n" 1190 "}\n" 1191 "}", 1192 getLLVMStyle())); 1193 verifyFormat("switch (a) {\n" 1194 "case (b):\n" 1195 " return;\n" 1196 "}"); 1197 1198 verifyFormat("switch (a) {\n" 1199 "case some_namespace::\n" 1200 " some_constant:\n" 1201 " return;\n" 1202 "}", 1203 getLLVMStyleWithColumns(34)); 1204 1205 FormatStyle Style = getLLVMStyle(); 1206 Style.IndentCaseLabels = true; 1207 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1208 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1209 Style.BraceWrapping.AfterCaseLabel = true; 1210 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1211 EXPECT_EQ("switch (n)\n" 1212 "{\n" 1213 " case 0:\n" 1214 " {\n" 1215 " return false;\n" 1216 " }\n" 1217 " default:\n" 1218 " {\n" 1219 " return true;\n" 1220 " }\n" 1221 "}", 1222 format("switch (n) {\n" 1223 " case 0: {\n" 1224 " return false;\n" 1225 " }\n" 1226 " default: {\n" 1227 " return true;\n" 1228 " }\n" 1229 "}", 1230 Style)); 1231 Style.BraceWrapping.AfterCaseLabel = false; 1232 EXPECT_EQ("switch (n)\n" 1233 "{\n" 1234 " case 0: {\n" 1235 " return false;\n" 1236 " }\n" 1237 " default: {\n" 1238 " return true;\n" 1239 " }\n" 1240 "}", 1241 format("switch (n) {\n" 1242 " case 0:\n" 1243 " {\n" 1244 " return false;\n" 1245 " }\n" 1246 " default:\n" 1247 " {\n" 1248 " return true;\n" 1249 " }\n" 1250 "}", 1251 Style)); 1252 Style.IndentCaseLabels = false; 1253 Style.IndentCaseBlocks = true; 1254 EXPECT_EQ("switch (n)\n" 1255 "{\n" 1256 "case 0:\n" 1257 " {\n" 1258 " return false;\n" 1259 " }\n" 1260 "case 1:\n" 1261 " break;\n" 1262 "default:\n" 1263 " {\n" 1264 " return true;\n" 1265 " }\n" 1266 "}", 1267 format("switch (n) {\n" 1268 "case 0: {\n" 1269 " return false;\n" 1270 "}\n" 1271 "case 1:\n" 1272 " break;\n" 1273 "default: {\n" 1274 " return true;\n" 1275 "}\n" 1276 "}", 1277 Style)); 1278 Style.IndentCaseLabels = true; 1279 Style.IndentCaseBlocks = true; 1280 EXPECT_EQ("switch (n)\n" 1281 "{\n" 1282 " case 0:\n" 1283 " {\n" 1284 " return false;\n" 1285 " }\n" 1286 " case 1:\n" 1287 " break;\n" 1288 " default:\n" 1289 " {\n" 1290 " return true;\n" 1291 " }\n" 1292 "}", 1293 format("switch (n) {\n" 1294 "case 0: {\n" 1295 " return false;\n" 1296 "}\n" 1297 "case 1:\n" 1298 " break;\n" 1299 "default: {\n" 1300 " return true;\n" 1301 "}\n" 1302 "}", 1303 Style)); 1304 } 1305 1306 TEST_F(FormatTest, CaseRanges) { 1307 verifyFormat("switch (x) {\n" 1308 "case 'A' ... 'Z':\n" 1309 "case 1 ... 5:\n" 1310 "case a ... b:\n" 1311 " break;\n" 1312 "}"); 1313 } 1314 1315 TEST_F(FormatTest, ShortEnums) { 1316 FormatStyle Style = getLLVMStyle(); 1317 Style.AllowShortEnumsOnASingleLine = true; 1318 verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style); 1319 Style.AllowShortEnumsOnASingleLine = false; 1320 verifyFormat("enum\n" 1321 "{\n" 1322 " A,\n" 1323 " B,\n" 1324 " C\n" 1325 "} ShortEnum1, ShortEnum2;", 1326 Style); 1327 } 1328 1329 TEST_F(FormatTest, ShortCaseLabels) { 1330 FormatStyle Style = getLLVMStyle(); 1331 Style.AllowShortCaseLabelsOnASingleLine = true; 1332 verifyFormat("switch (a) {\n" 1333 "case 1: x = 1; break;\n" 1334 "case 2: return;\n" 1335 "case 3:\n" 1336 "case 4:\n" 1337 "case 5: return;\n" 1338 "case 6: // comment\n" 1339 " return;\n" 1340 "case 7:\n" 1341 " // comment\n" 1342 " return;\n" 1343 "case 8:\n" 1344 " x = 8; // comment\n" 1345 " break;\n" 1346 "default: y = 1; break;\n" 1347 "}", 1348 Style); 1349 verifyFormat("switch (a) {\n" 1350 "case 0: return; // comment\n" 1351 "case 1: break; // comment\n" 1352 "case 2: return;\n" 1353 "// comment\n" 1354 "case 3: return;\n" 1355 "// comment 1\n" 1356 "// comment 2\n" 1357 "// comment 3\n" 1358 "case 4: break; /* comment */\n" 1359 "case 5:\n" 1360 " // comment\n" 1361 " break;\n" 1362 "case 6: /* comment */ x = 1; break;\n" 1363 "case 7: x = /* comment */ 1; break;\n" 1364 "case 8:\n" 1365 " x = 1; /* comment */\n" 1366 " break;\n" 1367 "case 9:\n" 1368 " break; // comment line 1\n" 1369 " // comment line 2\n" 1370 "}", 1371 Style); 1372 EXPECT_EQ("switch (a) {\n" 1373 "case 1:\n" 1374 " x = 8;\n" 1375 " // fall through\n" 1376 "case 2: x = 8;\n" 1377 "// comment\n" 1378 "case 3:\n" 1379 " return; /* comment line 1\n" 1380 " * comment line 2 */\n" 1381 "case 4: i = 8;\n" 1382 "// something else\n" 1383 "#if FOO\n" 1384 "case 5: break;\n" 1385 "#endif\n" 1386 "}", 1387 format("switch (a) {\n" 1388 "case 1: x = 8;\n" 1389 " // fall through\n" 1390 "case 2:\n" 1391 " x = 8;\n" 1392 "// comment\n" 1393 "case 3:\n" 1394 " return; /* comment line 1\n" 1395 " * comment line 2 */\n" 1396 "case 4:\n" 1397 " i = 8;\n" 1398 "// something else\n" 1399 "#if FOO\n" 1400 "case 5: break;\n" 1401 "#endif\n" 1402 "}", 1403 Style)); 1404 EXPECT_EQ("switch (a) {\n" 1405 "case 0:\n" 1406 " return; // long long long long long long long long long long " 1407 "long long comment\n" 1408 " // line\n" 1409 "}", 1410 format("switch (a) {\n" 1411 "case 0: return; // long long long long long long long long " 1412 "long long long long comment line\n" 1413 "}", 1414 Style)); 1415 EXPECT_EQ("switch (a) {\n" 1416 "case 0:\n" 1417 " return; /* long long long long long long long long long long " 1418 "long long comment\n" 1419 " line */\n" 1420 "}", 1421 format("switch (a) {\n" 1422 "case 0: return; /* long long long long long long long long " 1423 "long long long long comment line */\n" 1424 "}", 1425 Style)); 1426 verifyFormat("switch (a) {\n" 1427 "#if FOO\n" 1428 "case 0: return 0;\n" 1429 "#endif\n" 1430 "}", 1431 Style); 1432 verifyFormat("switch (a) {\n" 1433 "case 1: {\n" 1434 "}\n" 1435 "case 2: {\n" 1436 " return;\n" 1437 "}\n" 1438 "case 3: {\n" 1439 " x = 1;\n" 1440 " return;\n" 1441 "}\n" 1442 "case 4:\n" 1443 " if (x)\n" 1444 " return;\n" 1445 "}", 1446 Style); 1447 Style.ColumnLimit = 21; 1448 verifyFormat("switch (a) {\n" 1449 "case 1: x = 1; break;\n" 1450 "case 2: return;\n" 1451 "case 3:\n" 1452 "case 4:\n" 1453 "case 5: return;\n" 1454 "default:\n" 1455 " y = 1;\n" 1456 " break;\n" 1457 "}", 1458 Style); 1459 Style.ColumnLimit = 80; 1460 Style.AllowShortCaseLabelsOnASingleLine = false; 1461 Style.IndentCaseLabels = true; 1462 EXPECT_EQ("switch (n) {\n" 1463 " default /*comments*/:\n" 1464 " return true;\n" 1465 " case 0:\n" 1466 " return false;\n" 1467 "}", 1468 format("switch (n) {\n" 1469 "default/*comments*/:\n" 1470 " return true;\n" 1471 "case 0:\n" 1472 " return false;\n" 1473 "}", 1474 Style)); 1475 Style.AllowShortCaseLabelsOnASingleLine = true; 1476 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1477 Style.BraceWrapping.AfterCaseLabel = true; 1478 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1479 EXPECT_EQ("switch (n)\n" 1480 "{\n" 1481 " case 0:\n" 1482 " {\n" 1483 " return false;\n" 1484 " }\n" 1485 " default:\n" 1486 " {\n" 1487 " return true;\n" 1488 " }\n" 1489 "}", 1490 format("switch (n) {\n" 1491 " case 0: {\n" 1492 " return false;\n" 1493 " }\n" 1494 " default:\n" 1495 " {\n" 1496 " return true;\n" 1497 " }\n" 1498 "}", 1499 Style)); 1500 } 1501 1502 TEST_F(FormatTest, FormatsLabels) { 1503 verifyFormat("void f() {\n" 1504 " some_code();\n" 1505 "test_label:\n" 1506 " some_other_code();\n" 1507 " {\n" 1508 " some_more_code();\n" 1509 " another_label:\n" 1510 " some_more_code();\n" 1511 " }\n" 1512 "}"); 1513 verifyFormat("{\n" 1514 " some_code();\n" 1515 "test_label:\n" 1516 " some_other_code();\n" 1517 "}"); 1518 verifyFormat("{\n" 1519 " some_code();\n" 1520 "test_label:;\n" 1521 " int i = 0;\n" 1522 "}"); 1523 FormatStyle Style = getLLVMStyle(); 1524 Style.IndentGotoLabels = false; 1525 verifyFormat("void f() {\n" 1526 " some_code();\n" 1527 "test_label:\n" 1528 " some_other_code();\n" 1529 " {\n" 1530 " some_more_code();\n" 1531 "another_label:\n" 1532 " some_more_code();\n" 1533 " }\n" 1534 "}", 1535 Style); 1536 verifyFormat("{\n" 1537 " some_code();\n" 1538 "test_label:\n" 1539 " some_other_code();\n" 1540 "}", 1541 Style); 1542 verifyFormat("{\n" 1543 " some_code();\n" 1544 "test_label:;\n" 1545 " int i = 0;\n" 1546 "}"); 1547 } 1548 1549 TEST_F(FormatTest, MultiLineControlStatements) { 1550 FormatStyle Style = getLLVMStyle(); 1551 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1552 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; 1553 Style.ColumnLimit = 20; 1554 // Short lines should keep opening brace on same line. 1555 EXPECT_EQ("if (foo) {\n" 1556 " bar();\n" 1557 "}", 1558 format("if(foo){bar();}", Style)); 1559 EXPECT_EQ("if (foo) {\n" 1560 " bar();\n" 1561 "} else {\n" 1562 " baz();\n" 1563 "}", 1564 format("if(foo){bar();}else{baz();}", Style)); 1565 EXPECT_EQ("if (foo && bar) {\n" 1566 " baz();\n" 1567 "}", 1568 format("if(foo&&bar){baz();}", Style)); 1569 EXPECT_EQ("if (foo) {\n" 1570 " bar();\n" 1571 "} else if (baz) {\n" 1572 " quux();\n" 1573 "}", 1574 format("if(foo){bar();}else if(baz){quux();}", Style)); 1575 EXPECT_EQ( 1576 "if (foo) {\n" 1577 " bar();\n" 1578 "} else if (baz) {\n" 1579 " quux();\n" 1580 "} else {\n" 1581 " foobar();\n" 1582 "}", 1583 format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); 1584 EXPECT_EQ("for (;;) {\n" 1585 " foo();\n" 1586 "}", 1587 format("for(;;){foo();}")); 1588 EXPECT_EQ("while (1) {\n" 1589 " foo();\n" 1590 "}", 1591 format("while(1){foo();}", Style)); 1592 EXPECT_EQ("switch (foo) {\n" 1593 "case bar:\n" 1594 " return;\n" 1595 "}", 1596 format("switch(foo){case bar:return;}", Style)); 1597 EXPECT_EQ("try {\n" 1598 " foo();\n" 1599 "} catch (...) {\n" 1600 " bar();\n" 1601 "}", 1602 format("try{foo();}catch(...){bar();}", Style)); 1603 EXPECT_EQ("do {\n" 1604 " foo();\n" 1605 "} while (bar &&\n" 1606 " baz);", 1607 format("do{foo();}while(bar&&baz);", Style)); 1608 // Long lines should put opening brace on new line. 1609 EXPECT_EQ("if (foo && bar &&\n" 1610 " baz)\n" 1611 "{\n" 1612 " quux();\n" 1613 "}", 1614 format("if(foo&&bar&&baz){quux();}", Style)); 1615 EXPECT_EQ("if (foo && bar &&\n" 1616 " baz)\n" 1617 "{\n" 1618 " quux();\n" 1619 "}", 1620 format("if (foo && bar &&\n" 1621 " baz) {\n" 1622 " quux();\n" 1623 "}", 1624 Style)); 1625 EXPECT_EQ("if (foo) {\n" 1626 " bar();\n" 1627 "} else if (baz ||\n" 1628 " quux)\n" 1629 "{\n" 1630 " foobar();\n" 1631 "}", 1632 format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); 1633 EXPECT_EQ( 1634 "if (foo) {\n" 1635 " bar();\n" 1636 "} else if (baz ||\n" 1637 " quux)\n" 1638 "{\n" 1639 " foobar();\n" 1640 "} else {\n" 1641 " barbaz();\n" 1642 "}", 1643 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1644 Style)); 1645 EXPECT_EQ("for (int i = 0;\n" 1646 " i < 10; ++i)\n" 1647 "{\n" 1648 " foo();\n" 1649 "}", 1650 format("for(int i=0;i<10;++i){foo();}", Style)); 1651 EXPECT_EQ("while (foo || bar ||\n" 1652 " baz)\n" 1653 "{\n" 1654 " quux();\n" 1655 "}", 1656 format("while(foo||bar||baz){quux();}", Style)); 1657 EXPECT_EQ("switch (\n" 1658 " foo = barbaz)\n" 1659 "{\n" 1660 "case quux:\n" 1661 " return;\n" 1662 "}", 1663 format("switch(foo=barbaz){case quux:return;}", Style)); 1664 EXPECT_EQ("try {\n" 1665 " foo();\n" 1666 "} catch (\n" 1667 " Exception &bar)\n" 1668 "{\n" 1669 " baz();\n" 1670 "}", 1671 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1672 Style.ColumnLimit = 1673 40; // to concentrate at brace wrapping, not line wrap due to column limit 1674 EXPECT_EQ("try {\n" 1675 " foo();\n" 1676 "} catch (Exception &bar) {\n" 1677 " baz();\n" 1678 "}", 1679 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1680 Style.ColumnLimit = 1681 20; // to concentrate at brace wrapping, not line wrap due to column limit 1682 1683 Style.BraceWrapping.BeforeElse = true; 1684 EXPECT_EQ( 1685 "if (foo) {\n" 1686 " bar();\n" 1687 "}\n" 1688 "else if (baz ||\n" 1689 " quux)\n" 1690 "{\n" 1691 " foobar();\n" 1692 "}\n" 1693 "else {\n" 1694 " barbaz();\n" 1695 "}", 1696 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1697 Style)); 1698 1699 Style.BraceWrapping.BeforeCatch = true; 1700 EXPECT_EQ("try {\n" 1701 " foo();\n" 1702 "}\n" 1703 "catch (...) {\n" 1704 " baz();\n" 1705 "}", 1706 format("try{foo();}catch(...){baz();}", Style)); 1707 } 1708 1709 TEST_F(FormatTest, BeforeWhile) { 1710 FormatStyle Style = getLLVMStyle(); 1711 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1712 1713 verifyFormat("do {\n" 1714 " foo();\n" 1715 "} while (1);", 1716 Style); 1717 Style.BraceWrapping.BeforeWhile = true; 1718 verifyFormat("do {\n" 1719 " foo();\n" 1720 "}\n" 1721 "while (1);", 1722 Style); 1723 } 1724 1725 //===----------------------------------------------------------------------===// 1726 // Tests for classes, namespaces, etc. 1727 //===----------------------------------------------------------------------===// 1728 1729 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1730 verifyFormat("class A {};"); 1731 } 1732 1733 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1734 verifyFormat("class A {\n" 1735 "public:\n" 1736 "public: // comment\n" 1737 "protected:\n" 1738 "private:\n" 1739 " void f() {}\n" 1740 "};"); 1741 verifyFormat("export class A {\n" 1742 "public:\n" 1743 "public: // comment\n" 1744 "protected:\n" 1745 "private:\n" 1746 " void f() {}\n" 1747 "};"); 1748 verifyGoogleFormat("class A {\n" 1749 " public:\n" 1750 " protected:\n" 1751 " private:\n" 1752 " void f() {}\n" 1753 "};"); 1754 verifyGoogleFormat("export class A {\n" 1755 " public:\n" 1756 " protected:\n" 1757 " private:\n" 1758 " void f() {}\n" 1759 "};"); 1760 verifyFormat("class A {\n" 1761 "public slots:\n" 1762 " void f1() {}\n" 1763 "public Q_SLOTS:\n" 1764 " void f2() {}\n" 1765 "protected slots:\n" 1766 " void f3() {}\n" 1767 "protected Q_SLOTS:\n" 1768 " void f4() {}\n" 1769 "private slots:\n" 1770 " void f5() {}\n" 1771 "private Q_SLOTS:\n" 1772 " void f6() {}\n" 1773 "signals:\n" 1774 " void g1();\n" 1775 "Q_SIGNALS:\n" 1776 " void g2();\n" 1777 "};"); 1778 1779 // Don't interpret 'signals' the wrong way. 1780 verifyFormat("signals.set();"); 1781 verifyFormat("for (Signals signals : f()) {\n}"); 1782 verifyFormat("{\n" 1783 " signals.set(); // This needs indentation.\n" 1784 "}"); 1785 verifyFormat("void f() {\n" 1786 "label:\n" 1787 " signals.baz();\n" 1788 "}"); 1789 } 1790 1791 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1792 EXPECT_EQ("class A {\n" 1793 "public:\n" 1794 " void f();\n" 1795 "\n" 1796 "private:\n" 1797 " void g() {}\n" 1798 " // test\n" 1799 "protected:\n" 1800 " int h;\n" 1801 "};", 1802 format("class A {\n" 1803 "public:\n" 1804 "void f();\n" 1805 "private:\n" 1806 "void g() {}\n" 1807 "// test\n" 1808 "protected:\n" 1809 "int h;\n" 1810 "};")); 1811 EXPECT_EQ("class A {\n" 1812 "protected:\n" 1813 "public:\n" 1814 " void f();\n" 1815 "};", 1816 format("class A {\n" 1817 "protected:\n" 1818 "\n" 1819 "public:\n" 1820 "\n" 1821 " void f();\n" 1822 "};")); 1823 1824 // Even ensure proper spacing inside macros. 1825 EXPECT_EQ("#define B \\\n" 1826 " class A { \\\n" 1827 " protected: \\\n" 1828 " public: \\\n" 1829 " void f(); \\\n" 1830 " };", 1831 format("#define B \\\n" 1832 " class A { \\\n" 1833 " protected: \\\n" 1834 " \\\n" 1835 " public: \\\n" 1836 " \\\n" 1837 " void f(); \\\n" 1838 " };", 1839 getGoogleStyle())); 1840 // But don't remove empty lines after macros ending in access specifiers. 1841 EXPECT_EQ("#define A private:\n" 1842 "\n" 1843 "int i;", 1844 format("#define A private:\n" 1845 "\n" 1846 "int i;")); 1847 } 1848 1849 TEST_F(FormatTest, FormatsClasses) { 1850 verifyFormat("class A : public B {};"); 1851 verifyFormat("class A : public ::B {};"); 1852 1853 verifyFormat( 1854 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1855 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1856 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1857 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1858 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1859 verifyFormat( 1860 "class A : public B, public C, public D, public E, public F {};"); 1861 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1862 " public C,\n" 1863 " public D,\n" 1864 " public E,\n" 1865 " public F,\n" 1866 " public G {};"); 1867 1868 verifyFormat("class\n" 1869 " ReallyReallyLongClassName {\n" 1870 " int i;\n" 1871 "};", 1872 getLLVMStyleWithColumns(32)); 1873 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1874 " aaaaaaaaaaaaaaaa> {};"); 1875 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1876 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1877 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1878 verifyFormat("template <class R, class C>\n" 1879 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1880 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1881 verifyFormat("class ::A::B {};"); 1882 } 1883 1884 TEST_F(FormatTest, BreakInheritanceStyle) { 1885 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1886 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1887 FormatStyle::BILS_BeforeComma; 1888 verifyFormat("class MyClass : public X {};", 1889 StyleWithInheritanceBreakBeforeComma); 1890 verifyFormat("class MyClass\n" 1891 " : public X\n" 1892 " , public Y {};", 1893 StyleWithInheritanceBreakBeforeComma); 1894 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1895 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1896 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1897 StyleWithInheritanceBreakBeforeComma); 1898 verifyFormat("struct aaaaaaaaaaaaa\n" 1899 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1900 " aaaaaaaaaaaaaaaa> {};", 1901 StyleWithInheritanceBreakBeforeComma); 1902 1903 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1904 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1905 FormatStyle::BILS_AfterColon; 1906 verifyFormat("class MyClass : public X {};", 1907 StyleWithInheritanceBreakAfterColon); 1908 verifyFormat("class MyClass : public X, public Y {};", 1909 StyleWithInheritanceBreakAfterColon); 1910 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1911 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1912 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1913 StyleWithInheritanceBreakAfterColon); 1914 verifyFormat("struct aaaaaaaaaaaaa :\n" 1915 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1916 " aaaaaaaaaaaaaaaa> {};", 1917 StyleWithInheritanceBreakAfterColon); 1918 } 1919 1920 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1921 verifyFormat("class A {\n} a, b;"); 1922 verifyFormat("struct A {\n} a, b;"); 1923 verifyFormat("union A {\n} a;"); 1924 } 1925 1926 TEST_F(FormatTest, FormatsEnum) { 1927 verifyFormat("enum {\n" 1928 " Zero,\n" 1929 " One = 1,\n" 1930 " Two = One + 1,\n" 1931 " Three = (One + Two),\n" 1932 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1933 " Five = (One, Two, Three, Four, 5)\n" 1934 "};"); 1935 verifyGoogleFormat("enum {\n" 1936 " Zero,\n" 1937 " One = 1,\n" 1938 " Two = One + 1,\n" 1939 " Three = (One + Two),\n" 1940 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1941 " Five = (One, Two, Three, Four, 5)\n" 1942 "};"); 1943 verifyFormat("enum Enum {};"); 1944 verifyFormat("enum {};"); 1945 verifyFormat("enum X E {} d;"); 1946 verifyFormat("enum __attribute__((...)) E {} d;"); 1947 verifyFormat("enum __declspec__((...)) E {} d;"); 1948 verifyFormat("enum {\n" 1949 " Bar = Foo<int, int>::value\n" 1950 "};", 1951 getLLVMStyleWithColumns(30)); 1952 1953 verifyFormat("enum ShortEnum { A, B, C };"); 1954 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1955 1956 EXPECT_EQ("enum KeepEmptyLines {\n" 1957 " ONE,\n" 1958 "\n" 1959 " TWO,\n" 1960 "\n" 1961 " THREE\n" 1962 "}", 1963 format("enum KeepEmptyLines {\n" 1964 " ONE,\n" 1965 "\n" 1966 " TWO,\n" 1967 "\n" 1968 "\n" 1969 " THREE\n" 1970 "}")); 1971 verifyFormat("enum E { // comment\n" 1972 " ONE,\n" 1973 " TWO\n" 1974 "};\n" 1975 "int i;"); 1976 1977 FormatStyle EightIndent = getLLVMStyle(); 1978 EightIndent.IndentWidth = 8; 1979 verifyFormat("enum {\n" 1980 " VOID,\n" 1981 " CHAR,\n" 1982 " SHORT,\n" 1983 " INT,\n" 1984 " LONG,\n" 1985 " SIGNED,\n" 1986 " UNSIGNED,\n" 1987 " BOOL,\n" 1988 " FLOAT,\n" 1989 " DOUBLE,\n" 1990 " COMPLEX\n" 1991 "};", 1992 EightIndent); 1993 1994 // Not enums. 1995 verifyFormat("enum X f() {\n" 1996 " a();\n" 1997 " return 42;\n" 1998 "}"); 1999 verifyFormat("enum X Type::f() {\n" 2000 " a();\n" 2001 " return 42;\n" 2002 "}"); 2003 verifyFormat("enum ::X f() {\n" 2004 " a();\n" 2005 " return 42;\n" 2006 "}"); 2007 verifyFormat("enum ns::X f() {\n" 2008 " a();\n" 2009 " return 42;\n" 2010 "}"); 2011 } 2012 2013 TEST_F(FormatTest, FormatsEnumsWithErrors) { 2014 verifyFormat("enum Type {\n" 2015 " One = 0; // These semicolons should be commas.\n" 2016 " Two = 1;\n" 2017 "};"); 2018 verifyFormat("namespace n {\n" 2019 "enum Type {\n" 2020 " One,\n" 2021 " Two, // missing };\n" 2022 " int i;\n" 2023 "}\n" 2024 "void g() {}"); 2025 } 2026 2027 TEST_F(FormatTest, FormatsEnumStruct) { 2028 verifyFormat("enum struct {\n" 2029 " Zero,\n" 2030 " One = 1,\n" 2031 " Two = One + 1,\n" 2032 " Three = (One + Two),\n" 2033 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2034 " Five = (One, Two, Three, Four, 5)\n" 2035 "};"); 2036 verifyFormat("enum struct Enum {};"); 2037 verifyFormat("enum struct {};"); 2038 verifyFormat("enum struct X E {} d;"); 2039 verifyFormat("enum struct __attribute__((...)) E {} d;"); 2040 verifyFormat("enum struct __declspec__((...)) E {} d;"); 2041 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 2042 } 2043 2044 TEST_F(FormatTest, FormatsEnumClass) { 2045 verifyFormat("enum class {\n" 2046 " Zero,\n" 2047 " One = 1,\n" 2048 " Two = One + 1,\n" 2049 " Three = (One + Two),\n" 2050 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2051 " Five = (One, Two, Three, Four, 5)\n" 2052 "};"); 2053 verifyFormat("enum class Enum {};"); 2054 verifyFormat("enum class {};"); 2055 verifyFormat("enum class X E {} d;"); 2056 verifyFormat("enum class __attribute__((...)) E {} d;"); 2057 verifyFormat("enum class __declspec__((...)) E {} d;"); 2058 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 2059 } 2060 2061 TEST_F(FormatTest, FormatsEnumTypes) { 2062 verifyFormat("enum X : int {\n" 2063 " A, // Force multiple lines.\n" 2064 " B\n" 2065 "};"); 2066 verifyFormat("enum X : int { A, B };"); 2067 verifyFormat("enum X : std::uint32_t { A, B };"); 2068 } 2069 2070 TEST_F(FormatTest, FormatsTypedefEnum) { 2071 FormatStyle Style = getLLVMStyle(); 2072 Style.ColumnLimit = 40; 2073 verifyFormat("typedef enum {} EmptyEnum;"); 2074 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2075 verifyFormat("typedef enum {\n" 2076 " ZERO = 0,\n" 2077 " ONE = 1,\n" 2078 " TWO = 2,\n" 2079 " THREE = 3\n" 2080 "} LongEnum;", 2081 Style); 2082 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2083 Style.BraceWrapping.AfterEnum = true; 2084 verifyFormat("typedef enum {} EmptyEnum;"); 2085 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2086 verifyFormat("typedef enum\n" 2087 "{\n" 2088 " ZERO = 0,\n" 2089 " ONE = 1,\n" 2090 " TWO = 2,\n" 2091 " THREE = 3\n" 2092 "} LongEnum;", 2093 Style); 2094 } 2095 2096 TEST_F(FormatTest, FormatsNSEnums) { 2097 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2098 verifyGoogleFormat( 2099 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2100 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 2101 " // Information about someDecentlyLongValue.\n" 2102 " someDecentlyLongValue,\n" 2103 " // Information about anotherDecentlyLongValue.\n" 2104 " anotherDecentlyLongValue,\n" 2105 " // Information about aThirdDecentlyLongValue.\n" 2106 " aThirdDecentlyLongValue\n" 2107 "};"); 2108 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 2109 " // Information about someDecentlyLongValue.\n" 2110 " someDecentlyLongValue,\n" 2111 " // Information about anotherDecentlyLongValue.\n" 2112 " anotherDecentlyLongValue,\n" 2113 " // Information about aThirdDecentlyLongValue.\n" 2114 " aThirdDecentlyLongValue\n" 2115 "};"); 2116 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 2117 " a = 1,\n" 2118 " b = 2,\n" 2119 " c = 3,\n" 2120 "};"); 2121 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 2122 " a = 1,\n" 2123 " b = 2,\n" 2124 " c = 3,\n" 2125 "};"); 2126 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 2127 " a = 1,\n" 2128 " b = 2,\n" 2129 " c = 3,\n" 2130 "};"); 2131 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 2132 " a = 1,\n" 2133 " b = 2,\n" 2134 " c = 3,\n" 2135 "};"); 2136 } 2137 2138 TEST_F(FormatTest, FormatsBitfields) { 2139 verifyFormat("struct Bitfields {\n" 2140 " unsigned sClass : 8;\n" 2141 " unsigned ValueKind : 2;\n" 2142 "};"); 2143 verifyFormat("struct A {\n" 2144 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 2145 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 2146 "};"); 2147 verifyFormat("struct MyStruct {\n" 2148 " uchar data;\n" 2149 " uchar : 8;\n" 2150 " uchar : 8;\n" 2151 " uchar other;\n" 2152 "};"); 2153 } 2154 2155 TEST_F(FormatTest, FormatsNamespaces) { 2156 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 2157 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 2158 2159 verifyFormat("namespace some_namespace {\n" 2160 "class A {};\n" 2161 "void f() { f(); }\n" 2162 "}", 2163 LLVMWithNoNamespaceFix); 2164 verifyFormat("namespace N::inline D {\n" 2165 "class A {};\n" 2166 "void f() { f(); }\n" 2167 "}", 2168 LLVMWithNoNamespaceFix); 2169 verifyFormat("namespace N::inline D::E {\n" 2170 "class A {};\n" 2171 "void f() { f(); }\n" 2172 "}", 2173 LLVMWithNoNamespaceFix); 2174 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 2175 "class A {};\n" 2176 "void f() { f(); }\n" 2177 "}", 2178 LLVMWithNoNamespaceFix); 2179 verifyFormat("/* something */ namespace some_namespace {\n" 2180 "class A {};\n" 2181 "void f() { f(); }\n" 2182 "}", 2183 LLVMWithNoNamespaceFix); 2184 verifyFormat("namespace {\n" 2185 "class A {};\n" 2186 "void f() { f(); }\n" 2187 "}", 2188 LLVMWithNoNamespaceFix); 2189 verifyFormat("/* something */ namespace {\n" 2190 "class A {};\n" 2191 "void f() { f(); }\n" 2192 "}", 2193 LLVMWithNoNamespaceFix); 2194 verifyFormat("inline namespace X {\n" 2195 "class A {};\n" 2196 "void f() { f(); }\n" 2197 "}", 2198 LLVMWithNoNamespaceFix); 2199 verifyFormat("/* something */ inline namespace X {\n" 2200 "class A {};\n" 2201 "void f() { f(); }\n" 2202 "}", 2203 LLVMWithNoNamespaceFix); 2204 verifyFormat("export namespace X {\n" 2205 "class A {};\n" 2206 "void f() { f(); }\n" 2207 "}", 2208 LLVMWithNoNamespaceFix); 2209 verifyFormat("using namespace some_namespace;\n" 2210 "class A {};\n" 2211 "void f() { f(); }", 2212 LLVMWithNoNamespaceFix); 2213 2214 // This code is more common than we thought; if we 2215 // layout this correctly the semicolon will go into 2216 // its own line, which is undesirable. 2217 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 2218 verifyFormat("namespace {\n" 2219 "class A {};\n" 2220 "};", 2221 LLVMWithNoNamespaceFix); 2222 2223 verifyFormat("namespace {\n" 2224 "int SomeVariable = 0; // comment\n" 2225 "} // namespace", 2226 LLVMWithNoNamespaceFix); 2227 EXPECT_EQ("#ifndef HEADER_GUARD\n" 2228 "#define HEADER_GUARD\n" 2229 "namespace my_namespace {\n" 2230 "int i;\n" 2231 "} // my_namespace\n" 2232 "#endif // HEADER_GUARD", 2233 format("#ifndef HEADER_GUARD\n" 2234 " #define HEADER_GUARD\n" 2235 " namespace my_namespace {\n" 2236 "int i;\n" 2237 "} // my_namespace\n" 2238 "#endif // HEADER_GUARD", 2239 LLVMWithNoNamespaceFix)); 2240 2241 EXPECT_EQ("namespace A::B {\n" 2242 "class C {};\n" 2243 "}", 2244 format("namespace A::B {\n" 2245 "class C {};\n" 2246 "}", 2247 LLVMWithNoNamespaceFix)); 2248 2249 FormatStyle Style = getLLVMStyle(); 2250 Style.NamespaceIndentation = FormatStyle::NI_All; 2251 EXPECT_EQ("namespace out {\n" 2252 " int i;\n" 2253 " namespace in {\n" 2254 " int i;\n" 2255 " } // namespace in\n" 2256 "} // namespace out", 2257 format("namespace out {\n" 2258 "int i;\n" 2259 "namespace in {\n" 2260 "int i;\n" 2261 "} // namespace in\n" 2262 "} // namespace out", 2263 Style)); 2264 2265 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2266 EXPECT_EQ("namespace out {\n" 2267 "int i;\n" 2268 "namespace in {\n" 2269 " int i;\n" 2270 "} // namespace in\n" 2271 "} // namespace out", 2272 format("namespace out {\n" 2273 "int i;\n" 2274 "namespace in {\n" 2275 "int i;\n" 2276 "} // namespace in\n" 2277 "} // namespace out", 2278 Style)); 2279 } 2280 2281 TEST_F(FormatTest, NamespaceMacros) { 2282 FormatStyle Style = getLLVMStyle(); 2283 Style.NamespaceMacros.push_back("TESTSUITE"); 2284 2285 verifyFormat("TESTSUITE(A) {\n" 2286 "int foo();\n" 2287 "} // TESTSUITE(A)", 2288 Style); 2289 2290 verifyFormat("TESTSUITE(A, B) {\n" 2291 "int foo();\n" 2292 "} // TESTSUITE(A)", 2293 Style); 2294 2295 // Properly indent according to NamespaceIndentation style 2296 Style.NamespaceIndentation = FormatStyle::NI_All; 2297 verifyFormat("TESTSUITE(A) {\n" 2298 " int foo();\n" 2299 "} // TESTSUITE(A)", 2300 Style); 2301 verifyFormat("TESTSUITE(A) {\n" 2302 " namespace B {\n" 2303 " int foo();\n" 2304 " } // namespace B\n" 2305 "} // TESTSUITE(A)", 2306 Style); 2307 verifyFormat("namespace A {\n" 2308 " TESTSUITE(B) {\n" 2309 " int foo();\n" 2310 " } // TESTSUITE(B)\n" 2311 "} // namespace A", 2312 Style); 2313 2314 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2315 verifyFormat("TESTSUITE(A) {\n" 2316 "TESTSUITE(B) {\n" 2317 " int foo();\n" 2318 "} // TESTSUITE(B)\n" 2319 "} // TESTSUITE(A)", 2320 Style); 2321 verifyFormat("TESTSUITE(A) {\n" 2322 "namespace B {\n" 2323 " int foo();\n" 2324 "} // namespace B\n" 2325 "} // TESTSUITE(A)", 2326 Style); 2327 verifyFormat("namespace A {\n" 2328 "TESTSUITE(B) {\n" 2329 " int foo();\n" 2330 "} // TESTSUITE(B)\n" 2331 "} // namespace A", 2332 Style); 2333 2334 // Properly merge namespace-macros blocks in CompactNamespaces mode 2335 Style.NamespaceIndentation = FormatStyle::NI_None; 2336 Style.CompactNamespaces = true; 2337 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2338 "}} // TESTSUITE(A::B)", 2339 Style); 2340 2341 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2342 "}} // TESTSUITE(out::in)", 2343 format("TESTSUITE(out) {\n" 2344 "TESTSUITE(in) {\n" 2345 "} // TESTSUITE(in)\n" 2346 "} // TESTSUITE(out)", 2347 Style)); 2348 2349 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2350 "}} // TESTSUITE(out::in)", 2351 format("TESTSUITE(out) {\n" 2352 "TESTSUITE(in) {\n" 2353 "} // TESTSUITE(in)\n" 2354 "} // TESTSUITE(out)", 2355 Style)); 2356 2357 // Do not merge different namespaces/macros 2358 EXPECT_EQ("namespace out {\n" 2359 "TESTSUITE(in) {\n" 2360 "} // TESTSUITE(in)\n" 2361 "} // namespace out", 2362 format("namespace out {\n" 2363 "TESTSUITE(in) {\n" 2364 "} // TESTSUITE(in)\n" 2365 "} // namespace out", 2366 Style)); 2367 EXPECT_EQ("TESTSUITE(out) {\n" 2368 "namespace in {\n" 2369 "} // namespace in\n" 2370 "} // TESTSUITE(out)", 2371 format("TESTSUITE(out) {\n" 2372 "namespace in {\n" 2373 "} // namespace in\n" 2374 "} // TESTSUITE(out)", 2375 Style)); 2376 Style.NamespaceMacros.push_back("FOOBAR"); 2377 EXPECT_EQ("TESTSUITE(out) {\n" 2378 "FOOBAR(in) {\n" 2379 "} // FOOBAR(in)\n" 2380 "} // TESTSUITE(out)", 2381 format("TESTSUITE(out) {\n" 2382 "FOOBAR(in) {\n" 2383 "} // FOOBAR(in)\n" 2384 "} // TESTSUITE(out)", 2385 Style)); 2386 } 2387 2388 TEST_F(FormatTest, FormatsCompactNamespaces) { 2389 FormatStyle Style = getLLVMStyle(); 2390 Style.CompactNamespaces = true; 2391 Style.NamespaceMacros.push_back("TESTSUITE"); 2392 2393 verifyFormat("namespace A { namespace B {\n" 2394 "}} // namespace A::B", 2395 Style); 2396 2397 EXPECT_EQ("namespace out { namespace in {\n" 2398 "}} // namespace out::in", 2399 format("namespace out {\n" 2400 "namespace in {\n" 2401 "} // namespace in\n" 2402 "} // namespace out", 2403 Style)); 2404 2405 // Only namespaces which have both consecutive opening and end get compacted 2406 EXPECT_EQ("namespace out {\n" 2407 "namespace in1 {\n" 2408 "} // namespace in1\n" 2409 "namespace in2 {\n" 2410 "} // namespace in2\n" 2411 "} // namespace out", 2412 format("namespace out {\n" 2413 "namespace in1 {\n" 2414 "} // namespace in1\n" 2415 "namespace in2 {\n" 2416 "} // namespace in2\n" 2417 "} // namespace out", 2418 Style)); 2419 2420 EXPECT_EQ("namespace out {\n" 2421 "int i;\n" 2422 "namespace in {\n" 2423 "int j;\n" 2424 "} // namespace in\n" 2425 "int k;\n" 2426 "} // namespace out", 2427 format("namespace out { int i;\n" 2428 "namespace in { int j; } // namespace in\n" 2429 "int k; } // namespace out", 2430 Style)); 2431 2432 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2433 "}}} // namespace A::B::C\n", 2434 format("namespace A { namespace B {\n" 2435 "namespace C {\n" 2436 "}} // namespace B::C\n" 2437 "} // namespace A\n", 2438 Style)); 2439 2440 Style.ColumnLimit = 40; 2441 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2442 "namespace bbbbbbbbbb {\n" 2443 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2444 format("namespace aaaaaaaaaa {\n" 2445 "namespace bbbbbbbbbb {\n" 2446 "} // namespace bbbbbbbbbb\n" 2447 "} // namespace aaaaaaaaaa", 2448 Style)); 2449 2450 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2451 "namespace cccccc {\n" 2452 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2453 format("namespace aaaaaa {\n" 2454 "namespace bbbbbb {\n" 2455 "namespace cccccc {\n" 2456 "} // namespace cccccc\n" 2457 "} // namespace bbbbbb\n" 2458 "} // namespace aaaaaa", 2459 Style)); 2460 Style.ColumnLimit = 80; 2461 2462 // Extra semicolon after 'inner' closing brace prevents merging 2463 EXPECT_EQ("namespace out { namespace in {\n" 2464 "}; } // namespace out::in", 2465 format("namespace out {\n" 2466 "namespace in {\n" 2467 "}; // namespace in\n" 2468 "} // namespace out", 2469 Style)); 2470 2471 // Extra semicolon after 'outer' closing brace is conserved 2472 EXPECT_EQ("namespace out { namespace in {\n" 2473 "}}; // namespace out::in", 2474 format("namespace out {\n" 2475 "namespace in {\n" 2476 "} // namespace in\n" 2477 "}; // namespace out", 2478 Style)); 2479 2480 Style.NamespaceIndentation = FormatStyle::NI_All; 2481 EXPECT_EQ("namespace out { namespace in {\n" 2482 " int i;\n" 2483 "}} // namespace out::in", 2484 format("namespace out {\n" 2485 "namespace in {\n" 2486 "int i;\n" 2487 "} // namespace in\n" 2488 "} // namespace out", 2489 Style)); 2490 EXPECT_EQ("namespace out { namespace mid {\n" 2491 " namespace in {\n" 2492 " int j;\n" 2493 " } // namespace in\n" 2494 " int k;\n" 2495 "}} // namespace out::mid", 2496 format("namespace out { namespace mid {\n" 2497 "namespace in { int j; } // namespace in\n" 2498 "int k; }} // namespace out::mid", 2499 Style)); 2500 2501 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2502 EXPECT_EQ("namespace out { namespace in {\n" 2503 " int i;\n" 2504 "}} // namespace out::in", 2505 format("namespace out {\n" 2506 "namespace in {\n" 2507 "int i;\n" 2508 "} // namespace in\n" 2509 "} // namespace out", 2510 Style)); 2511 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2512 " int i;\n" 2513 "}}} // namespace out::mid::in", 2514 format("namespace out {\n" 2515 "namespace mid {\n" 2516 "namespace in {\n" 2517 "int i;\n" 2518 "} // namespace in\n" 2519 "} // namespace mid\n" 2520 "} // namespace out", 2521 Style)); 2522 } 2523 2524 TEST_F(FormatTest, FormatsExternC) { 2525 verifyFormat("extern \"C\" {\nint a;"); 2526 verifyFormat("extern \"C\" {}"); 2527 verifyFormat("extern \"C\" {\n" 2528 "int foo();\n" 2529 "}"); 2530 verifyFormat("extern \"C\" int foo() {}"); 2531 verifyFormat("extern \"C\" int foo();"); 2532 verifyFormat("extern \"C\" int foo() {\n" 2533 " int i = 42;\n" 2534 " return i;\n" 2535 "}"); 2536 2537 FormatStyle Style = getLLVMStyle(); 2538 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2539 Style.BraceWrapping.AfterFunction = true; 2540 verifyFormat("extern \"C\" int foo() {}", Style); 2541 verifyFormat("extern \"C\" int foo();", Style); 2542 verifyFormat("extern \"C\" int foo()\n" 2543 "{\n" 2544 " int i = 42;\n" 2545 " return i;\n" 2546 "}", 2547 Style); 2548 2549 Style.BraceWrapping.AfterExternBlock = true; 2550 Style.BraceWrapping.SplitEmptyRecord = false; 2551 verifyFormat("extern \"C\"\n" 2552 "{}", 2553 Style); 2554 verifyFormat("extern \"C\"\n" 2555 "{\n" 2556 " int foo();\n" 2557 "}", 2558 Style); 2559 } 2560 2561 TEST_F(FormatTest, FormatsInlineASM) { 2562 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2563 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2564 verifyFormat( 2565 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2566 " \"cpuid\\n\\t\"\n" 2567 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2568 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2569 " : \"a\"(value));"); 2570 EXPECT_EQ( 2571 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2572 " __asm {\n" 2573 " mov edx,[that] // vtable in edx\n" 2574 " mov eax,methodIndex\n" 2575 " call [edx][eax*4] // stdcall\n" 2576 " }\n" 2577 "}", 2578 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2579 " __asm {\n" 2580 " mov edx,[that] // vtable in edx\n" 2581 " mov eax,methodIndex\n" 2582 " call [edx][eax*4] // stdcall\n" 2583 " }\n" 2584 "}")); 2585 EXPECT_EQ("_asm {\n" 2586 " xor eax, eax;\n" 2587 " cpuid;\n" 2588 "}", 2589 format("_asm {\n" 2590 " xor eax, eax;\n" 2591 " cpuid;\n" 2592 "}")); 2593 verifyFormat("void function() {\n" 2594 " // comment\n" 2595 " asm(\"\");\n" 2596 "}"); 2597 EXPECT_EQ("__asm {\n" 2598 "}\n" 2599 "int i;", 2600 format("__asm {\n" 2601 "}\n" 2602 "int i;")); 2603 } 2604 2605 TEST_F(FormatTest, FormatTryCatch) { 2606 verifyFormat("try {\n" 2607 " throw a * b;\n" 2608 "} catch (int a) {\n" 2609 " // Do nothing.\n" 2610 "} catch (...) {\n" 2611 " exit(42);\n" 2612 "}"); 2613 2614 // Function-level try statements. 2615 verifyFormat("int f() try { return 4; } catch (...) {\n" 2616 " return 5;\n" 2617 "}"); 2618 verifyFormat("class A {\n" 2619 " int a;\n" 2620 " A() try : a(0) {\n" 2621 " } catch (...) {\n" 2622 " throw;\n" 2623 " }\n" 2624 "};\n"); 2625 2626 // Incomplete try-catch blocks. 2627 verifyIncompleteFormat("try {} catch ("); 2628 } 2629 2630 TEST_F(FormatTest, FormatSEHTryCatch) { 2631 verifyFormat("__try {\n" 2632 " int a = b * c;\n" 2633 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2634 " // Do nothing.\n" 2635 "}"); 2636 2637 verifyFormat("__try {\n" 2638 " int a = b * c;\n" 2639 "} __finally {\n" 2640 " // Do nothing.\n" 2641 "}"); 2642 2643 verifyFormat("DEBUG({\n" 2644 " __try {\n" 2645 " } __finally {\n" 2646 " }\n" 2647 "});\n"); 2648 } 2649 2650 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2651 verifyFormat("try {\n" 2652 " f();\n" 2653 "} catch {\n" 2654 " g();\n" 2655 "}"); 2656 verifyFormat("try {\n" 2657 " f();\n" 2658 "} catch (A a) MACRO(x) {\n" 2659 " g();\n" 2660 "} catch (B b) MACRO(x) {\n" 2661 " g();\n" 2662 "}"); 2663 } 2664 2665 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2666 FormatStyle Style = getLLVMStyle(); 2667 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2668 FormatStyle::BS_WebKit}) { 2669 Style.BreakBeforeBraces = BraceStyle; 2670 verifyFormat("try {\n" 2671 " // something\n" 2672 "} catch (...) {\n" 2673 " // something\n" 2674 "}", 2675 Style); 2676 } 2677 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2678 verifyFormat("try {\n" 2679 " // something\n" 2680 "}\n" 2681 "catch (...) {\n" 2682 " // something\n" 2683 "}", 2684 Style); 2685 verifyFormat("__try {\n" 2686 " // something\n" 2687 "}\n" 2688 "__finally {\n" 2689 " // something\n" 2690 "}", 2691 Style); 2692 verifyFormat("@try {\n" 2693 " // something\n" 2694 "}\n" 2695 "@finally {\n" 2696 " // something\n" 2697 "}", 2698 Style); 2699 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2700 verifyFormat("try\n" 2701 "{\n" 2702 " // something\n" 2703 "}\n" 2704 "catch (...)\n" 2705 "{\n" 2706 " // something\n" 2707 "}", 2708 Style); 2709 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2710 verifyFormat("try\n" 2711 " {\n" 2712 " // something white\n" 2713 " }\n" 2714 "catch (...)\n" 2715 " {\n" 2716 " // something white\n" 2717 " }", 2718 Style); 2719 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2720 verifyFormat("try\n" 2721 " {\n" 2722 " // something\n" 2723 " }\n" 2724 "catch (...)\n" 2725 " {\n" 2726 " // something\n" 2727 " }", 2728 Style); 2729 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2730 Style.BraceWrapping.BeforeCatch = true; 2731 verifyFormat("try {\n" 2732 " // something\n" 2733 "}\n" 2734 "catch (...) {\n" 2735 " // something\n" 2736 "}", 2737 Style); 2738 } 2739 2740 TEST_F(FormatTest, StaticInitializers) { 2741 verifyFormat("static SomeClass SC = {1, 'a'};"); 2742 2743 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2744 " 100000000, " 2745 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2746 2747 // Here, everything other than the "}" would fit on a line. 2748 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2749 " 10000000000000000000000000};"); 2750 EXPECT_EQ("S s = {a,\n" 2751 "\n" 2752 " b};", 2753 format("S s = {\n" 2754 " a,\n" 2755 "\n" 2756 " b\n" 2757 "};")); 2758 2759 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2760 // line. However, the formatting looks a bit off and this probably doesn't 2761 // happen often in practice. 2762 verifyFormat("static int Variable[1] = {\n" 2763 " {1000000000000000000000000000000000000}};", 2764 getLLVMStyleWithColumns(40)); 2765 } 2766 2767 TEST_F(FormatTest, DesignatedInitializers) { 2768 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2769 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2770 " .bbbbbbbbbb = 2,\n" 2771 " .cccccccccc = 3,\n" 2772 " .dddddddddd = 4,\n" 2773 " .eeeeeeeeee = 5};"); 2774 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2775 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2776 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2777 " .ccccccccccccccccccccccccccc = 3,\n" 2778 " .ddddddddddddddddddddddddddd = 4,\n" 2779 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2780 2781 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2782 2783 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2784 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2785 " [2] = bbbbbbbbbb,\n" 2786 " [3] = cccccccccc,\n" 2787 " [4] = dddddddddd,\n" 2788 " [5] = eeeeeeeeee};"); 2789 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2790 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2791 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2792 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2793 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2794 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2795 } 2796 2797 TEST_F(FormatTest, NestedStaticInitializers) { 2798 verifyFormat("static A x = {{{}}};\n"); 2799 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2800 " {init1, init2, init3, init4}}};", 2801 getLLVMStyleWithColumns(50)); 2802 2803 verifyFormat("somes Status::global_reps[3] = {\n" 2804 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2805 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2806 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2807 getLLVMStyleWithColumns(60)); 2808 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2809 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2810 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2811 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2812 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2813 " {rect.fRight - rect.fLeft, rect.fBottom - " 2814 "rect.fTop}};"); 2815 2816 verifyFormat( 2817 "SomeArrayOfSomeType a = {\n" 2818 " {{1, 2, 3},\n" 2819 " {1, 2, 3},\n" 2820 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2821 " 333333333333333333333333333333},\n" 2822 " {1, 2, 3},\n" 2823 " {1, 2, 3}}};"); 2824 verifyFormat( 2825 "SomeArrayOfSomeType a = {\n" 2826 " {{1, 2, 3}},\n" 2827 " {{1, 2, 3}},\n" 2828 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2829 " 333333333333333333333333333333}},\n" 2830 " {{1, 2, 3}},\n" 2831 " {{1, 2, 3}}};"); 2832 2833 verifyFormat("struct {\n" 2834 " unsigned bit;\n" 2835 " const char *const name;\n" 2836 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2837 " {kOsWin, \"Windows\"},\n" 2838 " {kOsLinux, \"Linux\"},\n" 2839 " {kOsCrOS, \"Chrome OS\"}};"); 2840 verifyFormat("struct {\n" 2841 " unsigned bit;\n" 2842 " const char *const name;\n" 2843 "} kBitsToOs[] = {\n" 2844 " {kOsMac, \"Mac\"},\n" 2845 " {kOsWin, \"Windows\"},\n" 2846 " {kOsLinux, \"Linux\"},\n" 2847 " {kOsCrOS, \"Chrome OS\"},\n" 2848 "};"); 2849 } 2850 2851 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2852 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2853 " \\\n" 2854 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2855 } 2856 2857 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2858 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2859 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2860 2861 // Do break defaulted and deleted functions. 2862 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2863 " default;", 2864 getLLVMStyleWithColumns(40)); 2865 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2866 " delete;", 2867 getLLVMStyleWithColumns(40)); 2868 } 2869 2870 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2871 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2872 getLLVMStyleWithColumns(40)); 2873 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2874 getLLVMStyleWithColumns(40)); 2875 EXPECT_EQ("#define Q \\\n" 2876 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2877 " \"aaaaaaaa.cpp\"", 2878 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2879 getLLVMStyleWithColumns(40))); 2880 } 2881 2882 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2883 EXPECT_EQ("# 123 \"A string literal\"", 2884 format(" # 123 \"A string literal\"")); 2885 } 2886 2887 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2888 EXPECT_EQ("#;", format("#;")); 2889 verifyFormat("#\n;\n;\n;"); 2890 } 2891 2892 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2893 EXPECT_EQ("#line 42 \"test\"\n", 2894 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2895 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2896 getLLVMStyleWithColumns(12))); 2897 } 2898 2899 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2900 EXPECT_EQ("#line 42 \"test\"", 2901 format("# \\\n line \\\n 42 \\\n \"test\"")); 2902 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2903 } 2904 2905 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2906 verifyFormat("#define A \\x20"); 2907 verifyFormat("#define A \\ x20"); 2908 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2909 verifyFormat("#define A ''"); 2910 verifyFormat("#define A ''qqq"); 2911 verifyFormat("#define A `qqq"); 2912 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2913 EXPECT_EQ("const char *c = STRINGIFY(\n" 2914 "\\na : b);", 2915 format("const char * c = STRINGIFY(\n" 2916 "\\na : b);")); 2917 2918 verifyFormat("a\r\\"); 2919 verifyFormat("a\v\\"); 2920 verifyFormat("a\f\\"); 2921 } 2922 2923 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2924 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2925 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2926 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2927 // FIXME: We never break before the macro name. 2928 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2929 2930 verifyFormat("#define A A\n#define A A"); 2931 verifyFormat("#define A(X) A\n#define A A"); 2932 2933 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2934 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2935 } 2936 2937 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2938 EXPECT_EQ("// somecomment\n" 2939 "#include \"a.h\"\n" 2940 "#define A( \\\n" 2941 " A, B)\n" 2942 "#include \"b.h\"\n" 2943 "// somecomment\n", 2944 format(" // somecomment\n" 2945 " #include \"a.h\"\n" 2946 "#define A(A,\\\n" 2947 " B)\n" 2948 " #include \"b.h\"\n" 2949 " // somecomment\n", 2950 getLLVMStyleWithColumns(13))); 2951 } 2952 2953 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2954 2955 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2956 EXPECT_EQ("#define A \\\n" 2957 " c; \\\n" 2958 " e;\n" 2959 "f;", 2960 format("#define A c; e;\n" 2961 "f;", 2962 getLLVMStyleWithColumns(14))); 2963 } 2964 2965 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2966 2967 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2968 EXPECT_EQ("int x,\n" 2969 "#define A\n" 2970 " y;", 2971 format("int x,\n#define A\ny;")); 2972 } 2973 2974 TEST_F(FormatTest, HashInMacroDefinition) { 2975 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2976 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2977 verifyFormat("#define A \\\n" 2978 " { \\\n" 2979 " f(#c); \\\n" 2980 " }", 2981 getLLVMStyleWithColumns(11)); 2982 2983 verifyFormat("#define A(X) \\\n" 2984 " void function##X()", 2985 getLLVMStyleWithColumns(22)); 2986 2987 verifyFormat("#define A(a, b, c) \\\n" 2988 " void a##b##c()", 2989 getLLVMStyleWithColumns(22)); 2990 2991 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2992 } 2993 2994 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2995 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2996 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2997 2998 FormatStyle Style = getLLVMStyle(); 2999 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 3000 verifyFormat("#define true ((foo)1)", Style); 3001 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 3002 verifyFormat("#define false((foo)0)", Style); 3003 } 3004 3005 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 3006 EXPECT_EQ("#define A b;", format("#define A \\\n" 3007 " \\\n" 3008 " b;", 3009 getLLVMStyleWithColumns(25))); 3010 EXPECT_EQ("#define A \\\n" 3011 " \\\n" 3012 " a; \\\n" 3013 " b;", 3014 format("#define A \\\n" 3015 " \\\n" 3016 " a; \\\n" 3017 " b;", 3018 getLLVMStyleWithColumns(11))); 3019 EXPECT_EQ("#define A \\\n" 3020 " a; \\\n" 3021 " \\\n" 3022 " b;", 3023 format("#define A \\\n" 3024 " a; \\\n" 3025 " \\\n" 3026 " b;", 3027 getLLVMStyleWithColumns(11))); 3028 } 3029 3030 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 3031 verifyIncompleteFormat("#define A :"); 3032 verifyFormat("#define SOMECASES \\\n" 3033 " case 1: \\\n" 3034 " case 2\n", 3035 getLLVMStyleWithColumns(20)); 3036 verifyFormat("#define MACRO(a) \\\n" 3037 " if (a) \\\n" 3038 " f(); \\\n" 3039 " else \\\n" 3040 " g()", 3041 getLLVMStyleWithColumns(18)); 3042 verifyFormat("#define A template <typename T>"); 3043 verifyIncompleteFormat("#define STR(x) #x\n" 3044 "f(STR(this_is_a_string_literal{));"); 3045 verifyFormat("#pragma omp threadprivate( \\\n" 3046 " y)), // expected-warning", 3047 getLLVMStyleWithColumns(28)); 3048 verifyFormat("#d, = };"); 3049 verifyFormat("#if \"a"); 3050 verifyIncompleteFormat("({\n" 3051 "#define b \\\n" 3052 " } \\\n" 3053 " a\n" 3054 "a", 3055 getLLVMStyleWithColumns(15)); 3056 verifyFormat("#define A \\\n" 3057 " { \\\n" 3058 " {\n" 3059 "#define B \\\n" 3060 " } \\\n" 3061 " }", 3062 getLLVMStyleWithColumns(15)); 3063 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 3064 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 3065 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 3066 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 3067 } 3068 3069 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 3070 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 3071 EXPECT_EQ("class A : public QObject {\n" 3072 " Q_OBJECT\n" 3073 "\n" 3074 " A() {}\n" 3075 "};", 3076 format("class A : public QObject {\n" 3077 " Q_OBJECT\n" 3078 "\n" 3079 " A() {\n}\n" 3080 "} ;")); 3081 EXPECT_EQ("MACRO\n" 3082 "/*static*/ int i;", 3083 format("MACRO\n" 3084 " /*static*/ int i;")); 3085 EXPECT_EQ("SOME_MACRO\n" 3086 "namespace {\n" 3087 "void f();\n" 3088 "} // namespace", 3089 format("SOME_MACRO\n" 3090 " namespace {\n" 3091 "void f( );\n" 3092 "} // namespace")); 3093 // Only if the identifier contains at least 5 characters. 3094 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 3095 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 3096 // Only if everything is upper case. 3097 EXPECT_EQ("class A : public QObject {\n" 3098 " Q_Object A() {}\n" 3099 "};", 3100 format("class A : public QObject {\n" 3101 " Q_Object\n" 3102 " A() {\n}\n" 3103 "} ;")); 3104 3105 // Only if the next line can actually start an unwrapped line. 3106 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 3107 format("SOME_WEIRD_LOG_MACRO\n" 3108 "<< SomeThing;")); 3109 3110 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 3111 "(n, buffers))\n", 3112 getChromiumStyle(FormatStyle::LK_Cpp)); 3113 3114 // See PR41483 3115 EXPECT_EQ("/**/ FOO(a)\n" 3116 "FOO(b)", 3117 format("/**/ FOO(a)\n" 3118 "FOO(b)")); 3119 } 3120 3121 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 3122 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3123 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3124 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3125 "class X {};\n" 3126 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3127 "int *createScopDetectionPass() { return 0; }", 3128 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3129 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3130 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3131 " class X {};\n" 3132 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3133 " int *createScopDetectionPass() { return 0; }")); 3134 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 3135 // braces, so that inner block is indented one level more. 3136 EXPECT_EQ("int q() {\n" 3137 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3138 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3139 " IPC_END_MESSAGE_MAP()\n" 3140 "}", 3141 format("int q() {\n" 3142 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3143 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3144 " IPC_END_MESSAGE_MAP()\n" 3145 "}")); 3146 3147 // Same inside macros. 3148 EXPECT_EQ("#define LIST(L) \\\n" 3149 " L(A) \\\n" 3150 " L(B) \\\n" 3151 " L(C)", 3152 format("#define LIST(L) \\\n" 3153 " L(A) \\\n" 3154 " L(B) \\\n" 3155 " L(C)", 3156 getGoogleStyle())); 3157 3158 // These must not be recognized as macros. 3159 EXPECT_EQ("int q() {\n" 3160 " f(x);\n" 3161 " f(x) {}\n" 3162 " f(x)->g();\n" 3163 " f(x)->*g();\n" 3164 " f(x).g();\n" 3165 " f(x) = x;\n" 3166 " f(x) += x;\n" 3167 " f(x) -= x;\n" 3168 " f(x) *= x;\n" 3169 " f(x) /= x;\n" 3170 " f(x) %= x;\n" 3171 " f(x) &= x;\n" 3172 " f(x) |= x;\n" 3173 " f(x) ^= x;\n" 3174 " f(x) >>= x;\n" 3175 " f(x) <<= x;\n" 3176 " f(x)[y].z();\n" 3177 " LOG(INFO) << x;\n" 3178 " ifstream(x) >> x;\n" 3179 "}\n", 3180 format("int q() {\n" 3181 " f(x)\n;\n" 3182 " f(x)\n {}\n" 3183 " f(x)\n->g();\n" 3184 " f(x)\n->*g();\n" 3185 " f(x)\n.g();\n" 3186 " f(x)\n = x;\n" 3187 " f(x)\n += x;\n" 3188 " f(x)\n -= x;\n" 3189 " f(x)\n *= x;\n" 3190 " f(x)\n /= x;\n" 3191 " f(x)\n %= x;\n" 3192 " f(x)\n &= x;\n" 3193 " f(x)\n |= x;\n" 3194 " f(x)\n ^= x;\n" 3195 " f(x)\n >>= x;\n" 3196 " f(x)\n <<= x;\n" 3197 " f(x)\n[y].z();\n" 3198 " LOG(INFO)\n << x;\n" 3199 " ifstream(x)\n >> x;\n" 3200 "}\n")); 3201 EXPECT_EQ("int q() {\n" 3202 " F(x)\n" 3203 " if (1) {\n" 3204 " }\n" 3205 " F(x)\n" 3206 " while (1) {\n" 3207 " }\n" 3208 " F(x)\n" 3209 " G(x);\n" 3210 " F(x)\n" 3211 " try {\n" 3212 " Q();\n" 3213 " } catch (...) {\n" 3214 " }\n" 3215 "}\n", 3216 format("int q() {\n" 3217 "F(x)\n" 3218 "if (1) {}\n" 3219 "F(x)\n" 3220 "while (1) {}\n" 3221 "F(x)\n" 3222 "G(x);\n" 3223 "F(x)\n" 3224 "try { Q(); } catch (...) {}\n" 3225 "}\n")); 3226 EXPECT_EQ("class A {\n" 3227 " A() : t(0) {}\n" 3228 " A(int i) noexcept() : {}\n" 3229 " A(X x)\n" // FIXME: function-level try blocks are broken. 3230 " try : t(0) {\n" 3231 " } catch (...) {\n" 3232 " }\n" 3233 "};", 3234 format("class A {\n" 3235 " A()\n : t(0) {}\n" 3236 " A(int i)\n noexcept() : {}\n" 3237 " A(X x)\n" 3238 " try : t(0) {} catch (...) {}\n" 3239 "};")); 3240 FormatStyle Style = getLLVMStyle(); 3241 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3242 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3243 Style.BraceWrapping.AfterFunction = true; 3244 EXPECT_EQ("void f()\n" 3245 "try\n" 3246 "{\n" 3247 "}", 3248 format("void f() try {\n" 3249 "}", 3250 Style)); 3251 EXPECT_EQ("class SomeClass {\n" 3252 "public:\n" 3253 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3254 "};", 3255 format("class SomeClass {\n" 3256 "public:\n" 3257 " SomeClass()\n" 3258 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3259 "};")); 3260 EXPECT_EQ("class SomeClass {\n" 3261 "public:\n" 3262 " SomeClass()\n" 3263 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3264 "};", 3265 format("class SomeClass {\n" 3266 "public:\n" 3267 " SomeClass()\n" 3268 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3269 "};", 3270 getLLVMStyleWithColumns(40))); 3271 3272 verifyFormat("MACRO(>)"); 3273 3274 // Some macros contain an implicit semicolon. 3275 Style = getLLVMStyle(); 3276 Style.StatementMacros.push_back("FOO"); 3277 verifyFormat("FOO(a) int b = 0;"); 3278 verifyFormat("FOO(a)\n" 3279 "int b = 0;", 3280 Style); 3281 verifyFormat("FOO(a);\n" 3282 "int b = 0;", 3283 Style); 3284 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3285 "int b = 0;", 3286 Style); 3287 verifyFormat("FOO()\n" 3288 "int b = 0;", 3289 Style); 3290 verifyFormat("FOO\n" 3291 "int b = 0;", 3292 Style); 3293 verifyFormat("void f() {\n" 3294 " FOO(a)\n" 3295 " return a;\n" 3296 "}", 3297 Style); 3298 verifyFormat("FOO(a)\n" 3299 "FOO(b)", 3300 Style); 3301 verifyFormat("int a = 0;\n" 3302 "FOO(b)\n" 3303 "int c = 0;", 3304 Style); 3305 verifyFormat("int a = 0;\n" 3306 "int x = FOO(a)\n" 3307 "int b = 0;", 3308 Style); 3309 verifyFormat("void foo(int a) { FOO(a) }\n" 3310 "uint32_t bar() {}", 3311 Style); 3312 } 3313 3314 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3315 verifyFormat("#define A \\\n" 3316 " f({ \\\n" 3317 " g(); \\\n" 3318 " });", 3319 getLLVMStyleWithColumns(11)); 3320 } 3321 3322 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3323 FormatStyle Style = getLLVMStyle(); 3324 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3325 Style.ColumnLimit = 40; 3326 verifyFormat("#ifdef _WIN32\n" 3327 "#define A 0\n" 3328 "#ifdef VAR2\n" 3329 "#define B 1\n" 3330 "#include <someheader.h>\n" 3331 "#define MACRO \\\n" 3332 " some_very_long_func_aaaaaaaaaa();\n" 3333 "#endif\n" 3334 "#else\n" 3335 "#define A 1\n" 3336 "#endif", 3337 Style); 3338 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3339 verifyFormat("#ifdef _WIN32\n" 3340 "# define A 0\n" 3341 "# ifdef VAR2\n" 3342 "# define B 1\n" 3343 "# include <someheader.h>\n" 3344 "# define MACRO \\\n" 3345 " some_very_long_func_aaaaaaaaaa();\n" 3346 "# endif\n" 3347 "#else\n" 3348 "# define A 1\n" 3349 "#endif", 3350 Style); 3351 verifyFormat("#if A\n" 3352 "# define MACRO \\\n" 3353 " void a(int x) { \\\n" 3354 " b(); \\\n" 3355 " c(); \\\n" 3356 " d(); \\\n" 3357 " e(); \\\n" 3358 " f(); \\\n" 3359 " }\n" 3360 "#endif", 3361 Style); 3362 // Comments before include guard. 3363 verifyFormat("// file comment\n" 3364 "// file comment\n" 3365 "#ifndef HEADER_H\n" 3366 "#define HEADER_H\n" 3367 "code();\n" 3368 "#endif", 3369 Style); 3370 // Test with include guards. 3371 verifyFormat("#ifndef HEADER_H\n" 3372 "#define HEADER_H\n" 3373 "code();\n" 3374 "#endif", 3375 Style); 3376 // Include guards must have a #define with the same variable immediately 3377 // after #ifndef. 3378 verifyFormat("#ifndef NOT_GUARD\n" 3379 "# define FOO\n" 3380 "code();\n" 3381 "#endif", 3382 Style); 3383 3384 // Include guards must cover the entire file. 3385 verifyFormat("code();\n" 3386 "code();\n" 3387 "#ifndef NOT_GUARD\n" 3388 "# define NOT_GUARD\n" 3389 "code();\n" 3390 "#endif", 3391 Style); 3392 verifyFormat("#ifndef NOT_GUARD\n" 3393 "# define NOT_GUARD\n" 3394 "code();\n" 3395 "#endif\n" 3396 "code();", 3397 Style); 3398 // Test with trailing blank lines. 3399 verifyFormat("#ifndef HEADER_H\n" 3400 "#define HEADER_H\n" 3401 "code();\n" 3402 "#endif\n", 3403 Style); 3404 // Include guards don't have #else. 3405 verifyFormat("#ifndef NOT_GUARD\n" 3406 "# define NOT_GUARD\n" 3407 "code();\n" 3408 "#else\n" 3409 "#endif", 3410 Style); 3411 verifyFormat("#ifndef NOT_GUARD\n" 3412 "# define NOT_GUARD\n" 3413 "code();\n" 3414 "#elif FOO\n" 3415 "#endif", 3416 Style); 3417 // Non-identifier #define after potential include guard. 3418 verifyFormat("#ifndef FOO\n" 3419 "# define 1\n" 3420 "#endif\n", 3421 Style); 3422 // #if closes past last non-preprocessor line. 3423 verifyFormat("#ifndef FOO\n" 3424 "#define FOO\n" 3425 "#if 1\n" 3426 "int i;\n" 3427 "# define A 0\n" 3428 "#endif\n" 3429 "#endif\n", 3430 Style); 3431 // Don't crash if there is an #elif directive without a condition. 3432 verifyFormat("#if 1\n" 3433 "int x;\n" 3434 "#elif\n" 3435 "int y;\n" 3436 "#else\n" 3437 "int z;\n" 3438 "#endif", 3439 Style); 3440 // FIXME: This doesn't handle the case where there's code between the 3441 // #ifndef and #define but all other conditions hold. This is because when 3442 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3443 // previous code line yet, so we can't detect it. 3444 EXPECT_EQ("#ifndef NOT_GUARD\n" 3445 "code();\n" 3446 "#define NOT_GUARD\n" 3447 "code();\n" 3448 "#endif", 3449 format("#ifndef NOT_GUARD\n" 3450 "code();\n" 3451 "# define NOT_GUARD\n" 3452 "code();\n" 3453 "#endif", 3454 Style)); 3455 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3456 // be outside an include guard. Examples are #pragma once and 3457 // #pragma GCC diagnostic, or anything else that does not change the meaning 3458 // of the file if it's included multiple times. 3459 EXPECT_EQ("#ifdef WIN32\n" 3460 "# pragma once\n" 3461 "#endif\n" 3462 "#ifndef HEADER_H\n" 3463 "# define HEADER_H\n" 3464 "code();\n" 3465 "#endif", 3466 format("#ifdef WIN32\n" 3467 "# pragma once\n" 3468 "#endif\n" 3469 "#ifndef HEADER_H\n" 3470 "#define HEADER_H\n" 3471 "code();\n" 3472 "#endif", 3473 Style)); 3474 // FIXME: This does not detect when there is a single non-preprocessor line 3475 // in front of an include-guard-like structure where other conditions hold 3476 // because ScopedLineState hides the line. 3477 EXPECT_EQ("code();\n" 3478 "#ifndef HEADER_H\n" 3479 "#define HEADER_H\n" 3480 "code();\n" 3481 "#endif", 3482 format("code();\n" 3483 "#ifndef HEADER_H\n" 3484 "# define HEADER_H\n" 3485 "code();\n" 3486 "#endif", 3487 Style)); 3488 // Keep comments aligned with #, otherwise indent comments normally. These 3489 // tests cannot use verifyFormat because messUp manipulates leading 3490 // whitespace. 3491 { 3492 const char *Expected = "" 3493 "void f() {\n" 3494 "#if 1\n" 3495 "// Preprocessor aligned.\n" 3496 "# define A 0\n" 3497 " // Code. Separated by blank line.\n" 3498 "\n" 3499 "# define B 0\n" 3500 " // Code. Not aligned with #\n" 3501 "# define C 0\n" 3502 "#endif"; 3503 const char *ToFormat = "" 3504 "void f() {\n" 3505 "#if 1\n" 3506 "// Preprocessor aligned.\n" 3507 "# define A 0\n" 3508 "// Code. Separated by blank line.\n" 3509 "\n" 3510 "# define B 0\n" 3511 " // Code. Not aligned with #\n" 3512 "# define C 0\n" 3513 "#endif"; 3514 EXPECT_EQ(Expected, format(ToFormat, Style)); 3515 EXPECT_EQ(Expected, format(Expected, Style)); 3516 } 3517 // Keep block quotes aligned. 3518 { 3519 const char *Expected = "" 3520 "void f() {\n" 3521 "#if 1\n" 3522 "/* Preprocessor aligned. */\n" 3523 "# define A 0\n" 3524 " /* Code. Separated by blank line. */\n" 3525 "\n" 3526 "# define B 0\n" 3527 " /* Code. Not aligned with # */\n" 3528 "# define C 0\n" 3529 "#endif"; 3530 const char *ToFormat = "" 3531 "void f() {\n" 3532 "#if 1\n" 3533 "/* Preprocessor aligned. */\n" 3534 "# define A 0\n" 3535 "/* Code. Separated by blank line. */\n" 3536 "\n" 3537 "# define B 0\n" 3538 " /* Code. Not aligned with # */\n" 3539 "# define C 0\n" 3540 "#endif"; 3541 EXPECT_EQ(Expected, format(ToFormat, Style)); 3542 EXPECT_EQ(Expected, format(Expected, Style)); 3543 } 3544 // Keep comments aligned with un-indented directives. 3545 { 3546 const char *Expected = "" 3547 "void f() {\n" 3548 "// Preprocessor aligned.\n" 3549 "#define A 0\n" 3550 " // Code. Separated by blank line.\n" 3551 "\n" 3552 "#define B 0\n" 3553 " // Code. Not aligned with #\n" 3554 "#define C 0\n"; 3555 const char *ToFormat = "" 3556 "void f() {\n" 3557 "// Preprocessor aligned.\n" 3558 "#define A 0\n" 3559 "// Code. Separated by blank line.\n" 3560 "\n" 3561 "#define B 0\n" 3562 " // Code. Not aligned with #\n" 3563 "#define C 0\n"; 3564 EXPECT_EQ(Expected, format(ToFormat, Style)); 3565 EXPECT_EQ(Expected, format(Expected, Style)); 3566 } 3567 // Test AfterHash with tabs. 3568 { 3569 FormatStyle Tabbed = Style; 3570 Tabbed.UseTab = FormatStyle::UT_Always; 3571 Tabbed.IndentWidth = 8; 3572 Tabbed.TabWidth = 8; 3573 verifyFormat("#ifdef _WIN32\n" 3574 "#\tdefine A 0\n" 3575 "#\tifdef VAR2\n" 3576 "#\t\tdefine B 1\n" 3577 "#\t\tinclude <someheader.h>\n" 3578 "#\t\tdefine MACRO \\\n" 3579 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3580 "#\tendif\n" 3581 "#else\n" 3582 "#\tdefine A 1\n" 3583 "#endif", 3584 Tabbed); 3585 } 3586 3587 // Regression test: Multiline-macro inside include guards. 3588 verifyFormat("#ifndef HEADER_H\n" 3589 "#define HEADER_H\n" 3590 "#define A() \\\n" 3591 " int i; \\\n" 3592 " int j;\n" 3593 "#endif // HEADER_H", 3594 getLLVMStyleWithColumns(20)); 3595 3596 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3597 // Basic before hash indent tests 3598 verifyFormat("#ifdef _WIN32\n" 3599 " #define A 0\n" 3600 " #ifdef VAR2\n" 3601 " #define B 1\n" 3602 " #include <someheader.h>\n" 3603 " #define MACRO \\\n" 3604 " some_very_long_func_aaaaaaaaaa();\n" 3605 " #endif\n" 3606 "#else\n" 3607 " #define A 1\n" 3608 "#endif", 3609 Style); 3610 verifyFormat("#if A\n" 3611 " #define MACRO \\\n" 3612 " void a(int x) { \\\n" 3613 " b(); \\\n" 3614 " c(); \\\n" 3615 " d(); \\\n" 3616 " e(); \\\n" 3617 " f(); \\\n" 3618 " }\n" 3619 "#endif", 3620 Style); 3621 // Keep comments aligned with indented directives. These 3622 // tests cannot use verifyFormat because messUp manipulates leading 3623 // whitespace. 3624 { 3625 const char *Expected = "void f() {\n" 3626 "// Aligned to preprocessor.\n" 3627 "#if 1\n" 3628 " // Aligned to code.\n" 3629 " int a;\n" 3630 " #if 1\n" 3631 " // Aligned to preprocessor.\n" 3632 " #define A 0\n" 3633 " // Aligned to code.\n" 3634 " int b;\n" 3635 " #endif\n" 3636 "#endif\n" 3637 "}"; 3638 const char *ToFormat = "void f() {\n" 3639 "// Aligned to preprocessor.\n" 3640 "#if 1\n" 3641 "// Aligned to code.\n" 3642 "int a;\n" 3643 "#if 1\n" 3644 "// Aligned to preprocessor.\n" 3645 "#define A 0\n" 3646 "// Aligned to code.\n" 3647 "int b;\n" 3648 "#endif\n" 3649 "#endif\n" 3650 "}"; 3651 EXPECT_EQ(Expected, format(ToFormat, Style)); 3652 EXPECT_EQ(Expected, format(Expected, Style)); 3653 } 3654 { 3655 const char *Expected = "void f() {\n" 3656 "/* Aligned to preprocessor. */\n" 3657 "#if 1\n" 3658 " /* Aligned to code. */\n" 3659 " int a;\n" 3660 " #if 1\n" 3661 " /* Aligned to preprocessor. */\n" 3662 " #define A 0\n" 3663 " /* Aligned to code. */\n" 3664 " int b;\n" 3665 " #endif\n" 3666 "#endif\n" 3667 "}"; 3668 const char *ToFormat = "void f() {\n" 3669 "/* Aligned to preprocessor. */\n" 3670 "#if 1\n" 3671 "/* Aligned to code. */\n" 3672 "int a;\n" 3673 "#if 1\n" 3674 "/* Aligned to preprocessor. */\n" 3675 "#define A 0\n" 3676 "/* Aligned to code. */\n" 3677 "int b;\n" 3678 "#endif\n" 3679 "#endif\n" 3680 "}"; 3681 EXPECT_EQ(Expected, format(ToFormat, Style)); 3682 EXPECT_EQ(Expected, format(Expected, Style)); 3683 } 3684 3685 // Test single comment before preprocessor 3686 verifyFormat("// Comment\n" 3687 "\n" 3688 "#if 1\n" 3689 "#endif", 3690 Style); 3691 } 3692 3693 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3694 verifyFormat("{\n { a #c; }\n}"); 3695 } 3696 3697 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3698 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3699 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3700 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3701 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3702 } 3703 3704 TEST_F(FormatTest, EscapedNewlines) { 3705 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3706 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3707 format("#define A \\\nint i;\\\n int j;", Narrow)); 3708 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3709 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3710 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3711 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3712 3713 FormatStyle AlignLeft = getLLVMStyle(); 3714 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3715 EXPECT_EQ("#define MACRO(x) \\\n" 3716 "private: \\\n" 3717 " int x(int a);\n", 3718 format("#define MACRO(x) \\\n" 3719 "private: \\\n" 3720 " int x(int a);\n", 3721 AlignLeft)); 3722 3723 // CRLF line endings 3724 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3725 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3726 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3727 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3728 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3729 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3730 EXPECT_EQ("#define MACRO(x) \\\r\n" 3731 "private: \\\r\n" 3732 " int x(int a);\r\n", 3733 format("#define MACRO(x) \\\r\n" 3734 "private: \\\r\n" 3735 " int x(int a);\r\n", 3736 AlignLeft)); 3737 3738 FormatStyle DontAlign = getLLVMStyle(); 3739 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3740 DontAlign.MaxEmptyLinesToKeep = 3; 3741 // FIXME: can't use verifyFormat here because the newline before 3742 // "public:" is not inserted the first time it's reformatted 3743 EXPECT_EQ("#define A \\\n" 3744 " class Foo { \\\n" 3745 " void bar(); \\\n" 3746 "\\\n" 3747 "\\\n" 3748 "\\\n" 3749 " public: \\\n" 3750 " void baz(); \\\n" 3751 " };", 3752 format("#define A \\\n" 3753 " class Foo { \\\n" 3754 " void bar(); \\\n" 3755 "\\\n" 3756 "\\\n" 3757 "\\\n" 3758 " public: \\\n" 3759 " void baz(); \\\n" 3760 " };", 3761 DontAlign)); 3762 } 3763 3764 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3765 verifyFormat("#define A \\\n" 3766 " int v( \\\n" 3767 " a); \\\n" 3768 " int i;", 3769 getLLVMStyleWithColumns(11)); 3770 } 3771 3772 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3773 EXPECT_EQ( 3774 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3775 " \\\n" 3776 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3777 "\n" 3778 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3779 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3780 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3781 "\\\n" 3782 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3783 " \n" 3784 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3785 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3786 } 3787 3788 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3789 EXPECT_EQ("int\n" 3790 "#define A\n" 3791 " a;", 3792 format("int\n#define A\na;")); 3793 verifyFormat("functionCallTo(\n" 3794 " someOtherFunction(\n" 3795 " withSomeParameters, whichInSequence,\n" 3796 " areLongerThanALine(andAnotherCall,\n" 3797 "#define A B\n" 3798 " withMoreParamters,\n" 3799 " whichStronglyInfluenceTheLayout),\n" 3800 " andMoreParameters),\n" 3801 " trailing);", 3802 getLLVMStyleWithColumns(69)); 3803 verifyFormat("Foo::Foo()\n" 3804 "#ifdef BAR\n" 3805 " : baz(0)\n" 3806 "#endif\n" 3807 "{\n" 3808 "}"); 3809 verifyFormat("void f() {\n" 3810 " if (true)\n" 3811 "#ifdef A\n" 3812 " f(42);\n" 3813 " x();\n" 3814 "#else\n" 3815 " g();\n" 3816 " x();\n" 3817 "#endif\n" 3818 "}"); 3819 verifyFormat("void f(param1, param2,\n" 3820 " param3,\n" 3821 "#ifdef A\n" 3822 " param4(param5,\n" 3823 "#ifdef A1\n" 3824 " param6,\n" 3825 "#ifdef A2\n" 3826 " param7),\n" 3827 "#else\n" 3828 " param8),\n" 3829 " param9,\n" 3830 "#endif\n" 3831 " param10,\n" 3832 "#endif\n" 3833 " param11)\n" 3834 "#else\n" 3835 " param12)\n" 3836 "#endif\n" 3837 "{\n" 3838 " x();\n" 3839 "}", 3840 getLLVMStyleWithColumns(28)); 3841 verifyFormat("#if 1\n" 3842 "int i;"); 3843 verifyFormat("#if 1\n" 3844 "#endif\n" 3845 "#if 1\n" 3846 "#else\n" 3847 "#endif\n"); 3848 verifyFormat("DEBUG({\n" 3849 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3851 "});\n" 3852 "#if a\n" 3853 "#else\n" 3854 "#endif"); 3855 3856 verifyIncompleteFormat("void f(\n" 3857 "#if A\n" 3858 ");\n" 3859 "#else\n" 3860 "#endif"); 3861 } 3862 3863 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3864 verifyFormat("#endif\n" 3865 "#if B"); 3866 } 3867 3868 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3869 FormatStyle SingleLine = getLLVMStyle(); 3870 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3871 verifyFormat("#if 0\n" 3872 "#elif 1\n" 3873 "#endif\n" 3874 "void foo() {\n" 3875 " if (test) foo2();\n" 3876 "}", 3877 SingleLine); 3878 } 3879 3880 TEST_F(FormatTest, LayoutBlockInsideParens) { 3881 verifyFormat("functionCall({ int i; });"); 3882 verifyFormat("functionCall({\n" 3883 " int i;\n" 3884 " int j;\n" 3885 "});"); 3886 verifyFormat("functionCall(\n" 3887 " {\n" 3888 " int i;\n" 3889 " int j;\n" 3890 " },\n" 3891 " aaaa, bbbb, cccc);"); 3892 verifyFormat("functionA(functionB({\n" 3893 " int i;\n" 3894 " int j;\n" 3895 " }),\n" 3896 " aaaa, bbbb, cccc);"); 3897 verifyFormat("functionCall(\n" 3898 " {\n" 3899 " int i;\n" 3900 " int j;\n" 3901 " },\n" 3902 " aaaa, bbbb, // comment\n" 3903 " cccc);"); 3904 verifyFormat("functionA(functionB({\n" 3905 " int i;\n" 3906 " int j;\n" 3907 " }),\n" 3908 " aaaa, bbbb, // comment\n" 3909 " cccc);"); 3910 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3911 verifyFormat("functionCall(aaaa, bbbb, {\n" 3912 " int i;\n" 3913 " int j;\n" 3914 "});"); 3915 verifyFormat( 3916 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3917 " {\n" 3918 " int i; // break\n" 3919 " },\n" 3920 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3921 " ccccccccccccccccc));"); 3922 verifyFormat("DEBUG({\n" 3923 " if (a)\n" 3924 " f();\n" 3925 "});"); 3926 } 3927 3928 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3929 EXPECT_EQ("SOME_MACRO { int i; }\n" 3930 "int i;", 3931 format(" SOME_MACRO {int i;} int i;")); 3932 } 3933 3934 TEST_F(FormatTest, LayoutNestedBlocks) { 3935 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3936 " struct s {\n" 3937 " int i;\n" 3938 " };\n" 3939 " s kBitsToOs[] = {{10}};\n" 3940 " for (int i = 0; i < 10; ++i)\n" 3941 " return;\n" 3942 "}"); 3943 verifyFormat("call(parameter, {\n" 3944 " something();\n" 3945 " // Comment using all columns.\n" 3946 " somethingelse();\n" 3947 "});", 3948 getLLVMStyleWithColumns(40)); 3949 verifyFormat("DEBUG( //\n" 3950 " { f(); }, a);"); 3951 verifyFormat("DEBUG( //\n" 3952 " {\n" 3953 " f(); //\n" 3954 " },\n" 3955 " a);"); 3956 3957 EXPECT_EQ("call(parameter, {\n" 3958 " something();\n" 3959 " // Comment too\n" 3960 " // looooooooooong.\n" 3961 " somethingElse();\n" 3962 "});", 3963 format("call(parameter, {\n" 3964 " something();\n" 3965 " // Comment too looooooooooong.\n" 3966 " somethingElse();\n" 3967 "});", 3968 getLLVMStyleWithColumns(29))); 3969 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3970 EXPECT_EQ("DEBUG({ // comment\n" 3971 " int i;\n" 3972 "});", 3973 format("DEBUG({ // comment\n" 3974 "int i;\n" 3975 "});")); 3976 EXPECT_EQ("DEBUG({\n" 3977 " int i;\n" 3978 "\n" 3979 " // comment\n" 3980 " int j;\n" 3981 "});", 3982 format("DEBUG({\n" 3983 " int i;\n" 3984 "\n" 3985 " // comment\n" 3986 " int j;\n" 3987 "});")); 3988 3989 verifyFormat("DEBUG({\n" 3990 " if (a)\n" 3991 " return;\n" 3992 "});"); 3993 verifyGoogleFormat("DEBUG({\n" 3994 " if (a) return;\n" 3995 "});"); 3996 FormatStyle Style = getGoogleStyle(); 3997 Style.ColumnLimit = 45; 3998 verifyFormat("Debug(\n" 3999 " aaaaa,\n" 4000 " {\n" 4001 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 4002 " },\n" 4003 " a);", 4004 Style); 4005 4006 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 4007 4008 verifyNoCrash("^{v^{a}}"); 4009 } 4010 4011 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 4012 EXPECT_EQ("#define MACRO() \\\n" 4013 " Debug(aaa, /* force line break */ \\\n" 4014 " { \\\n" 4015 " int i; \\\n" 4016 " int j; \\\n" 4017 " })", 4018 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 4019 " { int i; int j; })", 4020 getGoogleStyle())); 4021 4022 EXPECT_EQ("#define A \\\n" 4023 " [] { \\\n" 4024 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4025 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 4026 " }", 4027 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4028 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 4029 getGoogleStyle())); 4030 } 4031 4032 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 4033 EXPECT_EQ("{}", format("{}")); 4034 verifyFormat("enum E {};"); 4035 verifyFormat("enum E {}"); 4036 FormatStyle Style = getLLVMStyle(); 4037 Style.SpaceInEmptyBlock = true; 4038 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 4039 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 4040 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 4041 } 4042 4043 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 4044 FormatStyle Style = getLLVMStyle(); 4045 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 4046 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 4047 verifyFormat("FOO_BEGIN\n" 4048 " FOO_ENTRY\n" 4049 "FOO_END", 4050 Style); 4051 verifyFormat("FOO_BEGIN\n" 4052 " NESTED_FOO_BEGIN\n" 4053 " NESTED_FOO_ENTRY\n" 4054 " NESTED_FOO_END\n" 4055 "FOO_END", 4056 Style); 4057 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 4058 " int x;\n" 4059 " x = 1;\n" 4060 "FOO_END(Baz)", 4061 Style); 4062 } 4063 4064 //===----------------------------------------------------------------------===// 4065 // Line break tests. 4066 //===----------------------------------------------------------------------===// 4067 4068 TEST_F(FormatTest, PreventConfusingIndents) { 4069 verifyFormat( 4070 "void f() {\n" 4071 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 4072 " parameter, parameter, parameter)),\n" 4073 " SecondLongCall(parameter));\n" 4074 "}"); 4075 verifyFormat( 4076 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4077 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4079 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 4080 verifyFormat( 4081 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4082 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 4083 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 4084 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 4085 verifyFormat( 4086 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 4087 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 4088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 4089 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 4090 verifyFormat("int a = bbbb && ccc &&\n" 4091 " fffff(\n" 4092 "#define A Just forcing a new line\n" 4093 " ddd);"); 4094 } 4095 4096 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 4097 verifyFormat( 4098 "bool aaaaaaa =\n" 4099 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 4100 " bbbbbbbb();"); 4101 verifyFormat( 4102 "bool aaaaaaa =\n" 4103 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 4104 " bbbbbbbb();"); 4105 4106 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 4108 " ccccccccc == ddddddddddd;"); 4109 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 4111 " ccccccccc == ddddddddddd;"); 4112 verifyFormat( 4113 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 4114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 4115 " ccccccccc == ddddddddddd;"); 4116 4117 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4118 " aaaaaa) &&\n" 4119 " bbbbbb && cccccc;"); 4120 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4121 " aaaaaa) >>\n" 4122 " bbbbbb;"); 4123 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 4124 " SourceMgr.getSpellingColumnNumber(\n" 4125 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 4126 " 1);"); 4127 4128 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4129 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 4130 " cccccc) {\n}"); 4131 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4132 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4133 " cccccc) {\n}"); 4134 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4135 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4136 " cccccc) {\n}"); 4137 verifyFormat("b = a &&\n" 4138 " // Comment\n" 4139 " b.c && d;"); 4140 4141 // If the LHS of a comparison is not a binary expression itself, the 4142 // additional linebreak confuses many people. 4143 verifyFormat( 4144 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 4146 "}"); 4147 verifyFormat( 4148 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4150 "}"); 4151 verifyFormat( 4152 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 4153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4154 "}"); 4155 verifyFormat( 4156 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 4158 "}"); 4159 // Even explicit parentheses stress the precedence enough to make the 4160 // additional break unnecessary. 4161 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4163 "}"); 4164 // This cases is borderline, but with the indentation it is still readable. 4165 verifyFormat( 4166 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4167 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4169 "}", 4170 getLLVMStyleWithColumns(75)); 4171 4172 // If the LHS is a binary expression, we should still use the additional break 4173 // as otherwise the formatting hides the operator precedence. 4174 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4176 " 5) {\n" 4177 "}"); 4178 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4179 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4180 " 5) {\n" 4181 "}"); 4182 4183 FormatStyle OnePerLine = getLLVMStyle(); 4184 OnePerLine.BinPackParameters = false; 4185 verifyFormat( 4186 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4189 OnePerLine); 4190 4191 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4192 " .aaa(aaaaaaaaaaaaa) *\n" 4193 " aaaaaaa +\n" 4194 " aaaaaaa;", 4195 getLLVMStyleWithColumns(40)); 4196 } 4197 4198 TEST_F(FormatTest, ExpressionIndentation) { 4199 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4201 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4202 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4203 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4204 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4205 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4206 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4207 " ccccccccccccccccccccccccccccccccccccccccc;"); 4208 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4209 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4211 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4212 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4215 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4216 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4219 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4220 verifyFormat("if () {\n" 4221 "} else if (aaaaa && bbbbb > // break\n" 4222 " ccccc) {\n" 4223 "}"); 4224 verifyFormat("if () {\n" 4225 "} else if constexpr (aaaaa && bbbbb > // break\n" 4226 " ccccc) {\n" 4227 "}"); 4228 verifyFormat("if () {\n" 4229 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4230 " ccccc) {\n" 4231 "}"); 4232 verifyFormat("if () {\n" 4233 "} else if (aaaaa &&\n" 4234 " bbbbb > // break\n" 4235 " ccccc &&\n" 4236 " ddddd) {\n" 4237 "}"); 4238 4239 // Presence of a trailing comment used to change indentation of b. 4240 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4241 " b;\n" 4242 "return aaaaaaaaaaaaaaaaaaa +\n" 4243 " b; //", 4244 getLLVMStyleWithColumns(30)); 4245 } 4246 4247 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4248 // Not sure what the best system is here. Like this, the LHS can be found 4249 // immediately above an operator (everything with the same or a higher 4250 // indent). The RHS is aligned right of the operator and so compasses 4251 // everything until something with the same indent as the operator is found. 4252 // FIXME: Is this a good system? 4253 FormatStyle Style = getLLVMStyle(); 4254 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4255 verifyFormat( 4256 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4257 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4258 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4259 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4260 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4261 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4262 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4263 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4264 " > ccccccccccccccccccccccccccccccccccccccccc;", 4265 Style); 4266 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4267 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4268 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4269 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4270 Style); 4271 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4272 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4273 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4274 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4275 Style); 4276 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4277 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4278 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4279 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4280 Style); 4281 verifyFormat("if () {\n" 4282 "} else if (aaaaa\n" 4283 " && bbbbb // break\n" 4284 " > ccccc) {\n" 4285 "}", 4286 Style); 4287 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4288 " && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4289 Style); 4290 verifyFormat("return (a)\n" 4291 " // comment\n" 4292 " + b;", 4293 Style); 4294 verifyFormat( 4295 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4296 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4297 " + cc;", 4298 Style); 4299 4300 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4301 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4302 Style); 4303 4304 // Forced by comments. 4305 verifyFormat( 4306 "unsigned ContentSize =\n" 4307 " sizeof(int16_t) // DWARF ARange version number\n" 4308 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4309 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4310 " + sizeof(int8_t); // Segment Size (in bytes)"); 4311 4312 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4313 " == boost::fusion::at_c<1>(iiii).second;", 4314 Style); 4315 4316 Style.ColumnLimit = 60; 4317 verifyFormat("zzzzzzzzzz\n" 4318 " = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4319 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4320 Style); 4321 4322 Style.ColumnLimit = 80; 4323 Style.IndentWidth = 4; 4324 Style.TabWidth = 4; 4325 Style.UseTab = FormatStyle::UT_Always; 4326 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4327 Style.AlignOperands = FormatStyle::OAS_DontAlign; 4328 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4329 "\t&& (someOtherLongishConditionPart1\n" 4330 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4331 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4332 "(someOtherLongishConditionPart1 || " 4333 "someOtherEvenLongerNestedConditionPart2);", 4334 Style)); 4335 } 4336 4337 TEST_F(FormatTest, ExpressionIndentationStrictAlign) { 4338 FormatStyle Style = getLLVMStyle(); 4339 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4340 Style.AlignOperands = FormatStyle::OAS_AlignAfterOperator; 4341 4342 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4343 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4344 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4345 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4346 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4347 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4348 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4349 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4350 " > ccccccccccccccccccccccccccccccccccccccccc;", 4351 Style); 4352 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4353 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4354 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4355 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4356 Style); 4357 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4358 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4359 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4360 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4361 Style); 4362 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4363 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4364 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4365 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4366 Style); 4367 verifyFormat("if () {\n" 4368 "} else if (aaaaa\n" 4369 " && bbbbb // break\n" 4370 " > ccccc) {\n" 4371 "}", 4372 Style); 4373 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4374 " && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4375 Style); 4376 verifyFormat("return (a)\n" 4377 " // comment\n" 4378 " + b;", 4379 Style); 4380 verifyFormat( 4381 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4382 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4383 " + cc;", 4384 Style); 4385 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 4386 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 4387 " : 3333333333333333;", 4388 Style); 4389 verifyFormat( 4390 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 4391 " : ccccccccccccccc ? dddddddddddddddddd\n" 4392 " : eeeeeeeeeeeeeeeeee)\n" 4393 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 4394 " : 3333333333333333;", 4395 Style); 4396 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4397 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4398 Style); 4399 4400 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4401 " == boost::fusion::at_c<1>(iiii).second;", 4402 Style); 4403 4404 Style.ColumnLimit = 60; 4405 verifyFormat("zzzzzzzzzzzzz\n" 4406 " = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4407 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4408 Style); 4409 4410 // Forced by comments. 4411 Style.ColumnLimit = 80; 4412 verifyFormat( 4413 "unsigned ContentSize\n" 4414 " = sizeof(int16_t) // DWARF ARange version number\n" 4415 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4416 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4417 " + sizeof(int8_t); // Segment Size (in bytes)", 4418 Style); 4419 4420 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4421 verifyFormat( 4422 "unsigned ContentSize =\n" 4423 " sizeof(int16_t) // DWARF ARange version number\n" 4424 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4425 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4426 " + sizeof(int8_t); // Segment Size (in bytes)", 4427 Style); 4428 4429 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4430 verifyFormat( 4431 "unsigned ContentSize =\n" 4432 " sizeof(int16_t) // DWARF ARange version number\n" 4433 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4434 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4435 " + sizeof(int8_t); // Segment Size (in bytes)", 4436 Style); 4437 } 4438 4439 TEST_F(FormatTest, EnforcedOperatorWraps) { 4440 // Here we'd like to wrap after the || operators, but a comment is forcing an 4441 // earlier wrap. 4442 verifyFormat("bool x = aaaaa //\n" 4443 " || bbbbb\n" 4444 " //\n" 4445 " || cccc;"); 4446 } 4447 4448 TEST_F(FormatTest, NoOperandAlignment) { 4449 FormatStyle Style = getLLVMStyle(); 4450 Style.AlignOperands = FormatStyle::OAS_DontAlign; 4451 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4452 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4454 Style); 4455 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4456 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4457 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4458 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4459 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4460 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4461 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4462 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4463 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4464 " > ccccccccccccccccccccccccccccccccccccccccc;", 4465 Style); 4466 4467 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4468 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4469 " + cc;", 4470 Style); 4471 verifyFormat("int a = aa\n" 4472 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4473 " * cccccccccccccccccccccccccccccccccccc;\n", 4474 Style); 4475 4476 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4477 verifyFormat("return (a > b\n" 4478 " // comment1\n" 4479 " // comment2\n" 4480 " || c);", 4481 Style); 4482 } 4483 4484 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4485 FormatStyle Style = getLLVMStyle(); 4486 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4487 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4488 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4489 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4490 Style); 4491 } 4492 4493 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4494 FormatStyle Style = getLLVMStyle(); 4495 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4496 Style.BinPackArguments = false; 4497 Style.ColumnLimit = 40; 4498 verifyFormat("void test() {\n" 4499 " someFunction(\n" 4500 " this + argument + is + quite\n" 4501 " + long + so + it + gets + wrapped\n" 4502 " + but + remains + bin - packed);\n" 4503 "}", 4504 Style); 4505 verifyFormat("void test() {\n" 4506 " someFunction(arg1,\n" 4507 " this + argument + is\n" 4508 " + quite + long + so\n" 4509 " + it + gets + wrapped\n" 4510 " + but + remains + bin\n" 4511 " - packed,\n" 4512 " arg3);\n" 4513 "}", 4514 Style); 4515 verifyFormat("void test() {\n" 4516 " someFunction(\n" 4517 " arg1,\n" 4518 " this + argument + has\n" 4519 " + anotherFunc(nested,\n" 4520 " calls + whose\n" 4521 " + arguments\n" 4522 " + are + also\n" 4523 " + wrapped,\n" 4524 " in + addition)\n" 4525 " + to + being + bin - packed,\n" 4526 " arg3);\n" 4527 "}", 4528 Style); 4529 4530 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4531 verifyFormat("void test() {\n" 4532 " someFunction(\n" 4533 " arg1,\n" 4534 " this + argument + has +\n" 4535 " anotherFunc(nested,\n" 4536 " calls + whose +\n" 4537 " arguments +\n" 4538 " are + also +\n" 4539 " wrapped,\n" 4540 " in + addition) +\n" 4541 " to + being + bin - packed,\n" 4542 " arg3);\n" 4543 "}", 4544 Style); 4545 } 4546 4547 TEST_F(FormatTest, ConstructorInitializers) { 4548 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4549 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4550 getLLVMStyleWithColumns(45)); 4551 verifyFormat("Constructor()\n" 4552 " : Inttializer(FitsOnTheLine) {}", 4553 getLLVMStyleWithColumns(44)); 4554 verifyFormat("Constructor()\n" 4555 " : Inttializer(FitsOnTheLine) {}", 4556 getLLVMStyleWithColumns(43)); 4557 4558 verifyFormat("template <typename T>\n" 4559 "Constructor() : Initializer(FitsOnTheLine) {}", 4560 getLLVMStyleWithColumns(45)); 4561 4562 verifyFormat( 4563 "SomeClass::Constructor()\n" 4564 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4565 4566 verifyFormat( 4567 "SomeClass::Constructor()\n" 4568 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4569 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4570 verifyFormat( 4571 "SomeClass::Constructor()\n" 4572 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4573 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4574 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4575 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4576 " : aaaaaaaaaa(aaaaaa) {}"); 4577 4578 verifyFormat("Constructor()\n" 4579 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4580 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4581 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4582 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4583 4584 verifyFormat("Constructor()\n" 4585 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4586 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4587 4588 verifyFormat("Constructor(int Parameter = 0)\n" 4589 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4590 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4591 verifyFormat("Constructor()\n" 4592 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4593 "}", 4594 getLLVMStyleWithColumns(60)); 4595 verifyFormat("Constructor()\n" 4596 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4597 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4598 4599 // Here a line could be saved by splitting the second initializer onto two 4600 // lines, but that is not desirable. 4601 verifyFormat("Constructor()\n" 4602 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4603 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4604 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4605 4606 FormatStyle OnePerLine = getLLVMStyle(); 4607 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4608 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4609 verifyFormat("SomeClass::Constructor()\n" 4610 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4611 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4612 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4613 OnePerLine); 4614 verifyFormat("SomeClass::Constructor()\n" 4615 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4616 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4617 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4618 OnePerLine); 4619 verifyFormat("MyClass::MyClass(int var)\n" 4620 " : some_var_(var), // 4 space indent\n" 4621 " some_other_var_(var + 1) { // lined up\n" 4622 "}", 4623 OnePerLine); 4624 verifyFormat("Constructor()\n" 4625 " : aaaaa(aaaaaa),\n" 4626 " aaaaa(aaaaaa),\n" 4627 " aaaaa(aaaaaa),\n" 4628 " aaaaa(aaaaaa),\n" 4629 " aaaaa(aaaaaa) {}", 4630 OnePerLine); 4631 verifyFormat("Constructor()\n" 4632 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4633 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4634 OnePerLine); 4635 OnePerLine.BinPackParameters = false; 4636 verifyFormat( 4637 "Constructor()\n" 4638 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4639 " aaaaaaaaaaa().aaa(),\n" 4640 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4641 OnePerLine); 4642 OnePerLine.ColumnLimit = 60; 4643 verifyFormat("Constructor()\n" 4644 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4645 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4646 OnePerLine); 4647 4648 EXPECT_EQ("Constructor()\n" 4649 " : // Comment forcing unwanted break.\n" 4650 " aaaa(aaaa) {}", 4651 format("Constructor() :\n" 4652 " // Comment forcing unwanted break.\n" 4653 " aaaa(aaaa) {}")); 4654 } 4655 4656 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4657 FormatStyle Style = getLLVMStyle(); 4658 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4659 Style.ColumnLimit = 60; 4660 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4661 Style.AllowAllConstructorInitializersOnNextLine = true; 4662 Style.BinPackParameters = false; 4663 4664 for (int i = 0; i < 4; ++i) { 4665 // Test all combinations of parameters that should not have an effect. 4666 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4667 Style.AllowAllArgumentsOnNextLine = i & 2; 4668 4669 Style.AllowAllConstructorInitializersOnNextLine = true; 4670 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4671 verifyFormat("Constructor()\n" 4672 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4673 Style); 4674 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4675 4676 Style.AllowAllConstructorInitializersOnNextLine = false; 4677 verifyFormat("Constructor()\n" 4678 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4679 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4680 Style); 4681 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4682 4683 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4684 Style.AllowAllConstructorInitializersOnNextLine = true; 4685 verifyFormat("Constructor()\n" 4686 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4687 Style); 4688 4689 Style.AllowAllConstructorInitializersOnNextLine = false; 4690 verifyFormat("Constructor()\n" 4691 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4692 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4693 Style); 4694 4695 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4696 Style.AllowAllConstructorInitializersOnNextLine = true; 4697 verifyFormat("Constructor() :\n" 4698 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4699 Style); 4700 4701 Style.AllowAllConstructorInitializersOnNextLine = false; 4702 verifyFormat("Constructor() :\n" 4703 " aaaaaaaaaaaaaaaaaa(a),\n" 4704 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4705 Style); 4706 } 4707 4708 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4709 // AllowAllConstructorInitializersOnNextLine in all 4710 // BreakConstructorInitializers modes 4711 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4712 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4713 Style.AllowAllConstructorInitializersOnNextLine = false; 4714 verifyFormat("SomeClassWithALongName::Constructor(\n" 4715 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4716 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4717 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4718 Style); 4719 4720 Style.AllowAllConstructorInitializersOnNextLine = true; 4721 verifyFormat("SomeClassWithALongName::Constructor(\n" 4722 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4723 " int bbbbbbbbbbbbb,\n" 4724 " int cccccccccccccccc)\n" 4725 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4726 Style); 4727 4728 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4729 Style.AllowAllConstructorInitializersOnNextLine = false; 4730 verifyFormat("SomeClassWithALongName::Constructor(\n" 4731 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4732 " int bbbbbbbbbbbbb)\n" 4733 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4734 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4735 Style); 4736 4737 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4738 4739 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4740 verifyFormat("SomeClassWithALongName::Constructor(\n" 4741 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4742 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4743 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4744 Style); 4745 4746 Style.AllowAllConstructorInitializersOnNextLine = true; 4747 verifyFormat("SomeClassWithALongName::Constructor(\n" 4748 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4749 " int bbbbbbbbbbbbb,\n" 4750 " int cccccccccccccccc)\n" 4751 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4752 Style); 4753 4754 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4755 Style.AllowAllConstructorInitializersOnNextLine = false; 4756 verifyFormat("SomeClassWithALongName::Constructor(\n" 4757 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4758 " int bbbbbbbbbbbbb)\n" 4759 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4760 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4761 Style); 4762 4763 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4764 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4765 verifyFormat("SomeClassWithALongName::Constructor(\n" 4766 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4767 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4768 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4769 Style); 4770 4771 Style.AllowAllConstructorInitializersOnNextLine = true; 4772 verifyFormat("SomeClassWithALongName::Constructor(\n" 4773 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4774 " int bbbbbbbbbbbbb,\n" 4775 " int cccccccccccccccc) :\n" 4776 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4777 Style); 4778 4779 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4780 Style.AllowAllConstructorInitializersOnNextLine = false; 4781 verifyFormat("SomeClassWithALongName::Constructor(\n" 4782 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4783 " int bbbbbbbbbbbbb) :\n" 4784 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4785 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4786 Style); 4787 } 4788 4789 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4790 FormatStyle Style = getLLVMStyle(); 4791 Style.ColumnLimit = 60; 4792 Style.BinPackArguments = false; 4793 for (int i = 0; i < 4; ++i) { 4794 // Test all combinations of parameters that should not have an effect. 4795 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4796 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4797 4798 Style.AllowAllArgumentsOnNextLine = true; 4799 verifyFormat("void foo() {\n" 4800 " FunctionCallWithReallyLongName(\n" 4801 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4802 "}", 4803 Style); 4804 Style.AllowAllArgumentsOnNextLine = false; 4805 verifyFormat("void foo() {\n" 4806 " FunctionCallWithReallyLongName(\n" 4807 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4808 " bbbbbbbbbbbb);\n" 4809 "}", 4810 Style); 4811 4812 Style.AllowAllArgumentsOnNextLine = true; 4813 verifyFormat("void foo() {\n" 4814 " auto VariableWithReallyLongName = {\n" 4815 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4816 "}", 4817 Style); 4818 Style.AllowAllArgumentsOnNextLine = false; 4819 verifyFormat("void foo() {\n" 4820 " auto VariableWithReallyLongName = {\n" 4821 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4822 " bbbbbbbbbbbb};\n" 4823 "}", 4824 Style); 4825 } 4826 4827 // This parameter should not affect declarations. 4828 Style.BinPackParameters = false; 4829 Style.AllowAllArgumentsOnNextLine = false; 4830 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4831 verifyFormat("void FunctionCallWithReallyLongName(\n" 4832 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4833 Style); 4834 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4835 verifyFormat("void FunctionCallWithReallyLongName(\n" 4836 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4837 " int bbbbbbbbbbbb);", 4838 Style); 4839 } 4840 4841 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4842 FormatStyle Style = getLLVMStyle(); 4843 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4844 4845 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4846 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4847 getStyleWithColumns(Style, 45)); 4848 verifyFormat("Constructor() :\n" 4849 " Initializer(FitsOnTheLine) {}", 4850 getStyleWithColumns(Style, 44)); 4851 verifyFormat("Constructor() :\n" 4852 " Initializer(FitsOnTheLine) {}", 4853 getStyleWithColumns(Style, 43)); 4854 4855 verifyFormat("template <typename T>\n" 4856 "Constructor() : Initializer(FitsOnTheLine) {}", 4857 getStyleWithColumns(Style, 50)); 4858 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4859 verifyFormat( 4860 "SomeClass::Constructor() :\n" 4861 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4862 Style); 4863 4864 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4865 verifyFormat( 4866 "SomeClass::Constructor() :\n" 4867 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4868 Style); 4869 4870 verifyFormat( 4871 "SomeClass::Constructor() :\n" 4872 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4873 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4874 Style); 4875 verifyFormat( 4876 "SomeClass::Constructor() :\n" 4877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4878 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4879 Style); 4880 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4881 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4882 " aaaaaaaaaa(aaaaaa) {}", 4883 Style); 4884 4885 verifyFormat("Constructor() :\n" 4886 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4887 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4888 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4889 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4890 Style); 4891 4892 verifyFormat("Constructor() :\n" 4893 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4894 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4895 Style); 4896 4897 verifyFormat("Constructor(int Parameter = 0) :\n" 4898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4899 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4900 Style); 4901 verifyFormat("Constructor() :\n" 4902 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4903 "}", 4904 getStyleWithColumns(Style, 60)); 4905 verifyFormat("Constructor() :\n" 4906 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4907 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4908 Style); 4909 4910 // Here a line could be saved by splitting the second initializer onto two 4911 // lines, but that is not desirable. 4912 verifyFormat("Constructor() :\n" 4913 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4914 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4915 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4916 Style); 4917 4918 FormatStyle OnePerLine = Style; 4919 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4920 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4921 verifyFormat("SomeClass::Constructor() :\n" 4922 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4923 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4924 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4925 OnePerLine); 4926 verifyFormat("SomeClass::Constructor() :\n" 4927 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4928 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4929 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4930 OnePerLine); 4931 verifyFormat("MyClass::MyClass(int var) :\n" 4932 " some_var_(var), // 4 space indent\n" 4933 " some_other_var_(var + 1) { // lined up\n" 4934 "}", 4935 OnePerLine); 4936 verifyFormat("Constructor() :\n" 4937 " aaaaa(aaaaaa),\n" 4938 " aaaaa(aaaaaa),\n" 4939 " aaaaa(aaaaaa),\n" 4940 " aaaaa(aaaaaa),\n" 4941 " aaaaa(aaaaaa) {}", 4942 OnePerLine); 4943 verifyFormat("Constructor() :\n" 4944 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4945 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4946 OnePerLine); 4947 OnePerLine.BinPackParameters = false; 4948 verifyFormat("Constructor() :\n" 4949 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4950 " aaaaaaaaaaa().aaa(),\n" 4951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4952 OnePerLine); 4953 OnePerLine.ColumnLimit = 60; 4954 verifyFormat("Constructor() :\n" 4955 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4956 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4957 OnePerLine); 4958 4959 EXPECT_EQ("Constructor() :\n" 4960 " // Comment forcing unwanted break.\n" 4961 " aaaa(aaaa) {}", 4962 format("Constructor() :\n" 4963 " // Comment forcing unwanted break.\n" 4964 " aaaa(aaaa) {}", 4965 Style)); 4966 4967 Style.ColumnLimit = 0; 4968 verifyFormat("SomeClass::Constructor() :\n" 4969 " a(a) {}", 4970 Style); 4971 verifyFormat("SomeClass::Constructor() noexcept :\n" 4972 " a(a) {}", 4973 Style); 4974 verifyFormat("SomeClass::Constructor() :\n" 4975 " a(a), b(b), c(c) {}", 4976 Style); 4977 verifyFormat("SomeClass::Constructor() :\n" 4978 " a(a) {\n" 4979 " foo();\n" 4980 " bar();\n" 4981 "}", 4982 Style); 4983 4984 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4985 verifyFormat("SomeClass::Constructor() :\n" 4986 " a(a), b(b), c(c) {\n" 4987 "}", 4988 Style); 4989 verifyFormat("SomeClass::Constructor() :\n" 4990 " a(a) {\n" 4991 "}", 4992 Style); 4993 4994 Style.ColumnLimit = 80; 4995 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4996 Style.ConstructorInitializerIndentWidth = 2; 4997 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 4998 verifyFormat("SomeClass::Constructor() :\n" 4999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5000 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 5001 Style); 5002 5003 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 5004 // well 5005 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 5006 verifyFormat( 5007 "class SomeClass\n" 5008 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5009 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5010 Style); 5011 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 5012 verifyFormat( 5013 "class SomeClass\n" 5014 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5015 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5016 Style); 5017 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 5018 verifyFormat( 5019 "class SomeClass :\n" 5020 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5021 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5022 Style); 5023 } 5024 5025 #ifndef EXPENSIVE_CHECKS 5026 // Expensive checks enables libstdc++ checking which includes validating the 5027 // state of ranges used in std::priority_queue - this blows out the 5028 // runtime/scalability of the function and makes this test unacceptably slow. 5029 TEST_F(FormatTest, MemoizationTests) { 5030 // This breaks if the memoization lookup does not take \c Indent and 5031 // \c LastSpace into account. 5032 verifyFormat( 5033 "extern CFRunLoopTimerRef\n" 5034 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 5035 " CFTimeInterval interval, CFOptionFlags flags,\n" 5036 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 5037 " CFRunLoopTimerContext *context) {}"); 5038 5039 // Deep nesting somewhat works around our memoization. 5040 verifyFormat( 5041 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5042 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5043 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5044 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5045 " aaaaa())))))))))))))))))))))))))))))))))))))));", 5046 getLLVMStyleWithColumns(65)); 5047 verifyFormat( 5048 "aaaaa(\n" 5049 " aaaaa,\n" 5050 " aaaaa(\n" 5051 " aaaaa,\n" 5052 " aaaaa(\n" 5053 " aaaaa,\n" 5054 " aaaaa(\n" 5055 " aaaaa,\n" 5056 " aaaaa(\n" 5057 " aaaaa,\n" 5058 " aaaaa(\n" 5059 " aaaaa,\n" 5060 " aaaaa(\n" 5061 " aaaaa,\n" 5062 " aaaaa(\n" 5063 " aaaaa,\n" 5064 " aaaaa(\n" 5065 " aaaaa,\n" 5066 " aaaaa(\n" 5067 " aaaaa,\n" 5068 " aaaaa(\n" 5069 " aaaaa,\n" 5070 " aaaaa(\n" 5071 " aaaaa,\n" 5072 " aaaaa))))))))))));", 5073 getLLVMStyleWithColumns(65)); 5074 verifyFormat( 5075 "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" 5076 " a),\n" 5077 " a),\n" 5078 " a),\n" 5079 " a),\n" 5080 " a),\n" 5081 " a),\n" 5082 " a),\n" 5083 " a),\n" 5084 " a),\n" 5085 " a),\n" 5086 " a),\n" 5087 " a),\n" 5088 " a),\n" 5089 " a),\n" 5090 " a),\n" 5091 " a),\n" 5092 " a)", 5093 getLLVMStyleWithColumns(65)); 5094 5095 // This test takes VERY long when memoization is broken. 5096 FormatStyle OnePerLine = getLLVMStyle(); 5097 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5098 OnePerLine.BinPackParameters = false; 5099 std::string input = "Constructor()\n" 5100 " : aaaa(a,\n"; 5101 for (unsigned i = 0, e = 80; i != e; ++i) { 5102 input += " a,\n"; 5103 } 5104 input += " a) {}"; 5105 verifyFormat(input, OnePerLine); 5106 } 5107 #endif 5108 5109 TEST_F(FormatTest, BreaksAsHighAsPossible) { 5110 verifyFormat( 5111 "void f() {\n" 5112 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 5113 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 5114 " f();\n" 5115 "}"); 5116 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 5117 " Intervals[i - 1].getRange().getLast()) {\n}"); 5118 } 5119 5120 TEST_F(FormatTest, BreaksFunctionDeclarations) { 5121 // Principially, we break function declarations in a certain order: 5122 // 1) break amongst arguments. 5123 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 5124 " Cccccccccccccc cccccccccccccc);"); 5125 verifyFormat("template <class TemplateIt>\n" 5126 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 5127 " TemplateIt *stop) {}"); 5128 5129 // 2) break after return type. 5130 verifyFormat( 5131 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5132 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 5133 getGoogleStyle()); 5134 5135 // 3) break after (. 5136 verifyFormat( 5137 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 5138 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 5139 getGoogleStyle()); 5140 5141 // 4) break before after nested name specifiers. 5142 verifyFormat( 5143 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5144 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 5145 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 5146 getGoogleStyle()); 5147 5148 // However, there are exceptions, if a sufficient amount of lines can be 5149 // saved. 5150 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 5151 // more adjusting. 5152 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5153 " Cccccccccccccc cccccccccc,\n" 5154 " Cccccccccccccc cccccccccc,\n" 5155 " Cccccccccccccc cccccccccc,\n" 5156 " Cccccccccccccc cccccccccc);"); 5157 verifyFormat( 5158 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5159 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5160 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5161 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 5162 getGoogleStyle()); 5163 verifyFormat( 5164 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5165 " Cccccccccccccc cccccccccc,\n" 5166 " Cccccccccccccc cccccccccc,\n" 5167 " Cccccccccccccc cccccccccc,\n" 5168 " Cccccccccccccc cccccccccc,\n" 5169 " Cccccccccccccc cccccccccc,\n" 5170 " Cccccccccccccc cccccccccc);"); 5171 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5172 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5173 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5174 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5175 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 5176 5177 // Break after multi-line parameters. 5178 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5179 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5181 " bbbb bbbb);"); 5182 verifyFormat("void SomeLoooooooooooongFunction(\n" 5183 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5184 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5185 " int bbbbbbbbbbbbb);"); 5186 5187 // Treat overloaded operators like other functions. 5188 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5189 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 5190 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5191 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 5192 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5193 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 5194 verifyGoogleFormat( 5195 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 5196 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5197 verifyGoogleFormat( 5198 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 5199 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5200 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5201 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5202 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 5203 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5204 verifyGoogleFormat( 5205 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 5206 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5207 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 5208 verifyGoogleFormat("template <typename T>\n" 5209 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5210 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 5211 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 5212 5213 FormatStyle Style = getLLVMStyle(); 5214 Style.PointerAlignment = FormatStyle::PAS_Left; 5215 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5216 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 5217 Style); 5218 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 5219 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5220 Style); 5221 } 5222 5223 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 5224 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 5225 // Prefer keeping `::` followed by `operator` together. 5226 EXPECT_EQ("const aaaa::bbbbbbb &\n" 5227 "ccccccccc::operator++() {\n" 5228 " stuff();\n" 5229 "}", 5230 format("const aaaa::bbbbbbb\n" 5231 "&ccccccccc::operator++() { stuff(); }", 5232 getLLVMStyleWithColumns(40))); 5233 } 5234 5235 TEST_F(FormatTest, TrailingReturnType) { 5236 verifyFormat("auto foo() -> int;\n"); 5237 // correct trailing return type spacing 5238 verifyFormat("auto operator->() -> int;\n"); 5239 verifyFormat("auto operator++(int) -> int;\n"); 5240 5241 verifyFormat("struct S {\n" 5242 " auto bar() const -> int;\n" 5243 "};"); 5244 verifyFormat("template <size_t Order, typename T>\n" 5245 "auto load_img(const std::string &filename)\n" 5246 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5247 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5248 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5249 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5250 verifyFormat("template <typename T>\n" 5251 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5252 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5253 5254 // Not trailing return types. 5255 verifyFormat("void f() { auto a = b->c(); }"); 5256 } 5257 5258 TEST_F(FormatTest, DeductionGuides) { 5259 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5260 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5261 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5262 verifyFormat( 5263 "template <class... T>\n" 5264 "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5265 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5266 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5267 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5268 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5269 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5270 verifyFormat("template <class T> x() -> x<1>;"); 5271 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5272 5273 // Ensure not deduction guides. 5274 verifyFormat("c()->f<int>();"); 5275 verifyFormat("x()->foo<1>;"); 5276 verifyFormat("x = p->foo<3>();"); 5277 verifyFormat("x()->x<1>();"); 5278 verifyFormat("x()->x<1>;"); 5279 } 5280 5281 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5282 // Avoid breaking before trailing 'const' or other trailing annotations, if 5283 // they are not function-like. 5284 FormatStyle Style = getGoogleStyle(); 5285 Style.ColumnLimit = 47; 5286 verifyFormat("void someLongFunction(\n" 5287 " int someLoooooooooooooongParameter) const {\n}", 5288 getLLVMStyleWithColumns(47)); 5289 verifyFormat("LoooooongReturnType\n" 5290 "someLoooooooongFunction() const {}", 5291 getLLVMStyleWithColumns(47)); 5292 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5293 " const {}", 5294 Style); 5295 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5296 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5297 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5298 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5299 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5300 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5301 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5302 " aaaaaaaaaaa aaaaa) const override;"); 5303 verifyGoogleFormat( 5304 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5305 " const override;"); 5306 5307 // Even if the first parameter has to be wrapped. 5308 verifyFormat("void someLongFunction(\n" 5309 " int someLongParameter) const {}", 5310 getLLVMStyleWithColumns(46)); 5311 verifyFormat("void someLongFunction(\n" 5312 " int someLongParameter) const {}", 5313 Style); 5314 verifyFormat("void someLongFunction(\n" 5315 " int someLongParameter) override {}", 5316 Style); 5317 verifyFormat("void someLongFunction(\n" 5318 " int someLongParameter) OVERRIDE {}", 5319 Style); 5320 verifyFormat("void someLongFunction(\n" 5321 " int someLongParameter) final {}", 5322 Style); 5323 verifyFormat("void someLongFunction(\n" 5324 " int someLongParameter) FINAL {}", 5325 Style); 5326 verifyFormat("void someLongFunction(\n" 5327 " int parameter) const override {}", 5328 Style); 5329 5330 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5331 verifyFormat("void someLongFunction(\n" 5332 " int someLongParameter) const\n" 5333 "{\n" 5334 "}", 5335 Style); 5336 5337 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5338 verifyFormat("void someLongFunction(\n" 5339 " int someLongParameter) const\n" 5340 " {\n" 5341 " }", 5342 Style); 5343 5344 // Unless these are unknown annotations. 5345 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5346 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5347 " LONG_AND_UGLY_ANNOTATION;"); 5348 5349 // Breaking before function-like trailing annotations is fine to keep them 5350 // close to their arguments. 5351 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5352 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5353 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5354 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5355 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5356 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5357 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5358 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5359 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5360 5361 verifyFormat( 5362 "void aaaaaaaaaaaaaaaaaa()\n" 5363 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5364 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5365 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5366 " __attribute__((unused));"); 5367 verifyGoogleFormat( 5368 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5369 " GUARDED_BY(aaaaaaaaaaaa);"); 5370 verifyGoogleFormat( 5371 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5372 " GUARDED_BY(aaaaaaaaaaaa);"); 5373 verifyGoogleFormat( 5374 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5375 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5376 verifyGoogleFormat( 5377 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5378 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5379 } 5380 5381 TEST_F(FormatTest, FunctionAnnotations) { 5382 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5383 "int OldFunction(const string ¶meter) {}"); 5384 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5385 "string OldFunction(const string ¶meter) {}"); 5386 verifyFormat("template <typename T>\n" 5387 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5388 "string OldFunction(const string ¶meter) {}"); 5389 5390 // Not function annotations. 5391 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5392 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5393 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5394 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5395 verifyFormat("MACRO(abc).function() // wrap\n" 5396 " << abc;"); 5397 verifyFormat("MACRO(abc)->function() // wrap\n" 5398 " << abc;"); 5399 verifyFormat("MACRO(abc)::function() // wrap\n" 5400 " << abc;"); 5401 } 5402 5403 TEST_F(FormatTest, BreaksDesireably) { 5404 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5405 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5406 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5407 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5408 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5409 "}"); 5410 5411 verifyFormat( 5412 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5414 5415 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5418 5419 verifyFormat( 5420 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5421 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5422 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5423 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5424 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5425 5426 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5427 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5428 5429 verifyFormat( 5430 "void f() {\n" 5431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5433 "}"); 5434 verifyFormat( 5435 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5437 verifyFormat( 5438 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5440 verifyFormat( 5441 "aaaaaa(aaa,\n" 5442 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5443 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5444 " aaaa);"); 5445 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5448 5449 // Indent consistently independent of call expression and unary operator. 5450 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5451 " dddddddddddddddddddddddddddddd));"); 5452 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5453 " dddddddddddddddddddddddddddddd));"); 5454 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5455 " dddddddddddddddddddddddddddddd));"); 5456 5457 // This test case breaks on an incorrect memoization, i.e. an optimization not 5458 // taking into account the StopAt value. 5459 verifyFormat( 5460 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5461 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5462 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5463 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5464 5465 verifyFormat("{\n {\n {\n" 5466 " Annotation.SpaceRequiredBefore =\n" 5467 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5468 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5469 " }\n }\n}"); 5470 5471 // Break on an outer level if there was a break on an inner level. 5472 EXPECT_EQ("f(g(h(a, // comment\n" 5473 " b, c),\n" 5474 " d, e),\n" 5475 " x, y);", 5476 format("f(g(h(a, // comment\n" 5477 " b, c), d, e), x, y);")); 5478 5479 // Prefer breaking similar line breaks. 5480 verifyFormat( 5481 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5482 " NSTrackingMouseEnteredAndExited |\n" 5483 " NSTrackingActiveAlways;"); 5484 } 5485 5486 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5487 FormatStyle NoBinPacking = getGoogleStyle(); 5488 NoBinPacking.BinPackParameters = false; 5489 NoBinPacking.BinPackArguments = true; 5490 verifyFormat("void f() {\n" 5491 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5492 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5493 "}", 5494 NoBinPacking); 5495 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5496 " int aaaaaaaaaaaaaaaaaaaa,\n" 5497 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5498 NoBinPacking); 5499 5500 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5501 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5502 " vector<int> bbbbbbbbbbbbbbb);", 5503 NoBinPacking); 5504 // FIXME: This behavior difference is probably not wanted. However, currently 5505 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5506 // template arguments from BreakBeforeParameter being set because of the 5507 // one-per-line formatting. 5508 verifyFormat( 5509 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5510 " aaaaaaaaaa> aaaaaaaaaa);", 5511 NoBinPacking); 5512 verifyFormat( 5513 "void fffffffffff(\n" 5514 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5515 " aaaaaaaaaa);"); 5516 } 5517 5518 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5519 FormatStyle NoBinPacking = getGoogleStyle(); 5520 NoBinPacking.BinPackParameters = false; 5521 NoBinPacking.BinPackArguments = false; 5522 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5523 " aaaaaaaaaaaaaaaaaaaa,\n" 5524 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5525 NoBinPacking); 5526 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5527 " aaaaaaaaaaaaa,\n" 5528 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5529 NoBinPacking); 5530 verifyFormat( 5531 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5532 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5533 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5534 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5535 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5536 NoBinPacking); 5537 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5538 " .aaaaaaaaaaaaaaaaaa();", 5539 NoBinPacking); 5540 verifyFormat("void f() {\n" 5541 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5542 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5543 "}", 5544 NoBinPacking); 5545 5546 verifyFormat( 5547 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5548 " aaaaaaaaaaaa,\n" 5549 " aaaaaaaaaaaa);", 5550 NoBinPacking); 5551 verifyFormat( 5552 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5553 " ddddddddddddddddddddddddddddd),\n" 5554 " test);", 5555 NoBinPacking); 5556 5557 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5558 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5559 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5560 " aaaaaaaaaaaaaaaaaa;", 5561 NoBinPacking); 5562 verifyFormat("a(\"a\"\n" 5563 " \"a\",\n" 5564 " a);"); 5565 5566 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5567 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5568 " aaaaaaaaa,\n" 5569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5570 NoBinPacking); 5571 verifyFormat( 5572 "void f() {\n" 5573 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5574 " .aaaaaaa();\n" 5575 "}", 5576 NoBinPacking); 5577 verifyFormat( 5578 "template <class SomeType, class SomeOtherType>\n" 5579 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5580 NoBinPacking); 5581 } 5582 5583 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5584 FormatStyle Style = getLLVMStyleWithColumns(15); 5585 Style.ExperimentalAutoDetectBinPacking = true; 5586 EXPECT_EQ("aaa(aaaa,\n" 5587 " aaaa,\n" 5588 " aaaa);\n" 5589 "aaa(aaaa,\n" 5590 " aaaa,\n" 5591 " aaaa);", 5592 format("aaa(aaaa,\n" // one-per-line 5593 " aaaa,\n" 5594 " aaaa );\n" 5595 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5596 Style)); 5597 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5598 " aaaa);\n" 5599 "aaa(aaaa, aaaa,\n" 5600 " aaaa);", 5601 format("aaa(aaaa, aaaa,\n" // bin-packed 5602 " aaaa );\n" 5603 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5604 Style)); 5605 } 5606 5607 TEST_F(FormatTest, FormatsBuilderPattern) { 5608 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5609 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5610 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5611 " .StartsWith(\".init\", ORDER_INIT)\n" 5612 " .StartsWith(\".fini\", ORDER_FINI)\n" 5613 " .StartsWith(\".hash\", ORDER_HASH)\n" 5614 " .Default(ORDER_TEXT);\n"); 5615 5616 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5617 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5618 verifyFormat("aaaaaaa->aaaaaaa\n" 5619 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5621 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5622 verifyFormat( 5623 "aaaaaaa->aaaaaaa\n" 5624 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5625 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5626 verifyFormat( 5627 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5628 " aaaaaaaaaaaaaa);"); 5629 verifyFormat( 5630 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5631 " aaaaaa->aaaaaaaaaaaa()\n" 5632 " ->aaaaaaaaaaaaaaaa(\n" 5633 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5634 " ->aaaaaaaaaaaaaaaaa();"); 5635 verifyGoogleFormat( 5636 "void f() {\n" 5637 " someo->Add((new util::filetools::Handler(dir))\n" 5638 " ->OnEvent1(NewPermanentCallback(\n" 5639 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5640 " ->OnEvent2(NewPermanentCallback(\n" 5641 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5642 " ->OnEvent3(NewPermanentCallback(\n" 5643 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5644 " ->OnEvent5(NewPermanentCallback(\n" 5645 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5646 " ->OnEvent6(NewPermanentCallback(\n" 5647 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5648 "}"); 5649 5650 verifyFormat( 5651 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5652 verifyFormat("aaaaaaaaaaaaaaa()\n" 5653 " .aaaaaaaaaaaaaaa()\n" 5654 " .aaaaaaaaaaaaaaa()\n" 5655 " .aaaaaaaaaaaaaaa()\n" 5656 " .aaaaaaaaaaaaaaa();"); 5657 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5658 " .aaaaaaaaaaaaaaa()\n" 5659 " .aaaaaaaaaaaaaaa()\n" 5660 " .aaaaaaaaaaaaaaa();"); 5661 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5662 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5663 " .aaaaaaaaaaaaaaa();"); 5664 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5665 " ->aaaaaaaaaaaaaae(0)\n" 5666 " ->aaaaaaaaaaaaaaa();"); 5667 5668 // Don't linewrap after very short segments. 5669 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5670 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5671 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5672 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5673 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5674 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5675 verifyFormat("aaa()\n" 5676 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5677 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5678 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5679 5680 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5681 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5682 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5683 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5684 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5686 5687 // Prefer not to break after empty parentheses. 5688 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5689 " First->LastNewlineOffset);"); 5690 5691 // Prefer not to create "hanging" indents. 5692 verifyFormat( 5693 "return !soooooooooooooome_map\n" 5694 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5695 " .second;"); 5696 verifyFormat( 5697 "return aaaaaaaaaaaaaaaa\n" 5698 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5699 " .aaaa(aaaaaaaaaaaaaa);"); 5700 // No hanging indent here. 5701 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5703 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5705 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5706 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5707 getLLVMStyleWithColumns(60)); 5708 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5709 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5710 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5711 getLLVMStyleWithColumns(59)); 5712 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5714 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5715 5716 // Dont break if only closing statements before member call 5717 verifyFormat("test() {\n" 5718 " ([]() -> {\n" 5719 " int b = 32;\n" 5720 " return 3;\n" 5721 " }).foo();\n" 5722 "}"); 5723 verifyFormat("test() {\n" 5724 " (\n" 5725 " []() -> {\n" 5726 " int b = 32;\n" 5727 " return 3;\n" 5728 " },\n" 5729 " foo, bar)\n" 5730 " .foo();\n" 5731 "}"); 5732 verifyFormat("test() {\n" 5733 " ([]() -> {\n" 5734 " int b = 32;\n" 5735 " return 3;\n" 5736 " })\n" 5737 " .foo()\n" 5738 " .bar();\n" 5739 "}"); 5740 verifyFormat("test() {\n" 5741 " ([]() -> {\n" 5742 " int b = 32;\n" 5743 " return 3;\n" 5744 " })\n" 5745 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5746 " \"bbbb\");\n" 5747 "}", 5748 getLLVMStyleWithColumns(30)); 5749 } 5750 5751 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5752 verifyFormat( 5753 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5754 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5755 verifyFormat( 5756 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5757 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5758 5759 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5760 " ccccccccccccccccccccccccc) {\n}"); 5761 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5762 " ccccccccccccccccccccccccc) {\n}"); 5763 5764 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5765 " ccccccccccccccccccccccccc) {\n}"); 5766 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5767 " ccccccccccccccccccccccccc) {\n}"); 5768 5769 verifyFormat( 5770 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5771 " ccccccccccccccccccccccccc) {\n}"); 5772 verifyFormat( 5773 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5774 " ccccccccccccccccccccccccc) {\n}"); 5775 5776 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5777 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5778 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5779 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5780 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5781 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5782 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5783 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5784 5785 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5786 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5787 " aaaaaaaaaaaaaaa != aa) {\n}"); 5788 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5789 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5790 " aaaaaaaaaaaaaaa != aa) {\n}"); 5791 } 5792 5793 TEST_F(FormatTest, BreaksAfterAssignments) { 5794 verifyFormat( 5795 "unsigned Cost =\n" 5796 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5797 " SI->getPointerAddressSpaceee());\n"); 5798 verifyFormat( 5799 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5800 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5801 5802 verifyFormat( 5803 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5804 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5805 verifyFormat("unsigned OriginalStartColumn =\n" 5806 " SourceMgr.getSpellingColumnNumber(\n" 5807 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5808 " 1;"); 5809 } 5810 5811 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5812 FormatStyle Style = getLLVMStyle(); 5813 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5814 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5815 Style); 5816 5817 Style.PenaltyBreakAssignment = 20; 5818 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5819 " cccccccccccccccccccccccccc;", 5820 Style); 5821 } 5822 5823 TEST_F(FormatTest, AlignsAfterAssignments) { 5824 verifyFormat( 5825 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5826 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5827 verifyFormat( 5828 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5829 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5830 verifyFormat( 5831 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5832 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5833 verifyFormat( 5834 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5835 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5836 verifyFormat( 5837 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5838 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5839 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5840 } 5841 5842 TEST_F(FormatTest, AlignsAfterReturn) { 5843 verifyFormat( 5844 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5845 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5846 verifyFormat( 5847 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5848 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5849 verifyFormat( 5850 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5851 " aaaaaaaaaaaaaaaaaaaaaa();"); 5852 verifyFormat( 5853 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5854 " aaaaaaaaaaaaaaaaaaaaaa());"); 5855 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5857 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5860 verifyFormat("return\n" 5861 " // true if code is one of a or b.\n" 5862 " code == a || code == b;"); 5863 } 5864 5865 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5866 verifyFormat( 5867 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5868 " aaaaaaaaa aaaaaaa) {}"); 5869 verifyFormat( 5870 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5871 " aaaaaaaaaaa aaaaaaaaa);"); 5872 verifyFormat( 5873 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5874 " aaaaaaaaaaaaaaaaaaaaa));"); 5875 FormatStyle Style = getLLVMStyle(); 5876 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5877 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5878 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5879 Style); 5880 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5881 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5882 Style); 5883 verifyFormat("SomeLongVariableName->someFunction(\n" 5884 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5885 Style); 5886 verifyFormat( 5887 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5888 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5889 Style); 5890 verifyFormat( 5891 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5892 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5893 Style); 5894 verifyFormat( 5895 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5896 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5897 Style); 5898 5899 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5900 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5901 " b));", 5902 Style); 5903 5904 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5905 Style.BinPackArguments = false; 5906 Style.BinPackParameters = false; 5907 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5908 " aaaaaaaaaaa aaaaaaaa,\n" 5909 " aaaaaaaaa aaaaaaa,\n" 5910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5911 Style); 5912 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5913 " aaaaaaaaaaa aaaaaaaaa,\n" 5914 " aaaaaaaaaaa aaaaaaaaa,\n" 5915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5916 Style); 5917 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5918 " aaaaaaaaaaaaaaa,\n" 5919 " aaaaaaaaaaaaaaaaaaaaa,\n" 5920 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5921 Style); 5922 verifyFormat( 5923 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5924 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5925 Style); 5926 verifyFormat( 5927 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5928 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5929 Style); 5930 verifyFormat( 5931 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5932 " aaaaaaaaaaaaaaaaaaaaa(\n" 5933 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5934 " aaaaaaaaaaaaaaaa);", 5935 Style); 5936 verifyFormat( 5937 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5938 " aaaaaaaaaaaaaaaaaaaaa(\n" 5939 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5940 " aaaaaaaaaaaaaaaa);", 5941 Style); 5942 } 5943 5944 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5945 FormatStyle Style = getLLVMStyleWithColumns(40); 5946 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5947 " bbbbbbbbbbbbbbbbbbbbbb);", 5948 Style); 5949 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5950 Style.AlignOperands = FormatStyle::OAS_DontAlign; 5951 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5952 " bbbbbbbbbbbbbbbbbbbbbb);", 5953 Style); 5954 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5955 Style.AlignOperands = FormatStyle::OAS_Align; 5956 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5957 " bbbbbbbbbbbbbbbbbbbbbb);", 5958 Style); 5959 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5960 Style.AlignOperands = FormatStyle::OAS_DontAlign; 5961 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5962 " bbbbbbbbbbbbbbbbbbbbbb);", 5963 Style); 5964 } 5965 5966 TEST_F(FormatTest, BreaksConditionalExpressions) { 5967 verifyFormat( 5968 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5969 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5970 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5971 verifyFormat( 5972 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5973 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5974 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5975 verifyFormat( 5976 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5977 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5978 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5979 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5980 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5981 verifyFormat( 5982 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5983 " : aaaaaaaaaaaaa);"); 5984 verifyFormat( 5985 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5986 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5987 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5988 " aaaaaaaaaaaaa);"); 5989 verifyFormat( 5990 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5991 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5992 " aaaaaaaaaaaaa);"); 5993 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5994 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5996 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5997 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5998 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6000 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6002 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6004 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6005 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6007 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6009 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6010 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6011 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6012 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6013 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6015 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6016 " : aaaaaaaaaaaaaaaa;"); 6017 verifyFormat( 6018 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6019 " ? aaaaaaaaaaaaaaa\n" 6020 " : aaaaaaaaaaaaaaa;"); 6021 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6022 " aaaaaaaaa\n" 6023 " ? b\n" 6024 " : c);"); 6025 verifyFormat("return aaaa == bbbb\n" 6026 " // comment\n" 6027 " ? aaaa\n" 6028 " : bbbb;"); 6029 verifyFormat("unsigned Indent =\n" 6030 " format(TheLine.First,\n" 6031 " IndentForLevel[TheLine.Level] >= 0\n" 6032 " ? IndentForLevel[TheLine.Level]\n" 6033 " : TheLine * 2,\n" 6034 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6035 getLLVMStyleWithColumns(60)); 6036 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6037 " ? aaaaaaaaaaaaaaa\n" 6038 " : bbbbbbbbbbbbbbb //\n" 6039 " ? ccccccccccccccc\n" 6040 " : ddddddddddddddd;"); 6041 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6042 " ? aaaaaaaaaaaaaaa\n" 6043 " : (bbbbbbbbbbbbbbb //\n" 6044 " ? ccccccccccccccc\n" 6045 " : ddddddddddddddd);"); 6046 verifyFormat( 6047 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6048 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6049 " aaaaaaaaaaaaaaaaaaaaa +\n" 6050 " aaaaaaaaaaaaaaaaaaaaa\n" 6051 " : aaaaaaaaaa;"); 6052 verifyFormat( 6053 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6054 " : aaaaaaaaaaaaaaaaaaaaaa\n" 6055 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6056 6057 FormatStyle NoBinPacking = getLLVMStyle(); 6058 NoBinPacking.BinPackArguments = false; 6059 verifyFormat( 6060 "void f() {\n" 6061 " g(aaa,\n" 6062 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6064 " ? aaaaaaaaaaaaaaa\n" 6065 " : aaaaaaaaaaaaaaa);\n" 6066 "}", 6067 NoBinPacking); 6068 verifyFormat( 6069 "void f() {\n" 6070 " g(aaa,\n" 6071 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6073 " ?: aaaaaaaaaaaaaaa);\n" 6074 "}", 6075 NoBinPacking); 6076 6077 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 6078 " // comment.\n" 6079 " ccccccccccccccccccccccccccccccccccccccc\n" 6080 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6081 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 6082 6083 // Assignments in conditional expressions. Apparently not uncommon :-(. 6084 verifyFormat("return a != b\n" 6085 " // comment\n" 6086 " ? a = b\n" 6087 " : a = b;"); 6088 verifyFormat("return a != b\n" 6089 " // comment\n" 6090 " ? a = a != b\n" 6091 " // comment\n" 6092 " ? a = b\n" 6093 " : a\n" 6094 " : a;\n"); 6095 verifyFormat("return a != b\n" 6096 " // comment\n" 6097 " ? a\n" 6098 " : a = a != b\n" 6099 " // comment\n" 6100 " ? a = b\n" 6101 " : a;"); 6102 6103 // Chained conditionals 6104 FormatStyle Style = getLLVMStyle(); 6105 Style.ColumnLimit = 70; 6106 Style.AlignOperands = FormatStyle::OAS_Align; 6107 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6108 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6109 " : 3333333333333333;", 6110 Style); 6111 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6112 " : bbbbbbbbbb ? 2222222222222222\n" 6113 " : 3333333333333333;", 6114 Style); 6115 verifyFormat("return aaaaaaaaaa ? 1111111111111111\n" 6116 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 6117 " : 3333333333333333;", 6118 Style); 6119 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6120 " : bbbbbbbbbbbbbb ? 222222\n" 6121 " : 333333;", 6122 Style); 6123 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6124 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6125 " : cccccccccccccc ? 3333333333333333\n" 6126 " : 4444444444444444;", 6127 Style); 6128 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n" 6129 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6130 " : 3333333333333333;", 6131 Style); 6132 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6133 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6134 " : (aaa ? bbb : ccc);", 6135 Style); 6136 verifyFormat( 6137 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6138 " : cccccccccccccccccc)\n" 6139 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6140 " : 3333333333333333;", 6141 Style); 6142 verifyFormat( 6143 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6144 " : cccccccccccccccccc)\n" 6145 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6146 " : 3333333333333333;", 6147 Style); 6148 verifyFormat( 6149 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6150 " : dddddddddddddddddd)\n" 6151 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6152 " : 3333333333333333;", 6153 Style); 6154 verifyFormat( 6155 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6156 " : dddddddddddddddddd)\n" 6157 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6158 " : 3333333333333333;", 6159 Style); 6160 verifyFormat( 6161 "return aaaaaaaaa ? 1111111111111111\n" 6162 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6163 " : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6164 " : dddddddddddddddddd)\n", 6165 Style); 6166 verifyFormat( 6167 "return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6168 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6169 " : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6170 " : cccccccccccccccccc);", 6171 Style); 6172 verifyFormat( 6173 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6174 " : ccccccccccccccc ? dddddddddddddddddd\n" 6175 " : eeeeeeeeeeeeeeeeee)\n" 6176 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6177 " : 3333333333333333;", 6178 Style); 6179 verifyFormat( 6180 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6181 " : ccccccccccccccc ? dddddddddddddddddd\n" 6182 " : eeeeeeeeeeeeeeeeee)\n" 6183 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6184 " : 3333333333333333;", 6185 Style); 6186 verifyFormat( 6187 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6188 " : cccccccccccc ? dddddddddddddddddd\n" 6189 " : eeeeeeeeeeeeeeeeee)\n" 6190 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6191 " : 3333333333333333;", 6192 Style); 6193 verifyFormat( 6194 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6195 " : cccccccccccccccccc\n" 6196 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6197 " : 3333333333333333;", 6198 Style); 6199 verifyFormat( 6200 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6201 " : cccccccccccccccc ? dddddddddddddddddd\n" 6202 " : eeeeeeeeeeeeeeeeee\n" 6203 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6204 " : 3333333333333333;", 6205 Style); 6206 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n" 6207 " ? (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6208 " : cccccccccccccccccc ? dddddddddddddddddd\n" 6209 " : eeeeeeeeeeeeeeeeee)\n" 6210 " : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6211 " : 3333333333333333;", 6212 Style); 6213 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n" 6214 " ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6215 " : cccccccccccccccc ? dddddddddddddddddd\n" 6216 " : eeeeeeeeeeeeeeeeee\n" 6217 " : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6218 " : 3333333333333333;", 6219 Style); 6220 } 6221 6222 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 6223 FormatStyle Style = getLLVMStyle(); 6224 Style.BreakBeforeTernaryOperators = false; 6225 Style.ColumnLimit = 70; 6226 verifyFormat( 6227 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6228 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6229 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6230 Style); 6231 verifyFormat( 6232 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6233 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6234 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6235 Style); 6236 verifyFormat( 6237 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6238 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6239 Style); 6240 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 6241 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6243 Style); 6244 verifyFormat( 6245 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 6246 " aaaaaaaaaaaaa);", 6247 Style); 6248 verifyFormat( 6249 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6250 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6252 " aaaaaaaaaaaaa);", 6253 Style); 6254 verifyFormat( 6255 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6256 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6257 " aaaaaaaaaaaaa);", 6258 Style); 6259 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6263 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6264 Style); 6265 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6267 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6271 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6272 Style); 6273 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6274 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 6275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6277 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6278 Style); 6279 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6280 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6281 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6282 Style); 6283 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6285 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6287 Style); 6288 verifyFormat( 6289 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6290 " aaaaaaaaaaaaaaa :\n" 6291 " aaaaaaaaaaaaaaa;", 6292 Style); 6293 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6294 " aaaaaaaaa ?\n" 6295 " b :\n" 6296 " c);", 6297 Style); 6298 verifyFormat("unsigned Indent =\n" 6299 " format(TheLine.First,\n" 6300 " IndentForLevel[TheLine.Level] >= 0 ?\n" 6301 " IndentForLevel[TheLine.Level] :\n" 6302 " TheLine * 2,\n" 6303 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6304 Style); 6305 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6306 " aaaaaaaaaaaaaaa :\n" 6307 " bbbbbbbbbbbbbbb ? //\n" 6308 " ccccccccccccccc :\n" 6309 " ddddddddddddddd;", 6310 Style); 6311 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6312 " aaaaaaaaaaaaaaa :\n" 6313 " (bbbbbbbbbbbbbbb ? //\n" 6314 " ccccccccccccccc :\n" 6315 " ddddddddddddddd);", 6316 Style); 6317 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6318 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 6319 " ccccccccccccccccccccccccccc;", 6320 Style); 6321 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6322 " aaaaa :\n" 6323 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 6324 Style); 6325 6326 // Chained conditionals 6327 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6328 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6329 " 3333333333333333;", 6330 Style); 6331 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6332 " bbbbbbbbbb ? 2222222222222222 :\n" 6333 " 3333333333333333;", 6334 Style); 6335 verifyFormat("return aaaaaaaaaa ? 1111111111111111 :\n" 6336 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6337 " 3333333333333333;", 6338 Style); 6339 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6340 " bbbbbbbbbbbbbbbb ? 222222 :\n" 6341 " 333333;", 6342 Style); 6343 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6344 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6345 " cccccccccccccccc ? 3333333333333333 :\n" 6346 " 4444444444444444;", 6347 Style); 6348 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n" 6349 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6350 " 3333333333333333;", 6351 Style); 6352 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6353 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6354 " (aaa ? bbb : ccc);", 6355 Style); 6356 verifyFormat( 6357 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6358 " cccccccccccccccccc) :\n" 6359 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6360 " 3333333333333333;", 6361 Style); 6362 verifyFormat( 6363 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6364 " cccccccccccccccccc) :\n" 6365 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6366 " 3333333333333333;", 6367 Style); 6368 verifyFormat( 6369 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6370 " dddddddddddddddddd) :\n" 6371 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6372 " 3333333333333333;", 6373 Style); 6374 verifyFormat( 6375 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6376 " dddddddddddddddddd) :\n" 6377 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6378 " 3333333333333333;", 6379 Style); 6380 verifyFormat( 6381 "return aaaaaaaaa ? 1111111111111111 :\n" 6382 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6383 " a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6384 " dddddddddddddddddd)\n", 6385 Style); 6386 verifyFormat( 6387 "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6388 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6389 " (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6390 " cccccccccccccccccc);", 6391 Style); 6392 verifyFormat( 6393 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6394 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6395 " eeeeeeeeeeeeeeeeee) :\n" 6396 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6397 " 3333333333333333;", 6398 Style); 6399 verifyFormat( 6400 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6401 " ccccccccccccc ? dddddddddddddddddd :\n" 6402 " eeeeeeeeeeeeeeeeee) :\n" 6403 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6404 " 3333333333333333;", 6405 Style); 6406 verifyFormat( 6407 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6408 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6409 " eeeeeeeeeeeeeeeeee) :\n" 6410 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6411 " 3333333333333333;", 6412 Style); 6413 verifyFormat( 6414 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6415 " cccccccccccccccccc :\n" 6416 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6417 " 3333333333333333;", 6418 Style); 6419 verifyFormat( 6420 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6421 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6422 " eeeeeeeeeeeeeeeeee :\n" 6423 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6424 " 3333333333333333;", 6425 Style); 6426 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6427 " (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6428 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6429 " eeeeeeeeeeeeeeeeee) :\n" 6430 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6431 " 3333333333333333;", 6432 Style); 6433 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6434 " aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6435 " cccccccccccccccccccc ? dddddddddddddddddd :\n" 6436 " eeeeeeeeeeeeeeeeee :\n" 6437 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6438 " 3333333333333333;", 6439 Style); 6440 } 6441 6442 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 6443 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 6444 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 6445 verifyFormat("bool a = true, b = false;"); 6446 6447 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 6449 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 6450 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 6451 verifyFormat( 6452 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 6453 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 6454 " d = e && f;"); 6455 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 6456 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 6457 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6458 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 6459 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 6460 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 6461 6462 FormatStyle Style = getGoogleStyle(); 6463 Style.PointerAlignment = FormatStyle::PAS_Left; 6464 Style.DerivePointerAlignment = false; 6465 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6466 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 6467 " *b = bbbbbbbbbbbbbbbbbbb;", 6468 Style); 6469 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6470 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 6471 Style); 6472 verifyFormat("vector<int*> a, b;", Style); 6473 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 6474 } 6475 6476 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6477 verifyFormat("arr[foo ? bar : baz];"); 6478 verifyFormat("f()[foo ? bar : baz];"); 6479 verifyFormat("(a + b)[foo ? bar : baz];"); 6480 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6481 } 6482 6483 TEST_F(FormatTest, AlignsStringLiterals) { 6484 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6485 " \"short literal\");"); 6486 verifyFormat( 6487 "looooooooooooooooooooooooongFunction(\n" 6488 " \"short literal\"\n" 6489 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6490 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6491 " \" string literals\",\n" 6492 " and, other, parameters);"); 6493 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6494 " \"5678\";", 6495 format("fun + \"1243\" /* comment */\n" 6496 " \"5678\";", 6497 getLLVMStyleWithColumns(28))); 6498 EXPECT_EQ( 6499 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6500 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6501 " \"aaaaaaaaaaaaaaaa\";", 6502 format("aaaaaa =" 6503 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6504 "aaaaaaaaaaaaaaaaaaaaa\" " 6505 "\"aaaaaaaaaaaaaaaa\";")); 6506 verifyFormat("a = a + \"a\"\n" 6507 " \"a\"\n" 6508 " \"a\";"); 6509 verifyFormat("f(\"a\", \"b\"\n" 6510 " \"c\");"); 6511 6512 verifyFormat( 6513 "#define LL_FORMAT \"ll\"\n" 6514 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6515 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6516 6517 verifyFormat("#define A(X) \\\n" 6518 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6519 " \"ccccc\"", 6520 getLLVMStyleWithColumns(23)); 6521 verifyFormat("#define A \"def\"\n" 6522 "f(\"abc\" A \"ghi\"\n" 6523 " \"jkl\");"); 6524 6525 verifyFormat("f(L\"a\"\n" 6526 " L\"b\");"); 6527 verifyFormat("#define A(X) \\\n" 6528 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6529 " L\"ccccc\"", 6530 getLLVMStyleWithColumns(25)); 6531 6532 verifyFormat("f(@\"a\"\n" 6533 " @\"b\");"); 6534 verifyFormat("NSString s = @\"a\"\n" 6535 " @\"b\"\n" 6536 " @\"c\";"); 6537 verifyFormat("NSString s = @\"a\"\n" 6538 " \"b\"\n" 6539 " \"c\";"); 6540 } 6541 6542 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6543 FormatStyle Style = getLLVMStyle(); 6544 // No declarations or definitions should be moved to own line. 6545 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6546 verifyFormat("class A {\n" 6547 " int f() { return 1; }\n" 6548 " int g();\n" 6549 "};\n" 6550 "int f() { return 1; }\n" 6551 "int g();\n", 6552 Style); 6553 6554 // All declarations and definitions should have the return type moved to its 6555 // own 6556 // line. 6557 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6558 verifyFormat("class E {\n" 6559 " int\n" 6560 " f() {\n" 6561 " return 1;\n" 6562 " }\n" 6563 " int\n" 6564 " g();\n" 6565 "};\n" 6566 "int\n" 6567 "f() {\n" 6568 " return 1;\n" 6569 "}\n" 6570 "int\n" 6571 "g();\n", 6572 Style); 6573 6574 // Top-level definitions, and no kinds of declarations should have the 6575 // return type moved to its own line. 6576 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6577 verifyFormat("class B {\n" 6578 " int f() { return 1; }\n" 6579 " int g();\n" 6580 "};\n" 6581 "int\n" 6582 "f() {\n" 6583 " return 1;\n" 6584 "}\n" 6585 "int g();\n", 6586 Style); 6587 6588 // Top-level definitions and declarations should have the return type moved 6589 // to its own line. 6590 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6591 verifyFormat("class C {\n" 6592 " int f() { return 1; }\n" 6593 " int g();\n" 6594 "};\n" 6595 "int\n" 6596 "f() {\n" 6597 " return 1;\n" 6598 "}\n" 6599 "int\n" 6600 "g();\n", 6601 Style); 6602 6603 // All definitions should have the return type moved to its own line, but no 6604 // kinds of declarations. 6605 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6606 verifyFormat("class D {\n" 6607 " int\n" 6608 " f() {\n" 6609 " return 1;\n" 6610 " }\n" 6611 " int g();\n" 6612 "};\n" 6613 "int\n" 6614 "f() {\n" 6615 " return 1;\n" 6616 "}\n" 6617 "int g();\n", 6618 Style); 6619 verifyFormat("const char *\n" 6620 "f(void) {\n" // Break here. 6621 " return \"\";\n" 6622 "}\n" 6623 "const char *bar(void);\n", // No break here. 6624 Style); 6625 verifyFormat("template <class T>\n" 6626 "T *\n" 6627 "f(T &c) {\n" // Break here. 6628 " return NULL;\n" 6629 "}\n" 6630 "template <class T> T *f(T &c);\n", // No break here. 6631 Style); 6632 verifyFormat("class C {\n" 6633 " int\n" 6634 " operator+() {\n" 6635 " return 1;\n" 6636 " }\n" 6637 " int\n" 6638 " operator()() {\n" 6639 " return 1;\n" 6640 " }\n" 6641 "};\n", 6642 Style); 6643 verifyFormat("void\n" 6644 "A::operator()() {}\n" 6645 "void\n" 6646 "A::operator>>() {}\n" 6647 "void\n" 6648 "A::operator+() {}\n" 6649 "void\n" 6650 "A::operator*() {}\n" 6651 "void\n" 6652 "A::operator->() {}\n" 6653 "void\n" 6654 "A::operator void *() {}\n" 6655 "void\n" 6656 "A::operator void &() {}\n" 6657 "void\n" 6658 "A::operator void &&() {}\n" 6659 "void\n" 6660 "A::operator char *() {}\n" 6661 "void\n" 6662 "A::operator[]() {}\n" 6663 "void\n" 6664 "A::operator!() {}\n" 6665 "void\n" 6666 "A::operator**() {}\n" 6667 "void\n" 6668 "A::operator<Foo> *() {}\n" 6669 "void\n" 6670 "A::operator<Foo> **() {}\n" 6671 "void\n" 6672 "A::operator<Foo> &() {}\n" 6673 "void\n" 6674 "A::operator void **() {}\n", 6675 Style); 6676 verifyFormat("constexpr auto\n" 6677 "operator()() const -> reference {}\n" 6678 "constexpr auto\n" 6679 "operator>>() const -> reference {}\n" 6680 "constexpr auto\n" 6681 "operator+() const -> reference {}\n" 6682 "constexpr auto\n" 6683 "operator*() const -> reference {}\n" 6684 "constexpr auto\n" 6685 "operator->() const -> reference {}\n" 6686 "constexpr auto\n" 6687 "operator++() const -> reference {}\n" 6688 "constexpr auto\n" 6689 "operator void *() const -> reference {}\n" 6690 "constexpr auto\n" 6691 "operator void **() const -> reference {}\n" 6692 "constexpr auto\n" 6693 "operator void *() const -> reference {}\n" 6694 "constexpr auto\n" 6695 "operator void &() const -> reference {}\n" 6696 "constexpr auto\n" 6697 "operator void &&() const -> reference {}\n" 6698 "constexpr auto\n" 6699 "operator char *() const -> reference {}\n" 6700 "constexpr auto\n" 6701 "operator!() const -> reference {}\n" 6702 "constexpr auto\n" 6703 "operator[]() const -> reference {}\n", 6704 Style); 6705 verifyFormat("void *operator new(std::size_t s);", // No break here. 6706 Style); 6707 verifyFormat("void *\n" 6708 "operator new(std::size_t s) {}", 6709 Style); 6710 verifyFormat("void *\n" 6711 "operator delete[](void *ptr) {}", 6712 Style); 6713 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6714 verifyFormat("const char *\n" 6715 "f(void)\n" // Break here. 6716 "{\n" 6717 " return \"\";\n" 6718 "}\n" 6719 "const char *bar(void);\n", // No break here. 6720 Style); 6721 verifyFormat("template <class T>\n" 6722 "T *\n" // Problem here: no line break 6723 "f(T &c)\n" // Break here. 6724 "{\n" 6725 " return NULL;\n" 6726 "}\n" 6727 "template <class T> T *f(T &c);\n", // No break here. 6728 Style); 6729 verifyFormat("int\n" 6730 "foo(A<bool> a)\n" 6731 "{\n" 6732 " return a;\n" 6733 "}\n", 6734 Style); 6735 verifyFormat("int\n" 6736 "foo(A<8> a)\n" 6737 "{\n" 6738 " return a;\n" 6739 "}\n", 6740 Style); 6741 verifyFormat("int\n" 6742 "foo(A<B<bool>, 8> a)\n" 6743 "{\n" 6744 " return a;\n" 6745 "}\n", 6746 Style); 6747 verifyFormat("int\n" 6748 "foo(A<B<8>, bool> a)\n" 6749 "{\n" 6750 " return a;\n" 6751 "}\n", 6752 Style); 6753 verifyFormat("int\n" 6754 "foo(A<B<bool>, bool> a)\n" 6755 "{\n" 6756 " return a;\n" 6757 "}\n", 6758 Style); 6759 verifyFormat("int\n" 6760 "foo(A<B<8>, 8> a)\n" 6761 "{\n" 6762 " return a;\n" 6763 "}\n", 6764 Style); 6765 6766 Style = getGNUStyle(); 6767 6768 // Test for comments at the end of function declarations. 6769 verifyFormat("void\n" 6770 "foo (int a, /*abc*/ int b) // def\n" 6771 "{\n" 6772 "}\n", 6773 Style); 6774 6775 verifyFormat("void\n" 6776 "foo (int a, /* abc */ int b) /* def */\n" 6777 "{\n" 6778 "}\n", 6779 Style); 6780 6781 // Definitions that should not break after return type 6782 verifyFormat("void foo (int a, int b); // def\n", Style); 6783 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6784 verifyFormat("void foo (int a, int b);\n", Style); 6785 } 6786 6787 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6788 FormatStyle NoBreak = getLLVMStyle(); 6789 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6790 FormatStyle Break = getLLVMStyle(); 6791 Break.AlwaysBreakBeforeMultilineStrings = true; 6792 verifyFormat("aaaa = \"bbbb\"\n" 6793 " \"cccc\";", 6794 NoBreak); 6795 verifyFormat("aaaa =\n" 6796 " \"bbbb\"\n" 6797 " \"cccc\";", 6798 Break); 6799 verifyFormat("aaaa(\"bbbb\"\n" 6800 " \"cccc\");", 6801 NoBreak); 6802 verifyFormat("aaaa(\n" 6803 " \"bbbb\"\n" 6804 " \"cccc\");", 6805 Break); 6806 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6807 " \"cccc\");", 6808 NoBreak); 6809 verifyFormat("aaaa(qqq,\n" 6810 " \"bbbb\"\n" 6811 " \"cccc\");", 6812 Break); 6813 verifyFormat("aaaa(qqq,\n" 6814 " L\"bbbb\"\n" 6815 " L\"cccc\");", 6816 Break); 6817 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6818 " \"bbbb\"));", 6819 Break); 6820 verifyFormat("string s = someFunction(\n" 6821 " \"abc\"\n" 6822 " \"abc\");", 6823 Break); 6824 6825 // As we break before unary operators, breaking right after them is bad. 6826 verifyFormat("string foo = abc ? \"x\"\n" 6827 " \"blah blah blah blah blah blah\"\n" 6828 " : \"y\";", 6829 Break); 6830 6831 // Don't break if there is no column gain. 6832 verifyFormat("f(\"aaaa\"\n" 6833 " \"bbbb\");", 6834 Break); 6835 6836 // Treat literals with escaped newlines like multi-line string literals. 6837 EXPECT_EQ("x = \"a\\\n" 6838 "b\\\n" 6839 "c\";", 6840 format("x = \"a\\\n" 6841 "b\\\n" 6842 "c\";", 6843 NoBreak)); 6844 EXPECT_EQ("xxxx =\n" 6845 " \"a\\\n" 6846 "b\\\n" 6847 "c\";", 6848 format("xxxx = \"a\\\n" 6849 "b\\\n" 6850 "c\";", 6851 Break)); 6852 6853 EXPECT_EQ("NSString *const kString =\n" 6854 " @\"aaaa\"\n" 6855 " @\"bbbb\";", 6856 format("NSString *const kString = @\"aaaa\"\n" 6857 "@\"bbbb\";", 6858 Break)); 6859 6860 Break.ColumnLimit = 0; 6861 verifyFormat("const char *hello = \"hello llvm\";", Break); 6862 } 6863 6864 TEST_F(FormatTest, AlignsPipes) { 6865 verifyFormat( 6866 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6867 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6868 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6869 verifyFormat( 6870 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6871 " << aaaaaaaaaaaaaaaaaaaa;"); 6872 verifyFormat( 6873 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6874 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6875 verifyFormat( 6876 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6877 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6878 verifyFormat( 6879 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6880 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6881 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6882 verifyFormat( 6883 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6884 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6885 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6886 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6889 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6890 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6891 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6892 verifyFormat( 6893 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6894 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6895 verifyFormat( 6896 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6897 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6898 6899 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6900 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6901 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6902 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6903 " aaaaaaaaaaaaaaaaaaaaa)\n" 6904 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6905 verifyFormat("LOG_IF(aaa == //\n" 6906 " bbb)\n" 6907 " << a << b;"); 6908 6909 // But sometimes, breaking before the first "<<" is desirable. 6910 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6911 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6912 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6913 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6914 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6915 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6916 " << BEF << IsTemplate << Description << E->getType();"); 6917 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6918 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6919 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6920 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6921 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6922 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6923 " << aaa;"); 6924 6925 verifyFormat( 6926 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6927 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6928 6929 // Incomplete string literal. 6930 EXPECT_EQ("llvm::errs() << \"\n" 6931 " << a;", 6932 format("llvm::errs() << \"\n<<a;")); 6933 6934 verifyFormat("void f() {\n" 6935 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6936 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6937 "}"); 6938 6939 // Handle 'endl'. 6940 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6941 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6942 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6943 6944 // Handle '\n'. 6945 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6946 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6947 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6948 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6949 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6950 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6951 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6952 } 6953 6954 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6955 verifyFormat("return out << \"somepacket = {\\n\"\n" 6956 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6957 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6958 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6959 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6960 " << \"}\";"); 6961 6962 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6963 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6964 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6965 verifyFormat( 6966 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6967 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6968 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6969 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6970 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6971 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6972 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6973 verifyFormat( 6974 "void f() {\n" 6975 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6976 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6977 "}"); 6978 6979 // Breaking before the first "<<" is generally not desirable. 6980 verifyFormat( 6981 "llvm::errs()\n" 6982 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6983 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6984 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6985 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6986 getLLVMStyleWithColumns(70)); 6987 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6988 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6989 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6990 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6991 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6992 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6993 getLLVMStyleWithColumns(70)); 6994 6995 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6996 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6997 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6998 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6999 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7000 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 7001 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 7002 " (aaaa + aaaa);", 7003 getLLVMStyleWithColumns(40)); 7004 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 7005 " (aaaaaaa + aaaaa));", 7006 getLLVMStyleWithColumns(40)); 7007 verifyFormat( 7008 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 7009 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 7010 " bbbbbbbbbbbbbbbbbbbbbbb);"); 7011 } 7012 7013 TEST_F(FormatTest, UnderstandsEquals) { 7014 verifyFormat( 7015 "aaaaaaaaaaaaaaaaa =\n" 7016 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7017 verifyFormat( 7018 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7020 verifyFormat( 7021 "if (a) {\n" 7022 " f();\n" 7023 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 7025 "}"); 7026 7027 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7028 " 100000000 + 10000000) {\n}"); 7029 } 7030 7031 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 7032 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7033 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 7034 7035 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7036 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 7037 7038 verifyFormat( 7039 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 7040 " Parameter2);"); 7041 7042 verifyFormat( 7043 "ShortObject->shortFunction(\n" 7044 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 7045 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 7046 7047 verifyFormat("loooooooooooooongFunction(\n" 7048 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 7049 7050 verifyFormat( 7051 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 7052 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 7053 7054 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7055 " .WillRepeatedly(Return(SomeValue));"); 7056 verifyFormat("void f() {\n" 7057 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7058 " .Times(2)\n" 7059 " .WillRepeatedly(Return(SomeValue));\n" 7060 "}"); 7061 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 7062 " ccccccccccccccccccccccc);"); 7063 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7065 " .aaaaa(aaaaa),\n" 7066 " aaaaaaaaaaaaaaaaaaaaa);"); 7067 verifyFormat("void f() {\n" 7068 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7069 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 7070 "}"); 7071 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7073 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7074 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7075 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7076 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7077 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7078 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7079 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 7080 "}"); 7081 7082 // Here, it is not necessary to wrap at "." or "->". 7083 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 7084 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7085 verifyFormat( 7086 "aaaaaaaaaaa->aaaaaaaaa(\n" 7087 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7088 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 7089 7090 verifyFormat( 7091 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 7093 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 7094 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7095 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 7096 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7097 7098 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7099 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7100 " .a();"); 7101 7102 FormatStyle NoBinPacking = getLLVMStyle(); 7103 NoBinPacking.BinPackParameters = false; 7104 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7105 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7106 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 7107 " aaaaaaaaaaaaaaaaaaa,\n" 7108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 7109 NoBinPacking); 7110 7111 // If there is a subsequent call, change to hanging indentation. 7112 verifyFormat( 7113 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7114 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 7115 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7116 verifyFormat( 7117 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7118 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 7119 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7121 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7122 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7124 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7125 } 7126 7127 TEST_F(FormatTest, WrapsTemplateDeclarations) { 7128 verifyFormat("template <typename T>\n" 7129 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7130 verifyFormat("template <typename T>\n" 7131 "// T should be one of {A, B}.\n" 7132 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7133 verifyFormat( 7134 "template <typename T>\n" 7135 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 7136 verifyFormat("template <typename T>\n" 7137 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 7138 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 7139 verifyFormat( 7140 "template <typename T>\n" 7141 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 7142 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 7143 verifyFormat( 7144 "template <typename T>\n" 7145 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 7146 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 7147 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7148 verifyFormat("template <typename T>\n" 7149 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7150 " int aaaaaaaaaaaaaaaaaaaaaa);"); 7151 verifyFormat( 7152 "template <typename T1, typename T2 = char, typename T3 = char,\n" 7153 " typename T4 = char>\n" 7154 "void f();"); 7155 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 7156 " template <typename> class cccccccccccccccccccccc,\n" 7157 " typename ddddddddddddd>\n" 7158 "class C {};"); 7159 verifyFormat( 7160 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 7161 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7162 7163 verifyFormat("void f() {\n" 7164 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 7165 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 7166 "}"); 7167 7168 verifyFormat("template <typename T> class C {};"); 7169 verifyFormat("template <typename T> void f();"); 7170 verifyFormat("template <typename T> void f() {}"); 7171 verifyFormat( 7172 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7173 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 7175 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7176 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7177 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 7178 " bbbbbbbbbbbbbbbbbbbbbbbb);", 7179 getLLVMStyleWithColumns(72)); 7180 EXPECT_EQ("static_cast<A< //\n" 7181 " B> *>(\n" 7182 "\n" 7183 ");", 7184 format("static_cast<A<//\n" 7185 " B>*>(\n" 7186 "\n" 7187 " );")); 7188 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7189 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 7190 7191 FormatStyle AlwaysBreak = getLLVMStyle(); 7192 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7193 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 7194 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 7195 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 7196 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7197 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7198 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 7199 verifyFormat("template <template <typename> class Fooooooo,\n" 7200 " template <typename> class Baaaaaaar>\n" 7201 "struct C {};", 7202 AlwaysBreak); 7203 verifyFormat("template <typename T> // T can be A, B or C.\n" 7204 "struct C {};", 7205 AlwaysBreak); 7206 verifyFormat("template <enum E> class A {\n" 7207 "public:\n" 7208 " E *f();\n" 7209 "};"); 7210 7211 FormatStyle NeverBreak = getLLVMStyle(); 7212 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 7213 verifyFormat("template <typename T> class C {};", NeverBreak); 7214 verifyFormat("template <typename T> void f();", NeverBreak); 7215 verifyFormat("template <typename T> void f() {}", NeverBreak); 7216 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7217 "bbbbbbbbbbbbbbbbbbbb) {}", 7218 NeverBreak); 7219 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7220 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7221 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 7222 NeverBreak); 7223 verifyFormat("template <template <typename> class Fooooooo,\n" 7224 " template <typename> class Baaaaaaar>\n" 7225 "struct C {};", 7226 NeverBreak); 7227 verifyFormat("template <typename T> // T can be A, B or C.\n" 7228 "struct C {};", 7229 NeverBreak); 7230 verifyFormat("template <enum E> class A {\n" 7231 "public:\n" 7232 " E *f();\n" 7233 "};", 7234 NeverBreak); 7235 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 7236 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7237 "bbbbbbbbbbbbbbbbbbbb) {}", 7238 NeverBreak); 7239 } 7240 7241 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 7242 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7243 Style.ColumnLimit = 60; 7244 EXPECT_EQ("// Baseline - no comments.\n" 7245 "template <\n" 7246 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7247 "void f() {}", 7248 format("// Baseline - no comments.\n" 7249 "template <\n" 7250 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7251 "void f() {}", 7252 Style)); 7253 7254 EXPECT_EQ("template <\n" 7255 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7256 "void f() {}", 7257 format("template <\n" 7258 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7259 "void f() {}", 7260 Style)); 7261 7262 EXPECT_EQ( 7263 "template <\n" 7264 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7265 "void f() {}", 7266 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7267 "void f() {}", 7268 Style)); 7269 7270 EXPECT_EQ( 7271 "template <\n" 7272 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7273 " // multiline\n" 7274 "void f() {}", 7275 format("template <\n" 7276 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7277 " // multiline\n" 7278 "void f() {}", 7279 Style)); 7280 7281 EXPECT_EQ( 7282 "template <typename aaaaaaaaaa<\n" 7283 " bbbbbbbbbbbb>::value> // trailing loooong\n" 7284 "void f() {}", 7285 format( 7286 "template <\n" 7287 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 7288 "void f() {}", 7289 Style)); 7290 } 7291 7292 TEST_F(FormatTest, WrapsTemplateParameters) { 7293 FormatStyle Style = getLLVMStyle(); 7294 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7295 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7296 verifyFormat( 7297 "template <typename... a> struct q {};\n" 7298 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7299 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7300 " y;", 7301 Style); 7302 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7303 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7304 verifyFormat( 7305 "template <typename... a> struct r {};\n" 7306 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7307 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7308 " y;", 7309 Style); 7310 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7311 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7312 verifyFormat("template <typename... a> struct s {};\n" 7313 "extern s<\n" 7314 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7315 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7316 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7317 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7318 " y;", 7319 Style); 7320 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7321 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7322 verifyFormat("template <typename... a> struct t {};\n" 7323 "extern t<\n" 7324 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7325 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7326 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7327 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7328 " y;", 7329 Style); 7330 } 7331 7332 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 7333 verifyFormat( 7334 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7336 verifyFormat( 7337 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7340 7341 // FIXME: Should we have the extra indent after the second break? 7342 verifyFormat( 7343 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7346 7347 verifyFormat( 7348 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 7349 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 7350 7351 // Breaking at nested name specifiers is generally not desirable. 7352 verifyFormat( 7353 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7354 " aaaaaaaaaaaaaaaaaaaaaaa);"); 7355 7356 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 7357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7358 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7359 " aaaaaaaaaaaaaaaaaaaaa);", 7360 getLLVMStyleWithColumns(74)); 7361 7362 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7363 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7364 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7365 } 7366 7367 TEST_F(FormatTest, UnderstandsTemplateParameters) { 7368 verifyFormat("A<int> a;"); 7369 verifyFormat("A<A<A<int>>> a;"); 7370 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 7371 verifyFormat("bool x = a < 1 || 2 > a;"); 7372 verifyFormat("bool x = 5 < f<int>();"); 7373 verifyFormat("bool x = f<int>() > 5;"); 7374 verifyFormat("bool x = 5 < a<int>::x;"); 7375 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 7376 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 7377 7378 verifyGoogleFormat("A<A<int>> a;"); 7379 verifyGoogleFormat("A<A<A<int>>> a;"); 7380 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 7381 verifyGoogleFormat("A<A<int> > a;"); 7382 verifyGoogleFormat("A<A<A<int> > > a;"); 7383 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 7384 verifyGoogleFormat("A<::A<int>> a;"); 7385 verifyGoogleFormat("A<::A> a;"); 7386 verifyGoogleFormat("A< ::A> a;"); 7387 verifyGoogleFormat("A< ::A<int> > a;"); 7388 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 7389 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 7390 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 7391 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 7392 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 7393 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 7394 7395 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 7396 7397 // template closer followed by a token that starts with > or = 7398 verifyFormat("bool b = a<1> > 1;"); 7399 verifyFormat("bool b = a<1> >= 1;"); 7400 verifyFormat("int i = a<1> >> 1;"); 7401 FormatStyle Style = getLLVMStyle(); 7402 Style.SpaceBeforeAssignmentOperators = false; 7403 verifyFormat("bool b= a<1> == 1;", Style); 7404 verifyFormat("a<int> = 1;", Style); 7405 verifyFormat("a<int> >>= 1;", Style); 7406 7407 verifyFormat("test >> a >> b;"); 7408 verifyFormat("test << a >> b;"); 7409 7410 verifyFormat("f<int>();"); 7411 verifyFormat("template <typename T> void f() {}"); 7412 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 7413 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 7414 "sizeof(char)>::type>;"); 7415 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 7416 verifyFormat("f(a.operator()<A>());"); 7417 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7418 " .template operator()<A>());", 7419 getLLVMStyleWithColumns(35)); 7420 7421 // Not template parameters. 7422 verifyFormat("return a < b && c > d;"); 7423 verifyFormat("void f() {\n" 7424 " while (a < b && c > d) {\n" 7425 " }\n" 7426 "}"); 7427 verifyFormat("template <typename... Types>\n" 7428 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 7429 7430 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 7432 getLLVMStyleWithColumns(60)); 7433 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 7434 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 7435 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 7436 } 7437 7438 TEST_F(FormatTest, BitshiftOperatorWidth) { 7439 EXPECT_EQ("int a = 1 << 2; /* foo\n" 7440 " bar */", 7441 format("int a=1<<2; /* foo\n" 7442 " bar */")); 7443 7444 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 7445 " bar */", 7446 format("int b =256>>1 ; /* foo\n" 7447 " bar */")); 7448 } 7449 7450 TEST_F(FormatTest, UnderstandsBinaryOperators) { 7451 verifyFormat("COMPARE(a, ==, b);"); 7452 verifyFormat("auto s = sizeof...(Ts) - 1;"); 7453 } 7454 7455 TEST_F(FormatTest, UnderstandsPointersToMembers) { 7456 verifyFormat("int A::*x;"); 7457 verifyFormat("int (S::*func)(void *);"); 7458 verifyFormat("void f() { int (S::*func)(void *); }"); 7459 verifyFormat("typedef bool *(Class::*Member)() const;"); 7460 verifyFormat("void f() {\n" 7461 " (a->*f)();\n" 7462 " a->*x;\n" 7463 " (a.*f)();\n" 7464 " ((*a).*f)();\n" 7465 " a.*x;\n" 7466 "}"); 7467 verifyFormat("void f() {\n" 7468 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7469 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 7470 "}"); 7471 verifyFormat( 7472 "(aaaaaaaaaa->*bbbbbbb)(\n" 7473 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7474 FormatStyle Style = getLLVMStyle(); 7475 Style.PointerAlignment = FormatStyle::PAS_Left; 7476 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 7477 } 7478 7479 TEST_F(FormatTest, UnderstandsUnaryOperators) { 7480 verifyFormat("int a = -2;"); 7481 verifyFormat("f(-1, -2, -3);"); 7482 verifyFormat("a[-1] = 5;"); 7483 verifyFormat("int a = 5 + -2;"); 7484 verifyFormat("if (i == -1) {\n}"); 7485 verifyFormat("if (i != -1) {\n}"); 7486 verifyFormat("if (i > -1) {\n}"); 7487 verifyFormat("if (i < -1) {\n}"); 7488 verifyFormat("++(a->f());"); 7489 verifyFormat("--(a->f());"); 7490 verifyFormat("(a->f())++;"); 7491 verifyFormat("a[42]++;"); 7492 verifyFormat("if (!(a->f())) {\n}"); 7493 verifyFormat("if (!+i) {\n}"); 7494 verifyFormat("~&a;"); 7495 7496 verifyFormat("a-- > b;"); 7497 verifyFormat("b ? -a : c;"); 7498 verifyFormat("n * sizeof char16;"); 7499 verifyFormat("n * alignof char16;", getGoogleStyle()); 7500 verifyFormat("sizeof(char);"); 7501 verifyFormat("alignof(char);", getGoogleStyle()); 7502 7503 verifyFormat("return -1;"); 7504 verifyFormat("throw -1;"); 7505 verifyFormat("switch (a) {\n" 7506 "case -1:\n" 7507 " break;\n" 7508 "}"); 7509 verifyFormat("#define X -1"); 7510 verifyFormat("#define X -kConstant"); 7511 7512 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7513 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7514 7515 verifyFormat("int a = /* confusing comment */ -1;"); 7516 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7517 verifyFormat("int a = i /* confusing comment */++;"); 7518 7519 verifyFormat("co_yield -1;"); 7520 verifyFormat("co_return -1;"); 7521 } 7522 7523 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7524 verifyFormat("if (!aaaaaaaaaa( // break\n" 7525 " aaaaa)) {\n" 7526 "}"); 7527 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7528 " aaaaa));"); 7529 verifyFormat("*aaa = aaaaaaa( // break\n" 7530 " bbbbbb);"); 7531 } 7532 7533 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7534 verifyFormat("bool operator<();"); 7535 verifyFormat("bool operator>();"); 7536 verifyFormat("bool operator=();"); 7537 verifyFormat("bool operator==();"); 7538 verifyFormat("bool operator!=();"); 7539 verifyFormat("int operator+();"); 7540 verifyFormat("int operator++();"); 7541 verifyFormat("int operator++(int) volatile noexcept;"); 7542 verifyFormat("bool operator,();"); 7543 verifyFormat("bool operator();"); 7544 verifyFormat("bool operator()();"); 7545 verifyFormat("bool operator[]();"); 7546 verifyFormat("operator bool();"); 7547 verifyFormat("operator int();"); 7548 verifyFormat("operator void *();"); 7549 verifyFormat("operator SomeType<int>();"); 7550 verifyFormat("operator SomeType<int, int>();"); 7551 verifyFormat("operator SomeType<SomeType<int>>();"); 7552 verifyFormat("void *operator new(std::size_t size);"); 7553 verifyFormat("void *operator new[](std::size_t size);"); 7554 verifyFormat("void operator delete(void *ptr);"); 7555 verifyFormat("void operator delete[](void *ptr);"); 7556 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7557 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7558 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7559 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7560 7561 verifyFormat( 7562 "ostream &operator<<(ostream &OutputStream,\n" 7563 " SomeReallyLongType WithSomeReallyLongValue);"); 7564 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7565 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7566 " return left.group < right.group;\n" 7567 "}"); 7568 verifyFormat("SomeType &operator=(const SomeType &S);"); 7569 verifyFormat("f.template operator()<int>();"); 7570 7571 verifyGoogleFormat("operator void*();"); 7572 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7573 verifyGoogleFormat("operator ::A();"); 7574 7575 verifyFormat("using A::operator+;"); 7576 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7577 "int i;"); 7578 } 7579 7580 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7581 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7582 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7583 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7584 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7585 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7586 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7587 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7588 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7589 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7590 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7591 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7592 verifyFormat("void Fn(T const &) const &;"); 7593 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7594 verifyFormat("template <typename T>\n" 7595 "void F(T) && = delete;", 7596 getGoogleStyle()); 7597 7598 FormatStyle AlignLeft = getLLVMStyle(); 7599 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7600 verifyFormat("void A::b() && {}", AlignLeft); 7601 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7602 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7603 AlignLeft); 7604 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7605 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7606 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7607 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7608 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7609 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7610 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7611 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7612 7613 FormatStyle Spaces = getLLVMStyle(); 7614 Spaces.SpacesInCStyleCastParentheses = true; 7615 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7616 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7617 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7618 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7619 7620 Spaces.SpacesInCStyleCastParentheses = false; 7621 Spaces.SpacesInParentheses = true; 7622 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7623 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7624 Spaces); 7625 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7626 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7627 7628 FormatStyle BreakTemplate = getLLVMStyle(); 7629 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7630 7631 verifyFormat("struct f {\n" 7632 " template <class T>\n" 7633 " int &foo(const std::string &str) &noexcept {}\n" 7634 "};", 7635 BreakTemplate); 7636 7637 verifyFormat("struct f {\n" 7638 " template <class T>\n" 7639 " int &foo(const std::string &str) &&noexcept {}\n" 7640 "};", 7641 BreakTemplate); 7642 7643 verifyFormat("struct f {\n" 7644 " template <class T>\n" 7645 " int &foo(const std::string &str) const &noexcept {}\n" 7646 "};", 7647 BreakTemplate); 7648 7649 verifyFormat("struct f {\n" 7650 " template <class T>\n" 7651 " int &foo(const std::string &str) const &noexcept {}\n" 7652 "};", 7653 BreakTemplate); 7654 7655 verifyFormat("struct f {\n" 7656 " template <class T>\n" 7657 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7658 "};", 7659 BreakTemplate); 7660 7661 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7662 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7663 FormatStyle::BTDS_Yes; 7664 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7665 7666 verifyFormat("struct f {\n" 7667 " template <class T>\n" 7668 " int& foo(const std::string& str) & noexcept {}\n" 7669 "};", 7670 AlignLeftBreakTemplate); 7671 7672 verifyFormat("struct f {\n" 7673 " template <class T>\n" 7674 " int& foo(const std::string& str) && noexcept {}\n" 7675 "};", 7676 AlignLeftBreakTemplate); 7677 7678 verifyFormat("struct f {\n" 7679 " template <class T>\n" 7680 " int& foo(const std::string& str) const& noexcept {}\n" 7681 "};", 7682 AlignLeftBreakTemplate); 7683 7684 verifyFormat("struct f {\n" 7685 " template <class T>\n" 7686 " int& foo(const std::string& str) const&& noexcept {}\n" 7687 "};", 7688 AlignLeftBreakTemplate); 7689 7690 verifyFormat("struct f {\n" 7691 " template <class T>\n" 7692 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7693 "};", 7694 AlignLeftBreakTemplate); 7695 7696 // The `&` in `Type&` should not be confused with a trailing `&` of 7697 // DEPRECATED(reason) member function. 7698 verifyFormat("struct f {\n" 7699 " template <class T>\n" 7700 " DEPRECATED(reason)\n" 7701 " Type &foo(arguments) {}\n" 7702 "};", 7703 BreakTemplate); 7704 7705 verifyFormat("struct f {\n" 7706 " template <class T>\n" 7707 " DEPRECATED(reason)\n" 7708 " Type& foo(arguments) {}\n" 7709 "};", 7710 AlignLeftBreakTemplate); 7711 7712 verifyFormat("void (*foopt)(int) = &func;"); 7713 } 7714 7715 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7716 verifyFormat("void f() {\n" 7717 " A *a = new A;\n" 7718 " A *a = new (placement) A;\n" 7719 " delete a;\n" 7720 " delete (A *)a;\n" 7721 "}"); 7722 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7723 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7724 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7725 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7726 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7727 verifyFormat("delete[] h->p;"); 7728 } 7729 7730 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7731 verifyFormat("int *f(int *a) {}"); 7732 verifyFormat("int main(int argc, char **argv) {}"); 7733 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7734 verifyIndependentOfContext("f(a, *a);"); 7735 verifyFormat("void g() { f(*a); }"); 7736 verifyIndependentOfContext("int a = b * 10;"); 7737 verifyIndependentOfContext("int a = 10 * b;"); 7738 verifyIndependentOfContext("int a = b * c;"); 7739 verifyIndependentOfContext("int a += b * c;"); 7740 verifyIndependentOfContext("int a -= b * c;"); 7741 verifyIndependentOfContext("int a *= b * c;"); 7742 verifyIndependentOfContext("int a /= b * c;"); 7743 verifyIndependentOfContext("int a = *b;"); 7744 verifyIndependentOfContext("int a = *b * c;"); 7745 verifyIndependentOfContext("int a = b * *c;"); 7746 verifyIndependentOfContext("int a = b * (10);"); 7747 verifyIndependentOfContext("S << b * (10);"); 7748 verifyIndependentOfContext("return 10 * b;"); 7749 verifyIndependentOfContext("return *b * *c;"); 7750 verifyIndependentOfContext("return a & ~b;"); 7751 verifyIndependentOfContext("f(b ? *c : *d);"); 7752 verifyIndependentOfContext("int a = b ? *c : *d;"); 7753 verifyIndependentOfContext("*b = a;"); 7754 verifyIndependentOfContext("a * ~b;"); 7755 verifyIndependentOfContext("a * !b;"); 7756 verifyIndependentOfContext("a * +b;"); 7757 verifyIndependentOfContext("a * -b;"); 7758 verifyIndependentOfContext("a * ++b;"); 7759 verifyIndependentOfContext("a * --b;"); 7760 verifyIndependentOfContext("a[4] * b;"); 7761 verifyIndependentOfContext("a[a * a] = 1;"); 7762 verifyIndependentOfContext("f() * b;"); 7763 verifyIndependentOfContext("a * [self dostuff];"); 7764 verifyIndependentOfContext("int x = a * (a + b);"); 7765 verifyIndependentOfContext("(a *)(a + b);"); 7766 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7767 verifyIndependentOfContext("int *pa = (int *)&a;"); 7768 verifyIndependentOfContext("return sizeof(int **);"); 7769 verifyIndependentOfContext("return sizeof(int ******);"); 7770 verifyIndependentOfContext("return (int **&)a;"); 7771 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7772 verifyFormat("void f(Type (*parameter)[10]) {}"); 7773 verifyFormat("void f(Type (¶meter)[10]) {}"); 7774 verifyGoogleFormat("return sizeof(int**);"); 7775 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7776 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7777 verifyFormat("auto a = [](int **&, int ***) {};"); 7778 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7779 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7780 verifyFormat("[](const decltype(*a) &value) {}"); 7781 verifyFormat("decltype(a * b) F();"); 7782 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7783 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7784 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7785 verifyIndependentOfContext("int i{a * b};"); 7786 verifyIndependentOfContext("aaa && aaa->f();"); 7787 verifyIndependentOfContext("int x = ~*p;"); 7788 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7789 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7790 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7791 verifyFormat("void f() { f(a, c * d); }"); 7792 verifyFormat("void f() { f(new a(), c * d); }"); 7793 verifyFormat("void f(const MyOverride &override);"); 7794 verifyFormat("void f(const MyFinal &final);"); 7795 verifyIndependentOfContext("bool a = f() && override.f();"); 7796 verifyIndependentOfContext("bool a = f() && final.f();"); 7797 7798 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7799 7800 verifyIndependentOfContext("A<int *> a;"); 7801 verifyIndependentOfContext("A<int **> a;"); 7802 verifyIndependentOfContext("A<int *, int *> a;"); 7803 verifyIndependentOfContext("A<int *[]> a;"); 7804 verifyIndependentOfContext( 7805 "const char *const p = reinterpret_cast<const char *const>(q);"); 7806 verifyIndependentOfContext("A<int **, int **> a;"); 7807 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7808 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7809 verifyFormat("for (; a && b;) {\n}"); 7810 verifyFormat("bool foo = true && [] { return false; }();"); 7811 7812 verifyFormat( 7813 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7814 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7815 7816 verifyGoogleFormat("int const* a = &b;"); 7817 verifyGoogleFormat("**outparam = 1;"); 7818 verifyGoogleFormat("*outparam = a * b;"); 7819 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7820 verifyGoogleFormat("A<int*> a;"); 7821 verifyGoogleFormat("A<int**> a;"); 7822 verifyGoogleFormat("A<int*, int*> a;"); 7823 verifyGoogleFormat("A<int**, int**> a;"); 7824 verifyGoogleFormat("f(b ? *c : *d);"); 7825 verifyGoogleFormat("int a = b ? *c : *d;"); 7826 verifyGoogleFormat("Type* t = **x;"); 7827 verifyGoogleFormat("Type* t = *++*x;"); 7828 verifyGoogleFormat("*++*x;"); 7829 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7830 verifyGoogleFormat("Type* t = x++ * y;"); 7831 verifyGoogleFormat( 7832 "const char* const p = reinterpret_cast<const char* const>(q);"); 7833 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7834 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7835 verifyGoogleFormat("template <typename T>\n" 7836 "void f(int i = 0, SomeType** temps = NULL);"); 7837 7838 FormatStyle Left = getLLVMStyle(); 7839 Left.PointerAlignment = FormatStyle::PAS_Left; 7840 verifyFormat("x = *a(x) = *a(y);", Left); 7841 verifyFormat("for (;; *a = b) {\n}", Left); 7842 verifyFormat("return *this += 1;", Left); 7843 verifyFormat("throw *x;", Left); 7844 verifyFormat("delete *x;", Left); 7845 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7846 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7847 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7848 verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left); 7849 verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left); 7850 verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left); 7851 7852 verifyIndependentOfContext("a = *(x + y);"); 7853 verifyIndependentOfContext("a = &(x + y);"); 7854 verifyIndependentOfContext("*(x + y).call();"); 7855 verifyIndependentOfContext("&(x + y)->call();"); 7856 verifyFormat("void f() { &(*I).first; }"); 7857 7858 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7859 verifyFormat( 7860 "int *MyValues = {\n" 7861 " *A, // Operator detection might be confused by the '{'\n" 7862 " *BB // Operator detection might be confused by previous comment\n" 7863 "};"); 7864 7865 verifyIndependentOfContext("if (int *a = &b)"); 7866 verifyIndependentOfContext("if (int &a = *b)"); 7867 verifyIndependentOfContext("if (a & b[i])"); 7868 verifyIndependentOfContext("if constexpr (a & b[i])"); 7869 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7870 verifyIndependentOfContext("if (a * (b * c))"); 7871 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7872 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7873 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7874 verifyIndependentOfContext("if (*b[i])"); 7875 verifyIndependentOfContext("if (int *a = (&b))"); 7876 verifyIndependentOfContext("while (int *a = &b)"); 7877 verifyIndependentOfContext("while (a * (b * c))"); 7878 verifyIndependentOfContext("size = sizeof *a;"); 7879 verifyIndependentOfContext("if (a && (b = c))"); 7880 verifyFormat("void f() {\n" 7881 " for (const int &v : Values) {\n" 7882 " }\n" 7883 "}"); 7884 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7885 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7886 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7887 7888 verifyFormat("#define A (!a * b)"); 7889 verifyFormat("#define MACRO \\\n" 7890 " int *i = a * b; \\\n" 7891 " void f(a *b);", 7892 getLLVMStyleWithColumns(19)); 7893 7894 verifyIndependentOfContext("A = new SomeType *[Length];"); 7895 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7896 verifyIndependentOfContext("T **t = new T *;"); 7897 verifyIndependentOfContext("T **t = new T *();"); 7898 verifyGoogleFormat("A = new SomeType*[Length]();"); 7899 verifyGoogleFormat("A = new SomeType*[Length];"); 7900 verifyGoogleFormat("T** t = new T*;"); 7901 verifyGoogleFormat("T** t = new T*();"); 7902 7903 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7904 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7905 verifyFormat("template <bool a, bool b> " 7906 "typename t::if<x && y>::type f() {}"); 7907 verifyFormat("template <int *y> f() {}"); 7908 verifyFormat("vector<int *> v;"); 7909 verifyFormat("vector<int *const> v;"); 7910 verifyFormat("vector<int *const **const *> v;"); 7911 verifyFormat("vector<int *volatile> v;"); 7912 verifyFormat("vector<a * b> v;"); 7913 verifyFormat("foo<b && false>();"); 7914 verifyFormat("foo<b & 1>();"); 7915 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7916 verifyFormat( 7917 "template <class T, class = typename std::enable_if<\n" 7918 " std::is_integral<T>::value &&\n" 7919 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7920 "void F();", 7921 getLLVMStyleWithColumns(70)); 7922 verifyFormat("template <class T,\n" 7923 " class = typename std::enable_if<\n" 7924 " std::is_integral<T>::value &&\n" 7925 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7926 " class U>\n" 7927 "void F();", 7928 getLLVMStyleWithColumns(70)); 7929 verifyFormat( 7930 "template <class T,\n" 7931 " class = typename ::std::enable_if<\n" 7932 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7933 "void F();", 7934 getGoogleStyleWithColumns(68)); 7935 7936 verifyIndependentOfContext("MACRO(int *i);"); 7937 verifyIndependentOfContext("MACRO(auto *a);"); 7938 verifyIndependentOfContext("MACRO(const A *a);"); 7939 verifyIndependentOfContext("MACRO(A *const a);"); 7940 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7941 verifyFormat("void f() { f(float{1}, a * a); }"); 7942 // FIXME: Is there a way to make this work? 7943 // verifyIndependentOfContext("MACRO(A *a);"); 7944 7945 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7946 verifyFormat("return options != nullptr && operator==(*options);"); 7947 7948 EXPECT_EQ("#define OP(x) \\\n" 7949 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7950 " return s << a.DebugString(); \\\n" 7951 " }", 7952 format("#define OP(x) \\\n" 7953 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7954 " return s << a.DebugString(); \\\n" 7955 " }", 7956 getLLVMStyleWithColumns(50))); 7957 7958 // FIXME: We cannot handle this case yet; we might be able to figure out that 7959 // foo<x> d > v; doesn't make sense. 7960 verifyFormat("foo<a<b && c> d> v;"); 7961 7962 FormatStyle PointerMiddle = getLLVMStyle(); 7963 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7964 verifyFormat("delete *x;", PointerMiddle); 7965 verifyFormat("int * x;", PointerMiddle); 7966 verifyFormat("int *[] x;", PointerMiddle); 7967 verifyFormat("template <int * y> f() {}", PointerMiddle); 7968 verifyFormat("int * f(int * a) {}", PointerMiddle); 7969 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7970 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7971 verifyFormat("A<int *> a;", PointerMiddle); 7972 verifyFormat("A<int **> a;", PointerMiddle); 7973 verifyFormat("A<int *, int *> a;", PointerMiddle); 7974 verifyFormat("A<int *[]> a;", PointerMiddle); 7975 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7976 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7977 verifyFormat("T ** t = new T *;", PointerMiddle); 7978 7979 // Member function reference qualifiers aren't binary operators. 7980 verifyFormat("string // break\n" 7981 "operator()() & {}"); 7982 verifyFormat("string // break\n" 7983 "operator()() && {}"); 7984 verifyGoogleFormat("template <typename T>\n" 7985 "auto x() & -> int {}"); 7986 } 7987 7988 TEST_F(FormatTest, UnderstandsAttributes) { 7989 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7990 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7991 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7992 FormatStyle AfterType = getLLVMStyle(); 7993 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7994 verifyFormat("__attribute__((nodebug)) void\n" 7995 "foo() {}\n", 7996 AfterType); 7997 } 7998 7999 TEST_F(FormatTest, UnderstandsSquareAttributes) { 8000 verifyFormat("SomeType s [[unused]] (InitValue);"); 8001 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 8002 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 8003 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 8004 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 8005 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8006 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8007 verifyFormat("[[nodiscard]] bool f() { return false; }"); 8008 verifyFormat("class [[nodiscard]] f {\npublic:\n f() {}\n}"); 8009 verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n f() {}\n}"); 8010 verifyFormat("class [[gnu::unused]] f {\npublic:\n f() {}\n}"); 8011 8012 // Make sure we do not mistake attributes for array subscripts. 8013 verifyFormat("int a() {}\n" 8014 "[[unused]] int b() {}\n"); 8015 verifyFormat("NSArray *arr;\n" 8016 "arr[[Foo() bar]];"); 8017 8018 // On the other hand, we still need to correctly find array subscripts. 8019 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 8020 8021 // Make sure that we do not mistake Objective-C method inside array literals 8022 // as attributes, even if those method names are also keywords. 8023 verifyFormat("@[ [foo bar] ];"); 8024 verifyFormat("@[ [NSArray class] ];"); 8025 verifyFormat("@[ [foo enum] ];"); 8026 8027 verifyFormat("template <typename T> [[nodiscard]] int a() { return 1; }"); 8028 8029 // Make sure we do not parse attributes as lambda introducers. 8030 FormatStyle MultiLineFunctions = getLLVMStyle(); 8031 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8032 verifyFormat("[[unused]] int b() {\n" 8033 " return 42;\n" 8034 "}\n", 8035 MultiLineFunctions); 8036 } 8037 8038 TEST_F(FormatTest, AttributeClass) { 8039 FormatStyle Style = getChromiumStyle(FormatStyle::LK_Cpp); 8040 verifyFormat("class S {\n" 8041 " S(S&&) = default;\n" 8042 "};", 8043 Style); 8044 verifyFormat("class [[nodiscard]] S {\n" 8045 " S(S&&) = default;\n" 8046 "};", 8047 Style); 8048 verifyFormat("class __attribute((maybeunused)) S {\n" 8049 " S(S&&) = default;\n" 8050 "};", 8051 Style); 8052 verifyFormat("struct S {\n" 8053 " S(S&&) = default;\n" 8054 "};", 8055 Style); 8056 verifyFormat("struct [[nodiscard]] S {\n" 8057 " S(S&&) = default;\n" 8058 "};", 8059 Style); 8060 } 8061 8062 TEST_F(FormatTest, AttributesAfterMacro) { 8063 FormatStyle Style = getLLVMStyle(); 8064 verifyFormat("MACRO;\n" 8065 "__attribute__((maybe_unused)) int foo() {\n" 8066 " //...\n" 8067 "}"); 8068 8069 verifyFormat("MACRO;\n" 8070 "[[nodiscard]] int foo() {\n" 8071 " //...\n" 8072 "}"); 8073 8074 EXPECT_EQ("MACRO\n\n" 8075 "__attribute__((maybe_unused)) int foo() {\n" 8076 " //...\n" 8077 "}", 8078 format("MACRO\n\n" 8079 "__attribute__((maybe_unused)) int foo() {\n" 8080 " //...\n" 8081 "}")); 8082 8083 EXPECT_EQ("MACRO\n\n" 8084 "[[nodiscard]] int foo() {\n" 8085 " //...\n" 8086 "}", 8087 format("MACRO\n\n" 8088 "[[nodiscard]] int foo() {\n" 8089 " //...\n" 8090 "}")); 8091 } 8092 8093 TEST_F(FormatTest, AttributePenaltyBreaking) { 8094 FormatStyle Style = getLLVMStyle(); 8095 verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n" 8096 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8097 Style); 8098 verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n" 8099 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8100 Style); 8101 verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const " 8102 "shared_ptr<ALongTypeName> &C d) {\n}", 8103 Style); 8104 } 8105 8106 TEST_F(FormatTest, UnderstandsEllipsis) { 8107 verifyFormat("int printf(const char *fmt, ...);"); 8108 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 8109 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 8110 8111 FormatStyle PointersLeft = getLLVMStyle(); 8112 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 8113 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 8114 } 8115 8116 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 8117 EXPECT_EQ("int *a;\n" 8118 "int *a;\n" 8119 "int *a;", 8120 format("int *a;\n" 8121 "int* a;\n" 8122 "int *a;", 8123 getGoogleStyle())); 8124 EXPECT_EQ("int* a;\n" 8125 "int* a;\n" 8126 "int* a;", 8127 format("int* a;\n" 8128 "int* a;\n" 8129 "int *a;", 8130 getGoogleStyle())); 8131 EXPECT_EQ("int *a;\n" 8132 "int *a;\n" 8133 "int *a;", 8134 format("int *a;\n" 8135 "int * a;\n" 8136 "int * a;", 8137 getGoogleStyle())); 8138 EXPECT_EQ("auto x = [] {\n" 8139 " int *a;\n" 8140 " int *a;\n" 8141 " int *a;\n" 8142 "};", 8143 format("auto x=[]{int *a;\n" 8144 "int * a;\n" 8145 "int * a;};", 8146 getGoogleStyle())); 8147 } 8148 8149 TEST_F(FormatTest, UnderstandsRvalueReferences) { 8150 verifyFormat("int f(int &&a) {}"); 8151 verifyFormat("int f(int a, char &&b) {}"); 8152 verifyFormat("void f() { int &&a = b; }"); 8153 verifyGoogleFormat("int f(int a, char&& b) {}"); 8154 verifyGoogleFormat("void f() { int&& a = b; }"); 8155 8156 verifyIndependentOfContext("A<int &&> a;"); 8157 verifyIndependentOfContext("A<int &&, int &&> a;"); 8158 verifyGoogleFormat("A<int&&> a;"); 8159 verifyGoogleFormat("A<int&&, int&&> a;"); 8160 8161 // Not rvalue references: 8162 verifyFormat("template <bool B, bool C> class A {\n" 8163 " static_assert(B && C, \"Something is wrong\");\n" 8164 "};"); 8165 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 8166 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 8167 verifyFormat("#define A(a, b) (a && b)"); 8168 } 8169 8170 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 8171 verifyFormat("void f() {\n" 8172 " x[aaaaaaaaa -\n" 8173 " b] = 23;\n" 8174 "}", 8175 getLLVMStyleWithColumns(15)); 8176 } 8177 8178 TEST_F(FormatTest, FormatsCasts) { 8179 verifyFormat("Type *A = static_cast<Type *>(P);"); 8180 verifyFormat("Type *A = (Type *)P;"); 8181 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 8182 verifyFormat("int a = (int)(2.0f);"); 8183 verifyFormat("int a = (int)2.0f;"); 8184 verifyFormat("x[(int32)y];"); 8185 verifyFormat("x = (int32)y;"); 8186 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 8187 verifyFormat("int a = (int)*b;"); 8188 verifyFormat("int a = (int)2.0f;"); 8189 verifyFormat("int a = (int)~0;"); 8190 verifyFormat("int a = (int)++a;"); 8191 verifyFormat("int a = (int)sizeof(int);"); 8192 verifyFormat("int a = (int)+2;"); 8193 verifyFormat("my_int a = (my_int)2.0f;"); 8194 verifyFormat("my_int a = (my_int)sizeof(int);"); 8195 verifyFormat("return (my_int)aaa;"); 8196 verifyFormat("#define x ((int)-1)"); 8197 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 8198 verifyFormat("#define p(q) ((int *)&q)"); 8199 verifyFormat("fn(a)(b) + 1;"); 8200 8201 verifyFormat("void f() { my_int a = (my_int)*b; }"); 8202 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 8203 verifyFormat("my_int a = (my_int)~0;"); 8204 verifyFormat("my_int a = (my_int)++a;"); 8205 verifyFormat("my_int a = (my_int)-2;"); 8206 verifyFormat("my_int a = (my_int)1;"); 8207 verifyFormat("my_int a = (my_int *)1;"); 8208 verifyFormat("my_int a = (const my_int)-1;"); 8209 verifyFormat("my_int a = (const my_int *)-1;"); 8210 verifyFormat("my_int a = (my_int)(my_int)-1;"); 8211 verifyFormat("my_int a = (ns::my_int)-2;"); 8212 verifyFormat("case (my_int)ONE:"); 8213 verifyFormat("auto x = (X)this;"); 8214 // Casts in Obj-C style calls used to not be recognized as such. 8215 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 8216 8217 // FIXME: single value wrapped with paren will be treated as cast. 8218 verifyFormat("void f(int i = (kValue)*kMask) {}"); 8219 8220 verifyFormat("{ (void)F; }"); 8221 8222 // Don't break after a cast's 8223 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 8224 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 8225 " bbbbbbbbbbbbbbbbbbbbbb);"); 8226 8227 // These are not casts. 8228 verifyFormat("void f(int *) {}"); 8229 verifyFormat("f(foo)->b;"); 8230 verifyFormat("f(foo).b;"); 8231 verifyFormat("f(foo)(b);"); 8232 verifyFormat("f(foo)[b];"); 8233 verifyFormat("[](foo) { return 4; }(bar);"); 8234 verifyFormat("(*funptr)(foo)[4];"); 8235 verifyFormat("funptrs[4](foo)[4];"); 8236 verifyFormat("void f(int *);"); 8237 verifyFormat("void f(int *) = 0;"); 8238 verifyFormat("void f(SmallVector<int>) {}"); 8239 verifyFormat("void f(SmallVector<int>);"); 8240 verifyFormat("void f(SmallVector<int>) = 0;"); 8241 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 8242 verifyFormat("int a = sizeof(int) * b;"); 8243 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 8244 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 8245 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 8246 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 8247 8248 // These are not casts, but at some point were confused with casts. 8249 verifyFormat("virtual void foo(int *) override;"); 8250 verifyFormat("virtual void foo(char &) const;"); 8251 verifyFormat("virtual void foo(int *a, char *) const;"); 8252 verifyFormat("int a = sizeof(int *) + b;"); 8253 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 8254 verifyFormat("bool b = f(g<int>) && c;"); 8255 verifyFormat("typedef void (*f)(int i) func;"); 8256 verifyFormat("void operator++(int) noexcept;"); 8257 verifyFormat("void operator++(int &) noexcept;"); 8258 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 8259 "&) noexcept;"); 8260 verifyFormat( 8261 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 8262 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 8263 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 8264 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 8265 verifyFormat("void operator delete(foo &) noexcept;"); 8266 verifyFormat("void operator delete(foo) noexcept;"); 8267 verifyFormat("void operator delete(int) noexcept;"); 8268 verifyFormat("void operator delete(int &) noexcept;"); 8269 verifyFormat("void operator delete(int &) volatile noexcept;"); 8270 verifyFormat("void operator delete(int &) const"); 8271 verifyFormat("void operator delete(int &) = default"); 8272 verifyFormat("void operator delete(int &) = delete"); 8273 verifyFormat("void operator delete(int &) [[noreturn]]"); 8274 verifyFormat("void operator delete(int &) throw();"); 8275 verifyFormat("void operator delete(int &) throw(int);"); 8276 verifyFormat("auto operator delete(int &) -> int;"); 8277 verifyFormat("auto operator delete(int &) override"); 8278 verifyFormat("auto operator delete(int &) final"); 8279 8280 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 8281 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 8282 // FIXME: The indentation here is not ideal. 8283 verifyFormat( 8284 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8285 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 8286 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 8287 } 8288 8289 TEST_F(FormatTest, FormatsFunctionTypes) { 8290 verifyFormat("A<bool()> a;"); 8291 verifyFormat("A<SomeType()> a;"); 8292 verifyFormat("A<void (*)(int, std::string)> a;"); 8293 verifyFormat("A<void *(int)>;"); 8294 verifyFormat("void *(*a)(int *, SomeType *);"); 8295 verifyFormat("int (*func)(void *);"); 8296 verifyFormat("void f() { int (*func)(void *); }"); 8297 verifyFormat("template <class CallbackClass>\n" 8298 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 8299 8300 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 8301 verifyGoogleFormat("void* (*a)(int);"); 8302 verifyGoogleFormat( 8303 "template <class CallbackClass>\n" 8304 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 8305 8306 // Other constructs can look somewhat like function types: 8307 verifyFormat("A<sizeof(*x)> a;"); 8308 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 8309 verifyFormat("some_var = function(*some_pointer_var)[0];"); 8310 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 8311 verifyFormat("int x = f(&h)();"); 8312 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 8313 verifyFormat("std::function<\n" 8314 " LooooooooooongTemplatedType<\n" 8315 " SomeType>*(\n" 8316 " LooooooooooooooooongType type)>\n" 8317 " function;", 8318 getGoogleStyleWithColumns(40)); 8319 } 8320 8321 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 8322 verifyFormat("A (*foo_)[6];"); 8323 verifyFormat("vector<int> (*foo_)[6];"); 8324 } 8325 8326 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 8327 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8328 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8329 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 8330 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8331 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8332 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8333 8334 // Different ways of ()-initializiation. 8335 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8336 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 8337 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8338 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 8339 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8340 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 8341 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8342 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 8343 8344 // Lambdas should not confuse the variable declaration heuristic. 8345 verifyFormat("LooooooooooooooooongType\n" 8346 " variable(nullptr, [](A *a) {});", 8347 getLLVMStyleWithColumns(40)); 8348 } 8349 8350 TEST_F(FormatTest, BreaksLongDeclarations) { 8351 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 8352 " AnotherNameForTheLongType;"); 8353 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 8354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 8355 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8356 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8357 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 8358 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8359 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8360 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8361 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 8362 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8363 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8364 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8365 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8366 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8367 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8368 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 8369 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8370 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 8371 FormatStyle Indented = getLLVMStyle(); 8372 Indented.IndentWrappedFunctionNames = true; 8373 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8374 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 8375 Indented); 8376 verifyFormat( 8377 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8378 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8379 Indented); 8380 verifyFormat( 8381 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8382 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8383 Indented); 8384 verifyFormat( 8385 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8386 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8387 Indented); 8388 8389 // FIXME: Without the comment, this breaks after "(". 8390 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 8391 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 8392 getGoogleStyle()); 8393 8394 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 8395 " int LoooooooooooooooooooongParam2) {}"); 8396 verifyFormat( 8397 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 8398 " SourceLocation L, IdentifierIn *II,\n" 8399 " Type *T) {}"); 8400 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 8401 "ReallyReaaallyLongFunctionName(\n" 8402 " const std::string &SomeParameter,\n" 8403 " const SomeType<string, SomeOtherTemplateParameter>\n" 8404 " &ReallyReallyLongParameterName,\n" 8405 " const SomeType<string, SomeOtherTemplateParameter>\n" 8406 " &AnotherLongParameterName) {}"); 8407 verifyFormat("template <typename A>\n" 8408 "SomeLoooooooooooooooooooooongType<\n" 8409 " typename some_namespace::SomeOtherType<A>::Type>\n" 8410 "Function() {}"); 8411 8412 verifyGoogleFormat( 8413 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 8414 " aaaaaaaaaaaaaaaaaaaaaaa;"); 8415 verifyGoogleFormat( 8416 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 8417 " SourceLocation L) {}"); 8418 verifyGoogleFormat( 8419 "some_namespace::LongReturnType\n" 8420 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 8421 " int first_long_parameter, int second_parameter) {}"); 8422 8423 verifyGoogleFormat("template <typename T>\n" 8424 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8425 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 8426 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8427 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 8428 8429 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 8430 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8431 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8432 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8433 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8434 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 8435 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8436 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 8437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 8438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8439 8440 verifyFormat("template <typename T> // Templates on own line.\n" 8441 "static int // Some comment.\n" 8442 "MyFunction(int a);", 8443 getLLVMStyle()); 8444 } 8445 8446 TEST_F(FormatTest, FormatsArrays) { 8447 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8448 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 8449 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 8450 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 8451 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 8452 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 8453 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8454 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8455 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8456 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 8457 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8458 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8459 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8460 verifyFormat( 8461 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 8462 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8463 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 8464 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 8465 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8466 8467 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 8468 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 8469 verifyFormat( 8470 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 8471 " .aaaaaaa[0]\n" 8472 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8473 verifyFormat("a[::b::c];"); 8474 8475 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 8476 8477 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 8478 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 8479 } 8480 8481 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 8482 verifyFormat("(a)->b();"); 8483 verifyFormat("--a;"); 8484 } 8485 8486 TEST_F(FormatTest, HandlesIncludeDirectives) { 8487 verifyFormat("#include <string>\n" 8488 "#include <a/b/c.h>\n" 8489 "#include \"a/b/string\"\n" 8490 "#include \"string.h\"\n" 8491 "#include \"string.h\"\n" 8492 "#include <a-a>\n" 8493 "#include < path with space >\n" 8494 "#include_next <test.h>" 8495 "#include \"abc.h\" // this is included for ABC\n" 8496 "#include \"some long include\" // with a comment\n" 8497 "#include \"some very long include path\"\n" 8498 "#include <some/very/long/include/path>\n", 8499 getLLVMStyleWithColumns(35)); 8500 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 8501 EXPECT_EQ("#include <a>", format("#include<a>")); 8502 8503 verifyFormat("#import <string>"); 8504 verifyFormat("#import <a/b/c.h>"); 8505 verifyFormat("#import \"a/b/string\""); 8506 verifyFormat("#import \"string.h\""); 8507 verifyFormat("#import \"string.h\""); 8508 verifyFormat("#if __has_include(<strstream>)\n" 8509 "#include <strstream>\n" 8510 "#endif"); 8511 8512 verifyFormat("#define MY_IMPORT <a/b>"); 8513 8514 verifyFormat("#if __has_include(<a/b>)"); 8515 verifyFormat("#if __has_include_next(<a/b>)"); 8516 verifyFormat("#define F __has_include(<a/b>)"); 8517 verifyFormat("#define F __has_include_next(<a/b>)"); 8518 8519 // Protocol buffer definition or missing "#". 8520 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 8521 getLLVMStyleWithColumns(30)); 8522 8523 FormatStyle Style = getLLVMStyle(); 8524 Style.AlwaysBreakBeforeMultilineStrings = true; 8525 Style.ColumnLimit = 0; 8526 verifyFormat("#import \"abc.h\"", Style); 8527 8528 // But 'import' might also be a regular C++ namespace. 8529 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8530 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8531 } 8532 8533 //===----------------------------------------------------------------------===// 8534 // Error recovery tests. 8535 //===----------------------------------------------------------------------===// 8536 8537 TEST_F(FormatTest, IncompleteParameterLists) { 8538 FormatStyle NoBinPacking = getLLVMStyle(); 8539 NoBinPacking.BinPackParameters = false; 8540 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 8541 " double *min_x,\n" 8542 " double *max_x,\n" 8543 " double *min_y,\n" 8544 " double *max_y,\n" 8545 " double *min_z,\n" 8546 " double *max_z, ) {}", 8547 NoBinPacking); 8548 } 8549 8550 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 8551 verifyFormat("void f() { return; }\n42"); 8552 verifyFormat("void f() {\n" 8553 " if (0)\n" 8554 " return;\n" 8555 "}\n" 8556 "42"); 8557 verifyFormat("void f() { return }\n42"); 8558 verifyFormat("void f() {\n" 8559 " if (0)\n" 8560 " return\n" 8561 "}\n" 8562 "42"); 8563 } 8564 8565 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 8566 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 8567 EXPECT_EQ("void f() {\n" 8568 " if (a)\n" 8569 " return\n" 8570 "}", 8571 format("void f ( ) { if ( a ) return }")); 8572 EXPECT_EQ("namespace N {\n" 8573 "void f()\n" 8574 "}", 8575 format("namespace N { void f() }")); 8576 EXPECT_EQ("namespace N {\n" 8577 "void f() {}\n" 8578 "void g()\n" 8579 "} // namespace N", 8580 format("namespace N { void f( ) { } void g( ) }")); 8581 } 8582 8583 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 8584 verifyFormat("int aaaaaaaa =\n" 8585 " // Overlylongcomment\n" 8586 " b;", 8587 getLLVMStyleWithColumns(20)); 8588 verifyFormat("function(\n" 8589 " ShortArgument,\n" 8590 " LoooooooooooongArgument);\n", 8591 getLLVMStyleWithColumns(20)); 8592 } 8593 8594 TEST_F(FormatTest, IncorrectAccessSpecifier) { 8595 verifyFormat("public:"); 8596 verifyFormat("class A {\n" 8597 "public\n" 8598 " void f() {}\n" 8599 "};"); 8600 verifyFormat("public\n" 8601 "int qwerty;"); 8602 verifyFormat("public\n" 8603 "B {}"); 8604 verifyFormat("public\n" 8605 "{}"); 8606 verifyFormat("public\n" 8607 "B { int x; }"); 8608 } 8609 8610 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 8611 verifyFormat("{"); 8612 verifyFormat("#})"); 8613 verifyNoCrash("(/**/[:!] ?[)."); 8614 } 8615 8616 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 8617 // Found by oss-fuzz: 8618 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 8619 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 8620 Style.ColumnLimit = 60; 8621 verifyNoCrash( 8622 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 8623 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 8624 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 8625 Style); 8626 } 8627 8628 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 8629 verifyFormat("do {\n}"); 8630 verifyFormat("do {\n}\n" 8631 "f();"); 8632 verifyFormat("do {\n}\n" 8633 "wheeee(fun);"); 8634 verifyFormat("do {\n" 8635 " f();\n" 8636 "}"); 8637 } 8638 8639 TEST_F(FormatTest, IncorrectCodeMissingParens) { 8640 verifyFormat("if {\n foo;\n foo();\n}"); 8641 verifyFormat("switch {\n foo;\n foo();\n}"); 8642 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 8643 verifyFormat("while {\n foo;\n foo();\n}"); 8644 verifyFormat("do {\n foo;\n foo();\n} while;"); 8645 } 8646 8647 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 8648 verifyIncompleteFormat("namespace {\n" 8649 "class Foo { Foo (\n" 8650 "};\n" 8651 "} // namespace"); 8652 } 8653 8654 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 8655 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 8656 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 8657 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 8658 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 8659 8660 EXPECT_EQ("{\n" 8661 " {\n" 8662 " breakme(\n" 8663 " qwe);\n" 8664 " }\n", 8665 format("{\n" 8666 " {\n" 8667 " breakme(qwe);\n" 8668 "}\n", 8669 getLLVMStyleWithColumns(10))); 8670 } 8671 8672 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 8673 verifyFormat("int x = {\n" 8674 " avariable,\n" 8675 " b(alongervariable)};", 8676 getLLVMStyleWithColumns(25)); 8677 } 8678 8679 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 8680 verifyFormat("return (a)(b){1, 2, 3};"); 8681 } 8682 8683 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 8684 verifyFormat("vector<int> x{1, 2, 3, 4};"); 8685 verifyFormat("vector<int> x{\n" 8686 " 1,\n" 8687 " 2,\n" 8688 " 3,\n" 8689 " 4,\n" 8690 "};"); 8691 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 8692 verifyFormat("f({1, 2});"); 8693 verifyFormat("auto v = Foo{-1};"); 8694 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 8695 verifyFormat("Class::Class : member{1, 2, 3} {}"); 8696 verifyFormat("new vector<int>{1, 2, 3};"); 8697 verifyFormat("new int[3]{1, 2, 3};"); 8698 verifyFormat("new int{1};"); 8699 verifyFormat("return {arg1, arg2};"); 8700 verifyFormat("return {arg1, SomeType{parameter}};"); 8701 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 8702 verifyFormat("new T{arg1, arg2};"); 8703 verifyFormat("f(MyMap[{composite, key}]);"); 8704 verifyFormat("class Class {\n" 8705 " T member = {arg1, arg2};\n" 8706 "};"); 8707 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 8708 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 8709 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 8710 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 8711 verifyFormat("int a = std::is_integral<int>{} + 0;"); 8712 8713 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8714 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8715 verifyFormat("auto i = decltype(x){};"); 8716 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 8717 verifyFormat("Node n{1, Node{1000}, //\n" 8718 " 2};"); 8719 verifyFormat("Aaaa aaaaaaa{\n" 8720 " {\n" 8721 " aaaa,\n" 8722 " },\n" 8723 "};"); 8724 verifyFormat("class C : public D {\n" 8725 " SomeClass SC{2};\n" 8726 "};"); 8727 verifyFormat("class C : public A {\n" 8728 " class D : public B {\n" 8729 " void f() { int i{2}; }\n" 8730 " };\n" 8731 "};"); 8732 verifyFormat("#define A {a, a},"); 8733 8734 // Avoid breaking between equal sign and opening brace 8735 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 8736 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 8737 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 8738 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 8739 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 8740 " {\"ccccccccccccccccccccc\", 2}};", 8741 AvoidBreakingFirstArgument); 8742 8743 // Binpacking only if there is no trailing comma 8744 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 8745 " cccccccccc, dddddddddd};", 8746 getLLVMStyleWithColumns(50)); 8747 verifyFormat("const Aaaaaa aaaaa = {\n" 8748 " aaaaaaaaaaa,\n" 8749 " bbbbbbbbbbb,\n" 8750 " ccccccccccc,\n" 8751 " ddddddddddd,\n" 8752 "};", 8753 getLLVMStyleWithColumns(50)); 8754 8755 // Cases where distinguising braced lists and blocks is hard. 8756 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 8757 verifyFormat("void f() {\n" 8758 " return; // comment\n" 8759 "}\n" 8760 "SomeType t;"); 8761 verifyFormat("void f() {\n" 8762 " if (a) {\n" 8763 " f();\n" 8764 " }\n" 8765 "}\n" 8766 "SomeType t;"); 8767 8768 // In combination with BinPackArguments = false. 8769 FormatStyle NoBinPacking = getLLVMStyle(); 8770 NoBinPacking.BinPackArguments = false; 8771 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 8772 " bbbbb,\n" 8773 " ccccc,\n" 8774 " ddddd,\n" 8775 " eeeee,\n" 8776 " ffffff,\n" 8777 " ggggg,\n" 8778 " hhhhhh,\n" 8779 " iiiiii,\n" 8780 " jjjjjj,\n" 8781 " kkkkkk};", 8782 NoBinPacking); 8783 verifyFormat("const Aaaaaa aaaaa = {\n" 8784 " aaaaa,\n" 8785 " bbbbb,\n" 8786 " ccccc,\n" 8787 " ddddd,\n" 8788 " eeeee,\n" 8789 " ffffff,\n" 8790 " ggggg,\n" 8791 " hhhhhh,\n" 8792 " iiiiii,\n" 8793 " jjjjjj,\n" 8794 " kkkkkk,\n" 8795 "};", 8796 NoBinPacking); 8797 verifyFormat( 8798 "const Aaaaaa aaaaa = {\n" 8799 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 8800 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 8801 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 8802 "};", 8803 NoBinPacking); 8804 8805 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8806 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 8807 " CDDDP83848_BMCR_REGISTER,\n" 8808 " CDDDP83848_BMSR_REGISTER,\n" 8809 " CDDDP83848_RBR_REGISTER};", 8810 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 8811 " CDDDP83848_BMSR_REGISTER,\n" 8812 " CDDDP83848_RBR_REGISTER};", 8813 NoBinPacking)); 8814 8815 // FIXME: The alignment of these trailing comments might be bad. Then again, 8816 // this might be utterly useless in real code. 8817 verifyFormat("Constructor::Constructor()\n" 8818 " : some_value{ //\n" 8819 " aaaaaaa, //\n" 8820 " bbbbbbb} {}"); 8821 8822 // In braced lists, the first comment is always assumed to belong to the 8823 // first element. Thus, it can be moved to the next or previous line as 8824 // appropriate. 8825 EXPECT_EQ("function({// First element:\n" 8826 " 1,\n" 8827 " // Second element:\n" 8828 " 2});", 8829 format("function({\n" 8830 " // First element:\n" 8831 " 1,\n" 8832 " // Second element:\n" 8833 " 2});")); 8834 EXPECT_EQ("std::vector<int> MyNumbers{\n" 8835 " // First element:\n" 8836 " 1,\n" 8837 " // Second element:\n" 8838 " 2};", 8839 format("std::vector<int> MyNumbers{// First element:\n" 8840 " 1,\n" 8841 " // Second element:\n" 8842 " 2};", 8843 getLLVMStyleWithColumns(30))); 8844 // A trailing comma should still lead to an enforced line break and no 8845 // binpacking. 8846 EXPECT_EQ("vector<int> SomeVector = {\n" 8847 " // aaa\n" 8848 " 1,\n" 8849 " 2,\n" 8850 "};", 8851 format("vector<int> SomeVector = { // aaa\n" 8852 " 1, 2, };")); 8853 8854 // C++11 brace initializer list l-braces should not be treated any differently 8855 // when breaking before lambda bodies is enabled 8856 FormatStyle BreakBeforeLambdaBody = getLLVMStyle(); 8857 BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 8858 BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 8859 BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true; 8860 verifyFormat( 8861 "std::runtime_error{\n" 8862 " \"Long string which will force a break onto the next line...\"};", 8863 BreakBeforeLambdaBody); 8864 8865 FormatStyle ExtraSpaces = getLLVMStyle(); 8866 ExtraSpaces.Cpp11BracedListStyle = false; 8867 ExtraSpaces.ColumnLimit = 75; 8868 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8869 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8870 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8871 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8872 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8873 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8874 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8875 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8876 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8877 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8878 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8879 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8880 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8881 verifyFormat("class Class {\n" 8882 " T member = { arg1, arg2 };\n" 8883 "};", 8884 ExtraSpaces); 8885 verifyFormat( 8886 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8887 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8888 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8889 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8890 ExtraSpaces); 8891 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 8892 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 8893 ExtraSpaces); 8894 verifyFormat( 8895 "someFunction(OtherParam,\n" 8896 " BracedList{ // comment 1 (Forcing interesting break)\n" 8897 " param1, param2,\n" 8898 " // comment 2\n" 8899 " param3, param4 });", 8900 ExtraSpaces); 8901 verifyFormat( 8902 "std::this_thread::sleep_for(\n" 8903 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 8904 ExtraSpaces); 8905 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 8906 " aaaaaaa,\n" 8907 " aaaaaaaaaa,\n" 8908 " aaaaa,\n" 8909 " aaaaaaaaaaaaaaa,\n" 8910 " aaa,\n" 8911 " aaaaaaaaaa,\n" 8912 " a,\n" 8913 " aaaaaaaaaaaaaaaaaaaaa,\n" 8914 " aaaaaaaaaaaa,\n" 8915 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 8916 " aaaaaaa,\n" 8917 " a};"); 8918 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 8919 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 8920 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 8921 8922 // Avoid breaking between initializer/equal sign and opening brace 8923 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 8924 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 8925 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8926 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8927 " { \"ccccccccccccccccccccc\", 2 }\n" 8928 "};", 8929 ExtraSpaces); 8930 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 8931 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8932 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8933 " { \"ccccccccccccccccccccc\", 2 }\n" 8934 "};", 8935 ExtraSpaces); 8936 8937 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 8938 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 8939 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 8940 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 8941 8942 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 8943 SpaceBetweenBraces.SpacesInAngles = true; 8944 SpaceBetweenBraces.SpacesInParentheses = true; 8945 SpaceBetweenBraces.SpacesInSquareBrackets = true; 8946 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 8947 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 8948 verifyFormat("vector< int > x{ // comment 1\n" 8949 " 1, 2, 3, 4 };", 8950 SpaceBetweenBraces); 8951 SpaceBetweenBraces.ColumnLimit = 20; 8952 EXPECT_EQ("vector< int > x{\n" 8953 " 1, 2, 3, 4 };", 8954 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8955 SpaceBetweenBraces.ColumnLimit = 24; 8956 EXPECT_EQ("vector< int > x{ 1, 2,\n" 8957 " 3, 4 };", 8958 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8959 EXPECT_EQ("vector< int > x{\n" 8960 " 1,\n" 8961 " 2,\n" 8962 " 3,\n" 8963 " 4,\n" 8964 "};", 8965 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 8966 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 8967 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 8968 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 8969 } 8970 8971 TEST_F(FormatTest, FormatSpacesInAngles) { 8972 FormatStyle SpaceInAngles = getLLVMStyle(); 8973 SpaceInAngles.SpacesInAngles = true; 8974 verifyFormat("vector< ::std::string > x1;", SpaceInAngles); 8975 verifyFormat("Foo< int, Bar > x2;", SpaceInAngles); 8976 verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles); 8977 8978 SpaceInAngles.SpacesInAngles = false; 8979 verifyFormat("vector<::std::string> x4;", SpaceInAngles); 8980 verifyFormat("vector<int> x5;", SpaceInAngles); 8981 verifyFormat("Foo<int, Bar> x6;", SpaceInAngles); 8982 verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles); 8983 } 8984 8985 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 8986 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8987 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8988 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8989 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8990 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8991 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8992 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 8993 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8994 " 1, 22, 333, 4444, 55555, //\n" 8995 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8996 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8997 verifyFormat( 8998 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8999 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9000 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 9001 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9002 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9003 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9004 " 7777777};"); 9005 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9006 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9007 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9008 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9009 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9010 " // Separating comment.\n" 9011 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9012 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9013 " // Leading comment\n" 9014 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9015 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9016 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9017 " 1, 1, 1, 1};", 9018 getLLVMStyleWithColumns(39)); 9019 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9020 " 1, 1, 1, 1};", 9021 getLLVMStyleWithColumns(38)); 9022 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 9023 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 9024 getLLVMStyleWithColumns(43)); 9025 verifyFormat( 9026 "static unsigned SomeValues[10][3] = {\n" 9027 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 9028 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 9029 verifyFormat("static auto fields = new vector<string>{\n" 9030 " \"aaaaaaaaaaaaa\",\n" 9031 " \"aaaaaaaaaaaaa\",\n" 9032 " \"aaaaaaaaaaaa\",\n" 9033 " \"aaaaaaaaaaaaaa\",\n" 9034 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9035 " \"aaaaaaaaaaaa\",\n" 9036 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9037 "};"); 9038 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 9039 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 9040 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 9041 " 3, cccccccccccccccccccccc};", 9042 getLLVMStyleWithColumns(60)); 9043 9044 // Trailing commas. 9045 verifyFormat("vector<int> x = {\n" 9046 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 9047 "};", 9048 getLLVMStyleWithColumns(39)); 9049 verifyFormat("vector<int> x = {\n" 9050 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 9051 "};", 9052 getLLVMStyleWithColumns(39)); 9053 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9054 " 1, 1, 1, 1,\n" 9055 " /**/ /**/};", 9056 getLLVMStyleWithColumns(39)); 9057 9058 // Trailing comment in the first line. 9059 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 9060 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 9061 " 111111111, 222222222, 3333333333, 444444444, //\n" 9062 " 11111111, 22222222, 333333333, 44444444};"); 9063 // Trailing comment in the last line. 9064 verifyFormat("int aaaaa[] = {\n" 9065 " 1, 2, 3, // comment\n" 9066 " 4, 5, 6 // comment\n" 9067 "};"); 9068 9069 // With nested lists, we should either format one item per line or all nested 9070 // lists one on line. 9071 // FIXME: For some nested lists, we can do better. 9072 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 9073 " {aaaaaaaaaaaaaaaaaaa},\n" 9074 " {aaaaaaaaaaaaaaaaaaaaa},\n" 9075 " {aaaaaaaaaaaaaaaaa}};", 9076 getLLVMStyleWithColumns(60)); 9077 verifyFormat( 9078 "SomeStruct my_struct_array = {\n" 9079 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 9080 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 9081 " {aaa, aaa},\n" 9082 " {aaa, aaa},\n" 9083 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 9084 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 9085 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 9086 9087 // No column layout should be used here. 9088 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 9089 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 9090 9091 verifyNoCrash("a<,"); 9092 9093 // No braced initializer here. 9094 verifyFormat("void f() {\n" 9095 " struct Dummy {};\n" 9096 " f(v);\n" 9097 "}"); 9098 9099 // Long lists should be formatted in columns even if they are nested. 9100 verifyFormat( 9101 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9102 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9103 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9104 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9105 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9106 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 9107 9108 // Allow "single-column" layout even if that violates the column limit. There 9109 // isn't going to be a better way. 9110 verifyFormat("std::vector<int> a = {\n" 9111 " aaaaaaaa,\n" 9112 " aaaaaaaa,\n" 9113 " aaaaaaaa,\n" 9114 " aaaaaaaa,\n" 9115 " aaaaaaaaaa,\n" 9116 " aaaaaaaa,\n" 9117 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 9118 getLLVMStyleWithColumns(30)); 9119 verifyFormat("vector<int> aaaa = {\n" 9120 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9121 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9122 " aaaaaa.aaaaaaa,\n" 9123 " aaaaaa.aaaaaaa,\n" 9124 " aaaaaa.aaaaaaa,\n" 9125 " aaaaaa.aaaaaaa,\n" 9126 "};"); 9127 9128 // Don't create hanging lists. 9129 verifyFormat("someFunction(Param, {List1, List2,\n" 9130 " List3});", 9131 getLLVMStyleWithColumns(35)); 9132 verifyFormat("someFunction(Param, Param,\n" 9133 " {List1, List2,\n" 9134 " List3});", 9135 getLLVMStyleWithColumns(35)); 9136 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 9137 " aaaaaaaaaaaaaaaaaaaaaaa);"); 9138 } 9139 9140 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 9141 FormatStyle DoNotMerge = getLLVMStyle(); 9142 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9143 9144 verifyFormat("void f() { return 42; }"); 9145 verifyFormat("void f() {\n" 9146 " return 42;\n" 9147 "}", 9148 DoNotMerge); 9149 verifyFormat("void f() {\n" 9150 " // Comment\n" 9151 "}"); 9152 verifyFormat("{\n" 9153 "#error {\n" 9154 " int a;\n" 9155 "}"); 9156 verifyFormat("{\n" 9157 " int a;\n" 9158 "#error {\n" 9159 "}"); 9160 verifyFormat("void f() {} // comment"); 9161 verifyFormat("void f() { int a; } // comment"); 9162 verifyFormat("void f() {\n" 9163 "} // comment", 9164 DoNotMerge); 9165 verifyFormat("void f() {\n" 9166 " int a;\n" 9167 "} // comment", 9168 DoNotMerge); 9169 verifyFormat("void f() {\n" 9170 "} // comment", 9171 getLLVMStyleWithColumns(15)); 9172 9173 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 9174 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 9175 9176 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 9177 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 9178 verifyFormat("class C {\n" 9179 " C()\n" 9180 " : iiiiiiii(nullptr),\n" 9181 " kkkkkkk(nullptr),\n" 9182 " mmmmmmm(nullptr),\n" 9183 " nnnnnnn(nullptr) {}\n" 9184 "};", 9185 getGoogleStyle()); 9186 9187 FormatStyle NoColumnLimit = getLLVMStyle(); 9188 NoColumnLimit.ColumnLimit = 0; 9189 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 9190 EXPECT_EQ("class C {\n" 9191 " A() : b(0) {}\n" 9192 "};", 9193 format("class C{A():b(0){}};", NoColumnLimit)); 9194 EXPECT_EQ("A()\n" 9195 " : b(0) {\n" 9196 "}", 9197 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 9198 9199 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 9200 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 9201 FormatStyle::SFS_None; 9202 EXPECT_EQ("A()\n" 9203 " : b(0) {\n" 9204 "}", 9205 format("A():b(0){}", DoNotMergeNoColumnLimit)); 9206 EXPECT_EQ("A()\n" 9207 " : b(0) {\n" 9208 "}", 9209 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 9210 9211 verifyFormat("#define A \\\n" 9212 " void f() { \\\n" 9213 " int i; \\\n" 9214 " }", 9215 getLLVMStyleWithColumns(20)); 9216 verifyFormat("#define A \\\n" 9217 " void f() { int i; }", 9218 getLLVMStyleWithColumns(21)); 9219 verifyFormat("#define A \\\n" 9220 " void f() { \\\n" 9221 " int i; \\\n" 9222 " } \\\n" 9223 " int j;", 9224 getLLVMStyleWithColumns(22)); 9225 verifyFormat("#define A \\\n" 9226 " void f() { int i; } \\\n" 9227 " int j;", 9228 getLLVMStyleWithColumns(23)); 9229 } 9230 9231 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 9232 FormatStyle MergeEmptyOnly = getLLVMStyle(); 9233 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9234 verifyFormat("class C {\n" 9235 " int f() {}\n" 9236 "};", 9237 MergeEmptyOnly); 9238 verifyFormat("class C {\n" 9239 " int f() {\n" 9240 " return 42;\n" 9241 " }\n" 9242 "};", 9243 MergeEmptyOnly); 9244 verifyFormat("int f() {}", MergeEmptyOnly); 9245 verifyFormat("int f() {\n" 9246 " return 42;\n" 9247 "}", 9248 MergeEmptyOnly); 9249 9250 // Also verify behavior when BraceWrapping.AfterFunction = true 9251 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9252 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 9253 verifyFormat("int f() {}", MergeEmptyOnly); 9254 verifyFormat("class C {\n" 9255 " int f() {}\n" 9256 "};", 9257 MergeEmptyOnly); 9258 } 9259 9260 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 9261 FormatStyle MergeInlineOnly = getLLVMStyle(); 9262 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9263 verifyFormat("class C {\n" 9264 " int f() { return 42; }\n" 9265 "};", 9266 MergeInlineOnly); 9267 verifyFormat("int f() {\n" 9268 " return 42;\n" 9269 "}", 9270 MergeInlineOnly); 9271 9272 // SFS_Inline implies SFS_Empty 9273 verifyFormat("class C {\n" 9274 " int f() {}\n" 9275 "};", 9276 MergeInlineOnly); 9277 verifyFormat("int f() {}", MergeInlineOnly); 9278 9279 // Also verify behavior when BraceWrapping.AfterFunction = true 9280 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9281 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9282 verifyFormat("class C {\n" 9283 " int f() { return 42; }\n" 9284 "};", 9285 MergeInlineOnly); 9286 verifyFormat("int f()\n" 9287 "{\n" 9288 " return 42;\n" 9289 "}", 9290 MergeInlineOnly); 9291 9292 // SFS_Inline implies SFS_Empty 9293 verifyFormat("int f() {}", MergeInlineOnly); 9294 verifyFormat("class C {\n" 9295 " int f() {}\n" 9296 "};", 9297 MergeInlineOnly); 9298 } 9299 9300 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 9301 FormatStyle MergeInlineOnly = getLLVMStyle(); 9302 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 9303 FormatStyle::SFS_InlineOnly; 9304 verifyFormat("class C {\n" 9305 " int f() { return 42; }\n" 9306 "};", 9307 MergeInlineOnly); 9308 verifyFormat("int f() {\n" 9309 " return 42;\n" 9310 "}", 9311 MergeInlineOnly); 9312 9313 // SFS_InlineOnly does not imply SFS_Empty 9314 verifyFormat("class C {\n" 9315 " int f() {}\n" 9316 "};", 9317 MergeInlineOnly); 9318 verifyFormat("int f() {\n" 9319 "}", 9320 MergeInlineOnly); 9321 9322 // Also verify behavior when BraceWrapping.AfterFunction = true 9323 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9324 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9325 verifyFormat("class C {\n" 9326 " int f() { return 42; }\n" 9327 "};", 9328 MergeInlineOnly); 9329 verifyFormat("int f()\n" 9330 "{\n" 9331 " return 42;\n" 9332 "}", 9333 MergeInlineOnly); 9334 9335 // SFS_InlineOnly does not imply SFS_Empty 9336 verifyFormat("int f()\n" 9337 "{\n" 9338 "}", 9339 MergeInlineOnly); 9340 verifyFormat("class C {\n" 9341 " int f() {}\n" 9342 "};", 9343 MergeInlineOnly); 9344 } 9345 9346 TEST_F(FormatTest, SplitEmptyFunction) { 9347 FormatStyle Style = getLLVMStyle(); 9348 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9349 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9350 Style.BraceWrapping.AfterFunction = true; 9351 Style.BraceWrapping.SplitEmptyFunction = false; 9352 Style.ColumnLimit = 40; 9353 9354 verifyFormat("int f()\n" 9355 "{}", 9356 Style); 9357 verifyFormat("int f()\n" 9358 "{\n" 9359 " return 42;\n" 9360 "}", 9361 Style); 9362 verifyFormat("int f()\n" 9363 "{\n" 9364 " // some comment\n" 9365 "}", 9366 Style); 9367 9368 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9369 verifyFormat("int f() {}", Style); 9370 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9371 "{}", 9372 Style); 9373 verifyFormat("int f()\n" 9374 "{\n" 9375 " return 0;\n" 9376 "}", 9377 Style); 9378 9379 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9380 verifyFormat("class Foo {\n" 9381 " int f() {}\n" 9382 "};\n", 9383 Style); 9384 verifyFormat("class Foo {\n" 9385 " int f() { return 0; }\n" 9386 "};\n", 9387 Style); 9388 verifyFormat("class Foo {\n" 9389 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9390 " {}\n" 9391 "};\n", 9392 Style); 9393 verifyFormat("class Foo {\n" 9394 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9395 " {\n" 9396 " return 0;\n" 9397 " }\n" 9398 "};\n", 9399 Style); 9400 9401 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9402 verifyFormat("int f() {}", Style); 9403 verifyFormat("int f() { return 0; }", Style); 9404 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9405 "{}", 9406 Style); 9407 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9408 "{\n" 9409 " return 0;\n" 9410 "}", 9411 Style); 9412 } 9413 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 9414 FormatStyle Style = getLLVMStyle(); 9415 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9416 verifyFormat("#ifdef A\n" 9417 "int f() {}\n" 9418 "#else\n" 9419 "int g() {}\n" 9420 "#endif", 9421 Style); 9422 } 9423 9424 TEST_F(FormatTest, SplitEmptyClass) { 9425 FormatStyle Style = getLLVMStyle(); 9426 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9427 Style.BraceWrapping.AfterClass = true; 9428 Style.BraceWrapping.SplitEmptyRecord = false; 9429 9430 verifyFormat("class Foo\n" 9431 "{};", 9432 Style); 9433 verifyFormat("/* something */ class Foo\n" 9434 "{};", 9435 Style); 9436 verifyFormat("template <typename X> class Foo\n" 9437 "{};", 9438 Style); 9439 verifyFormat("class Foo\n" 9440 "{\n" 9441 " Foo();\n" 9442 "};", 9443 Style); 9444 verifyFormat("typedef class Foo\n" 9445 "{\n" 9446 "} Foo_t;", 9447 Style); 9448 } 9449 9450 TEST_F(FormatTest, SplitEmptyStruct) { 9451 FormatStyle Style = getLLVMStyle(); 9452 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9453 Style.BraceWrapping.AfterStruct = true; 9454 Style.BraceWrapping.SplitEmptyRecord = false; 9455 9456 verifyFormat("struct Foo\n" 9457 "{};", 9458 Style); 9459 verifyFormat("/* something */ struct Foo\n" 9460 "{};", 9461 Style); 9462 verifyFormat("template <typename X> struct Foo\n" 9463 "{};", 9464 Style); 9465 verifyFormat("struct Foo\n" 9466 "{\n" 9467 " Foo();\n" 9468 "};", 9469 Style); 9470 verifyFormat("typedef struct Foo\n" 9471 "{\n" 9472 "} Foo_t;", 9473 Style); 9474 // typedef struct Bar {} Bar_t; 9475 } 9476 9477 TEST_F(FormatTest, SplitEmptyUnion) { 9478 FormatStyle Style = getLLVMStyle(); 9479 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9480 Style.BraceWrapping.AfterUnion = true; 9481 Style.BraceWrapping.SplitEmptyRecord = false; 9482 9483 verifyFormat("union Foo\n" 9484 "{};", 9485 Style); 9486 verifyFormat("/* something */ union Foo\n" 9487 "{};", 9488 Style); 9489 verifyFormat("union Foo\n" 9490 "{\n" 9491 " A,\n" 9492 "};", 9493 Style); 9494 verifyFormat("typedef union Foo\n" 9495 "{\n" 9496 "} Foo_t;", 9497 Style); 9498 } 9499 9500 TEST_F(FormatTest, SplitEmptyNamespace) { 9501 FormatStyle Style = getLLVMStyle(); 9502 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9503 Style.BraceWrapping.AfterNamespace = true; 9504 Style.BraceWrapping.SplitEmptyNamespace = false; 9505 9506 verifyFormat("namespace Foo\n" 9507 "{};", 9508 Style); 9509 verifyFormat("/* something */ namespace Foo\n" 9510 "{};", 9511 Style); 9512 verifyFormat("inline namespace Foo\n" 9513 "{};", 9514 Style); 9515 verifyFormat("/* something */ inline namespace Foo\n" 9516 "{};", 9517 Style); 9518 verifyFormat("export namespace Foo\n" 9519 "{};", 9520 Style); 9521 verifyFormat("namespace Foo\n" 9522 "{\n" 9523 "void Bar();\n" 9524 "};", 9525 Style); 9526 } 9527 9528 TEST_F(FormatTest, NeverMergeShortRecords) { 9529 FormatStyle Style = getLLVMStyle(); 9530 9531 verifyFormat("class Foo {\n" 9532 " Foo();\n" 9533 "};", 9534 Style); 9535 verifyFormat("typedef class Foo {\n" 9536 " Foo();\n" 9537 "} Foo_t;", 9538 Style); 9539 verifyFormat("struct Foo {\n" 9540 " Foo();\n" 9541 "};", 9542 Style); 9543 verifyFormat("typedef struct Foo {\n" 9544 " Foo();\n" 9545 "} Foo_t;", 9546 Style); 9547 verifyFormat("union Foo {\n" 9548 " A,\n" 9549 "};", 9550 Style); 9551 verifyFormat("typedef union Foo {\n" 9552 " A,\n" 9553 "} Foo_t;", 9554 Style); 9555 verifyFormat("namespace Foo {\n" 9556 "void Bar();\n" 9557 "};", 9558 Style); 9559 9560 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9561 Style.BraceWrapping.AfterClass = true; 9562 Style.BraceWrapping.AfterStruct = true; 9563 Style.BraceWrapping.AfterUnion = true; 9564 Style.BraceWrapping.AfterNamespace = true; 9565 verifyFormat("class Foo\n" 9566 "{\n" 9567 " Foo();\n" 9568 "};", 9569 Style); 9570 verifyFormat("typedef class Foo\n" 9571 "{\n" 9572 " Foo();\n" 9573 "} Foo_t;", 9574 Style); 9575 verifyFormat("struct Foo\n" 9576 "{\n" 9577 " Foo();\n" 9578 "};", 9579 Style); 9580 verifyFormat("typedef struct Foo\n" 9581 "{\n" 9582 " Foo();\n" 9583 "} Foo_t;", 9584 Style); 9585 verifyFormat("union Foo\n" 9586 "{\n" 9587 " A,\n" 9588 "};", 9589 Style); 9590 verifyFormat("typedef union Foo\n" 9591 "{\n" 9592 " A,\n" 9593 "} Foo_t;", 9594 Style); 9595 verifyFormat("namespace Foo\n" 9596 "{\n" 9597 "void Bar();\n" 9598 "};", 9599 Style); 9600 } 9601 9602 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 9603 // Elaborate type variable declarations. 9604 verifyFormat("struct foo a = {bar};\nint n;"); 9605 verifyFormat("class foo a = {bar};\nint n;"); 9606 verifyFormat("union foo a = {bar};\nint n;"); 9607 9608 // Elaborate types inside function definitions. 9609 verifyFormat("struct foo f() {}\nint n;"); 9610 verifyFormat("class foo f() {}\nint n;"); 9611 verifyFormat("union foo f() {}\nint n;"); 9612 9613 // Templates. 9614 verifyFormat("template <class X> void f() {}\nint n;"); 9615 verifyFormat("template <struct X> void f() {}\nint n;"); 9616 verifyFormat("template <union X> void f() {}\nint n;"); 9617 9618 // Actual definitions... 9619 verifyFormat("struct {\n} n;"); 9620 verifyFormat( 9621 "template <template <class T, class Y>, class Z> class X {\n} n;"); 9622 verifyFormat("union Z {\n int n;\n} x;"); 9623 verifyFormat("class MACRO Z {\n} n;"); 9624 verifyFormat("class MACRO(X) Z {\n} n;"); 9625 verifyFormat("class __attribute__(X) Z {\n} n;"); 9626 verifyFormat("class __declspec(X) Z {\n} n;"); 9627 verifyFormat("class A##B##C {\n} n;"); 9628 verifyFormat("class alignas(16) Z {\n} n;"); 9629 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 9630 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 9631 9632 // Redefinition from nested context: 9633 verifyFormat("class A::B::C {\n} n;"); 9634 9635 // Template definitions. 9636 verifyFormat( 9637 "template <typename F>\n" 9638 "Matcher(const Matcher<F> &Other,\n" 9639 " typename enable_if_c<is_base_of<F, T>::value &&\n" 9640 " !is_same<F, T>::value>::type * = 0)\n" 9641 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 9642 9643 // FIXME: This is still incorrectly handled at the formatter side. 9644 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 9645 verifyFormat("int i = SomeFunction(a<b, a> b);"); 9646 9647 // FIXME: 9648 // This now gets parsed incorrectly as class definition. 9649 // verifyFormat("class A<int> f() {\n}\nint n;"); 9650 9651 // Elaborate types where incorrectly parsing the structural element would 9652 // break the indent. 9653 verifyFormat("if (true)\n" 9654 " class X x;\n" 9655 "else\n" 9656 " f();\n"); 9657 9658 // This is simply incomplete. Formatting is not important, but must not crash. 9659 verifyFormat("class A:"); 9660 } 9661 9662 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 9663 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 9664 format("#error Leave all white!!!!! space* alone!\n")); 9665 EXPECT_EQ( 9666 "#warning Leave all white!!!!! space* alone!\n", 9667 format("#warning Leave all white!!!!! space* alone!\n")); 9668 EXPECT_EQ("#error 1", format(" # error 1")); 9669 EXPECT_EQ("#warning 1", format(" # warning 1")); 9670 } 9671 9672 TEST_F(FormatTest, FormatHashIfExpressions) { 9673 verifyFormat("#if AAAA && BBBB"); 9674 verifyFormat("#if (AAAA && BBBB)"); 9675 verifyFormat("#elif (AAAA && BBBB)"); 9676 // FIXME: Come up with a better indentation for #elif. 9677 verifyFormat( 9678 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 9679 " defined(BBBBBBBB)\n" 9680 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 9681 " defined(BBBBBBBB)\n" 9682 "#endif", 9683 getLLVMStyleWithColumns(65)); 9684 } 9685 9686 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 9687 FormatStyle AllowsMergedIf = getGoogleStyle(); 9688 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 9689 FormatStyle::SIS_WithoutElse; 9690 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 9691 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 9692 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 9693 EXPECT_EQ("if (true) return 42;", 9694 format("if (true)\nreturn 42;", AllowsMergedIf)); 9695 FormatStyle ShortMergedIf = AllowsMergedIf; 9696 ShortMergedIf.ColumnLimit = 25; 9697 verifyFormat("#define A \\\n" 9698 " if (true) return 42;", 9699 ShortMergedIf); 9700 verifyFormat("#define A \\\n" 9701 " f(); \\\n" 9702 " if (true)\n" 9703 "#define B", 9704 ShortMergedIf); 9705 verifyFormat("#define A \\\n" 9706 " f(); \\\n" 9707 " if (true)\n" 9708 "g();", 9709 ShortMergedIf); 9710 verifyFormat("{\n" 9711 "#ifdef A\n" 9712 " // Comment\n" 9713 " if (true) continue;\n" 9714 "#endif\n" 9715 " // Comment\n" 9716 " if (true) continue;\n" 9717 "}", 9718 ShortMergedIf); 9719 ShortMergedIf.ColumnLimit = 33; 9720 verifyFormat("#define A \\\n" 9721 " if constexpr (true) return 42;", 9722 ShortMergedIf); 9723 verifyFormat("#define A \\\n" 9724 " if CONSTEXPR (true) return 42;", 9725 ShortMergedIf); 9726 ShortMergedIf.ColumnLimit = 29; 9727 verifyFormat("#define A \\\n" 9728 " if (aaaaaaaaaa) return 1; \\\n" 9729 " return 2;", 9730 ShortMergedIf); 9731 ShortMergedIf.ColumnLimit = 28; 9732 verifyFormat("#define A \\\n" 9733 " if (aaaaaaaaaa) \\\n" 9734 " return 1; \\\n" 9735 " return 2;", 9736 ShortMergedIf); 9737 verifyFormat("#define A \\\n" 9738 " if constexpr (aaaaaaa) \\\n" 9739 " return 1; \\\n" 9740 " return 2;", 9741 ShortMergedIf); 9742 verifyFormat("#define A \\\n" 9743 " if CONSTEXPR (aaaaaaa) \\\n" 9744 " return 1; \\\n" 9745 " return 2;", 9746 ShortMergedIf); 9747 } 9748 9749 TEST_F(FormatTest, FormatStarDependingOnContext) { 9750 verifyFormat("void f(int *a);"); 9751 verifyFormat("void f() { f(fint * b); }"); 9752 verifyFormat("class A {\n void f(int *a);\n};"); 9753 verifyFormat("class A {\n int *a;\n};"); 9754 verifyFormat("namespace a {\n" 9755 "namespace b {\n" 9756 "class A {\n" 9757 " void f() {}\n" 9758 " int *a;\n" 9759 "};\n" 9760 "} // namespace b\n" 9761 "} // namespace a"); 9762 } 9763 9764 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 9765 verifyFormat("while"); 9766 verifyFormat("operator"); 9767 } 9768 9769 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 9770 // This code would be painfully slow to format if we didn't skip it. 9771 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 9772 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9773 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9774 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9775 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9776 "A(1, 1)\n" 9777 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 9778 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9779 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9780 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9781 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9782 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9783 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9784 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9785 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9786 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 9787 // Deeply nested part is untouched, rest is formatted. 9788 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 9789 format(std::string("int i;\n") + Code + "int j;\n", 9790 getLLVMStyle(), SC_ExpectIncomplete)); 9791 } 9792 9793 //===----------------------------------------------------------------------===// 9794 // Objective-C tests. 9795 //===----------------------------------------------------------------------===// 9796 9797 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 9798 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 9799 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 9800 format("-(NSUInteger)indexOfObject:(id)anObject;")); 9801 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 9802 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 9803 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 9804 format("-(NSInteger)Method3:(id)anObject;")); 9805 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 9806 format("-(NSInteger)Method4:(id)anObject;")); 9807 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 9808 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 9809 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 9810 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 9811 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9812 "forAllCells:(BOOL)flag;", 9813 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9814 "forAllCells:(BOOL)flag;")); 9815 9816 // Very long objectiveC method declaration. 9817 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 9818 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 9819 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 9820 " inRange:(NSRange)range\n" 9821 " outRange:(NSRange)out_range\n" 9822 " outRange1:(NSRange)out_range1\n" 9823 " outRange2:(NSRange)out_range2\n" 9824 " outRange3:(NSRange)out_range3\n" 9825 " outRange4:(NSRange)out_range4\n" 9826 " outRange5:(NSRange)out_range5\n" 9827 " outRange6:(NSRange)out_range6\n" 9828 " outRange7:(NSRange)out_range7\n" 9829 " outRange8:(NSRange)out_range8\n" 9830 " outRange9:(NSRange)out_range9;"); 9831 9832 // When the function name has to be wrapped. 9833 FormatStyle Style = getLLVMStyle(); 9834 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 9835 // and always indents instead. 9836 Style.IndentWrappedFunctionNames = false; 9837 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9838 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 9839 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 9840 "}", 9841 Style); 9842 Style.IndentWrappedFunctionNames = true; 9843 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9844 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 9845 " anotherName:(NSString)dddddddddddddd {\n" 9846 "}", 9847 Style); 9848 9849 verifyFormat("- (int)sum:(vector<int>)numbers;"); 9850 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 9851 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 9852 // protocol lists (but not for template classes): 9853 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 9854 9855 verifyFormat("- (int (*)())foo:(int (*)())f;"); 9856 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 9857 9858 // If there's no return type (very rare in practice!), LLVM and Google style 9859 // agree. 9860 verifyFormat("- foo;"); 9861 verifyFormat("- foo:(int)f;"); 9862 verifyGoogleFormat("- foo:(int)foo;"); 9863 } 9864 9865 TEST_F(FormatTest, BreaksStringLiterals) { 9866 EXPECT_EQ("\"some text \"\n" 9867 "\"other\";", 9868 format("\"some text other\";", getLLVMStyleWithColumns(12))); 9869 EXPECT_EQ("\"some text \"\n" 9870 "\"other\";", 9871 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 9872 EXPECT_EQ( 9873 "#define A \\\n" 9874 " \"some \" \\\n" 9875 " \"text \" \\\n" 9876 " \"other\";", 9877 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 9878 EXPECT_EQ( 9879 "#define A \\\n" 9880 " \"so \" \\\n" 9881 " \"text \" \\\n" 9882 " \"other\";", 9883 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 9884 9885 EXPECT_EQ("\"some text\"", 9886 format("\"some text\"", getLLVMStyleWithColumns(1))); 9887 EXPECT_EQ("\"some text\"", 9888 format("\"some text\"", getLLVMStyleWithColumns(11))); 9889 EXPECT_EQ("\"some \"\n" 9890 "\"text\"", 9891 format("\"some text\"", getLLVMStyleWithColumns(10))); 9892 EXPECT_EQ("\"some \"\n" 9893 "\"text\"", 9894 format("\"some text\"", getLLVMStyleWithColumns(7))); 9895 EXPECT_EQ("\"some\"\n" 9896 "\" tex\"\n" 9897 "\"t\"", 9898 format("\"some text\"", getLLVMStyleWithColumns(6))); 9899 EXPECT_EQ("\"some\"\n" 9900 "\" tex\"\n" 9901 "\" and\"", 9902 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 9903 EXPECT_EQ("\"some\"\n" 9904 "\"/tex\"\n" 9905 "\"/and\"", 9906 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 9907 9908 EXPECT_EQ("variable =\n" 9909 " \"long string \"\n" 9910 " \"literal\";", 9911 format("variable = \"long string literal\";", 9912 getLLVMStyleWithColumns(20))); 9913 9914 EXPECT_EQ("variable = f(\n" 9915 " \"long string \"\n" 9916 " \"literal\",\n" 9917 " short,\n" 9918 " loooooooooooooooooooong);", 9919 format("variable = f(\"long string literal\", short, " 9920 "loooooooooooooooooooong);", 9921 getLLVMStyleWithColumns(20))); 9922 9923 EXPECT_EQ( 9924 "f(g(\"long string \"\n" 9925 " \"literal\"),\n" 9926 " b);", 9927 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 9928 EXPECT_EQ("f(g(\"long string \"\n" 9929 " \"literal\",\n" 9930 " a),\n" 9931 " b);", 9932 format("f(g(\"long string literal\", a), b);", 9933 getLLVMStyleWithColumns(20))); 9934 EXPECT_EQ( 9935 "f(\"one two\".split(\n" 9936 " variable));", 9937 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 9938 EXPECT_EQ("f(\"one two three four five six \"\n" 9939 " \"seven\".split(\n" 9940 " really_looooong_variable));", 9941 format("f(\"one two three four five six seven\"." 9942 "split(really_looooong_variable));", 9943 getLLVMStyleWithColumns(33))); 9944 9945 EXPECT_EQ("f(\"some \"\n" 9946 " \"text\",\n" 9947 " other);", 9948 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 9949 9950 // Only break as a last resort. 9951 verifyFormat( 9952 "aaaaaaaaaaaaaaaaaaaa(\n" 9953 " aaaaaaaaaaaaaaaaaaaa,\n" 9954 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 9955 9956 EXPECT_EQ("\"splitmea\"\n" 9957 "\"trandomp\"\n" 9958 "\"oint\"", 9959 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 9960 9961 EXPECT_EQ("\"split/\"\n" 9962 "\"pathat/\"\n" 9963 "\"slashes\"", 9964 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9965 9966 EXPECT_EQ("\"split/\"\n" 9967 "\"pathat/\"\n" 9968 "\"slashes\"", 9969 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9970 EXPECT_EQ("\"split at \"\n" 9971 "\"spaces/at/\"\n" 9972 "\"slashes.at.any$\"\n" 9973 "\"non-alphanumeric%\"\n" 9974 "\"1111111111characte\"\n" 9975 "\"rs\"", 9976 format("\"split at " 9977 "spaces/at/" 9978 "slashes.at." 9979 "any$non-" 9980 "alphanumeric%" 9981 "1111111111characte" 9982 "rs\"", 9983 getLLVMStyleWithColumns(20))); 9984 9985 // Verify that splitting the strings understands 9986 // Style::AlwaysBreakBeforeMultilineStrings. 9987 EXPECT_EQ("aaaaaaaaaaaa(\n" 9988 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 9989 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 9990 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 9991 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9992 "aaaaaaaaaaaaaaaaaaaaaa\");", 9993 getGoogleStyle())); 9994 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9995 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9996 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9997 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9998 "aaaaaaaaaaaaaaaaaaaaaa\";", 9999 getGoogleStyle())); 10000 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10001 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10002 format("llvm::outs() << " 10003 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 10004 "aaaaaaaaaaaaaaaaaaa\";")); 10005 EXPECT_EQ("ffff(\n" 10006 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10007 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10008 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 10009 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10010 getGoogleStyle())); 10011 10012 FormatStyle Style = getLLVMStyleWithColumns(12); 10013 Style.BreakStringLiterals = false; 10014 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 10015 10016 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 10017 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10018 EXPECT_EQ("#define A \\\n" 10019 " \"some \" \\\n" 10020 " \"text \" \\\n" 10021 " \"other\";", 10022 format("#define A \"some text other\";", AlignLeft)); 10023 } 10024 10025 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 10026 EXPECT_EQ("C a = \"some more \"\n" 10027 " \"text\";", 10028 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 10029 } 10030 10031 TEST_F(FormatTest, FullyRemoveEmptyLines) { 10032 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 10033 NoEmptyLines.MaxEmptyLinesToKeep = 0; 10034 EXPECT_EQ("int i = a(b());", 10035 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 10036 } 10037 10038 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 10039 EXPECT_EQ( 10040 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10041 "(\n" 10042 " \"x\t\");", 10043 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10044 "aaaaaaa(" 10045 "\"x\t\");")); 10046 } 10047 10048 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 10049 EXPECT_EQ( 10050 "u8\"utf8 string \"\n" 10051 "u8\"literal\";", 10052 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 10053 EXPECT_EQ( 10054 "u\"utf16 string \"\n" 10055 "u\"literal\";", 10056 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 10057 EXPECT_EQ( 10058 "U\"utf32 string \"\n" 10059 "U\"literal\";", 10060 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 10061 EXPECT_EQ("L\"wide string \"\n" 10062 "L\"literal\";", 10063 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 10064 EXPECT_EQ("@\"NSString \"\n" 10065 "@\"literal\";", 10066 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 10067 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 10068 10069 // This input makes clang-format try to split the incomplete unicode escape 10070 // sequence, which used to lead to a crasher. 10071 verifyNoCrash( 10072 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 10073 getLLVMStyleWithColumns(60)); 10074 } 10075 10076 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 10077 FormatStyle Style = getGoogleStyleWithColumns(15); 10078 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 10079 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 10080 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 10081 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 10082 EXPECT_EQ("u8R\"x(raw literal)x\";", 10083 format("u8R\"x(raw literal)x\";", Style)); 10084 } 10085 10086 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 10087 FormatStyle Style = getLLVMStyleWithColumns(20); 10088 EXPECT_EQ( 10089 "_T(\"aaaaaaaaaaaaaa\")\n" 10090 "_T(\"aaaaaaaaaaaaaa\")\n" 10091 "_T(\"aaaaaaaaaaaa\")", 10092 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 10093 EXPECT_EQ("f(x,\n" 10094 " _T(\"aaaaaaaaaaaa\")\n" 10095 " _T(\"aaa\"),\n" 10096 " z);", 10097 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 10098 10099 // FIXME: Handle embedded spaces in one iteration. 10100 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 10101 // "_T(\"aaaaaaaaaaaaa\")\n" 10102 // "_T(\"aaaaaaaaaaaaa\")\n" 10103 // "_T(\"a\")", 10104 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10105 // getLLVMStyleWithColumns(20))); 10106 EXPECT_EQ( 10107 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10108 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 10109 EXPECT_EQ("f(\n" 10110 "#if !TEST\n" 10111 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10112 "#endif\n" 10113 ");", 10114 format("f(\n" 10115 "#if !TEST\n" 10116 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10117 "#endif\n" 10118 ");")); 10119 EXPECT_EQ("f(\n" 10120 "\n" 10121 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 10122 format("f(\n" 10123 "\n" 10124 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 10125 } 10126 10127 TEST_F(FormatTest, BreaksStringLiteralOperands) { 10128 // In a function call with two operands, the second can be broken with no line 10129 // break before it. 10130 EXPECT_EQ( 10131 "func(a, \"long long \"\n" 10132 " \"long long\");", 10133 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 10134 // In a function call with three operands, the second must be broken with a 10135 // line break before it. 10136 EXPECT_EQ("func(a,\n" 10137 " \"long long long \"\n" 10138 " \"long\",\n" 10139 " c);", 10140 format("func(a, \"long long long long\", c);", 10141 getLLVMStyleWithColumns(24))); 10142 // In a function call with three operands, the third must be broken with a 10143 // line break before it. 10144 EXPECT_EQ("func(a, b,\n" 10145 " \"long long long \"\n" 10146 " \"long\");", 10147 format("func(a, b, \"long long long long\");", 10148 getLLVMStyleWithColumns(24))); 10149 // In a function call with three operands, both the second and the third must 10150 // be broken with a line break before them. 10151 EXPECT_EQ("func(a,\n" 10152 " \"long long long \"\n" 10153 " \"long\",\n" 10154 " \"long long long \"\n" 10155 " \"long\");", 10156 format("func(a, \"long long long long\", \"long long long long\");", 10157 getLLVMStyleWithColumns(24))); 10158 // In a chain of << with two operands, the second can be broken with no line 10159 // break before it. 10160 EXPECT_EQ("a << \"line line \"\n" 10161 " \"line\";", 10162 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 10163 // In a chain of << with three operands, the second can be broken with no line 10164 // break before it. 10165 EXPECT_EQ( 10166 "abcde << \"line \"\n" 10167 " \"line line\"\n" 10168 " << c;", 10169 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 10170 // In a chain of << with three operands, the third must be broken with a line 10171 // break before it. 10172 EXPECT_EQ( 10173 "a << b\n" 10174 " << \"line line \"\n" 10175 " \"line\";", 10176 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 10177 // In a chain of << with three operands, the second can be broken with no line 10178 // break before it and the third must be broken with a line break before it. 10179 EXPECT_EQ("abcd << \"line line \"\n" 10180 " \"line\"\n" 10181 " << \"line line \"\n" 10182 " \"line\";", 10183 format("abcd << \"line line line\" << \"line line line\";", 10184 getLLVMStyleWithColumns(20))); 10185 // In a chain of binary operators with two operands, the second can be broken 10186 // with no line break before it. 10187 EXPECT_EQ( 10188 "abcd + \"line line \"\n" 10189 " \"line line\";", 10190 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 10191 // In a chain of binary operators with three operands, the second must be 10192 // broken with a line break before it. 10193 EXPECT_EQ("abcd +\n" 10194 " \"line line \"\n" 10195 " \"line line\" +\n" 10196 " e;", 10197 format("abcd + \"line line line line\" + e;", 10198 getLLVMStyleWithColumns(20))); 10199 // In a function call with two operands, with AlignAfterOpenBracket enabled, 10200 // the first must be broken with a line break before it. 10201 FormatStyle Style = getLLVMStyleWithColumns(25); 10202 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 10203 EXPECT_EQ("someFunction(\n" 10204 " \"long long long \"\n" 10205 " \"long\",\n" 10206 " a);", 10207 format("someFunction(\"long long long long\", a);", Style)); 10208 } 10209 10210 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 10211 EXPECT_EQ( 10212 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10215 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10216 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 10218 } 10219 10220 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 10221 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 10222 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 10223 EXPECT_EQ("fffffffffff(g(R\"x(\n" 10224 "multiline raw string literal xxxxxxxxxxxxxx\n" 10225 ")x\",\n" 10226 " a),\n" 10227 " b);", 10228 format("fffffffffff(g(R\"x(\n" 10229 "multiline raw string literal xxxxxxxxxxxxxx\n" 10230 ")x\", a), b);", 10231 getGoogleStyleWithColumns(20))); 10232 EXPECT_EQ("fffffffffff(\n" 10233 " g(R\"x(qqq\n" 10234 "multiline raw string literal xxxxxxxxxxxxxx\n" 10235 ")x\",\n" 10236 " a),\n" 10237 " b);", 10238 format("fffffffffff(g(R\"x(qqq\n" 10239 "multiline raw string literal xxxxxxxxxxxxxx\n" 10240 ")x\", a), b);", 10241 getGoogleStyleWithColumns(20))); 10242 10243 EXPECT_EQ("fffffffffff(R\"x(\n" 10244 "multiline raw string literal xxxxxxxxxxxxxx\n" 10245 ")x\");", 10246 format("fffffffffff(R\"x(\n" 10247 "multiline raw string literal xxxxxxxxxxxxxx\n" 10248 ")x\");", 10249 getGoogleStyleWithColumns(20))); 10250 EXPECT_EQ("fffffffffff(R\"x(\n" 10251 "multiline raw string literal xxxxxxxxxxxxxx\n" 10252 ")x\" + bbbbbb);", 10253 format("fffffffffff(R\"x(\n" 10254 "multiline raw string literal xxxxxxxxxxxxxx\n" 10255 ")x\" + bbbbbb);", 10256 getGoogleStyleWithColumns(20))); 10257 EXPECT_EQ("fffffffffff(\n" 10258 " R\"x(\n" 10259 "multiline raw string literal xxxxxxxxxxxxxx\n" 10260 ")x\" +\n" 10261 " bbbbbb);", 10262 format("fffffffffff(\n" 10263 " R\"x(\n" 10264 "multiline raw string literal xxxxxxxxxxxxxx\n" 10265 ")x\" + bbbbbb);", 10266 getGoogleStyleWithColumns(20))); 10267 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 10268 format("fffffffffff(\n" 10269 " R\"(single line raw string)\" + bbbbbb);")); 10270 } 10271 10272 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 10273 verifyFormat("string a = \"unterminated;"); 10274 EXPECT_EQ("function(\"unterminated,\n" 10275 " OtherParameter);", 10276 format("function( \"unterminated,\n" 10277 " OtherParameter);")); 10278 } 10279 10280 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 10281 FormatStyle Style = getLLVMStyle(); 10282 Style.Standard = FormatStyle::LS_Cpp03; 10283 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 10284 format("#define x(_a) printf(\"foo\"_a);", Style)); 10285 } 10286 10287 TEST_F(FormatTest, CppLexVersion) { 10288 FormatStyle Style = getLLVMStyle(); 10289 // Formatting of x * y differs if x is a type. 10290 verifyFormat("void foo() { MACRO(a * b); }", Style); 10291 verifyFormat("void foo() { MACRO(int *b); }", Style); 10292 10293 // LLVM style uses latest lexer. 10294 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 10295 Style.Standard = FormatStyle::LS_Cpp17; 10296 // But in c++17, char8_t isn't a keyword. 10297 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 10298 } 10299 10300 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 10301 10302 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 10303 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 10304 " \"ddeeefff\");", 10305 format("someFunction(\"aaabbbcccdddeeefff\");", 10306 getLLVMStyleWithColumns(25))); 10307 EXPECT_EQ("someFunction1234567890(\n" 10308 " \"aaabbbcccdddeeefff\");", 10309 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10310 getLLVMStyleWithColumns(26))); 10311 EXPECT_EQ("someFunction1234567890(\n" 10312 " \"aaabbbcccdddeeeff\"\n" 10313 " \"f\");", 10314 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10315 getLLVMStyleWithColumns(25))); 10316 EXPECT_EQ("someFunction1234567890(\n" 10317 " \"aaabbbcccdddeeeff\"\n" 10318 " \"f\");", 10319 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10320 getLLVMStyleWithColumns(24))); 10321 EXPECT_EQ("someFunction(\n" 10322 " \"aaabbbcc ddde \"\n" 10323 " \"efff\");", 10324 format("someFunction(\"aaabbbcc ddde efff\");", 10325 getLLVMStyleWithColumns(25))); 10326 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 10327 " \"ddeeefff\");", 10328 format("someFunction(\"aaabbbccc ddeeefff\");", 10329 getLLVMStyleWithColumns(25))); 10330 EXPECT_EQ("someFunction1234567890(\n" 10331 " \"aaabb \"\n" 10332 " \"cccdddeeefff\");", 10333 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 10334 getLLVMStyleWithColumns(25))); 10335 EXPECT_EQ("#define A \\\n" 10336 " string s = \\\n" 10337 " \"123456789\" \\\n" 10338 " \"0\"; \\\n" 10339 " int i;", 10340 format("#define A string s = \"1234567890\"; int i;", 10341 getLLVMStyleWithColumns(20))); 10342 EXPECT_EQ("someFunction(\n" 10343 " \"aaabbbcc \"\n" 10344 " \"dddeeefff\");", 10345 format("someFunction(\"aaabbbcc dddeeefff\");", 10346 getLLVMStyleWithColumns(25))); 10347 } 10348 10349 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 10350 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 10351 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 10352 EXPECT_EQ("\"test\"\n" 10353 "\"\\n\"", 10354 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 10355 EXPECT_EQ("\"tes\\\\\"\n" 10356 "\"n\"", 10357 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 10358 EXPECT_EQ("\"\\\\\\\\\"\n" 10359 "\"\\n\"", 10360 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 10361 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 10362 EXPECT_EQ("\"\\uff01\"\n" 10363 "\"test\"", 10364 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 10365 EXPECT_EQ("\"\\Uff01ff02\"", 10366 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 10367 EXPECT_EQ("\"\\x000000000001\"\n" 10368 "\"next\"", 10369 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 10370 EXPECT_EQ("\"\\x000000000001next\"", 10371 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 10372 EXPECT_EQ("\"\\x000000000001\"", 10373 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 10374 EXPECT_EQ("\"test\"\n" 10375 "\"\\000000\"\n" 10376 "\"000001\"", 10377 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 10378 EXPECT_EQ("\"test\\000\"\n" 10379 "\"00000000\"\n" 10380 "\"1\"", 10381 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 10382 } 10383 10384 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 10385 verifyFormat("void f() {\n" 10386 " return g() {}\n" 10387 " void h() {}"); 10388 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 10389 "g();\n" 10390 "}"); 10391 } 10392 10393 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 10394 verifyFormat( 10395 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 10396 } 10397 10398 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 10399 verifyFormat("class X {\n" 10400 " void f() {\n" 10401 " }\n" 10402 "};", 10403 getLLVMStyleWithColumns(12)); 10404 } 10405 10406 TEST_F(FormatTest, ConfigurableIndentWidth) { 10407 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 10408 EightIndent.IndentWidth = 8; 10409 EightIndent.ContinuationIndentWidth = 8; 10410 verifyFormat("void f() {\n" 10411 " someFunction();\n" 10412 " if (true) {\n" 10413 " f();\n" 10414 " }\n" 10415 "}", 10416 EightIndent); 10417 verifyFormat("class X {\n" 10418 " void f() {\n" 10419 " }\n" 10420 "};", 10421 EightIndent); 10422 verifyFormat("int x[] = {\n" 10423 " call(),\n" 10424 " call()};", 10425 EightIndent); 10426 } 10427 10428 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 10429 verifyFormat("double\n" 10430 "f();", 10431 getLLVMStyleWithColumns(8)); 10432 } 10433 10434 TEST_F(FormatTest, ConfigurableUseOfTab) { 10435 FormatStyle Tab = getLLVMStyleWithColumns(42); 10436 Tab.IndentWidth = 8; 10437 Tab.UseTab = FormatStyle::UT_Always; 10438 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10439 10440 EXPECT_EQ("if (aaaaaaaa && // q\n" 10441 " bb)\t\t// w\n" 10442 "\t;", 10443 format("if (aaaaaaaa &&// q\n" 10444 "bb)// w\n" 10445 ";", 10446 Tab)); 10447 EXPECT_EQ("if (aaa && bbb) // w\n" 10448 "\t;", 10449 format("if(aaa&&bbb)// w\n" 10450 ";", 10451 Tab)); 10452 10453 verifyFormat("class X {\n" 10454 "\tvoid f() {\n" 10455 "\t\tsomeFunction(parameter1,\n" 10456 "\t\t\t parameter2);\n" 10457 "\t}\n" 10458 "};", 10459 Tab); 10460 verifyFormat("#define A \\\n" 10461 "\tvoid f() { \\\n" 10462 "\t\tsomeFunction( \\\n" 10463 "\t\t parameter1, \\\n" 10464 "\t\t parameter2); \\\n" 10465 "\t}", 10466 Tab); 10467 verifyFormat("int a;\t // x\n" 10468 "int bbbbbbbb; // x\n", 10469 Tab); 10470 10471 Tab.TabWidth = 4; 10472 Tab.IndentWidth = 8; 10473 verifyFormat("class TabWidth4Indent8 {\n" 10474 "\t\tvoid f() {\n" 10475 "\t\t\t\tsomeFunction(parameter1,\n" 10476 "\t\t\t\t\t\t\t parameter2);\n" 10477 "\t\t}\n" 10478 "};", 10479 Tab); 10480 10481 Tab.TabWidth = 4; 10482 Tab.IndentWidth = 4; 10483 verifyFormat("class TabWidth4Indent4 {\n" 10484 "\tvoid f() {\n" 10485 "\t\tsomeFunction(parameter1,\n" 10486 "\t\t\t\t\t parameter2);\n" 10487 "\t}\n" 10488 "};", 10489 Tab); 10490 10491 Tab.TabWidth = 8; 10492 Tab.IndentWidth = 4; 10493 verifyFormat("class TabWidth8Indent4 {\n" 10494 " void f() {\n" 10495 "\tsomeFunction(parameter1,\n" 10496 "\t\t parameter2);\n" 10497 " }\n" 10498 "};", 10499 Tab); 10500 10501 Tab.TabWidth = 8; 10502 Tab.IndentWidth = 8; 10503 EXPECT_EQ("/*\n" 10504 "\t a\t\tcomment\n" 10505 "\t in multiple lines\n" 10506 " */", 10507 format(" /*\t \t \n" 10508 " \t \t a\t\tcomment\t \t\n" 10509 " \t \t in multiple lines\t\n" 10510 " \t */", 10511 Tab)); 10512 10513 Tab.UseTab = FormatStyle::UT_ForIndentation; 10514 verifyFormat("{\n" 10515 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10516 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10517 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10518 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10519 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10520 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10521 "};", 10522 Tab); 10523 verifyFormat("enum AA {\n" 10524 "\ta1, // Force multiple lines\n" 10525 "\ta2,\n" 10526 "\ta3\n" 10527 "};", 10528 Tab); 10529 EXPECT_EQ("if (aaaaaaaa && // q\n" 10530 " bb) // w\n" 10531 "\t;", 10532 format("if (aaaaaaaa &&// q\n" 10533 "bb)// w\n" 10534 ";", 10535 Tab)); 10536 verifyFormat("class X {\n" 10537 "\tvoid f() {\n" 10538 "\t\tsomeFunction(parameter1,\n" 10539 "\t\t parameter2);\n" 10540 "\t}\n" 10541 "};", 10542 Tab); 10543 verifyFormat("{\n" 10544 "\tQ(\n" 10545 "\t {\n" 10546 "\t\t int a;\n" 10547 "\t\t someFunction(aaaaaaaa,\n" 10548 "\t\t bbbbbbb);\n" 10549 "\t },\n" 10550 "\t p);\n" 10551 "}", 10552 Tab); 10553 EXPECT_EQ("{\n" 10554 "\t/* aaaa\n" 10555 "\t bbbb */\n" 10556 "}", 10557 format("{\n" 10558 "/* aaaa\n" 10559 " bbbb */\n" 10560 "}", 10561 Tab)); 10562 EXPECT_EQ("{\n" 10563 "\t/*\n" 10564 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10565 "\t bbbbbbbbbbbbb\n" 10566 "\t*/\n" 10567 "}", 10568 format("{\n" 10569 "/*\n" 10570 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10571 "*/\n" 10572 "}", 10573 Tab)); 10574 EXPECT_EQ("{\n" 10575 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10576 "\t// bbbbbbbbbbbbb\n" 10577 "}", 10578 format("{\n" 10579 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10580 "}", 10581 Tab)); 10582 EXPECT_EQ("{\n" 10583 "\t/*\n" 10584 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10585 "\t bbbbbbbbbbbbb\n" 10586 "\t*/\n" 10587 "}", 10588 format("{\n" 10589 "\t/*\n" 10590 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10591 "\t*/\n" 10592 "}", 10593 Tab)); 10594 EXPECT_EQ("{\n" 10595 "\t/*\n" 10596 "\n" 10597 "\t*/\n" 10598 "}", 10599 format("{\n" 10600 "\t/*\n" 10601 "\n" 10602 "\t*/\n" 10603 "}", 10604 Tab)); 10605 EXPECT_EQ("{\n" 10606 "\t/*\n" 10607 " asdf\n" 10608 "\t*/\n" 10609 "}", 10610 format("{\n" 10611 "\t/*\n" 10612 " asdf\n" 10613 "\t*/\n" 10614 "}", 10615 Tab)); 10616 10617 Tab.UseTab = FormatStyle::UT_Never; 10618 EXPECT_EQ("/*\n" 10619 " a\t\tcomment\n" 10620 " in multiple lines\n" 10621 " */", 10622 format(" /*\t \t \n" 10623 " \t \t a\t\tcomment\t \t\n" 10624 " \t \t in multiple lines\t\n" 10625 " \t */", 10626 Tab)); 10627 EXPECT_EQ("/* some\n" 10628 " comment */", 10629 format(" \t \t /* some\n" 10630 " \t \t comment */", 10631 Tab)); 10632 EXPECT_EQ("int a; /* some\n" 10633 " comment */", 10634 format(" \t \t int a; /* some\n" 10635 " \t \t comment */", 10636 Tab)); 10637 10638 EXPECT_EQ("int a; /* some\n" 10639 "comment */", 10640 format(" \t \t int\ta; /* some\n" 10641 " \t \t comment */", 10642 Tab)); 10643 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10644 " comment */", 10645 format(" \t \t f(\"\t\t\"); /* some\n" 10646 " \t \t comment */", 10647 Tab)); 10648 EXPECT_EQ("{\n" 10649 " /*\n" 10650 " * Comment\n" 10651 " */\n" 10652 " int i;\n" 10653 "}", 10654 format("{\n" 10655 "\t/*\n" 10656 "\t * Comment\n" 10657 "\t */\n" 10658 "\t int i;\n" 10659 "}", 10660 Tab)); 10661 10662 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10663 Tab.TabWidth = 8; 10664 Tab.IndentWidth = 8; 10665 EXPECT_EQ("if (aaaaaaaa && // q\n" 10666 " bb) // w\n" 10667 "\t;", 10668 format("if (aaaaaaaa &&// q\n" 10669 "bb)// w\n" 10670 ";", 10671 Tab)); 10672 EXPECT_EQ("if (aaa && bbb) // w\n" 10673 "\t;", 10674 format("if(aaa&&bbb)// w\n" 10675 ";", 10676 Tab)); 10677 verifyFormat("class X {\n" 10678 "\tvoid f() {\n" 10679 "\t\tsomeFunction(parameter1,\n" 10680 "\t\t\t parameter2);\n" 10681 "\t}\n" 10682 "};", 10683 Tab); 10684 verifyFormat("#define A \\\n" 10685 "\tvoid f() { \\\n" 10686 "\t\tsomeFunction( \\\n" 10687 "\t\t parameter1, \\\n" 10688 "\t\t parameter2); \\\n" 10689 "\t}", 10690 Tab); 10691 Tab.TabWidth = 4; 10692 Tab.IndentWidth = 8; 10693 verifyFormat("class TabWidth4Indent8 {\n" 10694 "\t\tvoid f() {\n" 10695 "\t\t\t\tsomeFunction(parameter1,\n" 10696 "\t\t\t\t\t\t\t parameter2);\n" 10697 "\t\t}\n" 10698 "};", 10699 Tab); 10700 Tab.TabWidth = 4; 10701 Tab.IndentWidth = 4; 10702 verifyFormat("class TabWidth4Indent4 {\n" 10703 "\tvoid f() {\n" 10704 "\t\tsomeFunction(parameter1,\n" 10705 "\t\t\t\t\t parameter2);\n" 10706 "\t}\n" 10707 "};", 10708 Tab); 10709 Tab.TabWidth = 8; 10710 Tab.IndentWidth = 4; 10711 verifyFormat("class TabWidth8Indent4 {\n" 10712 " void f() {\n" 10713 "\tsomeFunction(parameter1,\n" 10714 "\t\t parameter2);\n" 10715 " }\n" 10716 "};", 10717 Tab); 10718 Tab.TabWidth = 8; 10719 Tab.IndentWidth = 8; 10720 EXPECT_EQ("/*\n" 10721 "\t a\t\tcomment\n" 10722 "\t in multiple lines\n" 10723 " */", 10724 format(" /*\t \t \n" 10725 " \t \t a\t\tcomment\t \t\n" 10726 " \t \t in multiple lines\t\n" 10727 " \t */", 10728 Tab)); 10729 verifyFormat("{\n" 10730 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10731 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10732 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10733 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10734 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10735 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10736 "};", 10737 Tab); 10738 verifyFormat("enum AA {\n" 10739 "\ta1, // Force multiple lines\n" 10740 "\ta2,\n" 10741 "\ta3\n" 10742 "};", 10743 Tab); 10744 EXPECT_EQ("if (aaaaaaaa && // q\n" 10745 " bb) // w\n" 10746 "\t;", 10747 format("if (aaaaaaaa &&// q\n" 10748 "bb)// w\n" 10749 ";", 10750 Tab)); 10751 verifyFormat("class X {\n" 10752 "\tvoid f() {\n" 10753 "\t\tsomeFunction(parameter1,\n" 10754 "\t\t\t parameter2);\n" 10755 "\t}\n" 10756 "};", 10757 Tab); 10758 verifyFormat("{\n" 10759 "\tQ(\n" 10760 "\t {\n" 10761 "\t\t int a;\n" 10762 "\t\t someFunction(aaaaaaaa,\n" 10763 "\t\t\t\t bbbbbbb);\n" 10764 "\t },\n" 10765 "\t p);\n" 10766 "}", 10767 Tab); 10768 EXPECT_EQ("{\n" 10769 "\t/* aaaa\n" 10770 "\t bbbb */\n" 10771 "}", 10772 format("{\n" 10773 "/* aaaa\n" 10774 " bbbb */\n" 10775 "}", 10776 Tab)); 10777 EXPECT_EQ("{\n" 10778 "\t/*\n" 10779 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10780 "\t bbbbbbbbbbbbb\n" 10781 "\t*/\n" 10782 "}", 10783 format("{\n" 10784 "/*\n" 10785 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10786 "*/\n" 10787 "}", 10788 Tab)); 10789 EXPECT_EQ("{\n" 10790 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10791 "\t// bbbbbbbbbbbbb\n" 10792 "}", 10793 format("{\n" 10794 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10795 "}", 10796 Tab)); 10797 EXPECT_EQ("{\n" 10798 "\t/*\n" 10799 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10800 "\t bbbbbbbbbbbbb\n" 10801 "\t*/\n" 10802 "}", 10803 format("{\n" 10804 "\t/*\n" 10805 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10806 "\t*/\n" 10807 "}", 10808 Tab)); 10809 EXPECT_EQ("{\n" 10810 "\t/*\n" 10811 "\n" 10812 "\t*/\n" 10813 "}", 10814 format("{\n" 10815 "\t/*\n" 10816 "\n" 10817 "\t*/\n" 10818 "}", 10819 Tab)); 10820 EXPECT_EQ("{\n" 10821 "\t/*\n" 10822 " asdf\n" 10823 "\t*/\n" 10824 "}", 10825 format("{\n" 10826 "\t/*\n" 10827 " asdf\n" 10828 "\t*/\n" 10829 "}", 10830 Tab)); 10831 EXPECT_EQ("/* some\n" 10832 " comment */", 10833 format(" \t \t /* some\n" 10834 " \t \t comment */", 10835 Tab)); 10836 EXPECT_EQ("int a; /* some\n" 10837 " comment */", 10838 format(" \t \t int a; /* some\n" 10839 " \t \t comment */", 10840 Tab)); 10841 EXPECT_EQ("int a; /* some\n" 10842 "comment */", 10843 format(" \t \t int\ta; /* some\n" 10844 " \t \t comment */", 10845 Tab)); 10846 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10847 " comment */", 10848 format(" \t \t f(\"\t\t\"); /* some\n" 10849 " \t \t comment */", 10850 Tab)); 10851 EXPECT_EQ("{\n" 10852 "\t/*\n" 10853 "\t * Comment\n" 10854 "\t */\n" 10855 "\tint i;\n" 10856 "}", 10857 format("{\n" 10858 "\t/*\n" 10859 "\t * Comment\n" 10860 "\t */\n" 10861 "\t int i;\n" 10862 "}", 10863 Tab)); 10864 Tab.TabWidth = 2; 10865 Tab.IndentWidth = 2; 10866 EXPECT_EQ("{\n" 10867 "\t/* aaaa\n" 10868 "\t\t bbbb */\n" 10869 "}", 10870 format("{\n" 10871 "/* aaaa\n" 10872 "\t bbbb */\n" 10873 "}", 10874 Tab)); 10875 EXPECT_EQ("{\n" 10876 "\t/*\n" 10877 "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10878 "\t\tbbbbbbbbbbbbb\n" 10879 "\t*/\n" 10880 "}", 10881 format("{\n" 10882 "/*\n" 10883 "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10884 "*/\n" 10885 "}", 10886 Tab)); 10887 Tab.AlignConsecutiveAssignments = true; 10888 Tab.AlignConsecutiveDeclarations = true; 10889 Tab.TabWidth = 4; 10890 Tab.IndentWidth = 4; 10891 verifyFormat("class Assign {\n" 10892 "\tvoid f() {\n" 10893 "\t\tint x = 123;\n" 10894 "\t\tint random = 4;\n" 10895 "\t\tstd::string alphabet =\n" 10896 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10897 "\t}\n" 10898 "};", 10899 Tab); 10900 10901 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 10902 Tab.TabWidth = 8; 10903 Tab.IndentWidth = 8; 10904 EXPECT_EQ("if (aaaaaaaa && // q\n" 10905 " bb) // w\n" 10906 "\t;", 10907 format("if (aaaaaaaa &&// q\n" 10908 "bb)// w\n" 10909 ";", 10910 Tab)); 10911 EXPECT_EQ("if (aaa && bbb) // w\n" 10912 "\t;", 10913 format("if(aaa&&bbb)// w\n" 10914 ";", 10915 Tab)); 10916 verifyFormat("class X {\n" 10917 "\tvoid f() {\n" 10918 "\t\tsomeFunction(parameter1,\n" 10919 "\t\t parameter2);\n" 10920 "\t}\n" 10921 "};", 10922 Tab); 10923 verifyFormat("#define A \\\n" 10924 "\tvoid f() { \\\n" 10925 "\t\tsomeFunction( \\\n" 10926 "\t\t parameter1, \\\n" 10927 "\t\t parameter2); \\\n" 10928 "\t}", 10929 Tab); 10930 Tab.TabWidth = 4; 10931 Tab.IndentWidth = 8; 10932 verifyFormat("class TabWidth4Indent8 {\n" 10933 "\t\tvoid f() {\n" 10934 "\t\t\t\tsomeFunction(parameter1,\n" 10935 "\t\t\t\t parameter2);\n" 10936 "\t\t}\n" 10937 "};", 10938 Tab); 10939 Tab.TabWidth = 4; 10940 Tab.IndentWidth = 4; 10941 verifyFormat("class TabWidth4Indent4 {\n" 10942 "\tvoid f() {\n" 10943 "\t\tsomeFunction(parameter1,\n" 10944 "\t\t parameter2);\n" 10945 "\t}\n" 10946 "};", 10947 Tab); 10948 Tab.TabWidth = 8; 10949 Tab.IndentWidth = 4; 10950 verifyFormat("class TabWidth8Indent4 {\n" 10951 " void f() {\n" 10952 "\tsomeFunction(parameter1,\n" 10953 "\t parameter2);\n" 10954 " }\n" 10955 "};", 10956 Tab); 10957 Tab.TabWidth = 8; 10958 Tab.IndentWidth = 8; 10959 EXPECT_EQ("/*\n" 10960 " a\t\tcomment\n" 10961 " in multiple lines\n" 10962 " */", 10963 format(" /*\t \t \n" 10964 " \t \t a\t\tcomment\t \t\n" 10965 " \t \t in multiple lines\t\n" 10966 " \t */", 10967 Tab)); 10968 verifyFormat("{\n" 10969 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10970 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10971 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10972 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10973 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10974 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10975 "};", 10976 Tab); 10977 verifyFormat("enum AA {\n" 10978 "\ta1, // Force multiple lines\n" 10979 "\ta2,\n" 10980 "\ta3\n" 10981 "};", 10982 Tab); 10983 EXPECT_EQ("if (aaaaaaaa && // q\n" 10984 " bb) // w\n" 10985 "\t;", 10986 format("if (aaaaaaaa &&// q\n" 10987 "bb)// w\n" 10988 ";", 10989 Tab)); 10990 verifyFormat("class X {\n" 10991 "\tvoid f() {\n" 10992 "\t\tsomeFunction(parameter1,\n" 10993 "\t\t parameter2);\n" 10994 "\t}\n" 10995 "};", 10996 Tab); 10997 verifyFormat("{\n" 10998 "\tQ(\n" 10999 "\t {\n" 11000 "\t\t int a;\n" 11001 "\t\t someFunction(aaaaaaaa,\n" 11002 "\t\t bbbbbbb);\n" 11003 "\t },\n" 11004 "\t p);\n" 11005 "}", 11006 Tab); 11007 EXPECT_EQ("{\n" 11008 "\t/* aaaa\n" 11009 "\t bbbb */\n" 11010 "}", 11011 format("{\n" 11012 "/* aaaa\n" 11013 " bbbb */\n" 11014 "}", 11015 Tab)); 11016 EXPECT_EQ("{\n" 11017 "\t/*\n" 11018 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11019 "\t bbbbbbbbbbbbb\n" 11020 "\t*/\n" 11021 "}", 11022 format("{\n" 11023 "/*\n" 11024 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11025 "*/\n" 11026 "}", 11027 Tab)); 11028 EXPECT_EQ("{\n" 11029 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11030 "\t// bbbbbbbbbbbbb\n" 11031 "}", 11032 format("{\n" 11033 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11034 "}", 11035 Tab)); 11036 EXPECT_EQ("{\n" 11037 "\t/*\n" 11038 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11039 "\t bbbbbbbbbbbbb\n" 11040 "\t*/\n" 11041 "}", 11042 format("{\n" 11043 "\t/*\n" 11044 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11045 "\t*/\n" 11046 "}", 11047 Tab)); 11048 EXPECT_EQ("{\n" 11049 "\t/*\n" 11050 "\n" 11051 "\t*/\n" 11052 "}", 11053 format("{\n" 11054 "\t/*\n" 11055 "\n" 11056 "\t*/\n" 11057 "}", 11058 Tab)); 11059 EXPECT_EQ("{\n" 11060 "\t/*\n" 11061 " asdf\n" 11062 "\t*/\n" 11063 "}", 11064 format("{\n" 11065 "\t/*\n" 11066 " asdf\n" 11067 "\t*/\n" 11068 "}", 11069 Tab)); 11070 EXPECT_EQ("/* some\n" 11071 " comment */", 11072 format(" \t \t /* some\n" 11073 " \t \t comment */", 11074 Tab)); 11075 EXPECT_EQ("int a; /* some\n" 11076 " comment */", 11077 format(" \t \t int a; /* some\n" 11078 " \t \t comment */", 11079 Tab)); 11080 EXPECT_EQ("int a; /* some\n" 11081 "comment */", 11082 format(" \t \t int\ta; /* some\n" 11083 " \t \t comment */", 11084 Tab)); 11085 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11086 " comment */", 11087 format(" \t \t f(\"\t\t\"); /* some\n" 11088 " \t \t comment */", 11089 Tab)); 11090 EXPECT_EQ("{\n" 11091 "\t/*\n" 11092 "\t * Comment\n" 11093 "\t */\n" 11094 "\tint i;\n" 11095 "}", 11096 format("{\n" 11097 "\t/*\n" 11098 "\t * Comment\n" 11099 "\t */\n" 11100 "\t int i;\n" 11101 "}", 11102 Tab)); 11103 Tab.TabWidth = 2; 11104 Tab.IndentWidth = 2; 11105 EXPECT_EQ("{\n" 11106 "\t/* aaaa\n" 11107 "\t bbbb */\n" 11108 "}", 11109 format("{\n" 11110 "/* aaaa\n" 11111 " bbbb */\n" 11112 "}", 11113 Tab)); 11114 EXPECT_EQ("{\n" 11115 "\t/*\n" 11116 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11117 "\t bbbbbbbbbbbbb\n" 11118 "\t*/\n" 11119 "}", 11120 format("{\n" 11121 "/*\n" 11122 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11123 "*/\n" 11124 "}", 11125 Tab)); 11126 Tab.AlignConsecutiveAssignments = true; 11127 Tab.AlignConsecutiveDeclarations = true; 11128 Tab.TabWidth = 4; 11129 Tab.IndentWidth = 4; 11130 verifyFormat("class Assign {\n" 11131 "\tvoid f() {\n" 11132 "\t\tint x = 123;\n" 11133 "\t\tint random = 4;\n" 11134 "\t\tstd::string alphabet =\n" 11135 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11136 "\t}\n" 11137 "};", 11138 Tab); 11139 } 11140 11141 TEST_F(FormatTest, ZeroTabWidth) { 11142 FormatStyle Tab = getLLVMStyleWithColumns(42); 11143 Tab.IndentWidth = 8; 11144 Tab.UseTab = FormatStyle::UT_Never; 11145 Tab.TabWidth = 0; 11146 EXPECT_EQ("void a(){\n" 11147 " // line starts with '\t'\n" 11148 "};", 11149 format("void a(){\n" 11150 "\t// line starts with '\t'\n" 11151 "};", 11152 Tab)); 11153 11154 EXPECT_EQ("void a(){\n" 11155 " // line starts with '\t'\n" 11156 "};", 11157 format("void a(){\n" 11158 "\t\t// line starts with '\t'\n" 11159 "};", 11160 Tab)); 11161 11162 Tab.UseTab = FormatStyle::UT_ForIndentation; 11163 EXPECT_EQ("void a(){\n" 11164 " // line starts with '\t'\n" 11165 "};", 11166 format("void a(){\n" 11167 "\t// line starts with '\t'\n" 11168 "};", 11169 Tab)); 11170 11171 EXPECT_EQ("void a(){\n" 11172 " // line starts with '\t'\n" 11173 "};", 11174 format("void a(){\n" 11175 "\t\t// line starts with '\t'\n" 11176 "};", 11177 Tab)); 11178 11179 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 11180 EXPECT_EQ("void a(){\n" 11181 " // line starts with '\t'\n" 11182 "};", 11183 format("void a(){\n" 11184 "\t// line starts with '\t'\n" 11185 "};", 11186 Tab)); 11187 11188 EXPECT_EQ("void a(){\n" 11189 " // line starts with '\t'\n" 11190 "};", 11191 format("void a(){\n" 11192 "\t\t// line starts with '\t'\n" 11193 "};", 11194 Tab)); 11195 11196 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11197 EXPECT_EQ("void a(){\n" 11198 " // line starts with '\t'\n" 11199 "};", 11200 format("void a(){\n" 11201 "\t// line starts with '\t'\n" 11202 "};", 11203 Tab)); 11204 11205 EXPECT_EQ("void a(){\n" 11206 " // line starts with '\t'\n" 11207 "};", 11208 format("void a(){\n" 11209 "\t\t// line starts with '\t'\n" 11210 "};", 11211 Tab)); 11212 11213 Tab.UseTab = FormatStyle::UT_Always; 11214 EXPECT_EQ("void a(){\n" 11215 "// line starts with '\t'\n" 11216 "};", 11217 format("void a(){\n" 11218 "\t// line starts with '\t'\n" 11219 "};", 11220 Tab)); 11221 11222 EXPECT_EQ("void a(){\n" 11223 "// line starts with '\t'\n" 11224 "};", 11225 format("void a(){\n" 11226 "\t\t// line starts with '\t'\n" 11227 "};", 11228 Tab)); 11229 } 11230 11231 TEST_F(FormatTest, CalculatesOriginalColumn) { 11232 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11233 "q\"; /* some\n" 11234 " comment */", 11235 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11236 "q\"; /* some\n" 11237 " comment */", 11238 getLLVMStyle())); 11239 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11240 "/* some\n" 11241 " comment */", 11242 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11243 " /* some\n" 11244 " comment */", 11245 getLLVMStyle())); 11246 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11247 "qqq\n" 11248 "/* some\n" 11249 " comment */", 11250 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11251 "qqq\n" 11252 " /* some\n" 11253 " comment */", 11254 getLLVMStyle())); 11255 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11256 "wwww; /* some\n" 11257 " comment */", 11258 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11259 "wwww; /* some\n" 11260 " comment */", 11261 getLLVMStyle())); 11262 } 11263 11264 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 11265 FormatStyle NoSpace = getLLVMStyle(); 11266 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 11267 11268 verifyFormat("while(true)\n" 11269 " continue;", 11270 NoSpace); 11271 verifyFormat("for(;;)\n" 11272 " continue;", 11273 NoSpace); 11274 verifyFormat("if(true)\n" 11275 " f();\n" 11276 "else if(true)\n" 11277 " f();", 11278 NoSpace); 11279 verifyFormat("do {\n" 11280 " do_something();\n" 11281 "} while(something());", 11282 NoSpace); 11283 verifyFormat("switch(x) {\n" 11284 "default:\n" 11285 " break;\n" 11286 "}", 11287 NoSpace); 11288 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 11289 verifyFormat("size_t x = sizeof(x);", NoSpace); 11290 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 11291 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 11292 verifyFormat("alignas(128) char a[128];", NoSpace); 11293 verifyFormat("size_t x = alignof(MyType);", NoSpace); 11294 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 11295 verifyFormat("int f() throw(Deprecated);", NoSpace); 11296 verifyFormat("typedef void (*cb)(int);", NoSpace); 11297 verifyFormat("T A::operator()();", NoSpace); 11298 verifyFormat("X A::operator++(T);", NoSpace); 11299 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 11300 11301 FormatStyle Space = getLLVMStyle(); 11302 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 11303 11304 verifyFormat("int f ();", Space); 11305 verifyFormat("void f (int a, T b) {\n" 11306 " while (true)\n" 11307 " continue;\n" 11308 "}", 11309 Space); 11310 verifyFormat("if (true)\n" 11311 " f ();\n" 11312 "else if (true)\n" 11313 " f ();", 11314 Space); 11315 verifyFormat("do {\n" 11316 " do_something ();\n" 11317 "} while (something ());", 11318 Space); 11319 verifyFormat("switch (x) {\n" 11320 "default:\n" 11321 " break;\n" 11322 "}", 11323 Space); 11324 verifyFormat("A::A () : a (1) {}", Space); 11325 verifyFormat("void f () __attribute__ ((asdf));", Space); 11326 verifyFormat("*(&a + 1);\n" 11327 "&((&a)[1]);\n" 11328 "a[(b + c) * d];\n" 11329 "(((a + 1) * 2) + 3) * 4;", 11330 Space); 11331 verifyFormat("#define A(x) x", Space); 11332 verifyFormat("#define A (x) x", Space); 11333 verifyFormat("#if defined(x)\n" 11334 "#endif", 11335 Space); 11336 verifyFormat("auto i = std::make_unique<int> (5);", Space); 11337 verifyFormat("size_t x = sizeof (x);", Space); 11338 verifyFormat("auto f (int x) -> decltype (x);", Space); 11339 verifyFormat("int f (T x) noexcept (x.create ());", Space); 11340 verifyFormat("alignas (128) char a[128];", Space); 11341 verifyFormat("size_t x = alignof (MyType);", Space); 11342 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 11343 verifyFormat("int f () throw (Deprecated);", Space); 11344 verifyFormat("typedef void (*cb) (int);", Space); 11345 verifyFormat("T A::operator() ();", Space); 11346 verifyFormat("X A::operator++ (T);", Space); 11347 verifyFormat("auto lambda = [] () { return 0; };", Space); 11348 verifyFormat("int x = int (y);", Space); 11349 11350 FormatStyle SomeSpace = getLLVMStyle(); 11351 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 11352 11353 verifyFormat("[]() -> float {}", SomeSpace); 11354 verifyFormat("[] (auto foo) {}", SomeSpace); 11355 verifyFormat("[foo]() -> int {}", SomeSpace); 11356 verifyFormat("int f();", SomeSpace); 11357 verifyFormat("void f (int a, T b) {\n" 11358 " while (true)\n" 11359 " continue;\n" 11360 "}", 11361 SomeSpace); 11362 verifyFormat("if (true)\n" 11363 " f();\n" 11364 "else if (true)\n" 11365 " f();", 11366 SomeSpace); 11367 verifyFormat("do {\n" 11368 " do_something();\n" 11369 "} while (something());", 11370 SomeSpace); 11371 verifyFormat("switch (x) {\n" 11372 "default:\n" 11373 " break;\n" 11374 "}", 11375 SomeSpace); 11376 verifyFormat("A::A() : a (1) {}", SomeSpace); 11377 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 11378 verifyFormat("*(&a + 1);\n" 11379 "&((&a)[1]);\n" 11380 "a[(b + c) * d];\n" 11381 "(((a + 1) * 2) + 3) * 4;", 11382 SomeSpace); 11383 verifyFormat("#define A(x) x", SomeSpace); 11384 verifyFormat("#define A (x) x", SomeSpace); 11385 verifyFormat("#if defined(x)\n" 11386 "#endif", 11387 SomeSpace); 11388 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 11389 verifyFormat("size_t x = sizeof (x);", SomeSpace); 11390 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 11391 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 11392 verifyFormat("alignas (128) char a[128];", SomeSpace); 11393 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 11394 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 11395 SomeSpace); 11396 verifyFormat("int f() throw (Deprecated);", SomeSpace); 11397 verifyFormat("typedef void (*cb) (int);", SomeSpace); 11398 verifyFormat("T A::operator()();", SomeSpace); 11399 verifyFormat("X A::operator++ (T);", SomeSpace); 11400 verifyFormat("int x = int (y);", SomeSpace); 11401 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 11402 } 11403 11404 TEST_F(FormatTest, SpaceAfterLogicalNot) { 11405 FormatStyle Spaces = getLLVMStyle(); 11406 Spaces.SpaceAfterLogicalNot = true; 11407 11408 verifyFormat("bool x = ! y", Spaces); 11409 verifyFormat("if (! isFailure())", Spaces); 11410 verifyFormat("if (! (a && b))", Spaces); 11411 verifyFormat("\"Error!\"", Spaces); 11412 verifyFormat("! ! x", Spaces); 11413 } 11414 11415 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 11416 FormatStyle Spaces = getLLVMStyle(); 11417 11418 Spaces.SpacesInParentheses = true; 11419 verifyFormat("do_something( ::globalVar );", Spaces); 11420 verifyFormat("call( x, y, z );", Spaces); 11421 verifyFormat("call();", Spaces); 11422 verifyFormat("std::function<void( int, int )> callback;", Spaces); 11423 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 11424 Spaces); 11425 verifyFormat("while ( (bool)1 )\n" 11426 " continue;", 11427 Spaces); 11428 verifyFormat("for ( ;; )\n" 11429 " continue;", 11430 Spaces); 11431 verifyFormat("if ( true )\n" 11432 " f();\n" 11433 "else if ( true )\n" 11434 " f();", 11435 Spaces); 11436 verifyFormat("do {\n" 11437 " do_something( (int)i );\n" 11438 "} while ( something() );", 11439 Spaces); 11440 verifyFormat("switch ( x ) {\n" 11441 "default:\n" 11442 " break;\n" 11443 "}", 11444 Spaces); 11445 11446 Spaces.SpacesInParentheses = false; 11447 Spaces.SpacesInCStyleCastParentheses = true; 11448 verifyFormat("Type *A = ( Type * )P;", Spaces); 11449 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 11450 verifyFormat("x = ( int32 )y;", Spaces); 11451 verifyFormat("int a = ( int )(2.0f);", Spaces); 11452 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 11453 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 11454 verifyFormat("#define x (( int )-1)", Spaces); 11455 11456 // Run the first set of tests again with: 11457 Spaces.SpacesInParentheses = false; 11458 Spaces.SpaceInEmptyParentheses = true; 11459 Spaces.SpacesInCStyleCastParentheses = true; 11460 verifyFormat("call(x, y, z);", Spaces); 11461 verifyFormat("call( );", Spaces); 11462 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11463 verifyFormat("while (( bool )1)\n" 11464 " continue;", 11465 Spaces); 11466 verifyFormat("for (;;)\n" 11467 " continue;", 11468 Spaces); 11469 verifyFormat("if (true)\n" 11470 " f( );\n" 11471 "else if (true)\n" 11472 " f( );", 11473 Spaces); 11474 verifyFormat("do {\n" 11475 " do_something(( int )i);\n" 11476 "} while (something( ));", 11477 Spaces); 11478 verifyFormat("switch (x) {\n" 11479 "default:\n" 11480 " break;\n" 11481 "}", 11482 Spaces); 11483 11484 // Run the first set of tests again with: 11485 Spaces.SpaceAfterCStyleCast = true; 11486 verifyFormat("call(x, y, z);", Spaces); 11487 verifyFormat("call( );", Spaces); 11488 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11489 verifyFormat("while (( bool ) 1)\n" 11490 " continue;", 11491 Spaces); 11492 verifyFormat("for (;;)\n" 11493 " continue;", 11494 Spaces); 11495 verifyFormat("if (true)\n" 11496 " f( );\n" 11497 "else if (true)\n" 11498 " f( );", 11499 Spaces); 11500 verifyFormat("do {\n" 11501 " do_something(( int ) i);\n" 11502 "} while (something( ));", 11503 Spaces); 11504 verifyFormat("switch (x) {\n" 11505 "default:\n" 11506 " break;\n" 11507 "}", 11508 Spaces); 11509 11510 // Run subset of tests again with: 11511 Spaces.SpacesInCStyleCastParentheses = false; 11512 Spaces.SpaceAfterCStyleCast = true; 11513 verifyFormat("while ((bool) 1)\n" 11514 " continue;", 11515 Spaces); 11516 verifyFormat("do {\n" 11517 " do_something((int) i);\n" 11518 "} while (something( ));", 11519 Spaces); 11520 } 11521 11522 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 11523 verifyFormat("int a[5];"); 11524 verifyFormat("a[3] += 42;"); 11525 11526 FormatStyle Spaces = getLLVMStyle(); 11527 Spaces.SpacesInSquareBrackets = true; 11528 // Not lambdas. 11529 verifyFormat("int a[ 5 ];", Spaces); 11530 verifyFormat("a[ 3 ] += 42;", Spaces); 11531 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 11532 verifyFormat("double &operator[](int i) { return 0; }\n" 11533 "int i;", 11534 Spaces); 11535 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 11536 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 11537 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 11538 // Lambdas. 11539 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 11540 verifyFormat("return [ i, args... ] {};", Spaces); 11541 verifyFormat("int foo = [ &bar ]() {};", Spaces); 11542 verifyFormat("int foo = [ = ]() {};", Spaces); 11543 verifyFormat("int foo = [ & ]() {};", Spaces); 11544 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 11545 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 11546 } 11547 11548 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 11549 FormatStyle NoSpaceStyle = getLLVMStyle(); 11550 verifyFormat("int a[5];", NoSpaceStyle); 11551 verifyFormat("a[3] += 42;", NoSpaceStyle); 11552 11553 verifyFormat("int a[1];", NoSpaceStyle); 11554 verifyFormat("int 1 [a];", NoSpaceStyle); 11555 verifyFormat("int a[1][2];", NoSpaceStyle); 11556 verifyFormat("a[7] = 5;", NoSpaceStyle); 11557 verifyFormat("int a = (f())[23];", NoSpaceStyle); 11558 verifyFormat("f([] {})", NoSpaceStyle); 11559 11560 FormatStyle Space = getLLVMStyle(); 11561 Space.SpaceBeforeSquareBrackets = true; 11562 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 11563 verifyFormat("return [i, args...] {};", Space); 11564 11565 verifyFormat("int a [5];", Space); 11566 verifyFormat("a [3] += 42;", Space); 11567 verifyFormat("constexpr char hello []{\"hello\"};", Space); 11568 verifyFormat("double &operator[](int i) { return 0; }\n" 11569 "int i;", 11570 Space); 11571 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 11572 verifyFormat("int i = a [a][a]->f();", Space); 11573 verifyFormat("int i = (*b) [a]->f();", Space); 11574 11575 verifyFormat("int a [1];", Space); 11576 verifyFormat("int 1 [a];", Space); 11577 verifyFormat("int a [1][2];", Space); 11578 verifyFormat("a [7] = 5;", Space); 11579 verifyFormat("int a = (f()) [23];", Space); 11580 verifyFormat("f([] {})", Space); 11581 } 11582 11583 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 11584 verifyFormat("int a = 5;"); 11585 verifyFormat("a += 42;"); 11586 verifyFormat("a or_eq 8;"); 11587 11588 FormatStyle Spaces = getLLVMStyle(); 11589 Spaces.SpaceBeforeAssignmentOperators = false; 11590 verifyFormat("int a= 5;", Spaces); 11591 verifyFormat("a+= 42;", Spaces); 11592 verifyFormat("a or_eq 8;", Spaces); 11593 } 11594 11595 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 11596 verifyFormat("class Foo : public Bar {};"); 11597 verifyFormat("Foo::Foo() : foo(1) {}"); 11598 verifyFormat("for (auto a : b) {\n}"); 11599 verifyFormat("int x = a ? b : c;"); 11600 verifyFormat("{\n" 11601 "label0:\n" 11602 " int x = 0;\n" 11603 "}"); 11604 verifyFormat("switch (x) {\n" 11605 "case 1:\n" 11606 "default:\n" 11607 "}"); 11608 11609 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 11610 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 11611 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 11612 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 11613 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 11614 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 11615 verifyFormat("{\n" 11616 "label1:\n" 11617 " int x = 0;\n" 11618 "}", 11619 CtorInitializerStyle); 11620 verifyFormat("switch (x) {\n" 11621 "case 1:\n" 11622 "default:\n" 11623 "}", 11624 CtorInitializerStyle); 11625 CtorInitializerStyle.BreakConstructorInitializers = 11626 FormatStyle::BCIS_AfterColon; 11627 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 11628 " aaaaaaaaaaaaaaaa(1),\n" 11629 " bbbbbbbbbbbbbbbb(2) {}", 11630 CtorInitializerStyle); 11631 CtorInitializerStyle.BreakConstructorInitializers = 11632 FormatStyle::BCIS_BeforeComma; 11633 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11634 " : aaaaaaaaaaaaaaaa(1)\n" 11635 " , bbbbbbbbbbbbbbbb(2) {}", 11636 CtorInitializerStyle); 11637 CtorInitializerStyle.BreakConstructorInitializers = 11638 FormatStyle::BCIS_BeforeColon; 11639 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11640 " : aaaaaaaaaaaaaaaa(1),\n" 11641 " bbbbbbbbbbbbbbbb(2) {}", 11642 CtorInitializerStyle); 11643 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 11644 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11645 ": aaaaaaaaaaaaaaaa(1),\n" 11646 " bbbbbbbbbbbbbbbb(2) {}", 11647 CtorInitializerStyle); 11648 11649 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 11650 InheritanceStyle.SpaceBeforeInheritanceColon = false; 11651 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 11652 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 11653 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 11654 verifyFormat("int x = a ? b : c;", InheritanceStyle); 11655 verifyFormat("{\n" 11656 "label2:\n" 11657 " int x = 0;\n" 11658 "}", 11659 InheritanceStyle); 11660 verifyFormat("switch (x) {\n" 11661 "case 1:\n" 11662 "default:\n" 11663 "}", 11664 InheritanceStyle); 11665 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 11666 verifyFormat("class Foooooooooooooooooooooo:\n" 11667 " public aaaaaaaaaaaaaaaaaa,\n" 11668 " public bbbbbbbbbbbbbbbbbb {\n" 11669 "}", 11670 InheritanceStyle); 11671 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 11672 verifyFormat("class Foooooooooooooooooooooo\n" 11673 " : public aaaaaaaaaaaaaaaaaa\n" 11674 " , public bbbbbbbbbbbbbbbbbb {\n" 11675 "}", 11676 InheritanceStyle); 11677 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 11678 verifyFormat("class Foooooooooooooooooooooo\n" 11679 " : public aaaaaaaaaaaaaaaaaa,\n" 11680 " public bbbbbbbbbbbbbbbbbb {\n" 11681 "}", 11682 InheritanceStyle); 11683 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 11684 verifyFormat("class Foooooooooooooooooooooo\n" 11685 ": public aaaaaaaaaaaaaaaaaa,\n" 11686 " public bbbbbbbbbbbbbbbbbb {}", 11687 InheritanceStyle); 11688 11689 FormatStyle ForLoopStyle = getLLVMStyle(); 11690 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 11691 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 11692 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 11693 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 11694 verifyFormat("int x = a ? b : c;", ForLoopStyle); 11695 verifyFormat("{\n" 11696 "label2:\n" 11697 " int x = 0;\n" 11698 "}", 11699 ForLoopStyle); 11700 verifyFormat("switch (x) {\n" 11701 "case 1:\n" 11702 "default:\n" 11703 "}", 11704 ForLoopStyle); 11705 11706 FormatStyle NoSpaceStyle = getLLVMStyle(); 11707 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 11708 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 11709 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 11710 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 11711 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 11712 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 11713 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 11714 verifyFormat("{\n" 11715 "label3:\n" 11716 " int x = 0;\n" 11717 "}", 11718 NoSpaceStyle); 11719 verifyFormat("switch (x) {\n" 11720 "case 1:\n" 11721 "default:\n" 11722 "}", 11723 NoSpaceStyle); 11724 } 11725 11726 TEST_F(FormatTest, AlignConsecutiveMacros) { 11727 FormatStyle Style = getLLVMStyle(); 11728 Style.AlignConsecutiveAssignments = true; 11729 Style.AlignConsecutiveDeclarations = true; 11730 Style.AlignConsecutiveMacros = false; 11731 11732 verifyFormat("#define a 3\n" 11733 "#define bbbb 4\n" 11734 "#define ccc (5)", 11735 Style); 11736 11737 verifyFormat("#define f(x) (x * x)\n" 11738 "#define fff(x, y, z) (x * y + z)\n" 11739 "#define ffff(x, y) (x - y)", 11740 Style); 11741 11742 verifyFormat("#define foo(x, y) (x + y)\n" 11743 "#define bar (5, 6)(2 + 2)", 11744 Style); 11745 11746 verifyFormat("#define a 3\n" 11747 "#define bbbb 4\n" 11748 "#define ccc (5)\n" 11749 "#define f(x) (x * x)\n" 11750 "#define fff(x, y, z) (x * y + z)\n" 11751 "#define ffff(x, y) (x - y)", 11752 Style); 11753 11754 Style.AlignConsecutiveMacros = true; 11755 verifyFormat("#define a 3\n" 11756 "#define bbbb 4\n" 11757 "#define ccc (5)", 11758 Style); 11759 11760 verifyFormat("#define f(x) (x * x)\n" 11761 "#define fff(x, y, z) (x * y + z)\n" 11762 "#define ffff(x, y) (x - y)", 11763 Style); 11764 11765 verifyFormat("#define foo(x, y) (x + y)\n" 11766 "#define bar (5, 6)(2 + 2)", 11767 Style); 11768 11769 verifyFormat("#define a 3\n" 11770 "#define bbbb 4\n" 11771 "#define ccc (5)\n" 11772 "#define f(x) (x * x)\n" 11773 "#define fff(x, y, z) (x * y + z)\n" 11774 "#define ffff(x, y) (x - y)", 11775 Style); 11776 11777 verifyFormat("#define a 5\n" 11778 "#define foo(x, y) (x + y)\n" 11779 "#define CCC (6)\n" 11780 "auto lambda = []() {\n" 11781 " auto ii = 0;\n" 11782 " float j = 0;\n" 11783 " return 0;\n" 11784 "};\n" 11785 "int i = 0;\n" 11786 "float i2 = 0;\n" 11787 "auto v = type{\n" 11788 " i = 1, //\n" 11789 " (i = 2), //\n" 11790 " i = 3 //\n" 11791 "};", 11792 Style); 11793 11794 Style.AlignConsecutiveMacros = false; 11795 Style.ColumnLimit = 20; 11796 11797 verifyFormat("#define a \\\n" 11798 " \"aabbbbbbbbbbbb\"\n" 11799 "#define D \\\n" 11800 " \"aabbbbbbbbbbbb\" \\\n" 11801 " \"ccddeeeeeeeee\"\n" 11802 "#define B \\\n" 11803 " \"QQQQQQQQQQQQQ\" \\\n" 11804 " \"FFFFFFFFFFFFF\" \\\n" 11805 " \"LLLLLLLL\"\n", 11806 Style); 11807 11808 Style.AlignConsecutiveMacros = true; 11809 verifyFormat("#define a \\\n" 11810 " \"aabbbbbbbbbbbb\"\n" 11811 "#define D \\\n" 11812 " \"aabbbbbbbbbbbb\" \\\n" 11813 " \"ccddeeeeeeeee\"\n" 11814 "#define B \\\n" 11815 " \"QQQQQQQQQQQQQ\" \\\n" 11816 " \"FFFFFFFFFFFFF\" \\\n" 11817 " \"LLLLLLLL\"\n", 11818 Style); 11819 } 11820 11821 TEST_F(FormatTest, AlignConsecutiveAssignments) { 11822 FormatStyle Alignment = getLLVMStyle(); 11823 Alignment.AlignConsecutiveMacros = true; 11824 Alignment.AlignConsecutiveAssignments = false; 11825 verifyFormat("int a = 5;\n" 11826 "int oneTwoThree = 123;", 11827 Alignment); 11828 verifyFormat("int a = 5;\n" 11829 "int oneTwoThree = 123;", 11830 Alignment); 11831 11832 Alignment.AlignConsecutiveAssignments = true; 11833 verifyFormat("int a = 5;\n" 11834 "int oneTwoThree = 123;", 11835 Alignment); 11836 verifyFormat("int a = method();\n" 11837 "int oneTwoThree = 133;", 11838 Alignment); 11839 verifyFormat("a &= 5;\n" 11840 "bcd *= 5;\n" 11841 "ghtyf += 5;\n" 11842 "dvfvdb -= 5;\n" 11843 "a /= 5;\n" 11844 "vdsvsv %= 5;\n" 11845 "sfdbddfbdfbb ^= 5;\n" 11846 "dvsdsv |= 5;\n" 11847 "int dsvvdvsdvvv = 123;", 11848 Alignment); 11849 verifyFormat("int i = 1, j = 10;\n" 11850 "something = 2000;", 11851 Alignment); 11852 verifyFormat("something = 2000;\n" 11853 "int i = 1, j = 10;\n", 11854 Alignment); 11855 verifyFormat("something = 2000;\n" 11856 "another = 911;\n" 11857 "int i = 1, j = 10;\n" 11858 "oneMore = 1;\n" 11859 "i = 2;", 11860 Alignment); 11861 verifyFormat("int a = 5;\n" 11862 "int one = 1;\n" 11863 "method();\n" 11864 "int oneTwoThree = 123;\n" 11865 "int oneTwo = 12;", 11866 Alignment); 11867 verifyFormat("int oneTwoThree = 123;\n" 11868 "int oneTwo = 12;\n" 11869 "method();\n", 11870 Alignment); 11871 verifyFormat("int oneTwoThree = 123; // comment\n" 11872 "int oneTwo = 12; // comment", 11873 Alignment); 11874 11875 // Bug 25167 11876 verifyFormat("#if A\n" 11877 "#else\n" 11878 "int aaaaaaaa = 12;\n" 11879 "#endif\n" 11880 "#if B\n" 11881 "#else\n" 11882 "int a = 12;\n" 11883 "#endif\n", 11884 Alignment); 11885 verifyFormat("enum foo {\n" 11886 "#if A\n" 11887 "#else\n" 11888 " aaaaaaaa = 12;\n" 11889 "#endif\n" 11890 "#if B\n" 11891 "#else\n" 11892 " a = 12;\n" 11893 "#endif\n" 11894 "};\n", 11895 Alignment); 11896 11897 EXPECT_EQ("int a = 5;\n" 11898 "\n" 11899 "int oneTwoThree = 123;", 11900 format("int a = 5;\n" 11901 "\n" 11902 "int oneTwoThree= 123;", 11903 Alignment)); 11904 EXPECT_EQ("int a = 5;\n" 11905 "int one = 1;\n" 11906 "\n" 11907 "int oneTwoThree = 123;", 11908 format("int a = 5;\n" 11909 "int one = 1;\n" 11910 "\n" 11911 "int oneTwoThree = 123;", 11912 Alignment)); 11913 EXPECT_EQ("int a = 5;\n" 11914 "int one = 1;\n" 11915 "\n" 11916 "int oneTwoThree = 123;\n" 11917 "int oneTwo = 12;", 11918 format("int a = 5;\n" 11919 "int one = 1;\n" 11920 "\n" 11921 "int oneTwoThree = 123;\n" 11922 "int oneTwo = 12;", 11923 Alignment)); 11924 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11925 verifyFormat("#define A \\\n" 11926 " int aaaa = 12; \\\n" 11927 " int b = 23; \\\n" 11928 " int ccc = 234; \\\n" 11929 " int dddddddddd = 2345;", 11930 Alignment); 11931 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11932 verifyFormat("#define A \\\n" 11933 " int aaaa = 12; \\\n" 11934 " int b = 23; \\\n" 11935 " int ccc = 234; \\\n" 11936 " int dddddddddd = 2345;", 11937 Alignment); 11938 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11939 verifyFormat("#define A " 11940 " \\\n" 11941 " int aaaa = 12; " 11942 " \\\n" 11943 " int b = 23; " 11944 " \\\n" 11945 " int ccc = 234; " 11946 " \\\n" 11947 " int dddddddddd = 2345;", 11948 Alignment); 11949 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11950 "k = 4, int l = 5,\n" 11951 " int m = 6) {\n" 11952 " int j = 10;\n" 11953 " otherThing = 1;\n" 11954 "}", 11955 Alignment); 11956 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11957 " int i = 1;\n" 11958 " int j = 2;\n" 11959 " int big = 10000;\n" 11960 "}", 11961 Alignment); 11962 verifyFormat("class C {\n" 11963 "public:\n" 11964 " int i = 1;\n" 11965 " virtual void f() = 0;\n" 11966 "};", 11967 Alignment); 11968 verifyFormat("int i = 1;\n" 11969 "if (SomeType t = getSomething()) {\n" 11970 "}\n" 11971 "int j = 2;\n" 11972 "int big = 10000;", 11973 Alignment); 11974 verifyFormat("int j = 7;\n" 11975 "for (int k = 0; k < N; ++k) {\n" 11976 "}\n" 11977 "int j = 2;\n" 11978 "int big = 10000;\n" 11979 "}", 11980 Alignment); 11981 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11982 verifyFormat("int i = 1;\n" 11983 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11984 " = someLooooooooooooooooongFunction();\n" 11985 "int j = 2;", 11986 Alignment); 11987 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11988 verifyFormat("int i = 1;\n" 11989 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11990 " someLooooooooooooooooongFunction();\n" 11991 "int j = 2;", 11992 Alignment); 11993 11994 verifyFormat("auto lambda = []() {\n" 11995 " auto i = 0;\n" 11996 " return 0;\n" 11997 "};\n" 11998 "int i = 0;\n" 11999 "auto v = type{\n" 12000 " i = 1, //\n" 12001 " (i = 2), //\n" 12002 " i = 3 //\n" 12003 "};", 12004 Alignment); 12005 12006 verifyFormat( 12007 "int i = 1;\n" 12008 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12009 " loooooooooooooooooooooongParameterB);\n" 12010 "int j = 2;", 12011 Alignment); 12012 12013 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 12014 " typename B = very_long_type_name_1,\n" 12015 " typename T_2 = very_long_type_name_2>\n" 12016 "auto foo() {}\n", 12017 Alignment); 12018 verifyFormat("int a, b = 1;\n" 12019 "int c = 2;\n" 12020 "int dd = 3;\n", 12021 Alignment); 12022 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12023 "float b[1][] = {{3.f}};\n", 12024 Alignment); 12025 verifyFormat("for (int i = 0; i < 1; i++)\n" 12026 " int x = 1;\n", 12027 Alignment); 12028 verifyFormat("for (i = 0; i < 1; i++)\n" 12029 " x = 1;\n" 12030 "y = 1;\n", 12031 Alignment); 12032 12033 Alignment.ReflowComments = true; 12034 Alignment.ColumnLimit = 50; 12035 EXPECT_EQ("int x = 0;\n" 12036 "int yy = 1; /// specificlennospace\n" 12037 "int zzz = 2;\n", 12038 format("int x = 0;\n" 12039 "int yy = 1; ///specificlennospace\n" 12040 "int zzz = 2;\n", 12041 Alignment)); 12042 } 12043 12044 TEST_F(FormatTest, AlignConsecutiveBitFields) { 12045 FormatStyle Alignment = getLLVMStyle(); 12046 Alignment.AlignConsecutiveBitFields = true; 12047 verifyFormat("int const a : 5;\n" 12048 "int oneTwoThree : 23;", 12049 Alignment); 12050 12051 // Initializers are allowed starting with c++2a 12052 verifyFormat("int const a : 5 = 1;\n" 12053 "int oneTwoThree : 23 = 0;", 12054 Alignment); 12055 12056 Alignment.AlignConsecutiveDeclarations = true; 12057 verifyFormat("int const a : 5;\n" 12058 "int oneTwoThree : 23;", 12059 Alignment); 12060 12061 verifyFormat("int const a : 5; // comment\n" 12062 "int oneTwoThree : 23; // comment", 12063 Alignment); 12064 12065 verifyFormat("int const a : 5 = 1;\n" 12066 "int oneTwoThree : 23 = 0;", 12067 Alignment); 12068 12069 Alignment.AlignConsecutiveAssignments = true; 12070 verifyFormat("int const a : 5 = 1;\n" 12071 "int oneTwoThree : 23 = 0;", 12072 Alignment); 12073 verifyFormat("int const a : 5 = {1};\n" 12074 "int oneTwoThree : 23 = 0;", 12075 Alignment); 12076 12077 // Known limitations: ':' is only recognized as a bitfield colon when 12078 // followed by a number. 12079 /* 12080 verifyFormat("int oneTwoThree : SOME_CONSTANT;\n" 12081 "int a : 5;", 12082 Alignment); 12083 */ 12084 } 12085 12086 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 12087 FormatStyle Alignment = getLLVMStyle(); 12088 Alignment.AlignConsecutiveMacros = true; 12089 Alignment.AlignConsecutiveDeclarations = false; 12090 verifyFormat("float const a = 5;\n" 12091 "int oneTwoThree = 123;", 12092 Alignment); 12093 verifyFormat("int a = 5;\n" 12094 "float const oneTwoThree = 123;", 12095 Alignment); 12096 12097 Alignment.AlignConsecutiveDeclarations = true; 12098 verifyFormat("float const a = 5;\n" 12099 "int oneTwoThree = 123;", 12100 Alignment); 12101 verifyFormat("int a = method();\n" 12102 "float const oneTwoThree = 133;", 12103 Alignment); 12104 verifyFormat("int i = 1, j = 10;\n" 12105 "something = 2000;", 12106 Alignment); 12107 verifyFormat("something = 2000;\n" 12108 "int i = 1, j = 10;\n", 12109 Alignment); 12110 verifyFormat("float something = 2000;\n" 12111 "double another = 911;\n" 12112 "int i = 1, j = 10;\n" 12113 "const int *oneMore = 1;\n" 12114 "unsigned i = 2;", 12115 Alignment); 12116 verifyFormat("float a = 5;\n" 12117 "int one = 1;\n" 12118 "method();\n" 12119 "const double oneTwoThree = 123;\n" 12120 "const unsigned int oneTwo = 12;", 12121 Alignment); 12122 verifyFormat("int oneTwoThree{0}; // comment\n" 12123 "unsigned oneTwo; // comment", 12124 Alignment); 12125 EXPECT_EQ("float const a = 5;\n" 12126 "\n" 12127 "int oneTwoThree = 123;", 12128 format("float const a = 5;\n" 12129 "\n" 12130 "int oneTwoThree= 123;", 12131 Alignment)); 12132 EXPECT_EQ("float a = 5;\n" 12133 "int one = 1;\n" 12134 "\n" 12135 "unsigned oneTwoThree = 123;", 12136 format("float a = 5;\n" 12137 "int one = 1;\n" 12138 "\n" 12139 "unsigned oneTwoThree = 123;", 12140 Alignment)); 12141 EXPECT_EQ("float a = 5;\n" 12142 "int one = 1;\n" 12143 "\n" 12144 "unsigned oneTwoThree = 123;\n" 12145 "int oneTwo = 12;", 12146 format("float a = 5;\n" 12147 "int one = 1;\n" 12148 "\n" 12149 "unsigned oneTwoThree = 123;\n" 12150 "int oneTwo = 12;", 12151 Alignment)); 12152 // Function prototype alignment 12153 verifyFormat("int a();\n" 12154 "double b();", 12155 Alignment); 12156 verifyFormat("int a(int x);\n" 12157 "double b();", 12158 Alignment); 12159 unsigned OldColumnLimit = Alignment.ColumnLimit; 12160 // We need to set ColumnLimit to zero, in order to stress nested alignments, 12161 // otherwise the function parameters will be re-flowed onto a single line. 12162 Alignment.ColumnLimit = 0; 12163 EXPECT_EQ("int a(int x,\n" 12164 " float y);\n" 12165 "double b(int x,\n" 12166 " double y);", 12167 format("int a(int x,\n" 12168 " float y);\n" 12169 "double b(int x,\n" 12170 " double y);", 12171 Alignment)); 12172 // This ensures that function parameters of function declarations are 12173 // correctly indented when their owning functions are indented. 12174 // The failure case here is for 'double y' to not be indented enough. 12175 EXPECT_EQ("double a(int x);\n" 12176 "int b(int y,\n" 12177 " double z);", 12178 format("double a(int x);\n" 12179 "int b(int y,\n" 12180 " double z);", 12181 Alignment)); 12182 // Set ColumnLimit low so that we induce wrapping immediately after 12183 // the function name and opening paren. 12184 Alignment.ColumnLimit = 13; 12185 verifyFormat("int function(\n" 12186 " int x,\n" 12187 " bool y);", 12188 Alignment); 12189 Alignment.ColumnLimit = OldColumnLimit; 12190 // Ensure function pointers don't screw up recursive alignment 12191 verifyFormat("int a(int x, void (*fp)(int y));\n" 12192 "double b();", 12193 Alignment); 12194 Alignment.AlignConsecutiveAssignments = true; 12195 // Ensure recursive alignment is broken by function braces, so that the 12196 // "a = 1" does not align with subsequent assignments inside the function 12197 // body. 12198 verifyFormat("int func(int a = 1) {\n" 12199 " int b = 2;\n" 12200 " int cc = 3;\n" 12201 "}", 12202 Alignment); 12203 verifyFormat("float something = 2000;\n" 12204 "double another = 911;\n" 12205 "int i = 1, j = 10;\n" 12206 "const int *oneMore = 1;\n" 12207 "unsigned i = 2;", 12208 Alignment); 12209 verifyFormat("int oneTwoThree = {0}; // comment\n" 12210 "unsigned oneTwo = 0; // comment", 12211 Alignment); 12212 // Make sure that scope is correctly tracked, in the absence of braces 12213 verifyFormat("for (int i = 0; i < n; i++)\n" 12214 " j = i;\n" 12215 "double x = 1;\n", 12216 Alignment); 12217 verifyFormat("if (int i = 0)\n" 12218 " j = i;\n" 12219 "double x = 1;\n", 12220 Alignment); 12221 // Ensure operator[] and operator() are comprehended 12222 verifyFormat("struct test {\n" 12223 " long long int foo();\n" 12224 " int operator[](int a);\n" 12225 " double bar();\n" 12226 "};\n", 12227 Alignment); 12228 verifyFormat("struct test {\n" 12229 " long long int foo();\n" 12230 " int operator()(int a);\n" 12231 " double bar();\n" 12232 "};\n", 12233 Alignment); 12234 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 12235 " int const i = 1;\n" 12236 " int * j = 2;\n" 12237 " int big = 10000;\n" 12238 "\n" 12239 " unsigned oneTwoThree = 123;\n" 12240 " int oneTwo = 12;\n" 12241 " method();\n" 12242 " float k = 2;\n" 12243 " int ll = 10000;\n" 12244 "}", 12245 format("void SomeFunction(int parameter= 0) {\n" 12246 " int const i= 1;\n" 12247 " int *j=2;\n" 12248 " int big = 10000;\n" 12249 "\n" 12250 "unsigned oneTwoThree =123;\n" 12251 "int oneTwo = 12;\n" 12252 " method();\n" 12253 "float k= 2;\n" 12254 "int ll=10000;\n" 12255 "}", 12256 Alignment)); 12257 Alignment.AlignConsecutiveAssignments = false; 12258 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12259 verifyFormat("#define A \\\n" 12260 " int aaaa = 12; \\\n" 12261 " float b = 23; \\\n" 12262 " const int ccc = 234; \\\n" 12263 " unsigned dddddddddd = 2345;", 12264 Alignment); 12265 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12266 verifyFormat("#define A \\\n" 12267 " int aaaa = 12; \\\n" 12268 " float b = 23; \\\n" 12269 " const int ccc = 234; \\\n" 12270 " unsigned dddddddddd = 2345;", 12271 Alignment); 12272 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12273 Alignment.ColumnLimit = 30; 12274 verifyFormat("#define A \\\n" 12275 " int aaaa = 12; \\\n" 12276 " float b = 23; \\\n" 12277 " const int ccc = 234; \\\n" 12278 " int dddddddddd = 2345;", 12279 Alignment); 12280 Alignment.ColumnLimit = 80; 12281 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12282 "k = 4, int l = 5,\n" 12283 " int m = 6) {\n" 12284 " const int j = 10;\n" 12285 " otherThing = 1;\n" 12286 "}", 12287 Alignment); 12288 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12289 " int const i = 1;\n" 12290 " int * j = 2;\n" 12291 " int big = 10000;\n" 12292 "}", 12293 Alignment); 12294 verifyFormat("class C {\n" 12295 "public:\n" 12296 " int i = 1;\n" 12297 " virtual void f() = 0;\n" 12298 "};", 12299 Alignment); 12300 verifyFormat("float i = 1;\n" 12301 "if (SomeType t = getSomething()) {\n" 12302 "}\n" 12303 "const unsigned j = 2;\n" 12304 "int big = 10000;", 12305 Alignment); 12306 verifyFormat("float j = 7;\n" 12307 "for (int k = 0; k < N; ++k) {\n" 12308 "}\n" 12309 "unsigned j = 2;\n" 12310 "int big = 10000;\n" 12311 "}", 12312 Alignment); 12313 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12314 verifyFormat("float i = 1;\n" 12315 "LooooooooooongType loooooooooooooooooooooongVariable\n" 12316 " = someLooooooooooooooooongFunction();\n" 12317 "int j = 2;", 12318 Alignment); 12319 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 12320 verifyFormat("int i = 1;\n" 12321 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 12322 " someLooooooooooooooooongFunction();\n" 12323 "int j = 2;", 12324 Alignment); 12325 12326 Alignment.AlignConsecutiveAssignments = true; 12327 verifyFormat("auto lambda = []() {\n" 12328 " auto ii = 0;\n" 12329 " float j = 0;\n" 12330 " return 0;\n" 12331 "};\n" 12332 "int i = 0;\n" 12333 "float i2 = 0;\n" 12334 "auto v = type{\n" 12335 " i = 1, //\n" 12336 " (i = 2), //\n" 12337 " i = 3 //\n" 12338 "};", 12339 Alignment); 12340 Alignment.AlignConsecutiveAssignments = false; 12341 12342 verifyFormat( 12343 "int i = 1;\n" 12344 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12345 " loooooooooooooooooooooongParameterB);\n" 12346 "int j = 2;", 12347 Alignment); 12348 12349 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 12350 // We expect declarations and assignments to align, as long as it doesn't 12351 // exceed the column limit, starting a new alignment sequence whenever it 12352 // happens. 12353 Alignment.AlignConsecutiveAssignments = true; 12354 Alignment.ColumnLimit = 30; 12355 verifyFormat("float ii = 1;\n" 12356 "unsigned j = 2;\n" 12357 "int someVerylongVariable = 1;\n" 12358 "AnotherLongType ll = 123456;\n" 12359 "VeryVeryLongType k = 2;\n" 12360 "int myvar = 1;", 12361 Alignment); 12362 Alignment.ColumnLimit = 80; 12363 Alignment.AlignConsecutiveAssignments = false; 12364 12365 verifyFormat( 12366 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 12367 " typename LongType, typename B>\n" 12368 "auto foo() {}\n", 12369 Alignment); 12370 verifyFormat("float a, b = 1;\n" 12371 "int c = 2;\n" 12372 "int dd = 3;\n", 12373 Alignment); 12374 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12375 "float b[1][] = {{3.f}};\n", 12376 Alignment); 12377 Alignment.AlignConsecutiveAssignments = true; 12378 verifyFormat("float a, b = 1;\n" 12379 "int c = 2;\n" 12380 "int dd = 3;\n", 12381 Alignment); 12382 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12383 "float b[1][] = {{3.f}};\n", 12384 Alignment); 12385 Alignment.AlignConsecutiveAssignments = false; 12386 12387 Alignment.ColumnLimit = 30; 12388 Alignment.BinPackParameters = false; 12389 verifyFormat("void foo(float a,\n" 12390 " float b,\n" 12391 " int c,\n" 12392 " uint32_t *d) {\n" 12393 " int * e = 0;\n" 12394 " float f = 0;\n" 12395 " double g = 0;\n" 12396 "}\n" 12397 "void bar(ino_t a,\n" 12398 " int b,\n" 12399 " uint32_t *c,\n" 12400 " bool d) {}\n", 12401 Alignment); 12402 Alignment.BinPackParameters = true; 12403 Alignment.ColumnLimit = 80; 12404 12405 // Bug 33507 12406 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 12407 verifyFormat( 12408 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 12409 " static const Version verVs2017;\n" 12410 " return true;\n" 12411 "});\n", 12412 Alignment); 12413 Alignment.PointerAlignment = FormatStyle::PAS_Right; 12414 12415 // See llvm.org/PR35641 12416 Alignment.AlignConsecutiveDeclarations = true; 12417 verifyFormat("int func() { //\n" 12418 " int b;\n" 12419 " unsigned c;\n" 12420 "}", 12421 Alignment); 12422 12423 // See PR37175 12424 FormatStyle Style = getMozillaStyle(); 12425 Style.AlignConsecutiveDeclarations = true; 12426 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 12427 "foo(int a);", 12428 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 12429 } 12430 12431 TEST_F(FormatTest, LinuxBraceBreaking) { 12432 FormatStyle LinuxBraceStyle = getLLVMStyle(); 12433 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 12434 verifyFormat("namespace a\n" 12435 "{\n" 12436 "class A\n" 12437 "{\n" 12438 " void f()\n" 12439 " {\n" 12440 " if (true) {\n" 12441 " a();\n" 12442 " b();\n" 12443 " } else {\n" 12444 " a();\n" 12445 " }\n" 12446 " }\n" 12447 " void g() { return; }\n" 12448 "};\n" 12449 "struct B {\n" 12450 " int x;\n" 12451 "};\n" 12452 "} // namespace a\n", 12453 LinuxBraceStyle); 12454 verifyFormat("enum X {\n" 12455 " Y = 0,\n" 12456 "}\n", 12457 LinuxBraceStyle); 12458 verifyFormat("struct S {\n" 12459 " int Type;\n" 12460 " union {\n" 12461 " int x;\n" 12462 " double y;\n" 12463 " } Value;\n" 12464 " class C\n" 12465 " {\n" 12466 " MyFavoriteType Value;\n" 12467 " } Class;\n" 12468 "}\n", 12469 LinuxBraceStyle); 12470 } 12471 12472 TEST_F(FormatTest, MozillaBraceBreaking) { 12473 FormatStyle MozillaBraceStyle = getLLVMStyle(); 12474 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 12475 MozillaBraceStyle.FixNamespaceComments = false; 12476 verifyFormat("namespace a {\n" 12477 "class A\n" 12478 "{\n" 12479 " void f()\n" 12480 " {\n" 12481 " if (true) {\n" 12482 " a();\n" 12483 " b();\n" 12484 " }\n" 12485 " }\n" 12486 " void g() { return; }\n" 12487 "};\n" 12488 "enum E\n" 12489 "{\n" 12490 " A,\n" 12491 " // foo\n" 12492 " B,\n" 12493 " C\n" 12494 "};\n" 12495 "struct B\n" 12496 "{\n" 12497 " int x;\n" 12498 "};\n" 12499 "}\n", 12500 MozillaBraceStyle); 12501 verifyFormat("struct S\n" 12502 "{\n" 12503 " int Type;\n" 12504 " union\n" 12505 " {\n" 12506 " int x;\n" 12507 " double y;\n" 12508 " } Value;\n" 12509 " class C\n" 12510 " {\n" 12511 " MyFavoriteType Value;\n" 12512 " } Class;\n" 12513 "}\n", 12514 MozillaBraceStyle); 12515 } 12516 12517 TEST_F(FormatTest, StroustrupBraceBreaking) { 12518 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 12519 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12520 verifyFormat("namespace a {\n" 12521 "class A {\n" 12522 " void f()\n" 12523 " {\n" 12524 " if (true) {\n" 12525 " a();\n" 12526 " b();\n" 12527 " }\n" 12528 " }\n" 12529 " void g() { return; }\n" 12530 "};\n" 12531 "struct B {\n" 12532 " int x;\n" 12533 "};\n" 12534 "} // namespace a\n", 12535 StroustrupBraceStyle); 12536 12537 verifyFormat("void foo()\n" 12538 "{\n" 12539 " if (a) {\n" 12540 " a();\n" 12541 " }\n" 12542 " else {\n" 12543 " b();\n" 12544 " }\n" 12545 "}\n", 12546 StroustrupBraceStyle); 12547 12548 verifyFormat("#ifdef _DEBUG\n" 12549 "int foo(int i = 0)\n" 12550 "#else\n" 12551 "int foo(int i = 5)\n" 12552 "#endif\n" 12553 "{\n" 12554 " return i;\n" 12555 "}", 12556 StroustrupBraceStyle); 12557 12558 verifyFormat("void foo() {}\n" 12559 "void bar()\n" 12560 "#ifdef _DEBUG\n" 12561 "{\n" 12562 " foo();\n" 12563 "}\n" 12564 "#else\n" 12565 "{\n" 12566 "}\n" 12567 "#endif", 12568 StroustrupBraceStyle); 12569 12570 verifyFormat("void foobar() { int i = 5; }\n" 12571 "#ifdef _DEBUG\n" 12572 "void bar() {}\n" 12573 "#else\n" 12574 "void bar() { foobar(); }\n" 12575 "#endif", 12576 StroustrupBraceStyle); 12577 } 12578 12579 TEST_F(FormatTest, AllmanBraceBreaking) { 12580 FormatStyle AllmanBraceStyle = getLLVMStyle(); 12581 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 12582 12583 EXPECT_EQ("namespace a\n" 12584 "{\n" 12585 "void f();\n" 12586 "void g();\n" 12587 "} // namespace a\n", 12588 format("namespace a\n" 12589 "{\n" 12590 "void f();\n" 12591 "void g();\n" 12592 "}\n", 12593 AllmanBraceStyle)); 12594 12595 verifyFormat("namespace a\n" 12596 "{\n" 12597 "class A\n" 12598 "{\n" 12599 " void f()\n" 12600 " {\n" 12601 " if (true)\n" 12602 " {\n" 12603 " a();\n" 12604 " b();\n" 12605 " }\n" 12606 " }\n" 12607 " void g() { return; }\n" 12608 "};\n" 12609 "struct B\n" 12610 "{\n" 12611 " int x;\n" 12612 "};\n" 12613 "union C\n" 12614 "{\n" 12615 "};\n" 12616 "} // namespace a", 12617 AllmanBraceStyle); 12618 12619 verifyFormat("void f()\n" 12620 "{\n" 12621 " if (true)\n" 12622 " {\n" 12623 " a();\n" 12624 " }\n" 12625 " else if (false)\n" 12626 " {\n" 12627 " b();\n" 12628 " }\n" 12629 " else\n" 12630 " {\n" 12631 " c();\n" 12632 " }\n" 12633 "}\n", 12634 AllmanBraceStyle); 12635 12636 verifyFormat("void f()\n" 12637 "{\n" 12638 " for (int i = 0; i < 10; ++i)\n" 12639 " {\n" 12640 " a();\n" 12641 " }\n" 12642 " while (false)\n" 12643 " {\n" 12644 " b();\n" 12645 " }\n" 12646 " do\n" 12647 " {\n" 12648 " c();\n" 12649 " } while (false)\n" 12650 "}\n", 12651 AllmanBraceStyle); 12652 12653 verifyFormat("void f(int a)\n" 12654 "{\n" 12655 " switch (a)\n" 12656 " {\n" 12657 " case 0:\n" 12658 " break;\n" 12659 " case 1:\n" 12660 " {\n" 12661 " break;\n" 12662 " }\n" 12663 " case 2:\n" 12664 " {\n" 12665 " }\n" 12666 " break;\n" 12667 " default:\n" 12668 " break;\n" 12669 " }\n" 12670 "}\n", 12671 AllmanBraceStyle); 12672 12673 verifyFormat("enum X\n" 12674 "{\n" 12675 " Y = 0,\n" 12676 "}\n", 12677 AllmanBraceStyle); 12678 verifyFormat("enum X\n" 12679 "{\n" 12680 " Y = 0\n" 12681 "}\n", 12682 AllmanBraceStyle); 12683 12684 verifyFormat("@interface BSApplicationController ()\n" 12685 "{\n" 12686 "@private\n" 12687 " id _extraIvar;\n" 12688 "}\n" 12689 "@end\n", 12690 AllmanBraceStyle); 12691 12692 verifyFormat("#ifdef _DEBUG\n" 12693 "int foo(int i = 0)\n" 12694 "#else\n" 12695 "int foo(int i = 5)\n" 12696 "#endif\n" 12697 "{\n" 12698 " return i;\n" 12699 "}", 12700 AllmanBraceStyle); 12701 12702 verifyFormat("void foo() {}\n" 12703 "void bar()\n" 12704 "#ifdef _DEBUG\n" 12705 "{\n" 12706 " foo();\n" 12707 "}\n" 12708 "#else\n" 12709 "{\n" 12710 "}\n" 12711 "#endif", 12712 AllmanBraceStyle); 12713 12714 verifyFormat("void foobar() { int i = 5; }\n" 12715 "#ifdef _DEBUG\n" 12716 "void bar() {}\n" 12717 "#else\n" 12718 "void bar() { foobar(); }\n" 12719 "#endif", 12720 AllmanBraceStyle); 12721 12722 // This shouldn't affect ObjC blocks.. 12723 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 12724 " // ...\n" 12725 " int i;\n" 12726 "}];", 12727 AllmanBraceStyle); 12728 verifyFormat("void (^block)(void) = ^{\n" 12729 " // ...\n" 12730 " int i;\n" 12731 "};", 12732 AllmanBraceStyle); 12733 // .. or dict literals. 12734 verifyFormat("void f()\n" 12735 "{\n" 12736 " // ...\n" 12737 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 12738 "}", 12739 AllmanBraceStyle); 12740 verifyFormat("void f()\n" 12741 "{\n" 12742 " // ...\n" 12743 " [object someMethod:@{a : @\"b\"}];\n" 12744 "}", 12745 AllmanBraceStyle); 12746 verifyFormat("int f()\n" 12747 "{ // comment\n" 12748 " return 42;\n" 12749 "}", 12750 AllmanBraceStyle); 12751 12752 AllmanBraceStyle.ColumnLimit = 19; 12753 verifyFormat("void f() { int i; }", AllmanBraceStyle); 12754 AllmanBraceStyle.ColumnLimit = 18; 12755 verifyFormat("void f()\n" 12756 "{\n" 12757 " int i;\n" 12758 "}", 12759 AllmanBraceStyle); 12760 AllmanBraceStyle.ColumnLimit = 80; 12761 12762 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 12763 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 12764 FormatStyle::SIS_WithoutElse; 12765 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 12766 verifyFormat("void f(bool b)\n" 12767 "{\n" 12768 " if (b)\n" 12769 " {\n" 12770 " return;\n" 12771 " }\n" 12772 "}\n", 12773 BreakBeforeBraceShortIfs); 12774 verifyFormat("void f(bool b)\n" 12775 "{\n" 12776 " if constexpr (b)\n" 12777 " {\n" 12778 " return;\n" 12779 " }\n" 12780 "}\n", 12781 BreakBeforeBraceShortIfs); 12782 verifyFormat("void f(bool b)\n" 12783 "{\n" 12784 " if CONSTEXPR (b)\n" 12785 " {\n" 12786 " return;\n" 12787 " }\n" 12788 "}\n", 12789 BreakBeforeBraceShortIfs); 12790 verifyFormat("void f(bool b)\n" 12791 "{\n" 12792 " if (b) return;\n" 12793 "}\n", 12794 BreakBeforeBraceShortIfs); 12795 verifyFormat("void f(bool b)\n" 12796 "{\n" 12797 " if constexpr (b) return;\n" 12798 "}\n", 12799 BreakBeforeBraceShortIfs); 12800 verifyFormat("void f(bool b)\n" 12801 "{\n" 12802 " if CONSTEXPR (b) return;\n" 12803 "}\n", 12804 BreakBeforeBraceShortIfs); 12805 verifyFormat("void f(bool b)\n" 12806 "{\n" 12807 " while (b)\n" 12808 " {\n" 12809 " return;\n" 12810 " }\n" 12811 "}\n", 12812 BreakBeforeBraceShortIfs); 12813 } 12814 12815 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 12816 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 12817 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 12818 12819 // Make a few changes to the style for testing purposes 12820 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 12821 FormatStyle::SFS_Empty; 12822 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 12823 WhitesmithsBraceStyle.ColumnLimit = 0; 12824 12825 // FIXME: this test case can't decide whether there should be a blank line 12826 // after the ~D() line or not. It adds one if one doesn't exist in the test 12827 // and it removes the line if one exists. 12828 /* 12829 verifyFormat("class A;\n" 12830 "namespace B\n" 12831 " {\n" 12832 "class C;\n" 12833 "// Comment\n" 12834 "class D\n" 12835 " {\n" 12836 "public:\n" 12837 " D();\n" 12838 " ~D() {}\n" 12839 "private:\n" 12840 " enum E\n" 12841 " {\n" 12842 " F\n" 12843 " }\n" 12844 " };\n" 12845 " } // namespace B\n", 12846 WhitesmithsBraceStyle); 12847 */ 12848 12849 verifyFormat("namespace a\n" 12850 " {\n" 12851 "class A\n" 12852 " {\n" 12853 " void f()\n" 12854 " {\n" 12855 " if (true)\n" 12856 " {\n" 12857 " a();\n" 12858 " b();\n" 12859 " }\n" 12860 " }\n" 12861 " void g()\n" 12862 " {\n" 12863 " return;\n" 12864 " }\n" 12865 " };\n" 12866 "struct B\n" 12867 " {\n" 12868 " int x;\n" 12869 " };\n" 12870 " } // namespace a", 12871 WhitesmithsBraceStyle); 12872 12873 verifyFormat("void f()\n" 12874 " {\n" 12875 " if (true)\n" 12876 " {\n" 12877 " a();\n" 12878 " }\n" 12879 " else if (false)\n" 12880 " {\n" 12881 " b();\n" 12882 " }\n" 12883 " else\n" 12884 " {\n" 12885 " c();\n" 12886 " }\n" 12887 " }\n", 12888 WhitesmithsBraceStyle); 12889 12890 verifyFormat("void f()\n" 12891 " {\n" 12892 " for (int i = 0; i < 10; ++i)\n" 12893 " {\n" 12894 " a();\n" 12895 " }\n" 12896 " while (false)\n" 12897 " {\n" 12898 " b();\n" 12899 " }\n" 12900 " do\n" 12901 " {\n" 12902 " c();\n" 12903 " } while (false)\n" 12904 " }\n", 12905 WhitesmithsBraceStyle); 12906 12907 // FIXME: the block and the break under case 2 in this test don't get indented 12908 // correctly 12909 /* 12910 verifyFormat("void switchTest1(int a)\n" 12911 " {\n" 12912 " switch (a)\n" 12913 " {\n" 12914 " case 2:\n" 12915 " {\n" 12916 " }\n" 12917 " break;\n" 12918 " }\n" 12919 " }\n", 12920 WhitesmithsBraceStyle); 12921 */ 12922 12923 // FIXME: the block and the break under case 2 in this test don't get indented 12924 // correctly 12925 /* 12926 verifyFormat("void switchTest2(int a)\n" 12927 " {\n" 12928 " switch (a)\n" 12929 " {\n" 12930 " case 0:\n" 12931 " break;\n" 12932 " case 1:\n" 12933 " {\n" 12934 " break;\n" 12935 " }\n" 12936 " case 2:\n" 12937 " {\n" 12938 " }\n" 12939 " break;\n" 12940 " default:\n" 12941 " break;\n" 12942 " }\n" 12943 " }\n", 12944 WhitesmithsBraceStyle); 12945 */ 12946 12947 verifyFormat("enum X\n" 12948 " {\n" 12949 " Y = 0, // testing\n" 12950 " }\n", 12951 WhitesmithsBraceStyle); 12952 12953 verifyFormat("enum X\n" 12954 " {\n" 12955 " Y = 0\n" 12956 " }\n", 12957 WhitesmithsBraceStyle); 12958 verifyFormat("enum X\n" 12959 " {\n" 12960 " Y = 0,\n" 12961 " Z = 1\n" 12962 " };\n", 12963 WhitesmithsBraceStyle); 12964 12965 verifyFormat("@interface BSApplicationController ()\n" 12966 " {\n" 12967 "@private\n" 12968 " id _extraIvar;\n" 12969 " }\n" 12970 "@end\n", 12971 WhitesmithsBraceStyle); 12972 12973 verifyFormat("#ifdef _DEBUG\n" 12974 "int foo(int i = 0)\n" 12975 "#else\n" 12976 "int foo(int i = 5)\n" 12977 "#endif\n" 12978 " {\n" 12979 " return i;\n" 12980 " }", 12981 WhitesmithsBraceStyle); 12982 12983 verifyFormat("void foo() {}\n" 12984 "void bar()\n" 12985 "#ifdef _DEBUG\n" 12986 " {\n" 12987 " foo();\n" 12988 " }\n" 12989 "#else\n" 12990 " {\n" 12991 " }\n" 12992 "#endif", 12993 WhitesmithsBraceStyle); 12994 12995 verifyFormat("void foobar()\n" 12996 " {\n" 12997 " int i = 5;\n" 12998 " }\n" 12999 "#ifdef _DEBUG\n" 13000 "void bar()\n" 13001 " {\n" 13002 " }\n" 13003 "#else\n" 13004 "void bar()\n" 13005 " {\n" 13006 " foobar();\n" 13007 " }\n" 13008 "#endif", 13009 WhitesmithsBraceStyle); 13010 13011 // This shouldn't affect ObjC blocks.. 13012 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 13013 " // ...\n" 13014 " int i;\n" 13015 "}];", 13016 WhitesmithsBraceStyle); 13017 verifyFormat("void (^block)(void) = ^{\n" 13018 " // ...\n" 13019 " int i;\n" 13020 "};", 13021 WhitesmithsBraceStyle); 13022 // .. or dict literals. 13023 verifyFormat("void f()\n" 13024 " {\n" 13025 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 13026 " }", 13027 WhitesmithsBraceStyle); 13028 13029 verifyFormat("int f()\n" 13030 " { // comment\n" 13031 " return 42;\n" 13032 " }", 13033 WhitesmithsBraceStyle); 13034 13035 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 13036 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 13037 FormatStyle::SIS_Always; 13038 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 13039 verifyFormat("void f(bool b)\n" 13040 " {\n" 13041 " if (b)\n" 13042 " {\n" 13043 " return;\n" 13044 " }\n" 13045 " }\n", 13046 BreakBeforeBraceShortIfs); 13047 verifyFormat("void f(bool b)\n" 13048 " {\n" 13049 " if (b) return;\n" 13050 " }\n", 13051 BreakBeforeBraceShortIfs); 13052 verifyFormat("void f(bool b)\n" 13053 " {\n" 13054 " while (b)\n" 13055 " {\n" 13056 " return;\n" 13057 " }\n" 13058 " }\n", 13059 BreakBeforeBraceShortIfs); 13060 } 13061 13062 TEST_F(FormatTest, GNUBraceBreaking) { 13063 FormatStyle GNUBraceStyle = getLLVMStyle(); 13064 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 13065 verifyFormat("namespace a\n" 13066 "{\n" 13067 "class A\n" 13068 "{\n" 13069 " void f()\n" 13070 " {\n" 13071 " int a;\n" 13072 " {\n" 13073 " int b;\n" 13074 " }\n" 13075 " if (true)\n" 13076 " {\n" 13077 " a();\n" 13078 " b();\n" 13079 " }\n" 13080 " }\n" 13081 " void g() { return; }\n" 13082 "}\n" 13083 "} // namespace a", 13084 GNUBraceStyle); 13085 13086 verifyFormat("void f()\n" 13087 "{\n" 13088 " if (true)\n" 13089 " {\n" 13090 " a();\n" 13091 " }\n" 13092 " else if (false)\n" 13093 " {\n" 13094 " b();\n" 13095 " }\n" 13096 " else\n" 13097 " {\n" 13098 " c();\n" 13099 " }\n" 13100 "}\n", 13101 GNUBraceStyle); 13102 13103 verifyFormat("void f()\n" 13104 "{\n" 13105 " for (int i = 0; i < 10; ++i)\n" 13106 " {\n" 13107 " a();\n" 13108 " }\n" 13109 " while (false)\n" 13110 " {\n" 13111 " b();\n" 13112 " }\n" 13113 " do\n" 13114 " {\n" 13115 " c();\n" 13116 " }\n" 13117 " while (false);\n" 13118 "}\n", 13119 GNUBraceStyle); 13120 13121 verifyFormat("void f(int a)\n" 13122 "{\n" 13123 " switch (a)\n" 13124 " {\n" 13125 " case 0:\n" 13126 " break;\n" 13127 " case 1:\n" 13128 " {\n" 13129 " break;\n" 13130 " }\n" 13131 " case 2:\n" 13132 " {\n" 13133 " }\n" 13134 " break;\n" 13135 " default:\n" 13136 " break;\n" 13137 " }\n" 13138 "}\n", 13139 GNUBraceStyle); 13140 13141 verifyFormat("enum X\n" 13142 "{\n" 13143 " Y = 0,\n" 13144 "}\n", 13145 GNUBraceStyle); 13146 13147 verifyFormat("@interface BSApplicationController ()\n" 13148 "{\n" 13149 "@private\n" 13150 " id _extraIvar;\n" 13151 "}\n" 13152 "@end\n", 13153 GNUBraceStyle); 13154 13155 verifyFormat("#ifdef _DEBUG\n" 13156 "int foo(int i = 0)\n" 13157 "#else\n" 13158 "int foo(int i = 5)\n" 13159 "#endif\n" 13160 "{\n" 13161 " return i;\n" 13162 "}", 13163 GNUBraceStyle); 13164 13165 verifyFormat("void foo() {}\n" 13166 "void bar()\n" 13167 "#ifdef _DEBUG\n" 13168 "{\n" 13169 " foo();\n" 13170 "}\n" 13171 "#else\n" 13172 "{\n" 13173 "}\n" 13174 "#endif", 13175 GNUBraceStyle); 13176 13177 verifyFormat("void foobar() { int i = 5; }\n" 13178 "#ifdef _DEBUG\n" 13179 "void bar() {}\n" 13180 "#else\n" 13181 "void bar() { foobar(); }\n" 13182 "#endif", 13183 GNUBraceStyle); 13184 } 13185 13186 TEST_F(FormatTest, WebKitBraceBreaking) { 13187 FormatStyle WebKitBraceStyle = getLLVMStyle(); 13188 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 13189 WebKitBraceStyle.FixNamespaceComments = false; 13190 verifyFormat("namespace a {\n" 13191 "class A {\n" 13192 " void f()\n" 13193 " {\n" 13194 " if (true) {\n" 13195 " a();\n" 13196 " b();\n" 13197 " }\n" 13198 " }\n" 13199 " void g() { return; }\n" 13200 "};\n" 13201 "enum E {\n" 13202 " A,\n" 13203 " // foo\n" 13204 " B,\n" 13205 " C\n" 13206 "};\n" 13207 "struct B {\n" 13208 " int x;\n" 13209 "};\n" 13210 "}\n", 13211 WebKitBraceStyle); 13212 verifyFormat("struct S {\n" 13213 " int Type;\n" 13214 " union {\n" 13215 " int x;\n" 13216 " double y;\n" 13217 " } Value;\n" 13218 " class C {\n" 13219 " MyFavoriteType Value;\n" 13220 " } Class;\n" 13221 "};\n", 13222 WebKitBraceStyle); 13223 } 13224 13225 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 13226 verifyFormat("void f() {\n" 13227 " try {\n" 13228 " } catch (const Exception &e) {\n" 13229 " }\n" 13230 "}\n", 13231 getLLVMStyle()); 13232 } 13233 13234 TEST_F(FormatTest, UnderstandsPragmas) { 13235 verifyFormat("#pragma omp reduction(| : var)"); 13236 verifyFormat("#pragma omp reduction(+ : var)"); 13237 13238 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 13239 "(including parentheses).", 13240 format("#pragma mark Any non-hyphenated or hyphenated string " 13241 "(including parentheses).")); 13242 } 13243 13244 TEST_F(FormatTest, UnderstandPragmaOption) { 13245 verifyFormat("#pragma option -C -A"); 13246 13247 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 13248 } 13249 13250 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 13251 FormatStyle Style = getLLVMStyle(); 13252 Style.ColumnLimit = 20; 13253 13254 // See PR41213 13255 EXPECT_EQ("/*\n" 13256 " *\t9012345\n" 13257 " * /8901\n" 13258 " */", 13259 format("/*\n" 13260 " *\t9012345 /8901\n" 13261 " */", 13262 Style)); 13263 EXPECT_EQ("/*\n" 13264 " *345678\n" 13265 " *\t/8901\n" 13266 " */", 13267 format("/*\n" 13268 " *345678\t/8901\n" 13269 " */", 13270 Style)); 13271 13272 verifyFormat("int a; // the\n" 13273 " // comment", 13274 Style); 13275 EXPECT_EQ("int a; /* first line\n" 13276 " * second\n" 13277 " * line third\n" 13278 " * line\n" 13279 " */", 13280 format("int a; /* first line\n" 13281 " * second\n" 13282 " * line third\n" 13283 " * line\n" 13284 " */", 13285 Style)); 13286 EXPECT_EQ("int a; // first line\n" 13287 " // second\n" 13288 " // line third\n" 13289 " // line", 13290 format("int a; // first line\n" 13291 " // second line\n" 13292 " // third line", 13293 Style)); 13294 13295 Style.PenaltyExcessCharacter = 90; 13296 verifyFormat("int a; // the comment", Style); 13297 EXPECT_EQ("int a; // the comment\n" 13298 " // aaa", 13299 format("int a; // the comment aaa", Style)); 13300 EXPECT_EQ("int a; /* first line\n" 13301 " * second line\n" 13302 " * third line\n" 13303 " */", 13304 format("int a; /* first line\n" 13305 " * second line\n" 13306 " * third line\n" 13307 " */", 13308 Style)); 13309 EXPECT_EQ("int a; // first line\n" 13310 " // second line\n" 13311 " // third line", 13312 format("int a; // first line\n" 13313 " // second line\n" 13314 " // third line", 13315 Style)); 13316 // FIXME: Investigate why this is not getting the same layout as the test 13317 // above. 13318 EXPECT_EQ("int a; /* first line\n" 13319 " * second line\n" 13320 " * third line\n" 13321 " */", 13322 format("int a; /* first line second line third line" 13323 "\n*/", 13324 Style)); 13325 13326 EXPECT_EQ("// foo bar baz bazfoo\n" 13327 "// foo bar foo bar\n", 13328 format("// foo bar baz bazfoo\n" 13329 "// foo bar foo bar\n", 13330 Style)); 13331 EXPECT_EQ("// foo bar baz bazfoo\n" 13332 "// foo bar foo bar\n", 13333 format("// foo bar baz bazfoo\n" 13334 "// foo bar foo bar\n", 13335 Style)); 13336 13337 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 13338 // next one. 13339 EXPECT_EQ("// foo bar baz bazfoo\n" 13340 "// bar foo bar\n", 13341 format("// foo bar baz bazfoo bar\n" 13342 "// foo bar\n", 13343 Style)); 13344 13345 EXPECT_EQ("// foo bar baz bazfoo\n" 13346 "// foo bar baz bazfoo\n" 13347 "// bar foo bar\n", 13348 format("// foo bar baz bazfoo\n" 13349 "// foo bar baz bazfoo bar\n" 13350 "// foo bar\n", 13351 Style)); 13352 13353 EXPECT_EQ("// foo bar baz bazfoo\n" 13354 "// foo bar baz bazfoo\n" 13355 "// bar foo bar\n", 13356 format("// foo bar baz bazfoo\n" 13357 "// foo bar baz bazfoo bar\n" 13358 "// foo bar\n", 13359 Style)); 13360 13361 // Make sure we do not keep protruding characters if strict mode reflow is 13362 // cheaper than keeping protruding characters. 13363 Style.ColumnLimit = 21; 13364 EXPECT_EQ( 13365 "// foo foo foo foo\n" 13366 "// foo foo foo foo\n" 13367 "// foo foo foo foo\n", 13368 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 13369 13370 EXPECT_EQ("int a = /* long block\n" 13371 " comment */\n" 13372 " 42;", 13373 format("int a = /* long block comment */ 42;", Style)); 13374 } 13375 13376 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 13377 for (size_t i = 1; i < Styles.size(); ++i) \ 13378 EXPECT_EQ(Styles[0], Styles[i]) \ 13379 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 13380 13381 TEST_F(FormatTest, GetsPredefinedStyleByName) { 13382 SmallVector<FormatStyle, 3> Styles; 13383 Styles.resize(3); 13384 13385 Styles[0] = getLLVMStyle(); 13386 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 13387 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 13388 EXPECT_ALL_STYLES_EQUAL(Styles); 13389 13390 Styles[0] = getGoogleStyle(); 13391 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 13392 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 13393 EXPECT_ALL_STYLES_EQUAL(Styles); 13394 13395 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 13396 EXPECT_TRUE( 13397 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 13398 EXPECT_TRUE( 13399 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 13400 EXPECT_ALL_STYLES_EQUAL(Styles); 13401 13402 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 13403 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 13404 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 13405 EXPECT_ALL_STYLES_EQUAL(Styles); 13406 13407 Styles[0] = getMozillaStyle(); 13408 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 13409 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 13410 EXPECT_ALL_STYLES_EQUAL(Styles); 13411 13412 Styles[0] = getWebKitStyle(); 13413 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 13414 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 13415 EXPECT_ALL_STYLES_EQUAL(Styles); 13416 13417 Styles[0] = getGNUStyle(); 13418 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 13419 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 13420 EXPECT_ALL_STYLES_EQUAL(Styles); 13421 13422 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 13423 } 13424 13425 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 13426 SmallVector<FormatStyle, 8> Styles; 13427 Styles.resize(2); 13428 13429 Styles[0] = getGoogleStyle(); 13430 Styles[1] = getLLVMStyle(); 13431 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 13432 EXPECT_ALL_STYLES_EQUAL(Styles); 13433 13434 Styles.resize(5); 13435 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 13436 Styles[1] = getLLVMStyle(); 13437 Styles[1].Language = FormatStyle::LK_JavaScript; 13438 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 13439 13440 Styles[2] = getLLVMStyle(); 13441 Styles[2].Language = FormatStyle::LK_JavaScript; 13442 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 13443 "BasedOnStyle: Google", 13444 &Styles[2]) 13445 .value()); 13446 13447 Styles[3] = getLLVMStyle(); 13448 Styles[3].Language = FormatStyle::LK_JavaScript; 13449 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 13450 "Language: JavaScript", 13451 &Styles[3]) 13452 .value()); 13453 13454 Styles[4] = getLLVMStyle(); 13455 Styles[4].Language = FormatStyle::LK_JavaScript; 13456 EXPECT_EQ(0, parseConfiguration("---\n" 13457 "BasedOnStyle: LLVM\n" 13458 "IndentWidth: 123\n" 13459 "---\n" 13460 "BasedOnStyle: Google\n" 13461 "Language: JavaScript", 13462 &Styles[4]) 13463 .value()); 13464 EXPECT_ALL_STYLES_EQUAL(Styles); 13465 } 13466 13467 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 13468 Style.FIELD = false; \ 13469 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 13470 EXPECT_TRUE(Style.FIELD); \ 13471 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 13472 EXPECT_FALSE(Style.FIELD); 13473 13474 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 13475 13476 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 13477 Style.STRUCT.FIELD = false; \ 13478 EXPECT_EQ(0, \ 13479 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 13480 .value()); \ 13481 EXPECT_TRUE(Style.STRUCT.FIELD); \ 13482 EXPECT_EQ(0, \ 13483 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 13484 .value()); \ 13485 EXPECT_FALSE(Style.STRUCT.FIELD); 13486 13487 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 13488 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 13489 13490 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 13491 EXPECT_NE(VALUE, Style.FIELD); \ 13492 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 13493 EXPECT_EQ(VALUE, Style.FIELD) 13494 13495 TEST_F(FormatTest, ParsesConfigurationBools) { 13496 FormatStyle Style = {}; 13497 Style.Language = FormatStyle::LK_Cpp; 13498 CHECK_PARSE_BOOL(AlignTrailingComments); 13499 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 13500 CHECK_PARSE_BOOL(AlignConsecutiveBitFields); 13501 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 13502 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 13503 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 13504 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 13505 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 13506 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 13507 CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine); 13508 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 13509 CHECK_PARSE_BOOL(BinPackArguments); 13510 CHECK_PARSE_BOOL(BinPackParameters); 13511 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 13512 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 13513 CHECK_PARSE_BOOL(BreakStringLiterals); 13514 CHECK_PARSE_BOOL(CompactNamespaces); 13515 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 13516 CHECK_PARSE_BOOL(DeriveLineEnding); 13517 CHECK_PARSE_BOOL(DerivePointerAlignment); 13518 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 13519 CHECK_PARSE_BOOL(DisableFormat); 13520 CHECK_PARSE_BOOL(IndentCaseLabels); 13521 CHECK_PARSE_BOOL(IndentCaseBlocks); 13522 CHECK_PARSE_BOOL(IndentGotoLabels); 13523 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 13524 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 13525 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 13526 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 13527 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 13528 CHECK_PARSE_BOOL(ReflowComments); 13529 CHECK_PARSE_BOOL(SortIncludes); 13530 CHECK_PARSE_BOOL(SortUsingDeclarations); 13531 CHECK_PARSE_BOOL(SpacesInParentheses); 13532 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 13533 CHECK_PARSE_BOOL(SpacesInAngles); 13534 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 13535 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 13536 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 13537 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 13538 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 13539 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 13540 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 13541 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 13542 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 13543 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 13544 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 13545 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 13546 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 13547 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 13548 CHECK_PARSE_BOOL(UseCRLF); 13549 13550 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 13551 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 13552 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 13553 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 13554 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 13555 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 13556 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 13557 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 13558 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 13559 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 13560 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 13561 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody); 13562 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile); 13563 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 13564 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 13565 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 13566 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 13567 } 13568 13569 #undef CHECK_PARSE_BOOL 13570 13571 TEST_F(FormatTest, ParsesConfiguration) { 13572 FormatStyle Style = {}; 13573 Style.Language = FormatStyle::LK_Cpp; 13574 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 13575 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 13576 ConstructorInitializerIndentWidth, 1234u); 13577 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 13578 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 13579 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 13580 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 13581 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 13582 PenaltyBreakBeforeFirstCallParameter, 1234u); 13583 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 13584 PenaltyBreakTemplateDeclaration, 1234u); 13585 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 13586 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 13587 PenaltyReturnTypeOnItsOwnLine, 1234u); 13588 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 13589 SpacesBeforeTrailingComments, 1234u); 13590 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 13591 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 13592 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 13593 13594 Style.PointerAlignment = FormatStyle::PAS_Middle; 13595 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 13596 FormatStyle::PAS_Left); 13597 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 13598 FormatStyle::PAS_Right); 13599 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 13600 FormatStyle::PAS_Middle); 13601 // For backward compatibility: 13602 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 13603 FormatStyle::PAS_Left); 13604 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 13605 FormatStyle::PAS_Right); 13606 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 13607 FormatStyle::PAS_Middle); 13608 13609 Style.Standard = FormatStyle::LS_Auto; 13610 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 13611 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 13612 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 13613 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 13614 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 13615 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 13616 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 13617 // Legacy aliases: 13618 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 13619 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 13620 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 13621 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 13622 13623 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 13624 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 13625 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 13626 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 13627 FormatStyle::BOS_None); 13628 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 13629 FormatStyle::BOS_All); 13630 // For backward compatibility: 13631 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 13632 FormatStyle::BOS_None); 13633 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 13634 FormatStyle::BOS_All); 13635 13636 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 13637 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 13638 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 13639 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 13640 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 13641 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 13642 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 13643 // For backward compatibility: 13644 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 13645 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 13646 13647 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 13648 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 13649 FormatStyle::BILS_BeforeComma); 13650 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 13651 FormatStyle::BILS_AfterColon); 13652 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 13653 FormatStyle::BILS_BeforeColon); 13654 // For backward compatibility: 13655 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 13656 FormatStyle::BILS_BeforeComma); 13657 13658 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13659 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 13660 FormatStyle::BAS_Align); 13661 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 13662 FormatStyle::BAS_DontAlign); 13663 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 13664 FormatStyle::BAS_AlwaysBreak); 13665 // For backward compatibility: 13666 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 13667 FormatStyle::BAS_DontAlign); 13668 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 13669 FormatStyle::BAS_Align); 13670 13671 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 13672 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 13673 FormatStyle::ENAS_DontAlign); 13674 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 13675 FormatStyle::ENAS_Left); 13676 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 13677 FormatStyle::ENAS_Right); 13678 // For backward compatibility: 13679 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 13680 FormatStyle::ENAS_Left); 13681 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 13682 FormatStyle::ENAS_Right); 13683 13684 Style.AlignOperands = FormatStyle::OAS_Align; 13685 CHECK_PARSE("AlignOperands: DontAlign", AlignOperands, 13686 FormatStyle::OAS_DontAlign); 13687 CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align); 13688 CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands, 13689 FormatStyle::OAS_AlignAfterOperator); 13690 // For backward compatibility: 13691 CHECK_PARSE("AlignOperands: false", AlignOperands, 13692 FormatStyle::OAS_DontAlign); 13693 CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align); 13694 13695 Style.UseTab = FormatStyle::UT_ForIndentation; 13696 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 13697 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 13698 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 13699 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 13700 FormatStyle::UT_ForContinuationAndIndentation); 13701 CHECK_PARSE("UseTab: AlignWithSpaces", UseTab, 13702 FormatStyle::UT_AlignWithSpaces); 13703 // For backward compatibility: 13704 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 13705 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 13706 13707 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 13708 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 13709 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 13710 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 13711 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 13712 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 13713 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 13714 // For backward compatibility: 13715 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 13716 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 13717 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 13718 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 13719 13720 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 13721 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 13722 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 13723 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 13724 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 13725 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 13726 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 13727 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 13728 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 13729 // For backward compatibility: 13730 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 13731 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 13732 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 13733 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 13734 13735 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 13736 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 13737 FormatStyle::SBPO_Never); 13738 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 13739 FormatStyle::SBPO_Always); 13740 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 13741 FormatStyle::SBPO_ControlStatements); 13742 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 13743 FormatStyle::SBPO_NonEmptyParentheses); 13744 // For backward compatibility: 13745 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 13746 FormatStyle::SBPO_Never); 13747 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 13748 FormatStyle::SBPO_ControlStatements); 13749 13750 Style.ColumnLimit = 123; 13751 FormatStyle BaseStyle = getLLVMStyle(); 13752 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 13753 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 13754 13755 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 13756 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 13757 FormatStyle::BS_Attach); 13758 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 13759 FormatStyle::BS_Linux); 13760 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 13761 FormatStyle::BS_Mozilla); 13762 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 13763 FormatStyle::BS_Stroustrup); 13764 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 13765 FormatStyle::BS_Allman); 13766 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 13767 FormatStyle::BS_Whitesmiths); 13768 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 13769 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 13770 FormatStyle::BS_WebKit); 13771 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 13772 FormatStyle::BS_Custom); 13773 13774 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 13775 CHECK_PARSE("BraceWrapping:\n" 13776 " AfterControlStatement: MultiLine", 13777 BraceWrapping.AfterControlStatement, 13778 FormatStyle::BWACS_MultiLine); 13779 CHECK_PARSE("BraceWrapping:\n" 13780 " AfterControlStatement: Always", 13781 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 13782 CHECK_PARSE("BraceWrapping:\n" 13783 " AfterControlStatement: Never", 13784 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 13785 // For backward compatibility: 13786 CHECK_PARSE("BraceWrapping:\n" 13787 " AfterControlStatement: true", 13788 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 13789 CHECK_PARSE("BraceWrapping:\n" 13790 " AfterControlStatement: false", 13791 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 13792 13793 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 13794 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 13795 FormatStyle::RTBS_None); 13796 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 13797 FormatStyle::RTBS_All); 13798 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 13799 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 13800 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 13801 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 13802 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 13803 AlwaysBreakAfterReturnType, 13804 FormatStyle::RTBS_TopLevelDefinitions); 13805 13806 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 13807 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 13808 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 13809 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 13810 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 13811 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 13812 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 13813 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 13814 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 13815 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 13816 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 13817 13818 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 13819 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 13820 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 13821 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 13822 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 13823 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 13824 AlwaysBreakAfterDefinitionReturnType, 13825 FormatStyle::DRTBS_TopLevel); 13826 13827 Style.NamespaceIndentation = FormatStyle::NI_All; 13828 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 13829 FormatStyle::NI_None); 13830 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 13831 FormatStyle::NI_Inner); 13832 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 13833 FormatStyle::NI_All); 13834 13835 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 13836 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 13837 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 13838 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 13839 AllowShortIfStatementsOnASingleLine, 13840 FormatStyle::SIS_WithoutElse); 13841 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 13842 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 13843 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 13844 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 13845 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 13846 AllowShortIfStatementsOnASingleLine, 13847 FormatStyle::SIS_WithoutElse); 13848 13849 // FIXME: This is required because parsing a configuration simply overwrites 13850 // the first N elements of the list instead of resetting it. 13851 Style.ForEachMacros.clear(); 13852 std::vector<std::string> BoostForeach; 13853 BoostForeach.push_back("BOOST_FOREACH"); 13854 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 13855 std::vector<std::string> BoostAndQForeach; 13856 BoostAndQForeach.push_back("BOOST_FOREACH"); 13857 BoostAndQForeach.push_back("Q_FOREACH"); 13858 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 13859 BoostAndQForeach); 13860 13861 Style.StatementMacros.clear(); 13862 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 13863 std::vector<std::string>{"QUNUSED"}); 13864 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 13865 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 13866 13867 Style.NamespaceMacros.clear(); 13868 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 13869 std::vector<std::string>{"TESTSUITE"}); 13870 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 13871 std::vector<std::string>({"TESTSUITE", "SUITE"})); 13872 13873 Style.IncludeStyle.IncludeCategories.clear(); 13874 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 13875 {"abc/.*", 2, 0}, {".*", 1, 0}}; 13876 CHECK_PARSE("IncludeCategories:\n" 13877 " - Regex: abc/.*\n" 13878 " Priority: 2\n" 13879 " - Regex: .*\n" 13880 " Priority: 1", 13881 IncludeStyle.IncludeCategories, ExpectedCategories); 13882 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 13883 "abc$"); 13884 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 13885 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 13886 13887 Style.RawStringFormats.clear(); 13888 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 13889 { 13890 FormatStyle::LK_TextProto, 13891 {"pb", "proto"}, 13892 {"PARSE_TEXT_PROTO"}, 13893 /*CanonicalDelimiter=*/"", 13894 "llvm", 13895 }, 13896 { 13897 FormatStyle::LK_Cpp, 13898 {"cc", "cpp"}, 13899 {"C_CODEBLOCK", "CPPEVAL"}, 13900 /*CanonicalDelimiter=*/"cc", 13901 /*BasedOnStyle=*/"", 13902 }, 13903 }; 13904 13905 CHECK_PARSE("RawStringFormats:\n" 13906 " - Language: TextProto\n" 13907 " Delimiters:\n" 13908 " - 'pb'\n" 13909 " - 'proto'\n" 13910 " EnclosingFunctions:\n" 13911 " - 'PARSE_TEXT_PROTO'\n" 13912 " BasedOnStyle: llvm\n" 13913 " - Language: Cpp\n" 13914 " Delimiters:\n" 13915 " - 'cc'\n" 13916 " - 'cpp'\n" 13917 " EnclosingFunctions:\n" 13918 " - 'C_CODEBLOCK'\n" 13919 " - 'CPPEVAL'\n" 13920 " CanonicalDelimiter: 'cc'", 13921 RawStringFormats, ExpectedRawStringFormats); 13922 } 13923 13924 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 13925 FormatStyle Style = {}; 13926 Style.Language = FormatStyle::LK_Cpp; 13927 CHECK_PARSE("Language: Cpp\n" 13928 "IndentWidth: 12", 13929 IndentWidth, 12u); 13930 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 13931 "IndentWidth: 34", 13932 &Style), 13933 ParseError::Unsuitable); 13934 FormatStyle BinPackedTCS = {}; 13935 BinPackedTCS.Language = FormatStyle::LK_JavaScript; 13936 EXPECT_EQ(parseConfiguration("BinPackArguments: true\n" 13937 "InsertTrailingCommas: Wrapped", 13938 &BinPackedTCS), 13939 ParseError::BinPackTrailingCommaConflict); 13940 EXPECT_EQ(12u, Style.IndentWidth); 13941 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 13942 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 13943 13944 Style.Language = FormatStyle::LK_JavaScript; 13945 CHECK_PARSE("Language: JavaScript\n" 13946 "IndentWidth: 12", 13947 IndentWidth, 12u); 13948 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 13949 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 13950 "IndentWidth: 34", 13951 &Style), 13952 ParseError::Unsuitable); 13953 EXPECT_EQ(23u, Style.IndentWidth); 13954 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 13955 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 13956 13957 CHECK_PARSE("BasedOnStyle: LLVM\n" 13958 "IndentWidth: 67", 13959 IndentWidth, 67u); 13960 13961 CHECK_PARSE("---\n" 13962 "Language: JavaScript\n" 13963 "IndentWidth: 12\n" 13964 "---\n" 13965 "Language: Cpp\n" 13966 "IndentWidth: 34\n" 13967 "...\n", 13968 IndentWidth, 12u); 13969 13970 Style.Language = FormatStyle::LK_Cpp; 13971 CHECK_PARSE("---\n" 13972 "Language: JavaScript\n" 13973 "IndentWidth: 12\n" 13974 "---\n" 13975 "Language: Cpp\n" 13976 "IndentWidth: 34\n" 13977 "...\n", 13978 IndentWidth, 34u); 13979 CHECK_PARSE("---\n" 13980 "IndentWidth: 78\n" 13981 "---\n" 13982 "Language: JavaScript\n" 13983 "IndentWidth: 56\n" 13984 "...\n", 13985 IndentWidth, 78u); 13986 13987 Style.ColumnLimit = 123; 13988 Style.IndentWidth = 234; 13989 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 13990 Style.TabWidth = 345; 13991 EXPECT_FALSE(parseConfiguration("---\n" 13992 "IndentWidth: 456\n" 13993 "BreakBeforeBraces: Allman\n" 13994 "---\n" 13995 "Language: JavaScript\n" 13996 "IndentWidth: 111\n" 13997 "TabWidth: 111\n" 13998 "---\n" 13999 "Language: Cpp\n" 14000 "BreakBeforeBraces: Stroustrup\n" 14001 "TabWidth: 789\n" 14002 "...\n", 14003 &Style)); 14004 EXPECT_EQ(123u, Style.ColumnLimit); 14005 EXPECT_EQ(456u, Style.IndentWidth); 14006 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 14007 EXPECT_EQ(789u, Style.TabWidth); 14008 14009 EXPECT_EQ(parseConfiguration("---\n" 14010 "Language: JavaScript\n" 14011 "IndentWidth: 56\n" 14012 "---\n" 14013 "IndentWidth: 78\n" 14014 "...\n", 14015 &Style), 14016 ParseError::Error); 14017 EXPECT_EQ(parseConfiguration("---\n" 14018 "Language: JavaScript\n" 14019 "IndentWidth: 56\n" 14020 "---\n" 14021 "Language: JavaScript\n" 14022 "IndentWidth: 78\n" 14023 "...\n", 14024 &Style), 14025 ParseError::Error); 14026 14027 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14028 } 14029 14030 #undef CHECK_PARSE 14031 14032 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 14033 FormatStyle Style = {}; 14034 Style.Language = FormatStyle::LK_JavaScript; 14035 Style.BreakBeforeTernaryOperators = true; 14036 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 14037 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14038 14039 Style.BreakBeforeTernaryOperators = true; 14040 EXPECT_EQ(0, parseConfiguration("---\n" 14041 "BasedOnStyle: Google\n" 14042 "---\n" 14043 "Language: JavaScript\n" 14044 "IndentWidth: 76\n" 14045 "...\n", 14046 &Style) 14047 .value()); 14048 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14049 EXPECT_EQ(76u, Style.IndentWidth); 14050 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14051 } 14052 14053 TEST_F(FormatTest, ConfigurationRoundTripTest) { 14054 FormatStyle Style = getLLVMStyle(); 14055 std::string YAML = configurationAsText(Style); 14056 FormatStyle ParsedStyle = {}; 14057 ParsedStyle.Language = FormatStyle::LK_Cpp; 14058 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 14059 EXPECT_EQ(Style, ParsedStyle); 14060 } 14061 14062 TEST_F(FormatTest, WorksFor8bitEncodings) { 14063 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 14064 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 14065 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 14066 "\"\xef\xee\xf0\xf3...\"", 14067 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 14068 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 14069 "\xef\xee\xf0\xf3...\"", 14070 getLLVMStyleWithColumns(12))); 14071 } 14072 14073 TEST_F(FormatTest, HandlesUTF8BOM) { 14074 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 14075 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 14076 format("\xef\xbb\xbf#include <iostream>")); 14077 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 14078 format("\xef\xbb\xbf\n#include <iostream>")); 14079 } 14080 14081 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 14082 #if !defined(_MSC_VER) 14083 14084 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 14085 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 14086 getLLVMStyleWithColumns(35)); 14087 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 14088 getLLVMStyleWithColumns(31)); 14089 verifyFormat("// Однажды в студёную зимнюю пору...", 14090 getLLVMStyleWithColumns(36)); 14091 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 14092 verifyFormat("/* Однажды в студёную зимнюю пору... */", 14093 getLLVMStyleWithColumns(39)); 14094 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 14095 getLLVMStyleWithColumns(35)); 14096 } 14097 14098 TEST_F(FormatTest, SplitsUTF8Strings) { 14099 // Non-printable characters' width is currently considered to be the length in 14100 // bytes in UTF8. The characters can be displayed in very different manner 14101 // (zero-width, single width with a substitution glyph, expanded to their code 14102 // (e.g. "<8d>"), so there's no single correct way to handle them. 14103 EXPECT_EQ("\"aaaaÄ\"\n" 14104 "\"\xc2\x8d\";", 14105 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14106 EXPECT_EQ("\"aaaaaaaÄ\"\n" 14107 "\"\xc2\x8d\";", 14108 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14109 EXPECT_EQ("\"Однажды, в \"\n" 14110 "\"студёную \"\n" 14111 "\"зимнюю \"\n" 14112 "\"пору,\"", 14113 format("\"Однажды, в студёную зимнюю пору,\"", 14114 getLLVMStyleWithColumns(13))); 14115 EXPECT_EQ( 14116 "\"一 二 三 \"\n" 14117 "\"四 五六 \"\n" 14118 "\"七 八 九 \"\n" 14119 "\"十\"", 14120 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 14121 EXPECT_EQ("\"一\t\"\n" 14122 "\"二 \t\"\n" 14123 "\"三 四 \"\n" 14124 "\"五\t\"\n" 14125 "\"六 \t\"\n" 14126 "\"七 \"\n" 14127 "\"八九十\tqq\"", 14128 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 14129 getLLVMStyleWithColumns(11))); 14130 14131 // UTF8 character in an escape sequence. 14132 EXPECT_EQ("\"aaaaaa\"\n" 14133 "\"\\\xC2\x8D\"", 14134 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 14135 } 14136 14137 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 14138 EXPECT_EQ("const char *sssss =\n" 14139 " \"一二三四五六七八\\\n" 14140 " 九 十\";", 14141 format("const char *sssss = \"一二三四五六七八\\\n" 14142 " 九 十\";", 14143 getLLVMStyleWithColumns(30))); 14144 } 14145 14146 TEST_F(FormatTest, SplitsUTF8LineComments) { 14147 EXPECT_EQ("// aaaaÄ\xc2\x8d", 14148 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 14149 EXPECT_EQ("// Я из лесу\n" 14150 "// вышел; был\n" 14151 "// сильный\n" 14152 "// мороз.", 14153 format("// Я из лесу вышел; был сильный мороз.", 14154 getLLVMStyleWithColumns(13))); 14155 EXPECT_EQ("// 一二三\n" 14156 "// 四五六七\n" 14157 "// 八 九\n" 14158 "// 十", 14159 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 14160 } 14161 14162 TEST_F(FormatTest, SplitsUTF8BlockComments) { 14163 EXPECT_EQ("/* Гляжу,\n" 14164 " * поднимается\n" 14165 " * медленно в\n" 14166 " * гору\n" 14167 " * Лошадка,\n" 14168 " * везущая\n" 14169 " * хворосту\n" 14170 " * воз. */", 14171 format("/* Гляжу, поднимается медленно в гору\n" 14172 " * Лошадка, везущая хворосту воз. */", 14173 getLLVMStyleWithColumns(13))); 14174 EXPECT_EQ( 14175 "/* 一二三\n" 14176 " * 四五六七\n" 14177 " * 八 九\n" 14178 " * 十 */", 14179 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 14180 EXPECT_EQ("/* \n" 14181 " * \n" 14182 " * - */", 14183 format("/* - */", getLLVMStyleWithColumns(12))); 14184 } 14185 14186 #endif // _MSC_VER 14187 14188 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 14189 FormatStyle Style = getLLVMStyle(); 14190 14191 Style.ConstructorInitializerIndentWidth = 4; 14192 verifyFormat( 14193 "SomeClass::Constructor()\n" 14194 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14195 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14196 Style); 14197 14198 Style.ConstructorInitializerIndentWidth = 2; 14199 verifyFormat( 14200 "SomeClass::Constructor()\n" 14201 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14202 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14203 Style); 14204 14205 Style.ConstructorInitializerIndentWidth = 0; 14206 verifyFormat( 14207 "SomeClass::Constructor()\n" 14208 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14209 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14210 Style); 14211 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 14212 verifyFormat( 14213 "SomeLongTemplateVariableName<\n" 14214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 14215 Style); 14216 verifyFormat("bool smaller = 1 < " 14217 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 14218 " " 14219 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 14220 Style); 14221 14222 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 14223 verifyFormat("SomeClass::Constructor() :\n" 14224 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 14225 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 14226 Style); 14227 } 14228 14229 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 14230 FormatStyle Style = getLLVMStyle(); 14231 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 14232 Style.ConstructorInitializerIndentWidth = 4; 14233 verifyFormat("SomeClass::Constructor()\n" 14234 " : a(a)\n" 14235 " , b(b)\n" 14236 " , c(c) {}", 14237 Style); 14238 verifyFormat("SomeClass::Constructor()\n" 14239 " : a(a) {}", 14240 Style); 14241 14242 Style.ColumnLimit = 0; 14243 verifyFormat("SomeClass::Constructor()\n" 14244 " : a(a) {}", 14245 Style); 14246 verifyFormat("SomeClass::Constructor() noexcept\n" 14247 " : a(a) {}", 14248 Style); 14249 verifyFormat("SomeClass::Constructor()\n" 14250 " : a(a)\n" 14251 " , b(b)\n" 14252 " , c(c) {}", 14253 Style); 14254 verifyFormat("SomeClass::Constructor()\n" 14255 " : a(a) {\n" 14256 " foo();\n" 14257 " bar();\n" 14258 "}", 14259 Style); 14260 14261 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 14262 verifyFormat("SomeClass::Constructor()\n" 14263 " : a(a)\n" 14264 " , b(b)\n" 14265 " , c(c) {\n}", 14266 Style); 14267 verifyFormat("SomeClass::Constructor()\n" 14268 " : a(a) {\n}", 14269 Style); 14270 14271 Style.ColumnLimit = 80; 14272 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 14273 Style.ConstructorInitializerIndentWidth = 2; 14274 verifyFormat("SomeClass::Constructor()\n" 14275 " : a(a)\n" 14276 " , b(b)\n" 14277 " , c(c) {}", 14278 Style); 14279 14280 Style.ConstructorInitializerIndentWidth = 0; 14281 verifyFormat("SomeClass::Constructor()\n" 14282 ": a(a)\n" 14283 ", b(b)\n" 14284 ", c(c) {}", 14285 Style); 14286 14287 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 14288 Style.ConstructorInitializerIndentWidth = 4; 14289 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 14290 verifyFormat( 14291 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 14292 Style); 14293 verifyFormat( 14294 "SomeClass::Constructor()\n" 14295 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 14296 Style); 14297 Style.ConstructorInitializerIndentWidth = 4; 14298 Style.ColumnLimit = 60; 14299 verifyFormat("SomeClass::Constructor()\n" 14300 " : aaaaaaaa(aaaaaaaa)\n" 14301 " , aaaaaaaa(aaaaaaaa)\n" 14302 " , aaaaaaaa(aaaaaaaa) {}", 14303 Style); 14304 } 14305 14306 TEST_F(FormatTest, Destructors) { 14307 verifyFormat("void F(int &i) { i.~int(); }"); 14308 verifyFormat("void F(int &i) { i->~int(); }"); 14309 } 14310 14311 TEST_F(FormatTest, FormatsWithWebKitStyle) { 14312 FormatStyle Style = getWebKitStyle(); 14313 14314 // Don't indent in outer namespaces. 14315 verifyFormat("namespace outer {\n" 14316 "int i;\n" 14317 "namespace inner {\n" 14318 " int i;\n" 14319 "} // namespace inner\n" 14320 "} // namespace outer\n" 14321 "namespace other_outer {\n" 14322 "int i;\n" 14323 "}", 14324 Style); 14325 14326 // Don't indent case labels. 14327 verifyFormat("switch (variable) {\n" 14328 "case 1:\n" 14329 "case 2:\n" 14330 " doSomething();\n" 14331 " break;\n" 14332 "default:\n" 14333 " ++variable;\n" 14334 "}", 14335 Style); 14336 14337 // Wrap before binary operators. 14338 EXPECT_EQ("void f()\n" 14339 "{\n" 14340 " if (aaaaaaaaaaaaaaaa\n" 14341 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 14342 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 14343 " return;\n" 14344 "}", 14345 format("void f() {\n" 14346 "if (aaaaaaaaaaaaaaaa\n" 14347 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 14348 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 14349 "return;\n" 14350 "}", 14351 Style)); 14352 14353 // Allow functions on a single line. 14354 verifyFormat("void f() { return; }", Style); 14355 14356 // Allow empty blocks on a single line and insert a space in empty blocks. 14357 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 14358 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 14359 // However, don't merge non-empty short loops. 14360 EXPECT_EQ("while (true) {\n" 14361 " continue;\n" 14362 "}", 14363 format("while (true) { continue; }", Style)); 14364 14365 // Constructor initializers are formatted one per line with the "," on the 14366 // new line. 14367 verifyFormat("Constructor()\n" 14368 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 14369 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 14370 " aaaaaaaaaaaaaa)\n" 14371 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 14372 "{\n" 14373 "}", 14374 Style); 14375 verifyFormat("SomeClass::Constructor()\n" 14376 " : a(a)\n" 14377 "{\n" 14378 "}", 14379 Style); 14380 EXPECT_EQ("SomeClass::Constructor()\n" 14381 " : a(a)\n" 14382 "{\n" 14383 "}", 14384 format("SomeClass::Constructor():a(a){}", Style)); 14385 verifyFormat("SomeClass::Constructor()\n" 14386 " : a(a)\n" 14387 " , b(b)\n" 14388 " , c(c)\n" 14389 "{\n" 14390 "}", 14391 Style); 14392 verifyFormat("SomeClass::Constructor()\n" 14393 " : a(a)\n" 14394 "{\n" 14395 " foo();\n" 14396 " bar();\n" 14397 "}", 14398 Style); 14399 14400 // Access specifiers should be aligned left. 14401 verifyFormat("class C {\n" 14402 "public:\n" 14403 " int i;\n" 14404 "};", 14405 Style); 14406 14407 // Do not align comments. 14408 verifyFormat("int a; // Do not\n" 14409 "double b; // align comments.", 14410 Style); 14411 14412 // Do not align operands. 14413 EXPECT_EQ("ASSERT(aaaa\n" 14414 " || bbbb);", 14415 format("ASSERT ( aaaa\n||bbbb);", Style)); 14416 14417 // Accept input's line breaks. 14418 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 14419 " || bbbbbbbbbbbbbbb) {\n" 14420 " i++;\n" 14421 "}", 14422 format("if (aaaaaaaaaaaaaaa\n" 14423 "|| bbbbbbbbbbbbbbb) { i++; }", 14424 Style)); 14425 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 14426 " i++;\n" 14427 "}", 14428 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 14429 14430 // Don't automatically break all macro definitions (llvm.org/PR17842). 14431 verifyFormat("#define aNumber 10", Style); 14432 // However, generally keep the line breaks that the user authored. 14433 EXPECT_EQ("#define aNumber \\\n" 14434 " 10", 14435 format("#define aNumber \\\n" 14436 " 10", 14437 Style)); 14438 14439 // Keep empty and one-element array literals on a single line. 14440 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 14441 " copyItems:YES];", 14442 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 14443 "copyItems:YES];", 14444 Style)); 14445 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 14446 " copyItems:YES];", 14447 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 14448 " copyItems:YES];", 14449 Style)); 14450 // FIXME: This does not seem right, there should be more indentation before 14451 // the array literal's entries. Nested blocks have the same problem. 14452 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 14453 " @\"a\",\n" 14454 " @\"a\"\n" 14455 "]\n" 14456 " copyItems:YES];", 14457 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 14458 " @\"a\",\n" 14459 " @\"a\"\n" 14460 " ]\n" 14461 " copyItems:YES];", 14462 Style)); 14463 EXPECT_EQ( 14464 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 14465 " copyItems:YES];", 14466 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 14467 " copyItems:YES];", 14468 Style)); 14469 14470 verifyFormat("[self.a b:c c:d];", Style); 14471 EXPECT_EQ("[self.a b:c\n" 14472 " c:d];", 14473 format("[self.a b:c\n" 14474 "c:d];", 14475 Style)); 14476 } 14477 14478 TEST_F(FormatTest, FormatsLambdas) { 14479 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 14480 verifyFormat( 14481 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 14482 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 14483 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 14484 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 14485 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 14486 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 14487 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 14488 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 14489 verifyFormat("int x = f(*+[] {});"); 14490 verifyFormat("void f() {\n" 14491 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 14492 "}\n"); 14493 verifyFormat("void f() {\n" 14494 " other(x.begin(), //\n" 14495 " x.end(), //\n" 14496 " [&](int, int) { return 1; });\n" 14497 "}\n"); 14498 verifyFormat("void f() {\n" 14499 " other.other.other.other.other(\n" 14500 " x.begin(), x.end(),\n" 14501 " [something, rather](int, int, int, int, int, int, int) { " 14502 "return 1; });\n" 14503 "}\n"); 14504 verifyFormat( 14505 "void f() {\n" 14506 " other.other.other.other.other(\n" 14507 " x.begin(), x.end(),\n" 14508 " [something, rather](int, int, int, int, int, int, int) {\n" 14509 " //\n" 14510 " });\n" 14511 "}\n"); 14512 verifyFormat("SomeFunction([]() { // A cool function...\n" 14513 " return 43;\n" 14514 "});"); 14515 EXPECT_EQ("SomeFunction([]() {\n" 14516 "#define A a\n" 14517 " return 43;\n" 14518 "});", 14519 format("SomeFunction([](){\n" 14520 "#define A a\n" 14521 "return 43;\n" 14522 "});")); 14523 verifyFormat("void f() {\n" 14524 " SomeFunction([](decltype(x), A *a) {});\n" 14525 "}"); 14526 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14527 " [](const aaaaaaaaaa &a) { return a; });"); 14528 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 14529 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 14530 "});"); 14531 verifyFormat("Constructor()\n" 14532 " : Field([] { // comment\n" 14533 " int i;\n" 14534 " }) {}"); 14535 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 14536 " return some_parameter.size();\n" 14537 "};"); 14538 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 14539 " [](const string &s) { return s; };"); 14540 verifyFormat("int i = aaaaaa ? 1 //\n" 14541 " : [] {\n" 14542 " return 2; //\n" 14543 " }();"); 14544 verifyFormat("llvm::errs() << \"number of twos is \"\n" 14545 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 14546 " return x == 2; // force break\n" 14547 " });"); 14548 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14549 " [=](int iiiiiiiiiiii) {\n" 14550 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 14551 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 14552 " });", 14553 getLLVMStyleWithColumns(60)); 14554 verifyFormat("SomeFunction({[&] {\n" 14555 " // comment\n" 14556 " },\n" 14557 " [&] {\n" 14558 " // comment\n" 14559 " }});"); 14560 verifyFormat("SomeFunction({[&] {\n" 14561 " // comment\n" 14562 "}});"); 14563 verifyFormat( 14564 "virtual aaaaaaaaaaaaaaaa(\n" 14565 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 14566 " aaaaa aaaaaaaaa);"); 14567 14568 // Lambdas with return types. 14569 verifyFormat("int c = []() -> int { return 2; }();\n"); 14570 verifyFormat("int c = []() -> int * { return 2; }();\n"); 14571 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 14572 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 14573 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 14574 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 14575 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 14576 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 14577 verifyFormat("[a, a]() -> a<1> {};"); 14578 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 14579 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 14580 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 14581 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 14582 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 14583 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 14584 verifyFormat("[]() -> foo<!5> { return {}; };"); 14585 verifyFormat("[]() -> foo<~5> { return {}; };"); 14586 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 14587 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 14588 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 14589 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 14590 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 14591 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 14592 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 14593 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 14594 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 14595 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 14596 verifyFormat("namespace bar {\n" 14597 "// broken:\n" 14598 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 14599 "} // namespace bar"); 14600 verifyFormat("namespace bar {\n" 14601 "// broken:\n" 14602 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 14603 "} // namespace bar"); 14604 verifyFormat("namespace bar {\n" 14605 "// broken:\n" 14606 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 14607 "} // namespace bar"); 14608 verifyFormat("namespace bar {\n" 14609 "// broken:\n" 14610 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 14611 "} // namespace bar"); 14612 verifyFormat("namespace bar {\n" 14613 "// broken:\n" 14614 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 14615 "} // namespace bar"); 14616 verifyFormat("namespace bar {\n" 14617 "// broken:\n" 14618 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 14619 "} // namespace bar"); 14620 verifyFormat("namespace bar {\n" 14621 "// broken:\n" 14622 "auto foo{[]() -> foo<!5> { return {}; }};\n" 14623 "} // namespace bar"); 14624 verifyFormat("namespace bar {\n" 14625 "// broken:\n" 14626 "auto foo{[]() -> foo<~5> { return {}; }};\n" 14627 "} // namespace bar"); 14628 verifyFormat("namespace bar {\n" 14629 "// broken:\n" 14630 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 14631 "} // namespace bar"); 14632 verifyFormat("namespace bar {\n" 14633 "// broken:\n" 14634 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 14635 "} // namespace bar"); 14636 verifyFormat("namespace bar {\n" 14637 "// broken:\n" 14638 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 14639 "} // namespace bar"); 14640 verifyFormat("namespace bar {\n" 14641 "// broken:\n" 14642 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 14643 "} // namespace bar"); 14644 verifyFormat("namespace bar {\n" 14645 "// broken:\n" 14646 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 14647 "} // namespace bar"); 14648 verifyFormat("namespace bar {\n" 14649 "// broken:\n" 14650 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 14651 "} // namespace bar"); 14652 verifyFormat("namespace bar {\n" 14653 "// broken:\n" 14654 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 14655 "} // namespace bar"); 14656 verifyFormat("namespace bar {\n" 14657 "// broken:\n" 14658 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 14659 "} // namespace bar"); 14660 verifyFormat("namespace bar {\n" 14661 "// broken:\n" 14662 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 14663 "} // namespace bar"); 14664 verifyFormat("namespace bar {\n" 14665 "// broken:\n" 14666 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 14667 "} // namespace bar"); 14668 verifyFormat("[]() -> a<1> {};"); 14669 verifyFormat("[]() -> a<1> { ; };"); 14670 verifyFormat("[]() -> a<1> { ; }();"); 14671 verifyFormat("[a, a]() -> a<true> {};"); 14672 verifyFormat("[]() -> a<true> {};"); 14673 verifyFormat("[]() -> a<true> { ; };"); 14674 verifyFormat("[]() -> a<true> { ; }();"); 14675 verifyFormat("[a, a]() -> a<false> {};"); 14676 verifyFormat("[]() -> a<false> {};"); 14677 verifyFormat("[]() -> a<false> { ; };"); 14678 verifyFormat("[]() -> a<false> { ; }();"); 14679 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 14680 verifyFormat("namespace bar {\n" 14681 "auto foo{[]() -> foo<false> { ; }};\n" 14682 "} // namespace bar"); 14683 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 14684 " int j) -> int {\n" 14685 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 14686 "};"); 14687 verifyFormat( 14688 "aaaaaaaaaaaaaaaaaaaaaa(\n" 14689 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 14690 " return aaaaaaaaaaaaaaaaa;\n" 14691 " });", 14692 getLLVMStyleWithColumns(70)); 14693 verifyFormat("[]() //\n" 14694 " -> int {\n" 14695 " return 1; //\n" 14696 "};"); 14697 verifyFormat("[]() -> Void<T...> {};"); 14698 verifyFormat("[a, b]() -> Tuple<T...> { return {}; };"); 14699 14700 // Lambdas with explicit template argument lists. 14701 verifyFormat( 14702 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 14703 14704 // Multiple lambdas in the same parentheses change indentation rules. These 14705 // lambdas are forced to start on new lines. 14706 verifyFormat("SomeFunction(\n" 14707 " []() {\n" 14708 " //\n" 14709 " },\n" 14710 " []() {\n" 14711 " //\n" 14712 " });"); 14713 14714 // A lambda passed as arg0 is always pushed to the next line. 14715 verifyFormat("SomeFunction(\n" 14716 " [this] {\n" 14717 " //\n" 14718 " },\n" 14719 " 1);\n"); 14720 14721 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 14722 // the arg0 case above. 14723 auto Style = getGoogleStyle(); 14724 Style.BinPackArguments = false; 14725 verifyFormat("SomeFunction(\n" 14726 " a,\n" 14727 " [this] {\n" 14728 " //\n" 14729 " },\n" 14730 " b);\n", 14731 Style); 14732 verifyFormat("SomeFunction(\n" 14733 " a,\n" 14734 " [this] {\n" 14735 " //\n" 14736 " },\n" 14737 " b);\n"); 14738 14739 // A lambda with a very long line forces arg0 to be pushed out irrespective of 14740 // the BinPackArguments value (as long as the code is wide enough). 14741 verifyFormat( 14742 "something->SomeFunction(\n" 14743 " a,\n" 14744 " [this] {\n" 14745 " " 14746 "D0000000000000000000000000000000000000000000000000000000000001();\n" 14747 " },\n" 14748 " b);\n"); 14749 14750 // A multi-line lambda is pulled up as long as the introducer fits on the 14751 // previous line and there are no further args. 14752 verifyFormat("function(1, [this, that] {\n" 14753 " //\n" 14754 "});\n"); 14755 verifyFormat("function([this, that] {\n" 14756 " //\n" 14757 "});\n"); 14758 // FIXME: this format is not ideal and we should consider forcing the first 14759 // arg onto its own line. 14760 verifyFormat("function(a, b, c, //\n" 14761 " d, [this, that] {\n" 14762 " //\n" 14763 " });\n"); 14764 14765 // Multiple lambdas are treated correctly even when there is a short arg0. 14766 verifyFormat("SomeFunction(\n" 14767 " 1,\n" 14768 " [this] {\n" 14769 " //\n" 14770 " },\n" 14771 " [this] {\n" 14772 " //\n" 14773 " },\n" 14774 " 1);\n"); 14775 14776 // More complex introducers. 14777 verifyFormat("return [i, args...] {};"); 14778 14779 // Not lambdas. 14780 verifyFormat("constexpr char hello[]{\"hello\"};"); 14781 verifyFormat("double &operator[](int i) { return 0; }\n" 14782 "int i;"); 14783 verifyFormat("std::unique_ptr<int[]> foo() {}"); 14784 verifyFormat("int i = a[a][a]->f();"); 14785 verifyFormat("int i = (*b)[a]->f();"); 14786 14787 // Other corner cases. 14788 verifyFormat("void f() {\n" 14789 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 14790 " );\n" 14791 "}"); 14792 14793 // Lambdas created through weird macros. 14794 verifyFormat("void f() {\n" 14795 " MACRO((const AA &a) { return 1; });\n" 14796 " MACRO((AA &a) { return 1; });\n" 14797 "}"); 14798 14799 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 14800 " doo_dah();\n" 14801 " doo_dah();\n" 14802 " })) {\n" 14803 "}"); 14804 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 14805 " doo_dah();\n" 14806 " doo_dah();\n" 14807 " })) {\n" 14808 "}"); 14809 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 14810 " doo_dah();\n" 14811 " doo_dah();\n" 14812 " })) {\n" 14813 "}"); 14814 verifyFormat("auto lambda = []() {\n" 14815 " int a = 2\n" 14816 "#if A\n" 14817 " + 2\n" 14818 "#endif\n" 14819 " ;\n" 14820 "};"); 14821 14822 // Lambdas with complex multiline introducers. 14823 verifyFormat( 14824 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14825 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 14826 " -> ::std::unordered_set<\n" 14827 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 14828 " //\n" 14829 " });"); 14830 14831 FormatStyle DoNotMerge = getLLVMStyle(); 14832 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 14833 verifyFormat("auto c = []() {\n" 14834 " return b;\n" 14835 "};", 14836 "auto c = []() { return b; };", DoNotMerge); 14837 verifyFormat("auto c = []() {\n" 14838 "};", 14839 " auto c = []() {};", DoNotMerge); 14840 14841 FormatStyle MergeEmptyOnly = getLLVMStyle(); 14842 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 14843 verifyFormat("auto c = []() {\n" 14844 " return b;\n" 14845 "};", 14846 "auto c = []() {\n" 14847 " return b;\n" 14848 " };", 14849 MergeEmptyOnly); 14850 verifyFormat("auto c = []() {};", 14851 "auto c = []() {\n" 14852 "};", 14853 MergeEmptyOnly); 14854 14855 FormatStyle MergeInline = getLLVMStyle(); 14856 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 14857 verifyFormat("auto c = []() {\n" 14858 " return b;\n" 14859 "};", 14860 "auto c = []() { return b; };", MergeInline); 14861 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 14862 MergeInline); 14863 verifyFormat("function([]() { return b; }, a)", 14864 "function([]() { return b; }, a)", MergeInline); 14865 verifyFormat("function(a, []() { return b; })", 14866 "function(a, []() { return b; })", MergeInline); 14867 14868 // Check option "BraceWrapping.BeforeLambdaBody" and different state of 14869 // AllowShortLambdasOnASingleLine 14870 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 14871 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 14872 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 14873 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14874 FormatStyle::ShortLambdaStyle::SLS_None; 14875 verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n" 14876 " []()\n" 14877 " {\n" 14878 " return 17;\n" 14879 " });", 14880 LLVMWithBeforeLambdaBody); 14881 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n" 14882 " []()\n" 14883 " {\n" 14884 " });", 14885 LLVMWithBeforeLambdaBody); 14886 verifyFormat("auto fct_SLS_None = []()\n" 14887 "{\n" 14888 " return 17;\n" 14889 "};", 14890 LLVMWithBeforeLambdaBody); 14891 verifyFormat("TwoNestedLambdas_SLS_None(\n" 14892 " []()\n" 14893 " {\n" 14894 " return Call(\n" 14895 " []()\n" 14896 " {\n" 14897 " return 17;\n" 14898 " });\n" 14899 " });", 14900 LLVMWithBeforeLambdaBody); 14901 verifyFormat("void Fct()\n" 14902 "{\n" 14903 " return {[]()\n" 14904 " {\n" 14905 " return 17;\n" 14906 " }};\n" 14907 "}", 14908 LLVMWithBeforeLambdaBody); 14909 14910 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14911 FormatStyle::ShortLambdaStyle::SLS_Empty; 14912 verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" 14913 " []()\n" 14914 " {\n" 14915 " return 17;\n" 14916 " });", 14917 LLVMWithBeforeLambdaBody); 14918 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});", 14919 LLVMWithBeforeLambdaBody); 14920 verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL" 14921 "ongFunctionName_SLS_Empty(\n" 14922 " []() {});", 14923 LLVMWithBeforeLambdaBody); 14924 verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n" 14925 " []()\n" 14926 " {\n" 14927 " return 17;\n" 14928 " });", 14929 LLVMWithBeforeLambdaBody); 14930 verifyFormat("auto fct_SLS_Empty = []()\n" 14931 "{\n" 14932 " return 17;\n" 14933 "};", 14934 LLVMWithBeforeLambdaBody); 14935 verifyFormat("TwoNestedLambdas_SLS_Empty(\n" 14936 " []()\n" 14937 " {\n" 14938 " return Call([]() {});\n" 14939 " });", 14940 LLVMWithBeforeLambdaBody); 14941 verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n" 14942 " []()\n" 14943 " {\n" 14944 " return Call([]() {});\n" 14945 " });", 14946 LLVMWithBeforeLambdaBody); 14947 verifyFormat( 14948 "FctWithLongLineInLambda_SLS_Empty(\n" 14949 " []()\n" 14950 " {\n" 14951 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14952 " AndShouldNotBeConsiderAsInline,\n" 14953 " LambdaBodyMustBeBreak);\n" 14954 " });", 14955 LLVMWithBeforeLambdaBody); 14956 14957 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14958 FormatStyle::ShortLambdaStyle::SLS_Inline; 14959 verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });", 14960 LLVMWithBeforeLambdaBody); 14961 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});", 14962 LLVMWithBeforeLambdaBody); 14963 verifyFormat("auto fct_SLS_Inline = []()\n" 14964 "{\n" 14965 " return 17;\n" 14966 "};", 14967 LLVMWithBeforeLambdaBody); 14968 verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return " 14969 "17; }); });", 14970 LLVMWithBeforeLambdaBody); 14971 verifyFormat( 14972 "FctWithLongLineInLambda_SLS_Inline(\n" 14973 " []()\n" 14974 " {\n" 14975 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14976 " AndShouldNotBeConsiderAsInline,\n" 14977 " LambdaBodyMustBeBreak);\n" 14978 " });", 14979 LLVMWithBeforeLambdaBody); 14980 verifyFormat("FctWithMultipleParams_SLS_Inline(" 14981 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 14982 " []() { return 17; });", 14983 LLVMWithBeforeLambdaBody); 14984 verifyFormat( 14985 "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });", 14986 LLVMWithBeforeLambdaBody); 14987 14988 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14989 FormatStyle::ShortLambdaStyle::SLS_All; 14990 verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });", 14991 LLVMWithBeforeLambdaBody); 14992 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});", 14993 LLVMWithBeforeLambdaBody); 14994 verifyFormat("auto fct_SLS_All = []() { return 17; };", 14995 LLVMWithBeforeLambdaBody); 14996 verifyFormat("FctWithOneParam_SLS_All(\n" 14997 " []()\n" 14998 " {\n" 14999 " // A cool function...\n" 15000 " return 43;\n" 15001 " });", 15002 LLVMWithBeforeLambdaBody); 15003 verifyFormat("FctWithMultipleParams_SLS_All(" 15004 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15005 " []() { return 17; });", 15006 LLVMWithBeforeLambdaBody); 15007 verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });", 15008 LLVMWithBeforeLambdaBody); 15009 verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });", 15010 LLVMWithBeforeLambdaBody); 15011 verifyFormat( 15012 "FctWithLongLineInLambda_SLS_All(\n" 15013 " []()\n" 15014 " {\n" 15015 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15016 " AndShouldNotBeConsiderAsInline,\n" 15017 " LambdaBodyMustBeBreak);\n" 15018 " });", 15019 LLVMWithBeforeLambdaBody); 15020 verifyFormat( 15021 "auto fct_SLS_All = []()\n" 15022 "{\n" 15023 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15024 " AndShouldNotBeConsiderAsInline,\n" 15025 " LambdaBodyMustBeBreak);\n" 15026 "};", 15027 LLVMWithBeforeLambdaBody); 15028 LLVMWithBeforeLambdaBody.BinPackParameters = false; 15029 verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);", 15030 LLVMWithBeforeLambdaBody); 15031 verifyFormat( 15032 "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n" 15033 " FirstParam,\n" 15034 " SecondParam,\n" 15035 " ThirdParam,\n" 15036 " FourthParam);", 15037 LLVMWithBeforeLambdaBody); 15038 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15039 " []() { return " 15040 "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n" 15041 " FirstParam,\n" 15042 " SecondParam,\n" 15043 " ThirdParam,\n" 15044 " FourthParam);", 15045 LLVMWithBeforeLambdaBody); 15046 verifyFormat( 15047 "FctWithLongLineInLambda_SLS_All(FirstParam,\n" 15048 " SecondParam,\n" 15049 " ThirdParam,\n" 15050 " FourthParam,\n" 15051 " []() { return SomeValueNotSoLong; });", 15052 LLVMWithBeforeLambdaBody); 15053 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15054 " []()\n" 15055 " {\n" 15056 " return " 15057 "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB" 15058 "eConsiderAsInline;\n" 15059 " });", 15060 LLVMWithBeforeLambdaBody); 15061 verifyFormat( 15062 "FctWithLongLineInLambda_SLS_All(\n" 15063 " []()\n" 15064 " {\n" 15065 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15066 " AndShouldNotBeConsiderAsInline,\n" 15067 " LambdaBodyMustBeBreak);\n" 15068 " });", 15069 LLVMWithBeforeLambdaBody); 15070 verifyFormat("FctWithTwoParams_SLS_All(\n" 15071 " []()\n" 15072 " {\n" 15073 " // A cool function...\n" 15074 " return 43;\n" 15075 " },\n" 15076 " 87);", 15077 LLVMWithBeforeLambdaBody); 15078 verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);", 15079 LLVMWithBeforeLambdaBody); 15080 verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });", 15081 LLVMWithBeforeLambdaBody); 15082 verifyFormat( 15083 "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });", 15084 LLVMWithBeforeLambdaBody); 15085 verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; " 15086 "}); }, x);", 15087 LLVMWithBeforeLambdaBody); 15088 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15089 " []()\n" 15090 " {\n" 15091 " // A cool function...\n" 15092 " return Call([]() { return 17; });\n" 15093 " });", 15094 LLVMWithBeforeLambdaBody); 15095 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15096 " []()\n" 15097 " {\n" 15098 " return Call(\n" 15099 " []()\n" 15100 " {\n" 15101 " // A cool function...\n" 15102 " return 17;\n" 15103 " });\n" 15104 " });", 15105 LLVMWithBeforeLambdaBody); 15106 } 15107 15108 TEST_F(FormatTest, LambdaWithLineComments) { 15109 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15110 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15111 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15112 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15113 FormatStyle::ShortLambdaStyle::SLS_All; 15114 15115 verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody); 15116 verifyFormat("auto k = []() // comment\n" 15117 "{ return; }", 15118 LLVMWithBeforeLambdaBody); 15119 verifyFormat("auto k = []() /* comment */ { return; }", 15120 LLVMWithBeforeLambdaBody); 15121 verifyFormat("auto k = []() /* comment */ /* comment */ { return; }", 15122 LLVMWithBeforeLambdaBody); 15123 verifyFormat("auto k = []() // X\n" 15124 "{ return; }", 15125 LLVMWithBeforeLambdaBody); 15126 verifyFormat( 15127 "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" 15128 "{ return; }", 15129 LLVMWithBeforeLambdaBody); 15130 } 15131 15132 TEST_F(FormatTest, EmptyLinesInLambdas) { 15133 verifyFormat("auto lambda = []() {\n" 15134 " x(); //\n" 15135 "};", 15136 "auto lambda = []() {\n" 15137 "\n" 15138 " x(); //\n" 15139 "\n" 15140 "};"); 15141 } 15142 15143 TEST_F(FormatTest, FormatsBlocks) { 15144 FormatStyle ShortBlocks = getLLVMStyle(); 15145 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15146 verifyFormat("int (^Block)(int, int);", ShortBlocks); 15147 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 15148 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 15149 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 15150 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 15151 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 15152 15153 verifyFormat("foo(^{ bar(); });", ShortBlocks); 15154 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 15155 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 15156 15157 verifyFormat("[operation setCompletionBlock:^{\n" 15158 " [self onOperationDone];\n" 15159 "}];"); 15160 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 15161 " [self onOperationDone];\n" 15162 "}]};"); 15163 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 15164 " f();\n" 15165 "}];"); 15166 verifyFormat("int a = [operation block:^int(int *i) {\n" 15167 " return 1;\n" 15168 "}];"); 15169 verifyFormat("[myObject doSomethingWith:arg1\n" 15170 " aaa:^int(int *a) {\n" 15171 " return 1;\n" 15172 " }\n" 15173 " bbb:f(a * bbbbbbbb)];"); 15174 15175 verifyFormat("[operation setCompletionBlock:^{\n" 15176 " [self.delegate newDataAvailable];\n" 15177 "}];", 15178 getLLVMStyleWithColumns(60)); 15179 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 15180 " NSString *path = [self sessionFilePath];\n" 15181 " if (path) {\n" 15182 " // ...\n" 15183 " }\n" 15184 "});"); 15185 verifyFormat("[[SessionService sharedService]\n" 15186 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15187 " if (window) {\n" 15188 " [self windowDidLoad:window];\n" 15189 " } else {\n" 15190 " [self errorLoadingWindow];\n" 15191 " }\n" 15192 " }];"); 15193 verifyFormat("void (^largeBlock)(void) = ^{\n" 15194 " // ...\n" 15195 "};\n", 15196 getLLVMStyleWithColumns(40)); 15197 verifyFormat("[[SessionService sharedService]\n" 15198 " loadWindowWithCompletionBlock: //\n" 15199 " ^(SessionWindow *window) {\n" 15200 " if (window) {\n" 15201 " [self windowDidLoad:window];\n" 15202 " } else {\n" 15203 " [self errorLoadingWindow];\n" 15204 " }\n" 15205 " }];", 15206 getLLVMStyleWithColumns(60)); 15207 verifyFormat("[myObject doSomethingWith:arg1\n" 15208 " firstBlock:^(Foo *a) {\n" 15209 " // ...\n" 15210 " int i;\n" 15211 " }\n" 15212 " secondBlock:^(Bar *b) {\n" 15213 " // ...\n" 15214 " int i;\n" 15215 " }\n" 15216 " thirdBlock:^Foo(Bar *b) {\n" 15217 " // ...\n" 15218 " int i;\n" 15219 " }];"); 15220 verifyFormat("[myObject doSomethingWith:arg1\n" 15221 " firstBlock:-1\n" 15222 " secondBlock:^(Bar *b) {\n" 15223 " // ...\n" 15224 " int i;\n" 15225 " }];"); 15226 15227 verifyFormat("f(^{\n" 15228 " @autoreleasepool {\n" 15229 " if (a) {\n" 15230 " g();\n" 15231 " }\n" 15232 " }\n" 15233 "});"); 15234 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 15235 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 15236 "};"); 15237 15238 FormatStyle FourIndent = getLLVMStyle(); 15239 FourIndent.ObjCBlockIndentWidth = 4; 15240 verifyFormat("[operation setCompletionBlock:^{\n" 15241 " [self onOperationDone];\n" 15242 "}];", 15243 FourIndent); 15244 } 15245 15246 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 15247 FormatStyle ZeroColumn = getLLVMStyle(); 15248 ZeroColumn.ColumnLimit = 0; 15249 15250 verifyFormat("[[SessionService sharedService] " 15251 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15252 " if (window) {\n" 15253 " [self windowDidLoad:window];\n" 15254 " } else {\n" 15255 " [self errorLoadingWindow];\n" 15256 " }\n" 15257 "}];", 15258 ZeroColumn); 15259 EXPECT_EQ("[[SessionService sharedService]\n" 15260 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15261 " if (window) {\n" 15262 " [self windowDidLoad:window];\n" 15263 " } else {\n" 15264 " [self errorLoadingWindow];\n" 15265 " }\n" 15266 " }];", 15267 format("[[SessionService sharedService]\n" 15268 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15269 " if (window) {\n" 15270 " [self windowDidLoad:window];\n" 15271 " } else {\n" 15272 " [self errorLoadingWindow];\n" 15273 " }\n" 15274 "}];", 15275 ZeroColumn)); 15276 verifyFormat("[myObject doSomethingWith:arg1\n" 15277 " firstBlock:^(Foo *a) {\n" 15278 " // ...\n" 15279 " int i;\n" 15280 " }\n" 15281 " secondBlock:^(Bar *b) {\n" 15282 " // ...\n" 15283 " int i;\n" 15284 " }\n" 15285 " thirdBlock:^Foo(Bar *b) {\n" 15286 " // ...\n" 15287 " int i;\n" 15288 " }];", 15289 ZeroColumn); 15290 verifyFormat("f(^{\n" 15291 " @autoreleasepool {\n" 15292 " if (a) {\n" 15293 " g();\n" 15294 " }\n" 15295 " }\n" 15296 "});", 15297 ZeroColumn); 15298 verifyFormat("void (^largeBlock)(void) = ^{\n" 15299 " // ...\n" 15300 "};", 15301 ZeroColumn); 15302 15303 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15304 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 15305 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 15306 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 15307 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 15308 " int i;\n" 15309 "};", 15310 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 15311 } 15312 15313 TEST_F(FormatTest, SupportsCRLF) { 15314 EXPECT_EQ("int a;\r\n" 15315 "int b;\r\n" 15316 "int c;\r\n", 15317 format("int a;\r\n" 15318 " int b;\r\n" 15319 " int c;\r\n", 15320 getLLVMStyle())); 15321 EXPECT_EQ("int a;\r\n" 15322 "int b;\r\n" 15323 "int c;\r\n", 15324 format("int a;\r\n" 15325 " int b;\n" 15326 " int c;\r\n", 15327 getLLVMStyle())); 15328 EXPECT_EQ("int a;\n" 15329 "int b;\n" 15330 "int c;\n", 15331 format("int a;\r\n" 15332 " int b;\n" 15333 " int c;\n", 15334 getLLVMStyle())); 15335 EXPECT_EQ("\"aaaaaaa \"\r\n" 15336 "\"bbbbbbb\";\r\n", 15337 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 15338 EXPECT_EQ("#define A \\\r\n" 15339 " b; \\\r\n" 15340 " c; \\\r\n" 15341 " d;\r\n", 15342 format("#define A \\\r\n" 15343 " b; \\\r\n" 15344 " c; d; \r\n", 15345 getGoogleStyle())); 15346 15347 EXPECT_EQ("/*\r\n" 15348 "multi line block comments\r\n" 15349 "should not introduce\r\n" 15350 "an extra carriage return\r\n" 15351 "*/\r\n", 15352 format("/*\r\n" 15353 "multi line block comments\r\n" 15354 "should not introduce\r\n" 15355 "an extra carriage return\r\n" 15356 "*/\r\n")); 15357 EXPECT_EQ("/*\r\n" 15358 "\r\n" 15359 "*/", 15360 format("/*\r\n" 15361 " \r\r\r\n" 15362 "*/")); 15363 15364 FormatStyle style = getLLVMStyle(); 15365 15366 style.DeriveLineEnding = true; 15367 style.UseCRLF = false; 15368 EXPECT_EQ("union FooBarBazQux {\n" 15369 " int foo;\n" 15370 " int bar;\n" 15371 " int baz;\n" 15372 "};", 15373 format("union FooBarBazQux {\r\n" 15374 " int foo;\n" 15375 " int bar;\r\n" 15376 " int baz;\n" 15377 "};", 15378 style)); 15379 style.UseCRLF = true; 15380 EXPECT_EQ("union FooBarBazQux {\r\n" 15381 " int foo;\r\n" 15382 " int bar;\r\n" 15383 " int baz;\r\n" 15384 "};", 15385 format("union FooBarBazQux {\r\n" 15386 " int foo;\n" 15387 " int bar;\r\n" 15388 " int baz;\n" 15389 "};", 15390 style)); 15391 15392 style.DeriveLineEnding = false; 15393 style.UseCRLF = false; 15394 EXPECT_EQ("union FooBarBazQux {\n" 15395 " int foo;\n" 15396 " int bar;\n" 15397 " int baz;\n" 15398 " int qux;\n" 15399 "};", 15400 format("union FooBarBazQux {\r\n" 15401 " int foo;\n" 15402 " int bar;\r\n" 15403 " int baz;\n" 15404 " int qux;\r\n" 15405 "};", 15406 style)); 15407 style.UseCRLF = true; 15408 EXPECT_EQ("union FooBarBazQux {\r\n" 15409 " int foo;\r\n" 15410 " int bar;\r\n" 15411 " int baz;\r\n" 15412 " int qux;\r\n" 15413 "};", 15414 format("union FooBarBazQux {\r\n" 15415 " int foo;\n" 15416 " int bar;\r\n" 15417 " int baz;\n" 15418 " int qux;\n" 15419 "};", 15420 style)); 15421 15422 style.DeriveLineEnding = true; 15423 style.UseCRLF = false; 15424 EXPECT_EQ("union FooBarBazQux {\r\n" 15425 " int foo;\r\n" 15426 " int bar;\r\n" 15427 " int baz;\r\n" 15428 " int qux;\r\n" 15429 "};", 15430 format("union FooBarBazQux {\r\n" 15431 " int foo;\n" 15432 " int bar;\r\n" 15433 " int baz;\n" 15434 " int qux;\r\n" 15435 "};", 15436 style)); 15437 style.UseCRLF = true; 15438 EXPECT_EQ("union FooBarBazQux {\n" 15439 " int foo;\n" 15440 " int bar;\n" 15441 " int baz;\n" 15442 " int qux;\n" 15443 "};", 15444 format("union FooBarBazQux {\r\n" 15445 " int foo;\n" 15446 " int bar;\r\n" 15447 " int baz;\n" 15448 " int qux;\n" 15449 "};", 15450 style)); 15451 } 15452 15453 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 15454 verifyFormat("MY_CLASS(C) {\n" 15455 " int i;\n" 15456 " int j;\n" 15457 "};"); 15458 } 15459 15460 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 15461 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 15462 TwoIndent.ContinuationIndentWidth = 2; 15463 15464 EXPECT_EQ("int i =\n" 15465 " longFunction(\n" 15466 " arg);", 15467 format("int i = longFunction(arg);", TwoIndent)); 15468 15469 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 15470 SixIndent.ContinuationIndentWidth = 6; 15471 15472 EXPECT_EQ("int i =\n" 15473 " longFunction(\n" 15474 " arg);", 15475 format("int i = longFunction(arg);", SixIndent)); 15476 } 15477 15478 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 15479 FormatStyle Style = getLLVMStyle(); 15480 verifyFormat("int Foo::getter(\n" 15481 " //\n" 15482 ") const {\n" 15483 " return foo;\n" 15484 "}", 15485 Style); 15486 verifyFormat("void Foo::setter(\n" 15487 " //\n" 15488 ") {\n" 15489 " foo = 1;\n" 15490 "}", 15491 Style); 15492 } 15493 15494 TEST_F(FormatTest, SpacesInAngles) { 15495 FormatStyle Spaces = getLLVMStyle(); 15496 Spaces.SpacesInAngles = true; 15497 15498 verifyFormat("static_cast< int >(arg);", Spaces); 15499 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 15500 verifyFormat("f< int, float >();", Spaces); 15501 verifyFormat("template <> g() {}", Spaces); 15502 verifyFormat("template < std::vector< int > > f() {}", Spaces); 15503 verifyFormat("std::function< void(int, int) > fct;", Spaces); 15504 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 15505 Spaces); 15506 15507 Spaces.Standard = FormatStyle::LS_Cpp03; 15508 Spaces.SpacesInAngles = true; 15509 verifyFormat("A< A< int > >();", Spaces); 15510 15511 Spaces.SpacesInAngles = false; 15512 verifyFormat("A<A<int> >();", Spaces); 15513 15514 Spaces.Standard = FormatStyle::LS_Cpp11; 15515 Spaces.SpacesInAngles = true; 15516 verifyFormat("A< A< int > >();", Spaces); 15517 15518 Spaces.SpacesInAngles = false; 15519 verifyFormat("A<A<int>>();", Spaces); 15520 } 15521 15522 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 15523 FormatStyle Style = getLLVMStyle(); 15524 Style.SpaceAfterTemplateKeyword = false; 15525 verifyFormat("template<int> void foo();", Style); 15526 } 15527 15528 TEST_F(FormatTest, TripleAngleBrackets) { 15529 verifyFormat("f<<<1, 1>>>();"); 15530 verifyFormat("f<<<1, 1, 1, s>>>();"); 15531 verifyFormat("f<<<a, b, c, d>>>();"); 15532 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 15533 verifyFormat("f<param><<<1, 1>>>();"); 15534 verifyFormat("f<1><<<1, 1>>>();"); 15535 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 15536 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 15537 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 15538 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 15539 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 15540 } 15541 15542 TEST_F(FormatTest, MergeLessLessAtEnd) { 15543 verifyFormat("<<"); 15544 EXPECT_EQ("< < <", format("\\\n<<<")); 15545 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 15546 "aaallvm::outs() <<"); 15547 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 15548 "aaaallvm::outs()\n <<"); 15549 } 15550 15551 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 15552 std::string code = "#if A\n" 15553 "#if B\n" 15554 "a.\n" 15555 "#endif\n" 15556 " a = 1;\n" 15557 "#else\n" 15558 "#endif\n" 15559 "#if C\n" 15560 "#else\n" 15561 "#endif\n"; 15562 EXPECT_EQ(code, format(code)); 15563 } 15564 15565 TEST_F(FormatTest, HandleConflictMarkers) { 15566 // Git/SVN conflict markers. 15567 EXPECT_EQ("int a;\n" 15568 "void f() {\n" 15569 " callme(some(parameter1,\n" 15570 "<<<<<<< text by the vcs\n" 15571 " parameter2),\n" 15572 "||||||| text by the vcs\n" 15573 " parameter2),\n" 15574 " parameter3,\n" 15575 "======= text by the vcs\n" 15576 " parameter2, parameter3),\n" 15577 ">>>>>>> text by the vcs\n" 15578 " otherparameter);\n", 15579 format("int a;\n" 15580 "void f() {\n" 15581 " callme(some(parameter1,\n" 15582 "<<<<<<< text by the vcs\n" 15583 " parameter2),\n" 15584 "||||||| text by the vcs\n" 15585 " parameter2),\n" 15586 " parameter3,\n" 15587 "======= text by the vcs\n" 15588 " parameter2,\n" 15589 " parameter3),\n" 15590 ">>>>>>> text by the vcs\n" 15591 " otherparameter);\n")); 15592 15593 // Perforce markers. 15594 EXPECT_EQ("void f() {\n" 15595 " function(\n" 15596 ">>>> text by the vcs\n" 15597 " parameter,\n" 15598 "==== text by the vcs\n" 15599 " parameter,\n" 15600 "==== text by the vcs\n" 15601 " parameter,\n" 15602 "<<<< text by the vcs\n" 15603 " parameter);\n", 15604 format("void f() {\n" 15605 " function(\n" 15606 ">>>> text by the vcs\n" 15607 " parameter,\n" 15608 "==== text by the vcs\n" 15609 " parameter,\n" 15610 "==== text by the vcs\n" 15611 " parameter,\n" 15612 "<<<< text by the vcs\n" 15613 " parameter);\n")); 15614 15615 EXPECT_EQ("<<<<<<<\n" 15616 "|||||||\n" 15617 "=======\n" 15618 ">>>>>>>", 15619 format("<<<<<<<\n" 15620 "|||||||\n" 15621 "=======\n" 15622 ">>>>>>>")); 15623 15624 EXPECT_EQ("<<<<<<<\n" 15625 "|||||||\n" 15626 "int i;\n" 15627 "=======\n" 15628 ">>>>>>>", 15629 format("<<<<<<<\n" 15630 "|||||||\n" 15631 "int i;\n" 15632 "=======\n" 15633 ">>>>>>>")); 15634 15635 // FIXME: Handle parsing of macros around conflict markers correctly: 15636 EXPECT_EQ("#define Macro \\\n" 15637 "<<<<<<<\n" 15638 "Something \\\n" 15639 "|||||||\n" 15640 "Else \\\n" 15641 "=======\n" 15642 "Other \\\n" 15643 ">>>>>>>\n" 15644 " End int i;\n", 15645 format("#define Macro \\\n" 15646 "<<<<<<<\n" 15647 " Something \\\n" 15648 "|||||||\n" 15649 " Else \\\n" 15650 "=======\n" 15651 " Other \\\n" 15652 ">>>>>>>\n" 15653 " End\n" 15654 "int i;\n")); 15655 } 15656 15657 TEST_F(FormatTest, DisableRegions) { 15658 EXPECT_EQ("int i;\n" 15659 "// clang-format off\n" 15660 " int j;\n" 15661 "// clang-format on\n" 15662 "int k;", 15663 format(" int i;\n" 15664 " // clang-format off\n" 15665 " int j;\n" 15666 " // clang-format on\n" 15667 " int k;")); 15668 EXPECT_EQ("int i;\n" 15669 "/* clang-format off */\n" 15670 " int j;\n" 15671 "/* clang-format on */\n" 15672 "int k;", 15673 format(" int i;\n" 15674 " /* clang-format off */\n" 15675 " int j;\n" 15676 " /* clang-format on */\n" 15677 " int k;")); 15678 15679 // Don't reflow comments within disabled regions. 15680 EXPECT_EQ("// clang-format off\n" 15681 "// long long long long long long line\n" 15682 "/* clang-format on */\n" 15683 "/* long long long\n" 15684 " * long long long\n" 15685 " * line */\n" 15686 "int i;\n" 15687 "/* clang-format off */\n" 15688 "/* long long long long long long line */\n", 15689 format("// clang-format off\n" 15690 "// long long long long long long line\n" 15691 "/* clang-format on */\n" 15692 "/* long long long long long long line */\n" 15693 "int i;\n" 15694 "/* clang-format off */\n" 15695 "/* long long long long long long line */\n", 15696 getLLVMStyleWithColumns(20))); 15697 } 15698 15699 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 15700 format("? ) ="); 15701 verifyNoCrash("#define a\\\n /**/}"); 15702 } 15703 15704 TEST_F(FormatTest, FormatsTableGenCode) { 15705 FormatStyle Style = getLLVMStyle(); 15706 Style.Language = FormatStyle::LK_TableGen; 15707 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 15708 } 15709 15710 TEST_F(FormatTest, ArrayOfTemplates) { 15711 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 15712 format("auto a = new unique_ptr<int > [ 10];")); 15713 15714 FormatStyle Spaces = getLLVMStyle(); 15715 Spaces.SpacesInSquareBrackets = true; 15716 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 15717 format("auto a = new unique_ptr<int > [10];", Spaces)); 15718 } 15719 15720 TEST_F(FormatTest, ArrayAsTemplateType) { 15721 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 15722 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 15723 15724 FormatStyle Spaces = getLLVMStyle(); 15725 Spaces.SpacesInSquareBrackets = true; 15726 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 15727 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 15728 } 15729 15730 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 15731 15732 TEST(FormatStyle, GetStyleWithEmptyFileName) { 15733 llvm::vfs::InMemoryFileSystem FS; 15734 auto Style1 = getStyle("file", "", "Google", "", &FS); 15735 ASSERT_TRUE((bool)Style1); 15736 ASSERT_EQ(*Style1, getGoogleStyle()); 15737 } 15738 15739 TEST(FormatStyle, GetStyleOfFile) { 15740 llvm::vfs::InMemoryFileSystem FS; 15741 // Test 1: format file in the same directory. 15742 ASSERT_TRUE( 15743 FS.addFile("/a/.clang-format", 0, 15744 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 15745 ASSERT_TRUE( 15746 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15747 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 15748 ASSERT_TRUE((bool)Style1); 15749 ASSERT_EQ(*Style1, getLLVMStyle()); 15750 15751 // Test 2.1: fallback to default. 15752 ASSERT_TRUE( 15753 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15754 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 15755 ASSERT_TRUE((bool)Style2); 15756 ASSERT_EQ(*Style2, getMozillaStyle()); 15757 15758 // Test 2.2: no format on 'none' fallback style. 15759 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 15760 ASSERT_TRUE((bool)Style2); 15761 ASSERT_EQ(*Style2, getNoStyle()); 15762 15763 // Test 2.3: format if config is found with no based style while fallback is 15764 // 'none'. 15765 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 15766 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 15767 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 15768 ASSERT_TRUE((bool)Style2); 15769 ASSERT_EQ(*Style2, getLLVMStyle()); 15770 15771 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 15772 Style2 = getStyle("{}", "a.h", "none", "", &FS); 15773 ASSERT_TRUE((bool)Style2); 15774 ASSERT_EQ(*Style2, getLLVMStyle()); 15775 15776 // Test 3: format file in parent directory. 15777 ASSERT_TRUE( 15778 FS.addFile("/c/.clang-format", 0, 15779 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 15780 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 15781 llvm::MemoryBuffer::getMemBuffer("int i;"))); 15782 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 15783 ASSERT_TRUE((bool)Style3); 15784 ASSERT_EQ(*Style3, getGoogleStyle()); 15785 15786 // Test 4: error on invalid fallback style 15787 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 15788 ASSERT_FALSE((bool)Style4); 15789 llvm::consumeError(Style4.takeError()); 15790 15791 // Test 5: error on invalid yaml on command line 15792 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 15793 ASSERT_FALSE((bool)Style5); 15794 llvm::consumeError(Style5.takeError()); 15795 15796 // Test 6: error on invalid style 15797 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 15798 ASSERT_FALSE((bool)Style6); 15799 llvm::consumeError(Style6.takeError()); 15800 15801 // Test 7: found config file, error on parsing it 15802 ASSERT_TRUE( 15803 FS.addFile("/d/.clang-format", 0, 15804 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 15805 "InvalidKey: InvalidValue"))); 15806 ASSERT_TRUE( 15807 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15808 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 15809 ASSERT_FALSE((bool)Style7); 15810 llvm::consumeError(Style7.takeError()); 15811 15812 // Test 8: inferred per-language defaults apply. 15813 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 15814 ASSERT_TRUE((bool)StyleTd); 15815 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 15816 } 15817 15818 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 15819 // Column limit is 20. 15820 std::string Code = "Type *a =\n" 15821 " new Type();\n" 15822 "g(iiiii, 0, jjjjj,\n" 15823 " 0, kkkkk, 0, mm);\n" 15824 "int bad = format ;"; 15825 std::string Expected = "auto a = new Type();\n" 15826 "g(iiiii, nullptr,\n" 15827 " jjjjj, nullptr,\n" 15828 " kkkkk, nullptr,\n" 15829 " mm);\n" 15830 "int bad = format ;"; 15831 FileID ID = Context.createInMemoryFile("format.cpp", Code); 15832 tooling::Replacements Replaces = toReplacements( 15833 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 15834 "auto "), 15835 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 15836 "nullptr"), 15837 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 15838 "nullptr"), 15839 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 15840 "nullptr")}); 15841 15842 format::FormatStyle Style = format::getLLVMStyle(); 15843 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 15844 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 15845 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 15846 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 15847 auto Result = applyAllReplacements(Code, *FormattedReplaces); 15848 EXPECT_TRUE(static_cast<bool>(Result)); 15849 EXPECT_EQ(Expected, *Result); 15850 } 15851 15852 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 15853 std::string Code = "#include \"a.h\"\n" 15854 "#include \"c.h\"\n" 15855 "\n" 15856 "int main() {\n" 15857 " return 0;\n" 15858 "}"; 15859 std::string Expected = "#include \"a.h\"\n" 15860 "#include \"b.h\"\n" 15861 "#include \"c.h\"\n" 15862 "\n" 15863 "int main() {\n" 15864 " return 0;\n" 15865 "}"; 15866 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 15867 tooling::Replacements Replaces = toReplacements( 15868 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 15869 "#include \"b.h\"\n")}); 15870 15871 format::FormatStyle Style = format::getLLVMStyle(); 15872 Style.SortIncludes = true; 15873 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 15874 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 15875 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 15876 auto Result = applyAllReplacements(Code, *FormattedReplaces); 15877 EXPECT_TRUE(static_cast<bool>(Result)); 15878 EXPECT_EQ(Expected, *Result); 15879 } 15880 15881 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 15882 EXPECT_EQ("using std::cin;\n" 15883 "using std::cout;", 15884 format("using std::cout;\n" 15885 "using std::cin;", 15886 getGoogleStyle())); 15887 } 15888 15889 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 15890 format::FormatStyle Style = format::getLLVMStyle(); 15891 Style.Standard = FormatStyle::LS_Cpp03; 15892 // cpp03 recognize this string as identifier u8 and literal character 'a' 15893 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 15894 } 15895 15896 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 15897 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 15898 // all modes, including C++11, C++14 and C++17 15899 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 15900 } 15901 15902 TEST_F(FormatTest, DoNotFormatLikelyXml) { 15903 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 15904 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 15905 } 15906 15907 TEST_F(FormatTest, StructuredBindings) { 15908 // Structured bindings is a C++17 feature. 15909 // all modes, including C++11, C++14 and C++17 15910 verifyFormat("auto [a, b] = f();"); 15911 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 15912 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 15913 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 15914 EXPECT_EQ("auto const volatile [a, b] = f();", 15915 format("auto const volatile[a, b] = f();")); 15916 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 15917 EXPECT_EQ("auto &[a, b, c] = f();", 15918 format("auto &[ a , b,c ] = f();")); 15919 EXPECT_EQ("auto &&[a, b, c] = f();", 15920 format("auto &&[ a , b,c ] = f();")); 15921 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 15922 EXPECT_EQ("auto const volatile &&[a, b] = f();", 15923 format("auto const volatile &&[a, b] = f();")); 15924 EXPECT_EQ("auto const &&[a, b] = f();", 15925 format("auto const && [a, b] = f();")); 15926 EXPECT_EQ("const auto &[a, b] = f();", 15927 format("const auto & [a, b] = f();")); 15928 EXPECT_EQ("const auto volatile &&[a, b] = f();", 15929 format("const auto volatile &&[a, b] = f();")); 15930 EXPECT_EQ("volatile const auto &&[a, b] = f();", 15931 format("volatile const auto &&[a, b] = f();")); 15932 EXPECT_EQ("const auto &&[a, b] = f();", 15933 format("const auto && [a, b] = f();")); 15934 15935 // Make sure we don't mistake structured bindings for lambdas. 15936 FormatStyle PointerMiddle = getLLVMStyle(); 15937 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 15938 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 15939 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 15940 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 15941 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 15942 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 15943 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 15944 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 15945 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 15946 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 15947 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 15948 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 15949 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 15950 15951 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 15952 format("for (const auto && [a, b] : some_range) {\n}")); 15953 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 15954 format("for (const auto & [a, b] : some_range) {\n}")); 15955 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 15956 format("for (const auto[a, b] : some_range) {\n}")); 15957 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 15958 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 15959 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 15960 EXPECT_EQ("auto const &[x, y](expr);", 15961 format("auto const & [x,y] (expr);")); 15962 EXPECT_EQ("auto const &&[x, y](expr);", 15963 format("auto const && [x,y] (expr);")); 15964 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 15965 EXPECT_EQ("auto const &[x, y]{expr};", 15966 format("auto const & [x,y] {expr};")); 15967 EXPECT_EQ("auto const &&[x, y]{expr};", 15968 format("auto const && [x,y] {expr};")); 15969 15970 format::FormatStyle Spaces = format::getLLVMStyle(); 15971 Spaces.SpacesInSquareBrackets = true; 15972 verifyFormat("auto [ a, b ] = f();", Spaces); 15973 verifyFormat("auto &&[ a, b ] = f();", Spaces); 15974 verifyFormat("auto &[ a, b ] = f();", Spaces); 15975 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 15976 verifyFormat("auto const &[ a, b ] = f();", Spaces); 15977 } 15978 15979 TEST_F(FormatTest, FileAndCode) { 15980 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 15981 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 15982 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 15983 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 15984 EXPECT_EQ(FormatStyle::LK_ObjC, 15985 guessLanguage("foo.h", "@interface Foo\n@end\n")); 15986 EXPECT_EQ( 15987 FormatStyle::LK_ObjC, 15988 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 15989 EXPECT_EQ(FormatStyle::LK_ObjC, 15990 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 15991 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 15992 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 15993 EXPECT_EQ(FormatStyle::LK_ObjC, 15994 guessLanguage("foo", "@interface Foo\n@end\n")); 15995 EXPECT_EQ(FormatStyle::LK_ObjC, 15996 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 15997 EXPECT_EQ( 15998 FormatStyle::LK_ObjC, 15999 guessLanguage("foo.h", 16000 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 16001 EXPECT_EQ( 16002 FormatStyle::LK_Cpp, 16003 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 16004 } 16005 16006 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 16007 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 16008 EXPECT_EQ(FormatStyle::LK_ObjC, 16009 guessLanguage("foo.h", "array[[calculator getIndex]];")); 16010 EXPECT_EQ(FormatStyle::LK_Cpp, 16011 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 16012 EXPECT_EQ( 16013 FormatStyle::LK_Cpp, 16014 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 16015 EXPECT_EQ(FormatStyle::LK_ObjC, 16016 guessLanguage("foo.h", "[[noreturn foo] bar];")); 16017 EXPECT_EQ(FormatStyle::LK_Cpp, 16018 guessLanguage("foo.h", "[[clang::fallthrough]];")); 16019 EXPECT_EQ(FormatStyle::LK_ObjC, 16020 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 16021 EXPECT_EQ(FormatStyle::LK_Cpp, 16022 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 16023 EXPECT_EQ(FormatStyle::LK_Cpp, 16024 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 16025 EXPECT_EQ(FormatStyle::LK_ObjC, 16026 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 16027 EXPECT_EQ(FormatStyle::LK_Cpp, 16028 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 16029 EXPECT_EQ( 16030 FormatStyle::LK_Cpp, 16031 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 16032 EXPECT_EQ( 16033 FormatStyle::LK_Cpp, 16034 guessLanguage("foo.h", 16035 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 16036 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 16037 } 16038 16039 TEST_F(FormatTest, GuessLanguageWithCaret) { 16040 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 16041 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 16042 EXPECT_EQ(FormatStyle::LK_ObjC, 16043 guessLanguage("foo.h", "int(^)(char, float);")); 16044 EXPECT_EQ(FormatStyle::LK_ObjC, 16045 guessLanguage("foo.h", "int(^foo)(char, float);")); 16046 EXPECT_EQ(FormatStyle::LK_ObjC, 16047 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 16048 EXPECT_EQ(FormatStyle::LK_ObjC, 16049 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 16050 EXPECT_EQ( 16051 FormatStyle::LK_ObjC, 16052 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 16053 } 16054 16055 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) { 16056 // ASM symbolic names are identifiers that must be surrounded by [] without 16057 // space in between: 16058 // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands 16059 16060 // Example from https://bugs.llvm.org/show_bug.cgi?id=45108. 16061 verifyFormat(R"(// 16062 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result)); 16063 )"); 16064 16065 // A list of several ASM symbolic names. 16066 verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)"); 16067 16068 // ASM symbolic names in inline ASM with inputs and outputs. 16069 verifyFormat(R"(// 16070 asm("cmoveq %1, %2, %[result]" 16071 : [result] "=r"(result) 16072 : "r"(test), "r"(new), "[result]"(old)); 16073 )"); 16074 16075 // ASM symbolic names in inline ASM with no outputs. 16076 verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)"); 16077 } 16078 16079 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 16080 EXPECT_EQ(FormatStyle::LK_Cpp, 16081 guessLanguage("foo.h", "void f() {\n" 16082 " asm (\"mov %[e], %[d]\"\n" 16083 " : [d] \"=rm\" (d)\n" 16084 " [e] \"rm\" (*e));\n" 16085 "}")); 16086 EXPECT_EQ(FormatStyle::LK_Cpp, 16087 guessLanguage("foo.h", "void f() {\n" 16088 " _asm (\"mov %[e], %[d]\"\n" 16089 " : [d] \"=rm\" (d)\n" 16090 " [e] \"rm\" (*e));\n" 16091 "}")); 16092 EXPECT_EQ(FormatStyle::LK_Cpp, 16093 guessLanguage("foo.h", "void f() {\n" 16094 " __asm (\"mov %[e], %[d]\"\n" 16095 " : [d] \"=rm\" (d)\n" 16096 " [e] \"rm\" (*e));\n" 16097 "}")); 16098 EXPECT_EQ(FormatStyle::LK_Cpp, 16099 guessLanguage("foo.h", "void f() {\n" 16100 " __asm__ (\"mov %[e], %[d]\"\n" 16101 " : [d] \"=rm\" (d)\n" 16102 " [e] \"rm\" (*e));\n" 16103 "}")); 16104 EXPECT_EQ(FormatStyle::LK_Cpp, 16105 guessLanguage("foo.h", "void f() {\n" 16106 " asm (\"mov %[e], %[d]\"\n" 16107 " : [d] \"=rm\" (d),\n" 16108 " [e] \"rm\" (*e));\n" 16109 "}")); 16110 EXPECT_EQ(FormatStyle::LK_Cpp, 16111 guessLanguage("foo.h", "void f() {\n" 16112 " asm volatile (\"mov %[e], %[d]\"\n" 16113 " : [d] \"=rm\" (d)\n" 16114 " [e] \"rm\" (*e));\n" 16115 "}")); 16116 } 16117 16118 TEST_F(FormatTest, GuessLanguageWithChildLines) { 16119 EXPECT_EQ(FormatStyle::LK_Cpp, 16120 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 16121 EXPECT_EQ(FormatStyle::LK_ObjC, 16122 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 16123 EXPECT_EQ( 16124 FormatStyle::LK_Cpp, 16125 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 16126 EXPECT_EQ( 16127 FormatStyle::LK_ObjC, 16128 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 16129 } 16130 16131 TEST_F(FormatTest, TypenameMacros) { 16132 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 16133 16134 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 16135 FormatStyle Google = getGoogleStyleWithColumns(0); 16136 Google.TypenameMacros = TypenameMacros; 16137 verifyFormat("struct foo {\n" 16138 " int bar;\n" 16139 " TAILQ_ENTRY(a) bleh;\n" 16140 "};", 16141 Google); 16142 16143 FormatStyle Macros = getLLVMStyle(); 16144 Macros.TypenameMacros = TypenameMacros; 16145 16146 verifyFormat("STACK_OF(int) a;", Macros); 16147 verifyFormat("STACK_OF(int) *a;", Macros); 16148 verifyFormat("STACK_OF(int const *) *a;", Macros); 16149 verifyFormat("STACK_OF(int *const) *a;", Macros); 16150 verifyFormat("STACK_OF(int, string) a;", Macros); 16151 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 16152 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 16153 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 16154 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 16155 16156 Macros.PointerAlignment = FormatStyle::PAS_Left; 16157 verifyFormat("STACK_OF(int)* a;", Macros); 16158 verifyFormat("STACK_OF(int*)* a;", Macros); 16159 } 16160 16161 TEST_F(FormatTest, AmbersandInLamda) { 16162 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 16163 FormatStyle AlignStyle = getLLVMStyle(); 16164 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 16165 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 16166 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 16167 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 16168 } 16169 16170 TEST_F(FormatTest, SpacesInConditionalStatement) { 16171 FormatStyle Spaces = getLLVMStyle(); 16172 Spaces.SpacesInConditionalStatement = true; 16173 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 16174 verifyFormat("if ( !a )\n return;", Spaces); 16175 verifyFormat("if ( a )\n return;", Spaces); 16176 verifyFormat("if constexpr ( a )\n return;", Spaces); 16177 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 16178 verifyFormat("while ( a )\n return;", Spaces); 16179 verifyFormat("while ( (a && b) )\n return;", Spaces); 16180 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 16181 verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces); 16182 // Check that space on the left of "::" is inserted as expected at beginning 16183 // of condition. 16184 verifyFormat("while ( ::func() )\n return;", Spaces); 16185 } 16186 16187 TEST_F(FormatTest, AlternativeOperators) { 16188 // Test case for ensuring alternate operators are not 16189 // combined with their right most neighbour. 16190 verifyFormat("int a and b;"); 16191 verifyFormat("int a and_eq b;"); 16192 verifyFormat("int a bitand b;"); 16193 verifyFormat("int a bitor b;"); 16194 verifyFormat("int a compl b;"); 16195 verifyFormat("int a not b;"); 16196 verifyFormat("int a not_eq b;"); 16197 verifyFormat("int a or b;"); 16198 verifyFormat("int a xor b;"); 16199 verifyFormat("int a xor_eq b;"); 16200 verifyFormat("return this not_eq bitand other;"); 16201 verifyFormat("bool operator not_eq(const X bitand other)"); 16202 16203 verifyFormat("int a and 5;"); 16204 verifyFormat("int a and_eq 5;"); 16205 verifyFormat("int a bitand 5;"); 16206 verifyFormat("int a bitor 5;"); 16207 verifyFormat("int a compl 5;"); 16208 verifyFormat("int a not 5;"); 16209 verifyFormat("int a not_eq 5;"); 16210 verifyFormat("int a or 5;"); 16211 verifyFormat("int a xor 5;"); 16212 verifyFormat("int a xor_eq 5;"); 16213 16214 verifyFormat("int a compl(5);"); 16215 verifyFormat("int a not(5);"); 16216 16217 /* FIXME handle alternate tokens 16218 * https://en.cppreference.com/w/cpp/language/operator_alternative 16219 // alternative tokens 16220 verifyFormat("compl foo();"); // ~foo(); 16221 verifyFormat("foo() <%%>;"); // foo(); 16222 verifyFormat("void foo() <%%>;"); // void foo(){} 16223 verifyFormat("int a <:1:>;"); // int a[1];[ 16224 verifyFormat("%:define ABC abc"); // #define ABC abc 16225 verifyFormat("%:%:"); // ## 16226 */ 16227 } 16228 16229 TEST_F(FormatTest, STLWhileNotDefineChed) { 16230 verifyFormat("#if defined(while)\n" 16231 "#define while EMIT WARNING C4005\n" 16232 "#endif // while"); 16233 } 16234 16235 TEST_F(FormatTest, OperatorSpacing) { 16236 FormatStyle Style = getLLVMStyle(); 16237 Style.PointerAlignment = FormatStyle::PAS_Right; 16238 verifyFormat("Foo::operator*();", Style); 16239 verifyFormat("Foo::operator void *();", Style); 16240 verifyFormat("Foo::operator void **();", Style); 16241 verifyFormat("Foo::operator void *&();", Style); 16242 verifyFormat("Foo::operator void *&&();", Style); 16243 verifyFormat("Foo::operator()(void *);", Style); 16244 verifyFormat("Foo::operator*(void *);", Style); 16245 verifyFormat("Foo::operator*();", Style); 16246 verifyFormat("Foo::operator**();", Style); 16247 verifyFormat("Foo::operator&();", Style); 16248 verifyFormat("Foo::operator<int> *();", Style); 16249 verifyFormat("Foo::operator<Foo> *();", Style); 16250 verifyFormat("Foo::operator<int> **();", Style); 16251 verifyFormat("Foo::operator<Foo> **();", Style); 16252 verifyFormat("Foo::operator<int> &();", Style); 16253 verifyFormat("Foo::operator<Foo> &();", Style); 16254 verifyFormat("Foo::operator<int> &&();", Style); 16255 verifyFormat("Foo::operator<Foo> &&();", Style); 16256 verifyFormat("Foo::operator<int> *&();", Style); 16257 verifyFormat("Foo::operator<Foo> *&();", Style); 16258 verifyFormat("Foo::operator<int> *&&();", Style); 16259 verifyFormat("Foo::operator<Foo> *&&();", Style); 16260 verifyFormat("operator*(int (*)(), class Foo);", Style); 16261 16262 verifyFormat("Foo::operator&();", Style); 16263 verifyFormat("Foo::operator void &();", Style); 16264 verifyFormat("Foo::operator()(void &);", Style); 16265 verifyFormat("Foo::operator&(void &);", Style); 16266 verifyFormat("Foo::operator&();", Style); 16267 verifyFormat("operator&(int (&)(), class Foo);", Style); 16268 16269 verifyFormat("Foo::operator&&();", Style); 16270 verifyFormat("Foo::operator**();", Style); 16271 verifyFormat("Foo::operator void &&();", Style); 16272 verifyFormat("Foo::operator()(void &&);", Style); 16273 verifyFormat("Foo::operator&&(void &&);", Style); 16274 verifyFormat("Foo::operator&&();", Style); 16275 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 16276 verifyFormat("operator const nsTArrayRight<E> &()", Style); 16277 verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()", 16278 Style); 16279 verifyFormat("operator void **()", Style); 16280 verifyFormat("operator const FooRight<Object> &()", Style); 16281 verifyFormat("operator const FooRight<Object> *()", Style); 16282 verifyFormat("operator const FooRight<Object> **()", Style); 16283 verifyFormat("operator const FooRight<Object> *&()", Style); 16284 verifyFormat("operator const FooRight<Object> *&&()", Style); 16285 16286 Style.PointerAlignment = FormatStyle::PAS_Left; 16287 verifyFormat("Foo::operator*();", Style); 16288 verifyFormat("Foo::operator**();", Style); 16289 verifyFormat("Foo::operator void*();", Style); 16290 verifyFormat("Foo::operator void**();", Style); 16291 verifyFormat("Foo::operator void*&();", Style); 16292 verifyFormat("Foo::operator/*comment*/ void*();", Style); 16293 verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); 16294 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); 16295 verifyFormat("Foo::operator()(void*);", Style); 16296 verifyFormat("Foo::operator*(void*);", Style); 16297 verifyFormat("Foo::operator*();", Style); 16298 verifyFormat("Foo::operator<int>*();", Style); 16299 verifyFormat("Foo::operator<Foo>*();", Style); 16300 verifyFormat("Foo::operator<int>**();", Style); 16301 verifyFormat("Foo::operator<Foo>**();", Style); 16302 verifyFormat("Foo::operator<Foo>*&();", Style); 16303 verifyFormat("Foo::operator<int>&();", Style); 16304 verifyFormat("Foo::operator<Foo>&();", Style); 16305 verifyFormat("Foo::operator<int>&&();", Style); 16306 verifyFormat("Foo::operator<Foo>&&();", Style); 16307 verifyFormat("Foo::operator<int>*&();", Style); 16308 verifyFormat("Foo::operator<Foo>*&();", Style); 16309 verifyFormat("operator*(int (*)(), class Foo);", Style); 16310 16311 verifyFormat("Foo::operator&();", Style); 16312 verifyFormat("Foo::operator void&();", Style); 16313 verifyFormat("Foo::operator/*comment*/ void&();", Style); 16314 verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); 16315 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); 16316 verifyFormat("Foo::operator()(void&);", Style); 16317 verifyFormat("Foo::operator&(void&);", Style); 16318 verifyFormat("Foo::operator&();", Style); 16319 verifyFormat("operator&(int (&)(), class Foo);", Style); 16320 16321 verifyFormat("Foo::operator&&();", Style); 16322 verifyFormat("Foo::operator void&&();", Style); 16323 verifyFormat("Foo::operator/*comment*/ void&&();", Style); 16324 verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); 16325 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); 16326 verifyFormat("Foo::operator()(void&&);", Style); 16327 verifyFormat("Foo::operator&&(void&&);", Style); 16328 verifyFormat("Foo::operator&&();", Style); 16329 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 16330 verifyFormat("operator const nsTArrayLeft<E>&()", Style); 16331 verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()", 16332 Style); 16333 verifyFormat("operator void**()", Style); 16334 verifyFormat("operator const FooLeft<Object>&()", Style); 16335 verifyFormat("operator const FooLeft<Object>*()", Style); 16336 verifyFormat("operator const FooLeft<Object>**()", Style); 16337 verifyFormat("operator const FooLeft<Object>*&()", Style); 16338 verifyFormat("operator const FooLeft<Object>*&&()", Style); 16339 16340 // PR45107 16341 verifyFormat("operator Vector<String>&();", Style); 16342 verifyFormat("operator const Vector<String>&();", Style); 16343 verifyFormat("operator foo::Bar*();", Style); 16344 verifyFormat("operator const Foo<X>::Bar<Y>*();", Style); 16345 verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();", 16346 Style); 16347 16348 Style.PointerAlignment = FormatStyle::PAS_Middle; 16349 verifyFormat("Foo::operator*();", Style); 16350 verifyFormat("Foo::operator void *();", Style); 16351 verifyFormat("Foo::operator()(void *);", Style); 16352 verifyFormat("Foo::operator*(void *);", Style); 16353 verifyFormat("Foo::operator*();", Style); 16354 verifyFormat("operator*(int (*)(), class Foo);", Style); 16355 16356 verifyFormat("Foo::operator&();", Style); 16357 verifyFormat("Foo::operator void &();", Style); 16358 verifyFormat("Foo::operator()(void &);", Style); 16359 verifyFormat("Foo::operator&(void &);", Style); 16360 verifyFormat("Foo::operator&();", Style); 16361 verifyFormat("operator&(int (&)(), class Foo);", Style); 16362 16363 verifyFormat("Foo::operator&&();", Style); 16364 verifyFormat("Foo::operator void &&();", Style); 16365 verifyFormat("Foo::operator()(void &&);", Style); 16366 verifyFormat("Foo::operator&&(void &&);", Style); 16367 verifyFormat("Foo::operator&&();", Style); 16368 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 16369 } 16370 16371 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) { 16372 // These tests are not in NamespaceFixer because that doesn't 16373 // test its interaction with line wrapping 16374 FormatStyle Style = getLLVMStyle(); 16375 Style.ColumnLimit = 80; 16376 verifyFormat("namespace {\n" 16377 "int i;\n" 16378 "int j;\n" 16379 "} // namespace", 16380 Style); 16381 16382 verifyFormat("namespace AAA {\n" 16383 "int i;\n" 16384 "int j;\n" 16385 "} // namespace AAA", 16386 Style); 16387 16388 EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n" 16389 "int i;\n" 16390 "int j;\n" 16391 "} // namespace Averyveryveryverylongnamespace", 16392 format("namespace Averyveryveryverylongnamespace {\n" 16393 "int i;\n" 16394 "int j;\n" 16395 "}", 16396 Style)); 16397 16398 EXPECT_EQ( 16399 "namespace " 16400 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 16401 " went::mad::now {\n" 16402 "int i;\n" 16403 "int j;\n" 16404 "} // namespace\n" 16405 " // " 16406 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 16407 "went::mad::now", 16408 format("namespace " 16409 "would::it::save::you::a::lot::of::time::if_::i::" 16410 "just::gave::up::and_::went::mad::now {\n" 16411 "int i;\n" 16412 "int j;\n" 16413 "}", 16414 Style)); 16415 16416 // This used to duplicate the comment again and again on subsequent runs 16417 EXPECT_EQ( 16418 "namespace " 16419 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 16420 " went::mad::now {\n" 16421 "int i;\n" 16422 "int j;\n" 16423 "} // namespace\n" 16424 " // " 16425 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 16426 "went::mad::now", 16427 format("namespace " 16428 "would::it::save::you::a::lot::of::time::if_::i::" 16429 "just::gave::up::and_::went::mad::now {\n" 16430 "int i;\n" 16431 "int j;\n" 16432 "} // namespace\n" 16433 " // " 16434 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::" 16435 "and_::went::mad::now", 16436 Style)); 16437 } 16438 16439 TEST_F(FormatTest, LikelyUnlikely) { 16440 FormatStyle Style = getLLVMStyle(); 16441 16442 verifyFormat("if (argc > 5) [[unlikely]] {\n" 16443 " return 29;\n" 16444 "}", 16445 Style); 16446 16447 verifyFormat("if (argc > 5) [[likely]] {\n" 16448 " return 29;\n" 16449 "}", 16450 Style); 16451 16452 verifyFormat("if (argc > 5) [[unlikely]] {\n" 16453 " return 29;\n" 16454 "} else [[likely]] {\n" 16455 " return 42;\n" 16456 "}\n", 16457 Style); 16458 16459 verifyFormat("if (argc > 5) [[unlikely]] {\n" 16460 " return 29;\n" 16461 "} else if (argc > 10) [[likely]] {\n" 16462 " return 99;\n" 16463 "} else {\n" 16464 " return 42;\n" 16465 "}\n", 16466 Style); 16467 } 16468 16469 } // namespace 16470 } // namespace format 16471 } // namespace clang 16472