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 999 TEST_F(FormatTest, FormatsWhileLoop) { 1000 verifyFormat("while (true) {\n}"); 1001 verifyFormat("while (true)\n" 1002 " f();"); 1003 verifyFormat("while () {\n}"); 1004 verifyFormat("while () {\n" 1005 " f();\n" 1006 "}"); 1007 } 1008 1009 TEST_F(FormatTest, FormatsDoWhile) { 1010 verifyFormat("do {\n" 1011 " do_something();\n" 1012 "} while (something());"); 1013 verifyFormat("do\n" 1014 " do_something();\n" 1015 "while (something());"); 1016 } 1017 1018 TEST_F(FormatTest, FormatsSwitchStatement) { 1019 verifyFormat("switch (x) {\n" 1020 "case 1:\n" 1021 " f();\n" 1022 " break;\n" 1023 "case kFoo:\n" 1024 "case ns::kBar:\n" 1025 "case kBaz:\n" 1026 " break;\n" 1027 "default:\n" 1028 " g();\n" 1029 " break;\n" 1030 "}"); 1031 verifyFormat("switch (x) {\n" 1032 "case 1: {\n" 1033 " f();\n" 1034 " break;\n" 1035 "}\n" 1036 "case 2: {\n" 1037 " break;\n" 1038 "}\n" 1039 "}"); 1040 verifyFormat("switch (x) {\n" 1041 "case 1: {\n" 1042 " f();\n" 1043 " {\n" 1044 " g();\n" 1045 " h();\n" 1046 " }\n" 1047 " break;\n" 1048 "}\n" 1049 "}"); 1050 verifyFormat("switch (x) {\n" 1051 "case 1: {\n" 1052 " f();\n" 1053 " if (foo) {\n" 1054 " g();\n" 1055 " h();\n" 1056 " }\n" 1057 " break;\n" 1058 "}\n" 1059 "}"); 1060 verifyFormat("switch (x) {\n" 1061 "case 1: {\n" 1062 " f();\n" 1063 " g();\n" 1064 "} break;\n" 1065 "}"); 1066 verifyFormat("switch (test)\n" 1067 " ;"); 1068 verifyFormat("switch (x) {\n" 1069 "default: {\n" 1070 " // Do nothing.\n" 1071 "}\n" 1072 "}"); 1073 verifyFormat("switch (x) {\n" 1074 "// comment\n" 1075 "// if 1, do f()\n" 1076 "case 1:\n" 1077 " f();\n" 1078 "}"); 1079 verifyFormat("switch (x) {\n" 1080 "case 1:\n" 1081 " // Do amazing stuff\n" 1082 " {\n" 1083 " f();\n" 1084 " g();\n" 1085 " }\n" 1086 " break;\n" 1087 "}"); 1088 verifyFormat("#define A \\\n" 1089 " switch (x) { \\\n" 1090 " case a: \\\n" 1091 " foo = b; \\\n" 1092 " }", 1093 getLLVMStyleWithColumns(20)); 1094 verifyFormat("#define OPERATION_CASE(name) \\\n" 1095 " case OP_name: \\\n" 1096 " return operations::Operation##name\n", 1097 getLLVMStyleWithColumns(40)); 1098 verifyFormat("switch (x) {\n" 1099 "case 1:;\n" 1100 "default:;\n" 1101 " int i;\n" 1102 "}"); 1103 1104 verifyGoogleFormat("switch (x) {\n" 1105 " case 1:\n" 1106 " f();\n" 1107 " break;\n" 1108 " case kFoo:\n" 1109 " case ns::kBar:\n" 1110 " case kBaz:\n" 1111 " break;\n" 1112 " default:\n" 1113 " g();\n" 1114 " break;\n" 1115 "}"); 1116 verifyGoogleFormat("switch (x) {\n" 1117 " case 1: {\n" 1118 " f();\n" 1119 " break;\n" 1120 " }\n" 1121 "}"); 1122 verifyGoogleFormat("switch (test)\n" 1123 " ;"); 1124 1125 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1126 " case OP_name: \\\n" 1127 " return operations::Operation##name\n"); 1128 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1129 " // Get the correction operation class.\n" 1130 " switch (OpCode) {\n" 1131 " CASE(Add);\n" 1132 " CASE(Subtract);\n" 1133 " default:\n" 1134 " return operations::Unknown;\n" 1135 " }\n" 1136 "#undef OPERATION_CASE\n" 1137 "}"); 1138 verifyFormat("DEBUG({\n" 1139 " switch (x) {\n" 1140 " case A:\n" 1141 " f();\n" 1142 " break;\n" 1143 " // fallthrough\n" 1144 " case B:\n" 1145 " g();\n" 1146 " break;\n" 1147 " }\n" 1148 "});"); 1149 EXPECT_EQ("DEBUG({\n" 1150 " switch (x) {\n" 1151 " case A:\n" 1152 " f();\n" 1153 " break;\n" 1154 " // On B:\n" 1155 " case B:\n" 1156 " g();\n" 1157 " break;\n" 1158 " }\n" 1159 "});", 1160 format("DEBUG({\n" 1161 " switch (x) {\n" 1162 " case A:\n" 1163 " f();\n" 1164 " break;\n" 1165 " // On B:\n" 1166 " case B:\n" 1167 " g();\n" 1168 " break;\n" 1169 " }\n" 1170 "});", 1171 getLLVMStyle())); 1172 EXPECT_EQ("switch (n) {\n" 1173 "case 0: {\n" 1174 " return false;\n" 1175 "}\n" 1176 "default: {\n" 1177 " return true;\n" 1178 "}\n" 1179 "}", 1180 format("switch (n)\n" 1181 "{\n" 1182 "case 0: {\n" 1183 " return false;\n" 1184 "}\n" 1185 "default: {\n" 1186 " return true;\n" 1187 "}\n" 1188 "}", 1189 getLLVMStyle())); 1190 verifyFormat("switch (a) {\n" 1191 "case (b):\n" 1192 " return;\n" 1193 "}"); 1194 1195 verifyFormat("switch (a) {\n" 1196 "case some_namespace::\n" 1197 " some_constant:\n" 1198 " return;\n" 1199 "}", 1200 getLLVMStyleWithColumns(34)); 1201 1202 FormatStyle Style = getLLVMStyle(); 1203 Style.IndentCaseLabels = true; 1204 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1205 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1206 Style.BraceWrapping.AfterCaseLabel = true; 1207 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1208 EXPECT_EQ("switch (n)\n" 1209 "{\n" 1210 " case 0:\n" 1211 " {\n" 1212 " return false;\n" 1213 " }\n" 1214 " default:\n" 1215 " {\n" 1216 " return true;\n" 1217 " }\n" 1218 "}", 1219 format("switch (n) {\n" 1220 " case 0: {\n" 1221 " return false;\n" 1222 " }\n" 1223 " default: {\n" 1224 " return true;\n" 1225 " }\n" 1226 "}", 1227 Style)); 1228 Style.BraceWrapping.AfterCaseLabel = false; 1229 EXPECT_EQ("switch (n)\n" 1230 "{\n" 1231 " case 0: {\n" 1232 " return false;\n" 1233 " }\n" 1234 " default: {\n" 1235 " return true;\n" 1236 " }\n" 1237 "}", 1238 format("switch (n) {\n" 1239 " case 0:\n" 1240 " {\n" 1241 " return false;\n" 1242 " }\n" 1243 " default:\n" 1244 " {\n" 1245 " return true;\n" 1246 " }\n" 1247 "}", 1248 Style)); 1249 Style.IndentCaseLabels = false; 1250 Style.IndentCaseBlocks = true; 1251 EXPECT_EQ("switch (n)\n" 1252 "{\n" 1253 "case 0:\n" 1254 " {\n" 1255 " return false;\n" 1256 " }\n" 1257 "case 1:\n" 1258 " break;\n" 1259 "default:\n" 1260 " {\n" 1261 " return true;\n" 1262 " }\n" 1263 "}", 1264 format("switch (n) {\n" 1265 "case 0: {\n" 1266 " return false;\n" 1267 "}\n" 1268 "case 1:\n" 1269 " break;\n" 1270 "default: {\n" 1271 " return true;\n" 1272 "}\n" 1273 "}", 1274 Style)); 1275 Style.IndentCaseLabels = true; 1276 Style.IndentCaseBlocks = true; 1277 EXPECT_EQ("switch (n)\n" 1278 "{\n" 1279 " case 0:\n" 1280 " {\n" 1281 " return false;\n" 1282 " }\n" 1283 " case 1:\n" 1284 " break;\n" 1285 " default:\n" 1286 " {\n" 1287 " return true;\n" 1288 " }\n" 1289 "}", 1290 format("switch (n) {\n" 1291 "case 0: {\n" 1292 " return false;\n" 1293 "}\n" 1294 "case 1:\n" 1295 " break;\n" 1296 "default: {\n" 1297 " return true;\n" 1298 "}\n" 1299 "}", 1300 Style)); 1301 } 1302 1303 TEST_F(FormatTest, CaseRanges) { 1304 verifyFormat("switch (x) {\n" 1305 "case 'A' ... 'Z':\n" 1306 "case 1 ... 5:\n" 1307 "case a ... b:\n" 1308 " break;\n" 1309 "}"); 1310 } 1311 1312 TEST_F(FormatTest, ShortEnums) { 1313 FormatStyle Style = getLLVMStyle(); 1314 Style.AllowShortEnumsOnASingleLine = true; 1315 verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style); 1316 Style.AllowShortEnumsOnASingleLine = false; 1317 verifyFormat("enum\n" 1318 "{\n" 1319 " A,\n" 1320 " B,\n" 1321 " C\n" 1322 "} ShortEnum1, ShortEnum2;", 1323 Style); 1324 } 1325 1326 TEST_F(FormatTest, ShortCaseLabels) { 1327 FormatStyle Style = getLLVMStyle(); 1328 Style.AllowShortCaseLabelsOnASingleLine = true; 1329 verifyFormat("switch (a) {\n" 1330 "case 1: x = 1; break;\n" 1331 "case 2: return;\n" 1332 "case 3:\n" 1333 "case 4:\n" 1334 "case 5: return;\n" 1335 "case 6: // comment\n" 1336 " return;\n" 1337 "case 7:\n" 1338 " // comment\n" 1339 " return;\n" 1340 "case 8:\n" 1341 " x = 8; // comment\n" 1342 " break;\n" 1343 "default: y = 1; break;\n" 1344 "}", 1345 Style); 1346 verifyFormat("switch (a) {\n" 1347 "case 0: return; // comment\n" 1348 "case 1: break; // comment\n" 1349 "case 2: return;\n" 1350 "// comment\n" 1351 "case 3: return;\n" 1352 "// comment 1\n" 1353 "// comment 2\n" 1354 "// comment 3\n" 1355 "case 4: break; /* comment */\n" 1356 "case 5:\n" 1357 " // comment\n" 1358 " break;\n" 1359 "case 6: /* comment */ x = 1; break;\n" 1360 "case 7: x = /* comment */ 1; break;\n" 1361 "case 8:\n" 1362 " x = 1; /* comment */\n" 1363 " break;\n" 1364 "case 9:\n" 1365 " break; // comment line 1\n" 1366 " // comment line 2\n" 1367 "}", 1368 Style); 1369 EXPECT_EQ("switch (a) {\n" 1370 "case 1:\n" 1371 " x = 8;\n" 1372 " // fall through\n" 1373 "case 2: x = 8;\n" 1374 "// comment\n" 1375 "case 3:\n" 1376 " return; /* comment line 1\n" 1377 " * comment line 2 */\n" 1378 "case 4: i = 8;\n" 1379 "// something else\n" 1380 "#if FOO\n" 1381 "case 5: break;\n" 1382 "#endif\n" 1383 "}", 1384 format("switch (a) {\n" 1385 "case 1: x = 8;\n" 1386 " // fall through\n" 1387 "case 2:\n" 1388 " x = 8;\n" 1389 "// comment\n" 1390 "case 3:\n" 1391 " return; /* comment line 1\n" 1392 " * comment line 2 */\n" 1393 "case 4:\n" 1394 " i = 8;\n" 1395 "// something else\n" 1396 "#if FOO\n" 1397 "case 5: break;\n" 1398 "#endif\n" 1399 "}", 1400 Style)); 1401 EXPECT_EQ("switch (a) {\n" 1402 "case 0:\n" 1403 " return; // long long long long long long long long long long " 1404 "long long comment\n" 1405 " // line\n" 1406 "}", 1407 format("switch (a) {\n" 1408 "case 0: return; // long long long long long long long long " 1409 "long long long long comment line\n" 1410 "}", 1411 Style)); 1412 EXPECT_EQ("switch (a) {\n" 1413 "case 0:\n" 1414 " return; /* long long long long long long long long long long " 1415 "long long comment\n" 1416 " line */\n" 1417 "}", 1418 format("switch (a) {\n" 1419 "case 0: return; /* long long long long long long long long " 1420 "long long long long comment line */\n" 1421 "}", 1422 Style)); 1423 verifyFormat("switch (a) {\n" 1424 "#if FOO\n" 1425 "case 0: return 0;\n" 1426 "#endif\n" 1427 "}", 1428 Style); 1429 verifyFormat("switch (a) {\n" 1430 "case 1: {\n" 1431 "}\n" 1432 "case 2: {\n" 1433 " return;\n" 1434 "}\n" 1435 "case 3: {\n" 1436 " x = 1;\n" 1437 " return;\n" 1438 "}\n" 1439 "case 4:\n" 1440 " if (x)\n" 1441 " return;\n" 1442 "}", 1443 Style); 1444 Style.ColumnLimit = 21; 1445 verifyFormat("switch (a) {\n" 1446 "case 1: x = 1; break;\n" 1447 "case 2: return;\n" 1448 "case 3:\n" 1449 "case 4:\n" 1450 "case 5: return;\n" 1451 "default:\n" 1452 " y = 1;\n" 1453 " break;\n" 1454 "}", 1455 Style); 1456 Style.ColumnLimit = 80; 1457 Style.AllowShortCaseLabelsOnASingleLine = false; 1458 Style.IndentCaseLabels = true; 1459 EXPECT_EQ("switch (n) {\n" 1460 " default /*comments*/:\n" 1461 " return true;\n" 1462 " case 0:\n" 1463 " return false;\n" 1464 "}", 1465 format("switch (n) {\n" 1466 "default/*comments*/:\n" 1467 " return true;\n" 1468 "case 0:\n" 1469 " return false;\n" 1470 "}", 1471 Style)); 1472 Style.AllowShortCaseLabelsOnASingleLine = true; 1473 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1474 Style.BraceWrapping.AfterCaseLabel = true; 1475 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1476 EXPECT_EQ("switch (n)\n" 1477 "{\n" 1478 " case 0:\n" 1479 " {\n" 1480 " return false;\n" 1481 " }\n" 1482 " default:\n" 1483 " {\n" 1484 " return true;\n" 1485 " }\n" 1486 "}", 1487 format("switch (n) {\n" 1488 " case 0: {\n" 1489 " return false;\n" 1490 " }\n" 1491 " default:\n" 1492 " {\n" 1493 " return true;\n" 1494 " }\n" 1495 "}", 1496 Style)); 1497 } 1498 1499 TEST_F(FormatTest, FormatsLabels) { 1500 verifyFormat("void f() {\n" 1501 " some_code();\n" 1502 "test_label:\n" 1503 " some_other_code();\n" 1504 " {\n" 1505 " some_more_code();\n" 1506 " another_label:\n" 1507 " some_more_code();\n" 1508 " }\n" 1509 "}"); 1510 verifyFormat("{\n" 1511 " some_code();\n" 1512 "test_label:\n" 1513 " some_other_code();\n" 1514 "}"); 1515 verifyFormat("{\n" 1516 " some_code();\n" 1517 "test_label:;\n" 1518 " int i = 0;\n" 1519 "}"); 1520 FormatStyle Style = getLLVMStyle(); 1521 Style.IndentGotoLabels = false; 1522 verifyFormat("void f() {\n" 1523 " some_code();\n" 1524 "test_label:\n" 1525 " some_other_code();\n" 1526 " {\n" 1527 " some_more_code();\n" 1528 "another_label:\n" 1529 " some_more_code();\n" 1530 " }\n" 1531 "}", 1532 Style); 1533 verifyFormat("{\n" 1534 " some_code();\n" 1535 "test_label:\n" 1536 " some_other_code();\n" 1537 "}", 1538 Style); 1539 verifyFormat("{\n" 1540 " some_code();\n" 1541 "test_label:;\n" 1542 " int i = 0;\n" 1543 "}"); 1544 } 1545 1546 TEST_F(FormatTest, MultiLineControlStatements) { 1547 FormatStyle Style = getLLVMStyle(); 1548 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1549 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; 1550 Style.ColumnLimit = 20; 1551 // Short lines should keep opening brace on same line. 1552 EXPECT_EQ("if (foo) {\n" 1553 " bar();\n" 1554 "}", 1555 format("if(foo){bar();}", Style)); 1556 EXPECT_EQ("if (foo) {\n" 1557 " bar();\n" 1558 "} else {\n" 1559 " baz();\n" 1560 "}", 1561 format("if(foo){bar();}else{baz();}", Style)); 1562 EXPECT_EQ("if (foo && bar) {\n" 1563 " baz();\n" 1564 "}", 1565 format("if(foo&&bar){baz();}", Style)); 1566 EXPECT_EQ("if (foo) {\n" 1567 " bar();\n" 1568 "} else if (baz) {\n" 1569 " quux();\n" 1570 "}", 1571 format("if(foo){bar();}else if(baz){quux();}", Style)); 1572 EXPECT_EQ( 1573 "if (foo) {\n" 1574 " bar();\n" 1575 "} else if (baz) {\n" 1576 " quux();\n" 1577 "} else {\n" 1578 " foobar();\n" 1579 "}", 1580 format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); 1581 EXPECT_EQ("for (;;) {\n" 1582 " foo();\n" 1583 "}", 1584 format("for(;;){foo();}")); 1585 EXPECT_EQ("while (1) {\n" 1586 " foo();\n" 1587 "}", 1588 format("while(1){foo();}", Style)); 1589 EXPECT_EQ("switch (foo) {\n" 1590 "case bar:\n" 1591 " return;\n" 1592 "}", 1593 format("switch(foo){case bar:return;}", Style)); 1594 EXPECT_EQ("try {\n" 1595 " foo();\n" 1596 "} catch (...) {\n" 1597 " bar();\n" 1598 "}", 1599 format("try{foo();}catch(...){bar();}", Style)); 1600 EXPECT_EQ("do {\n" 1601 " foo();\n" 1602 "} while (bar &&\n" 1603 " baz);", 1604 format("do{foo();}while(bar&&baz);", Style)); 1605 // Long lines should put opening brace on new line. 1606 EXPECT_EQ("if (foo && bar &&\n" 1607 " baz)\n" 1608 "{\n" 1609 " quux();\n" 1610 "}", 1611 format("if(foo&&bar&&baz){quux();}", Style)); 1612 EXPECT_EQ("if (foo && bar &&\n" 1613 " baz)\n" 1614 "{\n" 1615 " quux();\n" 1616 "}", 1617 format("if (foo && bar &&\n" 1618 " baz) {\n" 1619 " quux();\n" 1620 "}", 1621 Style)); 1622 EXPECT_EQ("if (foo) {\n" 1623 " bar();\n" 1624 "} else if (baz ||\n" 1625 " quux)\n" 1626 "{\n" 1627 " foobar();\n" 1628 "}", 1629 format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); 1630 EXPECT_EQ( 1631 "if (foo) {\n" 1632 " bar();\n" 1633 "} else if (baz ||\n" 1634 " quux)\n" 1635 "{\n" 1636 " foobar();\n" 1637 "} else {\n" 1638 " barbaz();\n" 1639 "}", 1640 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1641 Style)); 1642 EXPECT_EQ("for (int i = 0;\n" 1643 " i < 10; ++i)\n" 1644 "{\n" 1645 " foo();\n" 1646 "}", 1647 format("for(int i=0;i<10;++i){foo();}", Style)); 1648 EXPECT_EQ("while (foo || bar ||\n" 1649 " baz)\n" 1650 "{\n" 1651 " quux();\n" 1652 "}", 1653 format("while(foo||bar||baz){quux();}", Style)); 1654 EXPECT_EQ("switch (\n" 1655 " foo = barbaz)\n" 1656 "{\n" 1657 "case quux:\n" 1658 " return;\n" 1659 "}", 1660 format("switch(foo=barbaz){case quux:return;}", Style)); 1661 EXPECT_EQ("try {\n" 1662 " foo();\n" 1663 "} catch (\n" 1664 " Exception &bar)\n" 1665 "{\n" 1666 " baz();\n" 1667 "}", 1668 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1669 Style.ColumnLimit = 1670 40; // to concentrate at brace wrapping, not line wrap due to column limit 1671 EXPECT_EQ("try {\n" 1672 " foo();\n" 1673 "} catch (Exception &bar) {\n" 1674 " baz();\n" 1675 "}", 1676 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1677 Style.ColumnLimit = 1678 20; // to concentrate at brace wrapping, not line wrap due to column limit 1679 1680 Style.BraceWrapping.BeforeElse = true; 1681 EXPECT_EQ( 1682 "if (foo) {\n" 1683 " bar();\n" 1684 "}\n" 1685 "else if (baz ||\n" 1686 " quux)\n" 1687 "{\n" 1688 " foobar();\n" 1689 "}\n" 1690 "else {\n" 1691 " barbaz();\n" 1692 "}", 1693 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1694 Style)); 1695 1696 Style.BraceWrapping.BeforeCatch = true; 1697 EXPECT_EQ("try {\n" 1698 " foo();\n" 1699 "}\n" 1700 "catch (...) {\n" 1701 " baz();\n" 1702 "}", 1703 format("try{foo();}catch(...){baz();}", Style)); 1704 } 1705 1706 //===----------------------------------------------------------------------===// 1707 // Tests for classes, namespaces, etc. 1708 //===----------------------------------------------------------------------===// 1709 1710 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1711 verifyFormat("class A {};"); 1712 } 1713 1714 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1715 verifyFormat("class A {\n" 1716 "public:\n" 1717 "public: // comment\n" 1718 "protected:\n" 1719 "private:\n" 1720 " void f() {}\n" 1721 "};"); 1722 verifyFormat("export class A {\n" 1723 "public:\n" 1724 "public: // comment\n" 1725 "protected:\n" 1726 "private:\n" 1727 " void f() {}\n" 1728 "};"); 1729 verifyGoogleFormat("class A {\n" 1730 " public:\n" 1731 " protected:\n" 1732 " private:\n" 1733 " void f() {}\n" 1734 "};"); 1735 verifyGoogleFormat("export class A {\n" 1736 " public:\n" 1737 " protected:\n" 1738 " private:\n" 1739 " void f() {}\n" 1740 "};"); 1741 verifyFormat("class A {\n" 1742 "public slots:\n" 1743 " void f1() {}\n" 1744 "public Q_SLOTS:\n" 1745 " void f2() {}\n" 1746 "protected slots:\n" 1747 " void f3() {}\n" 1748 "protected Q_SLOTS:\n" 1749 " void f4() {}\n" 1750 "private slots:\n" 1751 " void f5() {}\n" 1752 "private Q_SLOTS:\n" 1753 " void f6() {}\n" 1754 "signals:\n" 1755 " void g1();\n" 1756 "Q_SIGNALS:\n" 1757 " void g2();\n" 1758 "};"); 1759 1760 // Don't interpret 'signals' the wrong way. 1761 verifyFormat("signals.set();"); 1762 verifyFormat("for (Signals signals : f()) {\n}"); 1763 verifyFormat("{\n" 1764 " signals.set(); // This needs indentation.\n" 1765 "}"); 1766 verifyFormat("void f() {\n" 1767 "label:\n" 1768 " signals.baz();\n" 1769 "}"); 1770 } 1771 1772 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1773 EXPECT_EQ("class A {\n" 1774 "public:\n" 1775 " void f();\n" 1776 "\n" 1777 "private:\n" 1778 " void g() {}\n" 1779 " // test\n" 1780 "protected:\n" 1781 " int h;\n" 1782 "};", 1783 format("class A {\n" 1784 "public:\n" 1785 "void f();\n" 1786 "private:\n" 1787 "void g() {}\n" 1788 "// test\n" 1789 "protected:\n" 1790 "int h;\n" 1791 "};")); 1792 EXPECT_EQ("class A {\n" 1793 "protected:\n" 1794 "public:\n" 1795 " void f();\n" 1796 "};", 1797 format("class A {\n" 1798 "protected:\n" 1799 "\n" 1800 "public:\n" 1801 "\n" 1802 " void f();\n" 1803 "};")); 1804 1805 // Even ensure proper spacing inside macros. 1806 EXPECT_EQ("#define B \\\n" 1807 " class A { \\\n" 1808 " protected: \\\n" 1809 " public: \\\n" 1810 " void f(); \\\n" 1811 " };", 1812 format("#define B \\\n" 1813 " class A { \\\n" 1814 " protected: \\\n" 1815 " \\\n" 1816 " public: \\\n" 1817 " \\\n" 1818 " void f(); \\\n" 1819 " };", 1820 getGoogleStyle())); 1821 // But don't remove empty lines after macros ending in access specifiers. 1822 EXPECT_EQ("#define A private:\n" 1823 "\n" 1824 "int i;", 1825 format("#define A private:\n" 1826 "\n" 1827 "int i;")); 1828 } 1829 1830 TEST_F(FormatTest, FormatsClasses) { 1831 verifyFormat("class A : public B {};"); 1832 verifyFormat("class A : public ::B {};"); 1833 1834 verifyFormat( 1835 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1836 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1837 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1838 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1839 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1840 verifyFormat( 1841 "class A : public B, public C, public D, public E, public F {};"); 1842 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1843 " public C,\n" 1844 " public D,\n" 1845 " public E,\n" 1846 " public F,\n" 1847 " public G {};"); 1848 1849 verifyFormat("class\n" 1850 " ReallyReallyLongClassName {\n" 1851 " int i;\n" 1852 "};", 1853 getLLVMStyleWithColumns(32)); 1854 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1855 " aaaaaaaaaaaaaaaa> {};"); 1856 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1857 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1858 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1859 verifyFormat("template <class R, class C>\n" 1860 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1861 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1862 verifyFormat("class ::A::B {};"); 1863 } 1864 1865 TEST_F(FormatTest, BreakInheritanceStyle) { 1866 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1867 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1868 FormatStyle::BILS_BeforeComma; 1869 verifyFormat("class MyClass : public X {};", 1870 StyleWithInheritanceBreakBeforeComma); 1871 verifyFormat("class MyClass\n" 1872 " : public X\n" 1873 " , public Y {};", 1874 StyleWithInheritanceBreakBeforeComma); 1875 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1876 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1877 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1878 StyleWithInheritanceBreakBeforeComma); 1879 verifyFormat("struct aaaaaaaaaaaaa\n" 1880 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1881 " aaaaaaaaaaaaaaaa> {};", 1882 StyleWithInheritanceBreakBeforeComma); 1883 1884 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1885 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1886 FormatStyle::BILS_AfterColon; 1887 verifyFormat("class MyClass : public X {};", 1888 StyleWithInheritanceBreakAfterColon); 1889 verifyFormat("class MyClass : public X, public Y {};", 1890 StyleWithInheritanceBreakAfterColon); 1891 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1892 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1893 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1894 StyleWithInheritanceBreakAfterColon); 1895 verifyFormat("struct aaaaaaaaaaaaa :\n" 1896 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1897 " aaaaaaaaaaaaaaaa> {};", 1898 StyleWithInheritanceBreakAfterColon); 1899 } 1900 1901 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1902 verifyFormat("class A {\n} a, b;"); 1903 verifyFormat("struct A {\n} a, b;"); 1904 verifyFormat("union A {\n} a;"); 1905 } 1906 1907 TEST_F(FormatTest, FormatsEnum) { 1908 verifyFormat("enum {\n" 1909 " Zero,\n" 1910 " One = 1,\n" 1911 " Two = One + 1,\n" 1912 " Three = (One + Two),\n" 1913 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1914 " Five = (One, Two, Three, Four, 5)\n" 1915 "};"); 1916 verifyGoogleFormat("enum {\n" 1917 " Zero,\n" 1918 " One = 1,\n" 1919 " Two = One + 1,\n" 1920 " Three = (One + Two),\n" 1921 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1922 " Five = (One, Two, Three, Four, 5)\n" 1923 "};"); 1924 verifyFormat("enum Enum {};"); 1925 verifyFormat("enum {};"); 1926 verifyFormat("enum X E {} d;"); 1927 verifyFormat("enum __attribute__((...)) E {} d;"); 1928 verifyFormat("enum __declspec__((...)) E {} d;"); 1929 verifyFormat("enum {\n" 1930 " Bar = Foo<int, int>::value\n" 1931 "};", 1932 getLLVMStyleWithColumns(30)); 1933 1934 verifyFormat("enum ShortEnum { A, B, C };"); 1935 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1936 1937 EXPECT_EQ("enum KeepEmptyLines {\n" 1938 " ONE,\n" 1939 "\n" 1940 " TWO,\n" 1941 "\n" 1942 " THREE\n" 1943 "}", 1944 format("enum KeepEmptyLines {\n" 1945 " ONE,\n" 1946 "\n" 1947 " TWO,\n" 1948 "\n" 1949 "\n" 1950 " THREE\n" 1951 "}")); 1952 verifyFormat("enum E { // comment\n" 1953 " ONE,\n" 1954 " TWO\n" 1955 "};\n" 1956 "int i;"); 1957 1958 FormatStyle EightIndent = getLLVMStyle(); 1959 EightIndent.IndentWidth = 8; 1960 verifyFormat("enum {\n" 1961 " VOID,\n" 1962 " CHAR,\n" 1963 " SHORT,\n" 1964 " INT,\n" 1965 " LONG,\n" 1966 " SIGNED,\n" 1967 " UNSIGNED,\n" 1968 " BOOL,\n" 1969 " FLOAT,\n" 1970 " DOUBLE,\n" 1971 " COMPLEX\n" 1972 "};", 1973 EightIndent); 1974 1975 // Not enums. 1976 verifyFormat("enum X f() {\n" 1977 " a();\n" 1978 " return 42;\n" 1979 "}"); 1980 verifyFormat("enum X Type::f() {\n" 1981 " a();\n" 1982 " return 42;\n" 1983 "}"); 1984 verifyFormat("enum ::X f() {\n" 1985 " a();\n" 1986 " return 42;\n" 1987 "}"); 1988 verifyFormat("enum ns::X f() {\n" 1989 " a();\n" 1990 " return 42;\n" 1991 "}"); 1992 } 1993 1994 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1995 verifyFormat("enum Type {\n" 1996 " One = 0; // These semicolons should be commas.\n" 1997 " Two = 1;\n" 1998 "};"); 1999 verifyFormat("namespace n {\n" 2000 "enum Type {\n" 2001 " One,\n" 2002 " Two, // missing };\n" 2003 " int i;\n" 2004 "}\n" 2005 "void g() {}"); 2006 } 2007 2008 TEST_F(FormatTest, FormatsEnumStruct) { 2009 verifyFormat("enum struct {\n" 2010 " Zero,\n" 2011 " One = 1,\n" 2012 " Two = One + 1,\n" 2013 " Three = (One + Two),\n" 2014 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2015 " Five = (One, Two, Three, Four, 5)\n" 2016 "};"); 2017 verifyFormat("enum struct Enum {};"); 2018 verifyFormat("enum struct {};"); 2019 verifyFormat("enum struct X E {} d;"); 2020 verifyFormat("enum struct __attribute__((...)) E {} d;"); 2021 verifyFormat("enum struct __declspec__((...)) E {} d;"); 2022 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 2023 } 2024 2025 TEST_F(FormatTest, FormatsEnumClass) { 2026 verifyFormat("enum class {\n" 2027 " Zero,\n" 2028 " One = 1,\n" 2029 " Two = One + 1,\n" 2030 " Three = (One + Two),\n" 2031 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2032 " Five = (One, Two, Three, Four, 5)\n" 2033 "};"); 2034 verifyFormat("enum class Enum {};"); 2035 verifyFormat("enum class {};"); 2036 verifyFormat("enum class X E {} d;"); 2037 verifyFormat("enum class __attribute__((...)) E {} d;"); 2038 verifyFormat("enum class __declspec__((...)) E {} d;"); 2039 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 2040 } 2041 2042 TEST_F(FormatTest, FormatsEnumTypes) { 2043 verifyFormat("enum X : int {\n" 2044 " A, // Force multiple lines.\n" 2045 " B\n" 2046 "};"); 2047 verifyFormat("enum X : int { A, B };"); 2048 verifyFormat("enum X : std::uint32_t { A, B };"); 2049 } 2050 2051 TEST_F(FormatTest, FormatsTypedefEnum) { 2052 FormatStyle Style = getLLVMStyle(); 2053 Style.ColumnLimit = 40; 2054 verifyFormat("typedef enum {} EmptyEnum;"); 2055 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2056 verifyFormat("typedef enum {\n" 2057 " ZERO = 0,\n" 2058 " ONE = 1,\n" 2059 " TWO = 2,\n" 2060 " THREE = 3\n" 2061 "} LongEnum;", 2062 Style); 2063 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2064 Style.BraceWrapping.AfterEnum = true; 2065 verifyFormat("typedef enum {} EmptyEnum;"); 2066 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2067 verifyFormat("typedef enum\n" 2068 "{\n" 2069 " ZERO = 0,\n" 2070 " ONE = 1,\n" 2071 " TWO = 2,\n" 2072 " THREE = 3\n" 2073 "} LongEnum;", 2074 Style); 2075 } 2076 2077 TEST_F(FormatTest, FormatsNSEnums) { 2078 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2079 verifyGoogleFormat( 2080 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2081 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 2082 " // Information about someDecentlyLongValue.\n" 2083 " someDecentlyLongValue,\n" 2084 " // Information about anotherDecentlyLongValue.\n" 2085 " anotherDecentlyLongValue,\n" 2086 " // Information about aThirdDecentlyLongValue.\n" 2087 " aThirdDecentlyLongValue\n" 2088 "};"); 2089 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 2090 " // Information about someDecentlyLongValue.\n" 2091 " someDecentlyLongValue,\n" 2092 " // Information about anotherDecentlyLongValue.\n" 2093 " anotherDecentlyLongValue,\n" 2094 " // Information about aThirdDecentlyLongValue.\n" 2095 " aThirdDecentlyLongValue\n" 2096 "};"); 2097 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 2098 " a = 1,\n" 2099 " b = 2,\n" 2100 " c = 3,\n" 2101 "};"); 2102 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 2103 " a = 1,\n" 2104 " b = 2,\n" 2105 " c = 3,\n" 2106 "};"); 2107 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 2108 " a = 1,\n" 2109 " b = 2,\n" 2110 " c = 3,\n" 2111 "};"); 2112 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 2113 " a = 1,\n" 2114 " b = 2,\n" 2115 " c = 3,\n" 2116 "};"); 2117 } 2118 2119 TEST_F(FormatTest, FormatsBitfields) { 2120 verifyFormat("struct Bitfields {\n" 2121 " unsigned sClass : 8;\n" 2122 " unsigned ValueKind : 2;\n" 2123 "};"); 2124 verifyFormat("struct A {\n" 2125 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 2126 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 2127 "};"); 2128 verifyFormat("struct MyStruct {\n" 2129 " uchar data;\n" 2130 " uchar : 8;\n" 2131 " uchar : 8;\n" 2132 " uchar other;\n" 2133 "};"); 2134 } 2135 2136 TEST_F(FormatTest, FormatsNamespaces) { 2137 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 2138 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 2139 2140 verifyFormat("namespace some_namespace {\n" 2141 "class A {};\n" 2142 "void f() { f(); }\n" 2143 "}", 2144 LLVMWithNoNamespaceFix); 2145 verifyFormat("namespace N::inline D {\n" 2146 "class A {};\n" 2147 "void f() { f(); }\n" 2148 "}", 2149 LLVMWithNoNamespaceFix); 2150 verifyFormat("namespace N::inline D::E {\n" 2151 "class A {};\n" 2152 "void f() { f(); }\n" 2153 "}", 2154 LLVMWithNoNamespaceFix); 2155 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 2156 "class A {};\n" 2157 "void f() { f(); }\n" 2158 "}", 2159 LLVMWithNoNamespaceFix); 2160 verifyFormat("/* something */ namespace some_namespace {\n" 2161 "class A {};\n" 2162 "void f() { f(); }\n" 2163 "}", 2164 LLVMWithNoNamespaceFix); 2165 verifyFormat("namespace {\n" 2166 "class A {};\n" 2167 "void f() { f(); }\n" 2168 "}", 2169 LLVMWithNoNamespaceFix); 2170 verifyFormat("/* something */ namespace {\n" 2171 "class A {};\n" 2172 "void f() { f(); }\n" 2173 "}", 2174 LLVMWithNoNamespaceFix); 2175 verifyFormat("inline namespace X {\n" 2176 "class A {};\n" 2177 "void f() { f(); }\n" 2178 "}", 2179 LLVMWithNoNamespaceFix); 2180 verifyFormat("/* something */ inline namespace X {\n" 2181 "class A {};\n" 2182 "void f() { f(); }\n" 2183 "}", 2184 LLVMWithNoNamespaceFix); 2185 verifyFormat("export namespace X {\n" 2186 "class A {};\n" 2187 "void f() { f(); }\n" 2188 "}", 2189 LLVMWithNoNamespaceFix); 2190 verifyFormat("using namespace some_namespace;\n" 2191 "class A {};\n" 2192 "void f() { f(); }", 2193 LLVMWithNoNamespaceFix); 2194 2195 // This code is more common than we thought; if we 2196 // layout this correctly the semicolon will go into 2197 // its own line, which is undesirable. 2198 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 2199 verifyFormat("namespace {\n" 2200 "class A {};\n" 2201 "};", 2202 LLVMWithNoNamespaceFix); 2203 2204 verifyFormat("namespace {\n" 2205 "int SomeVariable = 0; // comment\n" 2206 "} // namespace", 2207 LLVMWithNoNamespaceFix); 2208 EXPECT_EQ("#ifndef HEADER_GUARD\n" 2209 "#define HEADER_GUARD\n" 2210 "namespace my_namespace {\n" 2211 "int i;\n" 2212 "} // my_namespace\n" 2213 "#endif // HEADER_GUARD", 2214 format("#ifndef HEADER_GUARD\n" 2215 " #define HEADER_GUARD\n" 2216 " namespace my_namespace {\n" 2217 "int i;\n" 2218 "} // my_namespace\n" 2219 "#endif // HEADER_GUARD", 2220 LLVMWithNoNamespaceFix)); 2221 2222 EXPECT_EQ("namespace A::B {\n" 2223 "class C {};\n" 2224 "}", 2225 format("namespace A::B {\n" 2226 "class C {};\n" 2227 "}", 2228 LLVMWithNoNamespaceFix)); 2229 2230 FormatStyle Style = getLLVMStyle(); 2231 Style.NamespaceIndentation = FormatStyle::NI_All; 2232 EXPECT_EQ("namespace out {\n" 2233 " int i;\n" 2234 " namespace in {\n" 2235 " int i;\n" 2236 " } // namespace in\n" 2237 "} // namespace out", 2238 format("namespace out {\n" 2239 "int i;\n" 2240 "namespace in {\n" 2241 "int i;\n" 2242 "} // namespace in\n" 2243 "} // namespace out", 2244 Style)); 2245 2246 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2247 EXPECT_EQ("namespace out {\n" 2248 "int i;\n" 2249 "namespace in {\n" 2250 " int i;\n" 2251 "} // namespace in\n" 2252 "} // namespace out", 2253 format("namespace out {\n" 2254 "int i;\n" 2255 "namespace in {\n" 2256 "int i;\n" 2257 "} // namespace in\n" 2258 "} // namespace out", 2259 Style)); 2260 } 2261 2262 TEST_F(FormatTest, NamespaceMacros) { 2263 FormatStyle Style = getLLVMStyle(); 2264 Style.NamespaceMacros.push_back("TESTSUITE"); 2265 2266 verifyFormat("TESTSUITE(A) {\n" 2267 "int foo();\n" 2268 "} // TESTSUITE(A)", 2269 Style); 2270 2271 verifyFormat("TESTSUITE(A, B) {\n" 2272 "int foo();\n" 2273 "} // TESTSUITE(A)", 2274 Style); 2275 2276 // Properly indent according to NamespaceIndentation style 2277 Style.NamespaceIndentation = FormatStyle::NI_All; 2278 verifyFormat("TESTSUITE(A) {\n" 2279 " int foo();\n" 2280 "} // TESTSUITE(A)", 2281 Style); 2282 verifyFormat("TESTSUITE(A) {\n" 2283 " namespace B {\n" 2284 " int foo();\n" 2285 " } // namespace B\n" 2286 "} // TESTSUITE(A)", 2287 Style); 2288 verifyFormat("namespace A {\n" 2289 " TESTSUITE(B) {\n" 2290 " int foo();\n" 2291 " } // TESTSUITE(B)\n" 2292 "} // namespace A", 2293 Style); 2294 2295 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2296 verifyFormat("TESTSUITE(A) {\n" 2297 "TESTSUITE(B) {\n" 2298 " int foo();\n" 2299 "} // TESTSUITE(B)\n" 2300 "} // TESTSUITE(A)", 2301 Style); 2302 verifyFormat("TESTSUITE(A) {\n" 2303 "namespace B {\n" 2304 " int foo();\n" 2305 "} // namespace B\n" 2306 "} // TESTSUITE(A)", 2307 Style); 2308 verifyFormat("namespace A {\n" 2309 "TESTSUITE(B) {\n" 2310 " int foo();\n" 2311 "} // TESTSUITE(B)\n" 2312 "} // namespace A", 2313 Style); 2314 2315 // Properly merge namespace-macros blocks in CompactNamespaces mode 2316 Style.NamespaceIndentation = FormatStyle::NI_None; 2317 Style.CompactNamespaces = true; 2318 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2319 "}} // TESTSUITE(A::B)", 2320 Style); 2321 2322 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2323 "}} // TESTSUITE(out::in)", 2324 format("TESTSUITE(out) {\n" 2325 "TESTSUITE(in) {\n" 2326 "} // TESTSUITE(in)\n" 2327 "} // TESTSUITE(out)", 2328 Style)); 2329 2330 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2331 "}} // TESTSUITE(out::in)", 2332 format("TESTSUITE(out) {\n" 2333 "TESTSUITE(in) {\n" 2334 "} // TESTSUITE(in)\n" 2335 "} // TESTSUITE(out)", 2336 Style)); 2337 2338 // Do not merge different namespaces/macros 2339 EXPECT_EQ("namespace out {\n" 2340 "TESTSUITE(in) {\n" 2341 "} // TESTSUITE(in)\n" 2342 "} // namespace out", 2343 format("namespace out {\n" 2344 "TESTSUITE(in) {\n" 2345 "} // TESTSUITE(in)\n" 2346 "} // namespace out", 2347 Style)); 2348 EXPECT_EQ("TESTSUITE(out) {\n" 2349 "namespace in {\n" 2350 "} // namespace in\n" 2351 "} // TESTSUITE(out)", 2352 format("TESTSUITE(out) {\n" 2353 "namespace in {\n" 2354 "} // namespace in\n" 2355 "} // TESTSUITE(out)", 2356 Style)); 2357 Style.NamespaceMacros.push_back("FOOBAR"); 2358 EXPECT_EQ("TESTSUITE(out) {\n" 2359 "FOOBAR(in) {\n" 2360 "} // FOOBAR(in)\n" 2361 "} // TESTSUITE(out)", 2362 format("TESTSUITE(out) {\n" 2363 "FOOBAR(in) {\n" 2364 "} // FOOBAR(in)\n" 2365 "} // TESTSUITE(out)", 2366 Style)); 2367 } 2368 2369 TEST_F(FormatTest, FormatsCompactNamespaces) { 2370 FormatStyle Style = getLLVMStyle(); 2371 Style.CompactNamespaces = true; 2372 Style.NamespaceMacros.push_back("TESTSUITE"); 2373 2374 verifyFormat("namespace A { namespace B {\n" 2375 "}} // namespace A::B", 2376 Style); 2377 2378 EXPECT_EQ("namespace out { namespace in {\n" 2379 "}} // namespace out::in", 2380 format("namespace out {\n" 2381 "namespace in {\n" 2382 "} // namespace in\n" 2383 "} // namespace out", 2384 Style)); 2385 2386 // Only namespaces which have both consecutive opening and end get compacted 2387 EXPECT_EQ("namespace out {\n" 2388 "namespace in1 {\n" 2389 "} // namespace in1\n" 2390 "namespace in2 {\n" 2391 "} // namespace in2\n" 2392 "} // namespace out", 2393 format("namespace out {\n" 2394 "namespace in1 {\n" 2395 "} // namespace in1\n" 2396 "namespace in2 {\n" 2397 "} // namespace in2\n" 2398 "} // namespace out", 2399 Style)); 2400 2401 EXPECT_EQ("namespace out {\n" 2402 "int i;\n" 2403 "namespace in {\n" 2404 "int j;\n" 2405 "} // namespace in\n" 2406 "int k;\n" 2407 "} // namespace out", 2408 format("namespace out { int i;\n" 2409 "namespace in { int j; } // namespace in\n" 2410 "int k; } // namespace out", 2411 Style)); 2412 2413 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2414 "}}} // namespace A::B::C\n", 2415 format("namespace A { namespace B {\n" 2416 "namespace C {\n" 2417 "}} // namespace B::C\n" 2418 "} // namespace A\n", 2419 Style)); 2420 2421 Style.ColumnLimit = 40; 2422 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2423 "namespace bbbbbbbbbb {\n" 2424 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2425 format("namespace aaaaaaaaaa {\n" 2426 "namespace bbbbbbbbbb {\n" 2427 "} // namespace bbbbbbbbbb\n" 2428 "} // namespace aaaaaaaaaa", 2429 Style)); 2430 2431 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2432 "namespace cccccc {\n" 2433 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2434 format("namespace aaaaaa {\n" 2435 "namespace bbbbbb {\n" 2436 "namespace cccccc {\n" 2437 "} // namespace cccccc\n" 2438 "} // namespace bbbbbb\n" 2439 "} // namespace aaaaaa", 2440 Style)); 2441 Style.ColumnLimit = 80; 2442 2443 // Extra semicolon after 'inner' closing brace prevents merging 2444 EXPECT_EQ("namespace out { namespace in {\n" 2445 "}; } // namespace out::in", 2446 format("namespace out {\n" 2447 "namespace in {\n" 2448 "}; // namespace in\n" 2449 "} // namespace out", 2450 Style)); 2451 2452 // Extra semicolon after 'outer' closing brace is conserved 2453 EXPECT_EQ("namespace out { namespace in {\n" 2454 "}}; // namespace out::in", 2455 format("namespace out {\n" 2456 "namespace in {\n" 2457 "} // namespace in\n" 2458 "}; // namespace out", 2459 Style)); 2460 2461 Style.NamespaceIndentation = FormatStyle::NI_All; 2462 EXPECT_EQ("namespace out { namespace in {\n" 2463 " int i;\n" 2464 "}} // namespace out::in", 2465 format("namespace out {\n" 2466 "namespace in {\n" 2467 "int i;\n" 2468 "} // namespace in\n" 2469 "} // namespace out", 2470 Style)); 2471 EXPECT_EQ("namespace out { namespace mid {\n" 2472 " namespace in {\n" 2473 " int j;\n" 2474 " } // namespace in\n" 2475 " int k;\n" 2476 "}} // namespace out::mid", 2477 format("namespace out { namespace mid {\n" 2478 "namespace in { int j; } // namespace in\n" 2479 "int k; }} // namespace out::mid", 2480 Style)); 2481 2482 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2483 EXPECT_EQ("namespace out { namespace in {\n" 2484 " int i;\n" 2485 "}} // namespace out::in", 2486 format("namespace out {\n" 2487 "namespace in {\n" 2488 "int i;\n" 2489 "} // namespace in\n" 2490 "} // namespace out", 2491 Style)); 2492 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2493 " int i;\n" 2494 "}}} // namespace out::mid::in", 2495 format("namespace out {\n" 2496 "namespace mid {\n" 2497 "namespace in {\n" 2498 "int i;\n" 2499 "} // namespace in\n" 2500 "} // namespace mid\n" 2501 "} // namespace out", 2502 Style)); 2503 } 2504 2505 TEST_F(FormatTest, FormatsExternC) { 2506 verifyFormat("extern \"C\" {\nint a;"); 2507 verifyFormat("extern \"C\" {}"); 2508 verifyFormat("extern \"C\" {\n" 2509 "int foo();\n" 2510 "}"); 2511 verifyFormat("extern \"C\" int foo() {}"); 2512 verifyFormat("extern \"C\" int foo();"); 2513 verifyFormat("extern \"C\" int foo() {\n" 2514 " int i = 42;\n" 2515 " return i;\n" 2516 "}"); 2517 2518 FormatStyle Style = getLLVMStyle(); 2519 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2520 Style.BraceWrapping.AfterFunction = true; 2521 verifyFormat("extern \"C\" int foo() {}", Style); 2522 verifyFormat("extern \"C\" int foo();", Style); 2523 verifyFormat("extern \"C\" int foo()\n" 2524 "{\n" 2525 " int i = 42;\n" 2526 " return i;\n" 2527 "}", 2528 Style); 2529 2530 Style.BraceWrapping.AfterExternBlock = true; 2531 Style.BraceWrapping.SplitEmptyRecord = false; 2532 verifyFormat("extern \"C\"\n" 2533 "{}", 2534 Style); 2535 verifyFormat("extern \"C\"\n" 2536 "{\n" 2537 " int foo();\n" 2538 "}", 2539 Style); 2540 } 2541 2542 TEST_F(FormatTest, FormatsInlineASM) { 2543 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2544 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2545 verifyFormat( 2546 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2547 " \"cpuid\\n\\t\"\n" 2548 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2549 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2550 " : \"a\"(value));"); 2551 EXPECT_EQ( 2552 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2553 " __asm {\n" 2554 " mov edx,[that] // vtable in edx\n" 2555 " mov eax,methodIndex\n" 2556 " call [edx][eax*4] // stdcall\n" 2557 " }\n" 2558 "}", 2559 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2560 " __asm {\n" 2561 " mov edx,[that] // vtable in edx\n" 2562 " mov eax,methodIndex\n" 2563 " call [edx][eax*4] // stdcall\n" 2564 " }\n" 2565 "}")); 2566 EXPECT_EQ("_asm {\n" 2567 " xor eax, eax;\n" 2568 " cpuid;\n" 2569 "}", 2570 format("_asm {\n" 2571 " xor eax, eax;\n" 2572 " cpuid;\n" 2573 "}")); 2574 verifyFormat("void function() {\n" 2575 " // comment\n" 2576 " asm(\"\");\n" 2577 "}"); 2578 EXPECT_EQ("__asm {\n" 2579 "}\n" 2580 "int i;", 2581 format("__asm {\n" 2582 "}\n" 2583 "int i;")); 2584 } 2585 2586 TEST_F(FormatTest, FormatTryCatch) { 2587 verifyFormat("try {\n" 2588 " throw a * b;\n" 2589 "} catch (int a) {\n" 2590 " // Do nothing.\n" 2591 "} catch (...) {\n" 2592 " exit(42);\n" 2593 "}"); 2594 2595 // Function-level try statements. 2596 verifyFormat("int f() try { return 4; } catch (...) {\n" 2597 " return 5;\n" 2598 "}"); 2599 verifyFormat("class A {\n" 2600 " int a;\n" 2601 " A() try : a(0) {\n" 2602 " } catch (...) {\n" 2603 " throw;\n" 2604 " }\n" 2605 "};\n"); 2606 2607 // Incomplete try-catch blocks. 2608 verifyIncompleteFormat("try {} catch ("); 2609 } 2610 2611 TEST_F(FormatTest, FormatSEHTryCatch) { 2612 verifyFormat("__try {\n" 2613 " int a = b * c;\n" 2614 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2615 " // Do nothing.\n" 2616 "}"); 2617 2618 verifyFormat("__try {\n" 2619 " int a = b * c;\n" 2620 "} __finally {\n" 2621 " // Do nothing.\n" 2622 "}"); 2623 2624 verifyFormat("DEBUG({\n" 2625 " __try {\n" 2626 " } __finally {\n" 2627 " }\n" 2628 "});\n"); 2629 } 2630 2631 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2632 verifyFormat("try {\n" 2633 " f();\n" 2634 "} catch {\n" 2635 " g();\n" 2636 "}"); 2637 verifyFormat("try {\n" 2638 " f();\n" 2639 "} catch (A a) MACRO(x) {\n" 2640 " g();\n" 2641 "} catch (B b) MACRO(x) {\n" 2642 " g();\n" 2643 "}"); 2644 } 2645 2646 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2647 FormatStyle Style = getLLVMStyle(); 2648 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2649 FormatStyle::BS_WebKit}) { 2650 Style.BreakBeforeBraces = BraceStyle; 2651 verifyFormat("try {\n" 2652 " // something\n" 2653 "} catch (...) {\n" 2654 " // something\n" 2655 "}", 2656 Style); 2657 } 2658 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2659 verifyFormat("try {\n" 2660 " // something\n" 2661 "}\n" 2662 "catch (...) {\n" 2663 " // something\n" 2664 "}", 2665 Style); 2666 verifyFormat("__try {\n" 2667 " // something\n" 2668 "}\n" 2669 "__finally {\n" 2670 " // something\n" 2671 "}", 2672 Style); 2673 verifyFormat("@try {\n" 2674 " // something\n" 2675 "}\n" 2676 "@finally {\n" 2677 " // something\n" 2678 "}", 2679 Style); 2680 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2681 verifyFormat("try\n" 2682 "{\n" 2683 " // something\n" 2684 "}\n" 2685 "catch (...)\n" 2686 "{\n" 2687 " // something\n" 2688 "}", 2689 Style); 2690 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2691 verifyFormat("try\n" 2692 " {\n" 2693 " // something white\n" 2694 " }\n" 2695 "catch (...)\n" 2696 " {\n" 2697 " // something white\n" 2698 " }", 2699 Style); 2700 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2701 verifyFormat("try\n" 2702 " {\n" 2703 " // something\n" 2704 " }\n" 2705 "catch (...)\n" 2706 " {\n" 2707 " // something\n" 2708 " }", 2709 Style); 2710 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2711 Style.BraceWrapping.BeforeCatch = true; 2712 verifyFormat("try {\n" 2713 " // something\n" 2714 "}\n" 2715 "catch (...) {\n" 2716 " // something\n" 2717 "}", 2718 Style); 2719 } 2720 2721 TEST_F(FormatTest, StaticInitializers) { 2722 verifyFormat("static SomeClass SC = {1, 'a'};"); 2723 2724 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2725 " 100000000, " 2726 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2727 2728 // Here, everything other than the "}" would fit on a line. 2729 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2730 " 10000000000000000000000000};"); 2731 EXPECT_EQ("S s = {a,\n" 2732 "\n" 2733 " b};", 2734 format("S s = {\n" 2735 " a,\n" 2736 "\n" 2737 " b\n" 2738 "};")); 2739 2740 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2741 // line. However, the formatting looks a bit off and this probably doesn't 2742 // happen often in practice. 2743 verifyFormat("static int Variable[1] = {\n" 2744 " {1000000000000000000000000000000000000}};", 2745 getLLVMStyleWithColumns(40)); 2746 } 2747 2748 TEST_F(FormatTest, DesignatedInitializers) { 2749 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2750 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2751 " .bbbbbbbbbb = 2,\n" 2752 " .cccccccccc = 3,\n" 2753 " .dddddddddd = 4,\n" 2754 " .eeeeeeeeee = 5};"); 2755 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2756 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2757 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2758 " .ccccccccccccccccccccccccccc = 3,\n" 2759 " .ddddddddddddddddddddddddddd = 4,\n" 2760 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2761 2762 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2763 2764 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2765 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2766 " [2] = bbbbbbbbbb,\n" 2767 " [3] = cccccccccc,\n" 2768 " [4] = dddddddddd,\n" 2769 " [5] = eeeeeeeeee};"); 2770 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2771 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2772 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2773 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2774 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2775 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2776 } 2777 2778 TEST_F(FormatTest, NestedStaticInitializers) { 2779 verifyFormat("static A x = {{{}}};\n"); 2780 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2781 " {init1, init2, init3, init4}}};", 2782 getLLVMStyleWithColumns(50)); 2783 2784 verifyFormat("somes Status::global_reps[3] = {\n" 2785 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2786 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2787 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2788 getLLVMStyleWithColumns(60)); 2789 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2790 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2791 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2792 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2793 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2794 " {rect.fRight - rect.fLeft, rect.fBottom - " 2795 "rect.fTop}};"); 2796 2797 verifyFormat( 2798 "SomeArrayOfSomeType a = {\n" 2799 " {{1, 2, 3},\n" 2800 " {1, 2, 3},\n" 2801 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2802 " 333333333333333333333333333333},\n" 2803 " {1, 2, 3},\n" 2804 " {1, 2, 3}}};"); 2805 verifyFormat( 2806 "SomeArrayOfSomeType a = {\n" 2807 " {{1, 2, 3}},\n" 2808 " {{1, 2, 3}},\n" 2809 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2810 " 333333333333333333333333333333}},\n" 2811 " {{1, 2, 3}},\n" 2812 " {{1, 2, 3}}};"); 2813 2814 verifyFormat("struct {\n" 2815 " unsigned bit;\n" 2816 " const char *const name;\n" 2817 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2818 " {kOsWin, \"Windows\"},\n" 2819 " {kOsLinux, \"Linux\"},\n" 2820 " {kOsCrOS, \"Chrome OS\"}};"); 2821 verifyFormat("struct {\n" 2822 " unsigned bit;\n" 2823 " const char *const name;\n" 2824 "} kBitsToOs[] = {\n" 2825 " {kOsMac, \"Mac\"},\n" 2826 " {kOsWin, \"Windows\"},\n" 2827 " {kOsLinux, \"Linux\"},\n" 2828 " {kOsCrOS, \"Chrome OS\"},\n" 2829 "};"); 2830 } 2831 2832 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2833 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2834 " \\\n" 2835 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2836 } 2837 2838 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2839 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2840 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2841 2842 // Do break defaulted and deleted functions. 2843 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2844 " default;", 2845 getLLVMStyleWithColumns(40)); 2846 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2847 " delete;", 2848 getLLVMStyleWithColumns(40)); 2849 } 2850 2851 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2852 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2853 getLLVMStyleWithColumns(40)); 2854 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2855 getLLVMStyleWithColumns(40)); 2856 EXPECT_EQ("#define Q \\\n" 2857 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2858 " \"aaaaaaaa.cpp\"", 2859 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2860 getLLVMStyleWithColumns(40))); 2861 } 2862 2863 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2864 EXPECT_EQ("# 123 \"A string literal\"", 2865 format(" # 123 \"A string literal\"")); 2866 } 2867 2868 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2869 EXPECT_EQ("#;", format("#;")); 2870 verifyFormat("#\n;\n;\n;"); 2871 } 2872 2873 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2874 EXPECT_EQ("#line 42 \"test\"\n", 2875 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2876 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2877 getLLVMStyleWithColumns(12))); 2878 } 2879 2880 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2881 EXPECT_EQ("#line 42 \"test\"", 2882 format("# \\\n line \\\n 42 \\\n \"test\"")); 2883 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2884 } 2885 2886 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2887 verifyFormat("#define A \\x20"); 2888 verifyFormat("#define A \\ x20"); 2889 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2890 verifyFormat("#define A ''"); 2891 verifyFormat("#define A ''qqq"); 2892 verifyFormat("#define A `qqq"); 2893 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2894 EXPECT_EQ("const char *c = STRINGIFY(\n" 2895 "\\na : b);", 2896 format("const char * c = STRINGIFY(\n" 2897 "\\na : b);")); 2898 2899 verifyFormat("a\r\\"); 2900 verifyFormat("a\v\\"); 2901 verifyFormat("a\f\\"); 2902 } 2903 2904 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2905 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2906 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2907 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2908 // FIXME: We never break before the macro name. 2909 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2910 2911 verifyFormat("#define A A\n#define A A"); 2912 verifyFormat("#define A(X) A\n#define A A"); 2913 2914 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2915 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2916 } 2917 2918 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2919 EXPECT_EQ("// somecomment\n" 2920 "#include \"a.h\"\n" 2921 "#define A( \\\n" 2922 " A, B)\n" 2923 "#include \"b.h\"\n" 2924 "// somecomment\n", 2925 format(" // somecomment\n" 2926 " #include \"a.h\"\n" 2927 "#define A(A,\\\n" 2928 " B)\n" 2929 " #include \"b.h\"\n" 2930 " // somecomment\n", 2931 getLLVMStyleWithColumns(13))); 2932 } 2933 2934 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2935 2936 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2937 EXPECT_EQ("#define A \\\n" 2938 " c; \\\n" 2939 " e;\n" 2940 "f;", 2941 format("#define A c; e;\n" 2942 "f;", 2943 getLLVMStyleWithColumns(14))); 2944 } 2945 2946 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2947 2948 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2949 EXPECT_EQ("int x,\n" 2950 "#define A\n" 2951 " y;", 2952 format("int x,\n#define A\ny;")); 2953 } 2954 2955 TEST_F(FormatTest, HashInMacroDefinition) { 2956 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2957 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2958 verifyFormat("#define A \\\n" 2959 " { \\\n" 2960 " f(#c); \\\n" 2961 " }", 2962 getLLVMStyleWithColumns(11)); 2963 2964 verifyFormat("#define A(X) \\\n" 2965 " void function##X()", 2966 getLLVMStyleWithColumns(22)); 2967 2968 verifyFormat("#define A(a, b, c) \\\n" 2969 " void a##b##c()", 2970 getLLVMStyleWithColumns(22)); 2971 2972 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2973 } 2974 2975 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2976 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2977 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2978 2979 FormatStyle Style = getLLVMStyle(); 2980 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2981 verifyFormat("#define true ((foo)1)", Style); 2982 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2983 verifyFormat("#define false((foo)0)", Style); 2984 } 2985 2986 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2987 EXPECT_EQ("#define A b;", format("#define A \\\n" 2988 " \\\n" 2989 " b;", 2990 getLLVMStyleWithColumns(25))); 2991 EXPECT_EQ("#define A \\\n" 2992 " \\\n" 2993 " a; \\\n" 2994 " b;", 2995 format("#define A \\\n" 2996 " \\\n" 2997 " a; \\\n" 2998 " b;", 2999 getLLVMStyleWithColumns(11))); 3000 EXPECT_EQ("#define A \\\n" 3001 " a; \\\n" 3002 " \\\n" 3003 " b;", 3004 format("#define A \\\n" 3005 " a; \\\n" 3006 " \\\n" 3007 " b;", 3008 getLLVMStyleWithColumns(11))); 3009 } 3010 3011 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 3012 verifyIncompleteFormat("#define A :"); 3013 verifyFormat("#define SOMECASES \\\n" 3014 " case 1: \\\n" 3015 " case 2\n", 3016 getLLVMStyleWithColumns(20)); 3017 verifyFormat("#define MACRO(a) \\\n" 3018 " if (a) \\\n" 3019 " f(); \\\n" 3020 " else \\\n" 3021 " g()", 3022 getLLVMStyleWithColumns(18)); 3023 verifyFormat("#define A template <typename T>"); 3024 verifyIncompleteFormat("#define STR(x) #x\n" 3025 "f(STR(this_is_a_string_literal{));"); 3026 verifyFormat("#pragma omp threadprivate( \\\n" 3027 " y)), // expected-warning", 3028 getLLVMStyleWithColumns(28)); 3029 verifyFormat("#d, = };"); 3030 verifyFormat("#if \"a"); 3031 verifyIncompleteFormat("({\n" 3032 "#define b \\\n" 3033 " } \\\n" 3034 " a\n" 3035 "a", 3036 getLLVMStyleWithColumns(15)); 3037 verifyFormat("#define A \\\n" 3038 " { \\\n" 3039 " {\n" 3040 "#define B \\\n" 3041 " } \\\n" 3042 " }", 3043 getLLVMStyleWithColumns(15)); 3044 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 3045 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 3046 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 3047 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 3048 } 3049 3050 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 3051 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 3052 EXPECT_EQ("class A : public QObject {\n" 3053 " Q_OBJECT\n" 3054 "\n" 3055 " A() {}\n" 3056 "};", 3057 format("class A : public QObject {\n" 3058 " Q_OBJECT\n" 3059 "\n" 3060 " A() {\n}\n" 3061 "} ;")); 3062 EXPECT_EQ("MACRO\n" 3063 "/*static*/ int i;", 3064 format("MACRO\n" 3065 " /*static*/ int i;")); 3066 EXPECT_EQ("SOME_MACRO\n" 3067 "namespace {\n" 3068 "void f();\n" 3069 "} // namespace", 3070 format("SOME_MACRO\n" 3071 " namespace {\n" 3072 "void f( );\n" 3073 "} // namespace")); 3074 // Only if the identifier contains at least 5 characters. 3075 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 3076 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 3077 // Only if everything is upper case. 3078 EXPECT_EQ("class A : public QObject {\n" 3079 " Q_Object A() {}\n" 3080 "};", 3081 format("class A : public QObject {\n" 3082 " Q_Object\n" 3083 " A() {\n}\n" 3084 "} ;")); 3085 3086 // Only if the next line can actually start an unwrapped line. 3087 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 3088 format("SOME_WEIRD_LOG_MACRO\n" 3089 "<< SomeThing;")); 3090 3091 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 3092 "(n, buffers))\n", 3093 getChromiumStyle(FormatStyle::LK_Cpp)); 3094 3095 // See PR41483 3096 EXPECT_EQ("/**/ FOO(a)\n" 3097 "FOO(b)", 3098 format("/**/ FOO(a)\n" 3099 "FOO(b)")); 3100 } 3101 3102 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 3103 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3104 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3105 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3106 "class X {};\n" 3107 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3108 "int *createScopDetectionPass() { return 0; }", 3109 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3110 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3111 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3112 " class X {};\n" 3113 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3114 " int *createScopDetectionPass() { return 0; }")); 3115 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 3116 // braces, so that inner block is indented one level more. 3117 EXPECT_EQ("int q() {\n" 3118 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3119 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3120 " IPC_END_MESSAGE_MAP()\n" 3121 "}", 3122 format("int q() {\n" 3123 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3124 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3125 " IPC_END_MESSAGE_MAP()\n" 3126 "}")); 3127 3128 // Same inside macros. 3129 EXPECT_EQ("#define LIST(L) \\\n" 3130 " L(A) \\\n" 3131 " L(B) \\\n" 3132 " L(C)", 3133 format("#define LIST(L) \\\n" 3134 " L(A) \\\n" 3135 " L(B) \\\n" 3136 " L(C)", 3137 getGoogleStyle())); 3138 3139 // These must not be recognized as macros. 3140 EXPECT_EQ("int q() {\n" 3141 " f(x);\n" 3142 " f(x) {}\n" 3143 " f(x)->g();\n" 3144 " f(x)->*g();\n" 3145 " f(x).g();\n" 3146 " f(x) = x;\n" 3147 " f(x) += x;\n" 3148 " f(x) -= x;\n" 3149 " f(x) *= x;\n" 3150 " f(x) /= x;\n" 3151 " f(x) %= x;\n" 3152 " f(x) &= x;\n" 3153 " f(x) |= x;\n" 3154 " f(x) ^= x;\n" 3155 " f(x) >>= x;\n" 3156 " f(x) <<= x;\n" 3157 " f(x)[y].z();\n" 3158 " LOG(INFO) << x;\n" 3159 " ifstream(x) >> x;\n" 3160 "}\n", 3161 format("int q() {\n" 3162 " f(x)\n;\n" 3163 " f(x)\n {}\n" 3164 " f(x)\n->g();\n" 3165 " f(x)\n->*g();\n" 3166 " f(x)\n.g();\n" 3167 " f(x)\n = x;\n" 3168 " f(x)\n += x;\n" 3169 " f(x)\n -= x;\n" 3170 " f(x)\n *= x;\n" 3171 " f(x)\n /= x;\n" 3172 " f(x)\n %= x;\n" 3173 " f(x)\n &= x;\n" 3174 " f(x)\n |= x;\n" 3175 " f(x)\n ^= x;\n" 3176 " f(x)\n >>= x;\n" 3177 " f(x)\n <<= x;\n" 3178 " f(x)\n[y].z();\n" 3179 " LOG(INFO)\n << x;\n" 3180 " ifstream(x)\n >> x;\n" 3181 "}\n")); 3182 EXPECT_EQ("int q() {\n" 3183 " F(x)\n" 3184 " if (1) {\n" 3185 " }\n" 3186 " F(x)\n" 3187 " while (1) {\n" 3188 " }\n" 3189 " F(x)\n" 3190 " G(x);\n" 3191 " F(x)\n" 3192 " try {\n" 3193 " Q();\n" 3194 " } catch (...) {\n" 3195 " }\n" 3196 "}\n", 3197 format("int q() {\n" 3198 "F(x)\n" 3199 "if (1) {}\n" 3200 "F(x)\n" 3201 "while (1) {}\n" 3202 "F(x)\n" 3203 "G(x);\n" 3204 "F(x)\n" 3205 "try { Q(); } catch (...) {}\n" 3206 "}\n")); 3207 EXPECT_EQ("class A {\n" 3208 " A() : t(0) {}\n" 3209 " A(int i) noexcept() : {}\n" 3210 " A(X x)\n" // FIXME: function-level try blocks are broken. 3211 " try : t(0) {\n" 3212 " } catch (...) {\n" 3213 " }\n" 3214 "};", 3215 format("class A {\n" 3216 " A()\n : t(0) {}\n" 3217 " A(int i)\n noexcept() : {}\n" 3218 " A(X x)\n" 3219 " try : t(0) {} catch (...) {}\n" 3220 "};")); 3221 FormatStyle Style = getLLVMStyle(); 3222 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3223 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3224 Style.BraceWrapping.AfterFunction = true; 3225 EXPECT_EQ("void f()\n" 3226 "try\n" 3227 "{\n" 3228 "}", 3229 format("void f() try {\n" 3230 "}", 3231 Style)); 3232 EXPECT_EQ("class SomeClass {\n" 3233 "public:\n" 3234 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3235 "};", 3236 format("class SomeClass {\n" 3237 "public:\n" 3238 " SomeClass()\n" 3239 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3240 "};")); 3241 EXPECT_EQ("class SomeClass {\n" 3242 "public:\n" 3243 " SomeClass()\n" 3244 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3245 "};", 3246 format("class SomeClass {\n" 3247 "public:\n" 3248 " SomeClass()\n" 3249 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3250 "};", 3251 getLLVMStyleWithColumns(40))); 3252 3253 verifyFormat("MACRO(>)"); 3254 3255 // Some macros contain an implicit semicolon. 3256 Style = getLLVMStyle(); 3257 Style.StatementMacros.push_back("FOO"); 3258 verifyFormat("FOO(a) int b = 0;"); 3259 verifyFormat("FOO(a)\n" 3260 "int b = 0;", 3261 Style); 3262 verifyFormat("FOO(a);\n" 3263 "int b = 0;", 3264 Style); 3265 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3266 "int b = 0;", 3267 Style); 3268 verifyFormat("FOO()\n" 3269 "int b = 0;", 3270 Style); 3271 verifyFormat("FOO\n" 3272 "int b = 0;", 3273 Style); 3274 verifyFormat("void f() {\n" 3275 " FOO(a)\n" 3276 " return a;\n" 3277 "}", 3278 Style); 3279 verifyFormat("FOO(a)\n" 3280 "FOO(b)", 3281 Style); 3282 verifyFormat("int a = 0;\n" 3283 "FOO(b)\n" 3284 "int c = 0;", 3285 Style); 3286 verifyFormat("int a = 0;\n" 3287 "int x = FOO(a)\n" 3288 "int b = 0;", 3289 Style); 3290 verifyFormat("void foo(int a) { FOO(a) }\n" 3291 "uint32_t bar() {}", 3292 Style); 3293 } 3294 3295 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3296 verifyFormat("#define A \\\n" 3297 " f({ \\\n" 3298 " g(); \\\n" 3299 " });", 3300 getLLVMStyleWithColumns(11)); 3301 } 3302 3303 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3304 FormatStyle Style = getLLVMStyle(); 3305 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3306 Style.ColumnLimit = 40; 3307 verifyFormat("#ifdef _WIN32\n" 3308 "#define A 0\n" 3309 "#ifdef VAR2\n" 3310 "#define B 1\n" 3311 "#include <someheader.h>\n" 3312 "#define MACRO \\\n" 3313 " some_very_long_func_aaaaaaaaaa();\n" 3314 "#endif\n" 3315 "#else\n" 3316 "#define A 1\n" 3317 "#endif", 3318 Style); 3319 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3320 verifyFormat("#ifdef _WIN32\n" 3321 "# define A 0\n" 3322 "# ifdef VAR2\n" 3323 "# define B 1\n" 3324 "# include <someheader.h>\n" 3325 "# define MACRO \\\n" 3326 " some_very_long_func_aaaaaaaaaa();\n" 3327 "# endif\n" 3328 "#else\n" 3329 "# define A 1\n" 3330 "#endif", 3331 Style); 3332 verifyFormat("#if A\n" 3333 "# define MACRO \\\n" 3334 " void a(int x) { \\\n" 3335 " b(); \\\n" 3336 " c(); \\\n" 3337 " d(); \\\n" 3338 " e(); \\\n" 3339 " f(); \\\n" 3340 " }\n" 3341 "#endif", 3342 Style); 3343 // Comments before include guard. 3344 verifyFormat("// file comment\n" 3345 "// file comment\n" 3346 "#ifndef HEADER_H\n" 3347 "#define HEADER_H\n" 3348 "code();\n" 3349 "#endif", 3350 Style); 3351 // Test with include guards. 3352 verifyFormat("#ifndef HEADER_H\n" 3353 "#define HEADER_H\n" 3354 "code();\n" 3355 "#endif", 3356 Style); 3357 // Include guards must have a #define with the same variable immediately 3358 // after #ifndef. 3359 verifyFormat("#ifndef NOT_GUARD\n" 3360 "# define FOO\n" 3361 "code();\n" 3362 "#endif", 3363 Style); 3364 3365 // Include guards must cover the entire file. 3366 verifyFormat("code();\n" 3367 "code();\n" 3368 "#ifndef NOT_GUARD\n" 3369 "# define NOT_GUARD\n" 3370 "code();\n" 3371 "#endif", 3372 Style); 3373 verifyFormat("#ifndef NOT_GUARD\n" 3374 "# define NOT_GUARD\n" 3375 "code();\n" 3376 "#endif\n" 3377 "code();", 3378 Style); 3379 // Test with trailing blank lines. 3380 verifyFormat("#ifndef HEADER_H\n" 3381 "#define HEADER_H\n" 3382 "code();\n" 3383 "#endif\n", 3384 Style); 3385 // Include guards don't have #else. 3386 verifyFormat("#ifndef NOT_GUARD\n" 3387 "# define NOT_GUARD\n" 3388 "code();\n" 3389 "#else\n" 3390 "#endif", 3391 Style); 3392 verifyFormat("#ifndef NOT_GUARD\n" 3393 "# define NOT_GUARD\n" 3394 "code();\n" 3395 "#elif FOO\n" 3396 "#endif", 3397 Style); 3398 // Non-identifier #define after potential include guard. 3399 verifyFormat("#ifndef FOO\n" 3400 "# define 1\n" 3401 "#endif\n", 3402 Style); 3403 // #if closes past last non-preprocessor line. 3404 verifyFormat("#ifndef FOO\n" 3405 "#define FOO\n" 3406 "#if 1\n" 3407 "int i;\n" 3408 "# define A 0\n" 3409 "#endif\n" 3410 "#endif\n", 3411 Style); 3412 // Don't crash if there is an #elif directive without a condition. 3413 verifyFormat("#if 1\n" 3414 "int x;\n" 3415 "#elif\n" 3416 "int y;\n" 3417 "#else\n" 3418 "int z;\n" 3419 "#endif", 3420 Style); 3421 // FIXME: This doesn't handle the case where there's code between the 3422 // #ifndef and #define but all other conditions hold. This is because when 3423 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3424 // previous code line yet, so we can't detect it. 3425 EXPECT_EQ("#ifndef NOT_GUARD\n" 3426 "code();\n" 3427 "#define NOT_GUARD\n" 3428 "code();\n" 3429 "#endif", 3430 format("#ifndef NOT_GUARD\n" 3431 "code();\n" 3432 "# define NOT_GUARD\n" 3433 "code();\n" 3434 "#endif", 3435 Style)); 3436 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3437 // be outside an include guard. Examples are #pragma once and 3438 // #pragma GCC diagnostic, or anything else that does not change the meaning 3439 // of the file if it's included multiple times. 3440 EXPECT_EQ("#ifdef WIN32\n" 3441 "# pragma once\n" 3442 "#endif\n" 3443 "#ifndef HEADER_H\n" 3444 "# define HEADER_H\n" 3445 "code();\n" 3446 "#endif", 3447 format("#ifdef WIN32\n" 3448 "# pragma once\n" 3449 "#endif\n" 3450 "#ifndef HEADER_H\n" 3451 "#define HEADER_H\n" 3452 "code();\n" 3453 "#endif", 3454 Style)); 3455 // FIXME: This does not detect when there is a single non-preprocessor line 3456 // in front of an include-guard-like structure where other conditions hold 3457 // because ScopedLineState hides the line. 3458 EXPECT_EQ("code();\n" 3459 "#ifndef HEADER_H\n" 3460 "#define HEADER_H\n" 3461 "code();\n" 3462 "#endif", 3463 format("code();\n" 3464 "#ifndef HEADER_H\n" 3465 "# define HEADER_H\n" 3466 "code();\n" 3467 "#endif", 3468 Style)); 3469 // Keep comments aligned with #, otherwise indent comments normally. These 3470 // tests cannot use verifyFormat because messUp manipulates leading 3471 // whitespace. 3472 { 3473 const char *Expected = "" 3474 "void f() {\n" 3475 "#if 1\n" 3476 "// Preprocessor aligned.\n" 3477 "# define A 0\n" 3478 " // Code. Separated by blank line.\n" 3479 "\n" 3480 "# define B 0\n" 3481 " // Code. Not aligned with #\n" 3482 "# define C 0\n" 3483 "#endif"; 3484 const char *ToFormat = "" 3485 "void f() {\n" 3486 "#if 1\n" 3487 "// Preprocessor aligned.\n" 3488 "# define A 0\n" 3489 "// Code. Separated by blank line.\n" 3490 "\n" 3491 "# define B 0\n" 3492 " // Code. Not aligned with #\n" 3493 "# define C 0\n" 3494 "#endif"; 3495 EXPECT_EQ(Expected, format(ToFormat, Style)); 3496 EXPECT_EQ(Expected, format(Expected, Style)); 3497 } 3498 // Keep block quotes aligned. 3499 { 3500 const char *Expected = "" 3501 "void f() {\n" 3502 "#if 1\n" 3503 "/* Preprocessor aligned. */\n" 3504 "# define A 0\n" 3505 " /* Code. Separated by blank line. */\n" 3506 "\n" 3507 "# define B 0\n" 3508 " /* Code. Not aligned with # */\n" 3509 "# define C 0\n" 3510 "#endif"; 3511 const char *ToFormat = "" 3512 "void f() {\n" 3513 "#if 1\n" 3514 "/* Preprocessor aligned. */\n" 3515 "# define A 0\n" 3516 "/* Code. Separated by blank line. */\n" 3517 "\n" 3518 "# define B 0\n" 3519 " /* Code. Not aligned with # */\n" 3520 "# define C 0\n" 3521 "#endif"; 3522 EXPECT_EQ(Expected, format(ToFormat, Style)); 3523 EXPECT_EQ(Expected, format(Expected, Style)); 3524 } 3525 // Keep comments aligned with un-indented directives. 3526 { 3527 const char *Expected = "" 3528 "void f() {\n" 3529 "// Preprocessor aligned.\n" 3530 "#define A 0\n" 3531 " // Code. Separated by blank line.\n" 3532 "\n" 3533 "#define B 0\n" 3534 " // Code. Not aligned with #\n" 3535 "#define C 0\n"; 3536 const char *ToFormat = "" 3537 "void f() {\n" 3538 "// Preprocessor aligned.\n" 3539 "#define A 0\n" 3540 "// Code. Separated by blank line.\n" 3541 "\n" 3542 "#define B 0\n" 3543 " // Code. Not aligned with #\n" 3544 "#define C 0\n"; 3545 EXPECT_EQ(Expected, format(ToFormat, Style)); 3546 EXPECT_EQ(Expected, format(Expected, Style)); 3547 } 3548 // Test AfterHash with tabs. 3549 { 3550 FormatStyle Tabbed = Style; 3551 Tabbed.UseTab = FormatStyle::UT_Always; 3552 Tabbed.IndentWidth = 8; 3553 Tabbed.TabWidth = 8; 3554 verifyFormat("#ifdef _WIN32\n" 3555 "#\tdefine A 0\n" 3556 "#\tifdef VAR2\n" 3557 "#\t\tdefine B 1\n" 3558 "#\t\tinclude <someheader.h>\n" 3559 "#\t\tdefine MACRO \\\n" 3560 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3561 "#\tendif\n" 3562 "#else\n" 3563 "#\tdefine A 1\n" 3564 "#endif", 3565 Tabbed); 3566 } 3567 3568 // Regression test: Multiline-macro inside include guards. 3569 verifyFormat("#ifndef HEADER_H\n" 3570 "#define HEADER_H\n" 3571 "#define A() \\\n" 3572 " int i; \\\n" 3573 " int j;\n" 3574 "#endif // HEADER_H", 3575 getLLVMStyleWithColumns(20)); 3576 3577 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3578 // Basic before hash indent tests 3579 verifyFormat("#ifdef _WIN32\n" 3580 " #define A 0\n" 3581 " #ifdef VAR2\n" 3582 " #define B 1\n" 3583 " #include <someheader.h>\n" 3584 " #define MACRO \\\n" 3585 " some_very_long_func_aaaaaaaaaa();\n" 3586 " #endif\n" 3587 "#else\n" 3588 " #define A 1\n" 3589 "#endif", 3590 Style); 3591 verifyFormat("#if A\n" 3592 " #define MACRO \\\n" 3593 " void a(int x) { \\\n" 3594 " b(); \\\n" 3595 " c(); \\\n" 3596 " d(); \\\n" 3597 " e(); \\\n" 3598 " f(); \\\n" 3599 " }\n" 3600 "#endif", 3601 Style); 3602 // Keep comments aligned with indented directives. These 3603 // tests cannot use verifyFormat because messUp manipulates leading 3604 // whitespace. 3605 { 3606 const char *Expected = "void f() {\n" 3607 "// Aligned to preprocessor.\n" 3608 "#if 1\n" 3609 " // Aligned to code.\n" 3610 " int a;\n" 3611 " #if 1\n" 3612 " // Aligned to preprocessor.\n" 3613 " #define A 0\n" 3614 " // Aligned to code.\n" 3615 " int b;\n" 3616 " #endif\n" 3617 "#endif\n" 3618 "}"; 3619 const char *ToFormat = "void f() {\n" 3620 "// Aligned to preprocessor.\n" 3621 "#if 1\n" 3622 "// Aligned to code.\n" 3623 "int a;\n" 3624 "#if 1\n" 3625 "// Aligned to preprocessor.\n" 3626 "#define A 0\n" 3627 "// Aligned to code.\n" 3628 "int b;\n" 3629 "#endif\n" 3630 "#endif\n" 3631 "}"; 3632 EXPECT_EQ(Expected, format(ToFormat, Style)); 3633 EXPECT_EQ(Expected, format(Expected, Style)); 3634 } 3635 { 3636 const char *Expected = "void f() {\n" 3637 "/* Aligned to preprocessor. */\n" 3638 "#if 1\n" 3639 " /* Aligned to code. */\n" 3640 " int a;\n" 3641 " #if 1\n" 3642 " /* Aligned to preprocessor. */\n" 3643 " #define A 0\n" 3644 " /* Aligned to code. */\n" 3645 " int b;\n" 3646 " #endif\n" 3647 "#endif\n" 3648 "}"; 3649 const char *ToFormat = "void f() {\n" 3650 "/* Aligned to preprocessor. */\n" 3651 "#if 1\n" 3652 "/* Aligned to code. */\n" 3653 "int a;\n" 3654 "#if 1\n" 3655 "/* Aligned to preprocessor. */\n" 3656 "#define A 0\n" 3657 "/* Aligned to code. */\n" 3658 "int b;\n" 3659 "#endif\n" 3660 "#endif\n" 3661 "}"; 3662 EXPECT_EQ(Expected, format(ToFormat, Style)); 3663 EXPECT_EQ(Expected, format(Expected, Style)); 3664 } 3665 3666 // Test single comment before preprocessor 3667 verifyFormat("// Comment\n" 3668 "\n" 3669 "#if 1\n" 3670 "#endif", 3671 Style); 3672 } 3673 3674 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3675 verifyFormat("{\n { a #c; }\n}"); 3676 } 3677 3678 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3679 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3680 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3681 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3682 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3683 } 3684 3685 TEST_F(FormatTest, EscapedNewlines) { 3686 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3687 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3688 format("#define A \\\nint i;\\\n int j;", Narrow)); 3689 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3690 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3691 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3692 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3693 3694 FormatStyle AlignLeft = getLLVMStyle(); 3695 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3696 EXPECT_EQ("#define MACRO(x) \\\n" 3697 "private: \\\n" 3698 " int x(int a);\n", 3699 format("#define MACRO(x) \\\n" 3700 "private: \\\n" 3701 " int x(int a);\n", 3702 AlignLeft)); 3703 3704 // CRLF line endings 3705 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3706 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3707 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3708 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3709 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3710 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3711 EXPECT_EQ("#define MACRO(x) \\\r\n" 3712 "private: \\\r\n" 3713 " int x(int a);\r\n", 3714 format("#define MACRO(x) \\\r\n" 3715 "private: \\\r\n" 3716 " int x(int a);\r\n", 3717 AlignLeft)); 3718 3719 FormatStyle DontAlign = getLLVMStyle(); 3720 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3721 DontAlign.MaxEmptyLinesToKeep = 3; 3722 // FIXME: can't use verifyFormat here because the newline before 3723 // "public:" is not inserted the first time it's reformatted 3724 EXPECT_EQ("#define A \\\n" 3725 " class Foo { \\\n" 3726 " void bar(); \\\n" 3727 "\\\n" 3728 "\\\n" 3729 "\\\n" 3730 " public: \\\n" 3731 " void baz(); \\\n" 3732 " };", 3733 format("#define A \\\n" 3734 " class Foo { \\\n" 3735 " void bar(); \\\n" 3736 "\\\n" 3737 "\\\n" 3738 "\\\n" 3739 " public: \\\n" 3740 " void baz(); \\\n" 3741 " };", 3742 DontAlign)); 3743 } 3744 3745 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3746 verifyFormat("#define A \\\n" 3747 " int v( \\\n" 3748 " a); \\\n" 3749 " int i;", 3750 getLLVMStyleWithColumns(11)); 3751 } 3752 3753 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3754 EXPECT_EQ( 3755 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3756 " \\\n" 3757 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3758 "\n" 3759 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3760 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3761 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3762 "\\\n" 3763 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3764 " \n" 3765 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3766 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3767 } 3768 3769 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3770 EXPECT_EQ("int\n" 3771 "#define A\n" 3772 " a;", 3773 format("int\n#define A\na;")); 3774 verifyFormat("functionCallTo(\n" 3775 " someOtherFunction(\n" 3776 " withSomeParameters, whichInSequence,\n" 3777 " areLongerThanALine(andAnotherCall,\n" 3778 "#define A B\n" 3779 " withMoreParamters,\n" 3780 " whichStronglyInfluenceTheLayout),\n" 3781 " andMoreParameters),\n" 3782 " trailing);", 3783 getLLVMStyleWithColumns(69)); 3784 verifyFormat("Foo::Foo()\n" 3785 "#ifdef BAR\n" 3786 " : baz(0)\n" 3787 "#endif\n" 3788 "{\n" 3789 "}"); 3790 verifyFormat("void f() {\n" 3791 " if (true)\n" 3792 "#ifdef A\n" 3793 " f(42);\n" 3794 " x();\n" 3795 "#else\n" 3796 " g();\n" 3797 " x();\n" 3798 "#endif\n" 3799 "}"); 3800 verifyFormat("void f(param1, param2,\n" 3801 " param3,\n" 3802 "#ifdef A\n" 3803 " param4(param5,\n" 3804 "#ifdef A1\n" 3805 " param6,\n" 3806 "#ifdef A2\n" 3807 " param7),\n" 3808 "#else\n" 3809 " param8),\n" 3810 " param9,\n" 3811 "#endif\n" 3812 " param10,\n" 3813 "#endif\n" 3814 " param11)\n" 3815 "#else\n" 3816 " param12)\n" 3817 "#endif\n" 3818 "{\n" 3819 " x();\n" 3820 "}", 3821 getLLVMStyleWithColumns(28)); 3822 verifyFormat("#if 1\n" 3823 "int i;"); 3824 verifyFormat("#if 1\n" 3825 "#endif\n" 3826 "#if 1\n" 3827 "#else\n" 3828 "#endif\n"); 3829 verifyFormat("DEBUG({\n" 3830 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3831 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3832 "});\n" 3833 "#if a\n" 3834 "#else\n" 3835 "#endif"); 3836 3837 verifyIncompleteFormat("void f(\n" 3838 "#if A\n" 3839 ");\n" 3840 "#else\n" 3841 "#endif"); 3842 } 3843 3844 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3845 verifyFormat("#endif\n" 3846 "#if B"); 3847 } 3848 3849 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3850 FormatStyle SingleLine = getLLVMStyle(); 3851 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3852 verifyFormat("#if 0\n" 3853 "#elif 1\n" 3854 "#endif\n" 3855 "void foo() {\n" 3856 " if (test) foo2();\n" 3857 "}", 3858 SingleLine); 3859 } 3860 3861 TEST_F(FormatTest, LayoutBlockInsideParens) { 3862 verifyFormat("functionCall({ int i; });"); 3863 verifyFormat("functionCall({\n" 3864 " int i;\n" 3865 " int j;\n" 3866 "});"); 3867 verifyFormat("functionCall(\n" 3868 " {\n" 3869 " int i;\n" 3870 " int j;\n" 3871 " },\n" 3872 " aaaa, bbbb, cccc);"); 3873 verifyFormat("functionA(functionB({\n" 3874 " int i;\n" 3875 " int j;\n" 3876 " }),\n" 3877 " aaaa, bbbb, cccc);"); 3878 verifyFormat("functionCall(\n" 3879 " {\n" 3880 " int i;\n" 3881 " int j;\n" 3882 " },\n" 3883 " aaaa, bbbb, // comment\n" 3884 " cccc);"); 3885 verifyFormat("functionA(functionB({\n" 3886 " int i;\n" 3887 " int j;\n" 3888 " }),\n" 3889 " aaaa, bbbb, // comment\n" 3890 " cccc);"); 3891 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3892 verifyFormat("functionCall(aaaa, bbbb, {\n" 3893 " int i;\n" 3894 " int j;\n" 3895 "});"); 3896 verifyFormat( 3897 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3898 " {\n" 3899 " int i; // break\n" 3900 " },\n" 3901 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3902 " ccccccccccccccccc));"); 3903 verifyFormat("DEBUG({\n" 3904 " if (a)\n" 3905 " f();\n" 3906 "});"); 3907 } 3908 3909 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3910 EXPECT_EQ("SOME_MACRO { int i; }\n" 3911 "int i;", 3912 format(" SOME_MACRO {int i;} int i;")); 3913 } 3914 3915 TEST_F(FormatTest, LayoutNestedBlocks) { 3916 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3917 " struct s {\n" 3918 " int i;\n" 3919 " };\n" 3920 " s kBitsToOs[] = {{10}};\n" 3921 " for (int i = 0; i < 10; ++i)\n" 3922 " return;\n" 3923 "}"); 3924 verifyFormat("call(parameter, {\n" 3925 " something();\n" 3926 " // Comment using all columns.\n" 3927 " somethingelse();\n" 3928 "});", 3929 getLLVMStyleWithColumns(40)); 3930 verifyFormat("DEBUG( //\n" 3931 " { f(); }, a);"); 3932 verifyFormat("DEBUG( //\n" 3933 " {\n" 3934 " f(); //\n" 3935 " },\n" 3936 " a);"); 3937 3938 EXPECT_EQ("call(parameter, {\n" 3939 " something();\n" 3940 " // Comment too\n" 3941 " // looooooooooong.\n" 3942 " somethingElse();\n" 3943 "});", 3944 format("call(parameter, {\n" 3945 " something();\n" 3946 " // Comment too looooooooooong.\n" 3947 " somethingElse();\n" 3948 "});", 3949 getLLVMStyleWithColumns(29))); 3950 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3951 EXPECT_EQ("DEBUG({ // comment\n" 3952 " int i;\n" 3953 "});", 3954 format("DEBUG({ // comment\n" 3955 "int i;\n" 3956 "});")); 3957 EXPECT_EQ("DEBUG({\n" 3958 " int i;\n" 3959 "\n" 3960 " // comment\n" 3961 " int j;\n" 3962 "});", 3963 format("DEBUG({\n" 3964 " int i;\n" 3965 "\n" 3966 " // comment\n" 3967 " int j;\n" 3968 "});")); 3969 3970 verifyFormat("DEBUG({\n" 3971 " if (a)\n" 3972 " return;\n" 3973 "});"); 3974 verifyGoogleFormat("DEBUG({\n" 3975 " if (a) return;\n" 3976 "});"); 3977 FormatStyle Style = getGoogleStyle(); 3978 Style.ColumnLimit = 45; 3979 verifyFormat("Debug(\n" 3980 " aaaaa,\n" 3981 " {\n" 3982 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3983 " },\n" 3984 " a);", 3985 Style); 3986 3987 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3988 3989 verifyNoCrash("^{v^{a}}"); 3990 } 3991 3992 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3993 EXPECT_EQ("#define MACRO() \\\n" 3994 " Debug(aaa, /* force line break */ \\\n" 3995 " { \\\n" 3996 " int i; \\\n" 3997 " int j; \\\n" 3998 " })", 3999 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 4000 " { int i; int j; })", 4001 getGoogleStyle())); 4002 4003 EXPECT_EQ("#define A \\\n" 4004 " [] { \\\n" 4005 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4006 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 4007 " }", 4008 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4009 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 4010 getGoogleStyle())); 4011 } 4012 4013 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 4014 EXPECT_EQ("{}", format("{}")); 4015 verifyFormat("enum E {};"); 4016 verifyFormat("enum E {}"); 4017 FormatStyle Style = getLLVMStyle(); 4018 Style.SpaceInEmptyBlock = true; 4019 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 4020 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 4021 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 4022 } 4023 4024 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 4025 FormatStyle Style = getLLVMStyle(); 4026 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 4027 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 4028 verifyFormat("FOO_BEGIN\n" 4029 " FOO_ENTRY\n" 4030 "FOO_END", 4031 Style); 4032 verifyFormat("FOO_BEGIN\n" 4033 " NESTED_FOO_BEGIN\n" 4034 " NESTED_FOO_ENTRY\n" 4035 " NESTED_FOO_END\n" 4036 "FOO_END", 4037 Style); 4038 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 4039 " int x;\n" 4040 " x = 1;\n" 4041 "FOO_END(Baz)", 4042 Style); 4043 } 4044 4045 //===----------------------------------------------------------------------===// 4046 // Line break tests. 4047 //===----------------------------------------------------------------------===// 4048 4049 TEST_F(FormatTest, PreventConfusingIndents) { 4050 verifyFormat( 4051 "void f() {\n" 4052 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 4053 " parameter, parameter, parameter)),\n" 4054 " SecondLongCall(parameter));\n" 4055 "}"); 4056 verifyFormat( 4057 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4058 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4060 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 4061 verifyFormat( 4062 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4063 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 4064 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 4065 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 4066 verifyFormat( 4067 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 4068 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 4069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 4070 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 4071 verifyFormat("int a = bbbb && ccc &&\n" 4072 " fffff(\n" 4073 "#define A Just forcing a new line\n" 4074 " ddd);"); 4075 } 4076 4077 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 4078 verifyFormat( 4079 "bool aaaaaaa =\n" 4080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 4081 " bbbbbbbb();"); 4082 verifyFormat( 4083 "bool aaaaaaa =\n" 4084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 4085 " bbbbbbbb();"); 4086 4087 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 4089 " ccccccccc == ddddddddddd;"); 4090 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4091 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 4092 " ccccccccc == ddddddddddd;"); 4093 verifyFormat( 4094 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 4095 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 4096 " ccccccccc == ddddddddddd;"); 4097 4098 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4099 " aaaaaa) &&\n" 4100 " bbbbbb && cccccc;"); 4101 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4102 " aaaaaa) >>\n" 4103 " bbbbbb;"); 4104 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 4105 " SourceMgr.getSpellingColumnNumber(\n" 4106 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 4107 " 1);"); 4108 4109 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4110 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 4111 " cccccc) {\n}"); 4112 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4113 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4114 " cccccc) {\n}"); 4115 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4116 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4117 " cccccc) {\n}"); 4118 verifyFormat("b = a &&\n" 4119 " // Comment\n" 4120 " b.c && d;"); 4121 4122 // If the LHS of a comparison is not a binary expression itself, the 4123 // additional linebreak confuses many people. 4124 verifyFormat( 4125 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4126 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 4127 "}"); 4128 verifyFormat( 4129 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4131 "}"); 4132 verifyFormat( 4133 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 4134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4135 "}"); 4136 verifyFormat( 4137 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 4139 "}"); 4140 // Even explicit parentheses stress the precedence enough to make the 4141 // additional break unnecessary. 4142 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4144 "}"); 4145 // This cases is borderline, but with the indentation it is still readable. 4146 verifyFormat( 4147 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4148 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4150 "}", 4151 getLLVMStyleWithColumns(75)); 4152 4153 // If the LHS is a binary expression, we should still use the additional break 4154 // as otherwise the formatting hides the operator precedence. 4155 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4157 " 5) {\n" 4158 "}"); 4159 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4161 " 5) {\n" 4162 "}"); 4163 4164 FormatStyle OnePerLine = getLLVMStyle(); 4165 OnePerLine.BinPackParameters = false; 4166 verifyFormat( 4167 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4169 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4170 OnePerLine); 4171 4172 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4173 " .aaa(aaaaaaaaaaaaa) *\n" 4174 " aaaaaaa +\n" 4175 " aaaaaaa;", 4176 getLLVMStyleWithColumns(40)); 4177 } 4178 4179 TEST_F(FormatTest, ExpressionIndentation) { 4180 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4181 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4182 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4184 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4185 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4188 " ccccccccccccccccccccccccccccccccccccccccc;"); 4189 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4191 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4192 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4193 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4194 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4195 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4196 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4197 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4199 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4200 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4201 verifyFormat("if () {\n" 4202 "} else if (aaaaa && bbbbb > // break\n" 4203 " ccccc) {\n" 4204 "}"); 4205 verifyFormat("if () {\n" 4206 "} else if constexpr (aaaaa && bbbbb > // break\n" 4207 " ccccc) {\n" 4208 "}"); 4209 verifyFormat("if () {\n" 4210 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4211 " ccccc) {\n" 4212 "}"); 4213 verifyFormat("if () {\n" 4214 "} else if (aaaaa &&\n" 4215 " bbbbb > // break\n" 4216 " ccccc &&\n" 4217 " ddddd) {\n" 4218 "}"); 4219 4220 // Presence of a trailing comment used to change indentation of b. 4221 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4222 " b;\n" 4223 "return aaaaaaaaaaaaaaaaaaa +\n" 4224 " b; //", 4225 getLLVMStyleWithColumns(30)); 4226 } 4227 4228 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4229 // Not sure what the best system is here. Like this, the LHS can be found 4230 // immediately above an operator (everything with the same or a higher 4231 // indent). The RHS is aligned right of the operator and so compasses 4232 // everything until something with the same indent as the operator is found. 4233 // FIXME: Is this a good system? 4234 FormatStyle Style = getLLVMStyle(); 4235 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4236 verifyFormat( 4237 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4238 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4239 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4240 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4241 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4242 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4243 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4244 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4245 " > ccccccccccccccccccccccccccccccccccccccccc;", 4246 Style); 4247 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4248 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4249 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4250 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4251 Style); 4252 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4253 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4254 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4255 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4256 Style); 4257 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4258 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4259 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4260 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4261 Style); 4262 verifyFormat("if () {\n" 4263 "} else if (aaaaa\n" 4264 " && bbbbb // break\n" 4265 " > ccccc) {\n" 4266 "}", 4267 Style); 4268 verifyFormat("return (a)\n" 4269 " // comment\n" 4270 " + b;", 4271 Style); 4272 verifyFormat( 4273 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4274 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4275 " + cc;", 4276 Style); 4277 4278 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4279 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4280 Style); 4281 4282 // Forced by comments. 4283 verifyFormat( 4284 "unsigned ContentSize =\n" 4285 " sizeof(int16_t) // DWARF ARange version number\n" 4286 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4287 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4288 " + sizeof(int8_t); // Segment Size (in bytes)"); 4289 4290 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4291 " == boost::fusion::at_c<1>(iiii).second;", 4292 Style); 4293 4294 Style.ColumnLimit = 60; 4295 verifyFormat("zzzzzzzzzz\n" 4296 " = bbbbbbbbbbbbbbbbb\n" 4297 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4298 Style); 4299 4300 Style.ColumnLimit = 80; 4301 Style.IndentWidth = 4; 4302 Style.TabWidth = 4; 4303 Style.UseTab = FormatStyle::UT_Always; 4304 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4305 Style.AlignOperands = false; 4306 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4307 "\t&& (someOtherLongishConditionPart1\n" 4308 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4309 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4310 "(someOtherLongishConditionPart1 || " 4311 "someOtherEvenLongerNestedConditionPart2);", 4312 Style)); 4313 } 4314 4315 TEST_F(FormatTest, EnforcedOperatorWraps) { 4316 // Here we'd like to wrap after the || operators, but a comment is forcing an 4317 // earlier wrap. 4318 verifyFormat("bool x = aaaaa //\n" 4319 " || bbbbb\n" 4320 " //\n" 4321 " || cccc;"); 4322 } 4323 4324 TEST_F(FormatTest, NoOperandAlignment) { 4325 FormatStyle Style = getLLVMStyle(); 4326 Style.AlignOperands = false; 4327 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4329 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4330 Style); 4331 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4332 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4333 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4334 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4335 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4336 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4337 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4338 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4339 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4340 " > ccccccccccccccccccccccccccccccccccccccccc;", 4341 Style); 4342 4343 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4344 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4345 " + cc;", 4346 Style); 4347 verifyFormat("int a = aa\n" 4348 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4349 " * cccccccccccccccccccccccccccccccccccc;\n", 4350 Style); 4351 4352 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4353 verifyFormat("return (a > b\n" 4354 " // comment1\n" 4355 " // comment2\n" 4356 " || c);", 4357 Style); 4358 } 4359 4360 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4361 FormatStyle Style = getLLVMStyle(); 4362 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4363 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4365 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4366 Style); 4367 } 4368 4369 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4370 FormatStyle Style = getLLVMStyle(); 4371 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4372 Style.BinPackArguments = false; 4373 Style.ColumnLimit = 40; 4374 verifyFormat("void test() {\n" 4375 " someFunction(\n" 4376 " this + argument + is + quite\n" 4377 " + long + so + it + gets + wrapped\n" 4378 " + but + remains + bin - packed);\n" 4379 "}", 4380 Style); 4381 verifyFormat("void test() {\n" 4382 " someFunction(arg1,\n" 4383 " this + argument + is\n" 4384 " + quite + long + so\n" 4385 " + it + gets + wrapped\n" 4386 " + but + remains + bin\n" 4387 " - packed,\n" 4388 " arg3);\n" 4389 "}", 4390 Style); 4391 verifyFormat("void test() {\n" 4392 " someFunction(\n" 4393 " arg1,\n" 4394 " this + argument + has\n" 4395 " + anotherFunc(nested,\n" 4396 " calls + whose\n" 4397 " + arguments\n" 4398 " + are + also\n" 4399 " + wrapped,\n" 4400 " in + addition)\n" 4401 " + to + being + bin - packed,\n" 4402 " arg3);\n" 4403 "}", 4404 Style); 4405 4406 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4407 verifyFormat("void test() {\n" 4408 " someFunction(\n" 4409 " arg1,\n" 4410 " this + argument + has +\n" 4411 " anotherFunc(nested,\n" 4412 " calls + whose +\n" 4413 " arguments +\n" 4414 " are + also +\n" 4415 " wrapped,\n" 4416 " in + addition) +\n" 4417 " to + being + bin - packed,\n" 4418 " arg3);\n" 4419 "}", 4420 Style); 4421 } 4422 4423 TEST_F(FormatTest, ConstructorInitializers) { 4424 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4425 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4426 getLLVMStyleWithColumns(45)); 4427 verifyFormat("Constructor()\n" 4428 " : Inttializer(FitsOnTheLine) {}", 4429 getLLVMStyleWithColumns(44)); 4430 verifyFormat("Constructor()\n" 4431 " : Inttializer(FitsOnTheLine) {}", 4432 getLLVMStyleWithColumns(43)); 4433 4434 verifyFormat("template <typename T>\n" 4435 "Constructor() : Initializer(FitsOnTheLine) {}", 4436 getLLVMStyleWithColumns(45)); 4437 4438 verifyFormat( 4439 "SomeClass::Constructor()\n" 4440 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4441 4442 verifyFormat( 4443 "SomeClass::Constructor()\n" 4444 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4445 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4446 verifyFormat( 4447 "SomeClass::Constructor()\n" 4448 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4449 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4450 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4451 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4452 " : aaaaaaaaaa(aaaaaa) {}"); 4453 4454 verifyFormat("Constructor()\n" 4455 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4456 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4457 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4458 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4459 4460 verifyFormat("Constructor()\n" 4461 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4462 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4463 4464 verifyFormat("Constructor(int Parameter = 0)\n" 4465 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4466 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4467 verifyFormat("Constructor()\n" 4468 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4469 "}", 4470 getLLVMStyleWithColumns(60)); 4471 verifyFormat("Constructor()\n" 4472 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4473 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4474 4475 // Here a line could be saved by splitting the second initializer onto two 4476 // lines, but that is not desirable. 4477 verifyFormat("Constructor()\n" 4478 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4479 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4480 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4481 4482 FormatStyle OnePerLine = getLLVMStyle(); 4483 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4484 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4485 verifyFormat("SomeClass::Constructor()\n" 4486 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4487 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4488 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4489 OnePerLine); 4490 verifyFormat("SomeClass::Constructor()\n" 4491 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4492 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4493 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4494 OnePerLine); 4495 verifyFormat("MyClass::MyClass(int var)\n" 4496 " : some_var_(var), // 4 space indent\n" 4497 " some_other_var_(var + 1) { // lined up\n" 4498 "}", 4499 OnePerLine); 4500 verifyFormat("Constructor()\n" 4501 " : aaaaa(aaaaaa),\n" 4502 " aaaaa(aaaaaa),\n" 4503 " aaaaa(aaaaaa),\n" 4504 " aaaaa(aaaaaa),\n" 4505 " aaaaa(aaaaaa) {}", 4506 OnePerLine); 4507 verifyFormat("Constructor()\n" 4508 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4509 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4510 OnePerLine); 4511 OnePerLine.BinPackParameters = false; 4512 verifyFormat( 4513 "Constructor()\n" 4514 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4515 " aaaaaaaaaaa().aaa(),\n" 4516 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4517 OnePerLine); 4518 OnePerLine.ColumnLimit = 60; 4519 verifyFormat("Constructor()\n" 4520 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4521 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4522 OnePerLine); 4523 4524 EXPECT_EQ("Constructor()\n" 4525 " : // Comment forcing unwanted break.\n" 4526 " aaaa(aaaa) {}", 4527 format("Constructor() :\n" 4528 " // Comment forcing unwanted break.\n" 4529 " aaaa(aaaa) {}")); 4530 } 4531 4532 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4533 FormatStyle Style = getLLVMStyle(); 4534 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4535 Style.ColumnLimit = 60; 4536 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4537 Style.AllowAllConstructorInitializersOnNextLine = true; 4538 Style.BinPackParameters = false; 4539 4540 for (int i = 0; i < 4; ++i) { 4541 // Test all combinations of parameters that should not have an effect. 4542 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4543 Style.AllowAllArgumentsOnNextLine = i & 2; 4544 4545 Style.AllowAllConstructorInitializersOnNextLine = true; 4546 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4547 verifyFormat("Constructor()\n" 4548 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4549 Style); 4550 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4551 4552 Style.AllowAllConstructorInitializersOnNextLine = false; 4553 verifyFormat("Constructor()\n" 4554 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4555 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4556 Style); 4557 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4558 4559 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4560 Style.AllowAllConstructorInitializersOnNextLine = true; 4561 verifyFormat("Constructor()\n" 4562 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4563 Style); 4564 4565 Style.AllowAllConstructorInitializersOnNextLine = false; 4566 verifyFormat("Constructor()\n" 4567 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4568 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4569 Style); 4570 4571 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4572 Style.AllowAllConstructorInitializersOnNextLine = true; 4573 verifyFormat("Constructor() :\n" 4574 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4575 Style); 4576 4577 Style.AllowAllConstructorInitializersOnNextLine = false; 4578 verifyFormat("Constructor() :\n" 4579 " aaaaaaaaaaaaaaaaaa(a),\n" 4580 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4581 Style); 4582 } 4583 4584 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4585 // AllowAllConstructorInitializersOnNextLine in all 4586 // BreakConstructorInitializers modes 4587 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4588 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4589 Style.AllowAllConstructorInitializersOnNextLine = false; 4590 verifyFormat("SomeClassWithALongName::Constructor(\n" 4591 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4592 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4593 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4594 Style); 4595 4596 Style.AllowAllConstructorInitializersOnNextLine = true; 4597 verifyFormat("SomeClassWithALongName::Constructor(\n" 4598 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4599 " int bbbbbbbbbbbbb,\n" 4600 " int cccccccccccccccc)\n" 4601 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4602 Style); 4603 4604 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4605 Style.AllowAllConstructorInitializersOnNextLine = false; 4606 verifyFormat("SomeClassWithALongName::Constructor(\n" 4607 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4608 " int bbbbbbbbbbbbb)\n" 4609 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4610 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4611 Style); 4612 4613 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4614 4615 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4616 verifyFormat("SomeClassWithALongName::Constructor(\n" 4617 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4618 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4619 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4620 Style); 4621 4622 Style.AllowAllConstructorInitializersOnNextLine = true; 4623 verifyFormat("SomeClassWithALongName::Constructor(\n" 4624 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4625 " int bbbbbbbbbbbbb,\n" 4626 " int cccccccccccccccc)\n" 4627 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4628 Style); 4629 4630 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4631 Style.AllowAllConstructorInitializersOnNextLine = false; 4632 verifyFormat("SomeClassWithALongName::Constructor(\n" 4633 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4634 " int bbbbbbbbbbbbb)\n" 4635 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4636 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4637 Style); 4638 4639 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4640 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4641 verifyFormat("SomeClassWithALongName::Constructor(\n" 4642 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4643 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4644 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4645 Style); 4646 4647 Style.AllowAllConstructorInitializersOnNextLine = true; 4648 verifyFormat("SomeClassWithALongName::Constructor(\n" 4649 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4650 " int bbbbbbbbbbbbb,\n" 4651 " int cccccccccccccccc) :\n" 4652 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4653 Style); 4654 4655 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4656 Style.AllowAllConstructorInitializersOnNextLine = false; 4657 verifyFormat("SomeClassWithALongName::Constructor(\n" 4658 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4659 " int bbbbbbbbbbbbb) :\n" 4660 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4661 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4662 Style); 4663 } 4664 4665 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4666 FormatStyle Style = getLLVMStyle(); 4667 Style.ColumnLimit = 60; 4668 Style.BinPackArguments = false; 4669 for (int i = 0; i < 4; ++i) { 4670 // Test all combinations of parameters that should not have an effect. 4671 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4672 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4673 4674 Style.AllowAllArgumentsOnNextLine = true; 4675 verifyFormat("void foo() {\n" 4676 " FunctionCallWithReallyLongName(\n" 4677 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4678 "}", 4679 Style); 4680 Style.AllowAllArgumentsOnNextLine = false; 4681 verifyFormat("void foo() {\n" 4682 " FunctionCallWithReallyLongName(\n" 4683 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4684 " bbbbbbbbbbbb);\n" 4685 "}", 4686 Style); 4687 4688 Style.AllowAllArgumentsOnNextLine = true; 4689 verifyFormat("void foo() {\n" 4690 " auto VariableWithReallyLongName = {\n" 4691 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4692 "}", 4693 Style); 4694 Style.AllowAllArgumentsOnNextLine = false; 4695 verifyFormat("void foo() {\n" 4696 " auto VariableWithReallyLongName = {\n" 4697 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4698 " bbbbbbbbbbbb};\n" 4699 "}", 4700 Style); 4701 } 4702 4703 // This parameter should not affect declarations. 4704 Style.BinPackParameters = false; 4705 Style.AllowAllArgumentsOnNextLine = false; 4706 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4707 verifyFormat("void FunctionCallWithReallyLongName(\n" 4708 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4709 Style); 4710 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4711 verifyFormat("void FunctionCallWithReallyLongName(\n" 4712 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4713 " int bbbbbbbbbbbb);", 4714 Style); 4715 } 4716 4717 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4718 FormatStyle Style = getLLVMStyle(); 4719 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4720 4721 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4722 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4723 getStyleWithColumns(Style, 45)); 4724 verifyFormat("Constructor() :\n" 4725 " Initializer(FitsOnTheLine) {}", 4726 getStyleWithColumns(Style, 44)); 4727 verifyFormat("Constructor() :\n" 4728 " Initializer(FitsOnTheLine) {}", 4729 getStyleWithColumns(Style, 43)); 4730 4731 verifyFormat("template <typename T>\n" 4732 "Constructor() : Initializer(FitsOnTheLine) {}", 4733 getStyleWithColumns(Style, 50)); 4734 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4735 verifyFormat( 4736 "SomeClass::Constructor() :\n" 4737 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4738 Style); 4739 4740 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4741 verifyFormat( 4742 "SomeClass::Constructor() :\n" 4743 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4744 Style); 4745 4746 verifyFormat( 4747 "SomeClass::Constructor() :\n" 4748 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4749 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4750 Style); 4751 verifyFormat( 4752 "SomeClass::Constructor() :\n" 4753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4754 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4755 Style); 4756 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4757 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4758 " aaaaaaaaaa(aaaaaa) {}", 4759 Style); 4760 4761 verifyFormat("Constructor() :\n" 4762 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4763 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4764 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4765 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4766 Style); 4767 4768 verifyFormat("Constructor() :\n" 4769 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4770 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4771 Style); 4772 4773 verifyFormat("Constructor(int Parameter = 0) :\n" 4774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4775 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4776 Style); 4777 verifyFormat("Constructor() :\n" 4778 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4779 "}", 4780 getStyleWithColumns(Style, 60)); 4781 verifyFormat("Constructor() :\n" 4782 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4783 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4784 Style); 4785 4786 // Here a line could be saved by splitting the second initializer onto two 4787 // lines, but that is not desirable. 4788 verifyFormat("Constructor() :\n" 4789 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4790 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4791 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4792 Style); 4793 4794 FormatStyle OnePerLine = Style; 4795 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4796 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4797 verifyFormat("SomeClass::Constructor() :\n" 4798 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4799 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4800 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4801 OnePerLine); 4802 verifyFormat("SomeClass::Constructor() :\n" 4803 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4804 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4805 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4806 OnePerLine); 4807 verifyFormat("MyClass::MyClass(int var) :\n" 4808 " some_var_(var), // 4 space indent\n" 4809 " some_other_var_(var + 1) { // lined up\n" 4810 "}", 4811 OnePerLine); 4812 verifyFormat("Constructor() :\n" 4813 " aaaaa(aaaaaa),\n" 4814 " aaaaa(aaaaaa),\n" 4815 " aaaaa(aaaaaa),\n" 4816 " aaaaa(aaaaaa),\n" 4817 " aaaaa(aaaaaa) {}", 4818 OnePerLine); 4819 verifyFormat("Constructor() :\n" 4820 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4821 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4822 OnePerLine); 4823 OnePerLine.BinPackParameters = false; 4824 verifyFormat("Constructor() :\n" 4825 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4826 " aaaaaaaaaaa().aaa(),\n" 4827 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4828 OnePerLine); 4829 OnePerLine.ColumnLimit = 60; 4830 verifyFormat("Constructor() :\n" 4831 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4832 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4833 OnePerLine); 4834 4835 EXPECT_EQ("Constructor() :\n" 4836 " // Comment forcing unwanted break.\n" 4837 " aaaa(aaaa) {}", 4838 format("Constructor() :\n" 4839 " // Comment forcing unwanted break.\n" 4840 " aaaa(aaaa) {}", 4841 Style)); 4842 4843 Style.ColumnLimit = 0; 4844 verifyFormat("SomeClass::Constructor() :\n" 4845 " a(a) {}", 4846 Style); 4847 verifyFormat("SomeClass::Constructor() noexcept :\n" 4848 " a(a) {}", 4849 Style); 4850 verifyFormat("SomeClass::Constructor() :\n" 4851 " a(a), b(b), c(c) {}", 4852 Style); 4853 verifyFormat("SomeClass::Constructor() :\n" 4854 " a(a) {\n" 4855 " foo();\n" 4856 " bar();\n" 4857 "}", 4858 Style); 4859 4860 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4861 verifyFormat("SomeClass::Constructor() :\n" 4862 " a(a), b(b), c(c) {\n" 4863 "}", 4864 Style); 4865 verifyFormat("SomeClass::Constructor() :\n" 4866 " a(a) {\n" 4867 "}", 4868 Style); 4869 4870 Style.ColumnLimit = 80; 4871 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4872 Style.ConstructorInitializerIndentWidth = 2; 4873 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 4874 verifyFormat("SomeClass::Constructor() :\n" 4875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4876 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4877 Style); 4878 4879 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 4880 // well 4881 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4882 verifyFormat( 4883 "class SomeClass\n" 4884 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4885 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4886 Style); 4887 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4888 verifyFormat( 4889 "class SomeClass\n" 4890 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4891 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4892 Style); 4893 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4894 verifyFormat( 4895 "class SomeClass :\n" 4896 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4897 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4898 Style); 4899 } 4900 4901 #ifndef EXPENSIVE_CHECKS 4902 // Expensive checks enables libstdc++ checking which includes validating the 4903 // state of ranges used in std::priority_queue - this blows out the 4904 // runtime/scalability of the function and makes this test unacceptably slow. 4905 TEST_F(FormatTest, MemoizationTests) { 4906 // This breaks if the memoization lookup does not take \c Indent and 4907 // \c LastSpace into account. 4908 verifyFormat( 4909 "extern CFRunLoopTimerRef\n" 4910 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4911 " CFTimeInterval interval, CFOptionFlags flags,\n" 4912 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4913 " CFRunLoopTimerContext *context) {}"); 4914 4915 // Deep nesting somewhat works around our memoization. 4916 verifyFormat( 4917 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4918 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4919 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4920 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4921 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4922 getLLVMStyleWithColumns(65)); 4923 verifyFormat( 4924 "aaaaa(\n" 4925 " aaaaa,\n" 4926 " aaaaa(\n" 4927 " aaaaa,\n" 4928 " aaaaa(\n" 4929 " aaaaa,\n" 4930 " aaaaa(\n" 4931 " aaaaa,\n" 4932 " aaaaa(\n" 4933 " aaaaa,\n" 4934 " aaaaa(\n" 4935 " aaaaa,\n" 4936 " aaaaa(\n" 4937 " aaaaa,\n" 4938 " aaaaa(\n" 4939 " aaaaa,\n" 4940 " aaaaa(\n" 4941 " aaaaa,\n" 4942 " aaaaa(\n" 4943 " aaaaa,\n" 4944 " aaaaa(\n" 4945 " aaaaa,\n" 4946 " aaaaa(\n" 4947 " aaaaa,\n" 4948 " aaaaa))))))))))));", 4949 getLLVMStyleWithColumns(65)); 4950 verifyFormat( 4951 "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" 4952 " a),\n" 4953 " a),\n" 4954 " a),\n" 4955 " a),\n" 4956 " a),\n" 4957 " a),\n" 4958 " a),\n" 4959 " a),\n" 4960 " a),\n" 4961 " a),\n" 4962 " a),\n" 4963 " a),\n" 4964 " a),\n" 4965 " a),\n" 4966 " a),\n" 4967 " a),\n" 4968 " a)", 4969 getLLVMStyleWithColumns(65)); 4970 4971 // This test takes VERY long when memoization is broken. 4972 FormatStyle OnePerLine = getLLVMStyle(); 4973 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4974 OnePerLine.BinPackParameters = false; 4975 std::string input = "Constructor()\n" 4976 " : aaaa(a,\n"; 4977 for (unsigned i = 0, e = 80; i != e; ++i) { 4978 input += " a,\n"; 4979 } 4980 input += " a) {}"; 4981 verifyFormat(input, OnePerLine); 4982 } 4983 #endif 4984 4985 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4986 verifyFormat( 4987 "void f() {\n" 4988 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4989 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4990 " f();\n" 4991 "}"); 4992 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4993 " Intervals[i - 1].getRange().getLast()) {\n}"); 4994 } 4995 4996 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4997 // Principially, we break function declarations in a certain order: 4998 // 1) break amongst arguments. 4999 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 5000 " Cccccccccccccc cccccccccccccc);"); 5001 verifyFormat("template <class TemplateIt>\n" 5002 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 5003 " TemplateIt *stop) {}"); 5004 5005 // 2) break after return type. 5006 verifyFormat( 5007 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5008 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 5009 getGoogleStyle()); 5010 5011 // 3) break after (. 5012 verifyFormat( 5013 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 5014 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 5015 getGoogleStyle()); 5016 5017 // 4) break before after nested name specifiers. 5018 verifyFormat( 5019 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5020 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 5021 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 5022 getGoogleStyle()); 5023 5024 // However, there are exceptions, if a sufficient amount of lines can be 5025 // saved. 5026 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 5027 // more adjusting. 5028 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5029 " Cccccccccccccc cccccccccc,\n" 5030 " Cccccccccccccc cccccccccc,\n" 5031 " Cccccccccccccc cccccccccc,\n" 5032 " Cccccccccccccc cccccccccc);"); 5033 verifyFormat( 5034 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5035 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5036 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5037 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 5038 getGoogleStyle()); 5039 verifyFormat( 5040 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5041 " Cccccccccccccc cccccccccc,\n" 5042 " Cccccccccccccc cccccccccc,\n" 5043 " Cccccccccccccc cccccccccc,\n" 5044 " Cccccccccccccc cccccccccc,\n" 5045 " Cccccccccccccc cccccccccc,\n" 5046 " Cccccccccccccc cccccccccc);"); 5047 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5048 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5049 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5050 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5051 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 5052 5053 // Break after multi-line parameters. 5054 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5057 " bbbb bbbb);"); 5058 verifyFormat("void SomeLoooooooooooongFunction(\n" 5059 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5060 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5061 " int bbbbbbbbbbbbb);"); 5062 5063 // Treat overloaded operators like other functions. 5064 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5065 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 5066 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5067 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 5068 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5069 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 5070 verifyGoogleFormat( 5071 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 5072 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5073 verifyGoogleFormat( 5074 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 5075 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5076 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5077 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5078 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 5079 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5080 verifyGoogleFormat( 5081 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 5082 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5083 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 5084 verifyGoogleFormat("template <typename T>\n" 5085 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5086 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 5087 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 5088 5089 FormatStyle Style = getLLVMStyle(); 5090 Style.PointerAlignment = FormatStyle::PAS_Left; 5091 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5092 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 5093 Style); 5094 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 5095 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5096 Style); 5097 } 5098 5099 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 5100 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 5101 // Prefer keeping `::` followed by `operator` together. 5102 EXPECT_EQ("const aaaa::bbbbbbb &\n" 5103 "ccccccccc::operator++() {\n" 5104 " stuff();\n" 5105 "}", 5106 format("const aaaa::bbbbbbb\n" 5107 "&ccccccccc::operator++() { stuff(); }", 5108 getLLVMStyleWithColumns(40))); 5109 } 5110 5111 TEST_F(FormatTest, TrailingReturnType) { 5112 verifyFormat("auto foo() -> int;\n"); 5113 // correct trailing return type spacing 5114 verifyFormat("auto operator->() -> int;\n"); 5115 verifyFormat("auto operator++(int) -> int;\n"); 5116 5117 verifyFormat("struct S {\n" 5118 " auto bar() const -> int;\n" 5119 "};"); 5120 verifyFormat("template <size_t Order, typename T>\n" 5121 "auto load_img(const std::string &filename)\n" 5122 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5123 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5124 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5125 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5126 verifyFormat("template <typename T>\n" 5127 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5128 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5129 5130 // Not trailing return types. 5131 verifyFormat("void f() { auto a = b->c(); }"); 5132 } 5133 5134 TEST_F(FormatTest, DeductionGuides) { 5135 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5136 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5137 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5138 verifyFormat( 5139 "template <class... T>\n" 5140 "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5141 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5142 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5143 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5144 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5145 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5146 verifyFormat("template <class T> x() -> x<1>;"); 5147 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5148 5149 // Ensure not deduction guides. 5150 verifyFormat("c()->f<int>();"); 5151 verifyFormat("x()->foo<1>;"); 5152 verifyFormat("x = p->foo<3>();"); 5153 verifyFormat("x()->x<1>();"); 5154 verifyFormat("x()->x<1>;"); 5155 } 5156 5157 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5158 // Avoid breaking before trailing 'const' or other trailing annotations, if 5159 // they are not function-like. 5160 FormatStyle Style = getGoogleStyle(); 5161 Style.ColumnLimit = 47; 5162 verifyFormat("void someLongFunction(\n" 5163 " int someLoooooooooooooongParameter) const {\n}", 5164 getLLVMStyleWithColumns(47)); 5165 verifyFormat("LoooooongReturnType\n" 5166 "someLoooooooongFunction() const {}", 5167 getLLVMStyleWithColumns(47)); 5168 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5169 " const {}", 5170 Style); 5171 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5172 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5173 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5174 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5175 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5176 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5177 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5178 " aaaaaaaaaaa aaaaa) const override;"); 5179 verifyGoogleFormat( 5180 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5181 " const override;"); 5182 5183 // Even if the first parameter has to be wrapped. 5184 verifyFormat("void someLongFunction(\n" 5185 " int someLongParameter) const {}", 5186 getLLVMStyleWithColumns(46)); 5187 verifyFormat("void someLongFunction(\n" 5188 " int someLongParameter) const {}", 5189 Style); 5190 verifyFormat("void someLongFunction(\n" 5191 " int someLongParameter) override {}", 5192 Style); 5193 verifyFormat("void someLongFunction(\n" 5194 " int someLongParameter) OVERRIDE {}", 5195 Style); 5196 verifyFormat("void someLongFunction(\n" 5197 " int someLongParameter) final {}", 5198 Style); 5199 verifyFormat("void someLongFunction(\n" 5200 " int someLongParameter) FINAL {}", 5201 Style); 5202 verifyFormat("void someLongFunction(\n" 5203 " int parameter) const override {}", 5204 Style); 5205 5206 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5207 verifyFormat("void someLongFunction(\n" 5208 " int someLongParameter) const\n" 5209 "{\n" 5210 "}", 5211 Style); 5212 5213 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5214 verifyFormat("void someLongFunction(\n" 5215 " int someLongParameter) const\n" 5216 " {\n" 5217 " }", 5218 Style); 5219 5220 // Unless these are unknown annotations. 5221 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5222 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5223 " LONG_AND_UGLY_ANNOTATION;"); 5224 5225 // Breaking before function-like trailing annotations is fine to keep them 5226 // close to their arguments. 5227 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5228 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5229 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5230 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5231 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5232 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5233 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5234 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5235 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5236 5237 verifyFormat( 5238 "void aaaaaaaaaaaaaaaaaa()\n" 5239 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5240 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5241 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5242 " __attribute__((unused));"); 5243 verifyGoogleFormat( 5244 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5245 " GUARDED_BY(aaaaaaaaaaaa);"); 5246 verifyGoogleFormat( 5247 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5248 " GUARDED_BY(aaaaaaaaaaaa);"); 5249 verifyGoogleFormat( 5250 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5251 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5252 verifyGoogleFormat( 5253 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5254 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5255 } 5256 5257 TEST_F(FormatTest, FunctionAnnotations) { 5258 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5259 "int OldFunction(const string ¶meter) {}"); 5260 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5261 "string OldFunction(const string ¶meter) {}"); 5262 verifyFormat("template <typename T>\n" 5263 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5264 "string OldFunction(const string ¶meter) {}"); 5265 5266 // Not function annotations. 5267 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5268 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5269 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5270 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5271 verifyFormat("MACRO(abc).function() // wrap\n" 5272 " << abc;"); 5273 verifyFormat("MACRO(abc)->function() // wrap\n" 5274 " << abc;"); 5275 verifyFormat("MACRO(abc)::function() // wrap\n" 5276 " << abc;"); 5277 } 5278 5279 TEST_F(FormatTest, BreaksDesireably) { 5280 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5281 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5282 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5283 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5285 "}"); 5286 5287 verifyFormat( 5288 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5289 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5290 5291 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5292 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5294 5295 verifyFormat( 5296 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5297 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5299 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5301 5302 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5303 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5304 5305 verifyFormat( 5306 "void f() {\n" 5307 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5308 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5309 "}"); 5310 verifyFormat( 5311 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5312 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5313 verifyFormat( 5314 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5315 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5316 verifyFormat( 5317 "aaaaaa(aaa,\n" 5318 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5320 " aaaa);"); 5321 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5323 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5324 5325 // Indent consistently independent of call expression and unary operator. 5326 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5327 " dddddddddddddddddddddddddddddd));"); 5328 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5329 " dddddddddddddddddddddddddddddd));"); 5330 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5331 " dddddddddddddddddddddddddddddd));"); 5332 5333 // This test case breaks on an incorrect memoization, i.e. an optimization not 5334 // taking into account the StopAt value. 5335 verifyFormat( 5336 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5337 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5338 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5339 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5340 5341 verifyFormat("{\n {\n {\n" 5342 " Annotation.SpaceRequiredBefore =\n" 5343 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5344 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5345 " }\n }\n}"); 5346 5347 // Break on an outer level if there was a break on an inner level. 5348 EXPECT_EQ("f(g(h(a, // comment\n" 5349 " b, c),\n" 5350 " d, e),\n" 5351 " x, y);", 5352 format("f(g(h(a, // comment\n" 5353 " b, c), d, e), x, y);")); 5354 5355 // Prefer breaking similar line breaks. 5356 verifyFormat( 5357 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5358 " NSTrackingMouseEnteredAndExited |\n" 5359 " NSTrackingActiveAlways;"); 5360 } 5361 5362 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5363 FormatStyle NoBinPacking = getGoogleStyle(); 5364 NoBinPacking.BinPackParameters = false; 5365 NoBinPacking.BinPackArguments = true; 5366 verifyFormat("void f() {\n" 5367 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5369 "}", 5370 NoBinPacking); 5371 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5372 " int aaaaaaaaaaaaaaaaaaaa,\n" 5373 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5374 NoBinPacking); 5375 5376 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5377 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5378 " vector<int> bbbbbbbbbbbbbbb);", 5379 NoBinPacking); 5380 // FIXME: This behavior difference is probably not wanted. However, currently 5381 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5382 // template arguments from BreakBeforeParameter being set because of the 5383 // one-per-line formatting. 5384 verifyFormat( 5385 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5386 " aaaaaaaaaa> aaaaaaaaaa);", 5387 NoBinPacking); 5388 verifyFormat( 5389 "void fffffffffff(\n" 5390 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5391 " aaaaaaaaaa);"); 5392 } 5393 5394 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5395 FormatStyle NoBinPacking = getGoogleStyle(); 5396 NoBinPacking.BinPackParameters = false; 5397 NoBinPacking.BinPackArguments = false; 5398 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5399 " aaaaaaaaaaaaaaaaaaaa,\n" 5400 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5401 NoBinPacking); 5402 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5403 " aaaaaaaaaaaaa,\n" 5404 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5405 NoBinPacking); 5406 verifyFormat( 5407 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5408 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5409 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5410 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5412 NoBinPacking); 5413 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5414 " .aaaaaaaaaaaaaaaaaa();", 5415 NoBinPacking); 5416 verifyFormat("void f() {\n" 5417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5418 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5419 "}", 5420 NoBinPacking); 5421 5422 verifyFormat( 5423 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5424 " aaaaaaaaaaaa,\n" 5425 " aaaaaaaaaaaa);", 5426 NoBinPacking); 5427 verifyFormat( 5428 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5429 " ddddddddddddddddddddddddddddd),\n" 5430 " test);", 5431 NoBinPacking); 5432 5433 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5434 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5435 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5436 " aaaaaaaaaaaaaaaaaa;", 5437 NoBinPacking); 5438 verifyFormat("a(\"a\"\n" 5439 " \"a\",\n" 5440 " a);"); 5441 5442 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5443 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5444 " aaaaaaaaa,\n" 5445 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5446 NoBinPacking); 5447 verifyFormat( 5448 "void f() {\n" 5449 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5450 " .aaaaaaa();\n" 5451 "}", 5452 NoBinPacking); 5453 verifyFormat( 5454 "template <class SomeType, class SomeOtherType>\n" 5455 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5456 NoBinPacking); 5457 } 5458 5459 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5460 FormatStyle Style = getLLVMStyleWithColumns(15); 5461 Style.ExperimentalAutoDetectBinPacking = true; 5462 EXPECT_EQ("aaa(aaaa,\n" 5463 " aaaa,\n" 5464 " aaaa);\n" 5465 "aaa(aaaa,\n" 5466 " aaaa,\n" 5467 " aaaa);", 5468 format("aaa(aaaa,\n" // one-per-line 5469 " aaaa,\n" 5470 " aaaa );\n" 5471 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5472 Style)); 5473 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5474 " aaaa);\n" 5475 "aaa(aaaa, aaaa,\n" 5476 " aaaa);", 5477 format("aaa(aaaa, aaaa,\n" // bin-packed 5478 " aaaa );\n" 5479 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5480 Style)); 5481 } 5482 5483 TEST_F(FormatTest, FormatsBuilderPattern) { 5484 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5485 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5486 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5487 " .StartsWith(\".init\", ORDER_INIT)\n" 5488 " .StartsWith(\".fini\", ORDER_FINI)\n" 5489 " .StartsWith(\".hash\", ORDER_HASH)\n" 5490 " .Default(ORDER_TEXT);\n"); 5491 5492 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5493 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5494 verifyFormat("aaaaaaa->aaaaaaa\n" 5495 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5497 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5498 verifyFormat( 5499 "aaaaaaa->aaaaaaa\n" 5500 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5501 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5502 verifyFormat( 5503 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5504 " aaaaaaaaaaaaaa);"); 5505 verifyFormat( 5506 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5507 " aaaaaa->aaaaaaaaaaaa()\n" 5508 " ->aaaaaaaaaaaaaaaa(\n" 5509 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5510 " ->aaaaaaaaaaaaaaaaa();"); 5511 verifyGoogleFormat( 5512 "void f() {\n" 5513 " someo->Add((new util::filetools::Handler(dir))\n" 5514 " ->OnEvent1(NewPermanentCallback(\n" 5515 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5516 " ->OnEvent2(NewPermanentCallback(\n" 5517 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5518 " ->OnEvent3(NewPermanentCallback(\n" 5519 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5520 " ->OnEvent5(NewPermanentCallback(\n" 5521 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5522 " ->OnEvent6(NewPermanentCallback(\n" 5523 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5524 "}"); 5525 5526 verifyFormat( 5527 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5528 verifyFormat("aaaaaaaaaaaaaaa()\n" 5529 " .aaaaaaaaaaaaaaa()\n" 5530 " .aaaaaaaaaaaaaaa()\n" 5531 " .aaaaaaaaaaaaaaa()\n" 5532 " .aaaaaaaaaaaaaaa();"); 5533 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5534 " .aaaaaaaaaaaaaaa()\n" 5535 " .aaaaaaaaaaaaaaa()\n" 5536 " .aaaaaaaaaaaaaaa();"); 5537 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5538 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5539 " .aaaaaaaaaaaaaaa();"); 5540 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5541 " ->aaaaaaaaaaaaaae(0)\n" 5542 " ->aaaaaaaaaaaaaaa();"); 5543 5544 // Don't linewrap after very short segments. 5545 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5546 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5547 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5548 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5549 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5550 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5551 verifyFormat("aaa()\n" 5552 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5553 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5554 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5555 5556 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5557 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5558 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5559 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5560 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5561 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5562 5563 // Prefer not to break after empty parentheses. 5564 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5565 " First->LastNewlineOffset);"); 5566 5567 // Prefer not to create "hanging" indents. 5568 verifyFormat( 5569 "return !soooooooooooooome_map\n" 5570 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5571 " .second;"); 5572 verifyFormat( 5573 "return aaaaaaaaaaaaaaaa\n" 5574 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5575 " .aaaa(aaaaaaaaaaaaaa);"); 5576 // No hanging indent here. 5577 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5579 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5581 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5582 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5583 getLLVMStyleWithColumns(60)); 5584 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5585 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5586 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5587 getLLVMStyleWithColumns(59)); 5588 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5590 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5591 5592 // Dont break if only closing statements before member call 5593 verifyFormat("test() {\n" 5594 " ([]() -> {\n" 5595 " int b = 32;\n" 5596 " return 3;\n" 5597 " }).foo();\n" 5598 "}"); 5599 verifyFormat("test() {\n" 5600 " (\n" 5601 " []() -> {\n" 5602 " int b = 32;\n" 5603 " return 3;\n" 5604 " },\n" 5605 " foo, bar)\n" 5606 " .foo();\n" 5607 "}"); 5608 verifyFormat("test() {\n" 5609 " ([]() -> {\n" 5610 " int b = 32;\n" 5611 " return 3;\n" 5612 " })\n" 5613 " .foo()\n" 5614 " .bar();\n" 5615 "}"); 5616 verifyFormat("test() {\n" 5617 " ([]() -> {\n" 5618 " int b = 32;\n" 5619 " return 3;\n" 5620 " })\n" 5621 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5622 " \"bbbb\");\n" 5623 "}", 5624 getLLVMStyleWithColumns(30)); 5625 } 5626 5627 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5628 verifyFormat( 5629 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5630 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5631 verifyFormat( 5632 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5633 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5634 5635 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5636 " ccccccccccccccccccccccccc) {\n}"); 5637 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5638 " ccccccccccccccccccccccccc) {\n}"); 5639 5640 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5641 " ccccccccccccccccccccccccc) {\n}"); 5642 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5643 " ccccccccccccccccccccccccc) {\n}"); 5644 5645 verifyFormat( 5646 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5647 " ccccccccccccccccccccccccc) {\n}"); 5648 verifyFormat( 5649 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5650 " ccccccccccccccccccccccccc) {\n}"); 5651 5652 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5653 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5654 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5655 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5656 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5657 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5658 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5659 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5660 5661 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5662 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5663 " aaaaaaaaaaaaaaa != aa) {\n}"); 5664 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5665 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5666 " aaaaaaaaaaaaaaa != aa) {\n}"); 5667 } 5668 5669 TEST_F(FormatTest, BreaksAfterAssignments) { 5670 verifyFormat( 5671 "unsigned Cost =\n" 5672 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5673 " SI->getPointerAddressSpaceee());\n"); 5674 verifyFormat( 5675 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5676 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5677 5678 verifyFormat( 5679 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5680 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5681 verifyFormat("unsigned OriginalStartColumn =\n" 5682 " SourceMgr.getSpellingColumnNumber(\n" 5683 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5684 " 1;"); 5685 } 5686 5687 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5688 FormatStyle Style = getLLVMStyle(); 5689 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5690 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5691 Style); 5692 5693 Style.PenaltyBreakAssignment = 20; 5694 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5695 " cccccccccccccccccccccccccc;", 5696 Style); 5697 } 5698 5699 TEST_F(FormatTest, AlignsAfterAssignments) { 5700 verifyFormat( 5701 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5702 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5703 verifyFormat( 5704 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5705 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5706 verifyFormat( 5707 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5708 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5709 verifyFormat( 5710 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5711 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5712 verifyFormat( 5713 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5714 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5715 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5716 } 5717 5718 TEST_F(FormatTest, AlignsAfterReturn) { 5719 verifyFormat( 5720 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5721 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5722 verifyFormat( 5723 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5724 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5725 verifyFormat( 5726 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5727 " aaaaaaaaaaaaaaaaaaaaaa();"); 5728 verifyFormat( 5729 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5730 " aaaaaaaaaaaaaaaaaaaaaa());"); 5731 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5732 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5733 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5734 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5736 verifyFormat("return\n" 5737 " // true if code is one of a or b.\n" 5738 " code == a || code == b;"); 5739 } 5740 5741 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5742 verifyFormat( 5743 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5744 " aaaaaaaaa aaaaaaa) {}"); 5745 verifyFormat( 5746 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5747 " aaaaaaaaaaa aaaaaaaaa);"); 5748 verifyFormat( 5749 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5750 " aaaaaaaaaaaaaaaaaaaaa));"); 5751 FormatStyle Style = getLLVMStyle(); 5752 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5753 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5754 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5755 Style); 5756 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5757 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5758 Style); 5759 verifyFormat("SomeLongVariableName->someFunction(\n" 5760 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5761 Style); 5762 verifyFormat( 5763 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5764 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5765 Style); 5766 verifyFormat( 5767 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5768 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5769 Style); 5770 verifyFormat( 5771 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5772 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5773 Style); 5774 5775 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5776 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5777 " b));", 5778 Style); 5779 5780 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5781 Style.BinPackArguments = false; 5782 Style.BinPackParameters = false; 5783 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5784 " aaaaaaaaaaa aaaaaaaa,\n" 5785 " aaaaaaaaa aaaaaaa,\n" 5786 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5787 Style); 5788 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5789 " aaaaaaaaaaa aaaaaaaaa,\n" 5790 " aaaaaaaaaaa aaaaaaaaa,\n" 5791 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5792 Style); 5793 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5794 " aaaaaaaaaaaaaaa,\n" 5795 " aaaaaaaaaaaaaaaaaaaaa,\n" 5796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5797 Style); 5798 verifyFormat( 5799 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5800 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5801 Style); 5802 verifyFormat( 5803 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5804 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5805 Style); 5806 verifyFormat( 5807 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5808 " aaaaaaaaaaaaaaaaaaaaa(\n" 5809 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5810 " aaaaaaaaaaaaaaaa);", 5811 Style); 5812 verifyFormat( 5813 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5814 " aaaaaaaaaaaaaaaaaaaaa(\n" 5815 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5816 " aaaaaaaaaaaaaaaa);", 5817 Style); 5818 } 5819 5820 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5821 FormatStyle Style = getLLVMStyleWithColumns(40); 5822 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5823 " bbbbbbbbbbbbbbbbbbbbbb);", 5824 Style); 5825 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5826 Style.AlignOperands = false; 5827 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5828 " bbbbbbbbbbbbbbbbbbbbbb);", 5829 Style); 5830 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5831 Style.AlignOperands = true; 5832 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5833 " bbbbbbbbbbbbbbbbbbbbbb);", 5834 Style); 5835 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5836 Style.AlignOperands = false; 5837 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5838 " bbbbbbbbbbbbbbbbbbbbbb);", 5839 Style); 5840 } 5841 5842 TEST_F(FormatTest, BreaksConditionalExpressions) { 5843 verifyFormat( 5844 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5845 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5846 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5847 verifyFormat( 5848 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5849 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5850 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5851 verifyFormat( 5852 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5853 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5854 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5855 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5856 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5857 verifyFormat( 5858 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5859 " : aaaaaaaaaaaaa);"); 5860 verifyFormat( 5861 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5862 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5863 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5864 " aaaaaaaaaaaaa);"); 5865 verifyFormat( 5866 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5867 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5868 " aaaaaaaaaaaaa);"); 5869 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5870 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5872 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5873 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5874 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5876 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5878 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5879 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5880 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5881 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5882 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5883 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5885 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5886 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5887 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5888 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5889 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5890 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5891 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5892 " : aaaaaaaaaaaaaaaa;"); 5893 verifyFormat( 5894 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5895 " ? aaaaaaaaaaaaaaa\n" 5896 " : aaaaaaaaaaaaaaa;"); 5897 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5898 " aaaaaaaaa\n" 5899 " ? b\n" 5900 " : c);"); 5901 verifyFormat("return aaaa == bbbb\n" 5902 " // comment\n" 5903 " ? aaaa\n" 5904 " : bbbb;"); 5905 verifyFormat("unsigned Indent =\n" 5906 " format(TheLine.First,\n" 5907 " IndentForLevel[TheLine.Level] >= 0\n" 5908 " ? IndentForLevel[TheLine.Level]\n" 5909 " : TheLine * 2,\n" 5910 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5911 getLLVMStyleWithColumns(60)); 5912 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5913 " ? aaaaaaaaaaaaaaa\n" 5914 " : bbbbbbbbbbbbbbb //\n" 5915 " ? ccccccccccccccc\n" 5916 " : ddddddddddddddd;"); 5917 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5918 " ? aaaaaaaaaaaaaaa\n" 5919 " : (bbbbbbbbbbbbbbb //\n" 5920 " ? ccccccccccccccc\n" 5921 " : ddddddddddddddd);"); 5922 verifyFormat( 5923 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5924 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5925 " aaaaaaaaaaaaaaaaaaaaa +\n" 5926 " aaaaaaaaaaaaaaaaaaaaa\n" 5927 " : aaaaaaaaaa;"); 5928 verifyFormat( 5929 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5930 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5931 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5932 5933 FormatStyle NoBinPacking = getLLVMStyle(); 5934 NoBinPacking.BinPackArguments = false; 5935 verifyFormat( 5936 "void f() {\n" 5937 " g(aaa,\n" 5938 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5940 " ? aaaaaaaaaaaaaaa\n" 5941 " : aaaaaaaaaaaaaaa);\n" 5942 "}", 5943 NoBinPacking); 5944 verifyFormat( 5945 "void f() {\n" 5946 " g(aaa,\n" 5947 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5948 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5949 " ?: aaaaaaaaaaaaaaa);\n" 5950 "}", 5951 NoBinPacking); 5952 5953 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5954 " // comment.\n" 5955 " ccccccccccccccccccccccccccccccccccccccc\n" 5956 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5957 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5958 5959 // Assignments in conditional expressions. Apparently not uncommon :-(. 5960 verifyFormat("return a != b\n" 5961 " // comment\n" 5962 " ? a = b\n" 5963 " : a = b;"); 5964 verifyFormat("return a != b\n" 5965 " // comment\n" 5966 " ? a = a != b\n" 5967 " // comment\n" 5968 " ? a = b\n" 5969 " : a\n" 5970 " : a;\n"); 5971 verifyFormat("return a != b\n" 5972 " // comment\n" 5973 " ? a\n" 5974 " : a = a != b\n" 5975 " // comment\n" 5976 " ? a = b\n" 5977 " : a;"); 5978 } 5979 5980 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5981 FormatStyle Style = getLLVMStyle(); 5982 Style.BreakBeforeTernaryOperators = false; 5983 Style.ColumnLimit = 70; 5984 verifyFormat( 5985 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5986 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5987 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5988 Style); 5989 verifyFormat( 5990 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5991 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5992 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5993 Style); 5994 verifyFormat( 5995 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5997 Style); 5998 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5999 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6001 Style); 6002 verifyFormat( 6003 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 6004 " aaaaaaaaaaaaa);", 6005 Style); 6006 verifyFormat( 6007 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6008 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6009 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6010 " aaaaaaaaaaaaa);", 6011 Style); 6012 verifyFormat( 6013 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6014 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6015 " aaaaaaaaaaaaa);", 6016 Style); 6017 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6018 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6020 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6021 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6022 Style); 6023 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6029 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6030 Style); 6031 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 6033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6034 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6035 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6036 Style); 6037 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6038 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6039 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6040 Style); 6041 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6042 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6043 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6045 Style); 6046 verifyFormat( 6047 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6048 " aaaaaaaaaaaaaaa :\n" 6049 " aaaaaaaaaaaaaaa;", 6050 Style); 6051 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6052 " aaaaaaaaa ?\n" 6053 " b :\n" 6054 " c);", 6055 Style); 6056 verifyFormat("unsigned Indent =\n" 6057 " format(TheLine.First,\n" 6058 " IndentForLevel[TheLine.Level] >= 0 ?\n" 6059 " IndentForLevel[TheLine.Level] :\n" 6060 " TheLine * 2,\n" 6061 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6062 Style); 6063 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6064 " aaaaaaaaaaaaaaa :\n" 6065 " bbbbbbbbbbbbbbb ? //\n" 6066 " ccccccccccccccc :\n" 6067 " ddddddddddddddd;", 6068 Style); 6069 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6070 " aaaaaaaaaaaaaaa :\n" 6071 " (bbbbbbbbbbbbbbb ? //\n" 6072 " ccccccccccccccc :\n" 6073 " ddddddddddddddd);", 6074 Style); 6075 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6076 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 6077 " ccccccccccccccccccccccccccc;", 6078 Style); 6079 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6080 " aaaaa :\n" 6081 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 6082 Style); 6083 } 6084 6085 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 6086 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 6087 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 6088 verifyFormat("bool a = true, b = false;"); 6089 6090 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6091 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 6092 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 6093 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 6094 verifyFormat( 6095 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 6096 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 6097 " d = e && f;"); 6098 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 6099 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 6100 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6101 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 6102 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 6103 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 6104 6105 FormatStyle Style = getGoogleStyle(); 6106 Style.PointerAlignment = FormatStyle::PAS_Left; 6107 Style.DerivePointerAlignment = false; 6108 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6109 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 6110 " *b = bbbbbbbbbbbbbbbbbbb;", 6111 Style); 6112 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6113 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 6114 Style); 6115 verifyFormat("vector<int*> a, b;", Style); 6116 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 6117 } 6118 6119 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6120 verifyFormat("arr[foo ? bar : baz];"); 6121 verifyFormat("f()[foo ? bar : baz];"); 6122 verifyFormat("(a + b)[foo ? bar : baz];"); 6123 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6124 } 6125 6126 TEST_F(FormatTest, AlignsStringLiterals) { 6127 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6128 " \"short literal\");"); 6129 verifyFormat( 6130 "looooooooooooooooooooooooongFunction(\n" 6131 " \"short literal\"\n" 6132 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6133 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6134 " \" string literals\",\n" 6135 " and, other, parameters);"); 6136 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6137 " \"5678\";", 6138 format("fun + \"1243\" /* comment */\n" 6139 " \"5678\";", 6140 getLLVMStyleWithColumns(28))); 6141 EXPECT_EQ( 6142 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6143 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6144 " \"aaaaaaaaaaaaaaaa\";", 6145 format("aaaaaa =" 6146 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6147 "aaaaaaaaaaaaaaaaaaaaa\" " 6148 "\"aaaaaaaaaaaaaaaa\";")); 6149 verifyFormat("a = a + \"a\"\n" 6150 " \"a\"\n" 6151 " \"a\";"); 6152 verifyFormat("f(\"a\", \"b\"\n" 6153 " \"c\");"); 6154 6155 verifyFormat( 6156 "#define LL_FORMAT \"ll\"\n" 6157 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6158 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6159 6160 verifyFormat("#define A(X) \\\n" 6161 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6162 " \"ccccc\"", 6163 getLLVMStyleWithColumns(23)); 6164 verifyFormat("#define A \"def\"\n" 6165 "f(\"abc\" A \"ghi\"\n" 6166 " \"jkl\");"); 6167 6168 verifyFormat("f(L\"a\"\n" 6169 " L\"b\");"); 6170 verifyFormat("#define A(X) \\\n" 6171 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6172 " L\"ccccc\"", 6173 getLLVMStyleWithColumns(25)); 6174 6175 verifyFormat("f(@\"a\"\n" 6176 " @\"b\");"); 6177 verifyFormat("NSString s = @\"a\"\n" 6178 " @\"b\"\n" 6179 " @\"c\";"); 6180 verifyFormat("NSString s = @\"a\"\n" 6181 " \"b\"\n" 6182 " \"c\";"); 6183 } 6184 6185 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6186 FormatStyle Style = getLLVMStyle(); 6187 // No declarations or definitions should be moved to own line. 6188 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6189 verifyFormat("class A {\n" 6190 " int f() { return 1; }\n" 6191 " int g();\n" 6192 "};\n" 6193 "int f() { return 1; }\n" 6194 "int g();\n", 6195 Style); 6196 6197 // All declarations and definitions should have the return type moved to its 6198 // own 6199 // line. 6200 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6201 verifyFormat("class E {\n" 6202 " int\n" 6203 " f() {\n" 6204 " return 1;\n" 6205 " }\n" 6206 " int\n" 6207 " g();\n" 6208 "};\n" 6209 "int\n" 6210 "f() {\n" 6211 " return 1;\n" 6212 "}\n" 6213 "int\n" 6214 "g();\n", 6215 Style); 6216 6217 // Top-level definitions, and no kinds of declarations should have the 6218 // return type moved to its own line. 6219 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6220 verifyFormat("class B {\n" 6221 " int f() { return 1; }\n" 6222 " int g();\n" 6223 "};\n" 6224 "int\n" 6225 "f() {\n" 6226 " return 1;\n" 6227 "}\n" 6228 "int g();\n", 6229 Style); 6230 6231 // Top-level definitions and declarations should have the return type moved 6232 // to its own line. 6233 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6234 verifyFormat("class C {\n" 6235 " int f() { return 1; }\n" 6236 " int g();\n" 6237 "};\n" 6238 "int\n" 6239 "f() {\n" 6240 " return 1;\n" 6241 "}\n" 6242 "int\n" 6243 "g();\n", 6244 Style); 6245 6246 // All definitions should have the return type moved to its own line, but no 6247 // kinds of declarations. 6248 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6249 verifyFormat("class D {\n" 6250 " int\n" 6251 " f() {\n" 6252 " return 1;\n" 6253 " }\n" 6254 " int g();\n" 6255 "};\n" 6256 "int\n" 6257 "f() {\n" 6258 " return 1;\n" 6259 "}\n" 6260 "int g();\n", 6261 Style); 6262 verifyFormat("const char *\n" 6263 "f(void) {\n" // Break here. 6264 " return \"\";\n" 6265 "}\n" 6266 "const char *bar(void);\n", // No break here. 6267 Style); 6268 verifyFormat("template <class T>\n" 6269 "T *\n" 6270 "f(T &c) {\n" // Break here. 6271 " return NULL;\n" 6272 "}\n" 6273 "template <class T> T *f(T &c);\n", // No break here. 6274 Style); 6275 verifyFormat("class C {\n" 6276 " int\n" 6277 " operator+() {\n" 6278 " return 1;\n" 6279 " }\n" 6280 " int\n" 6281 " operator()() {\n" 6282 " return 1;\n" 6283 " }\n" 6284 "};\n", 6285 Style); 6286 verifyFormat("void\n" 6287 "A::operator()() {}\n" 6288 "void\n" 6289 "A::operator>>() {}\n" 6290 "void\n" 6291 "A::operator+() {}\n" 6292 "void\n" 6293 "A::operator*() {}\n" 6294 "void\n" 6295 "A::operator->() {}\n" 6296 "void\n" 6297 "A::operator void *() {}\n" 6298 "void\n" 6299 "A::operator void &() {}\n" 6300 "void\n" 6301 "A::operator void &&() {}\n" 6302 "void\n" 6303 "A::operator char *() {}\n" 6304 "void\n" 6305 "A::operator[]() {}\n" 6306 "void\n" 6307 "A::operator!() {}\n" 6308 "void\n" 6309 "A::operator**() {}\n" 6310 "void\n" 6311 "A::operator<Foo> *() {}\n" 6312 "void\n" 6313 "A::operator<Foo> **() {}\n" 6314 "void\n" 6315 "A::operator<Foo> &() {}\n" 6316 "void\n" 6317 "A::operator void **() {}\n", 6318 Style); 6319 verifyFormat("constexpr auto\n" 6320 "operator()() const -> reference {}\n" 6321 "constexpr auto\n" 6322 "operator>>() const -> reference {}\n" 6323 "constexpr auto\n" 6324 "operator+() const -> reference {}\n" 6325 "constexpr auto\n" 6326 "operator*() const -> reference {}\n" 6327 "constexpr auto\n" 6328 "operator->() const -> reference {}\n" 6329 "constexpr auto\n" 6330 "operator++() const -> reference {}\n" 6331 "constexpr auto\n" 6332 "operator void *() const -> reference {}\n" 6333 "constexpr auto\n" 6334 "operator void **() const -> reference {}\n" 6335 "constexpr auto\n" 6336 "operator void *() const -> reference {}\n" 6337 "constexpr auto\n" 6338 "operator void &() const -> reference {}\n" 6339 "constexpr auto\n" 6340 "operator void &&() const -> reference {}\n" 6341 "constexpr auto\n" 6342 "operator char *() const -> reference {}\n" 6343 "constexpr auto\n" 6344 "operator!() const -> reference {}\n" 6345 "constexpr auto\n" 6346 "operator[]() const -> reference {}\n", 6347 Style); 6348 verifyFormat("void *operator new(std::size_t s);", // No break here. 6349 Style); 6350 verifyFormat("void *\n" 6351 "operator new(std::size_t s) {}", 6352 Style); 6353 verifyFormat("void *\n" 6354 "operator delete[](void *ptr) {}", 6355 Style); 6356 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6357 verifyFormat("const char *\n" 6358 "f(void)\n" // Break here. 6359 "{\n" 6360 " return \"\";\n" 6361 "}\n" 6362 "const char *bar(void);\n", // No break here. 6363 Style); 6364 verifyFormat("template <class T>\n" 6365 "T *\n" // Problem here: no line break 6366 "f(T &c)\n" // Break here. 6367 "{\n" 6368 " return NULL;\n" 6369 "}\n" 6370 "template <class T> T *f(T &c);\n", // No break here. 6371 Style); 6372 verifyFormat("int\n" 6373 "foo(A<bool> a)\n" 6374 "{\n" 6375 " return a;\n" 6376 "}\n", 6377 Style); 6378 verifyFormat("int\n" 6379 "foo(A<8> a)\n" 6380 "{\n" 6381 " return a;\n" 6382 "}\n", 6383 Style); 6384 verifyFormat("int\n" 6385 "foo(A<B<bool>, 8> a)\n" 6386 "{\n" 6387 " return a;\n" 6388 "}\n", 6389 Style); 6390 verifyFormat("int\n" 6391 "foo(A<B<8>, bool> a)\n" 6392 "{\n" 6393 " return a;\n" 6394 "}\n", 6395 Style); 6396 verifyFormat("int\n" 6397 "foo(A<B<bool>, bool> a)\n" 6398 "{\n" 6399 " return a;\n" 6400 "}\n", 6401 Style); 6402 verifyFormat("int\n" 6403 "foo(A<B<8>, 8> a)\n" 6404 "{\n" 6405 " return a;\n" 6406 "}\n", 6407 Style); 6408 6409 Style = getGNUStyle(); 6410 6411 // Test for comments at the end of function declarations. 6412 verifyFormat("void\n" 6413 "foo (int a, /*abc*/ int b) // def\n" 6414 "{\n" 6415 "}\n", 6416 Style); 6417 6418 verifyFormat("void\n" 6419 "foo (int a, /* abc */ int b) /* def */\n" 6420 "{\n" 6421 "}\n", 6422 Style); 6423 6424 // Definitions that should not break after return type 6425 verifyFormat("void foo (int a, int b); // def\n", Style); 6426 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6427 verifyFormat("void foo (int a, int b);\n", Style); 6428 } 6429 6430 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6431 FormatStyle NoBreak = getLLVMStyle(); 6432 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6433 FormatStyle Break = getLLVMStyle(); 6434 Break.AlwaysBreakBeforeMultilineStrings = true; 6435 verifyFormat("aaaa = \"bbbb\"\n" 6436 " \"cccc\";", 6437 NoBreak); 6438 verifyFormat("aaaa =\n" 6439 " \"bbbb\"\n" 6440 " \"cccc\";", 6441 Break); 6442 verifyFormat("aaaa(\"bbbb\"\n" 6443 " \"cccc\");", 6444 NoBreak); 6445 verifyFormat("aaaa(\n" 6446 " \"bbbb\"\n" 6447 " \"cccc\");", 6448 Break); 6449 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6450 " \"cccc\");", 6451 NoBreak); 6452 verifyFormat("aaaa(qqq,\n" 6453 " \"bbbb\"\n" 6454 " \"cccc\");", 6455 Break); 6456 verifyFormat("aaaa(qqq,\n" 6457 " L\"bbbb\"\n" 6458 " L\"cccc\");", 6459 Break); 6460 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6461 " \"bbbb\"));", 6462 Break); 6463 verifyFormat("string s = someFunction(\n" 6464 " \"abc\"\n" 6465 " \"abc\");", 6466 Break); 6467 6468 // As we break before unary operators, breaking right after them is bad. 6469 verifyFormat("string foo = abc ? \"x\"\n" 6470 " \"blah blah blah blah blah blah\"\n" 6471 " : \"y\";", 6472 Break); 6473 6474 // Don't break if there is no column gain. 6475 verifyFormat("f(\"aaaa\"\n" 6476 " \"bbbb\");", 6477 Break); 6478 6479 // Treat literals with escaped newlines like multi-line string literals. 6480 EXPECT_EQ("x = \"a\\\n" 6481 "b\\\n" 6482 "c\";", 6483 format("x = \"a\\\n" 6484 "b\\\n" 6485 "c\";", 6486 NoBreak)); 6487 EXPECT_EQ("xxxx =\n" 6488 " \"a\\\n" 6489 "b\\\n" 6490 "c\";", 6491 format("xxxx = \"a\\\n" 6492 "b\\\n" 6493 "c\";", 6494 Break)); 6495 6496 EXPECT_EQ("NSString *const kString =\n" 6497 " @\"aaaa\"\n" 6498 " @\"bbbb\";", 6499 format("NSString *const kString = @\"aaaa\"\n" 6500 "@\"bbbb\";", 6501 Break)); 6502 6503 Break.ColumnLimit = 0; 6504 verifyFormat("const char *hello = \"hello llvm\";", Break); 6505 } 6506 6507 TEST_F(FormatTest, AlignsPipes) { 6508 verifyFormat( 6509 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6510 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6511 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6512 verifyFormat( 6513 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6514 " << aaaaaaaaaaaaaaaaaaaa;"); 6515 verifyFormat( 6516 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6517 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6518 verifyFormat( 6519 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6520 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6521 verifyFormat( 6522 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6523 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6524 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6525 verifyFormat( 6526 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6527 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6528 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6529 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6530 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6532 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6533 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6534 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6535 verifyFormat( 6536 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6537 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6538 verifyFormat( 6539 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6540 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6541 6542 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6543 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6544 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6545 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6546 " aaaaaaaaaaaaaaaaaaaaa)\n" 6547 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6548 verifyFormat("LOG_IF(aaa == //\n" 6549 " bbb)\n" 6550 " << a << b;"); 6551 6552 // But sometimes, breaking before the first "<<" is desirable. 6553 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6554 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6555 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6556 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6557 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6558 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6559 " << BEF << IsTemplate << Description << E->getType();"); 6560 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6561 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6562 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6563 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6564 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6565 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6566 " << aaa;"); 6567 6568 verifyFormat( 6569 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6570 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6571 6572 // Incomplete string literal. 6573 EXPECT_EQ("llvm::errs() << \"\n" 6574 " << a;", 6575 format("llvm::errs() << \"\n<<a;")); 6576 6577 verifyFormat("void f() {\n" 6578 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6579 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6580 "}"); 6581 6582 // Handle 'endl'. 6583 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6584 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6585 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6586 6587 // Handle '\n'. 6588 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6589 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6590 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6591 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6592 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6593 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6594 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6595 } 6596 6597 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6598 verifyFormat("return out << \"somepacket = {\\n\"\n" 6599 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6600 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6601 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6602 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6603 " << \"}\";"); 6604 6605 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6606 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6607 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6608 verifyFormat( 6609 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6610 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6611 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6612 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6613 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6614 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6615 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6616 verifyFormat( 6617 "void f() {\n" 6618 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6619 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6620 "}"); 6621 6622 // Breaking before the first "<<" is generally not desirable. 6623 verifyFormat( 6624 "llvm::errs()\n" 6625 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6626 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6627 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6628 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6629 getLLVMStyleWithColumns(70)); 6630 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6631 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6632 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6633 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6634 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6635 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6636 getLLVMStyleWithColumns(70)); 6637 6638 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6639 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6640 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6641 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6642 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6643 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6644 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6645 " (aaaa + aaaa);", 6646 getLLVMStyleWithColumns(40)); 6647 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6648 " (aaaaaaa + aaaaa));", 6649 getLLVMStyleWithColumns(40)); 6650 verifyFormat( 6651 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6652 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6653 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6654 } 6655 6656 TEST_F(FormatTest, UnderstandsEquals) { 6657 verifyFormat( 6658 "aaaaaaaaaaaaaaaaa =\n" 6659 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6660 verifyFormat( 6661 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6663 verifyFormat( 6664 "if (a) {\n" 6665 " f();\n" 6666 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6668 "}"); 6669 6670 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6671 " 100000000 + 10000000) {\n}"); 6672 } 6673 6674 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6675 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6676 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6677 6678 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6679 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6680 6681 verifyFormat( 6682 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6683 " Parameter2);"); 6684 6685 verifyFormat( 6686 "ShortObject->shortFunction(\n" 6687 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6688 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6689 6690 verifyFormat("loooooooooooooongFunction(\n" 6691 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6692 6693 verifyFormat( 6694 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6695 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6696 6697 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6698 " .WillRepeatedly(Return(SomeValue));"); 6699 verifyFormat("void f() {\n" 6700 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6701 " .Times(2)\n" 6702 " .WillRepeatedly(Return(SomeValue));\n" 6703 "}"); 6704 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6705 " ccccccccccccccccccccccc);"); 6706 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6708 " .aaaaa(aaaaa),\n" 6709 " aaaaaaaaaaaaaaaaaaaaa);"); 6710 verifyFormat("void f() {\n" 6711 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6712 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6713 "}"); 6714 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6716 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6717 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6718 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6719 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6720 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6721 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6722 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6723 "}"); 6724 6725 // Here, it is not necessary to wrap at "." or "->". 6726 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6727 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6728 verifyFormat( 6729 "aaaaaaaaaaa->aaaaaaaaa(\n" 6730 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6731 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6732 6733 verifyFormat( 6734 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6736 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6737 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6738 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6739 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6740 6741 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6743 " .a();"); 6744 6745 FormatStyle NoBinPacking = getLLVMStyle(); 6746 NoBinPacking.BinPackParameters = false; 6747 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6748 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6749 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6750 " aaaaaaaaaaaaaaaaaaa,\n" 6751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6752 NoBinPacking); 6753 6754 // If there is a subsequent call, change to hanging indentation. 6755 verifyFormat( 6756 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6757 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6758 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6759 verifyFormat( 6760 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6761 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6762 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6764 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6765 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6767 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6768 } 6769 6770 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6771 verifyFormat("template <typename T>\n" 6772 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6773 verifyFormat("template <typename T>\n" 6774 "// T should be one of {A, B}.\n" 6775 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6776 verifyFormat( 6777 "template <typename T>\n" 6778 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6779 verifyFormat("template <typename T>\n" 6780 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6781 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6782 verifyFormat( 6783 "template <typename T>\n" 6784 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6785 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6786 verifyFormat( 6787 "template <typename T>\n" 6788 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6789 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6790 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6791 verifyFormat("template <typename T>\n" 6792 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6793 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6794 verifyFormat( 6795 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6796 " typename T4 = char>\n" 6797 "void f();"); 6798 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6799 " template <typename> class cccccccccccccccccccccc,\n" 6800 " typename ddddddddddddd>\n" 6801 "class C {};"); 6802 verifyFormat( 6803 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6804 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6805 6806 verifyFormat("void f() {\n" 6807 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6808 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6809 "}"); 6810 6811 verifyFormat("template <typename T> class C {};"); 6812 verifyFormat("template <typename T> void f();"); 6813 verifyFormat("template <typename T> void f() {}"); 6814 verifyFormat( 6815 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6816 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6817 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6818 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6819 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6821 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6822 getLLVMStyleWithColumns(72)); 6823 EXPECT_EQ("static_cast<A< //\n" 6824 " B> *>(\n" 6825 "\n" 6826 ");", 6827 format("static_cast<A<//\n" 6828 " B>*>(\n" 6829 "\n" 6830 " );")); 6831 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6832 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6833 6834 FormatStyle AlwaysBreak = getLLVMStyle(); 6835 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6836 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6837 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6838 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6839 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6840 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6841 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6842 verifyFormat("template <template <typename> class Fooooooo,\n" 6843 " template <typename> class Baaaaaaar>\n" 6844 "struct C {};", 6845 AlwaysBreak); 6846 verifyFormat("template <typename T> // T can be A, B or C.\n" 6847 "struct C {};", 6848 AlwaysBreak); 6849 verifyFormat("template <enum E> class A {\n" 6850 "public:\n" 6851 " E *f();\n" 6852 "};"); 6853 6854 FormatStyle NeverBreak = getLLVMStyle(); 6855 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6856 verifyFormat("template <typename T> class C {};", NeverBreak); 6857 verifyFormat("template <typename T> void f();", NeverBreak); 6858 verifyFormat("template <typename T> void f() {}", NeverBreak); 6859 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6860 "bbbbbbbbbbbbbbbbbbbb) {}", 6861 NeverBreak); 6862 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6863 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6864 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6865 NeverBreak); 6866 verifyFormat("template <template <typename> class Fooooooo,\n" 6867 " template <typename> class Baaaaaaar>\n" 6868 "struct C {};", 6869 NeverBreak); 6870 verifyFormat("template <typename T> // T can be A, B or C.\n" 6871 "struct C {};", 6872 NeverBreak); 6873 verifyFormat("template <enum E> class A {\n" 6874 "public:\n" 6875 " E *f();\n" 6876 "};", 6877 NeverBreak); 6878 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6879 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6880 "bbbbbbbbbbbbbbbbbbbb) {}", 6881 NeverBreak); 6882 } 6883 6884 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6885 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6886 Style.ColumnLimit = 60; 6887 EXPECT_EQ("// Baseline - no comments.\n" 6888 "template <\n" 6889 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6890 "void f() {}", 6891 format("// Baseline - no comments.\n" 6892 "template <\n" 6893 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6894 "void f() {}", 6895 Style)); 6896 6897 EXPECT_EQ("template <\n" 6898 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6899 "void f() {}", 6900 format("template <\n" 6901 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6902 "void f() {}", 6903 Style)); 6904 6905 EXPECT_EQ( 6906 "template <\n" 6907 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6908 "void f() {}", 6909 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6910 "void f() {}", 6911 Style)); 6912 6913 EXPECT_EQ( 6914 "template <\n" 6915 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6916 " // multiline\n" 6917 "void f() {}", 6918 format("template <\n" 6919 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6920 " // multiline\n" 6921 "void f() {}", 6922 Style)); 6923 6924 EXPECT_EQ( 6925 "template <typename aaaaaaaaaa<\n" 6926 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6927 "void f() {}", 6928 format( 6929 "template <\n" 6930 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6931 "void f() {}", 6932 Style)); 6933 } 6934 6935 TEST_F(FormatTest, WrapsTemplateParameters) { 6936 FormatStyle Style = getLLVMStyle(); 6937 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6938 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6939 verifyFormat( 6940 "template <typename... a> struct q {};\n" 6941 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6942 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6943 " y;", 6944 Style); 6945 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6946 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6947 verifyFormat( 6948 "template <typename... a> struct r {};\n" 6949 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6950 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6951 " y;", 6952 Style); 6953 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6954 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6955 verifyFormat("template <typename... a> struct s {};\n" 6956 "extern s<\n" 6957 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6958 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6959 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6960 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6961 " y;", 6962 Style); 6963 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6964 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6965 verifyFormat("template <typename... a> struct t {};\n" 6966 "extern t<\n" 6967 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6968 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6969 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6970 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6971 " y;", 6972 Style); 6973 } 6974 6975 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6976 verifyFormat( 6977 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6978 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6979 verifyFormat( 6980 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6981 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6982 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6983 6984 // FIXME: Should we have the extra indent after the second break? 6985 verifyFormat( 6986 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6987 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6988 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6989 6990 verifyFormat( 6991 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6992 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6993 6994 // Breaking at nested name specifiers is generally not desirable. 6995 verifyFormat( 6996 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6997 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6998 6999 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 7000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7002 " aaaaaaaaaaaaaaaaaaaaa);", 7003 getLLVMStyleWithColumns(74)); 7004 7005 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7007 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7008 } 7009 7010 TEST_F(FormatTest, UnderstandsTemplateParameters) { 7011 verifyFormat("A<int> a;"); 7012 verifyFormat("A<A<A<int>>> a;"); 7013 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 7014 verifyFormat("bool x = a < 1 || 2 > a;"); 7015 verifyFormat("bool x = 5 < f<int>();"); 7016 verifyFormat("bool x = f<int>() > 5;"); 7017 verifyFormat("bool x = 5 < a<int>::x;"); 7018 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 7019 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 7020 7021 verifyGoogleFormat("A<A<int>> a;"); 7022 verifyGoogleFormat("A<A<A<int>>> a;"); 7023 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 7024 verifyGoogleFormat("A<A<int> > a;"); 7025 verifyGoogleFormat("A<A<A<int> > > a;"); 7026 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 7027 verifyGoogleFormat("A<::A<int>> a;"); 7028 verifyGoogleFormat("A<::A> a;"); 7029 verifyGoogleFormat("A< ::A> a;"); 7030 verifyGoogleFormat("A< ::A<int> > a;"); 7031 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 7032 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 7033 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 7034 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 7035 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 7036 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 7037 7038 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 7039 7040 // template closer followed by a token that starts with > or = 7041 verifyFormat("bool b = a<1> > 1;"); 7042 verifyFormat("bool b = a<1> >= 1;"); 7043 verifyFormat("int i = a<1> >> 1;"); 7044 FormatStyle Style = getLLVMStyle(); 7045 Style.SpaceBeforeAssignmentOperators = false; 7046 verifyFormat("bool b= a<1> == 1;", Style); 7047 verifyFormat("a<int> = 1;", Style); 7048 verifyFormat("a<int> >>= 1;", Style); 7049 7050 verifyFormat("test >> a >> b;"); 7051 verifyFormat("test << a >> b;"); 7052 7053 verifyFormat("f<int>();"); 7054 verifyFormat("template <typename T> void f() {}"); 7055 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 7056 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 7057 "sizeof(char)>::type>;"); 7058 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 7059 verifyFormat("f(a.operator()<A>());"); 7060 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7061 " .template operator()<A>());", 7062 getLLVMStyleWithColumns(35)); 7063 7064 // Not template parameters. 7065 verifyFormat("return a < b && c > d;"); 7066 verifyFormat("void f() {\n" 7067 " while (a < b && c > d) {\n" 7068 " }\n" 7069 "}"); 7070 verifyFormat("template <typename... Types>\n" 7071 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 7072 7073 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 7075 getLLVMStyleWithColumns(60)); 7076 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 7077 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 7078 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 7079 } 7080 7081 TEST_F(FormatTest, BitshiftOperatorWidth) { 7082 EXPECT_EQ("int a = 1 << 2; /* foo\n" 7083 " bar */", 7084 format("int a=1<<2; /* foo\n" 7085 " bar */")); 7086 7087 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 7088 " bar */", 7089 format("int b =256>>1 ; /* foo\n" 7090 " bar */")); 7091 } 7092 7093 TEST_F(FormatTest, UnderstandsBinaryOperators) { 7094 verifyFormat("COMPARE(a, ==, b);"); 7095 verifyFormat("auto s = sizeof...(Ts) - 1;"); 7096 } 7097 7098 TEST_F(FormatTest, UnderstandsPointersToMembers) { 7099 verifyFormat("int A::*x;"); 7100 verifyFormat("int (S::*func)(void *);"); 7101 verifyFormat("void f() { int (S::*func)(void *); }"); 7102 verifyFormat("typedef bool *(Class::*Member)() const;"); 7103 verifyFormat("void f() {\n" 7104 " (a->*f)();\n" 7105 " a->*x;\n" 7106 " (a.*f)();\n" 7107 " ((*a).*f)();\n" 7108 " a.*x;\n" 7109 "}"); 7110 verifyFormat("void f() {\n" 7111 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7112 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 7113 "}"); 7114 verifyFormat( 7115 "(aaaaaaaaaa->*bbbbbbb)(\n" 7116 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7117 FormatStyle Style = getLLVMStyle(); 7118 Style.PointerAlignment = FormatStyle::PAS_Left; 7119 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 7120 } 7121 7122 TEST_F(FormatTest, UnderstandsUnaryOperators) { 7123 verifyFormat("int a = -2;"); 7124 verifyFormat("f(-1, -2, -3);"); 7125 verifyFormat("a[-1] = 5;"); 7126 verifyFormat("int a = 5 + -2;"); 7127 verifyFormat("if (i == -1) {\n}"); 7128 verifyFormat("if (i != -1) {\n}"); 7129 verifyFormat("if (i > -1) {\n}"); 7130 verifyFormat("if (i < -1) {\n}"); 7131 verifyFormat("++(a->f());"); 7132 verifyFormat("--(a->f());"); 7133 verifyFormat("(a->f())++;"); 7134 verifyFormat("a[42]++;"); 7135 verifyFormat("if (!(a->f())) {\n}"); 7136 verifyFormat("if (!+i) {\n}"); 7137 verifyFormat("~&a;"); 7138 7139 verifyFormat("a-- > b;"); 7140 verifyFormat("b ? -a : c;"); 7141 verifyFormat("n * sizeof char16;"); 7142 verifyFormat("n * alignof char16;", getGoogleStyle()); 7143 verifyFormat("sizeof(char);"); 7144 verifyFormat("alignof(char);", getGoogleStyle()); 7145 7146 verifyFormat("return -1;"); 7147 verifyFormat("throw -1;"); 7148 verifyFormat("switch (a) {\n" 7149 "case -1:\n" 7150 " break;\n" 7151 "}"); 7152 verifyFormat("#define X -1"); 7153 verifyFormat("#define X -kConstant"); 7154 7155 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7156 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7157 7158 verifyFormat("int a = /* confusing comment */ -1;"); 7159 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7160 verifyFormat("int a = i /* confusing comment */++;"); 7161 7162 verifyFormat("co_yield -1;"); 7163 verifyFormat("co_return -1;"); 7164 } 7165 7166 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7167 verifyFormat("if (!aaaaaaaaaa( // break\n" 7168 " aaaaa)) {\n" 7169 "}"); 7170 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7171 " aaaaa));"); 7172 verifyFormat("*aaa = aaaaaaa( // break\n" 7173 " bbbbbb);"); 7174 } 7175 7176 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7177 verifyFormat("bool operator<();"); 7178 verifyFormat("bool operator>();"); 7179 verifyFormat("bool operator=();"); 7180 verifyFormat("bool operator==();"); 7181 verifyFormat("bool operator!=();"); 7182 verifyFormat("int operator+();"); 7183 verifyFormat("int operator++();"); 7184 verifyFormat("int operator++(int) volatile noexcept;"); 7185 verifyFormat("bool operator,();"); 7186 verifyFormat("bool operator();"); 7187 verifyFormat("bool operator()();"); 7188 verifyFormat("bool operator[]();"); 7189 verifyFormat("operator bool();"); 7190 verifyFormat("operator int();"); 7191 verifyFormat("operator void *();"); 7192 verifyFormat("operator SomeType<int>();"); 7193 verifyFormat("operator SomeType<int, int>();"); 7194 verifyFormat("operator SomeType<SomeType<int>>();"); 7195 verifyFormat("void *operator new(std::size_t size);"); 7196 verifyFormat("void *operator new[](std::size_t size);"); 7197 verifyFormat("void operator delete(void *ptr);"); 7198 verifyFormat("void operator delete[](void *ptr);"); 7199 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7200 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7201 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7202 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7203 7204 verifyFormat( 7205 "ostream &operator<<(ostream &OutputStream,\n" 7206 " SomeReallyLongType WithSomeReallyLongValue);"); 7207 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7208 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7209 " return left.group < right.group;\n" 7210 "}"); 7211 verifyFormat("SomeType &operator=(const SomeType &S);"); 7212 verifyFormat("f.template operator()<int>();"); 7213 7214 verifyGoogleFormat("operator void*();"); 7215 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7216 verifyGoogleFormat("operator ::A();"); 7217 7218 verifyFormat("using A::operator+;"); 7219 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7220 "int i;"); 7221 } 7222 7223 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7224 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7225 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7226 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7227 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7228 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7229 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7230 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7231 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7232 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7233 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7234 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7235 verifyFormat("void Fn(T const &) const &;"); 7236 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7237 verifyFormat("template <typename T>\n" 7238 "void F(T) && = delete;", 7239 getGoogleStyle()); 7240 7241 FormatStyle AlignLeft = getLLVMStyle(); 7242 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7243 verifyFormat("void A::b() && {}", AlignLeft); 7244 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7245 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7246 AlignLeft); 7247 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7248 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7249 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7250 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7251 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7252 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7253 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7254 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7255 7256 FormatStyle Spaces = getLLVMStyle(); 7257 Spaces.SpacesInCStyleCastParentheses = true; 7258 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7259 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7260 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7261 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7262 7263 Spaces.SpacesInCStyleCastParentheses = false; 7264 Spaces.SpacesInParentheses = true; 7265 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7266 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7267 Spaces); 7268 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7269 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7270 7271 FormatStyle BreakTemplate = getLLVMStyle(); 7272 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7273 7274 verifyFormat("struct f {\n" 7275 " template <class T>\n" 7276 " int &foo(const std::string &str) &noexcept {}\n" 7277 "};", 7278 BreakTemplate); 7279 7280 verifyFormat("struct f {\n" 7281 " template <class T>\n" 7282 " int &foo(const std::string &str) &&noexcept {}\n" 7283 "};", 7284 BreakTemplate); 7285 7286 verifyFormat("struct f {\n" 7287 " template <class T>\n" 7288 " int &foo(const std::string &str) const &noexcept {}\n" 7289 "};", 7290 BreakTemplate); 7291 7292 verifyFormat("struct f {\n" 7293 " template <class T>\n" 7294 " int &foo(const std::string &str) const &noexcept {}\n" 7295 "};", 7296 BreakTemplate); 7297 7298 verifyFormat("struct f {\n" 7299 " template <class T>\n" 7300 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7301 "};", 7302 BreakTemplate); 7303 7304 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7305 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7306 FormatStyle::BTDS_Yes; 7307 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7308 7309 verifyFormat("struct f {\n" 7310 " template <class T>\n" 7311 " int& foo(const std::string& str) & noexcept {}\n" 7312 "};", 7313 AlignLeftBreakTemplate); 7314 7315 verifyFormat("struct f {\n" 7316 " template <class T>\n" 7317 " int& foo(const std::string& str) && noexcept {}\n" 7318 "};", 7319 AlignLeftBreakTemplate); 7320 7321 verifyFormat("struct f {\n" 7322 " template <class T>\n" 7323 " int& foo(const std::string& str) const& noexcept {}\n" 7324 "};", 7325 AlignLeftBreakTemplate); 7326 7327 verifyFormat("struct f {\n" 7328 " template <class T>\n" 7329 " int& foo(const std::string& str) const&& noexcept {}\n" 7330 "};", 7331 AlignLeftBreakTemplate); 7332 7333 verifyFormat("struct f {\n" 7334 " template <class T>\n" 7335 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7336 "};", 7337 AlignLeftBreakTemplate); 7338 7339 // The `&` in `Type&` should not be confused with a trailing `&` of 7340 // DEPRECATED(reason) member function. 7341 verifyFormat("struct f {\n" 7342 " template <class T>\n" 7343 " DEPRECATED(reason)\n" 7344 " Type &foo(arguments) {}\n" 7345 "};", 7346 BreakTemplate); 7347 7348 verifyFormat("struct f {\n" 7349 " template <class T>\n" 7350 " DEPRECATED(reason)\n" 7351 " Type& foo(arguments) {}\n" 7352 "};", 7353 AlignLeftBreakTemplate); 7354 7355 verifyFormat("void (*foopt)(int) = &func;"); 7356 } 7357 7358 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7359 verifyFormat("void f() {\n" 7360 " A *a = new A;\n" 7361 " A *a = new (placement) A;\n" 7362 " delete a;\n" 7363 " delete (A *)a;\n" 7364 "}"); 7365 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7366 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7367 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7368 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7369 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7370 verifyFormat("delete[] h->p;"); 7371 } 7372 7373 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7374 verifyFormat("int *f(int *a) {}"); 7375 verifyFormat("int main(int argc, char **argv) {}"); 7376 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7377 verifyIndependentOfContext("f(a, *a);"); 7378 verifyFormat("void g() { f(*a); }"); 7379 verifyIndependentOfContext("int a = b * 10;"); 7380 verifyIndependentOfContext("int a = 10 * b;"); 7381 verifyIndependentOfContext("int a = b * c;"); 7382 verifyIndependentOfContext("int a += b * c;"); 7383 verifyIndependentOfContext("int a -= b * c;"); 7384 verifyIndependentOfContext("int a *= b * c;"); 7385 verifyIndependentOfContext("int a /= b * c;"); 7386 verifyIndependentOfContext("int a = *b;"); 7387 verifyIndependentOfContext("int a = *b * c;"); 7388 verifyIndependentOfContext("int a = b * *c;"); 7389 verifyIndependentOfContext("int a = b * (10);"); 7390 verifyIndependentOfContext("S << b * (10);"); 7391 verifyIndependentOfContext("return 10 * b;"); 7392 verifyIndependentOfContext("return *b * *c;"); 7393 verifyIndependentOfContext("return a & ~b;"); 7394 verifyIndependentOfContext("f(b ? *c : *d);"); 7395 verifyIndependentOfContext("int a = b ? *c : *d;"); 7396 verifyIndependentOfContext("*b = a;"); 7397 verifyIndependentOfContext("a * ~b;"); 7398 verifyIndependentOfContext("a * !b;"); 7399 verifyIndependentOfContext("a * +b;"); 7400 verifyIndependentOfContext("a * -b;"); 7401 verifyIndependentOfContext("a * ++b;"); 7402 verifyIndependentOfContext("a * --b;"); 7403 verifyIndependentOfContext("a[4] * b;"); 7404 verifyIndependentOfContext("a[a * a] = 1;"); 7405 verifyIndependentOfContext("f() * b;"); 7406 verifyIndependentOfContext("a * [self dostuff];"); 7407 verifyIndependentOfContext("int x = a * (a + b);"); 7408 verifyIndependentOfContext("(a *)(a + b);"); 7409 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7410 verifyIndependentOfContext("int *pa = (int *)&a;"); 7411 verifyIndependentOfContext("return sizeof(int **);"); 7412 verifyIndependentOfContext("return sizeof(int ******);"); 7413 verifyIndependentOfContext("return (int **&)a;"); 7414 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7415 verifyFormat("void f(Type (*parameter)[10]) {}"); 7416 verifyFormat("void f(Type (¶meter)[10]) {}"); 7417 verifyGoogleFormat("return sizeof(int**);"); 7418 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7419 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7420 verifyFormat("auto a = [](int **&, int ***) {};"); 7421 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7422 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7423 verifyFormat("[](const decltype(*a) &value) {}"); 7424 verifyFormat("decltype(a * b) F();"); 7425 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7426 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7427 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7428 verifyIndependentOfContext("int i{a * b};"); 7429 verifyIndependentOfContext("aaa && aaa->f();"); 7430 verifyIndependentOfContext("int x = ~*p;"); 7431 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7432 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7433 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7434 verifyFormat("void f() { f(a, c * d); }"); 7435 verifyFormat("void f() { f(new a(), c * d); }"); 7436 verifyFormat("void f(const MyOverride &override);"); 7437 verifyFormat("void f(const MyFinal &final);"); 7438 verifyIndependentOfContext("bool a = f() && override.f();"); 7439 verifyIndependentOfContext("bool a = f() && final.f();"); 7440 7441 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7442 7443 verifyIndependentOfContext("A<int *> a;"); 7444 verifyIndependentOfContext("A<int **> a;"); 7445 verifyIndependentOfContext("A<int *, int *> a;"); 7446 verifyIndependentOfContext("A<int *[]> a;"); 7447 verifyIndependentOfContext( 7448 "const char *const p = reinterpret_cast<const char *const>(q);"); 7449 verifyIndependentOfContext("A<int **, int **> a;"); 7450 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7451 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7452 verifyFormat("for (; a && b;) {\n}"); 7453 verifyFormat("bool foo = true && [] { return false; }();"); 7454 7455 verifyFormat( 7456 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7458 7459 verifyGoogleFormat("int const* a = &b;"); 7460 verifyGoogleFormat("**outparam = 1;"); 7461 verifyGoogleFormat("*outparam = a * b;"); 7462 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7463 verifyGoogleFormat("A<int*> a;"); 7464 verifyGoogleFormat("A<int**> a;"); 7465 verifyGoogleFormat("A<int*, int*> a;"); 7466 verifyGoogleFormat("A<int**, int**> a;"); 7467 verifyGoogleFormat("f(b ? *c : *d);"); 7468 verifyGoogleFormat("int a = b ? *c : *d;"); 7469 verifyGoogleFormat("Type* t = **x;"); 7470 verifyGoogleFormat("Type* t = *++*x;"); 7471 verifyGoogleFormat("*++*x;"); 7472 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7473 verifyGoogleFormat("Type* t = x++ * y;"); 7474 verifyGoogleFormat( 7475 "const char* const p = reinterpret_cast<const char* const>(q);"); 7476 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7477 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7478 verifyGoogleFormat("template <typename T>\n" 7479 "void f(int i = 0, SomeType** temps = NULL);"); 7480 7481 FormatStyle Left = getLLVMStyle(); 7482 Left.PointerAlignment = FormatStyle::PAS_Left; 7483 verifyFormat("x = *a(x) = *a(y);", Left); 7484 verifyFormat("for (;; *a = b) {\n}", Left); 7485 verifyFormat("return *this += 1;", Left); 7486 verifyFormat("throw *x;", Left); 7487 verifyFormat("delete *x;", Left); 7488 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7489 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7490 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7491 verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left); 7492 verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left); 7493 verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left); 7494 7495 verifyIndependentOfContext("a = *(x + y);"); 7496 verifyIndependentOfContext("a = &(x + y);"); 7497 verifyIndependentOfContext("*(x + y).call();"); 7498 verifyIndependentOfContext("&(x + y)->call();"); 7499 verifyFormat("void f() { &(*I).first; }"); 7500 7501 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7502 verifyFormat( 7503 "int *MyValues = {\n" 7504 " *A, // Operator detection might be confused by the '{'\n" 7505 " *BB // Operator detection might be confused by previous comment\n" 7506 "};"); 7507 7508 verifyIndependentOfContext("if (int *a = &b)"); 7509 verifyIndependentOfContext("if (int &a = *b)"); 7510 verifyIndependentOfContext("if (a & b[i])"); 7511 verifyIndependentOfContext("if constexpr (a & b[i])"); 7512 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7513 verifyIndependentOfContext("if (a * (b * c))"); 7514 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7515 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7516 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7517 verifyIndependentOfContext("if (*b[i])"); 7518 verifyIndependentOfContext("if (int *a = (&b))"); 7519 verifyIndependentOfContext("while (int *a = &b)"); 7520 verifyIndependentOfContext("while (a * (b * c))"); 7521 verifyIndependentOfContext("size = sizeof *a;"); 7522 verifyIndependentOfContext("if (a && (b = c))"); 7523 verifyFormat("void f() {\n" 7524 " for (const int &v : Values) {\n" 7525 " }\n" 7526 "}"); 7527 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7528 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7529 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7530 7531 verifyFormat("#define A (!a * b)"); 7532 verifyFormat("#define MACRO \\\n" 7533 " int *i = a * b; \\\n" 7534 " void f(a *b);", 7535 getLLVMStyleWithColumns(19)); 7536 7537 verifyIndependentOfContext("A = new SomeType *[Length];"); 7538 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7539 verifyIndependentOfContext("T **t = new T *;"); 7540 verifyIndependentOfContext("T **t = new T *();"); 7541 verifyGoogleFormat("A = new SomeType*[Length]();"); 7542 verifyGoogleFormat("A = new SomeType*[Length];"); 7543 verifyGoogleFormat("T** t = new T*;"); 7544 verifyGoogleFormat("T** t = new T*();"); 7545 7546 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7547 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7548 verifyFormat("template <bool a, bool b> " 7549 "typename t::if<x && y>::type f() {}"); 7550 verifyFormat("template <int *y> f() {}"); 7551 verifyFormat("vector<int *> v;"); 7552 verifyFormat("vector<int *const> v;"); 7553 verifyFormat("vector<int *const **const *> v;"); 7554 verifyFormat("vector<int *volatile> v;"); 7555 verifyFormat("vector<a * b> v;"); 7556 verifyFormat("foo<b && false>();"); 7557 verifyFormat("foo<b & 1>();"); 7558 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7559 verifyFormat( 7560 "template <class T, class = typename std::enable_if<\n" 7561 " std::is_integral<T>::value &&\n" 7562 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7563 "void F();", 7564 getLLVMStyleWithColumns(70)); 7565 verifyFormat("template <class T,\n" 7566 " class = typename std::enable_if<\n" 7567 " std::is_integral<T>::value &&\n" 7568 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7569 " class U>\n" 7570 "void F();", 7571 getLLVMStyleWithColumns(70)); 7572 verifyFormat( 7573 "template <class T,\n" 7574 " class = typename ::std::enable_if<\n" 7575 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7576 "void F();", 7577 getGoogleStyleWithColumns(68)); 7578 7579 verifyIndependentOfContext("MACRO(int *i);"); 7580 verifyIndependentOfContext("MACRO(auto *a);"); 7581 verifyIndependentOfContext("MACRO(const A *a);"); 7582 verifyIndependentOfContext("MACRO(A *const a);"); 7583 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7584 verifyFormat("void f() { f(float{1}, a * a); }"); 7585 // FIXME: Is there a way to make this work? 7586 // verifyIndependentOfContext("MACRO(A *a);"); 7587 7588 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7589 verifyFormat("return options != nullptr && operator==(*options);"); 7590 7591 EXPECT_EQ("#define OP(x) \\\n" 7592 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7593 " return s << a.DebugString(); \\\n" 7594 " }", 7595 format("#define OP(x) \\\n" 7596 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7597 " return s << a.DebugString(); \\\n" 7598 " }", 7599 getLLVMStyleWithColumns(50))); 7600 7601 // FIXME: We cannot handle this case yet; we might be able to figure out that 7602 // foo<x> d > v; doesn't make sense. 7603 verifyFormat("foo<a<b && c> d> v;"); 7604 7605 FormatStyle PointerMiddle = getLLVMStyle(); 7606 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7607 verifyFormat("delete *x;", PointerMiddle); 7608 verifyFormat("int * x;", PointerMiddle); 7609 verifyFormat("int *[] x;", PointerMiddle); 7610 verifyFormat("template <int * y> f() {}", PointerMiddle); 7611 verifyFormat("int * f(int * a) {}", PointerMiddle); 7612 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7613 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7614 verifyFormat("A<int *> a;", PointerMiddle); 7615 verifyFormat("A<int **> a;", PointerMiddle); 7616 verifyFormat("A<int *, int *> a;", PointerMiddle); 7617 verifyFormat("A<int *[]> a;", PointerMiddle); 7618 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7619 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7620 verifyFormat("T ** t = new T *;", PointerMiddle); 7621 7622 // Member function reference qualifiers aren't binary operators. 7623 verifyFormat("string // break\n" 7624 "operator()() & {}"); 7625 verifyFormat("string // break\n" 7626 "operator()() && {}"); 7627 verifyGoogleFormat("template <typename T>\n" 7628 "auto x() & -> int {}"); 7629 } 7630 7631 TEST_F(FormatTest, UnderstandsAttributes) { 7632 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7633 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7634 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7635 FormatStyle AfterType = getLLVMStyle(); 7636 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7637 verifyFormat("__attribute__((nodebug)) void\n" 7638 "foo() {}\n", 7639 AfterType); 7640 } 7641 7642 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7643 verifyFormat("SomeType s [[unused]] (InitValue);"); 7644 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7645 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7646 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7647 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7648 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7649 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7650 7651 // Make sure we do not mistake attributes for array subscripts. 7652 verifyFormat("int a() {}\n" 7653 "[[unused]] int b() {}\n"); 7654 verifyFormat("NSArray *arr;\n" 7655 "arr[[Foo() bar]];"); 7656 7657 // On the other hand, we still need to correctly find array subscripts. 7658 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7659 7660 // Make sure that we do not mistake Objective-C method inside array literals 7661 // as attributes, even if those method names are also keywords. 7662 verifyFormat("@[ [foo bar] ];"); 7663 verifyFormat("@[ [NSArray class] ];"); 7664 verifyFormat("@[ [foo enum] ];"); 7665 7666 // Make sure we do not parse attributes as lambda introducers. 7667 FormatStyle MultiLineFunctions = getLLVMStyle(); 7668 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7669 verifyFormat("[[unused]] int b() {\n" 7670 " return 42;\n" 7671 "}\n", 7672 MultiLineFunctions); 7673 } 7674 7675 TEST_F(FormatTest, UnderstandsEllipsis) { 7676 verifyFormat("int printf(const char *fmt, ...);"); 7677 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7678 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7679 7680 FormatStyle PointersLeft = getLLVMStyle(); 7681 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7682 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7683 } 7684 7685 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7686 EXPECT_EQ("int *a;\n" 7687 "int *a;\n" 7688 "int *a;", 7689 format("int *a;\n" 7690 "int* a;\n" 7691 "int *a;", 7692 getGoogleStyle())); 7693 EXPECT_EQ("int* a;\n" 7694 "int* a;\n" 7695 "int* a;", 7696 format("int* a;\n" 7697 "int* a;\n" 7698 "int *a;", 7699 getGoogleStyle())); 7700 EXPECT_EQ("int *a;\n" 7701 "int *a;\n" 7702 "int *a;", 7703 format("int *a;\n" 7704 "int * a;\n" 7705 "int * a;", 7706 getGoogleStyle())); 7707 EXPECT_EQ("auto x = [] {\n" 7708 " int *a;\n" 7709 " int *a;\n" 7710 " int *a;\n" 7711 "};", 7712 format("auto x=[]{int *a;\n" 7713 "int * a;\n" 7714 "int * a;};", 7715 getGoogleStyle())); 7716 } 7717 7718 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7719 verifyFormat("int f(int &&a) {}"); 7720 verifyFormat("int f(int a, char &&b) {}"); 7721 verifyFormat("void f() { int &&a = b; }"); 7722 verifyGoogleFormat("int f(int a, char&& b) {}"); 7723 verifyGoogleFormat("void f() { int&& a = b; }"); 7724 7725 verifyIndependentOfContext("A<int &&> a;"); 7726 verifyIndependentOfContext("A<int &&, int &&> a;"); 7727 verifyGoogleFormat("A<int&&> a;"); 7728 verifyGoogleFormat("A<int&&, int&&> a;"); 7729 7730 // Not rvalue references: 7731 verifyFormat("template <bool B, bool C> class A {\n" 7732 " static_assert(B && C, \"Something is wrong\");\n" 7733 "};"); 7734 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7735 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7736 verifyFormat("#define A(a, b) (a && b)"); 7737 } 7738 7739 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7740 verifyFormat("void f() {\n" 7741 " x[aaaaaaaaa -\n" 7742 " b] = 23;\n" 7743 "}", 7744 getLLVMStyleWithColumns(15)); 7745 } 7746 7747 TEST_F(FormatTest, FormatsCasts) { 7748 verifyFormat("Type *A = static_cast<Type *>(P);"); 7749 verifyFormat("Type *A = (Type *)P;"); 7750 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7751 verifyFormat("int a = (int)(2.0f);"); 7752 verifyFormat("int a = (int)2.0f;"); 7753 verifyFormat("x[(int32)y];"); 7754 verifyFormat("x = (int32)y;"); 7755 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7756 verifyFormat("int a = (int)*b;"); 7757 verifyFormat("int a = (int)2.0f;"); 7758 verifyFormat("int a = (int)~0;"); 7759 verifyFormat("int a = (int)++a;"); 7760 verifyFormat("int a = (int)sizeof(int);"); 7761 verifyFormat("int a = (int)+2;"); 7762 verifyFormat("my_int a = (my_int)2.0f;"); 7763 verifyFormat("my_int a = (my_int)sizeof(int);"); 7764 verifyFormat("return (my_int)aaa;"); 7765 verifyFormat("#define x ((int)-1)"); 7766 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7767 verifyFormat("#define p(q) ((int *)&q)"); 7768 verifyFormat("fn(a)(b) + 1;"); 7769 7770 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7771 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7772 verifyFormat("my_int a = (my_int)~0;"); 7773 verifyFormat("my_int a = (my_int)++a;"); 7774 verifyFormat("my_int a = (my_int)-2;"); 7775 verifyFormat("my_int a = (my_int)1;"); 7776 verifyFormat("my_int a = (my_int *)1;"); 7777 verifyFormat("my_int a = (const my_int)-1;"); 7778 verifyFormat("my_int a = (const my_int *)-1;"); 7779 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7780 verifyFormat("my_int a = (ns::my_int)-2;"); 7781 verifyFormat("case (my_int)ONE:"); 7782 verifyFormat("auto x = (X)this;"); 7783 // Casts in Obj-C style calls used to not be recognized as such. 7784 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 7785 7786 // FIXME: single value wrapped with paren will be treated as cast. 7787 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7788 7789 verifyFormat("{ (void)F; }"); 7790 7791 // Don't break after a cast's 7792 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7793 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7794 " bbbbbbbbbbbbbbbbbbbbbb);"); 7795 7796 // These are not casts. 7797 verifyFormat("void f(int *) {}"); 7798 verifyFormat("f(foo)->b;"); 7799 verifyFormat("f(foo).b;"); 7800 verifyFormat("f(foo)(b);"); 7801 verifyFormat("f(foo)[b];"); 7802 verifyFormat("[](foo) { return 4; }(bar);"); 7803 verifyFormat("(*funptr)(foo)[4];"); 7804 verifyFormat("funptrs[4](foo)[4];"); 7805 verifyFormat("void f(int *);"); 7806 verifyFormat("void f(int *) = 0;"); 7807 verifyFormat("void f(SmallVector<int>) {}"); 7808 verifyFormat("void f(SmallVector<int>);"); 7809 verifyFormat("void f(SmallVector<int>) = 0;"); 7810 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7811 verifyFormat("int a = sizeof(int) * b;"); 7812 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7813 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7814 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7815 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7816 7817 // These are not casts, but at some point were confused with casts. 7818 verifyFormat("virtual void foo(int *) override;"); 7819 verifyFormat("virtual void foo(char &) const;"); 7820 verifyFormat("virtual void foo(int *a, char *) const;"); 7821 verifyFormat("int a = sizeof(int *) + b;"); 7822 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7823 verifyFormat("bool b = f(g<int>) && c;"); 7824 verifyFormat("typedef void (*f)(int i) func;"); 7825 verifyFormat("void operator++(int) noexcept;"); 7826 verifyFormat("void operator++(int &) noexcept;"); 7827 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 7828 "&) noexcept;"); 7829 verifyFormat( 7830 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 7831 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 7832 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 7833 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 7834 verifyFormat("void operator delete(foo &) noexcept;"); 7835 verifyFormat("void operator delete(foo) noexcept;"); 7836 verifyFormat("void operator delete(int) noexcept;"); 7837 verifyFormat("void operator delete(int &) noexcept;"); 7838 verifyFormat("void operator delete(int &) volatile noexcept;"); 7839 verifyFormat("void operator delete(int &) const"); 7840 verifyFormat("void operator delete(int &) = default"); 7841 verifyFormat("void operator delete(int &) = delete"); 7842 verifyFormat("void operator delete(int &) [[noreturn]]"); 7843 verifyFormat("void operator delete(int &) throw();"); 7844 verifyFormat("void operator delete(int &) throw(int);"); 7845 verifyFormat("auto operator delete(int &) -> int;"); 7846 verifyFormat("auto operator delete(int &) override"); 7847 verifyFormat("auto operator delete(int &) final"); 7848 7849 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7850 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7851 // FIXME: The indentation here is not ideal. 7852 verifyFormat( 7853 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7854 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7855 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7856 } 7857 7858 TEST_F(FormatTest, FormatsFunctionTypes) { 7859 verifyFormat("A<bool()> a;"); 7860 verifyFormat("A<SomeType()> a;"); 7861 verifyFormat("A<void (*)(int, std::string)> a;"); 7862 verifyFormat("A<void *(int)>;"); 7863 verifyFormat("void *(*a)(int *, SomeType *);"); 7864 verifyFormat("int (*func)(void *);"); 7865 verifyFormat("void f() { int (*func)(void *); }"); 7866 verifyFormat("template <class CallbackClass>\n" 7867 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7868 7869 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7870 verifyGoogleFormat("void* (*a)(int);"); 7871 verifyGoogleFormat( 7872 "template <class CallbackClass>\n" 7873 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7874 7875 // Other constructs can look somewhat like function types: 7876 verifyFormat("A<sizeof(*x)> a;"); 7877 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7878 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7879 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7880 verifyFormat("int x = f(&h)();"); 7881 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7882 verifyFormat("std::function<\n" 7883 " LooooooooooongTemplatedType<\n" 7884 " SomeType>*(\n" 7885 " LooooooooooooooooongType type)>\n" 7886 " function;", 7887 getGoogleStyleWithColumns(40)); 7888 } 7889 7890 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7891 verifyFormat("A (*foo_)[6];"); 7892 verifyFormat("vector<int> (*foo_)[6];"); 7893 } 7894 7895 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7896 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7897 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7898 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7899 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7900 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7901 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7902 7903 // Different ways of ()-initializiation. 7904 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7905 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7906 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7907 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7908 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7909 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7910 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7911 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7912 7913 // Lambdas should not confuse the variable declaration heuristic. 7914 verifyFormat("LooooooooooooooooongType\n" 7915 " variable(nullptr, [](A *a) {});", 7916 getLLVMStyleWithColumns(40)); 7917 } 7918 7919 TEST_F(FormatTest, BreaksLongDeclarations) { 7920 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7921 " AnotherNameForTheLongType;"); 7922 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7924 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7925 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7926 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7927 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7928 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7929 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7930 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7931 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7932 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7933 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7934 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7935 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7936 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7937 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7938 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7939 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7940 FormatStyle Indented = getLLVMStyle(); 7941 Indented.IndentWrappedFunctionNames = true; 7942 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7943 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7944 Indented); 7945 verifyFormat( 7946 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7947 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7948 Indented); 7949 verifyFormat( 7950 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7951 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7952 Indented); 7953 verifyFormat( 7954 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7955 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7956 Indented); 7957 7958 // FIXME: Without the comment, this breaks after "(". 7959 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7960 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7961 getGoogleStyle()); 7962 7963 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7964 " int LoooooooooooooooooooongParam2) {}"); 7965 verifyFormat( 7966 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7967 " SourceLocation L, IdentifierIn *II,\n" 7968 " Type *T) {}"); 7969 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7970 "ReallyReaaallyLongFunctionName(\n" 7971 " const std::string &SomeParameter,\n" 7972 " const SomeType<string, SomeOtherTemplateParameter>\n" 7973 " &ReallyReallyLongParameterName,\n" 7974 " const SomeType<string, SomeOtherTemplateParameter>\n" 7975 " &AnotherLongParameterName) {}"); 7976 verifyFormat("template <typename A>\n" 7977 "SomeLoooooooooooooooooooooongType<\n" 7978 " typename some_namespace::SomeOtherType<A>::Type>\n" 7979 "Function() {}"); 7980 7981 verifyGoogleFormat( 7982 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7983 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7984 verifyGoogleFormat( 7985 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7986 " SourceLocation L) {}"); 7987 verifyGoogleFormat( 7988 "some_namespace::LongReturnType\n" 7989 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7990 " int first_long_parameter, int second_parameter) {}"); 7991 7992 verifyGoogleFormat("template <typename T>\n" 7993 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7994 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7995 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7996 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7997 7998 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7999 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8000 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8001 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8002 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8003 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 8004 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8005 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 8006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 8007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8008 8009 verifyFormat("template <typename T> // Templates on own line.\n" 8010 "static int // Some comment.\n" 8011 "MyFunction(int a);", 8012 getLLVMStyle()); 8013 } 8014 8015 TEST_F(FormatTest, FormatsArrays) { 8016 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8017 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 8018 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 8019 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 8020 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 8021 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 8022 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8023 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8024 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8025 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 8026 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8027 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8028 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8029 verifyFormat( 8030 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 8031 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8032 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 8033 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 8034 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8035 8036 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 8037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 8038 verifyFormat( 8039 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 8040 " .aaaaaaa[0]\n" 8041 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8042 verifyFormat("a[::b::c];"); 8043 8044 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 8045 8046 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 8047 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 8048 } 8049 8050 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 8051 verifyFormat("(a)->b();"); 8052 verifyFormat("--a;"); 8053 } 8054 8055 TEST_F(FormatTest, HandlesIncludeDirectives) { 8056 verifyFormat("#include <string>\n" 8057 "#include <a/b/c.h>\n" 8058 "#include \"a/b/string\"\n" 8059 "#include \"string.h\"\n" 8060 "#include \"string.h\"\n" 8061 "#include <a-a>\n" 8062 "#include < path with space >\n" 8063 "#include_next <test.h>" 8064 "#include \"abc.h\" // this is included for ABC\n" 8065 "#include \"some long include\" // with a comment\n" 8066 "#include \"some very long include path\"\n" 8067 "#include <some/very/long/include/path>\n", 8068 getLLVMStyleWithColumns(35)); 8069 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 8070 EXPECT_EQ("#include <a>", format("#include<a>")); 8071 8072 verifyFormat("#import <string>"); 8073 verifyFormat("#import <a/b/c.h>"); 8074 verifyFormat("#import \"a/b/string\""); 8075 verifyFormat("#import \"string.h\""); 8076 verifyFormat("#import \"string.h\""); 8077 verifyFormat("#if __has_include(<strstream>)\n" 8078 "#include <strstream>\n" 8079 "#endif"); 8080 8081 verifyFormat("#define MY_IMPORT <a/b>"); 8082 8083 verifyFormat("#if __has_include(<a/b>)"); 8084 verifyFormat("#if __has_include_next(<a/b>)"); 8085 verifyFormat("#define F __has_include(<a/b>)"); 8086 verifyFormat("#define F __has_include_next(<a/b>)"); 8087 8088 // Protocol buffer definition or missing "#". 8089 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 8090 getLLVMStyleWithColumns(30)); 8091 8092 FormatStyle Style = getLLVMStyle(); 8093 Style.AlwaysBreakBeforeMultilineStrings = true; 8094 Style.ColumnLimit = 0; 8095 verifyFormat("#import \"abc.h\"", Style); 8096 8097 // But 'import' might also be a regular C++ namespace. 8098 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8099 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8100 } 8101 8102 //===----------------------------------------------------------------------===// 8103 // Error recovery tests. 8104 //===----------------------------------------------------------------------===// 8105 8106 TEST_F(FormatTest, IncompleteParameterLists) { 8107 FormatStyle NoBinPacking = getLLVMStyle(); 8108 NoBinPacking.BinPackParameters = false; 8109 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 8110 " double *min_x,\n" 8111 " double *max_x,\n" 8112 " double *min_y,\n" 8113 " double *max_y,\n" 8114 " double *min_z,\n" 8115 " double *max_z, ) {}", 8116 NoBinPacking); 8117 } 8118 8119 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 8120 verifyFormat("void f() { return; }\n42"); 8121 verifyFormat("void f() {\n" 8122 " if (0)\n" 8123 " return;\n" 8124 "}\n" 8125 "42"); 8126 verifyFormat("void f() { return }\n42"); 8127 verifyFormat("void f() {\n" 8128 " if (0)\n" 8129 " return\n" 8130 "}\n" 8131 "42"); 8132 } 8133 8134 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 8135 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 8136 EXPECT_EQ("void f() {\n" 8137 " if (a)\n" 8138 " return\n" 8139 "}", 8140 format("void f ( ) { if ( a ) return }")); 8141 EXPECT_EQ("namespace N {\n" 8142 "void f()\n" 8143 "}", 8144 format("namespace N { void f() }")); 8145 EXPECT_EQ("namespace N {\n" 8146 "void f() {}\n" 8147 "void g()\n" 8148 "} // namespace N", 8149 format("namespace N { void f( ) { } void g( ) }")); 8150 } 8151 8152 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 8153 verifyFormat("int aaaaaaaa =\n" 8154 " // Overlylongcomment\n" 8155 " b;", 8156 getLLVMStyleWithColumns(20)); 8157 verifyFormat("function(\n" 8158 " ShortArgument,\n" 8159 " LoooooooooooongArgument);\n", 8160 getLLVMStyleWithColumns(20)); 8161 } 8162 8163 TEST_F(FormatTest, IncorrectAccessSpecifier) { 8164 verifyFormat("public:"); 8165 verifyFormat("class A {\n" 8166 "public\n" 8167 " void f() {}\n" 8168 "};"); 8169 verifyFormat("public\n" 8170 "int qwerty;"); 8171 verifyFormat("public\n" 8172 "B {}"); 8173 verifyFormat("public\n" 8174 "{}"); 8175 verifyFormat("public\n" 8176 "B { int x; }"); 8177 } 8178 8179 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 8180 verifyFormat("{"); 8181 verifyFormat("#})"); 8182 verifyNoCrash("(/**/[:!] ?[)."); 8183 } 8184 8185 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 8186 // Found by oss-fuzz: 8187 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 8188 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 8189 Style.ColumnLimit = 60; 8190 verifyNoCrash( 8191 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 8192 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 8193 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 8194 Style); 8195 } 8196 8197 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 8198 verifyFormat("do {\n}"); 8199 verifyFormat("do {\n}\n" 8200 "f();"); 8201 verifyFormat("do {\n}\n" 8202 "wheeee(fun);"); 8203 verifyFormat("do {\n" 8204 " f();\n" 8205 "}"); 8206 } 8207 8208 TEST_F(FormatTest, IncorrectCodeMissingParens) { 8209 verifyFormat("if {\n foo;\n foo();\n}"); 8210 verifyFormat("switch {\n foo;\n foo();\n}"); 8211 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 8212 verifyFormat("while {\n foo;\n foo();\n}"); 8213 verifyFormat("do {\n foo;\n foo();\n} while;"); 8214 } 8215 8216 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 8217 verifyIncompleteFormat("namespace {\n" 8218 "class Foo { Foo (\n" 8219 "};\n" 8220 "} // namespace"); 8221 } 8222 8223 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 8224 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 8225 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 8226 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 8227 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 8228 8229 EXPECT_EQ("{\n" 8230 " {\n" 8231 " breakme(\n" 8232 " qwe);\n" 8233 " }\n", 8234 format("{\n" 8235 " {\n" 8236 " breakme(qwe);\n" 8237 "}\n", 8238 getLLVMStyleWithColumns(10))); 8239 } 8240 8241 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 8242 verifyFormat("int x = {\n" 8243 " avariable,\n" 8244 " b(alongervariable)};", 8245 getLLVMStyleWithColumns(25)); 8246 } 8247 8248 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 8249 verifyFormat("return (a)(b){1, 2, 3};"); 8250 } 8251 8252 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 8253 verifyFormat("vector<int> x{1, 2, 3, 4};"); 8254 verifyFormat("vector<int> x{\n" 8255 " 1,\n" 8256 " 2,\n" 8257 " 3,\n" 8258 " 4,\n" 8259 "};"); 8260 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 8261 verifyFormat("f({1, 2});"); 8262 verifyFormat("auto v = Foo{-1};"); 8263 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 8264 verifyFormat("Class::Class : member{1, 2, 3} {}"); 8265 verifyFormat("new vector<int>{1, 2, 3};"); 8266 verifyFormat("new int[3]{1, 2, 3};"); 8267 verifyFormat("new int{1};"); 8268 verifyFormat("return {arg1, arg2};"); 8269 verifyFormat("return {arg1, SomeType{parameter}};"); 8270 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 8271 verifyFormat("new T{arg1, arg2};"); 8272 verifyFormat("f(MyMap[{composite, key}]);"); 8273 verifyFormat("class Class {\n" 8274 " T member = {arg1, arg2};\n" 8275 "};"); 8276 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 8277 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 8278 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 8279 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 8280 verifyFormat("int a = std::is_integral<int>{} + 0;"); 8281 8282 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8283 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8284 verifyFormat("auto i = decltype(x){};"); 8285 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 8286 verifyFormat("Node n{1, Node{1000}, //\n" 8287 " 2};"); 8288 verifyFormat("Aaaa aaaaaaa{\n" 8289 " {\n" 8290 " aaaa,\n" 8291 " },\n" 8292 "};"); 8293 verifyFormat("class C : public D {\n" 8294 " SomeClass SC{2};\n" 8295 "};"); 8296 verifyFormat("class C : public A {\n" 8297 " class D : public B {\n" 8298 " void f() { int i{2}; }\n" 8299 " };\n" 8300 "};"); 8301 verifyFormat("#define A {a, a},"); 8302 8303 // Avoid breaking between equal sign and opening brace 8304 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 8305 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 8306 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 8307 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 8308 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 8309 " {\"ccccccccccccccccccccc\", 2}};", 8310 AvoidBreakingFirstArgument); 8311 8312 // Binpacking only if there is no trailing comma 8313 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 8314 " cccccccccc, dddddddddd};", 8315 getLLVMStyleWithColumns(50)); 8316 verifyFormat("const Aaaaaa aaaaa = {\n" 8317 " aaaaaaaaaaa,\n" 8318 " bbbbbbbbbbb,\n" 8319 " ccccccccccc,\n" 8320 " ddddddddddd,\n" 8321 "};", 8322 getLLVMStyleWithColumns(50)); 8323 8324 // Cases where distinguising braced lists and blocks is hard. 8325 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 8326 verifyFormat("void f() {\n" 8327 " return; // comment\n" 8328 "}\n" 8329 "SomeType t;"); 8330 verifyFormat("void f() {\n" 8331 " if (a) {\n" 8332 " f();\n" 8333 " }\n" 8334 "}\n" 8335 "SomeType t;"); 8336 8337 // In combination with BinPackArguments = false. 8338 FormatStyle NoBinPacking = getLLVMStyle(); 8339 NoBinPacking.BinPackArguments = false; 8340 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 8341 " bbbbb,\n" 8342 " ccccc,\n" 8343 " ddddd,\n" 8344 " eeeee,\n" 8345 " ffffff,\n" 8346 " ggggg,\n" 8347 " hhhhhh,\n" 8348 " iiiiii,\n" 8349 " jjjjjj,\n" 8350 " kkkkkk};", 8351 NoBinPacking); 8352 verifyFormat("const Aaaaaa aaaaa = {\n" 8353 " aaaaa,\n" 8354 " bbbbb,\n" 8355 " ccccc,\n" 8356 " ddddd,\n" 8357 " eeeee,\n" 8358 " ffffff,\n" 8359 " ggggg,\n" 8360 " hhhhhh,\n" 8361 " iiiiii,\n" 8362 " jjjjjj,\n" 8363 " kkkkkk,\n" 8364 "};", 8365 NoBinPacking); 8366 verifyFormat( 8367 "const Aaaaaa aaaaa = {\n" 8368 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 8369 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 8370 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 8371 "};", 8372 NoBinPacking); 8373 8374 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8375 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 8376 " CDDDP83848_BMCR_REGISTER,\n" 8377 " CDDDP83848_BMSR_REGISTER,\n" 8378 " CDDDP83848_RBR_REGISTER};", 8379 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 8380 " CDDDP83848_BMSR_REGISTER,\n" 8381 " CDDDP83848_RBR_REGISTER};", 8382 NoBinPacking)); 8383 8384 // FIXME: The alignment of these trailing comments might be bad. Then again, 8385 // this might be utterly useless in real code. 8386 verifyFormat("Constructor::Constructor()\n" 8387 " : some_value{ //\n" 8388 " aaaaaaa, //\n" 8389 " bbbbbbb} {}"); 8390 8391 // In braced lists, the first comment is always assumed to belong to the 8392 // first element. Thus, it can be moved to the next or previous line as 8393 // appropriate. 8394 EXPECT_EQ("function({// First element:\n" 8395 " 1,\n" 8396 " // Second element:\n" 8397 " 2});", 8398 format("function({\n" 8399 " // First element:\n" 8400 " 1,\n" 8401 " // Second element:\n" 8402 " 2});")); 8403 EXPECT_EQ("std::vector<int> MyNumbers{\n" 8404 " // First element:\n" 8405 " 1,\n" 8406 " // Second element:\n" 8407 " 2};", 8408 format("std::vector<int> MyNumbers{// First element:\n" 8409 " 1,\n" 8410 " // Second element:\n" 8411 " 2};", 8412 getLLVMStyleWithColumns(30))); 8413 // A trailing comma should still lead to an enforced line break and no 8414 // binpacking. 8415 EXPECT_EQ("vector<int> SomeVector = {\n" 8416 " // aaa\n" 8417 " 1,\n" 8418 " 2,\n" 8419 "};", 8420 format("vector<int> SomeVector = { // aaa\n" 8421 " 1, 2, };")); 8422 8423 // C++11 brace initializer list l-braces should not be treated any differently 8424 // when breaking before lambda bodies is enabled 8425 FormatStyle BreakBeforeLambdaBody = getLLVMStyle(); 8426 BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 8427 BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 8428 BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true; 8429 verifyFormat( 8430 "std::runtime_error{\n" 8431 " \"Long string which will force a break onto the next line...\"};", 8432 BreakBeforeLambdaBody); 8433 8434 FormatStyle ExtraSpaces = getLLVMStyle(); 8435 ExtraSpaces.Cpp11BracedListStyle = false; 8436 ExtraSpaces.ColumnLimit = 75; 8437 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8438 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8439 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8440 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8441 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8442 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8443 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8444 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8445 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8446 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8447 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8448 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8449 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8450 verifyFormat("class Class {\n" 8451 " T member = { arg1, arg2 };\n" 8452 "};", 8453 ExtraSpaces); 8454 verifyFormat( 8455 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8456 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8457 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8458 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8459 ExtraSpaces); 8460 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 8461 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 8462 ExtraSpaces); 8463 verifyFormat( 8464 "someFunction(OtherParam,\n" 8465 " BracedList{ // comment 1 (Forcing interesting break)\n" 8466 " param1, param2,\n" 8467 " // comment 2\n" 8468 " param3, param4 });", 8469 ExtraSpaces); 8470 verifyFormat( 8471 "std::this_thread::sleep_for(\n" 8472 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 8473 ExtraSpaces); 8474 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 8475 " aaaaaaa,\n" 8476 " aaaaaaaaaa,\n" 8477 " aaaaa,\n" 8478 " aaaaaaaaaaaaaaa,\n" 8479 " aaa,\n" 8480 " aaaaaaaaaa,\n" 8481 " a,\n" 8482 " aaaaaaaaaaaaaaaaaaaaa,\n" 8483 " aaaaaaaaaaaa,\n" 8484 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 8485 " aaaaaaa,\n" 8486 " a};"); 8487 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 8488 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 8489 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 8490 8491 // Avoid breaking between initializer/equal sign and opening brace 8492 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 8493 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 8494 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8495 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8496 " { \"ccccccccccccccccccccc\", 2 }\n" 8497 "};", 8498 ExtraSpaces); 8499 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 8500 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8501 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8502 " { \"ccccccccccccccccccccc\", 2 }\n" 8503 "};", 8504 ExtraSpaces); 8505 8506 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 8507 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 8508 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 8509 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 8510 8511 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 8512 SpaceBetweenBraces.SpacesInAngles = true; 8513 SpaceBetweenBraces.SpacesInParentheses = true; 8514 SpaceBetweenBraces.SpacesInSquareBrackets = true; 8515 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 8516 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 8517 verifyFormat("vector< int > x{ // comment 1\n" 8518 " 1, 2, 3, 4 };", 8519 SpaceBetweenBraces); 8520 SpaceBetweenBraces.ColumnLimit = 20; 8521 EXPECT_EQ("vector< int > x{\n" 8522 " 1, 2, 3, 4 };", 8523 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8524 SpaceBetweenBraces.ColumnLimit = 24; 8525 EXPECT_EQ("vector< int > x{ 1, 2,\n" 8526 " 3, 4 };", 8527 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8528 EXPECT_EQ("vector< int > x{\n" 8529 " 1,\n" 8530 " 2,\n" 8531 " 3,\n" 8532 " 4,\n" 8533 "};", 8534 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 8535 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 8536 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 8537 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 8538 } 8539 8540 TEST_F(FormatTest, FormatSpacesInAngles) { 8541 FormatStyle SpaceInAngles = getLLVMStyle(); 8542 SpaceInAngles.SpacesInAngles = true; 8543 verifyFormat("vector< ::std::string > x1;", SpaceInAngles); 8544 verifyFormat("Foo< int, Bar > x2;", SpaceInAngles); 8545 verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles); 8546 8547 SpaceInAngles.SpacesInAngles = false; 8548 verifyFormat("vector<::std::string> x4;", SpaceInAngles); 8549 verifyFormat("vector<int> x5;", SpaceInAngles); 8550 verifyFormat("Foo<int, Bar> x6;", SpaceInAngles); 8551 verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles); 8552 } 8553 8554 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 8555 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8556 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8557 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8558 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8559 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8560 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8561 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 8562 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8563 " 1, 22, 333, 4444, 55555, //\n" 8564 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8565 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8566 verifyFormat( 8567 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8568 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8569 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 8570 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8571 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8572 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8573 " 7777777};"); 8574 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8575 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8576 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8577 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8578 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8579 " // Separating comment.\n" 8580 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8581 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8582 " // Leading comment\n" 8583 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8584 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8585 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8586 " 1, 1, 1, 1};", 8587 getLLVMStyleWithColumns(39)); 8588 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8589 " 1, 1, 1, 1};", 8590 getLLVMStyleWithColumns(38)); 8591 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 8592 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 8593 getLLVMStyleWithColumns(43)); 8594 verifyFormat( 8595 "static unsigned SomeValues[10][3] = {\n" 8596 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 8597 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 8598 verifyFormat("static auto fields = new vector<string>{\n" 8599 " \"aaaaaaaaaaaaa\",\n" 8600 " \"aaaaaaaaaaaaa\",\n" 8601 " \"aaaaaaaaaaaa\",\n" 8602 " \"aaaaaaaaaaaaaa\",\n" 8603 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8604 " \"aaaaaaaaaaaa\",\n" 8605 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8606 "};"); 8607 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8608 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8609 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8610 " 3, cccccccccccccccccccccc};", 8611 getLLVMStyleWithColumns(60)); 8612 8613 // Trailing commas. 8614 verifyFormat("vector<int> x = {\n" 8615 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8616 "};", 8617 getLLVMStyleWithColumns(39)); 8618 verifyFormat("vector<int> x = {\n" 8619 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8620 "};", 8621 getLLVMStyleWithColumns(39)); 8622 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8623 " 1, 1, 1, 1,\n" 8624 " /**/ /**/};", 8625 getLLVMStyleWithColumns(39)); 8626 8627 // Trailing comment in the first line. 8628 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8629 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8630 " 111111111, 222222222, 3333333333, 444444444, //\n" 8631 " 11111111, 22222222, 333333333, 44444444};"); 8632 // Trailing comment in the last line. 8633 verifyFormat("int aaaaa[] = {\n" 8634 " 1, 2, 3, // comment\n" 8635 " 4, 5, 6 // comment\n" 8636 "};"); 8637 8638 // With nested lists, we should either format one item per line or all nested 8639 // lists one on line. 8640 // FIXME: For some nested lists, we can do better. 8641 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8642 " {aaaaaaaaaaaaaaaaaaa},\n" 8643 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8644 " {aaaaaaaaaaaaaaaaa}};", 8645 getLLVMStyleWithColumns(60)); 8646 verifyFormat( 8647 "SomeStruct my_struct_array = {\n" 8648 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8649 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8650 " {aaa, aaa},\n" 8651 " {aaa, aaa},\n" 8652 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8653 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8654 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8655 8656 // No column layout should be used here. 8657 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8658 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8659 8660 verifyNoCrash("a<,"); 8661 8662 // No braced initializer here. 8663 verifyFormat("void f() {\n" 8664 " struct Dummy {};\n" 8665 " f(v);\n" 8666 "}"); 8667 8668 // Long lists should be formatted in columns even if they are nested. 8669 verifyFormat( 8670 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8671 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8672 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8673 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8674 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8675 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8676 8677 // Allow "single-column" layout even if that violates the column limit. There 8678 // isn't going to be a better way. 8679 verifyFormat("std::vector<int> a = {\n" 8680 " aaaaaaaa,\n" 8681 " aaaaaaaa,\n" 8682 " aaaaaaaa,\n" 8683 " aaaaaaaa,\n" 8684 " aaaaaaaaaa,\n" 8685 " aaaaaaaa,\n" 8686 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8687 getLLVMStyleWithColumns(30)); 8688 verifyFormat("vector<int> aaaa = {\n" 8689 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8690 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8691 " aaaaaa.aaaaaaa,\n" 8692 " aaaaaa.aaaaaaa,\n" 8693 " aaaaaa.aaaaaaa,\n" 8694 " aaaaaa.aaaaaaa,\n" 8695 "};"); 8696 8697 // Don't create hanging lists. 8698 verifyFormat("someFunction(Param, {List1, List2,\n" 8699 " List3});", 8700 getLLVMStyleWithColumns(35)); 8701 verifyFormat("someFunction(Param, Param,\n" 8702 " {List1, List2,\n" 8703 " List3});", 8704 getLLVMStyleWithColumns(35)); 8705 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8706 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8707 } 8708 8709 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8710 FormatStyle DoNotMerge = getLLVMStyle(); 8711 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8712 8713 verifyFormat("void f() { return 42; }"); 8714 verifyFormat("void f() {\n" 8715 " return 42;\n" 8716 "}", 8717 DoNotMerge); 8718 verifyFormat("void f() {\n" 8719 " // Comment\n" 8720 "}"); 8721 verifyFormat("{\n" 8722 "#error {\n" 8723 " int a;\n" 8724 "}"); 8725 verifyFormat("{\n" 8726 " int a;\n" 8727 "#error {\n" 8728 "}"); 8729 verifyFormat("void f() {} // comment"); 8730 verifyFormat("void f() { int a; } // comment"); 8731 verifyFormat("void f() {\n" 8732 "} // comment", 8733 DoNotMerge); 8734 verifyFormat("void f() {\n" 8735 " int a;\n" 8736 "} // comment", 8737 DoNotMerge); 8738 verifyFormat("void f() {\n" 8739 "} // comment", 8740 getLLVMStyleWithColumns(15)); 8741 8742 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8743 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8744 8745 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8746 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8747 verifyFormat("class C {\n" 8748 " C()\n" 8749 " : iiiiiiii(nullptr),\n" 8750 " kkkkkkk(nullptr),\n" 8751 " mmmmmmm(nullptr),\n" 8752 " nnnnnnn(nullptr) {}\n" 8753 "};", 8754 getGoogleStyle()); 8755 8756 FormatStyle NoColumnLimit = getLLVMStyle(); 8757 NoColumnLimit.ColumnLimit = 0; 8758 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8759 EXPECT_EQ("class C {\n" 8760 " A() : b(0) {}\n" 8761 "};", 8762 format("class C{A():b(0){}};", NoColumnLimit)); 8763 EXPECT_EQ("A()\n" 8764 " : b(0) {\n" 8765 "}", 8766 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8767 8768 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8769 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8770 FormatStyle::SFS_None; 8771 EXPECT_EQ("A()\n" 8772 " : b(0) {\n" 8773 "}", 8774 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8775 EXPECT_EQ("A()\n" 8776 " : b(0) {\n" 8777 "}", 8778 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8779 8780 verifyFormat("#define A \\\n" 8781 " void f() { \\\n" 8782 " int i; \\\n" 8783 " }", 8784 getLLVMStyleWithColumns(20)); 8785 verifyFormat("#define A \\\n" 8786 " void f() { int i; }", 8787 getLLVMStyleWithColumns(21)); 8788 verifyFormat("#define A \\\n" 8789 " void f() { \\\n" 8790 " int i; \\\n" 8791 " } \\\n" 8792 " int j;", 8793 getLLVMStyleWithColumns(22)); 8794 verifyFormat("#define A \\\n" 8795 " void f() { int i; } \\\n" 8796 " int j;", 8797 getLLVMStyleWithColumns(23)); 8798 } 8799 8800 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8801 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8802 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8803 verifyFormat("class C {\n" 8804 " int f() {}\n" 8805 "};", 8806 MergeEmptyOnly); 8807 verifyFormat("class C {\n" 8808 " int f() {\n" 8809 " return 42;\n" 8810 " }\n" 8811 "};", 8812 MergeEmptyOnly); 8813 verifyFormat("int f() {}", MergeEmptyOnly); 8814 verifyFormat("int f() {\n" 8815 " return 42;\n" 8816 "}", 8817 MergeEmptyOnly); 8818 8819 // Also verify behavior when BraceWrapping.AfterFunction = true 8820 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8821 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8822 verifyFormat("int f() {}", MergeEmptyOnly); 8823 verifyFormat("class C {\n" 8824 " int f() {}\n" 8825 "};", 8826 MergeEmptyOnly); 8827 } 8828 8829 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8830 FormatStyle MergeInlineOnly = getLLVMStyle(); 8831 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8832 verifyFormat("class C {\n" 8833 " int f() { return 42; }\n" 8834 "};", 8835 MergeInlineOnly); 8836 verifyFormat("int f() {\n" 8837 " return 42;\n" 8838 "}", 8839 MergeInlineOnly); 8840 8841 // SFS_Inline implies SFS_Empty 8842 verifyFormat("class C {\n" 8843 " int f() {}\n" 8844 "};", 8845 MergeInlineOnly); 8846 verifyFormat("int f() {}", MergeInlineOnly); 8847 8848 // Also verify behavior when BraceWrapping.AfterFunction = true 8849 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8850 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8851 verifyFormat("class C {\n" 8852 " int f() { return 42; }\n" 8853 "};", 8854 MergeInlineOnly); 8855 verifyFormat("int f()\n" 8856 "{\n" 8857 " return 42;\n" 8858 "}", 8859 MergeInlineOnly); 8860 8861 // SFS_Inline implies SFS_Empty 8862 verifyFormat("int f() {}", MergeInlineOnly); 8863 verifyFormat("class C {\n" 8864 " int f() {}\n" 8865 "};", 8866 MergeInlineOnly); 8867 } 8868 8869 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8870 FormatStyle MergeInlineOnly = getLLVMStyle(); 8871 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8872 FormatStyle::SFS_InlineOnly; 8873 verifyFormat("class C {\n" 8874 " int f() { return 42; }\n" 8875 "};", 8876 MergeInlineOnly); 8877 verifyFormat("int f() {\n" 8878 " return 42;\n" 8879 "}", 8880 MergeInlineOnly); 8881 8882 // SFS_InlineOnly does not imply SFS_Empty 8883 verifyFormat("class C {\n" 8884 " int f() {}\n" 8885 "};", 8886 MergeInlineOnly); 8887 verifyFormat("int f() {\n" 8888 "}", 8889 MergeInlineOnly); 8890 8891 // Also verify behavior when BraceWrapping.AfterFunction = true 8892 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8893 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8894 verifyFormat("class C {\n" 8895 " int f() { return 42; }\n" 8896 "};", 8897 MergeInlineOnly); 8898 verifyFormat("int f()\n" 8899 "{\n" 8900 " return 42;\n" 8901 "}", 8902 MergeInlineOnly); 8903 8904 // SFS_InlineOnly does not imply SFS_Empty 8905 verifyFormat("int f()\n" 8906 "{\n" 8907 "}", 8908 MergeInlineOnly); 8909 verifyFormat("class C {\n" 8910 " int f() {}\n" 8911 "};", 8912 MergeInlineOnly); 8913 } 8914 8915 TEST_F(FormatTest, SplitEmptyFunction) { 8916 FormatStyle Style = getLLVMStyle(); 8917 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8918 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8919 Style.BraceWrapping.AfterFunction = true; 8920 Style.BraceWrapping.SplitEmptyFunction = false; 8921 Style.ColumnLimit = 40; 8922 8923 verifyFormat("int f()\n" 8924 "{}", 8925 Style); 8926 verifyFormat("int f()\n" 8927 "{\n" 8928 " return 42;\n" 8929 "}", 8930 Style); 8931 verifyFormat("int f()\n" 8932 "{\n" 8933 " // some comment\n" 8934 "}", 8935 Style); 8936 8937 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8938 verifyFormat("int f() {}", Style); 8939 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8940 "{}", 8941 Style); 8942 verifyFormat("int f()\n" 8943 "{\n" 8944 " return 0;\n" 8945 "}", 8946 Style); 8947 8948 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8949 verifyFormat("class Foo {\n" 8950 " int f() {}\n" 8951 "};\n", 8952 Style); 8953 verifyFormat("class Foo {\n" 8954 " int f() { return 0; }\n" 8955 "};\n", 8956 Style); 8957 verifyFormat("class Foo {\n" 8958 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8959 " {}\n" 8960 "};\n", 8961 Style); 8962 verifyFormat("class Foo {\n" 8963 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8964 " {\n" 8965 " return 0;\n" 8966 " }\n" 8967 "};\n", 8968 Style); 8969 8970 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8971 verifyFormat("int f() {}", Style); 8972 verifyFormat("int f() { return 0; }", Style); 8973 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8974 "{}", 8975 Style); 8976 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8977 "{\n" 8978 " return 0;\n" 8979 "}", 8980 Style); 8981 } 8982 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8983 FormatStyle Style = getLLVMStyle(); 8984 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8985 verifyFormat("#ifdef A\n" 8986 "int f() {}\n" 8987 "#else\n" 8988 "int g() {}\n" 8989 "#endif", 8990 Style); 8991 } 8992 8993 TEST_F(FormatTest, SplitEmptyClass) { 8994 FormatStyle Style = getLLVMStyle(); 8995 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8996 Style.BraceWrapping.AfterClass = true; 8997 Style.BraceWrapping.SplitEmptyRecord = false; 8998 8999 verifyFormat("class Foo\n" 9000 "{};", 9001 Style); 9002 verifyFormat("/* something */ class Foo\n" 9003 "{};", 9004 Style); 9005 verifyFormat("template <typename X> class Foo\n" 9006 "{};", 9007 Style); 9008 verifyFormat("class Foo\n" 9009 "{\n" 9010 " Foo();\n" 9011 "};", 9012 Style); 9013 verifyFormat("typedef class Foo\n" 9014 "{\n" 9015 "} Foo_t;", 9016 Style); 9017 } 9018 9019 TEST_F(FormatTest, SplitEmptyStruct) { 9020 FormatStyle Style = getLLVMStyle(); 9021 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9022 Style.BraceWrapping.AfterStruct = true; 9023 Style.BraceWrapping.SplitEmptyRecord = false; 9024 9025 verifyFormat("struct Foo\n" 9026 "{};", 9027 Style); 9028 verifyFormat("/* something */ struct Foo\n" 9029 "{};", 9030 Style); 9031 verifyFormat("template <typename X> struct Foo\n" 9032 "{};", 9033 Style); 9034 verifyFormat("struct Foo\n" 9035 "{\n" 9036 " Foo();\n" 9037 "};", 9038 Style); 9039 verifyFormat("typedef struct Foo\n" 9040 "{\n" 9041 "} Foo_t;", 9042 Style); 9043 // typedef struct Bar {} Bar_t; 9044 } 9045 9046 TEST_F(FormatTest, SplitEmptyUnion) { 9047 FormatStyle Style = getLLVMStyle(); 9048 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9049 Style.BraceWrapping.AfterUnion = true; 9050 Style.BraceWrapping.SplitEmptyRecord = false; 9051 9052 verifyFormat("union Foo\n" 9053 "{};", 9054 Style); 9055 verifyFormat("/* something */ union Foo\n" 9056 "{};", 9057 Style); 9058 verifyFormat("union Foo\n" 9059 "{\n" 9060 " A,\n" 9061 "};", 9062 Style); 9063 verifyFormat("typedef union Foo\n" 9064 "{\n" 9065 "} Foo_t;", 9066 Style); 9067 } 9068 9069 TEST_F(FormatTest, SplitEmptyNamespace) { 9070 FormatStyle Style = getLLVMStyle(); 9071 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9072 Style.BraceWrapping.AfterNamespace = true; 9073 Style.BraceWrapping.SplitEmptyNamespace = false; 9074 9075 verifyFormat("namespace Foo\n" 9076 "{};", 9077 Style); 9078 verifyFormat("/* something */ namespace Foo\n" 9079 "{};", 9080 Style); 9081 verifyFormat("inline namespace Foo\n" 9082 "{};", 9083 Style); 9084 verifyFormat("/* something */ inline namespace Foo\n" 9085 "{};", 9086 Style); 9087 verifyFormat("export namespace Foo\n" 9088 "{};", 9089 Style); 9090 verifyFormat("namespace Foo\n" 9091 "{\n" 9092 "void Bar();\n" 9093 "};", 9094 Style); 9095 } 9096 9097 TEST_F(FormatTest, NeverMergeShortRecords) { 9098 FormatStyle Style = getLLVMStyle(); 9099 9100 verifyFormat("class Foo {\n" 9101 " Foo();\n" 9102 "};", 9103 Style); 9104 verifyFormat("typedef class Foo {\n" 9105 " Foo();\n" 9106 "} Foo_t;", 9107 Style); 9108 verifyFormat("struct Foo {\n" 9109 " Foo();\n" 9110 "};", 9111 Style); 9112 verifyFormat("typedef struct Foo {\n" 9113 " Foo();\n" 9114 "} Foo_t;", 9115 Style); 9116 verifyFormat("union Foo {\n" 9117 " A,\n" 9118 "};", 9119 Style); 9120 verifyFormat("typedef union Foo {\n" 9121 " A,\n" 9122 "} Foo_t;", 9123 Style); 9124 verifyFormat("namespace Foo {\n" 9125 "void Bar();\n" 9126 "};", 9127 Style); 9128 9129 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9130 Style.BraceWrapping.AfterClass = true; 9131 Style.BraceWrapping.AfterStruct = true; 9132 Style.BraceWrapping.AfterUnion = true; 9133 Style.BraceWrapping.AfterNamespace = true; 9134 verifyFormat("class Foo\n" 9135 "{\n" 9136 " Foo();\n" 9137 "};", 9138 Style); 9139 verifyFormat("typedef class Foo\n" 9140 "{\n" 9141 " Foo();\n" 9142 "} Foo_t;", 9143 Style); 9144 verifyFormat("struct Foo\n" 9145 "{\n" 9146 " Foo();\n" 9147 "};", 9148 Style); 9149 verifyFormat("typedef struct Foo\n" 9150 "{\n" 9151 " Foo();\n" 9152 "} Foo_t;", 9153 Style); 9154 verifyFormat("union Foo\n" 9155 "{\n" 9156 " A,\n" 9157 "};", 9158 Style); 9159 verifyFormat("typedef union Foo\n" 9160 "{\n" 9161 " A,\n" 9162 "} Foo_t;", 9163 Style); 9164 verifyFormat("namespace Foo\n" 9165 "{\n" 9166 "void Bar();\n" 9167 "};", 9168 Style); 9169 } 9170 9171 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 9172 // Elaborate type variable declarations. 9173 verifyFormat("struct foo a = {bar};\nint n;"); 9174 verifyFormat("class foo a = {bar};\nint n;"); 9175 verifyFormat("union foo a = {bar};\nint n;"); 9176 9177 // Elaborate types inside function definitions. 9178 verifyFormat("struct foo f() {}\nint n;"); 9179 verifyFormat("class foo f() {}\nint n;"); 9180 verifyFormat("union foo f() {}\nint n;"); 9181 9182 // Templates. 9183 verifyFormat("template <class X> void f() {}\nint n;"); 9184 verifyFormat("template <struct X> void f() {}\nint n;"); 9185 verifyFormat("template <union X> void f() {}\nint n;"); 9186 9187 // Actual definitions... 9188 verifyFormat("struct {\n} n;"); 9189 verifyFormat( 9190 "template <template <class T, class Y>, class Z> class X {\n} n;"); 9191 verifyFormat("union Z {\n int n;\n} x;"); 9192 verifyFormat("class MACRO Z {\n} n;"); 9193 verifyFormat("class MACRO(X) Z {\n} n;"); 9194 verifyFormat("class __attribute__(X) Z {\n} n;"); 9195 verifyFormat("class __declspec(X) Z {\n} n;"); 9196 verifyFormat("class A##B##C {\n} n;"); 9197 verifyFormat("class alignas(16) Z {\n} n;"); 9198 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 9199 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 9200 9201 // Redefinition from nested context: 9202 verifyFormat("class A::B::C {\n} n;"); 9203 9204 // Template definitions. 9205 verifyFormat( 9206 "template <typename F>\n" 9207 "Matcher(const Matcher<F> &Other,\n" 9208 " typename enable_if_c<is_base_of<F, T>::value &&\n" 9209 " !is_same<F, T>::value>::type * = 0)\n" 9210 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 9211 9212 // FIXME: This is still incorrectly handled at the formatter side. 9213 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 9214 verifyFormat("int i = SomeFunction(a<b, a> b);"); 9215 9216 // FIXME: 9217 // This now gets parsed incorrectly as class definition. 9218 // verifyFormat("class A<int> f() {\n}\nint n;"); 9219 9220 // Elaborate types where incorrectly parsing the structural element would 9221 // break the indent. 9222 verifyFormat("if (true)\n" 9223 " class X x;\n" 9224 "else\n" 9225 " f();\n"); 9226 9227 // This is simply incomplete. Formatting is not important, but must not crash. 9228 verifyFormat("class A:"); 9229 } 9230 9231 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 9232 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 9233 format("#error Leave all white!!!!! space* alone!\n")); 9234 EXPECT_EQ( 9235 "#warning Leave all white!!!!! space* alone!\n", 9236 format("#warning Leave all white!!!!! space* alone!\n")); 9237 EXPECT_EQ("#error 1", format(" # error 1")); 9238 EXPECT_EQ("#warning 1", format(" # warning 1")); 9239 } 9240 9241 TEST_F(FormatTest, FormatHashIfExpressions) { 9242 verifyFormat("#if AAAA && BBBB"); 9243 verifyFormat("#if (AAAA && BBBB)"); 9244 verifyFormat("#elif (AAAA && BBBB)"); 9245 // FIXME: Come up with a better indentation for #elif. 9246 verifyFormat( 9247 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 9248 " defined(BBBBBBBB)\n" 9249 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 9250 " defined(BBBBBBBB)\n" 9251 "#endif", 9252 getLLVMStyleWithColumns(65)); 9253 } 9254 9255 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 9256 FormatStyle AllowsMergedIf = getGoogleStyle(); 9257 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 9258 FormatStyle::SIS_WithoutElse; 9259 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 9260 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 9261 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 9262 EXPECT_EQ("if (true) return 42;", 9263 format("if (true)\nreturn 42;", AllowsMergedIf)); 9264 FormatStyle ShortMergedIf = AllowsMergedIf; 9265 ShortMergedIf.ColumnLimit = 25; 9266 verifyFormat("#define A \\\n" 9267 " if (true) return 42;", 9268 ShortMergedIf); 9269 verifyFormat("#define A \\\n" 9270 " f(); \\\n" 9271 " if (true)\n" 9272 "#define B", 9273 ShortMergedIf); 9274 verifyFormat("#define A \\\n" 9275 " f(); \\\n" 9276 " if (true)\n" 9277 "g();", 9278 ShortMergedIf); 9279 verifyFormat("{\n" 9280 "#ifdef A\n" 9281 " // Comment\n" 9282 " if (true) continue;\n" 9283 "#endif\n" 9284 " // Comment\n" 9285 " if (true) continue;\n" 9286 "}", 9287 ShortMergedIf); 9288 ShortMergedIf.ColumnLimit = 33; 9289 verifyFormat("#define A \\\n" 9290 " if constexpr (true) return 42;", 9291 ShortMergedIf); 9292 verifyFormat("#define A \\\n" 9293 " if CONSTEXPR (true) return 42;", 9294 ShortMergedIf); 9295 ShortMergedIf.ColumnLimit = 29; 9296 verifyFormat("#define A \\\n" 9297 " if (aaaaaaaaaa) return 1; \\\n" 9298 " return 2;", 9299 ShortMergedIf); 9300 ShortMergedIf.ColumnLimit = 28; 9301 verifyFormat("#define A \\\n" 9302 " if (aaaaaaaaaa) \\\n" 9303 " return 1; \\\n" 9304 " return 2;", 9305 ShortMergedIf); 9306 verifyFormat("#define A \\\n" 9307 " if constexpr (aaaaaaa) \\\n" 9308 " return 1; \\\n" 9309 " return 2;", 9310 ShortMergedIf); 9311 verifyFormat("#define A \\\n" 9312 " if CONSTEXPR (aaaaaaa) \\\n" 9313 " return 1; \\\n" 9314 " return 2;", 9315 ShortMergedIf); 9316 } 9317 9318 TEST_F(FormatTest, FormatStarDependingOnContext) { 9319 verifyFormat("void f(int *a);"); 9320 verifyFormat("void f() { f(fint * b); }"); 9321 verifyFormat("class A {\n void f(int *a);\n};"); 9322 verifyFormat("class A {\n int *a;\n};"); 9323 verifyFormat("namespace a {\n" 9324 "namespace b {\n" 9325 "class A {\n" 9326 " void f() {}\n" 9327 " int *a;\n" 9328 "};\n" 9329 "} // namespace b\n" 9330 "} // namespace a"); 9331 } 9332 9333 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 9334 verifyFormat("while"); 9335 verifyFormat("operator"); 9336 } 9337 9338 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 9339 // This code would be painfully slow to format if we didn't skip it. 9340 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 9341 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9342 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9343 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9344 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9345 "A(1, 1)\n" 9346 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 9347 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9348 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9349 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9350 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9351 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9352 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9353 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9354 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9355 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 9356 // Deeply nested part is untouched, rest is formatted. 9357 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 9358 format(std::string("int i;\n") + Code + "int j;\n", 9359 getLLVMStyle(), SC_ExpectIncomplete)); 9360 } 9361 9362 //===----------------------------------------------------------------------===// 9363 // Objective-C tests. 9364 //===----------------------------------------------------------------------===// 9365 9366 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 9367 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 9368 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 9369 format("-(NSUInteger)indexOfObject:(id)anObject;")); 9370 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 9371 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 9372 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 9373 format("-(NSInteger)Method3:(id)anObject;")); 9374 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 9375 format("-(NSInteger)Method4:(id)anObject;")); 9376 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 9377 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 9378 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 9379 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 9380 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9381 "forAllCells:(BOOL)flag;", 9382 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9383 "forAllCells:(BOOL)flag;")); 9384 9385 // Very long objectiveC method declaration. 9386 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 9387 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 9388 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 9389 " inRange:(NSRange)range\n" 9390 " outRange:(NSRange)out_range\n" 9391 " outRange1:(NSRange)out_range1\n" 9392 " outRange2:(NSRange)out_range2\n" 9393 " outRange3:(NSRange)out_range3\n" 9394 " outRange4:(NSRange)out_range4\n" 9395 " outRange5:(NSRange)out_range5\n" 9396 " outRange6:(NSRange)out_range6\n" 9397 " outRange7:(NSRange)out_range7\n" 9398 " outRange8:(NSRange)out_range8\n" 9399 " outRange9:(NSRange)out_range9;"); 9400 9401 // When the function name has to be wrapped. 9402 FormatStyle Style = getLLVMStyle(); 9403 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 9404 // and always indents instead. 9405 Style.IndentWrappedFunctionNames = false; 9406 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9407 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 9408 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 9409 "}", 9410 Style); 9411 Style.IndentWrappedFunctionNames = true; 9412 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9413 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 9414 " anotherName:(NSString)dddddddddddddd {\n" 9415 "}", 9416 Style); 9417 9418 verifyFormat("- (int)sum:(vector<int>)numbers;"); 9419 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 9420 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 9421 // protocol lists (but not for template classes): 9422 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 9423 9424 verifyFormat("- (int (*)())foo:(int (*)())f;"); 9425 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 9426 9427 // If there's no return type (very rare in practice!), LLVM and Google style 9428 // agree. 9429 verifyFormat("- foo;"); 9430 verifyFormat("- foo:(int)f;"); 9431 verifyGoogleFormat("- foo:(int)foo;"); 9432 } 9433 9434 TEST_F(FormatTest, BreaksStringLiterals) { 9435 EXPECT_EQ("\"some text \"\n" 9436 "\"other\";", 9437 format("\"some text other\";", getLLVMStyleWithColumns(12))); 9438 EXPECT_EQ("\"some text \"\n" 9439 "\"other\";", 9440 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 9441 EXPECT_EQ( 9442 "#define A \\\n" 9443 " \"some \" \\\n" 9444 " \"text \" \\\n" 9445 " \"other\";", 9446 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 9447 EXPECT_EQ( 9448 "#define A \\\n" 9449 " \"so \" \\\n" 9450 " \"text \" \\\n" 9451 " \"other\";", 9452 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 9453 9454 EXPECT_EQ("\"some text\"", 9455 format("\"some text\"", getLLVMStyleWithColumns(1))); 9456 EXPECT_EQ("\"some text\"", 9457 format("\"some text\"", getLLVMStyleWithColumns(11))); 9458 EXPECT_EQ("\"some \"\n" 9459 "\"text\"", 9460 format("\"some text\"", getLLVMStyleWithColumns(10))); 9461 EXPECT_EQ("\"some \"\n" 9462 "\"text\"", 9463 format("\"some text\"", getLLVMStyleWithColumns(7))); 9464 EXPECT_EQ("\"some\"\n" 9465 "\" tex\"\n" 9466 "\"t\"", 9467 format("\"some text\"", getLLVMStyleWithColumns(6))); 9468 EXPECT_EQ("\"some\"\n" 9469 "\" tex\"\n" 9470 "\" and\"", 9471 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 9472 EXPECT_EQ("\"some\"\n" 9473 "\"/tex\"\n" 9474 "\"/and\"", 9475 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 9476 9477 EXPECT_EQ("variable =\n" 9478 " \"long string \"\n" 9479 " \"literal\";", 9480 format("variable = \"long string literal\";", 9481 getLLVMStyleWithColumns(20))); 9482 9483 EXPECT_EQ("variable = f(\n" 9484 " \"long string \"\n" 9485 " \"literal\",\n" 9486 " short,\n" 9487 " loooooooooooooooooooong);", 9488 format("variable = f(\"long string literal\", short, " 9489 "loooooooooooooooooooong);", 9490 getLLVMStyleWithColumns(20))); 9491 9492 EXPECT_EQ( 9493 "f(g(\"long string \"\n" 9494 " \"literal\"),\n" 9495 " b);", 9496 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 9497 EXPECT_EQ("f(g(\"long string \"\n" 9498 " \"literal\",\n" 9499 " a),\n" 9500 " b);", 9501 format("f(g(\"long string literal\", a), b);", 9502 getLLVMStyleWithColumns(20))); 9503 EXPECT_EQ( 9504 "f(\"one two\".split(\n" 9505 " variable));", 9506 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 9507 EXPECT_EQ("f(\"one two three four five six \"\n" 9508 " \"seven\".split(\n" 9509 " really_looooong_variable));", 9510 format("f(\"one two three four five six seven\"." 9511 "split(really_looooong_variable));", 9512 getLLVMStyleWithColumns(33))); 9513 9514 EXPECT_EQ("f(\"some \"\n" 9515 " \"text\",\n" 9516 " other);", 9517 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 9518 9519 // Only break as a last resort. 9520 verifyFormat( 9521 "aaaaaaaaaaaaaaaaaaaa(\n" 9522 " aaaaaaaaaaaaaaaaaaaa,\n" 9523 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 9524 9525 EXPECT_EQ("\"splitmea\"\n" 9526 "\"trandomp\"\n" 9527 "\"oint\"", 9528 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 9529 9530 EXPECT_EQ("\"split/\"\n" 9531 "\"pathat/\"\n" 9532 "\"slashes\"", 9533 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9534 9535 EXPECT_EQ("\"split/\"\n" 9536 "\"pathat/\"\n" 9537 "\"slashes\"", 9538 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9539 EXPECT_EQ("\"split at \"\n" 9540 "\"spaces/at/\"\n" 9541 "\"slashes.at.any$\"\n" 9542 "\"non-alphanumeric%\"\n" 9543 "\"1111111111characte\"\n" 9544 "\"rs\"", 9545 format("\"split at " 9546 "spaces/at/" 9547 "slashes.at." 9548 "any$non-" 9549 "alphanumeric%" 9550 "1111111111characte" 9551 "rs\"", 9552 getLLVMStyleWithColumns(20))); 9553 9554 // Verify that splitting the strings understands 9555 // Style::AlwaysBreakBeforeMultilineStrings. 9556 EXPECT_EQ("aaaaaaaaaaaa(\n" 9557 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 9558 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 9559 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 9560 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9561 "aaaaaaaaaaaaaaaaaaaaaa\");", 9562 getGoogleStyle())); 9563 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9564 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9565 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9566 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9567 "aaaaaaaaaaaaaaaaaaaaaa\";", 9568 getGoogleStyle())); 9569 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9570 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9571 format("llvm::outs() << " 9572 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 9573 "aaaaaaaaaaaaaaaaaaa\";")); 9574 EXPECT_EQ("ffff(\n" 9575 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9576 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9577 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 9578 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9579 getGoogleStyle())); 9580 9581 FormatStyle Style = getLLVMStyleWithColumns(12); 9582 Style.BreakStringLiterals = false; 9583 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 9584 9585 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 9586 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9587 EXPECT_EQ("#define A \\\n" 9588 " \"some \" \\\n" 9589 " \"text \" \\\n" 9590 " \"other\";", 9591 format("#define A \"some text other\";", AlignLeft)); 9592 } 9593 9594 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 9595 EXPECT_EQ("C a = \"some more \"\n" 9596 " \"text\";", 9597 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9598 } 9599 9600 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9601 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9602 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9603 EXPECT_EQ("int i = a(b());", 9604 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9605 } 9606 9607 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9608 EXPECT_EQ( 9609 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9610 "(\n" 9611 " \"x\t\");", 9612 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9613 "aaaaaaa(" 9614 "\"x\t\");")); 9615 } 9616 9617 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9618 EXPECT_EQ( 9619 "u8\"utf8 string \"\n" 9620 "u8\"literal\";", 9621 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9622 EXPECT_EQ( 9623 "u\"utf16 string \"\n" 9624 "u\"literal\";", 9625 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9626 EXPECT_EQ( 9627 "U\"utf32 string \"\n" 9628 "U\"literal\";", 9629 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9630 EXPECT_EQ("L\"wide string \"\n" 9631 "L\"literal\";", 9632 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9633 EXPECT_EQ("@\"NSString \"\n" 9634 "@\"literal\";", 9635 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9636 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9637 9638 // This input makes clang-format try to split the incomplete unicode escape 9639 // sequence, which used to lead to a crasher. 9640 verifyNoCrash( 9641 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9642 getLLVMStyleWithColumns(60)); 9643 } 9644 9645 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9646 FormatStyle Style = getGoogleStyleWithColumns(15); 9647 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9648 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9649 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9650 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9651 EXPECT_EQ("u8R\"x(raw literal)x\";", 9652 format("u8R\"x(raw literal)x\";", Style)); 9653 } 9654 9655 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9656 FormatStyle Style = getLLVMStyleWithColumns(20); 9657 EXPECT_EQ( 9658 "_T(\"aaaaaaaaaaaaaa\")\n" 9659 "_T(\"aaaaaaaaaaaaaa\")\n" 9660 "_T(\"aaaaaaaaaaaa\")", 9661 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9662 EXPECT_EQ("f(x,\n" 9663 " _T(\"aaaaaaaaaaaa\")\n" 9664 " _T(\"aaa\"),\n" 9665 " z);", 9666 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9667 9668 // FIXME: Handle embedded spaces in one iteration. 9669 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9670 // "_T(\"aaaaaaaaaaaaa\")\n" 9671 // "_T(\"aaaaaaaaaaaaa\")\n" 9672 // "_T(\"a\")", 9673 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9674 // getLLVMStyleWithColumns(20))); 9675 EXPECT_EQ( 9676 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9677 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9678 EXPECT_EQ("f(\n" 9679 "#if !TEST\n" 9680 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9681 "#endif\n" 9682 ");", 9683 format("f(\n" 9684 "#if !TEST\n" 9685 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9686 "#endif\n" 9687 ");")); 9688 EXPECT_EQ("f(\n" 9689 "\n" 9690 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9691 format("f(\n" 9692 "\n" 9693 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9694 } 9695 9696 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9697 // In a function call with two operands, the second can be broken with no line 9698 // break before it. 9699 EXPECT_EQ( 9700 "func(a, \"long long \"\n" 9701 " \"long long\");", 9702 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 9703 // In a function call with three operands, the second must be broken with a 9704 // line break before it. 9705 EXPECT_EQ("func(a,\n" 9706 " \"long long long \"\n" 9707 " \"long\",\n" 9708 " c);", 9709 format("func(a, \"long long long long\", c);", 9710 getLLVMStyleWithColumns(24))); 9711 // In a function call with three operands, the third must be broken with a 9712 // line break before it. 9713 EXPECT_EQ("func(a, b,\n" 9714 " \"long long long \"\n" 9715 " \"long\");", 9716 format("func(a, b, \"long long long long\");", 9717 getLLVMStyleWithColumns(24))); 9718 // In a function call with three operands, both the second and the third must 9719 // be broken with a line break before them. 9720 EXPECT_EQ("func(a,\n" 9721 " \"long long long \"\n" 9722 " \"long\",\n" 9723 " \"long long long \"\n" 9724 " \"long\");", 9725 format("func(a, \"long long long long\", \"long long long long\");", 9726 getLLVMStyleWithColumns(24))); 9727 // In a chain of << with two operands, the second can be broken with no line 9728 // break before it. 9729 EXPECT_EQ("a << \"line line \"\n" 9730 " \"line\";", 9731 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 9732 // In a chain of << with three operands, the second can be broken with no line 9733 // break before it. 9734 EXPECT_EQ( 9735 "abcde << \"line \"\n" 9736 " \"line line\"\n" 9737 " << c;", 9738 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 9739 // In a chain of << with three operands, the third must be broken with a line 9740 // break before it. 9741 EXPECT_EQ( 9742 "a << b\n" 9743 " << \"line line \"\n" 9744 " \"line\";", 9745 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 9746 // In a chain of << with three operands, the second can be broken with no line 9747 // break before it and the third must be broken with a line break before it. 9748 EXPECT_EQ("abcd << \"line line \"\n" 9749 " \"line\"\n" 9750 " << \"line line \"\n" 9751 " \"line\";", 9752 format("abcd << \"line line line\" << \"line line line\";", 9753 getLLVMStyleWithColumns(20))); 9754 // In a chain of binary operators with two operands, the second can be broken 9755 // with no line break before it. 9756 EXPECT_EQ( 9757 "abcd + \"line line \"\n" 9758 " \"line line\";", 9759 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 9760 // In a chain of binary operators with three operands, the second must be 9761 // broken with a line break before it. 9762 EXPECT_EQ("abcd +\n" 9763 " \"line line \"\n" 9764 " \"line line\" +\n" 9765 " e;", 9766 format("abcd + \"line line line line\" + e;", 9767 getLLVMStyleWithColumns(20))); 9768 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9769 // the first must be broken with a line break before it. 9770 FormatStyle Style = getLLVMStyleWithColumns(25); 9771 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9772 EXPECT_EQ("someFunction(\n" 9773 " \"long long long \"\n" 9774 " \"long\",\n" 9775 " a);", 9776 format("someFunction(\"long long long long\", a);", Style)); 9777 } 9778 9779 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9780 EXPECT_EQ( 9781 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9782 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9783 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9784 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9785 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9786 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9787 } 9788 9789 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9790 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9791 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9792 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9793 "multiline raw string literal xxxxxxxxxxxxxx\n" 9794 ")x\",\n" 9795 " a),\n" 9796 " b);", 9797 format("fffffffffff(g(R\"x(\n" 9798 "multiline raw string literal xxxxxxxxxxxxxx\n" 9799 ")x\", a), b);", 9800 getGoogleStyleWithColumns(20))); 9801 EXPECT_EQ("fffffffffff(\n" 9802 " g(R\"x(qqq\n" 9803 "multiline raw string literal xxxxxxxxxxxxxx\n" 9804 ")x\",\n" 9805 " a),\n" 9806 " b);", 9807 format("fffffffffff(g(R\"x(qqq\n" 9808 "multiline raw string literal xxxxxxxxxxxxxx\n" 9809 ")x\", a), b);", 9810 getGoogleStyleWithColumns(20))); 9811 9812 EXPECT_EQ("fffffffffff(R\"x(\n" 9813 "multiline raw string literal xxxxxxxxxxxxxx\n" 9814 ")x\");", 9815 format("fffffffffff(R\"x(\n" 9816 "multiline raw string literal xxxxxxxxxxxxxx\n" 9817 ")x\");", 9818 getGoogleStyleWithColumns(20))); 9819 EXPECT_EQ("fffffffffff(R\"x(\n" 9820 "multiline raw string literal xxxxxxxxxxxxxx\n" 9821 ")x\" + bbbbbb);", 9822 format("fffffffffff(R\"x(\n" 9823 "multiline raw string literal xxxxxxxxxxxxxx\n" 9824 ")x\" + bbbbbb);", 9825 getGoogleStyleWithColumns(20))); 9826 EXPECT_EQ("fffffffffff(\n" 9827 " R\"x(\n" 9828 "multiline raw string literal xxxxxxxxxxxxxx\n" 9829 ")x\" +\n" 9830 " bbbbbb);", 9831 format("fffffffffff(\n" 9832 " R\"x(\n" 9833 "multiline raw string literal xxxxxxxxxxxxxx\n" 9834 ")x\" + bbbbbb);", 9835 getGoogleStyleWithColumns(20))); 9836 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9837 format("fffffffffff(\n" 9838 " R\"(single line raw string)\" + bbbbbb);")); 9839 } 9840 9841 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9842 verifyFormat("string a = \"unterminated;"); 9843 EXPECT_EQ("function(\"unterminated,\n" 9844 " OtherParameter);", 9845 format("function( \"unterminated,\n" 9846 " OtherParameter);")); 9847 } 9848 9849 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9850 FormatStyle Style = getLLVMStyle(); 9851 Style.Standard = FormatStyle::LS_Cpp03; 9852 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9853 format("#define x(_a) printf(\"foo\"_a);", Style)); 9854 } 9855 9856 TEST_F(FormatTest, CppLexVersion) { 9857 FormatStyle Style = getLLVMStyle(); 9858 // Formatting of x * y differs if x is a type. 9859 verifyFormat("void foo() { MACRO(a * b); }", Style); 9860 verifyFormat("void foo() { MACRO(int *b); }", Style); 9861 9862 // LLVM style uses latest lexer. 9863 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 9864 Style.Standard = FormatStyle::LS_Cpp17; 9865 // But in c++17, char8_t isn't a keyword. 9866 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 9867 } 9868 9869 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9870 9871 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9872 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9873 " \"ddeeefff\");", 9874 format("someFunction(\"aaabbbcccdddeeefff\");", 9875 getLLVMStyleWithColumns(25))); 9876 EXPECT_EQ("someFunction1234567890(\n" 9877 " \"aaabbbcccdddeeefff\");", 9878 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9879 getLLVMStyleWithColumns(26))); 9880 EXPECT_EQ("someFunction1234567890(\n" 9881 " \"aaabbbcccdddeeeff\"\n" 9882 " \"f\");", 9883 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9884 getLLVMStyleWithColumns(25))); 9885 EXPECT_EQ("someFunction1234567890(\n" 9886 " \"aaabbbcccdddeeeff\"\n" 9887 " \"f\");", 9888 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9889 getLLVMStyleWithColumns(24))); 9890 EXPECT_EQ("someFunction(\n" 9891 " \"aaabbbcc ddde \"\n" 9892 " \"efff\");", 9893 format("someFunction(\"aaabbbcc ddde efff\");", 9894 getLLVMStyleWithColumns(25))); 9895 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9896 " \"ddeeefff\");", 9897 format("someFunction(\"aaabbbccc ddeeefff\");", 9898 getLLVMStyleWithColumns(25))); 9899 EXPECT_EQ("someFunction1234567890(\n" 9900 " \"aaabb \"\n" 9901 " \"cccdddeeefff\");", 9902 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9903 getLLVMStyleWithColumns(25))); 9904 EXPECT_EQ("#define A \\\n" 9905 " string s = \\\n" 9906 " \"123456789\" \\\n" 9907 " \"0\"; \\\n" 9908 " int i;", 9909 format("#define A string s = \"1234567890\"; int i;", 9910 getLLVMStyleWithColumns(20))); 9911 EXPECT_EQ("someFunction(\n" 9912 " \"aaabbbcc \"\n" 9913 " \"dddeeefff\");", 9914 format("someFunction(\"aaabbbcc dddeeefff\");", 9915 getLLVMStyleWithColumns(25))); 9916 } 9917 9918 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9919 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9920 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9921 EXPECT_EQ("\"test\"\n" 9922 "\"\\n\"", 9923 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9924 EXPECT_EQ("\"tes\\\\\"\n" 9925 "\"n\"", 9926 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9927 EXPECT_EQ("\"\\\\\\\\\"\n" 9928 "\"\\n\"", 9929 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9930 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9931 EXPECT_EQ("\"\\uff01\"\n" 9932 "\"test\"", 9933 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9934 EXPECT_EQ("\"\\Uff01ff02\"", 9935 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9936 EXPECT_EQ("\"\\x000000000001\"\n" 9937 "\"next\"", 9938 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9939 EXPECT_EQ("\"\\x000000000001next\"", 9940 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9941 EXPECT_EQ("\"\\x000000000001\"", 9942 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9943 EXPECT_EQ("\"test\"\n" 9944 "\"\\000000\"\n" 9945 "\"000001\"", 9946 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9947 EXPECT_EQ("\"test\\000\"\n" 9948 "\"00000000\"\n" 9949 "\"1\"", 9950 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9951 } 9952 9953 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9954 verifyFormat("void f() {\n" 9955 " return g() {}\n" 9956 " void h() {}"); 9957 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9958 "g();\n" 9959 "}"); 9960 } 9961 9962 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9963 verifyFormat( 9964 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9965 } 9966 9967 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9968 verifyFormat("class X {\n" 9969 " void f() {\n" 9970 " }\n" 9971 "};", 9972 getLLVMStyleWithColumns(12)); 9973 } 9974 9975 TEST_F(FormatTest, ConfigurableIndentWidth) { 9976 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9977 EightIndent.IndentWidth = 8; 9978 EightIndent.ContinuationIndentWidth = 8; 9979 verifyFormat("void f() {\n" 9980 " someFunction();\n" 9981 " if (true) {\n" 9982 " f();\n" 9983 " }\n" 9984 "}", 9985 EightIndent); 9986 verifyFormat("class X {\n" 9987 " void f() {\n" 9988 " }\n" 9989 "};", 9990 EightIndent); 9991 verifyFormat("int x[] = {\n" 9992 " call(),\n" 9993 " call()};", 9994 EightIndent); 9995 } 9996 9997 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9998 verifyFormat("double\n" 9999 "f();", 10000 getLLVMStyleWithColumns(8)); 10001 } 10002 10003 TEST_F(FormatTest, ConfigurableUseOfTab) { 10004 FormatStyle Tab = getLLVMStyleWithColumns(42); 10005 Tab.IndentWidth = 8; 10006 Tab.UseTab = FormatStyle::UT_Always; 10007 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10008 10009 EXPECT_EQ("if (aaaaaaaa && // q\n" 10010 " bb)\t\t// w\n" 10011 "\t;", 10012 format("if (aaaaaaaa &&// q\n" 10013 "bb)// w\n" 10014 ";", 10015 Tab)); 10016 EXPECT_EQ("if (aaa && bbb) // w\n" 10017 "\t;", 10018 format("if(aaa&&bbb)// w\n" 10019 ";", 10020 Tab)); 10021 10022 verifyFormat("class X {\n" 10023 "\tvoid f() {\n" 10024 "\t\tsomeFunction(parameter1,\n" 10025 "\t\t\t parameter2);\n" 10026 "\t}\n" 10027 "};", 10028 Tab); 10029 verifyFormat("#define A \\\n" 10030 "\tvoid f() { \\\n" 10031 "\t\tsomeFunction( \\\n" 10032 "\t\t parameter1, \\\n" 10033 "\t\t parameter2); \\\n" 10034 "\t}", 10035 Tab); 10036 verifyFormat("int a;\t // x\n" 10037 "int bbbbbbbb; // x\n", 10038 Tab); 10039 10040 Tab.TabWidth = 4; 10041 Tab.IndentWidth = 8; 10042 verifyFormat("class TabWidth4Indent8 {\n" 10043 "\t\tvoid f() {\n" 10044 "\t\t\t\tsomeFunction(parameter1,\n" 10045 "\t\t\t\t\t\t\t parameter2);\n" 10046 "\t\t}\n" 10047 "};", 10048 Tab); 10049 10050 Tab.TabWidth = 4; 10051 Tab.IndentWidth = 4; 10052 verifyFormat("class TabWidth4Indent4 {\n" 10053 "\tvoid f() {\n" 10054 "\t\tsomeFunction(parameter1,\n" 10055 "\t\t\t\t\t parameter2);\n" 10056 "\t}\n" 10057 "};", 10058 Tab); 10059 10060 Tab.TabWidth = 8; 10061 Tab.IndentWidth = 4; 10062 verifyFormat("class TabWidth8Indent4 {\n" 10063 " void f() {\n" 10064 "\tsomeFunction(parameter1,\n" 10065 "\t\t parameter2);\n" 10066 " }\n" 10067 "};", 10068 Tab); 10069 10070 Tab.TabWidth = 8; 10071 Tab.IndentWidth = 8; 10072 EXPECT_EQ("/*\n" 10073 "\t a\t\tcomment\n" 10074 "\t in multiple lines\n" 10075 " */", 10076 format(" /*\t \t \n" 10077 " \t \t a\t\tcomment\t \t\n" 10078 " \t \t in multiple lines\t\n" 10079 " \t */", 10080 Tab)); 10081 10082 Tab.UseTab = FormatStyle::UT_ForIndentation; 10083 verifyFormat("{\n" 10084 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10085 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10086 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10087 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10088 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10089 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10090 "};", 10091 Tab); 10092 verifyFormat("enum AA {\n" 10093 "\ta1, // Force multiple lines\n" 10094 "\ta2,\n" 10095 "\ta3\n" 10096 "};", 10097 Tab); 10098 EXPECT_EQ("if (aaaaaaaa && // q\n" 10099 " bb) // w\n" 10100 "\t;", 10101 format("if (aaaaaaaa &&// q\n" 10102 "bb)// w\n" 10103 ";", 10104 Tab)); 10105 verifyFormat("class X {\n" 10106 "\tvoid f() {\n" 10107 "\t\tsomeFunction(parameter1,\n" 10108 "\t\t parameter2);\n" 10109 "\t}\n" 10110 "};", 10111 Tab); 10112 verifyFormat("{\n" 10113 "\tQ(\n" 10114 "\t {\n" 10115 "\t\t int a;\n" 10116 "\t\t someFunction(aaaaaaaa,\n" 10117 "\t\t bbbbbbb);\n" 10118 "\t },\n" 10119 "\t p);\n" 10120 "}", 10121 Tab); 10122 EXPECT_EQ("{\n" 10123 "\t/* aaaa\n" 10124 "\t bbbb */\n" 10125 "}", 10126 format("{\n" 10127 "/* aaaa\n" 10128 " bbbb */\n" 10129 "}", 10130 Tab)); 10131 EXPECT_EQ("{\n" 10132 "\t/*\n" 10133 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10134 "\t bbbbbbbbbbbbb\n" 10135 "\t*/\n" 10136 "}", 10137 format("{\n" 10138 "/*\n" 10139 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10140 "*/\n" 10141 "}", 10142 Tab)); 10143 EXPECT_EQ("{\n" 10144 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10145 "\t// bbbbbbbbbbbbb\n" 10146 "}", 10147 format("{\n" 10148 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10149 "}", 10150 Tab)); 10151 EXPECT_EQ("{\n" 10152 "\t/*\n" 10153 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10154 "\t bbbbbbbbbbbbb\n" 10155 "\t*/\n" 10156 "}", 10157 format("{\n" 10158 "\t/*\n" 10159 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10160 "\t*/\n" 10161 "}", 10162 Tab)); 10163 EXPECT_EQ("{\n" 10164 "\t/*\n" 10165 "\n" 10166 "\t*/\n" 10167 "}", 10168 format("{\n" 10169 "\t/*\n" 10170 "\n" 10171 "\t*/\n" 10172 "}", 10173 Tab)); 10174 EXPECT_EQ("{\n" 10175 "\t/*\n" 10176 " asdf\n" 10177 "\t*/\n" 10178 "}", 10179 format("{\n" 10180 "\t/*\n" 10181 " asdf\n" 10182 "\t*/\n" 10183 "}", 10184 Tab)); 10185 10186 Tab.UseTab = FormatStyle::UT_Never; 10187 EXPECT_EQ("/*\n" 10188 " a\t\tcomment\n" 10189 " in multiple lines\n" 10190 " */", 10191 format(" /*\t \t \n" 10192 " \t \t a\t\tcomment\t \t\n" 10193 " \t \t in multiple lines\t\n" 10194 " \t */", 10195 Tab)); 10196 EXPECT_EQ("/* some\n" 10197 " comment */", 10198 format(" \t \t /* some\n" 10199 " \t \t comment */", 10200 Tab)); 10201 EXPECT_EQ("int a; /* some\n" 10202 " comment */", 10203 format(" \t \t int a; /* some\n" 10204 " \t \t comment */", 10205 Tab)); 10206 10207 EXPECT_EQ("int a; /* some\n" 10208 "comment */", 10209 format(" \t \t int\ta; /* some\n" 10210 " \t \t comment */", 10211 Tab)); 10212 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10213 " comment */", 10214 format(" \t \t f(\"\t\t\"); /* some\n" 10215 " \t \t comment */", 10216 Tab)); 10217 EXPECT_EQ("{\n" 10218 " /*\n" 10219 " * Comment\n" 10220 " */\n" 10221 " int i;\n" 10222 "}", 10223 format("{\n" 10224 "\t/*\n" 10225 "\t * Comment\n" 10226 "\t */\n" 10227 "\t int i;\n" 10228 "}", 10229 Tab)); 10230 10231 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10232 Tab.TabWidth = 8; 10233 Tab.IndentWidth = 8; 10234 EXPECT_EQ("if (aaaaaaaa && // q\n" 10235 " bb) // w\n" 10236 "\t;", 10237 format("if (aaaaaaaa &&// q\n" 10238 "bb)// w\n" 10239 ";", 10240 Tab)); 10241 EXPECT_EQ("if (aaa && bbb) // w\n" 10242 "\t;", 10243 format("if(aaa&&bbb)// w\n" 10244 ";", 10245 Tab)); 10246 verifyFormat("class X {\n" 10247 "\tvoid f() {\n" 10248 "\t\tsomeFunction(parameter1,\n" 10249 "\t\t\t parameter2);\n" 10250 "\t}\n" 10251 "};", 10252 Tab); 10253 verifyFormat("#define A \\\n" 10254 "\tvoid f() { \\\n" 10255 "\t\tsomeFunction( \\\n" 10256 "\t\t parameter1, \\\n" 10257 "\t\t parameter2); \\\n" 10258 "\t}", 10259 Tab); 10260 Tab.TabWidth = 4; 10261 Tab.IndentWidth = 8; 10262 verifyFormat("class TabWidth4Indent8 {\n" 10263 "\t\tvoid f() {\n" 10264 "\t\t\t\tsomeFunction(parameter1,\n" 10265 "\t\t\t\t\t\t\t parameter2);\n" 10266 "\t\t}\n" 10267 "};", 10268 Tab); 10269 Tab.TabWidth = 4; 10270 Tab.IndentWidth = 4; 10271 verifyFormat("class TabWidth4Indent4 {\n" 10272 "\tvoid f() {\n" 10273 "\t\tsomeFunction(parameter1,\n" 10274 "\t\t\t\t\t parameter2);\n" 10275 "\t}\n" 10276 "};", 10277 Tab); 10278 Tab.TabWidth = 8; 10279 Tab.IndentWidth = 4; 10280 verifyFormat("class TabWidth8Indent4 {\n" 10281 " void f() {\n" 10282 "\tsomeFunction(parameter1,\n" 10283 "\t\t parameter2);\n" 10284 " }\n" 10285 "};", 10286 Tab); 10287 Tab.TabWidth = 8; 10288 Tab.IndentWidth = 8; 10289 EXPECT_EQ("/*\n" 10290 "\t a\t\tcomment\n" 10291 "\t in multiple lines\n" 10292 " */", 10293 format(" /*\t \t \n" 10294 " \t \t a\t\tcomment\t \t\n" 10295 " \t \t in multiple lines\t\n" 10296 " \t */", 10297 Tab)); 10298 verifyFormat("{\n" 10299 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10300 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10301 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10302 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10303 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10304 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10305 "};", 10306 Tab); 10307 verifyFormat("enum AA {\n" 10308 "\ta1, // Force multiple lines\n" 10309 "\ta2,\n" 10310 "\ta3\n" 10311 "};", 10312 Tab); 10313 EXPECT_EQ("if (aaaaaaaa && // q\n" 10314 " bb) // w\n" 10315 "\t;", 10316 format("if (aaaaaaaa &&// q\n" 10317 "bb)// w\n" 10318 ";", 10319 Tab)); 10320 verifyFormat("class X {\n" 10321 "\tvoid f() {\n" 10322 "\t\tsomeFunction(parameter1,\n" 10323 "\t\t\t parameter2);\n" 10324 "\t}\n" 10325 "};", 10326 Tab); 10327 verifyFormat("{\n" 10328 "\tQ(\n" 10329 "\t {\n" 10330 "\t\t int a;\n" 10331 "\t\t someFunction(aaaaaaaa,\n" 10332 "\t\t\t\t bbbbbbb);\n" 10333 "\t },\n" 10334 "\t p);\n" 10335 "}", 10336 Tab); 10337 EXPECT_EQ("{\n" 10338 "\t/* aaaa\n" 10339 "\t bbbb */\n" 10340 "}", 10341 format("{\n" 10342 "/* aaaa\n" 10343 " bbbb */\n" 10344 "}", 10345 Tab)); 10346 EXPECT_EQ("{\n" 10347 "\t/*\n" 10348 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10349 "\t bbbbbbbbbbbbb\n" 10350 "\t*/\n" 10351 "}", 10352 format("{\n" 10353 "/*\n" 10354 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10355 "*/\n" 10356 "}", 10357 Tab)); 10358 EXPECT_EQ("{\n" 10359 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10360 "\t// bbbbbbbbbbbbb\n" 10361 "}", 10362 format("{\n" 10363 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10364 "}", 10365 Tab)); 10366 EXPECT_EQ("{\n" 10367 "\t/*\n" 10368 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10369 "\t bbbbbbbbbbbbb\n" 10370 "\t*/\n" 10371 "}", 10372 format("{\n" 10373 "\t/*\n" 10374 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10375 "\t*/\n" 10376 "}", 10377 Tab)); 10378 EXPECT_EQ("{\n" 10379 "\t/*\n" 10380 "\n" 10381 "\t*/\n" 10382 "}", 10383 format("{\n" 10384 "\t/*\n" 10385 "\n" 10386 "\t*/\n" 10387 "}", 10388 Tab)); 10389 EXPECT_EQ("{\n" 10390 "\t/*\n" 10391 " asdf\n" 10392 "\t*/\n" 10393 "}", 10394 format("{\n" 10395 "\t/*\n" 10396 " asdf\n" 10397 "\t*/\n" 10398 "}", 10399 Tab)); 10400 EXPECT_EQ("/* some\n" 10401 " comment */", 10402 format(" \t \t /* some\n" 10403 " \t \t comment */", 10404 Tab)); 10405 EXPECT_EQ("int a; /* some\n" 10406 " comment */", 10407 format(" \t \t int a; /* some\n" 10408 " \t \t comment */", 10409 Tab)); 10410 EXPECT_EQ("int a; /* some\n" 10411 "comment */", 10412 format(" \t \t int\ta; /* some\n" 10413 " \t \t comment */", 10414 Tab)); 10415 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10416 " comment */", 10417 format(" \t \t f(\"\t\t\"); /* some\n" 10418 " \t \t comment */", 10419 Tab)); 10420 EXPECT_EQ("{\n" 10421 "\t/*\n" 10422 "\t * Comment\n" 10423 "\t */\n" 10424 "\tint i;\n" 10425 "}", 10426 format("{\n" 10427 "\t/*\n" 10428 "\t * Comment\n" 10429 "\t */\n" 10430 "\t int i;\n" 10431 "}", 10432 Tab)); 10433 Tab.TabWidth = 2; 10434 Tab.IndentWidth = 2; 10435 EXPECT_EQ("{\n" 10436 "\t/* aaaa\n" 10437 "\t\t bbbb */\n" 10438 "}", 10439 format("{\n" 10440 "/* aaaa\n" 10441 "\t bbbb */\n" 10442 "}", 10443 Tab)); 10444 EXPECT_EQ("{\n" 10445 "\t/*\n" 10446 "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10447 "\t\tbbbbbbbbbbbbb\n" 10448 "\t*/\n" 10449 "}", 10450 format("{\n" 10451 "/*\n" 10452 "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10453 "*/\n" 10454 "}", 10455 Tab)); 10456 Tab.AlignConsecutiveAssignments = true; 10457 Tab.AlignConsecutiveDeclarations = true; 10458 Tab.TabWidth = 4; 10459 Tab.IndentWidth = 4; 10460 verifyFormat("class Assign {\n" 10461 "\tvoid f() {\n" 10462 "\t\tint x = 123;\n" 10463 "\t\tint random = 4;\n" 10464 "\t\tstd::string alphabet =\n" 10465 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10466 "\t}\n" 10467 "};", 10468 Tab); 10469 10470 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 10471 Tab.TabWidth = 8; 10472 Tab.IndentWidth = 8; 10473 EXPECT_EQ("if (aaaaaaaa && // q\n" 10474 " bb) // w\n" 10475 "\t;", 10476 format("if (aaaaaaaa &&// q\n" 10477 "bb)// w\n" 10478 ";", 10479 Tab)); 10480 EXPECT_EQ("if (aaa && bbb) // w\n" 10481 "\t;", 10482 format("if(aaa&&bbb)// w\n" 10483 ";", 10484 Tab)); 10485 verifyFormat("class X {\n" 10486 "\tvoid f() {\n" 10487 "\t\tsomeFunction(parameter1,\n" 10488 "\t\t parameter2);\n" 10489 "\t}\n" 10490 "};", 10491 Tab); 10492 verifyFormat("#define A \\\n" 10493 "\tvoid f() { \\\n" 10494 "\t\tsomeFunction( \\\n" 10495 "\t\t parameter1, \\\n" 10496 "\t\t parameter2); \\\n" 10497 "\t}", 10498 Tab); 10499 Tab.TabWidth = 4; 10500 Tab.IndentWidth = 8; 10501 verifyFormat("class TabWidth4Indent8 {\n" 10502 "\t\tvoid f() {\n" 10503 "\t\t\t\tsomeFunction(parameter1,\n" 10504 "\t\t\t\t parameter2);\n" 10505 "\t\t}\n" 10506 "};", 10507 Tab); 10508 Tab.TabWidth = 4; 10509 Tab.IndentWidth = 4; 10510 verifyFormat("class TabWidth4Indent4 {\n" 10511 "\tvoid f() {\n" 10512 "\t\tsomeFunction(parameter1,\n" 10513 "\t\t parameter2);\n" 10514 "\t}\n" 10515 "};", 10516 Tab); 10517 Tab.TabWidth = 8; 10518 Tab.IndentWidth = 4; 10519 verifyFormat("class TabWidth8Indent4 {\n" 10520 " void f() {\n" 10521 "\tsomeFunction(parameter1,\n" 10522 "\t parameter2);\n" 10523 " }\n" 10524 "};", 10525 Tab); 10526 Tab.TabWidth = 8; 10527 Tab.IndentWidth = 8; 10528 EXPECT_EQ("/*\n" 10529 " a\t\tcomment\n" 10530 " in multiple lines\n" 10531 " */", 10532 format(" /*\t \t \n" 10533 " \t \t a\t\tcomment\t \t\n" 10534 " \t \t in multiple lines\t\n" 10535 " \t */", 10536 Tab)); 10537 verifyFormat("{\n" 10538 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10539 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10540 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10541 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10542 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10543 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10544 "};", 10545 Tab); 10546 verifyFormat("enum AA {\n" 10547 "\ta1, // Force multiple lines\n" 10548 "\ta2,\n" 10549 "\ta3\n" 10550 "};", 10551 Tab); 10552 EXPECT_EQ("if (aaaaaaaa && // q\n" 10553 " bb) // w\n" 10554 "\t;", 10555 format("if (aaaaaaaa &&// q\n" 10556 "bb)// w\n" 10557 ";", 10558 Tab)); 10559 verifyFormat("class X {\n" 10560 "\tvoid f() {\n" 10561 "\t\tsomeFunction(parameter1,\n" 10562 "\t\t parameter2);\n" 10563 "\t}\n" 10564 "};", 10565 Tab); 10566 verifyFormat("{\n" 10567 "\tQ(\n" 10568 "\t {\n" 10569 "\t\t int a;\n" 10570 "\t\t someFunction(aaaaaaaa,\n" 10571 "\t\t bbbbbbb);\n" 10572 "\t },\n" 10573 "\t p);\n" 10574 "}", 10575 Tab); 10576 EXPECT_EQ("{\n" 10577 "\t/* aaaa\n" 10578 "\t bbbb */\n" 10579 "}", 10580 format("{\n" 10581 "/* aaaa\n" 10582 " bbbb */\n" 10583 "}", 10584 Tab)); 10585 EXPECT_EQ("{\n" 10586 "\t/*\n" 10587 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10588 "\t bbbbbbbbbbbbb\n" 10589 "\t*/\n" 10590 "}", 10591 format("{\n" 10592 "/*\n" 10593 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10594 "*/\n" 10595 "}", 10596 Tab)); 10597 EXPECT_EQ("{\n" 10598 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10599 "\t// bbbbbbbbbbbbb\n" 10600 "}", 10601 format("{\n" 10602 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10603 "}", 10604 Tab)); 10605 EXPECT_EQ("{\n" 10606 "\t/*\n" 10607 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10608 "\t bbbbbbbbbbbbb\n" 10609 "\t*/\n" 10610 "}", 10611 format("{\n" 10612 "\t/*\n" 10613 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10614 "\t*/\n" 10615 "}", 10616 Tab)); 10617 EXPECT_EQ("{\n" 10618 "\t/*\n" 10619 "\n" 10620 "\t*/\n" 10621 "}", 10622 format("{\n" 10623 "\t/*\n" 10624 "\n" 10625 "\t*/\n" 10626 "}", 10627 Tab)); 10628 EXPECT_EQ("{\n" 10629 "\t/*\n" 10630 " asdf\n" 10631 "\t*/\n" 10632 "}", 10633 format("{\n" 10634 "\t/*\n" 10635 " asdf\n" 10636 "\t*/\n" 10637 "}", 10638 Tab)); 10639 EXPECT_EQ("/* some\n" 10640 " comment */", 10641 format(" \t \t /* some\n" 10642 " \t \t comment */", 10643 Tab)); 10644 EXPECT_EQ("int a; /* some\n" 10645 " comment */", 10646 format(" \t \t int a; /* some\n" 10647 " \t \t comment */", 10648 Tab)); 10649 EXPECT_EQ("int a; /* some\n" 10650 "comment */", 10651 format(" \t \t int\ta; /* some\n" 10652 " \t \t comment */", 10653 Tab)); 10654 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10655 " comment */", 10656 format(" \t \t f(\"\t\t\"); /* some\n" 10657 " \t \t comment */", 10658 Tab)); 10659 EXPECT_EQ("{\n" 10660 "\t/*\n" 10661 "\t * Comment\n" 10662 "\t */\n" 10663 "\tint i;\n" 10664 "}", 10665 format("{\n" 10666 "\t/*\n" 10667 "\t * Comment\n" 10668 "\t */\n" 10669 "\t int i;\n" 10670 "}", 10671 Tab)); 10672 Tab.TabWidth = 2; 10673 Tab.IndentWidth = 2; 10674 EXPECT_EQ("{\n" 10675 "\t/* aaaa\n" 10676 "\t bbbb */\n" 10677 "}", 10678 format("{\n" 10679 "/* aaaa\n" 10680 " bbbb */\n" 10681 "}", 10682 Tab)); 10683 EXPECT_EQ("{\n" 10684 "\t/*\n" 10685 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10686 "\t bbbbbbbbbbbbb\n" 10687 "\t*/\n" 10688 "}", 10689 format("{\n" 10690 "/*\n" 10691 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10692 "*/\n" 10693 "}", 10694 Tab)); 10695 Tab.AlignConsecutiveAssignments = true; 10696 Tab.AlignConsecutiveDeclarations = true; 10697 Tab.TabWidth = 4; 10698 Tab.IndentWidth = 4; 10699 verifyFormat("class Assign {\n" 10700 "\tvoid f() {\n" 10701 "\t\tint x = 123;\n" 10702 "\t\tint random = 4;\n" 10703 "\t\tstd::string alphabet =\n" 10704 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10705 "\t}\n" 10706 "};", 10707 Tab); 10708 } 10709 10710 TEST_F(FormatTest, ZeroTabWidth) { 10711 FormatStyle Tab = getLLVMStyleWithColumns(42); 10712 Tab.IndentWidth = 8; 10713 Tab.UseTab = FormatStyle::UT_Never; 10714 Tab.TabWidth = 0; 10715 EXPECT_EQ("void a(){\n" 10716 " // line starts with '\t'\n" 10717 "};", 10718 format("void a(){\n" 10719 "\t// line starts with '\t'\n" 10720 "};", 10721 Tab)); 10722 10723 EXPECT_EQ("void a(){\n" 10724 " // line starts with '\t'\n" 10725 "};", 10726 format("void a(){\n" 10727 "\t\t// line starts with '\t'\n" 10728 "};", 10729 Tab)); 10730 10731 Tab.UseTab = FormatStyle::UT_ForIndentation; 10732 EXPECT_EQ("void a(){\n" 10733 " // line starts with '\t'\n" 10734 "};", 10735 format("void a(){\n" 10736 "\t// line starts with '\t'\n" 10737 "};", 10738 Tab)); 10739 10740 EXPECT_EQ("void a(){\n" 10741 " // line starts with '\t'\n" 10742 "};", 10743 format("void a(){\n" 10744 "\t\t// line starts with '\t'\n" 10745 "};", 10746 Tab)); 10747 10748 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10749 EXPECT_EQ("void a(){\n" 10750 " // line starts with '\t'\n" 10751 "};", 10752 format("void a(){\n" 10753 "\t// line starts with '\t'\n" 10754 "};", 10755 Tab)); 10756 10757 EXPECT_EQ("void a(){\n" 10758 " // line starts with '\t'\n" 10759 "};", 10760 format("void a(){\n" 10761 "\t\t// line starts with '\t'\n" 10762 "};", 10763 Tab)); 10764 10765 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 10766 EXPECT_EQ("void a(){\n" 10767 " // line starts with '\t'\n" 10768 "};", 10769 format("void a(){\n" 10770 "\t// line starts with '\t'\n" 10771 "};", 10772 Tab)); 10773 10774 EXPECT_EQ("void a(){\n" 10775 " // line starts with '\t'\n" 10776 "};", 10777 format("void a(){\n" 10778 "\t\t// line starts with '\t'\n" 10779 "};", 10780 Tab)); 10781 10782 Tab.UseTab = FormatStyle::UT_Always; 10783 EXPECT_EQ("void a(){\n" 10784 "// line starts with '\t'\n" 10785 "};", 10786 format("void a(){\n" 10787 "\t// line starts with '\t'\n" 10788 "};", 10789 Tab)); 10790 10791 EXPECT_EQ("void a(){\n" 10792 "// line starts with '\t'\n" 10793 "};", 10794 format("void a(){\n" 10795 "\t\t// line starts with '\t'\n" 10796 "};", 10797 Tab)); 10798 } 10799 10800 TEST_F(FormatTest, CalculatesOriginalColumn) { 10801 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10802 "q\"; /* some\n" 10803 " comment */", 10804 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10805 "q\"; /* some\n" 10806 " comment */", 10807 getLLVMStyle())); 10808 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10809 "/* some\n" 10810 " comment */", 10811 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10812 " /* some\n" 10813 " comment */", 10814 getLLVMStyle())); 10815 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10816 "qqq\n" 10817 "/* some\n" 10818 " comment */", 10819 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10820 "qqq\n" 10821 " /* some\n" 10822 " comment */", 10823 getLLVMStyle())); 10824 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10825 "wwww; /* some\n" 10826 " comment */", 10827 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10828 "wwww; /* some\n" 10829 " comment */", 10830 getLLVMStyle())); 10831 } 10832 10833 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 10834 FormatStyle NoSpace = getLLVMStyle(); 10835 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 10836 10837 verifyFormat("while(true)\n" 10838 " continue;", 10839 NoSpace); 10840 verifyFormat("for(;;)\n" 10841 " continue;", 10842 NoSpace); 10843 verifyFormat("if(true)\n" 10844 " f();\n" 10845 "else if(true)\n" 10846 " f();", 10847 NoSpace); 10848 verifyFormat("do {\n" 10849 " do_something();\n" 10850 "} while(something());", 10851 NoSpace); 10852 verifyFormat("switch(x) {\n" 10853 "default:\n" 10854 " break;\n" 10855 "}", 10856 NoSpace); 10857 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 10858 verifyFormat("size_t x = sizeof(x);", NoSpace); 10859 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 10860 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 10861 verifyFormat("alignas(128) char a[128];", NoSpace); 10862 verifyFormat("size_t x = alignof(MyType);", NoSpace); 10863 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 10864 verifyFormat("int f() throw(Deprecated);", NoSpace); 10865 verifyFormat("typedef void (*cb)(int);", NoSpace); 10866 verifyFormat("T A::operator()();", NoSpace); 10867 verifyFormat("X A::operator++(T);", NoSpace); 10868 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 10869 10870 FormatStyle Space = getLLVMStyle(); 10871 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 10872 10873 verifyFormat("int f ();", Space); 10874 verifyFormat("void f (int a, T b) {\n" 10875 " while (true)\n" 10876 " continue;\n" 10877 "}", 10878 Space); 10879 verifyFormat("if (true)\n" 10880 " f ();\n" 10881 "else if (true)\n" 10882 " f ();", 10883 Space); 10884 verifyFormat("do {\n" 10885 " do_something ();\n" 10886 "} while (something ());", 10887 Space); 10888 verifyFormat("switch (x) {\n" 10889 "default:\n" 10890 " break;\n" 10891 "}", 10892 Space); 10893 verifyFormat("A::A () : a (1) {}", Space); 10894 verifyFormat("void f () __attribute__ ((asdf));", Space); 10895 verifyFormat("*(&a + 1);\n" 10896 "&((&a)[1]);\n" 10897 "a[(b + c) * d];\n" 10898 "(((a + 1) * 2) + 3) * 4;", 10899 Space); 10900 verifyFormat("#define A(x) x", Space); 10901 verifyFormat("#define A (x) x", Space); 10902 verifyFormat("#if defined(x)\n" 10903 "#endif", 10904 Space); 10905 verifyFormat("auto i = std::make_unique<int> (5);", Space); 10906 verifyFormat("size_t x = sizeof (x);", Space); 10907 verifyFormat("auto f (int x) -> decltype (x);", Space); 10908 verifyFormat("int f (T x) noexcept (x.create ());", Space); 10909 verifyFormat("alignas (128) char a[128];", Space); 10910 verifyFormat("size_t x = alignof (MyType);", Space); 10911 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 10912 verifyFormat("int f () throw (Deprecated);", Space); 10913 verifyFormat("typedef void (*cb) (int);", Space); 10914 verifyFormat("T A::operator() ();", Space); 10915 verifyFormat("X A::operator++ (T);", Space); 10916 verifyFormat("auto lambda = [] () { return 0; };", Space); 10917 verifyFormat("int x = int (y);", Space); 10918 10919 FormatStyle SomeSpace = getLLVMStyle(); 10920 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 10921 10922 verifyFormat("[]() -> float {}", SomeSpace); 10923 verifyFormat("[] (auto foo) {}", SomeSpace); 10924 verifyFormat("[foo]() -> int {}", SomeSpace); 10925 verifyFormat("int f();", SomeSpace); 10926 verifyFormat("void f (int a, T b) {\n" 10927 " while (true)\n" 10928 " continue;\n" 10929 "}", 10930 SomeSpace); 10931 verifyFormat("if (true)\n" 10932 " f();\n" 10933 "else if (true)\n" 10934 " f();", 10935 SomeSpace); 10936 verifyFormat("do {\n" 10937 " do_something();\n" 10938 "} while (something());", 10939 SomeSpace); 10940 verifyFormat("switch (x) {\n" 10941 "default:\n" 10942 " break;\n" 10943 "}", 10944 SomeSpace); 10945 verifyFormat("A::A() : a (1) {}", SomeSpace); 10946 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 10947 verifyFormat("*(&a + 1);\n" 10948 "&((&a)[1]);\n" 10949 "a[(b + c) * d];\n" 10950 "(((a + 1) * 2) + 3) * 4;", 10951 SomeSpace); 10952 verifyFormat("#define A(x) x", SomeSpace); 10953 verifyFormat("#define A (x) x", SomeSpace); 10954 verifyFormat("#if defined(x)\n" 10955 "#endif", 10956 SomeSpace); 10957 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10958 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10959 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10960 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10961 verifyFormat("alignas (128) char a[128];", SomeSpace); 10962 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10963 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10964 SomeSpace); 10965 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10966 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10967 verifyFormat("T A::operator()();", SomeSpace); 10968 verifyFormat("X A::operator++ (T);", SomeSpace); 10969 verifyFormat("int x = int (y);", SomeSpace); 10970 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10971 } 10972 10973 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10974 FormatStyle Spaces = getLLVMStyle(); 10975 Spaces.SpaceAfterLogicalNot = true; 10976 10977 verifyFormat("bool x = ! y", Spaces); 10978 verifyFormat("if (! isFailure())", Spaces); 10979 verifyFormat("if (! (a && b))", Spaces); 10980 verifyFormat("\"Error!\"", Spaces); 10981 verifyFormat("! ! x", Spaces); 10982 } 10983 10984 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10985 FormatStyle Spaces = getLLVMStyle(); 10986 10987 Spaces.SpacesInParentheses = true; 10988 verifyFormat("do_something( ::globalVar );", Spaces); 10989 verifyFormat("call( x, y, z );", Spaces); 10990 verifyFormat("call();", Spaces); 10991 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10992 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10993 Spaces); 10994 verifyFormat("while ( (bool)1 )\n" 10995 " continue;", 10996 Spaces); 10997 verifyFormat("for ( ;; )\n" 10998 " continue;", 10999 Spaces); 11000 verifyFormat("if ( true )\n" 11001 " f();\n" 11002 "else if ( true )\n" 11003 " f();", 11004 Spaces); 11005 verifyFormat("do {\n" 11006 " do_something( (int)i );\n" 11007 "} while ( something() );", 11008 Spaces); 11009 verifyFormat("switch ( x ) {\n" 11010 "default:\n" 11011 " break;\n" 11012 "}", 11013 Spaces); 11014 11015 Spaces.SpacesInParentheses = false; 11016 Spaces.SpacesInCStyleCastParentheses = true; 11017 verifyFormat("Type *A = ( Type * )P;", Spaces); 11018 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 11019 verifyFormat("x = ( int32 )y;", Spaces); 11020 verifyFormat("int a = ( int )(2.0f);", Spaces); 11021 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 11022 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 11023 verifyFormat("#define x (( int )-1)", Spaces); 11024 11025 // Run the first set of tests again with: 11026 Spaces.SpacesInParentheses = false; 11027 Spaces.SpaceInEmptyParentheses = true; 11028 Spaces.SpacesInCStyleCastParentheses = true; 11029 verifyFormat("call(x, y, z);", Spaces); 11030 verifyFormat("call( );", Spaces); 11031 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11032 verifyFormat("while (( bool )1)\n" 11033 " continue;", 11034 Spaces); 11035 verifyFormat("for (;;)\n" 11036 " continue;", 11037 Spaces); 11038 verifyFormat("if (true)\n" 11039 " f( );\n" 11040 "else if (true)\n" 11041 " f( );", 11042 Spaces); 11043 verifyFormat("do {\n" 11044 " do_something(( int )i);\n" 11045 "} while (something( ));", 11046 Spaces); 11047 verifyFormat("switch (x) {\n" 11048 "default:\n" 11049 " break;\n" 11050 "}", 11051 Spaces); 11052 11053 // Run the first set of tests again with: 11054 Spaces.SpaceAfterCStyleCast = true; 11055 verifyFormat("call(x, y, z);", Spaces); 11056 verifyFormat("call( );", Spaces); 11057 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11058 verifyFormat("while (( bool ) 1)\n" 11059 " continue;", 11060 Spaces); 11061 verifyFormat("for (;;)\n" 11062 " continue;", 11063 Spaces); 11064 verifyFormat("if (true)\n" 11065 " f( );\n" 11066 "else if (true)\n" 11067 " f( );", 11068 Spaces); 11069 verifyFormat("do {\n" 11070 " do_something(( int ) i);\n" 11071 "} while (something( ));", 11072 Spaces); 11073 verifyFormat("switch (x) {\n" 11074 "default:\n" 11075 " break;\n" 11076 "}", 11077 Spaces); 11078 11079 // Run subset of tests again with: 11080 Spaces.SpacesInCStyleCastParentheses = false; 11081 Spaces.SpaceAfterCStyleCast = true; 11082 verifyFormat("while ((bool) 1)\n" 11083 " continue;", 11084 Spaces); 11085 verifyFormat("do {\n" 11086 " do_something((int) i);\n" 11087 "} while (something( ));", 11088 Spaces); 11089 } 11090 11091 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 11092 verifyFormat("int a[5];"); 11093 verifyFormat("a[3] += 42;"); 11094 11095 FormatStyle Spaces = getLLVMStyle(); 11096 Spaces.SpacesInSquareBrackets = true; 11097 // Not lambdas. 11098 verifyFormat("int a[ 5 ];", Spaces); 11099 verifyFormat("a[ 3 ] += 42;", Spaces); 11100 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 11101 verifyFormat("double &operator[](int i) { return 0; }\n" 11102 "int i;", 11103 Spaces); 11104 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 11105 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 11106 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 11107 // Lambdas. 11108 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 11109 verifyFormat("return [ i, args... ] {};", Spaces); 11110 verifyFormat("int foo = [ &bar ]() {};", Spaces); 11111 verifyFormat("int foo = [ = ]() {};", Spaces); 11112 verifyFormat("int foo = [ & ]() {};", Spaces); 11113 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 11114 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 11115 } 11116 11117 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 11118 FormatStyle NoSpaceStyle = getLLVMStyle(); 11119 verifyFormat("int a[5];", NoSpaceStyle); 11120 verifyFormat("a[3] += 42;", NoSpaceStyle); 11121 11122 verifyFormat("int a[1];", NoSpaceStyle); 11123 verifyFormat("int 1 [a];", NoSpaceStyle); 11124 verifyFormat("int a[1][2];", NoSpaceStyle); 11125 verifyFormat("a[7] = 5;", NoSpaceStyle); 11126 verifyFormat("int a = (f())[23];", NoSpaceStyle); 11127 verifyFormat("f([] {})", NoSpaceStyle); 11128 11129 FormatStyle Space = getLLVMStyle(); 11130 Space.SpaceBeforeSquareBrackets = true; 11131 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 11132 verifyFormat("return [i, args...] {};", Space); 11133 11134 verifyFormat("int a [5];", Space); 11135 verifyFormat("a [3] += 42;", Space); 11136 verifyFormat("constexpr char hello []{\"hello\"};", Space); 11137 verifyFormat("double &operator[](int i) { return 0; }\n" 11138 "int i;", 11139 Space); 11140 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 11141 verifyFormat("int i = a [a][a]->f();", Space); 11142 verifyFormat("int i = (*b) [a]->f();", Space); 11143 11144 verifyFormat("int a [1];", Space); 11145 verifyFormat("int 1 [a];", Space); 11146 verifyFormat("int a [1][2];", Space); 11147 verifyFormat("a [7] = 5;", Space); 11148 verifyFormat("int a = (f()) [23];", Space); 11149 verifyFormat("f([] {})", Space); 11150 } 11151 11152 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 11153 verifyFormat("int a = 5;"); 11154 verifyFormat("a += 42;"); 11155 verifyFormat("a or_eq 8;"); 11156 11157 FormatStyle Spaces = getLLVMStyle(); 11158 Spaces.SpaceBeforeAssignmentOperators = false; 11159 verifyFormat("int a= 5;", Spaces); 11160 verifyFormat("a+= 42;", Spaces); 11161 verifyFormat("a or_eq 8;", Spaces); 11162 } 11163 11164 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 11165 verifyFormat("class Foo : public Bar {};"); 11166 verifyFormat("Foo::Foo() : foo(1) {}"); 11167 verifyFormat("for (auto a : b) {\n}"); 11168 verifyFormat("int x = a ? b : c;"); 11169 verifyFormat("{\n" 11170 "label0:\n" 11171 " int x = 0;\n" 11172 "}"); 11173 verifyFormat("switch (x) {\n" 11174 "case 1:\n" 11175 "default:\n" 11176 "}"); 11177 11178 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 11179 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 11180 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 11181 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 11182 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 11183 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 11184 verifyFormat("{\n" 11185 "label1:\n" 11186 " int x = 0;\n" 11187 "}", 11188 CtorInitializerStyle); 11189 verifyFormat("switch (x) {\n" 11190 "case 1:\n" 11191 "default:\n" 11192 "}", 11193 CtorInitializerStyle); 11194 CtorInitializerStyle.BreakConstructorInitializers = 11195 FormatStyle::BCIS_AfterColon; 11196 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 11197 " aaaaaaaaaaaaaaaa(1),\n" 11198 " bbbbbbbbbbbbbbbb(2) {}", 11199 CtorInitializerStyle); 11200 CtorInitializerStyle.BreakConstructorInitializers = 11201 FormatStyle::BCIS_BeforeComma; 11202 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11203 " : aaaaaaaaaaaaaaaa(1)\n" 11204 " , bbbbbbbbbbbbbbbb(2) {}", 11205 CtorInitializerStyle); 11206 CtorInitializerStyle.BreakConstructorInitializers = 11207 FormatStyle::BCIS_BeforeColon; 11208 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11209 " : aaaaaaaaaaaaaaaa(1),\n" 11210 " bbbbbbbbbbbbbbbb(2) {}", 11211 CtorInitializerStyle); 11212 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 11213 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11214 ": aaaaaaaaaaaaaaaa(1),\n" 11215 " bbbbbbbbbbbbbbbb(2) {}", 11216 CtorInitializerStyle); 11217 11218 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 11219 InheritanceStyle.SpaceBeforeInheritanceColon = false; 11220 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 11221 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 11222 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 11223 verifyFormat("int x = a ? b : c;", InheritanceStyle); 11224 verifyFormat("{\n" 11225 "label2:\n" 11226 " int x = 0;\n" 11227 "}", 11228 InheritanceStyle); 11229 verifyFormat("switch (x) {\n" 11230 "case 1:\n" 11231 "default:\n" 11232 "}", 11233 InheritanceStyle); 11234 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 11235 verifyFormat("class Foooooooooooooooooooooo:\n" 11236 " public aaaaaaaaaaaaaaaaaa,\n" 11237 " public bbbbbbbbbbbbbbbbbb {\n" 11238 "}", 11239 InheritanceStyle); 11240 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 11241 verifyFormat("class Foooooooooooooooooooooo\n" 11242 " : public aaaaaaaaaaaaaaaaaa\n" 11243 " , public bbbbbbbbbbbbbbbbbb {\n" 11244 "}", 11245 InheritanceStyle); 11246 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 11247 verifyFormat("class Foooooooooooooooooooooo\n" 11248 " : public aaaaaaaaaaaaaaaaaa,\n" 11249 " public bbbbbbbbbbbbbbbbbb {\n" 11250 "}", 11251 InheritanceStyle); 11252 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 11253 verifyFormat("class Foooooooooooooooooooooo\n" 11254 ": public aaaaaaaaaaaaaaaaaa,\n" 11255 " public bbbbbbbbbbbbbbbbbb {}", 11256 InheritanceStyle); 11257 11258 FormatStyle ForLoopStyle = getLLVMStyle(); 11259 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 11260 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 11261 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 11262 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 11263 verifyFormat("int x = a ? b : c;", ForLoopStyle); 11264 verifyFormat("{\n" 11265 "label2:\n" 11266 " int x = 0;\n" 11267 "}", 11268 ForLoopStyle); 11269 verifyFormat("switch (x) {\n" 11270 "case 1:\n" 11271 "default:\n" 11272 "}", 11273 ForLoopStyle); 11274 11275 FormatStyle NoSpaceStyle = getLLVMStyle(); 11276 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 11277 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 11278 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 11279 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 11280 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 11281 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 11282 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 11283 verifyFormat("{\n" 11284 "label3:\n" 11285 " int x = 0;\n" 11286 "}", 11287 NoSpaceStyle); 11288 verifyFormat("switch (x) {\n" 11289 "case 1:\n" 11290 "default:\n" 11291 "}", 11292 NoSpaceStyle); 11293 } 11294 11295 TEST_F(FormatTest, AlignConsecutiveMacros) { 11296 FormatStyle Style = getLLVMStyle(); 11297 Style.AlignConsecutiveAssignments = true; 11298 Style.AlignConsecutiveDeclarations = true; 11299 Style.AlignConsecutiveMacros = false; 11300 11301 verifyFormat("#define a 3\n" 11302 "#define bbbb 4\n" 11303 "#define ccc (5)", 11304 Style); 11305 11306 verifyFormat("#define f(x) (x * x)\n" 11307 "#define fff(x, y, z) (x * y + z)\n" 11308 "#define ffff(x, y) (x - y)", 11309 Style); 11310 11311 verifyFormat("#define foo(x, y) (x + y)\n" 11312 "#define bar (5, 6)(2 + 2)", 11313 Style); 11314 11315 verifyFormat("#define a 3\n" 11316 "#define bbbb 4\n" 11317 "#define ccc (5)\n" 11318 "#define f(x) (x * x)\n" 11319 "#define fff(x, y, z) (x * y + z)\n" 11320 "#define ffff(x, y) (x - y)", 11321 Style); 11322 11323 Style.AlignConsecutiveMacros = true; 11324 verifyFormat("#define a 3\n" 11325 "#define bbbb 4\n" 11326 "#define ccc (5)", 11327 Style); 11328 11329 verifyFormat("#define f(x) (x * x)\n" 11330 "#define fff(x, y, z) (x * y + z)\n" 11331 "#define ffff(x, y) (x - y)", 11332 Style); 11333 11334 verifyFormat("#define foo(x, y) (x + y)\n" 11335 "#define bar (5, 6)(2 + 2)", 11336 Style); 11337 11338 verifyFormat("#define a 3\n" 11339 "#define bbbb 4\n" 11340 "#define ccc (5)\n" 11341 "#define f(x) (x * x)\n" 11342 "#define fff(x, y, z) (x * y + z)\n" 11343 "#define ffff(x, y) (x - y)", 11344 Style); 11345 11346 verifyFormat("#define a 5\n" 11347 "#define foo(x, y) (x + y)\n" 11348 "#define CCC (6)\n" 11349 "auto lambda = []() {\n" 11350 " auto ii = 0;\n" 11351 " float j = 0;\n" 11352 " return 0;\n" 11353 "};\n" 11354 "int i = 0;\n" 11355 "float i2 = 0;\n" 11356 "auto v = type{\n" 11357 " i = 1, //\n" 11358 " (i = 2), //\n" 11359 " i = 3 //\n" 11360 "};", 11361 Style); 11362 11363 Style.AlignConsecutiveMacros = false; 11364 Style.ColumnLimit = 20; 11365 11366 verifyFormat("#define a \\\n" 11367 " \"aabbbbbbbbbbbb\"\n" 11368 "#define D \\\n" 11369 " \"aabbbbbbbbbbbb\" \\\n" 11370 " \"ccddeeeeeeeee\"\n" 11371 "#define B \\\n" 11372 " \"QQQQQQQQQQQQQ\" \\\n" 11373 " \"FFFFFFFFFFFFF\" \\\n" 11374 " \"LLLLLLLL\"\n", 11375 Style); 11376 11377 Style.AlignConsecutiveMacros = true; 11378 verifyFormat("#define a \\\n" 11379 " \"aabbbbbbbbbbbb\"\n" 11380 "#define D \\\n" 11381 " \"aabbbbbbbbbbbb\" \\\n" 11382 " \"ccddeeeeeeeee\"\n" 11383 "#define B \\\n" 11384 " \"QQQQQQQQQQQQQ\" \\\n" 11385 " \"FFFFFFFFFFFFF\" \\\n" 11386 " \"LLLLLLLL\"\n", 11387 Style); 11388 } 11389 11390 TEST_F(FormatTest, AlignConsecutiveAssignments) { 11391 FormatStyle Alignment = getLLVMStyle(); 11392 Alignment.AlignConsecutiveMacros = true; 11393 Alignment.AlignConsecutiveAssignments = false; 11394 verifyFormat("int a = 5;\n" 11395 "int oneTwoThree = 123;", 11396 Alignment); 11397 verifyFormat("int a = 5;\n" 11398 "int oneTwoThree = 123;", 11399 Alignment); 11400 11401 Alignment.AlignConsecutiveAssignments = true; 11402 verifyFormat("int a = 5;\n" 11403 "int oneTwoThree = 123;", 11404 Alignment); 11405 verifyFormat("int a = method();\n" 11406 "int oneTwoThree = 133;", 11407 Alignment); 11408 verifyFormat("a &= 5;\n" 11409 "bcd *= 5;\n" 11410 "ghtyf += 5;\n" 11411 "dvfvdb -= 5;\n" 11412 "a /= 5;\n" 11413 "vdsvsv %= 5;\n" 11414 "sfdbddfbdfbb ^= 5;\n" 11415 "dvsdsv |= 5;\n" 11416 "int dsvvdvsdvvv = 123;", 11417 Alignment); 11418 verifyFormat("int i = 1, j = 10;\n" 11419 "something = 2000;", 11420 Alignment); 11421 verifyFormat("something = 2000;\n" 11422 "int i = 1, j = 10;\n", 11423 Alignment); 11424 verifyFormat("something = 2000;\n" 11425 "another = 911;\n" 11426 "int i = 1, j = 10;\n" 11427 "oneMore = 1;\n" 11428 "i = 2;", 11429 Alignment); 11430 verifyFormat("int a = 5;\n" 11431 "int one = 1;\n" 11432 "method();\n" 11433 "int oneTwoThree = 123;\n" 11434 "int oneTwo = 12;", 11435 Alignment); 11436 verifyFormat("int oneTwoThree = 123;\n" 11437 "int oneTwo = 12;\n" 11438 "method();\n", 11439 Alignment); 11440 verifyFormat("int oneTwoThree = 123; // comment\n" 11441 "int oneTwo = 12; // comment", 11442 Alignment); 11443 EXPECT_EQ("int a = 5;\n" 11444 "\n" 11445 "int oneTwoThree = 123;", 11446 format("int a = 5;\n" 11447 "\n" 11448 "int oneTwoThree= 123;", 11449 Alignment)); 11450 EXPECT_EQ("int a = 5;\n" 11451 "int one = 1;\n" 11452 "\n" 11453 "int oneTwoThree = 123;", 11454 format("int a = 5;\n" 11455 "int one = 1;\n" 11456 "\n" 11457 "int oneTwoThree = 123;", 11458 Alignment)); 11459 EXPECT_EQ("int a = 5;\n" 11460 "int one = 1;\n" 11461 "\n" 11462 "int oneTwoThree = 123;\n" 11463 "int oneTwo = 12;", 11464 format("int a = 5;\n" 11465 "int one = 1;\n" 11466 "\n" 11467 "int oneTwoThree = 123;\n" 11468 "int oneTwo = 12;", 11469 Alignment)); 11470 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11471 verifyFormat("#define A \\\n" 11472 " int aaaa = 12; \\\n" 11473 " int b = 23; \\\n" 11474 " int ccc = 234; \\\n" 11475 " int dddddddddd = 2345;", 11476 Alignment); 11477 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11478 verifyFormat("#define A \\\n" 11479 " int aaaa = 12; \\\n" 11480 " int b = 23; \\\n" 11481 " int ccc = 234; \\\n" 11482 " int dddddddddd = 2345;", 11483 Alignment); 11484 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11485 verifyFormat("#define A " 11486 " \\\n" 11487 " int aaaa = 12; " 11488 " \\\n" 11489 " int b = 23; " 11490 " \\\n" 11491 " int ccc = 234; " 11492 " \\\n" 11493 " int dddddddddd = 2345;", 11494 Alignment); 11495 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11496 "k = 4, int l = 5,\n" 11497 " int m = 6) {\n" 11498 " int j = 10;\n" 11499 " otherThing = 1;\n" 11500 "}", 11501 Alignment); 11502 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11503 " int i = 1;\n" 11504 " int j = 2;\n" 11505 " int big = 10000;\n" 11506 "}", 11507 Alignment); 11508 verifyFormat("class C {\n" 11509 "public:\n" 11510 " int i = 1;\n" 11511 " virtual void f() = 0;\n" 11512 "};", 11513 Alignment); 11514 verifyFormat("int i = 1;\n" 11515 "if (SomeType t = getSomething()) {\n" 11516 "}\n" 11517 "int j = 2;\n" 11518 "int big = 10000;", 11519 Alignment); 11520 verifyFormat("int j = 7;\n" 11521 "for (int k = 0; k < N; ++k) {\n" 11522 "}\n" 11523 "int j = 2;\n" 11524 "int big = 10000;\n" 11525 "}", 11526 Alignment); 11527 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11528 verifyFormat("int i = 1;\n" 11529 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11530 " = someLooooooooooooooooongFunction();\n" 11531 "int j = 2;", 11532 Alignment); 11533 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11534 verifyFormat("int i = 1;\n" 11535 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11536 " someLooooooooooooooooongFunction();\n" 11537 "int j = 2;", 11538 Alignment); 11539 11540 verifyFormat("auto lambda = []() {\n" 11541 " auto i = 0;\n" 11542 " return 0;\n" 11543 "};\n" 11544 "int i = 0;\n" 11545 "auto v = type{\n" 11546 " i = 1, //\n" 11547 " (i = 2), //\n" 11548 " i = 3 //\n" 11549 "};", 11550 Alignment); 11551 11552 verifyFormat( 11553 "int i = 1;\n" 11554 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11555 " loooooooooooooooooooooongParameterB);\n" 11556 "int j = 2;", 11557 Alignment); 11558 11559 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 11560 " typename B = very_long_type_name_1,\n" 11561 " typename T_2 = very_long_type_name_2>\n" 11562 "auto foo() {}\n", 11563 Alignment); 11564 verifyFormat("int a, b = 1;\n" 11565 "int c = 2;\n" 11566 "int dd = 3;\n", 11567 Alignment); 11568 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11569 "float b[1][] = {{3.f}};\n", 11570 Alignment); 11571 verifyFormat("for (int i = 0; i < 1; i++)\n" 11572 " int x = 1;\n", 11573 Alignment); 11574 verifyFormat("for (i = 0; i < 1; i++)\n" 11575 " x = 1;\n" 11576 "y = 1;\n", 11577 Alignment); 11578 } 11579 11580 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 11581 FormatStyle Alignment = getLLVMStyle(); 11582 Alignment.AlignConsecutiveMacros = true; 11583 Alignment.AlignConsecutiveDeclarations = false; 11584 verifyFormat("float const a = 5;\n" 11585 "int oneTwoThree = 123;", 11586 Alignment); 11587 verifyFormat("int a = 5;\n" 11588 "float const oneTwoThree = 123;", 11589 Alignment); 11590 11591 Alignment.AlignConsecutiveDeclarations = true; 11592 verifyFormat("float const a = 5;\n" 11593 "int oneTwoThree = 123;", 11594 Alignment); 11595 verifyFormat("int a = method();\n" 11596 "float const oneTwoThree = 133;", 11597 Alignment); 11598 verifyFormat("int i = 1, j = 10;\n" 11599 "something = 2000;", 11600 Alignment); 11601 verifyFormat("something = 2000;\n" 11602 "int i = 1, j = 10;\n", 11603 Alignment); 11604 verifyFormat("float something = 2000;\n" 11605 "double another = 911;\n" 11606 "int i = 1, j = 10;\n" 11607 "const int *oneMore = 1;\n" 11608 "unsigned i = 2;", 11609 Alignment); 11610 verifyFormat("float a = 5;\n" 11611 "int one = 1;\n" 11612 "method();\n" 11613 "const double oneTwoThree = 123;\n" 11614 "const unsigned int oneTwo = 12;", 11615 Alignment); 11616 verifyFormat("int oneTwoThree{0}; // comment\n" 11617 "unsigned oneTwo; // comment", 11618 Alignment); 11619 EXPECT_EQ("float const a = 5;\n" 11620 "\n" 11621 "int oneTwoThree = 123;", 11622 format("float const a = 5;\n" 11623 "\n" 11624 "int oneTwoThree= 123;", 11625 Alignment)); 11626 EXPECT_EQ("float a = 5;\n" 11627 "int one = 1;\n" 11628 "\n" 11629 "unsigned oneTwoThree = 123;", 11630 format("float a = 5;\n" 11631 "int one = 1;\n" 11632 "\n" 11633 "unsigned oneTwoThree = 123;", 11634 Alignment)); 11635 EXPECT_EQ("float a = 5;\n" 11636 "int one = 1;\n" 11637 "\n" 11638 "unsigned oneTwoThree = 123;\n" 11639 "int oneTwo = 12;", 11640 format("float a = 5;\n" 11641 "int one = 1;\n" 11642 "\n" 11643 "unsigned oneTwoThree = 123;\n" 11644 "int oneTwo = 12;", 11645 Alignment)); 11646 // Function prototype alignment 11647 verifyFormat("int a();\n" 11648 "double b();", 11649 Alignment); 11650 verifyFormat("int a(int x);\n" 11651 "double b();", 11652 Alignment); 11653 unsigned OldColumnLimit = Alignment.ColumnLimit; 11654 // We need to set ColumnLimit to zero, in order to stress nested alignments, 11655 // otherwise the function parameters will be re-flowed onto a single line. 11656 Alignment.ColumnLimit = 0; 11657 EXPECT_EQ("int a(int x,\n" 11658 " float y);\n" 11659 "double b(int x,\n" 11660 " double y);", 11661 format("int a(int x,\n" 11662 " float y);\n" 11663 "double b(int x,\n" 11664 " double y);", 11665 Alignment)); 11666 // This ensures that function parameters of function declarations are 11667 // correctly indented when their owning functions are indented. 11668 // The failure case here is for 'double y' to not be indented enough. 11669 EXPECT_EQ("double a(int x);\n" 11670 "int b(int y,\n" 11671 " double z);", 11672 format("double a(int x);\n" 11673 "int b(int y,\n" 11674 " double z);", 11675 Alignment)); 11676 // Set ColumnLimit low so that we induce wrapping immediately after 11677 // the function name and opening paren. 11678 Alignment.ColumnLimit = 13; 11679 verifyFormat("int function(\n" 11680 " int x,\n" 11681 " bool y);", 11682 Alignment); 11683 Alignment.ColumnLimit = OldColumnLimit; 11684 // Ensure function pointers don't screw up recursive alignment 11685 verifyFormat("int a(int x, void (*fp)(int y));\n" 11686 "double b();", 11687 Alignment); 11688 Alignment.AlignConsecutiveAssignments = true; 11689 // Ensure recursive alignment is broken by function braces, so that the 11690 // "a = 1" does not align with subsequent assignments inside the function 11691 // body. 11692 verifyFormat("int func(int a = 1) {\n" 11693 " int b = 2;\n" 11694 " int cc = 3;\n" 11695 "}", 11696 Alignment); 11697 verifyFormat("float something = 2000;\n" 11698 "double another = 911;\n" 11699 "int i = 1, j = 10;\n" 11700 "const int *oneMore = 1;\n" 11701 "unsigned i = 2;", 11702 Alignment); 11703 verifyFormat("int oneTwoThree = {0}; // comment\n" 11704 "unsigned oneTwo = 0; // comment", 11705 Alignment); 11706 // Make sure that scope is correctly tracked, in the absence of braces 11707 verifyFormat("for (int i = 0; i < n; i++)\n" 11708 " j = i;\n" 11709 "double x = 1;\n", 11710 Alignment); 11711 verifyFormat("if (int i = 0)\n" 11712 " j = i;\n" 11713 "double x = 1;\n", 11714 Alignment); 11715 // Ensure operator[] and operator() are comprehended 11716 verifyFormat("struct test {\n" 11717 " long long int foo();\n" 11718 " int operator[](int a);\n" 11719 " double bar();\n" 11720 "};\n", 11721 Alignment); 11722 verifyFormat("struct test {\n" 11723 " long long int foo();\n" 11724 " int operator()(int a);\n" 11725 " double bar();\n" 11726 "};\n", 11727 Alignment); 11728 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 11729 " int const i = 1;\n" 11730 " int * j = 2;\n" 11731 " int big = 10000;\n" 11732 "\n" 11733 " unsigned oneTwoThree = 123;\n" 11734 " int oneTwo = 12;\n" 11735 " method();\n" 11736 " float k = 2;\n" 11737 " int ll = 10000;\n" 11738 "}", 11739 format("void SomeFunction(int parameter= 0) {\n" 11740 " int const i= 1;\n" 11741 " int *j=2;\n" 11742 " int big = 10000;\n" 11743 "\n" 11744 "unsigned oneTwoThree =123;\n" 11745 "int oneTwo = 12;\n" 11746 " method();\n" 11747 "float k= 2;\n" 11748 "int ll=10000;\n" 11749 "}", 11750 Alignment)); 11751 Alignment.AlignConsecutiveAssignments = false; 11752 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11753 verifyFormat("#define A \\\n" 11754 " int aaaa = 12; \\\n" 11755 " float b = 23; \\\n" 11756 " const int ccc = 234; \\\n" 11757 " unsigned dddddddddd = 2345;", 11758 Alignment); 11759 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11760 verifyFormat("#define A \\\n" 11761 " int aaaa = 12; \\\n" 11762 " float b = 23; \\\n" 11763 " const int ccc = 234; \\\n" 11764 " unsigned dddddddddd = 2345;", 11765 Alignment); 11766 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11767 Alignment.ColumnLimit = 30; 11768 verifyFormat("#define A \\\n" 11769 " int aaaa = 12; \\\n" 11770 " float b = 23; \\\n" 11771 " const int ccc = 234; \\\n" 11772 " int dddddddddd = 2345;", 11773 Alignment); 11774 Alignment.ColumnLimit = 80; 11775 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11776 "k = 4, int l = 5,\n" 11777 " int m = 6) {\n" 11778 " const int j = 10;\n" 11779 " otherThing = 1;\n" 11780 "}", 11781 Alignment); 11782 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11783 " int const i = 1;\n" 11784 " int * j = 2;\n" 11785 " int big = 10000;\n" 11786 "}", 11787 Alignment); 11788 verifyFormat("class C {\n" 11789 "public:\n" 11790 " int i = 1;\n" 11791 " virtual void f() = 0;\n" 11792 "};", 11793 Alignment); 11794 verifyFormat("float i = 1;\n" 11795 "if (SomeType t = getSomething()) {\n" 11796 "}\n" 11797 "const unsigned j = 2;\n" 11798 "int big = 10000;", 11799 Alignment); 11800 verifyFormat("float j = 7;\n" 11801 "for (int k = 0; k < N; ++k) {\n" 11802 "}\n" 11803 "unsigned j = 2;\n" 11804 "int big = 10000;\n" 11805 "}", 11806 Alignment); 11807 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11808 verifyFormat("float i = 1;\n" 11809 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11810 " = someLooooooooooooooooongFunction();\n" 11811 "int j = 2;", 11812 Alignment); 11813 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11814 verifyFormat("int i = 1;\n" 11815 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11816 " someLooooooooooooooooongFunction();\n" 11817 "int j = 2;", 11818 Alignment); 11819 11820 Alignment.AlignConsecutiveAssignments = true; 11821 verifyFormat("auto lambda = []() {\n" 11822 " auto ii = 0;\n" 11823 " float j = 0;\n" 11824 " return 0;\n" 11825 "};\n" 11826 "int i = 0;\n" 11827 "float i2 = 0;\n" 11828 "auto v = type{\n" 11829 " i = 1, //\n" 11830 " (i = 2), //\n" 11831 " i = 3 //\n" 11832 "};", 11833 Alignment); 11834 Alignment.AlignConsecutiveAssignments = false; 11835 11836 verifyFormat( 11837 "int i = 1;\n" 11838 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11839 " loooooooooooooooooooooongParameterB);\n" 11840 "int j = 2;", 11841 Alignment); 11842 11843 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 11844 // We expect declarations and assignments to align, as long as it doesn't 11845 // exceed the column limit, starting a new alignment sequence whenever it 11846 // happens. 11847 Alignment.AlignConsecutiveAssignments = true; 11848 Alignment.ColumnLimit = 30; 11849 verifyFormat("float ii = 1;\n" 11850 "unsigned j = 2;\n" 11851 "int someVerylongVariable = 1;\n" 11852 "AnotherLongType ll = 123456;\n" 11853 "VeryVeryLongType k = 2;\n" 11854 "int myvar = 1;", 11855 Alignment); 11856 Alignment.ColumnLimit = 80; 11857 Alignment.AlignConsecutiveAssignments = false; 11858 11859 verifyFormat( 11860 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 11861 " typename LongType, typename B>\n" 11862 "auto foo() {}\n", 11863 Alignment); 11864 verifyFormat("float a, b = 1;\n" 11865 "int c = 2;\n" 11866 "int dd = 3;\n", 11867 Alignment); 11868 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11869 "float b[1][] = {{3.f}};\n", 11870 Alignment); 11871 Alignment.AlignConsecutiveAssignments = true; 11872 verifyFormat("float a, b = 1;\n" 11873 "int c = 2;\n" 11874 "int dd = 3;\n", 11875 Alignment); 11876 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11877 "float b[1][] = {{3.f}};\n", 11878 Alignment); 11879 Alignment.AlignConsecutiveAssignments = false; 11880 11881 Alignment.ColumnLimit = 30; 11882 Alignment.BinPackParameters = false; 11883 verifyFormat("void foo(float a,\n" 11884 " float b,\n" 11885 " int c,\n" 11886 " uint32_t *d) {\n" 11887 " int * e = 0;\n" 11888 " float f = 0;\n" 11889 " double g = 0;\n" 11890 "}\n" 11891 "void bar(ino_t a,\n" 11892 " int b,\n" 11893 " uint32_t *c,\n" 11894 " bool d) {}\n", 11895 Alignment); 11896 Alignment.BinPackParameters = true; 11897 Alignment.ColumnLimit = 80; 11898 11899 // Bug 33507 11900 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 11901 verifyFormat( 11902 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 11903 " static const Version verVs2017;\n" 11904 " return true;\n" 11905 "});\n", 11906 Alignment); 11907 Alignment.PointerAlignment = FormatStyle::PAS_Right; 11908 11909 // See llvm.org/PR35641 11910 Alignment.AlignConsecutiveDeclarations = true; 11911 verifyFormat("int func() { //\n" 11912 " int b;\n" 11913 " unsigned c;\n" 11914 "}", 11915 Alignment); 11916 11917 // See PR37175 11918 FormatStyle Style = getMozillaStyle(); 11919 Style.AlignConsecutiveDeclarations = true; 11920 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 11921 "foo(int a);", 11922 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 11923 } 11924 11925 TEST_F(FormatTest, LinuxBraceBreaking) { 11926 FormatStyle LinuxBraceStyle = getLLVMStyle(); 11927 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 11928 verifyFormat("namespace a\n" 11929 "{\n" 11930 "class A\n" 11931 "{\n" 11932 " void f()\n" 11933 " {\n" 11934 " if (true) {\n" 11935 " a();\n" 11936 " b();\n" 11937 " } else {\n" 11938 " a();\n" 11939 " }\n" 11940 " }\n" 11941 " void g() { return; }\n" 11942 "};\n" 11943 "struct B {\n" 11944 " int x;\n" 11945 "};\n" 11946 "} // namespace a\n", 11947 LinuxBraceStyle); 11948 verifyFormat("enum X {\n" 11949 " Y = 0,\n" 11950 "}\n", 11951 LinuxBraceStyle); 11952 verifyFormat("struct S {\n" 11953 " int Type;\n" 11954 " union {\n" 11955 " int x;\n" 11956 " double y;\n" 11957 " } Value;\n" 11958 " class C\n" 11959 " {\n" 11960 " MyFavoriteType Value;\n" 11961 " } Class;\n" 11962 "}\n", 11963 LinuxBraceStyle); 11964 } 11965 11966 TEST_F(FormatTest, MozillaBraceBreaking) { 11967 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11968 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11969 MozillaBraceStyle.FixNamespaceComments = false; 11970 verifyFormat("namespace a {\n" 11971 "class A\n" 11972 "{\n" 11973 " void f()\n" 11974 " {\n" 11975 " if (true) {\n" 11976 " a();\n" 11977 " b();\n" 11978 " }\n" 11979 " }\n" 11980 " void g() { return; }\n" 11981 "};\n" 11982 "enum E\n" 11983 "{\n" 11984 " A,\n" 11985 " // foo\n" 11986 " B,\n" 11987 " C\n" 11988 "};\n" 11989 "struct B\n" 11990 "{\n" 11991 " int x;\n" 11992 "};\n" 11993 "}\n", 11994 MozillaBraceStyle); 11995 verifyFormat("struct S\n" 11996 "{\n" 11997 " int Type;\n" 11998 " union\n" 11999 " {\n" 12000 " int x;\n" 12001 " double y;\n" 12002 " } Value;\n" 12003 " class C\n" 12004 " {\n" 12005 " MyFavoriteType Value;\n" 12006 " } Class;\n" 12007 "}\n", 12008 MozillaBraceStyle); 12009 } 12010 12011 TEST_F(FormatTest, StroustrupBraceBreaking) { 12012 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 12013 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12014 verifyFormat("namespace a {\n" 12015 "class A {\n" 12016 " void f()\n" 12017 " {\n" 12018 " if (true) {\n" 12019 " a();\n" 12020 " b();\n" 12021 " }\n" 12022 " }\n" 12023 " void g() { return; }\n" 12024 "};\n" 12025 "struct B {\n" 12026 " int x;\n" 12027 "};\n" 12028 "} // namespace a\n", 12029 StroustrupBraceStyle); 12030 12031 verifyFormat("void foo()\n" 12032 "{\n" 12033 " if (a) {\n" 12034 " a();\n" 12035 " }\n" 12036 " else {\n" 12037 " b();\n" 12038 " }\n" 12039 "}\n", 12040 StroustrupBraceStyle); 12041 12042 verifyFormat("#ifdef _DEBUG\n" 12043 "int foo(int i = 0)\n" 12044 "#else\n" 12045 "int foo(int i = 5)\n" 12046 "#endif\n" 12047 "{\n" 12048 " return i;\n" 12049 "}", 12050 StroustrupBraceStyle); 12051 12052 verifyFormat("void foo() {}\n" 12053 "void bar()\n" 12054 "#ifdef _DEBUG\n" 12055 "{\n" 12056 " foo();\n" 12057 "}\n" 12058 "#else\n" 12059 "{\n" 12060 "}\n" 12061 "#endif", 12062 StroustrupBraceStyle); 12063 12064 verifyFormat("void foobar() { int i = 5; }\n" 12065 "#ifdef _DEBUG\n" 12066 "void bar() {}\n" 12067 "#else\n" 12068 "void bar() { foobar(); }\n" 12069 "#endif", 12070 StroustrupBraceStyle); 12071 } 12072 12073 TEST_F(FormatTest, AllmanBraceBreaking) { 12074 FormatStyle AllmanBraceStyle = getLLVMStyle(); 12075 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 12076 12077 EXPECT_EQ("namespace a\n" 12078 "{\n" 12079 "void f();\n" 12080 "void g();\n" 12081 "} // namespace a\n", 12082 format("namespace a\n" 12083 "{\n" 12084 "void f();\n" 12085 "void g();\n" 12086 "}\n", 12087 AllmanBraceStyle)); 12088 12089 verifyFormat("namespace a\n" 12090 "{\n" 12091 "class A\n" 12092 "{\n" 12093 " void f()\n" 12094 " {\n" 12095 " if (true)\n" 12096 " {\n" 12097 " a();\n" 12098 " b();\n" 12099 " }\n" 12100 " }\n" 12101 " void g() { return; }\n" 12102 "};\n" 12103 "struct B\n" 12104 "{\n" 12105 " int x;\n" 12106 "};\n" 12107 "union C\n" 12108 "{\n" 12109 "};\n" 12110 "} // namespace a", 12111 AllmanBraceStyle); 12112 12113 verifyFormat("void f()\n" 12114 "{\n" 12115 " if (true)\n" 12116 " {\n" 12117 " a();\n" 12118 " }\n" 12119 " else if (false)\n" 12120 " {\n" 12121 " b();\n" 12122 " }\n" 12123 " else\n" 12124 " {\n" 12125 " c();\n" 12126 " }\n" 12127 "}\n", 12128 AllmanBraceStyle); 12129 12130 verifyFormat("void f()\n" 12131 "{\n" 12132 " for (int i = 0; i < 10; ++i)\n" 12133 " {\n" 12134 " a();\n" 12135 " }\n" 12136 " while (false)\n" 12137 " {\n" 12138 " b();\n" 12139 " }\n" 12140 " do\n" 12141 " {\n" 12142 " c();\n" 12143 " } while (false)\n" 12144 "}\n", 12145 AllmanBraceStyle); 12146 12147 verifyFormat("void f(int a)\n" 12148 "{\n" 12149 " switch (a)\n" 12150 " {\n" 12151 " case 0:\n" 12152 " break;\n" 12153 " case 1:\n" 12154 " {\n" 12155 " break;\n" 12156 " }\n" 12157 " case 2:\n" 12158 " {\n" 12159 " }\n" 12160 " break;\n" 12161 " default:\n" 12162 " break;\n" 12163 " }\n" 12164 "}\n", 12165 AllmanBraceStyle); 12166 12167 verifyFormat("enum X\n" 12168 "{\n" 12169 " Y = 0,\n" 12170 "}\n", 12171 AllmanBraceStyle); 12172 verifyFormat("enum X\n" 12173 "{\n" 12174 " Y = 0\n" 12175 "}\n", 12176 AllmanBraceStyle); 12177 12178 verifyFormat("@interface BSApplicationController ()\n" 12179 "{\n" 12180 "@private\n" 12181 " id _extraIvar;\n" 12182 "}\n" 12183 "@end\n", 12184 AllmanBraceStyle); 12185 12186 verifyFormat("#ifdef _DEBUG\n" 12187 "int foo(int i = 0)\n" 12188 "#else\n" 12189 "int foo(int i = 5)\n" 12190 "#endif\n" 12191 "{\n" 12192 " return i;\n" 12193 "}", 12194 AllmanBraceStyle); 12195 12196 verifyFormat("void foo() {}\n" 12197 "void bar()\n" 12198 "#ifdef _DEBUG\n" 12199 "{\n" 12200 " foo();\n" 12201 "}\n" 12202 "#else\n" 12203 "{\n" 12204 "}\n" 12205 "#endif", 12206 AllmanBraceStyle); 12207 12208 verifyFormat("void foobar() { int i = 5; }\n" 12209 "#ifdef _DEBUG\n" 12210 "void bar() {}\n" 12211 "#else\n" 12212 "void bar() { foobar(); }\n" 12213 "#endif", 12214 AllmanBraceStyle); 12215 12216 // This shouldn't affect ObjC blocks.. 12217 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 12218 " // ...\n" 12219 " int i;\n" 12220 "}];", 12221 AllmanBraceStyle); 12222 verifyFormat("void (^block)(void) = ^{\n" 12223 " // ...\n" 12224 " int i;\n" 12225 "};", 12226 AllmanBraceStyle); 12227 // .. or dict literals. 12228 verifyFormat("void f()\n" 12229 "{\n" 12230 " // ...\n" 12231 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 12232 "}", 12233 AllmanBraceStyle); 12234 verifyFormat("void f()\n" 12235 "{\n" 12236 " // ...\n" 12237 " [object someMethod:@{a : @\"b\"}];\n" 12238 "}", 12239 AllmanBraceStyle); 12240 verifyFormat("int f()\n" 12241 "{ // comment\n" 12242 " return 42;\n" 12243 "}", 12244 AllmanBraceStyle); 12245 12246 AllmanBraceStyle.ColumnLimit = 19; 12247 verifyFormat("void f() { int i; }", AllmanBraceStyle); 12248 AllmanBraceStyle.ColumnLimit = 18; 12249 verifyFormat("void f()\n" 12250 "{\n" 12251 " int i;\n" 12252 "}", 12253 AllmanBraceStyle); 12254 AllmanBraceStyle.ColumnLimit = 80; 12255 12256 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 12257 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 12258 FormatStyle::SIS_WithoutElse; 12259 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 12260 verifyFormat("void f(bool b)\n" 12261 "{\n" 12262 " if (b)\n" 12263 " {\n" 12264 " return;\n" 12265 " }\n" 12266 "}\n", 12267 BreakBeforeBraceShortIfs); 12268 verifyFormat("void f(bool b)\n" 12269 "{\n" 12270 " if constexpr (b)\n" 12271 " {\n" 12272 " return;\n" 12273 " }\n" 12274 "}\n", 12275 BreakBeforeBraceShortIfs); 12276 verifyFormat("void f(bool b)\n" 12277 "{\n" 12278 " if CONSTEXPR (b)\n" 12279 " {\n" 12280 " return;\n" 12281 " }\n" 12282 "}\n", 12283 BreakBeforeBraceShortIfs); 12284 verifyFormat("void f(bool b)\n" 12285 "{\n" 12286 " if (b) return;\n" 12287 "}\n", 12288 BreakBeforeBraceShortIfs); 12289 verifyFormat("void f(bool b)\n" 12290 "{\n" 12291 " if constexpr (b) return;\n" 12292 "}\n", 12293 BreakBeforeBraceShortIfs); 12294 verifyFormat("void f(bool b)\n" 12295 "{\n" 12296 " if CONSTEXPR (b) return;\n" 12297 "}\n", 12298 BreakBeforeBraceShortIfs); 12299 verifyFormat("void f(bool b)\n" 12300 "{\n" 12301 " while (b)\n" 12302 " {\n" 12303 " return;\n" 12304 " }\n" 12305 "}\n", 12306 BreakBeforeBraceShortIfs); 12307 } 12308 12309 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 12310 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 12311 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 12312 12313 // Make a few changes to the style for testing purposes 12314 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 12315 FormatStyle::SFS_Empty; 12316 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 12317 WhitesmithsBraceStyle.ColumnLimit = 0; 12318 12319 // FIXME: this test case can't decide whether there should be a blank line 12320 // after the ~D() line or not. It adds one if one doesn't exist in the test 12321 // and it removes the line if one exists. 12322 /* 12323 verifyFormat("class A;\n" 12324 "namespace B\n" 12325 " {\n" 12326 "class C;\n" 12327 "// Comment\n" 12328 "class D\n" 12329 " {\n" 12330 "public:\n" 12331 " D();\n" 12332 " ~D() {}\n" 12333 "private:\n" 12334 " enum E\n" 12335 " {\n" 12336 " F\n" 12337 " }\n" 12338 " };\n" 12339 " } // namespace B\n", 12340 WhitesmithsBraceStyle); 12341 */ 12342 12343 verifyFormat("namespace a\n" 12344 " {\n" 12345 "class A\n" 12346 " {\n" 12347 " void f()\n" 12348 " {\n" 12349 " if (true)\n" 12350 " {\n" 12351 " a();\n" 12352 " b();\n" 12353 " }\n" 12354 " }\n" 12355 " void g()\n" 12356 " {\n" 12357 " return;\n" 12358 " }\n" 12359 " };\n" 12360 "struct B\n" 12361 " {\n" 12362 " int x;\n" 12363 " };\n" 12364 " } // namespace a", 12365 WhitesmithsBraceStyle); 12366 12367 verifyFormat("void f()\n" 12368 " {\n" 12369 " if (true)\n" 12370 " {\n" 12371 " a();\n" 12372 " }\n" 12373 " else if (false)\n" 12374 " {\n" 12375 " b();\n" 12376 " }\n" 12377 " else\n" 12378 " {\n" 12379 " c();\n" 12380 " }\n" 12381 " }\n", 12382 WhitesmithsBraceStyle); 12383 12384 verifyFormat("void f()\n" 12385 " {\n" 12386 " for (int i = 0; i < 10; ++i)\n" 12387 " {\n" 12388 " a();\n" 12389 " }\n" 12390 " while (false)\n" 12391 " {\n" 12392 " b();\n" 12393 " }\n" 12394 " do\n" 12395 " {\n" 12396 " c();\n" 12397 " } while (false)\n" 12398 " }\n", 12399 WhitesmithsBraceStyle); 12400 12401 // FIXME: the block and the break under case 2 in this test don't get indented 12402 // correctly 12403 /* 12404 verifyFormat("void switchTest1(int a)\n" 12405 " {\n" 12406 " switch (a)\n" 12407 " {\n" 12408 " case 2:\n" 12409 " {\n" 12410 " }\n" 12411 " break;\n" 12412 " }\n" 12413 " }\n", 12414 WhitesmithsBraceStyle); 12415 */ 12416 12417 // FIXME: the block and the break under case 2 in this test don't get indented 12418 // correctly 12419 /* 12420 verifyFormat("void switchTest2(int a)\n" 12421 " {\n" 12422 " switch (a)\n" 12423 " {\n" 12424 " case 0:\n" 12425 " break;\n" 12426 " case 1:\n" 12427 " {\n" 12428 " break;\n" 12429 " }\n" 12430 " case 2:\n" 12431 " {\n" 12432 " }\n" 12433 " break;\n" 12434 " default:\n" 12435 " break;\n" 12436 " }\n" 12437 " }\n", 12438 WhitesmithsBraceStyle); 12439 */ 12440 12441 verifyFormat("enum X\n" 12442 " {\n" 12443 " Y = 0, // testing\n" 12444 " }\n", 12445 WhitesmithsBraceStyle); 12446 12447 verifyFormat("enum X\n" 12448 " {\n" 12449 " Y = 0\n" 12450 " }\n", 12451 WhitesmithsBraceStyle); 12452 verifyFormat("enum X\n" 12453 " {\n" 12454 " Y = 0,\n" 12455 " Z = 1\n" 12456 " };\n", 12457 WhitesmithsBraceStyle); 12458 12459 verifyFormat("@interface BSApplicationController ()\n" 12460 " {\n" 12461 "@private\n" 12462 " id _extraIvar;\n" 12463 " }\n" 12464 "@end\n", 12465 WhitesmithsBraceStyle); 12466 12467 verifyFormat("#ifdef _DEBUG\n" 12468 "int foo(int i = 0)\n" 12469 "#else\n" 12470 "int foo(int i = 5)\n" 12471 "#endif\n" 12472 " {\n" 12473 " return i;\n" 12474 " }", 12475 WhitesmithsBraceStyle); 12476 12477 verifyFormat("void foo() {}\n" 12478 "void bar()\n" 12479 "#ifdef _DEBUG\n" 12480 " {\n" 12481 " foo();\n" 12482 " }\n" 12483 "#else\n" 12484 " {\n" 12485 " }\n" 12486 "#endif", 12487 WhitesmithsBraceStyle); 12488 12489 verifyFormat("void foobar()\n" 12490 " {\n" 12491 " int i = 5;\n" 12492 " }\n" 12493 "#ifdef _DEBUG\n" 12494 "void bar()\n" 12495 " {\n" 12496 " }\n" 12497 "#else\n" 12498 "void bar()\n" 12499 " {\n" 12500 " foobar();\n" 12501 " }\n" 12502 "#endif", 12503 WhitesmithsBraceStyle); 12504 12505 // This shouldn't affect ObjC blocks.. 12506 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 12507 " // ...\n" 12508 " int i;\n" 12509 "}];", 12510 WhitesmithsBraceStyle); 12511 verifyFormat("void (^block)(void) = ^{\n" 12512 " // ...\n" 12513 " int i;\n" 12514 "};", 12515 WhitesmithsBraceStyle); 12516 // .. or dict literals. 12517 verifyFormat("void f()\n" 12518 " {\n" 12519 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 12520 " }", 12521 WhitesmithsBraceStyle); 12522 12523 verifyFormat("int f()\n" 12524 " { // comment\n" 12525 " return 42;\n" 12526 " }", 12527 WhitesmithsBraceStyle); 12528 12529 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 12530 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 12531 FormatStyle::SIS_Always; 12532 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 12533 verifyFormat("void f(bool b)\n" 12534 " {\n" 12535 " if (b)\n" 12536 " {\n" 12537 " return;\n" 12538 " }\n" 12539 " }\n", 12540 BreakBeforeBraceShortIfs); 12541 verifyFormat("void f(bool b)\n" 12542 " {\n" 12543 " if (b) return;\n" 12544 " }\n", 12545 BreakBeforeBraceShortIfs); 12546 verifyFormat("void f(bool b)\n" 12547 " {\n" 12548 " while (b)\n" 12549 " {\n" 12550 " return;\n" 12551 " }\n" 12552 " }\n", 12553 BreakBeforeBraceShortIfs); 12554 } 12555 12556 TEST_F(FormatTest, GNUBraceBreaking) { 12557 FormatStyle GNUBraceStyle = getLLVMStyle(); 12558 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 12559 verifyFormat("namespace a\n" 12560 "{\n" 12561 "class A\n" 12562 "{\n" 12563 " void f()\n" 12564 " {\n" 12565 " int a;\n" 12566 " {\n" 12567 " int b;\n" 12568 " }\n" 12569 " if (true)\n" 12570 " {\n" 12571 " a();\n" 12572 " b();\n" 12573 " }\n" 12574 " }\n" 12575 " void g() { return; }\n" 12576 "}\n" 12577 "} // namespace a", 12578 GNUBraceStyle); 12579 12580 verifyFormat("void f()\n" 12581 "{\n" 12582 " if (true)\n" 12583 " {\n" 12584 " a();\n" 12585 " }\n" 12586 " else if (false)\n" 12587 " {\n" 12588 " b();\n" 12589 " }\n" 12590 " else\n" 12591 " {\n" 12592 " c();\n" 12593 " }\n" 12594 "}\n", 12595 GNUBraceStyle); 12596 12597 verifyFormat("void f()\n" 12598 "{\n" 12599 " for (int i = 0; i < 10; ++i)\n" 12600 " {\n" 12601 " a();\n" 12602 " }\n" 12603 " while (false)\n" 12604 " {\n" 12605 " b();\n" 12606 " }\n" 12607 " do\n" 12608 " {\n" 12609 " c();\n" 12610 " }\n" 12611 " while (false);\n" 12612 "}\n", 12613 GNUBraceStyle); 12614 12615 verifyFormat("void f(int a)\n" 12616 "{\n" 12617 " switch (a)\n" 12618 " {\n" 12619 " case 0:\n" 12620 " break;\n" 12621 " case 1:\n" 12622 " {\n" 12623 " break;\n" 12624 " }\n" 12625 " case 2:\n" 12626 " {\n" 12627 " }\n" 12628 " break;\n" 12629 " default:\n" 12630 " break;\n" 12631 " }\n" 12632 "}\n", 12633 GNUBraceStyle); 12634 12635 verifyFormat("enum X\n" 12636 "{\n" 12637 " Y = 0,\n" 12638 "}\n", 12639 GNUBraceStyle); 12640 12641 verifyFormat("@interface BSApplicationController ()\n" 12642 "{\n" 12643 "@private\n" 12644 " id _extraIvar;\n" 12645 "}\n" 12646 "@end\n", 12647 GNUBraceStyle); 12648 12649 verifyFormat("#ifdef _DEBUG\n" 12650 "int foo(int i = 0)\n" 12651 "#else\n" 12652 "int foo(int i = 5)\n" 12653 "#endif\n" 12654 "{\n" 12655 " return i;\n" 12656 "}", 12657 GNUBraceStyle); 12658 12659 verifyFormat("void foo() {}\n" 12660 "void bar()\n" 12661 "#ifdef _DEBUG\n" 12662 "{\n" 12663 " foo();\n" 12664 "}\n" 12665 "#else\n" 12666 "{\n" 12667 "}\n" 12668 "#endif", 12669 GNUBraceStyle); 12670 12671 verifyFormat("void foobar() { int i = 5; }\n" 12672 "#ifdef _DEBUG\n" 12673 "void bar() {}\n" 12674 "#else\n" 12675 "void bar() { foobar(); }\n" 12676 "#endif", 12677 GNUBraceStyle); 12678 } 12679 12680 TEST_F(FormatTest, WebKitBraceBreaking) { 12681 FormatStyle WebKitBraceStyle = getLLVMStyle(); 12682 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 12683 WebKitBraceStyle.FixNamespaceComments = false; 12684 verifyFormat("namespace a {\n" 12685 "class A {\n" 12686 " void f()\n" 12687 " {\n" 12688 " if (true) {\n" 12689 " a();\n" 12690 " b();\n" 12691 " }\n" 12692 " }\n" 12693 " void g() { return; }\n" 12694 "};\n" 12695 "enum E {\n" 12696 " A,\n" 12697 " // foo\n" 12698 " B,\n" 12699 " C\n" 12700 "};\n" 12701 "struct B {\n" 12702 " int x;\n" 12703 "};\n" 12704 "}\n", 12705 WebKitBraceStyle); 12706 verifyFormat("struct S {\n" 12707 " int Type;\n" 12708 " union {\n" 12709 " int x;\n" 12710 " double y;\n" 12711 " } Value;\n" 12712 " class C {\n" 12713 " MyFavoriteType Value;\n" 12714 " } Class;\n" 12715 "};\n", 12716 WebKitBraceStyle); 12717 } 12718 12719 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 12720 verifyFormat("void f() {\n" 12721 " try {\n" 12722 " } catch (const Exception &e) {\n" 12723 " }\n" 12724 "}\n", 12725 getLLVMStyle()); 12726 } 12727 12728 TEST_F(FormatTest, UnderstandsPragmas) { 12729 verifyFormat("#pragma omp reduction(| : var)"); 12730 verifyFormat("#pragma omp reduction(+ : var)"); 12731 12732 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 12733 "(including parentheses).", 12734 format("#pragma mark Any non-hyphenated or hyphenated string " 12735 "(including parentheses).")); 12736 } 12737 12738 TEST_F(FormatTest, UnderstandPragmaOption) { 12739 verifyFormat("#pragma option -C -A"); 12740 12741 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 12742 } 12743 12744 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 12745 FormatStyle Style = getLLVMStyle(); 12746 Style.ColumnLimit = 20; 12747 12748 // See PR41213 12749 EXPECT_EQ("/*\n" 12750 " *\t9012345\n" 12751 " * /8901\n" 12752 " */", 12753 format("/*\n" 12754 " *\t9012345 /8901\n" 12755 " */", 12756 Style)); 12757 EXPECT_EQ("/*\n" 12758 " *345678\n" 12759 " *\t/8901\n" 12760 " */", 12761 format("/*\n" 12762 " *345678\t/8901\n" 12763 " */", 12764 Style)); 12765 12766 verifyFormat("int a; // the\n" 12767 " // comment", 12768 Style); 12769 EXPECT_EQ("int a; /* first line\n" 12770 " * second\n" 12771 " * line third\n" 12772 " * line\n" 12773 " */", 12774 format("int a; /* first line\n" 12775 " * second\n" 12776 " * line third\n" 12777 " * line\n" 12778 " */", 12779 Style)); 12780 EXPECT_EQ("int a; // first line\n" 12781 " // second\n" 12782 " // line third\n" 12783 " // line", 12784 format("int a; // first line\n" 12785 " // second line\n" 12786 " // third line", 12787 Style)); 12788 12789 Style.PenaltyExcessCharacter = 90; 12790 verifyFormat("int a; // the comment", Style); 12791 EXPECT_EQ("int a; // the comment\n" 12792 " // aaa", 12793 format("int a; // the comment aaa", Style)); 12794 EXPECT_EQ("int a; /* first line\n" 12795 " * second line\n" 12796 " * third line\n" 12797 " */", 12798 format("int a; /* first line\n" 12799 " * second line\n" 12800 " * third line\n" 12801 " */", 12802 Style)); 12803 EXPECT_EQ("int a; // first line\n" 12804 " // second line\n" 12805 " // third line", 12806 format("int a; // first line\n" 12807 " // second line\n" 12808 " // third line", 12809 Style)); 12810 // FIXME: Investigate why this is not getting the same layout as the test 12811 // above. 12812 EXPECT_EQ("int a; /* first line\n" 12813 " * second line\n" 12814 " * third line\n" 12815 " */", 12816 format("int a; /* first line second line third line" 12817 "\n*/", 12818 Style)); 12819 12820 EXPECT_EQ("// foo bar baz bazfoo\n" 12821 "// foo bar foo bar\n", 12822 format("// foo bar baz bazfoo\n" 12823 "// foo bar foo bar\n", 12824 Style)); 12825 EXPECT_EQ("// foo bar baz bazfoo\n" 12826 "// foo bar foo bar\n", 12827 format("// foo bar baz bazfoo\n" 12828 "// foo bar foo bar\n", 12829 Style)); 12830 12831 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 12832 // next one. 12833 EXPECT_EQ("// foo bar baz bazfoo\n" 12834 "// bar foo bar\n", 12835 format("// foo bar baz bazfoo bar\n" 12836 "// foo bar\n", 12837 Style)); 12838 12839 EXPECT_EQ("// foo bar baz bazfoo\n" 12840 "// foo bar baz bazfoo\n" 12841 "// bar foo bar\n", 12842 format("// foo bar baz bazfoo\n" 12843 "// foo bar baz bazfoo bar\n" 12844 "// foo bar\n", 12845 Style)); 12846 12847 EXPECT_EQ("// foo bar baz bazfoo\n" 12848 "// foo bar baz bazfoo\n" 12849 "// bar foo bar\n", 12850 format("// foo bar baz bazfoo\n" 12851 "// foo bar baz bazfoo bar\n" 12852 "// foo bar\n", 12853 Style)); 12854 12855 // Make sure we do not keep protruding characters if strict mode reflow is 12856 // cheaper than keeping protruding characters. 12857 Style.ColumnLimit = 21; 12858 EXPECT_EQ( 12859 "// foo foo foo foo\n" 12860 "// foo foo foo foo\n" 12861 "// foo foo foo foo\n", 12862 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 12863 12864 EXPECT_EQ("int a = /* long block\n" 12865 " comment */\n" 12866 " 42;", 12867 format("int a = /* long block comment */ 42;", Style)); 12868 } 12869 12870 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 12871 for (size_t i = 1; i < Styles.size(); ++i) \ 12872 EXPECT_EQ(Styles[0], Styles[i]) \ 12873 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 12874 12875 TEST_F(FormatTest, GetsPredefinedStyleByName) { 12876 SmallVector<FormatStyle, 3> Styles; 12877 Styles.resize(3); 12878 12879 Styles[0] = getLLVMStyle(); 12880 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 12881 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 12882 EXPECT_ALL_STYLES_EQUAL(Styles); 12883 12884 Styles[0] = getGoogleStyle(); 12885 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 12886 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 12887 EXPECT_ALL_STYLES_EQUAL(Styles); 12888 12889 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12890 EXPECT_TRUE( 12891 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 12892 EXPECT_TRUE( 12893 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 12894 EXPECT_ALL_STYLES_EQUAL(Styles); 12895 12896 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 12897 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 12898 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 12899 EXPECT_ALL_STYLES_EQUAL(Styles); 12900 12901 Styles[0] = getMozillaStyle(); 12902 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 12903 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 12904 EXPECT_ALL_STYLES_EQUAL(Styles); 12905 12906 Styles[0] = getWebKitStyle(); 12907 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 12908 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 12909 EXPECT_ALL_STYLES_EQUAL(Styles); 12910 12911 Styles[0] = getGNUStyle(); 12912 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 12913 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 12914 EXPECT_ALL_STYLES_EQUAL(Styles); 12915 12916 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 12917 } 12918 12919 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 12920 SmallVector<FormatStyle, 8> Styles; 12921 Styles.resize(2); 12922 12923 Styles[0] = getGoogleStyle(); 12924 Styles[1] = getLLVMStyle(); 12925 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12926 EXPECT_ALL_STYLES_EQUAL(Styles); 12927 12928 Styles.resize(5); 12929 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12930 Styles[1] = getLLVMStyle(); 12931 Styles[1].Language = FormatStyle::LK_JavaScript; 12932 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12933 12934 Styles[2] = getLLVMStyle(); 12935 Styles[2].Language = FormatStyle::LK_JavaScript; 12936 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 12937 "BasedOnStyle: Google", 12938 &Styles[2]) 12939 .value()); 12940 12941 Styles[3] = getLLVMStyle(); 12942 Styles[3].Language = FormatStyle::LK_JavaScript; 12943 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 12944 "Language: JavaScript", 12945 &Styles[3]) 12946 .value()); 12947 12948 Styles[4] = getLLVMStyle(); 12949 Styles[4].Language = FormatStyle::LK_JavaScript; 12950 EXPECT_EQ(0, parseConfiguration("---\n" 12951 "BasedOnStyle: LLVM\n" 12952 "IndentWidth: 123\n" 12953 "---\n" 12954 "BasedOnStyle: Google\n" 12955 "Language: JavaScript", 12956 &Styles[4]) 12957 .value()); 12958 EXPECT_ALL_STYLES_EQUAL(Styles); 12959 } 12960 12961 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 12962 Style.FIELD = false; \ 12963 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 12964 EXPECT_TRUE(Style.FIELD); \ 12965 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 12966 EXPECT_FALSE(Style.FIELD); 12967 12968 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 12969 12970 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 12971 Style.STRUCT.FIELD = false; \ 12972 EXPECT_EQ(0, \ 12973 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 12974 .value()); \ 12975 EXPECT_TRUE(Style.STRUCT.FIELD); \ 12976 EXPECT_EQ(0, \ 12977 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 12978 .value()); \ 12979 EXPECT_FALSE(Style.STRUCT.FIELD); 12980 12981 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 12982 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 12983 12984 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 12985 EXPECT_NE(VALUE, Style.FIELD); \ 12986 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 12987 EXPECT_EQ(VALUE, Style.FIELD) 12988 12989 TEST_F(FormatTest, ParsesConfigurationBools) { 12990 FormatStyle Style = {}; 12991 Style.Language = FormatStyle::LK_Cpp; 12992 CHECK_PARSE_BOOL(AlignOperands); 12993 CHECK_PARSE_BOOL(AlignTrailingComments); 12994 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 12995 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 12996 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 12997 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 12998 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 12999 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 13000 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 13001 CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine); 13002 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 13003 CHECK_PARSE_BOOL(BinPackArguments); 13004 CHECK_PARSE_BOOL(BinPackParameters); 13005 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 13006 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 13007 CHECK_PARSE_BOOL(BreakStringLiterals); 13008 CHECK_PARSE_BOOL(CompactNamespaces); 13009 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 13010 CHECK_PARSE_BOOL(DeriveLineEnding); 13011 CHECK_PARSE_BOOL(DerivePointerAlignment); 13012 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 13013 CHECK_PARSE_BOOL(DisableFormat); 13014 CHECK_PARSE_BOOL(IndentCaseLabels); 13015 CHECK_PARSE_BOOL(IndentCaseBlocks); 13016 CHECK_PARSE_BOOL(IndentGotoLabels); 13017 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 13018 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 13019 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 13020 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 13021 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 13022 CHECK_PARSE_BOOL(ReflowComments); 13023 CHECK_PARSE_BOOL(SortIncludes); 13024 CHECK_PARSE_BOOL(SortUsingDeclarations); 13025 CHECK_PARSE_BOOL(SpacesInParentheses); 13026 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 13027 CHECK_PARSE_BOOL(SpacesInAngles); 13028 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 13029 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 13030 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 13031 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 13032 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 13033 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 13034 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 13035 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 13036 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 13037 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 13038 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 13039 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 13040 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 13041 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 13042 CHECK_PARSE_BOOL(UseCRLF); 13043 13044 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 13045 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 13046 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 13047 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 13048 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 13049 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 13050 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 13051 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 13052 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 13053 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 13054 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 13055 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody); 13056 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 13057 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 13058 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 13059 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 13060 } 13061 13062 #undef CHECK_PARSE_BOOL 13063 13064 TEST_F(FormatTest, ParsesConfiguration) { 13065 FormatStyle Style = {}; 13066 Style.Language = FormatStyle::LK_Cpp; 13067 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 13068 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 13069 ConstructorInitializerIndentWidth, 1234u); 13070 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 13071 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 13072 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 13073 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 13074 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 13075 PenaltyBreakBeforeFirstCallParameter, 1234u); 13076 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 13077 PenaltyBreakTemplateDeclaration, 1234u); 13078 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 13079 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 13080 PenaltyReturnTypeOnItsOwnLine, 1234u); 13081 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 13082 SpacesBeforeTrailingComments, 1234u); 13083 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 13084 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 13085 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 13086 13087 Style.PointerAlignment = FormatStyle::PAS_Middle; 13088 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 13089 FormatStyle::PAS_Left); 13090 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 13091 FormatStyle::PAS_Right); 13092 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 13093 FormatStyle::PAS_Middle); 13094 // For backward compatibility: 13095 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 13096 FormatStyle::PAS_Left); 13097 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 13098 FormatStyle::PAS_Right); 13099 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 13100 FormatStyle::PAS_Middle); 13101 13102 Style.Standard = FormatStyle::LS_Auto; 13103 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 13104 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 13105 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 13106 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 13107 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 13108 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 13109 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 13110 // Legacy aliases: 13111 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 13112 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 13113 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 13114 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 13115 13116 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 13117 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 13118 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 13119 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 13120 FormatStyle::BOS_None); 13121 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 13122 FormatStyle::BOS_All); 13123 // For backward compatibility: 13124 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 13125 FormatStyle::BOS_None); 13126 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 13127 FormatStyle::BOS_All); 13128 13129 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 13130 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 13131 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 13132 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 13133 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 13134 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 13135 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 13136 // For backward compatibility: 13137 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 13138 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 13139 13140 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 13141 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 13142 FormatStyle::BILS_BeforeComma); 13143 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 13144 FormatStyle::BILS_AfterColon); 13145 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 13146 FormatStyle::BILS_BeforeColon); 13147 // For backward compatibility: 13148 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 13149 FormatStyle::BILS_BeforeComma); 13150 13151 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13152 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 13153 FormatStyle::BAS_Align); 13154 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 13155 FormatStyle::BAS_DontAlign); 13156 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 13157 FormatStyle::BAS_AlwaysBreak); 13158 // For backward compatibility: 13159 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 13160 FormatStyle::BAS_DontAlign); 13161 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 13162 FormatStyle::BAS_Align); 13163 13164 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 13165 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 13166 FormatStyle::ENAS_DontAlign); 13167 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 13168 FormatStyle::ENAS_Left); 13169 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 13170 FormatStyle::ENAS_Right); 13171 // For backward compatibility: 13172 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 13173 FormatStyle::ENAS_Left); 13174 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 13175 FormatStyle::ENAS_Right); 13176 13177 Style.UseTab = FormatStyle::UT_ForIndentation; 13178 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 13179 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 13180 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 13181 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 13182 FormatStyle::UT_ForContinuationAndIndentation); 13183 CHECK_PARSE("UseTab: AlignWithSpaces", UseTab, 13184 FormatStyle::UT_AlignWithSpaces); 13185 // For backward compatibility: 13186 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 13187 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 13188 13189 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 13190 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 13191 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 13192 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 13193 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 13194 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 13195 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 13196 // For backward compatibility: 13197 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 13198 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 13199 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 13200 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 13201 13202 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 13203 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 13204 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 13205 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 13206 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 13207 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 13208 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 13209 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 13210 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 13211 // For backward compatibility: 13212 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 13213 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 13214 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 13215 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 13216 13217 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 13218 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 13219 FormatStyle::SBPO_Never); 13220 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 13221 FormatStyle::SBPO_Always); 13222 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 13223 FormatStyle::SBPO_ControlStatements); 13224 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 13225 FormatStyle::SBPO_NonEmptyParentheses); 13226 // For backward compatibility: 13227 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 13228 FormatStyle::SBPO_Never); 13229 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 13230 FormatStyle::SBPO_ControlStatements); 13231 13232 Style.ColumnLimit = 123; 13233 FormatStyle BaseStyle = getLLVMStyle(); 13234 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 13235 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 13236 13237 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 13238 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 13239 FormatStyle::BS_Attach); 13240 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 13241 FormatStyle::BS_Linux); 13242 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 13243 FormatStyle::BS_Mozilla); 13244 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 13245 FormatStyle::BS_Stroustrup); 13246 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 13247 FormatStyle::BS_Allman); 13248 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 13249 FormatStyle::BS_Whitesmiths); 13250 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 13251 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 13252 FormatStyle::BS_WebKit); 13253 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 13254 FormatStyle::BS_Custom); 13255 13256 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 13257 CHECK_PARSE("BraceWrapping:\n" 13258 " AfterControlStatement: MultiLine", 13259 BraceWrapping.AfterControlStatement, 13260 FormatStyle::BWACS_MultiLine); 13261 CHECK_PARSE("BraceWrapping:\n" 13262 " AfterControlStatement: Always", 13263 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 13264 CHECK_PARSE("BraceWrapping:\n" 13265 " AfterControlStatement: Never", 13266 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 13267 // For backward compatibility: 13268 CHECK_PARSE("BraceWrapping:\n" 13269 " AfterControlStatement: true", 13270 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 13271 CHECK_PARSE("BraceWrapping:\n" 13272 " AfterControlStatement: false", 13273 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 13274 13275 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 13276 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 13277 FormatStyle::RTBS_None); 13278 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 13279 FormatStyle::RTBS_All); 13280 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 13281 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 13282 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 13283 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 13284 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 13285 AlwaysBreakAfterReturnType, 13286 FormatStyle::RTBS_TopLevelDefinitions); 13287 13288 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 13289 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 13290 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 13291 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 13292 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 13293 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 13294 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 13295 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 13296 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 13297 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 13298 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 13299 13300 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 13301 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 13302 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 13303 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 13304 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 13305 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 13306 AlwaysBreakAfterDefinitionReturnType, 13307 FormatStyle::DRTBS_TopLevel); 13308 13309 Style.NamespaceIndentation = FormatStyle::NI_All; 13310 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 13311 FormatStyle::NI_None); 13312 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 13313 FormatStyle::NI_Inner); 13314 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 13315 FormatStyle::NI_All); 13316 13317 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 13318 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 13319 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 13320 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 13321 AllowShortIfStatementsOnASingleLine, 13322 FormatStyle::SIS_WithoutElse); 13323 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 13324 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 13325 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 13326 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 13327 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 13328 AllowShortIfStatementsOnASingleLine, 13329 FormatStyle::SIS_WithoutElse); 13330 13331 // FIXME: This is required because parsing a configuration simply overwrites 13332 // the first N elements of the list instead of resetting it. 13333 Style.ForEachMacros.clear(); 13334 std::vector<std::string> BoostForeach; 13335 BoostForeach.push_back("BOOST_FOREACH"); 13336 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 13337 std::vector<std::string> BoostAndQForeach; 13338 BoostAndQForeach.push_back("BOOST_FOREACH"); 13339 BoostAndQForeach.push_back("Q_FOREACH"); 13340 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 13341 BoostAndQForeach); 13342 13343 Style.StatementMacros.clear(); 13344 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 13345 std::vector<std::string>{"QUNUSED"}); 13346 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 13347 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 13348 13349 Style.NamespaceMacros.clear(); 13350 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 13351 std::vector<std::string>{"TESTSUITE"}); 13352 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 13353 std::vector<std::string>({"TESTSUITE", "SUITE"})); 13354 13355 Style.IncludeStyle.IncludeCategories.clear(); 13356 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 13357 {"abc/.*", 2, 0}, {".*", 1, 0}}; 13358 CHECK_PARSE("IncludeCategories:\n" 13359 " - Regex: abc/.*\n" 13360 " Priority: 2\n" 13361 " - Regex: .*\n" 13362 " Priority: 1", 13363 IncludeStyle.IncludeCategories, ExpectedCategories); 13364 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 13365 "abc$"); 13366 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 13367 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 13368 13369 Style.RawStringFormats.clear(); 13370 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 13371 { 13372 FormatStyle::LK_TextProto, 13373 {"pb", "proto"}, 13374 {"PARSE_TEXT_PROTO"}, 13375 /*CanonicalDelimiter=*/"", 13376 "llvm", 13377 }, 13378 { 13379 FormatStyle::LK_Cpp, 13380 {"cc", "cpp"}, 13381 {"C_CODEBLOCK", "CPPEVAL"}, 13382 /*CanonicalDelimiter=*/"cc", 13383 /*BasedOnStyle=*/"", 13384 }, 13385 }; 13386 13387 CHECK_PARSE("RawStringFormats:\n" 13388 " - Language: TextProto\n" 13389 " Delimiters:\n" 13390 " - 'pb'\n" 13391 " - 'proto'\n" 13392 " EnclosingFunctions:\n" 13393 " - 'PARSE_TEXT_PROTO'\n" 13394 " BasedOnStyle: llvm\n" 13395 " - Language: Cpp\n" 13396 " Delimiters:\n" 13397 " - 'cc'\n" 13398 " - 'cpp'\n" 13399 " EnclosingFunctions:\n" 13400 " - 'C_CODEBLOCK'\n" 13401 " - 'CPPEVAL'\n" 13402 " CanonicalDelimiter: 'cc'", 13403 RawStringFormats, ExpectedRawStringFormats); 13404 } 13405 13406 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 13407 FormatStyle Style = {}; 13408 Style.Language = FormatStyle::LK_Cpp; 13409 CHECK_PARSE("Language: Cpp\n" 13410 "IndentWidth: 12", 13411 IndentWidth, 12u); 13412 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 13413 "IndentWidth: 34", 13414 &Style), 13415 ParseError::Unsuitable); 13416 FormatStyle BinPackedTCS = {}; 13417 BinPackedTCS.Language = FormatStyle::LK_JavaScript; 13418 EXPECT_EQ(parseConfiguration("BinPackArguments: true\n" 13419 "InsertTrailingCommas: Wrapped", 13420 &BinPackedTCS), 13421 ParseError::BinPackTrailingCommaConflict); 13422 EXPECT_EQ(12u, Style.IndentWidth); 13423 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 13424 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 13425 13426 Style.Language = FormatStyle::LK_JavaScript; 13427 CHECK_PARSE("Language: JavaScript\n" 13428 "IndentWidth: 12", 13429 IndentWidth, 12u); 13430 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 13431 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 13432 "IndentWidth: 34", 13433 &Style), 13434 ParseError::Unsuitable); 13435 EXPECT_EQ(23u, Style.IndentWidth); 13436 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 13437 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 13438 13439 CHECK_PARSE("BasedOnStyle: LLVM\n" 13440 "IndentWidth: 67", 13441 IndentWidth, 67u); 13442 13443 CHECK_PARSE("---\n" 13444 "Language: JavaScript\n" 13445 "IndentWidth: 12\n" 13446 "---\n" 13447 "Language: Cpp\n" 13448 "IndentWidth: 34\n" 13449 "...\n", 13450 IndentWidth, 12u); 13451 13452 Style.Language = FormatStyle::LK_Cpp; 13453 CHECK_PARSE("---\n" 13454 "Language: JavaScript\n" 13455 "IndentWidth: 12\n" 13456 "---\n" 13457 "Language: Cpp\n" 13458 "IndentWidth: 34\n" 13459 "...\n", 13460 IndentWidth, 34u); 13461 CHECK_PARSE("---\n" 13462 "IndentWidth: 78\n" 13463 "---\n" 13464 "Language: JavaScript\n" 13465 "IndentWidth: 56\n" 13466 "...\n", 13467 IndentWidth, 78u); 13468 13469 Style.ColumnLimit = 123; 13470 Style.IndentWidth = 234; 13471 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 13472 Style.TabWidth = 345; 13473 EXPECT_FALSE(parseConfiguration("---\n" 13474 "IndentWidth: 456\n" 13475 "BreakBeforeBraces: Allman\n" 13476 "---\n" 13477 "Language: JavaScript\n" 13478 "IndentWidth: 111\n" 13479 "TabWidth: 111\n" 13480 "---\n" 13481 "Language: Cpp\n" 13482 "BreakBeforeBraces: Stroustrup\n" 13483 "TabWidth: 789\n" 13484 "...\n", 13485 &Style)); 13486 EXPECT_EQ(123u, Style.ColumnLimit); 13487 EXPECT_EQ(456u, Style.IndentWidth); 13488 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 13489 EXPECT_EQ(789u, Style.TabWidth); 13490 13491 EXPECT_EQ(parseConfiguration("---\n" 13492 "Language: JavaScript\n" 13493 "IndentWidth: 56\n" 13494 "---\n" 13495 "IndentWidth: 78\n" 13496 "...\n", 13497 &Style), 13498 ParseError::Error); 13499 EXPECT_EQ(parseConfiguration("---\n" 13500 "Language: JavaScript\n" 13501 "IndentWidth: 56\n" 13502 "---\n" 13503 "Language: JavaScript\n" 13504 "IndentWidth: 78\n" 13505 "...\n", 13506 &Style), 13507 ParseError::Error); 13508 13509 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 13510 } 13511 13512 #undef CHECK_PARSE 13513 13514 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 13515 FormatStyle Style = {}; 13516 Style.Language = FormatStyle::LK_JavaScript; 13517 Style.BreakBeforeTernaryOperators = true; 13518 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 13519 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 13520 13521 Style.BreakBeforeTernaryOperators = true; 13522 EXPECT_EQ(0, parseConfiguration("---\n" 13523 "BasedOnStyle: Google\n" 13524 "---\n" 13525 "Language: JavaScript\n" 13526 "IndentWidth: 76\n" 13527 "...\n", 13528 &Style) 13529 .value()); 13530 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 13531 EXPECT_EQ(76u, Style.IndentWidth); 13532 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 13533 } 13534 13535 TEST_F(FormatTest, ConfigurationRoundTripTest) { 13536 FormatStyle Style = getLLVMStyle(); 13537 std::string YAML = configurationAsText(Style); 13538 FormatStyle ParsedStyle = {}; 13539 ParsedStyle.Language = FormatStyle::LK_Cpp; 13540 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 13541 EXPECT_EQ(Style, ParsedStyle); 13542 } 13543 13544 TEST_F(FormatTest, WorksFor8bitEncodings) { 13545 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 13546 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 13547 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 13548 "\"\xef\xee\xf0\xf3...\"", 13549 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 13550 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 13551 "\xef\xee\xf0\xf3...\"", 13552 getLLVMStyleWithColumns(12))); 13553 } 13554 13555 TEST_F(FormatTest, HandlesUTF8BOM) { 13556 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 13557 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 13558 format("\xef\xbb\xbf#include <iostream>")); 13559 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 13560 format("\xef\xbb\xbf\n#include <iostream>")); 13561 } 13562 13563 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 13564 #if !defined(_MSC_VER) 13565 13566 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 13567 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 13568 getLLVMStyleWithColumns(35)); 13569 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 13570 getLLVMStyleWithColumns(31)); 13571 verifyFormat("// Однажды в студёную зимнюю пору...", 13572 getLLVMStyleWithColumns(36)); 13573 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 13574 verifyFormat("/* Однажды в студёную зимнюю пору... */", 13575 getLLVMStyleWithColumns(39)); 13576 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 13577 getLLVMStyleWithColumns(35)); 13578 } 13579 13580 TEST_F(FormatTest, SplitsUTF8Strings) { 13581 // Non-printable characters' width is currently considered to be the length in 13582 // bytes in UTF8. The characters can be displayed in very different manner 13583 // (zero-width, single width with a substitution glyph, expanded to their code 13584 // (e.g. "<8d>"), so there's no single correct way to handle them. 13585 EXPECT_EQ("\"aaaaÄ\"\n" 13586 "\"\xc2\x8d\";", 13587 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13588 EXPECT_EQ("\"aaaaaaaÄ\"\n" 13589 "\"\xc2\x8d\";", 13590 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13591 EXPECT_EQ("\"Однажды, в \"\n" 13592 "\"студёную \"\n" 13593 "\"зимнюю \"\n" 13594 "\"пору,\"", 13595 format("\"Однажды, в студёную зимнюю пору,\"", 13596 getLLVMStyleWithColumns(13))); 13597 EXPECT_EQ( 13598 "\"一 二 三 \"\n" 13599 "\"四 五六 \"\n" 13600 "\"七 八 九 \"\n" 13601 "\"十\"", 13602 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 13603 EXPECT_EQ("\"一\t\"\n" 13604 "\"二 \t\"\n" 13605 "\"三 四 \"\n" 13606 "\"五\t\"\n" 13607 "\"六 \t\"\n" 13608 "\"七 \"\n" 13609 "\"八九十\tqq\"", 13610 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 13611 getLLVMStyleWithColumns(11))); 13612 13613 // UTF8 character in an escape sequence. 13614 EXPECT_EQ("\"aaaaaa\"\n" 13615 "\"\\\xC2\x8D\"", 13616 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 13617 } 13618 13619 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 13620 EXPECT_EQ("const char *sssss =\n" 13621 " \"一二三四五六七八\\\n" 13622 " 九 十\";", 13623 format("const char *sssss = \"一二三四五六七八\\\n" 13624 " 九 十\";", 13625 getLLVMStyleWithColumns(30))); 13626 } 13627 13628 TEST_F(FormatTest, SplitsUTF8LineComments) { 13629 EXPECT_EQ("// aaaaÄ\xc2\x8d", 13630 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 13631 EXPECT_EQ("// Я из лесу\n" 13632 "// вышел; был\n" 13633 "// сильный\n" 13634 "// мороз.", 13635 format("// Я из лесу вышел; был сильный мороз.", 13636 getLLVMStyleWithColumns(13))); 13637 EXPECT_EQ("// 一二三\n" 13638 "// 四五六七\n" 13639 "// 八 九\n" 13640 "// 十", 13641 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 13642 } 13643 13644 TEST_F(FormatTest, SplitsUTF8BlockComments) { 13645 EXPECT_EQ("/* Гляжу,\n" 13646 " * поднимается\n" 13647 " * медленно в\n" 13648 " * гору\n" 13649 " * Лошадка,\n" 13650 " * везущая\n" 13651 " * хворосту\n" 13652 " * воз. */", 13653 format("/* Гляжу, поднимается медленно в гору\n" 13654 " * Лошадка, везущая хворосту воз. */", 13655 getLLVMStyleWithColumns(13))); 13656 EXPECT_EQ( 13657 "/* 一二三\n" 13658 " * 四五六七\n" 13659 " * 八 九\n" 13660 " * 十 */", 13661 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 13662 EXPECT_EQ("/* \n" 13663 " * \n" 13664 " * - */", 13665 format("/* - */", getLLVMStyleWithColumns(12))); 13666 } 13667 13668 #endif // _MSC_VER 13669 13670 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 13671 FormatStyle Style = getLLVMStyle(); 13672 13673 Style.ConstructorInitializerIndentWidth = 4; 13674 verifyFormat( 13675 "SomeClass::Constructor()\n" 13676 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13677 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13678 Style); 13679 13680 Style.ConstructorInitializerIndentWidth = 2; 13681 verifyFormat( 13682 "SomeClass::Constructor()\n" 13683 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13684 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13685 Style); 13686 13687 Style.ConstructorInitializerIndentWidth = 0; 13688 verifyFormat( 13689 "SomeClass::Constructor()\n" 13690 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13691 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13692 Style); 13693 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13694 verifyFormat( 13695 "SomeLongTemplateVariableName<\n" 13696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 13697 Style); 13698 verifyFormat("bool smaller = 1 < " 13699 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 13700 " " 13701 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 13702 Style); 13703 13704 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 13705 verifyFormat("SomeClass::Constructor() :\n" 13706 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 13707 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 13708 Style); 13709 } 13710 13711 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 13712 FormatStyle Style = getLLVMStyle(); 13713 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 13714 Style.ConstructorInitializerIndentWidth = 4; 13715 verifyFormat("SomeClass::Constructor()\n" 13716 " : a(a)\n" 13717 " , b(b)\n" 13718 " , c(c) {}", 13719 Style); 13720 verifyFormat("SomeClass::Constructor()\n" 13721 " : a(a) {}", 13722 Style); 13723 13724 Style.ColumnLimit = 0; 13725 verifyFormat("SomeClass::Constructor()\n" 13726 " : a(a) {}", 13727 Style); 13728 verifyFormat("SomeClass::Constructor() noexcept\n" 13729 " : a(a) {}", 13730 Style); 13731 verifyFormat("SomeClass::Constructor()\n" 13732 " : a(a)\n" 13733 " , b(b)\n" 13734 " , c(c) {}", 13735 Style); 13736 verifyFormat("SomeClass::Constructor()\n" 13737 " : a(a) {\n" 13738 " foo();\n" 13739 " bar();\n" 13740 "}", 13741 Style); 13742 13743 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 13744 verifyFormat("SomeClass::Constructor()\n" 13745 " : a(a)\n" 13746 " , b(b)\n" 13747 " , c(c) {\n}", 13748 Style); 13749 verifyFormat("SomeClass::Constructor()\n" 13750 " : a(a) {\n}", 13751 Style); 13752 13753 Style.ColumnLimit = 80; 13754 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 13755 Style.ConstructorInitializerIndentWidth = 2; 13756 verifyFormat("SomeClass::Constructor()\n" 13757 " : a(a)\n" 13758 " , b(b)\n" 13759 " , c(c) {}", 13760 Style); 13761 13762 Style.ConstructorInitializerIndentWidth = 0; 13763 verifyFormat("SomeClass::Constructor()\n" 13764 ": a(a)\n" 13765 ", b(b)\n" 13766 ", c(c) {}", 13767 Style); 13768 13769 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 13770 Style.ConstructorInitializerIndentWidth = 4; 13771 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 13772 verifyFormat( 13773 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 13774 Style); 13775 verifyFormat( 13776 "SomeClass::Constructor()\n" 13777 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 13778 Style); 13779 Style.ConstructorInitializerIndentWidth = 4; 13780 Style.ColumnLimit = 60; 13781 verifyFormat("SomeClass::Constructor()\n" 13782 " : aaaaaaaa(aaaaaaaa)\n" 13783 " , aaaaaaaa(aaaaaaaa)\n" 13784 " , aaaaaaaa(aaaaaaaa) {}", 13785 Style); 13786 } 13787 13788 TEST_F(FormatTest, Destructors) { 13789 verifyFormat("void F(int &i) { i.~int(); }"); 13790 verifyFormat("void F(int &i) { i->~int(); }"); 13791 } 13792 13793 TEST_F(FormatTest, FormatsWithWebKitStyle) { 13794 FormatStyle Style = getWebKitStyle(); 13795 13796 // Don't indent in outer namespaces. 13797 verifyFormat("namespace outer {\n" 13798 "int i;\n" 13799 "namespace inner {\n" 13800 " int i;\n" 13801 "} // namespace inner\n" 13802 "} // namespace outer\n" 13803 "namespace other_outer {\n" 13804 "int i;\n" 13805 "}", 13806 Style); 13807 13808 // Don't indent case labels. 13809 verifyFormat("switch (variable) {\n" 13810 "case 1:\n" 13811 "case 2:\n" 13812 " doSomething();\n" 13813 " break;\n" 13814 "default:\n" 13815 " ++variable;\n" 13816 "}", 13817 Style); 13818 13819 // Wrap before binary operators. 13820 EXPECT_EQ("void f()\n" 13821 "{\n" 13822 " if (aaaaaaaaaaaaaaaa\n" 13823 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 13824 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13825 " return;\n" 13826 "}", 13827 format("void f() {\n" 13828 "if (aaaaaaaaaaaaaaaa\n" 13829 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 13830 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13831 "return;\n" 13832 "}", 13833 Style)); 13834 13835 // Allow functions on a single line. 13836 verifyFormat("void f() { return; }", Style); 13837 13838 // Allow empty blocks on a single line and insert a space in empty blocks. 13839 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 13840 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 13841 // However, don't merge non-empty short loops. 13842 EXPECT_EQ("while (true) {\n" 13843 " continue;\n" 13844 "}", 13845 format("while (true) { continue; }", Style)); 13846 13847 // Constructor initializers are formatted one per line with the "," on the 13848 // new line. 13849 verifyFormat("Constructor()\n" 13850 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 13851 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 13852 " aaaaaaaaaaaaaa)\n" 13853 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 13854 "{\n" 13855 "}", 13856 Style); 13857 verifyFormat("SomeClass::Constructor()\n" 13858 " : a(a)\n" 13859 "{\n" 13860 "}", 13861 Style); 13862 EXPECT_EQ("SomeClass::Constructor()\n" 13863 " : a(a)\n" 13864 "{\n" 13865 "}", 13866 format("SomeClass::Constructor():a(a){}", Style)); 13867 verifyFormat("SomeClass::Constructor()\n" 13868 " : a(a)\n" 13869 " , b(b)\n" 13870 " , c(c)\n" 13871 "{\n" 13872 "}", 13873 Style); 13874 verifyFormat("SomeClass::Constructor()\n" 13875 " : a(a)\n" 13876 "{\n" 13877 " foo();\n" 13878 " bar();\n" 13879 "}", 13880 Style); 13881 13882 // Access specifiers should be aligned left. 13883 verifyFormat("class C {\n" 13884 "public:\n" 13885 " int i;\n" 13886 "};", 13887 Style); 13888 13889 // Do not align comments. 13890 verifyFormat("int a; // Do not\n" 13891 "double b; // align comments.", 13892 Style); 13893 13894 // Do not align operands. 13895 EXPECT_EQ("ASSERT(aaaa\n" 13896 " || bbbb);", 13897 format("ASSERT ( aaaa\n||bbbb);", Style)); 13898 13899 // Accept input's line breaks. 13900 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 13901 " || bbbbbbbbbbbbbbb) {\n" 13902 " i++;\n" 13903 "}", 13904 format("if (aaaaaaaaaaaaaaa\n" 13905 "|| bbbbbbbbbbbbbbb) { i++; }", 13906 Style)); 13907 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 13908 " i++;\n" 13909 "}", 13910 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 13911 13912 // Don't automatically break all macro definitions (llvm.org/PR17842). 13913 verifyFormat("#define aNumber 10", Style); 13914 // However, generally keep the line breaks that the user authored. 13915 EXPECT_EQ("#define aNumber \\\n" 13916 " 10", 13917 format("#define aNumber \\\n" 13918 " 10", 13919 Style)); 13920 13921 // Keep empty and one-element array literals on a single line. 13922 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 13923 " copyItems:YES];", 13924 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 13925 "copyItems:YES];", 13926 Style)); 13927 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 13928 " copyItems:YES];", 13929 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 13930 " copyItems:YES];", 13931 Style)); 13932 // FIXME: This does not seem right, there should be more indentation before 13933 // the array literal's entries. Nested blocks have the same problem. 13934 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13935 " @\"a\",\n" 13936 " @\"a\"\n" 13937 "]\n" 13938 " copyItems:YES];", 13939 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13940 " @\"a\",\n" 13941 " @\"a\"\n" 13942 " ]\n" 13943 " copyItems:YES];", 13944 Style)); 13945 EXPECT_EQ( 13946 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13947 " copyItems:YES];", 13948 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13949 " copyItems:YES];", 13950 Style)); 13951 13952 verifyFormat("[self.a b:c c:d];", Style); 13953 EXPECT_EQ("[self.a b:c\n" 13954 " c:d];", 13955 format("[self.a b:c\n" 13956 "c:d];", 13957 Style)); 13958 } 13959 13960 TEST_F(FormatTest, FormatsLambdas) { 13961 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 13962 verifyFormat( 13963 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 13964 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 13965 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 13966 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 13967 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 13968 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 13969 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 13970 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 13971 verifyFormat("int x = f(*+[] {});"); 13972 verifyFormat("void f() {\n" 13973 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 13974 "}\n"); 13975 verifyFormat("void f() {\n" 13976 " other(x.begin(), //\n" 13977 " x.end(), //\n" 13978 " [&](int, int) { return 1; });\n" 13979 "}\n"); 13980 verifyFormat("void f() {\n" 13981 " other.other.other.other.other(\n" 13982 " x.begin(), x.end(),\n" 13983 " [something, rather](int, int, int, int, int, int, int) { " 13984 "return 1; });\n" 13985 "}\n"); 13986 verifyFormat( 13987 "void f() {\n" 13988 " other.other.other.other.other(\n" 13989 " x.begin(), x.end(),\n" 13990 " [something, rather](int, int, int, int, int, int, int) {\n" 13991 " //\n" 13992 " });\n" 13993 "}\n"); 13994 verifyFormat("SomeFunction([]() { // A cool function...\n" 13995 " return 43;\n" 13996 "});"); 13997 EXPECT_EQ("SomeFunction([]() {\n" 13998 "#define A a\n" 13999 " return 43;\n" 14000 "});", 14001 format("SomeFunction([](){\n" 14002 "#define A a\n" 14003 "return 43;\n" 14004 "});")); 14005 verifyFormat("void f() {\n" 14006 " SomeFunction([](decltype(x), A *a) {});\n" 14007 "}"); 14008 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14009 " [](const aaaaaaaaaa &a) { return a; });"); 14010 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 14011 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 14012 "});"); 14013 verifyFormat("Constructor()\n" 14014 " : Field([] { // comment\n" 14015 " int i;\n" 14016 " }) {}"); 14017 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 14018 " return some_parameter.size();\n" 14019 "};"); 14020 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 14021 " [](const string &s) { return s; };"); 14022 verifyFormat("int i = aaaaaa ? 1 //\n" 14023 " : [] {\n" 14024 " return 2; //\n" 14025 " }();"); 14026 verifyFormat("llvm::errs() << \"number of twos is \"\n" 14027 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 14028 " return x == 2; // force break\n" 14029 " });"); 14030 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14031 " [=](int iiiiiiiiiiii) {\n" 14032 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 14033 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 14034 " });", 14035 getLLVMStyleWithColumns(60)); 14036 verifyFormat("SomeFunction({[&] {\n" 14037 " // comment\n" 14038 " },\n" 14039 " [&] {\n" 14040 " // comment\n" 14041 " }});"); 14042 verifyFormat("SomeFunction({[&] {\n" 14043 " // comment\n" 14044 "}});"); 14045 verifyFormat( 14046 "virtual aaaaaaaaaaaaaaaa(\n" 14047 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 14048 " aaaaa aaaaaaaaa);"); 14049 14050 // Lambdas with return types. 14051 verifyFormat("int c = []() -> int { return 2; }();\n"); 14052 verifyFormat("int c = []() -> int * { return 2; }();\n"); 14053 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 14054 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 14055 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 14056 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 14057 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 14058 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 14059 verifyFormat("[a, a]() -> a<1> {};"); 14060 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 14061 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 14062 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 14063 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 14064 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 14065 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 14066 verifyFormat("[]() -> foo<!5> { return {}; };"); 14067 verifyFormat("[]() -> foo<~5> { return {}; };"); 14068 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 14069 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 14070 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 14071 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 14072 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 14073 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 14074 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 14075 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 14076 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 14077 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 14078 verifyFormat("namespace bar {\n" 14079 "// broken:\n" 14080 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 14081 "} // namespace bar"); 14082 verifyFormat("namespace bar {\n" 14083 "// broken:\n" 14084 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 14085 "} // namespace bar"); 14086 verifyFormat("namespace bar {\n" 14087 "// broken:\n" 14088 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 14089 "} // namespace bar"); 14090 verifyFormat("namespace bar {\n" 14091 "// broken:\n" 14092 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 14093 "} // namespace bar"); 14094 verifyFormat("namespace bar {\n" 14095 "// broken:\n" 14096 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 14097 "} // namespace bar"); 14098 verifyFormat("namespace bar {\n" 14099 "// broken:\n" 14100 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 14101 "} // namespace bar"); 14102 verifyFormat("namespace bar {\n" 14103 "// broken:\n" 14104 "auto foo{[]() -> foo<!5> { return {}; }};\n" 14105 "} // namespace bar"); 14106 verifyFormat("namespace bar {\n" 14107 "// broken:\n" 14108 "auto foo{[]() -> foo<~5> { return {}; }};\n" 14109 "} // namespace bar"); 14110 verifyFormat("namespace bar {\n" 14111 "// broken:\n" 14112 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 14113 "} // namespace bar"); 14114 verifyFormat("namespace bar {\n" 14115 "// broken:\n" 14116 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 14117 "} // namespace bar"); 14118 verifyFormat("namespace bar {\n" 14119 "// broken:\n" 14120 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 14121 "} // namespace bar"); 14122 verifyFormat("namespace bar {\n" 14123 "// broken:\n" 14124 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 14125 "} // namespace bar"); 14126 verifyFormat("namespace bar {\n" 14127 "// broken:\n" 14128 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 14129 "} // namespace bar"); 14130 verifyFormat("namespace bar {\n" 14131 "// broken:\n" 14132 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 14133 "} // namespace bar"); 14134 verifyFormat("namespace bar {\n" 14135 "// broken:\n" 14136 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 14137 "} // namespace bar"); 14138 verifyFormat("namespace bar {\n" 14139 "// broken:\n" 14140 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 14141 "} // namespace bar"); 14142 verifyFormat("namespace bar {\n" 14143 "// broken:\n" 14144 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 14145 "} // namespace bar"); 14146 verifyFormat("namespace bar {\n" 14147 "// broken:\n" 14148 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 14149 "} // namespace bar"); 14150 verifyFormat("[]() -> a<1> {};"); 14151 verifyFormat("[]() -> a<1> { ; };"); 14152 verifyFormat("[]() -> a<1> { ; }();"); 14153 verifyFormat("[a, a]() -> a<true> {};"); 14154 verifyFormat("[]() -> a<true> {};"); 14155 verifyFormat("[]() -> a<true> { ; };"); 14156 verifyFormat("[]() -> a<true> { ; }();"); 14157 verifyFormat("[a, a]() -> a<false> {};"); 14158 verifyFormat("[]() -> a<false> {};"); 14159 verifyFormat("[]() -> a<false> { ; };"); 14160 verifyFormat("[]() -> a<false> { ; }();"); 14161 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 14162 verifyFormat("namespace bar {\n" 14163 "auto foo{[]() -> foo<false> { ; }};\n" 14164 "} // namespace bar"); 14165 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 14166 " int j) -> int {\n" 14167 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 14168 "};"); 14169 verifyFormat( 14170 "aaaaaaaaaaaaaaaaaaaaaa(\n" 14171 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 14172 " return aaaaaaaaaaaaaaaaa;\n" 14173 " });", 14174 getLLVMStyleWithColumns(70)); 14175 verifyFormat("[]() //\n" 14176 " -> int {\n" 14177 " return 1; //\n" 14178 "};"); 14179 verifyFormat("[]() -> Void<T...> {};"); 14180 verifyFormat("[a, b]() -> Tuple<T...> { return {}; };"); 14181 14182 // Lambdas with explicit template argument lists. 14183 verifyFormat( 14184 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 14185 14186 // Multiple lambdas in the same parentheses change indentation rules. These 14187 // lambdas are forced to start on new lines. 14188 verifyFormat("SomeFunction(\n" 14189 " []() {\n" 14190 " //\n" 14191 " },\n" 14192 " []() {\n" 14193 " //\n" 14194 " });"); 14195 14196 // A lambda passed as arg0 is always pushed to the next line. 14197 verifyFormat("SomeFunction(\n" 14198 " [this] {\n" 14199 " //\n" 14200 " },\n" 14201 " 1);\n"); 14202 14203 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 14204 // the arg0 case above. 14205 auto Style = getGoogleStyle(); 14206 Style.BinPackArguments = false; 14207 verifyFormat("SomeFunction(\n" 14208 " a,\n" 14209 " [this] {\n" 14210 " //\n" 14211 " },\n" 14212 " b);\n", 14213 Style); 14214 verifyFormat("SomeFunction(\n" 14215 " a,\n" 14216 " [this] {\n" 14217 " //\n" 14218 " },\n" 14219 " b);\n"); 14220 14221 // A lambda with a very long line forces arg0 to be pushed out irrespective of 14222 // the BinPackArguments value (as long as the code is wide enough). 14223 verifyFormat( 14224 "something->SomeFunction(\n" 14225 " a,\n" 14226 " [this] {\n" 14227 " " 14228 "D0000000000000000000000000000000000000000000000000000000000001();\n" 14229 " },\n" 14230 " b);\n"); 14231 14232 // A multi-line lambda is pulled up as long as the introducer fits on the 14233 // previous line and there are no further args. 14234 verifyFormat("function(1, [this, that] {\n" 14235 " //\n" 14236 "});\n"); 14237 verifyFormat("function([this, that] {\n" 14238 " //\n" 14239 "});\n"); 14240 // FIXME: this format is not ideal and we should consider forcing the first 14241 // arg onto its own line. 14242 verifyFormat("function(a, b, c, //\n" 14243 " d, [this, that] {\n" 14244 " //\n" 14245 " });\n"); 14246 14247 // Multiple lambdas are treated correctly even when there is a short arg0. 14248 verifyFormat("SomeFunction(\n" 14249 " 1,\n" 14250 " [this] {\n" 14251 " //\n" 14252 " },\n" 14253 " [this] {\n" 14254 " //\n" 14255 " },\n" 14256 " 1);\n"); 14257 14258 // More complex introducers. 14259 verifyFormat("return [i, args...] {};"); 14260 14261 // Not lambdas. 14262 verifyFormat("constexpr char hello[]{\"hello\"};"); 14263 verifyFormat("double &operator[](int i) { return 0; }\n" 14264 "int i;"); 14265 verifyFormat("std::unique_ptr<int[]> foo() {}"); 14266 verifyFormat("int i = a[a][a]->f();"); 14267 verifyFormat("int i = (*b)[a]->f();"); 14268 14269 // Other corner cases. 14270 verifyFormat("void f() {\n" 14271 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 14272 " );\n" 14273 "}"); 14274 14275 // Lambdas created through weird macros. 14276 verifyFormat("void f() {\n" 14277 " MACRO((const AA &a) { return 1; });\n" 14278 " MACRO((AA &a) { return 1; });\n" 14279 "}"); 14280 14281 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 14282 " doo_dah();\n" 14283 " doo_dah();\n" 14284 " })) {\n" 14285 "}"); 14286 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 14287 " doo_dah();\n" 14288 " doo_dah();\n" 14289 " })) {\n" 14290 "}"); 14291 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 14292 " doo_dah();\n" 14293 " doo_dah();\n" 14294 " })) {\n" 14295 "}"); 14296 verifyFormat("auto lambda = []() {\n" 14297 " int a = 2\n" 14298 "#if A\n" 14299 " + 2\n" 14300 "#endif\n" 14301 " ;\n" 14302 "};"); 14303 14304 // Lambdas with complex multiline introducers. 14305 verifyFormat( 14306 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14307 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 14308 " -> ::std::unordered_set<\n" 14309 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 14310 " //\n" 14311 " });"); 14312 14313 FormatStyle DoNotMerge = getLLVMStyle(); 14314 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 14315 verifyFormat("auto c = []() {\n" 14316 " return b;\n" 14317 "};", 14318 "auto c = []() { return b; };", DoNotMerge); 14319 verifyFormat("auto c = []() {\n" 14320 "};", 14321 " auto c = []() {};", DoNotMerge); 14322 14323 FormatStyle MergeEmptyOnly = getLLVMStyle(); 14324 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 14325 verifyFormat("auto c = []() {\n" 14326 " return b;\n" 14327 "};", 14328 "auto c = []() {\n" 14329 " return b;\n" 14330 " };", 14331 MergeEmptyOnly); 14332 verifyFormat("auto c = []() {};", 14333 "auto c = []() {\n" 14334 "};", 14335 MergeEmptyOnly); 14336 14337 FormatStyle MergeInline = getLLVMStyle(); 14338 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 14339 verifyFormat("auto c = []() {\n" 14340 " return b;\n" 14341 "};", 14342 "auto c = []() { return b; };", MergeInline); 14343 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 14344 MergeInline); 14345 verifyFormat("function([]() { return b; }, a)", 14346 "function([]() { return b; }, a)", MergeInline); 14347 verifyFormat("function(a, []() { return b; })", 14348 "function(a, []() { return b; })", MergeInline); 14349 14350 // Check option "BraceWrapping.BeforeLambdaBody" and different state of 14351 // AllowShortLambdasOnASingleLine 14352 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 14353 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 14354 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 14355 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14356 FormatStyle::ShortLambdaStyle::SLS_None; 14357 verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n" 14358 " []()\n" 14359 " {\n" 14360 " return 17;\n" 14361 " });", 14362 LLVMWithBeforeLambdaBody); 14363 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n" 14364 " []()\n" 14365 " {\n" 14366 " });", 14367 LLVMWithBeforeLambdaBody); 14368 verifyFormat("auto fct_SLS_None = []()\n" 14369 "{\n" 14370 " return 17;\n" 14371 "};", 14372 LLVMWithBeforeLambdaBody); 14373 verifyFormat("TwoNestedLambdas_SLS_None(\n" 14374 " []()\n" 14375 " {\n" 14376 " return Call(\n" 14377 " []()\n" 14378 " {\n" 14379 " return 17;\n" 14380 " });\n" 14381 " });", 14382 LLVMWithBeforeLambdaBody); 14383 verifyFormat("void Fct()\n" 14384 "{\n" 14385 " return {[]()\n" 14386 " {\n" 14387 " return 17;\n" 14388 " }};\n" 14389 "}", 14390 LLVMWithBeforeLambdaBody); 14391 14392 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14393 FormatStyle::ShortLambdaStyle::SLS_Empty; 14394 verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" 14395 " []()\n" 14396 " {\n" 14397 " return 17;\n" 14398 " });", 14399 LLVMWithBeforeLambdaBody); 14400 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});", 14401 LLVMWithBeforeLambdaBody); 14402 verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL" 14403 "ongFunctionName_SLS_Empty(\n" 14404 " []() {});", 14405 LLVMWithBeforeLambdaBody); 14406 verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n" 14407 " []()\n" 14408 " {\n" 14409 " return 17;\n" 14410 " });", 14411 LLVMWithBeforeLambdaBody); 14412 verifyFormat("auto fct_SLS_Empty = []()\n" 14413 "{\n" 14414 " return 17;\n" 14415 "};", 14416 LLVMWithBeforeLambdaBody); 14417 verifyFormat("TwoNestedLambdas_SLS_Empty(\n" 14418 " []()\n" 14419 " {\n" 14420 " return Call([]() {});\n" 14421 " });", 14422 LLVMWithBeforeLambdaBody); 14423 verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n" 14424 " []()\n" 14425 " {\n" 14426 " return Call([]() {});\n" 14427 " });", 14428 LLVMWithBeforeLambdaBody); 14429 verifyFormat( 14430 "FctWithLongLineInLambda_SLS_Empty(\n" 14431 " []()\n" 14432 " {\n" 14433 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14434 " AndShouldNotBeConsiderAsInline,\n" 14435 " LambdaBodyMustBeBreak);\n" 14436 " });", 14437 LLVMWithBeforeLambdaBody); 14438 14439 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14440 FormatStyle::ShortLambdaStyle::SLS_Inline; 14441 verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });", 14442 LLVMWithBeforeLambdaBody); 14443 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});", 14444 LLVMWithBeforeLambdaBody); 14445 verifyFormat("auto fct_SLS_Inline = []()\n" 14446 "{\n" 14447 " return 17;\n" 14448 "};", 14449 LLVMWithBeforeLambdaBody); 14450 verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return " 14451 "17; }); });", 14452 LLVMWithBeforeLambdaBody); 14453 verifyFormat( 14454 "FctWithLongLineInLambda_SLS_Inline(\n" 14455 " []()\n" 14456 " {\n" 14457 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14458 " AndShouldNotBeConsiderAsInline,\n" 14459 " LambdaBodyMustBeBreak);\n" 14460 " });", 14461 LLVMWithBeforeLambdaBody); 14462 verifyFormat("FctWithMultipleParams_SLS_Inline(" 14463 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 14464 " []() { return 17; });", 14465 LLVMWithBeforeLambdaBody); 14466 verifyFormat( 14467 "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });", 14468 LLVMWithBeforeLambdaBody); 14469 14470 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14471 FormatStyle::ShortLambdaStyle::SLS_All; 14472 verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });", 14473 LLVMWithBeforeLambdaBody); 14474 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});", 14475 LLVMWithBeforeLambdaBody); 14476 verifyFormat("auto fct_SLS_All = []() { return 17; };", 14477 LLVMWithBeforeLambdaBody); 14478 verifyFormat("FctWithOneParam_SLS_All(\n" 14479 " []()\n" 14480 " {\n" 14481 " // A cool function...\n" 14482 " return 43;\n" 14483 " });", 14484 LLVMWithBeforeLambdaBody); 14485 verifyFormat("FctWithMultipleParams_SLS_All(" 14486 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 14487 " []() { return 17; });", 14488 LLVMWithBeforeLambdaBody); 14489 verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });", 14490 LLVMWithBeforeLambdaBody); 14491 verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });", 14492 LLVMWithBeforeLambdaBody); 14493 verifyFormat( 14494 "FctWithLongLineInLambda_SLS_All(\n" 14495 " []()\n" 14496 " {\n" 14497 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14498 " AndShouldNotBeConsiderAsInline,\n" 14499 " LambdaBodyMustBeBreak);\n" 14500 " });", 14501 LLVMWithBeforeLambdaBody); 14502 verifyFormat( 14503 "auto fct_SLS_All = []()\n" 14504 "{\n" 14505 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14506 " AndShouldNotBeConsiderAsInline,\n" 14507 " LambdaBodyMustBeBreak);\n" 14508 "};", 14509 LLVMWithBeforeLambdaBody); 14510 LLVMWithBeforeLambdaBody.BinPackParameters = false; 14511 verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);", 14512 LLVMWithBeforeLambdaBody); 14513 verifyFormat( 14514 "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n" 14515 " FirstParam,\n" 14516 " SecondParam,\n" 14517 " ThirdParam,\n" 14518 " FourthParam);", 14519 LLVMWithBeforeLambdaBody); 14520 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 14521 " []() { return " 14522 "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n" 14523 " FirstParam,\n" 14524 " SecondParam,\n" 14525 " ThirdParam,\n" 14526 " FourthParam);", 14527 LLVMWithBeforeLambdaBody); 14528 verifyFormat( 14529 "FctWithLongLineInLambda_SLS_All(FirstParam,\n" 14530 " SecondParam,\n" 14531 " ThirdParam,\n" 14532 " FourthParam,\n" 14533 " []() { return SomeValueNotSoLong; });", 14534 LLVMWithBeforeLambdaBody); 14535 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 14536 " []()\n" 14537 " {\n" 14538 " return " 14539 "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB" 14540 "eConsiderAsInline;\n" 14541 " });", 14542 LLVMWithBeforeLambdaBody); 14543 verifyFormat( 14544 "FctWithLongLineInLambda_SLS_All(\n" 14545 " []()\n" 14546 " {\n" 14547 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14548 " AndShouldNotBeConsiderAsInline,\n" 14549 " LambdaBodyMustBeBreak);\n" 14550 " });", 14551 LLVMWithBeforeLambdaBody); 14552 verifyFormat("FctWithTwoParams_SLS_All(\n" 14553 " []()\n" 14554 " {\n" 14555 " // A cool function...\n" 14556 " return 43;\n" 14557 " },\n" 14558 " 87);", 14559 LLVMWithBeforeLambdaBody); 14560 verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);", 14561 LLVMWithBeforeLambdaBody); 14562 verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });", 14563 LLVMWithBeforeLambdaBody); 14564 verifyFormat( 14565 "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });", 14566 LLVMWithBeforeLambdaBody); 14567 verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; " 14568 "}); }, x);", 14569 LLVMWithBeforeLambdaBody); 14570 verifyFormat("TwoNestedLambdas_SLS_All(\n" 14571 " []()\n" 14572 " {\n" 14573 " // A cool function...\n" 14574 " return Call([]() { return 17; });\n" 14575 " });", 14576 LLVMWithBeforeLambdaBody); 14577 verifyFormat("TwoNestedLambdas_SLS_All(\n" 14578 " []()\n" 14579 " {\n" 14580 " return Call(\n" 14581 " []()\n" 14582 " {\n" 14583 " // A cool function...\n" 14584 " return 17;\n" 14585 " });\n" 14586 " });", 14587 LLVMWithBeforeLambdaBody); 14588 } 14589 14590 TEST_F(FormatTest, EmptyLinesInLambdas) { 14591 verifyFormat("auto lambda = []() {\n" 14592 " x(); //\n" 14593 "};", 14594 "auto lambda = []() {\n" 14595 "\n" 14596 " x(); //\n" 14597 "\n" 14598 "};"); 14599 } 14600 14601 TEST_F(FormatTest, FormatsBlocks) { 14602 FormatStyle ShortBlocks = getLLVMStyle(); 14603 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 14604 verifyFormat("int (^Block)(int, int);", ShortBlocks); 14605 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 14606 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 14607 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 14608 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 14609 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 14610 14611 verifyFormat("foo(^{ bar(); });", ShortBlocks); 14612 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 14613 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 14614 14615 verifyFormat("[operation setCompletionBlock:^{\n" 14616 " [self onOperationDone];\n" 14617 "}];"); 14618 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 14619 " [self onOperationDone];\n" 14620 "}]};"); 14621 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 14622 " f();\n" 14623 "}];"); 14624 verifyFormat("int a = [operation block:^int(int *i) {\n" 14625 " return 1;\n" 14626 "}];"); 14627 verifyFormat("[myObject doSomethingWith:arg1\n" 14628 " aaa:^int(int *a) {\n" 14629 " return 1;\n" 14630 " }\n" 14631 " bbb:f(a * bbbbbbbb)];"); 14632 14633 verifyFormat("[operation setCompletionBlock:^{\n" 14634 " [self.delegate newDataAvailable];\n" 14635 "}];", 14636 getLLVMStyleWithColumns(60)); 14637 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 14638 " NSString *path = [self sessionFilePath];\n" 14639 " if (path) {\n" 14640 " // ...\n" 14641 " }\n" 14642 "});"); 14643 verifyFormat("[[SessionService sharedService]\n" 14644 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14645 " if (window) {\n" 14646 " [self windowDidLoad:window];\n" 14647 " } else {\n" 14648 " [self errorLoadingWindow];\n" 14649 " }\n" 14650 " }];"); 14651 verifyFormat("void (^largeBlock)(void) = ^{\n" 14652 " // ...\n" 14653 "};\n", 14654 getLLVMStyleWithColumns(40)); 14655 verifyFormat("[[SessionService sharedService]\n" 14656 " loadWindowWithCompletionBlock: //\n" 14657 " ^(SessionWindow *window) {\n" 14658 " if (window) {\n" 14659 " [self windowDidLoad:window];\n" 14660 " } else {\n" 14661 " [self errorLoadingWindow];\n" 14662 " }\n" 14663 " }];", 14664 getLLVMStyleWithColumns(60)); 14665 verifyFormat("[myObject doSomethingWith:arg1\n" 14666 " firstBlock:^(Foo *a) {\n" 14667 " // ...\n" 14668 " int i;\n" 14669 " }\n" 14670 " secondBlock:^(Bar *b) {\n" 14671 " // ...\n" 14672 " int i;\n" 14673 " }\n" 14674 " thirdBlock:^Foo(Bar *b) {\n" 14675 " // ...\n" 14676 " int i;\n" 14677 " }];"); 14678 verifyFormat("[myObject doSomethingWith:arg1\n" 14679 " firstBlock:-1\n" 14680 " secondBlock:^(Bar *b) {\n" 14681 " // ...\n" 14682 " int i;\n" 14683 " }];"); 14684 14685 verifyFormat("f(^{\n" 14686 " @autoreleasepool {\n" 14687 " if (a) {\n" 14688 " g();\n" 14689 " }\n" 14690 " }\n" 14691 "});"); 14692 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 14693 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 14694 "};"); 14695 14696 FormatStyle FourIndent = getLLVMStyle(); 14697 FourIndent.ObjCBlockIndentWidth = 4; 14698 verifyFormat("[operation setCompletionBlock:^{\n" 14699 " [self onOperationDone];\n" 14700 "}];", 14701 FourIndent); 14702 } 14703 14704 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 14705 FormatStyle ZeroColumn = getLLVMStyle(); 14706 ZeroColumn.ColumnLimit = 0; 14707 14708 verifyFormat("[[SessionService sharedService] " 14709 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14710 " if (window) {\n" 14711 " [self windowDidLoad:window];\n" 14712 " } else {\n" 14713 " [self errorLoadingWindow];\n" 14714 " }\n" 14715 "}];", 14716 ZeroColumn); 14717 EXPECT_EQ("[[SessionService sharedService]\n" 14718 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14719 " if (window) {\n" 14720 " [self windowDidLoad:window];\n" 14721 " } else {\n" 14722 " [self errorLoadingWindow];\n" 14723 " }\n" 14724 " }];", 14725 format("[[SessionService sharedService]\n" 14726 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14727 " if (window) {\n" 14728 " [self windowDidLoad:window];\n" 14729 " } else {\n" 14730 " [self errorLoadingWindow];\n" 14731 " }\n" 14732 "}];", 14733 ZeroColumn)); 14734 verifyFormat("[myObject doSomethingWith:arg1\n" 14735 " firstBlock:^(Foo *a) {\n" 14736 " // ...\n" 14737 " int i;\n" 14738 " }\n" 14739 " secondBlock:^(Bar *b) {\n" 14740 " // ...\n" 14741 " int i;\n" 14742 " }\n" 14743 " thirdBlock:^Foo(Bar *b) {\n" 14744 " // ...\n" 14745 " int i;\n" 14746 " }];", 14747 ZeroColumn); 14748 verifyFormat("f(^{\n" 14749 " @autoreleasepool {\n" 14750 " if (a) {\n" 14751 " g();\n" 14752 " }\n" 14753 " }\n" 14754 "});", 14755 ZeroColumn); 14756 verifyFormat("void (^largeBlock)(void) = ^{\n" 14757 " // ...\n" 14758 "};", 14759 ZeroColumn); 14760 14761 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 14762 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 14763 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 14764 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 14765 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 14766 " int i;\n" 14767 "};", 14768 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 14769 } 14770 14771 TEST_F(FormatTest, SupportsCRLF) { 14772 EXPECT_EQ("int a;\r\n" 14773 "int b;\r\n" 14774 "int c;\r\n", 14775 format("int a;\r\n" 14776 " int b;\r\n" 14777 " int c;\r\n", 14778 getLLVMStyle())); 14779 EXPECT_EQ("int a;\r\n" 14780 "int b;\r\n" 14781 "int c;\r\n", 14782 format("int a;\r\n" 14783 " int b;\n" 14784 " int c;\r\n", 14785 getLLVMStyle())); 14786 EXPECT_EQ("int a;\n" 14787 "int b;\n" 14788 "int c;\n", 14789 format("int a;\r\n" 14790 " int b;\n" 14791 " int c;\n", 14792 getLLVMStyle())); 14793 EXPECT_EQ("\"aaaaaaa \"\r\n" 14794 "\"bbbbbbb\";\r\n", 14795 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 14796 EXPECT_EQ("#define A \\\r\n" 14797 " b; \\\r\n" 14798 " c; \\\r\n" 14799 " d;\r\n", 14800 format("#define A \\\r\n" 14801 " b; \\\r\n" 14802 " c; d; \r\n", 14803 getGoogleStyle())); 14804 14805 EXPECT_EQ("/*\r\n" 14806 "multi line block comments\r\n" 14807 "should not introduce\r\n" 14808 "an extra carriage return\r\n" 14809 "*/\r\n", 14810 format("/*\r\n" 14811 "multi line block comments\r\n" 14812 "should not introduce\r\n" 14813 "an extra carriage return\r\n" 14814 "*/\r\n")); 14815 EXPECT_EQ("/*\r\n" 14816 "\r\n" 14817 "*/", 14818 format("/*\r\n" 14819 " \r\r\r\n" 14820 "*/")); 14821 14822 FormatStyle style = getLLVMStyle(); 14823 14824 style.DeriveLineEnding = true; 14825 style.UseCRLF = false; 14826 EXPECT_EQ("union FooBarBazQux {\n" 14827 " int foo;\n" 14828 " int bar;\n" 14829 " int baz;\n" 14830 "};", 14831 format("union FooBarBazQux {\r\n" 14832 " int foo;\n" 14833 " int bar;\r\n" 14834 " int baz;\n" 14835 "};", 14836 style)); 14837 style.UseCRLF = true; 14838 EXPECT_EQ("union FooBarBazQux {\r\n" 14839 " int foo;\r\n" 14840 " int bar;\r\n" 14841 " int baz;\r\n" 14842 "};", 14843 format("union FooBarBazQux {\r\n" 14844 " int foo;\n" 14845 " int bar;\r\n" 14846 " int baz;\n" 14847 "};", 14848 style)); 14849 14850 style.DeriveLineEnding = false; 14851 style.UseCRLF = false; 14852 EXPECT_EQ("union FooBarBazQux {\n" 14853 " int foo;\n" 14854 " int bar;\n" 14855 " int baz;\n" 14856 " int qux;\n" 14857 "};", 14858 format("union FooBarBazQux {\r\n" 14859 " int foo;\n" 14860 " int bar;\r\n" 14861 " int baz;\n" 14862 " int qux;\r\n" 14863 "};", 14864 style)); 14865 style.UseCRLF = true; 14866 EXPECT_EQ("union FooBarBazQux {\r\n" 14867 " int foo;\r\n" 14868 " int bar;\r\n" 14869 " int baz;\r\n" 14870 " int qux;\r\n" 14871 "};", 14872 format("union FooBarBazQux {\r\n" 14873 " int foo;\n" 14874 " int bar;\r\n" 14875 " int baz;\n" 14876 " int qux;\n" 14877 "};", 14878 style)); 14879 14880 style.DeriveLineEnding = true; 14881 style.UseCRLF = false; 14882 EXPECT_EQ("union FooBarBazQux {\r\n" 14883 " int foo;\r\n" 14884 " int bar;\r\n" 14885 " int baz;\r\n" 14886 " int qux;\r\n" 14887 "};", 14888 format("union FooBarBazQux {\r\n" 14889 " int foo;\n" 14890 " int bar;\r\n" 14891 " int baz;\n" 14892 " int qux;\r\n" 14893 "};", 14894 style)); 14895 style.UseCRLF = true; 14896 EXPECT_EQ("union FooBarBazQux {\n" 14897 " int foo;\n" 14898 " int bar;\n" 14899 " int baz;\n" 14900 " int qux;\n" 14901 "};", 14902 format("union FooBarBazQux {\r\n" 14903 " int foo;\n" 14904 " int bar;\r\n" 14905 " int baz;\n" 14906 " int qux;\n" 14907 "};", 14908 style)); 14909 } 14910 14911 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 14912 verifyFormat("MY_CLASS(C) {\n" 14913 " int i;\n" 14914 " int j;\n" 14915 "};"); 14916 } 14917 14918 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 14919 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 14920 TwoIndent.ContinuationIndentWidth = 2; 14921 14922 EXPECT_EQ("int i =\n" 14923 " longFunction(\n" 14924 " arg);", 14925 format("int i = longFunction(arg);", TwoIndent)); 14926 14927 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 14928 SixIndent.ContinuationIndentWidth = 6; 14929 14930 EXPECT_EQ("int i =\n" 14931 " longFunction(\n" 14932 " arg);", 14933 format("int i = longFunction(arg);", SixIndent)); 14934 } 14935 14936 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 14937 FormatStyle Style = getLLVMStyle(); 14938 verifyFormat("int Foo::getter(\n" 14939 " //\n" 14940 ") const {\n" 14941 " return foo;\n" 14942 "}", 14943 Style); 14944 verifyFormat("void Foo::setter(\n" 14945 " //\n" 14946 ") {\n" 14947 " foo = 1;\n" 14948 "}", 14949 Style); 14950 } 14951 14952 TEST_F(FormatTest, SpacesInAngles) { 14953 FormatStyle Spaces = getLLVMStyle(); 14954 Spaces.SpacesInAngles = true; 14955 14956 verifyFormat("static_cast< int >(arg);", Spaces); 14957 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 14958 verifyFormat("f< int, float >();", Spaces); 14959 verifyFormat("template <> g() {}", Spaces); 14960 verifyFormat("template < std::vector< int > > f() {}", Spaces); 14961 verifyFormat("std::function< void(int, int) > fct;", Spaces); 14962 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 14963 Spaces); 14964 14965 Spaces.Standard = FormatStyle::LS_Cpp03; 14966 Spaces.SpacesInAngles = true; 14967 verifyFormat("A< A< int > >();", Spaces); 14968 14969 Spaces.SpacesInAngles = false; 14970 verifyFormat("A<A<int> >();", Spaces); 14971 14972 Spaces.Standard = FormatStyle::LS_Cpp11; 14973 Spaces.SpacesInAngles = true; 14974 verifyFormat("A< A< int > >();", Spaces); 14975 14976 Spaces.SpacesInAngles = false; 14977 verifyFormat("A<A<int>>();", Spaces); 14978 } 14979 14980 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 14981 FormatStyle Style = getLLVMStyle(); 14982 Style.SpaceAfterTemplateKeyword = false; 14983 verifyFormat("template<int> void foo();", Style); 14984 } 14985 14986 TEST_F(FormatTest, TripleAngleBrackets) { 14987 verifyFormat("f<<<1, 1>>>();"); 14988 verifyFormat("f<<<1, 1, 1, s>>>();"); 14989 verifyFormat("f<<<a, b, c, d>>>();"); 14990 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 14991 verifyFormat("f<param><<<1, 1>>>();"); 14992 verifyFormat("f<1><<<1, 1>>>();"); 14993 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 14994 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14995 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 14996 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 14997 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 14998 } 14999 15000 TEST_F(FormatTest, MergeLessLessAtEnd) { 15001 verifyFormat("<<"); 15002 EXPECT_EQ("< < <", format("\\\n<<<")); 15003 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 15004 "aaallvm::outs() <<"); 15005 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 15006 "aaaallvm::outs()\n <<"); 15007 } 15008 15009 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 15010 std::string code = "#if A\n" 15011 "#if B\n" 15012 "a.\n" 15013 "#endif\n" 15014 " a = 1;\n" 15015 "#else\n" 15016 "#endif\n" 15017 "#if C\n" 15018 "#else\n" 15019 "#endif\n"; 15020 EXPECT_EQ(code, format(code)); 15021 } 15022 15023 TEST_F(FormatTest, HandleConflictMarkers) { 15024 // Git/SVN conflict markers. 15025 EXPECT_EQ("int a;\n" 15026 "void f() {\n" 15027 " callme(some(parameter1,\n" 15028 "<<<<<<< text by the vcs\n" 15029 " parameter2),\n" 15030 "||||||| text by the vcs\n" 15031 " parameter2),\n" 15032 " parameter3,\n" 15033 "======= text by the vcs\n" 15034 " parameter2, parameter3),\n" 15035 ">>>>>>> text by the vcs\n" 15036 " otherparameter);\n", 15037 format("int a;\n" 15038 "void f() {\n" 15039 " callme(some(parameter1,\n" 15040 "<<<<<<< text by the vcs\n" 15041 " parameter2),\n" 15042 "||||||| text by the vcs\n" 15043 " parameter2),\n" 15044 " parameter3,\n" 15045 "======= text by the vcs\n" 15046 " parameter2,\n" 15047 " parameter3),\n" 15048 ">>>>>>> text by the vcs\n" 15049 " otherparameter);\n")); 15050 15051 // Perforce markers. 15052 EXPECT_EQ("void f() {\n" 15053 " function(\n" 15054 ">>>> text by the vcs\n" 15055 " parameter,\n" 15056 "==== text by the vcs\n" 15057 " parameter,\n" 15058 "==== text by the vcs\n" 15059 " parameter,\n" 15060 "<<<< text by the vcs\n" 15061 " parameter);\n", 15062 format("void f() {\n" 15063 " function(\n" 15064 ">>>> text by the vcs\n" 15065 " parameter,\n" 15066 "==== text by the vcs\n" 15067 " parameter,\n" 15068 "==== text by the vcs\n" 15069 " parameter,\n" 15070 "<<<< text by the vcs\n" 15071 " parameter);\n")); 15072 15073 EXPECT_EQ("<<<<<<<\n" 15074 "|||||||\n" 15075 "=======\n" 15076 ">>>>>>>", 15077 format("<<<<<<<\n" 15078 "|||||||\n" 15079 "=======\n" 15080 ">>>>>>>")); 15081 15082 EXPECT_EQ("<<<<<<<\n" 15083 "|||||||\n" 15084 "int i;\n" 15085 "=======\n" 15086 ">>>>>>>", 15087 format("<<<<<<<\n" 15088 "|||||||\n" 15089 "int i;\n" 15090 "=======\n" 15091 ">>>>>>>")); 15092 15093 // FIXME: Handle parsing of macros around conflict markers correctly: 15094 EXPECT_EQ("#define Macro \\\n" 15095 "<<<<<<<\n" 15096 "Something \\\n" 15097 "|||||||\n" 15098 "Else \\\n" 15099 "=======\n" 15100 "Other \\\n" 15101 ">>>>>>>\n" 15102 " End int i;\n", 15103 format("#define Macro \\\n" 15104 "<<<<<<<\n" 15105 " Something \\\n" 15106 "|||||||\n" 15107 " Else \\\n" 15108 "=======\n" 15109 " Other \\\n" 15110 ">>>>>>>\n" 15111 " End\n" 15112 "int i;\n")); 15113 } 15114 15115 TEST_F(FormatTest, DisableRegions) { 15116 EXPECT_EQ("int i;\n" 15117 "// clang-format off\n" 15118 " int j;\n" 15119 "// clang-format on\n" 15120 "int k;", 15121 format(" int i;\n" 15122 " // clang-format off\n" 15123 " int j;\n" 15124 " // clang-format on\n" 15125 " int k;")); 15126 EXPECT_EQ("int i;\n" 15127 "/* clang-format off */\n" 15128 " int j;\n" 15129 "/* clang-format on */\n" 15130 "int k;", 15131 format(" int i;\n" 15132 " /* clang-format off */\n" 15133 " int j;\n" 15134 " /* clang-format on */\n" 15135 " int k;")); 15136 15137 // Don't reflow comments within disabled regions. 15138 EXPECT_EQ("// clang-format off\n" 15139 "// long long long long long long line\n" 15140 "/* clang-format on */\n" 15141 "/* long long long\n" 15142 " * long long long\n" 15143 " * line */\n" 15144 "int i;\n" 15145 "/* clang-format off */\n" 15146 "/* long long long long long long line */\n", 15147 format("// clang-format off\n" 15148 "// long long long long long long line\n" 15149 "/* clang-format on */\n" 15150 "/* long long long long long long line */\n" 15151 "int i;\n" 15152 "/* clang-format off */\n" 15153 "/* long long long long long long line */\n", 15154 getLLVMStyleWithColumns(20))); 15155 } 15156 15157 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 15158 format("? ) ="); 15159 verifyNoCrash("#define a\\\n /**/}"); 15160 } 15161 15162 TEST_F(FormatTest, FormatsTableGenCode) { 15163 FormatStyle Style = getLLVMStyle(); 15164 Style.Language = FormatStyle::LK_TableGen; 15165 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 15166 } 15167 15168 TEST_F(FormatTest, ArrayOfTemplates) { 15169 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 15170 format("auto a = new unique_ptr<int > [ 10];")); 15171 15172 FormatStyle Spaces = getLLVMStyle(); 15173 Spaces.SpacesInSquareBrackets = true; 15174 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 15175 format("auto a = new unique_ptr<int > [10];", Spaces)); 15176 } 15177 15178 TEST_F(FormatTest, ArrayAsTemplateType) { 15179 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 15180 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 15181 15182 FormatStyle Spaces = getLLVMStyle(); 15183 Spaces.SpacesInSquareBrackets = true; 15184 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 15185 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 15186 } 15187 15188 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 15189 15190 TEST(FormatStyle, GetStyleWithEmptyFileName) { 15191 llvm::vfs::InMemoryFileSystem FS; 15192 auto Style1 = getStyle("file", "", "Google", "", &FS); 15193 ASSERT_TRUE((bool)Style1); 15194 ASSERT_EQ(*Style1, getGoogleStyle()); 15195 } 15196 15197 TEST(FormatStyle, GetStyleOfFile) { 15198 llvm::vfs::InMemoryFileSystem FS; 15199 // Test 1: format file in the same directory. 15200 ASSERT_TRUE( 15201 FS.addFile("/a/.clang-format", 0, 15202 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 15203 ASSERT_TRUE( 15204 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15205 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 15206 ASSERT_TRUE((bool)Style1); 15207 ASSERT_EQ(*Style1, getLLVMStyle()); 15208 15209 // Test 2.1: fallback to default. 15210 ASSERT_TRUE( 15211 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15212 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 15213 ASSERT_TRUE((bool)Style2); 15214 ASSERT_EQ(*Style2, getMozillaStyle()); 15215 15216 // Test 2.2: no format on 'none' fallback style. 15217 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 15218 ASSERT_TRUE((bool)Style2); 15219 ASSERT_EQ(*Style2, getNoStyle()); 15220 15221 // Test 2.3: format if config is found with no based style while fallback is 15222 // 'none'. 15223 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 15224 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 15225 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 15226 ASSERT_TRUE((bool)Style2); 15227 ASSERT_EQ(*Style2, getLLVMStyle()); 15228 15229 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 15230 Style2 = getStyle("{}", "a.h", "none", "", &FS); 15231 ASSERT_TRUE((bool)Style2); 15232 ASSERT_EQ(*Style2, getLLVMStyle()); 15233 15234 // Test 3: format file in parent directory. 15235 ASSERT_TRUE( 15236 FS.addFile("/c/.clang-format", 0, 15237 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 15238 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 15239 llvm::MemoryBuffer::getMemBuffer("int i;"))); 15240 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 15241 ASSERT_TRUE((bool)Style3); 15242 ASSERT_EQ(*Style3, getGoogleStyle()); 15243 15244 // Test 4: error on invalid fallback style 15245 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 15246 ASSERT_FALSE((bool)Style4); 15247 llvm::consumeError(Style4.takeError()); 15248 15249 // Test 5: error on invalid yaml on command line 15250 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 15251 ASSERT_FALSE((bool)Style5); 15252 llvm::consumeError(Style5.takeError()); 15253 15254 // Test 6: error on invalid style 15255 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 15256 ASSERT_FALSE((bool)Style6); 15257 llvm::consumeError(Style6.takeError()); 15258 15259 // Test 7: found config file, error on parsing it 15260 ASSERT_TRUE( 15261 FS.addFile("/d/.clang-format", 0, 15262 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 15263 "InvalidKey: InvalidValue"))); 15264 ASSERT_TRUE( 15265 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15266 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 15267 ASSERT_FALSE((bool)Style7); 15268 llvm::consumeError(Style7.takeError()); 15269 15270 // Test 8: inferred per-language defaults apply. 15271 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 15272 ASSERT_TRUE((bool)StyleTd); 15273 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 15274 } 15275 15276 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 15277 // Column limit is 20. 15278 std::string Code = "Type *a =\n" 15279 " new Type();\n" 15280 "g(iiiii, 0, jjjjj,\n" 15281 " 0, kkkkk, 0, mm);\n" 15282 "int bad = format ;"; 15283 std::string Expected = "auto a = new Type();\n" 15284 "g(iiiii, nullptr,\n" 15285 " jjjjj, nullptr,\n" 15286 " kkkkk, nullptr,\n" 15287 " mm);\n" 15288 "int bad = format ;"; 15289 FileID ID = Context.createInMemoryFile("format.cpp", Code); 15290 tooling::Replacements Replaces = toReplacements( 15291 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 15292 "auto "), 15293 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 15294 "nullptr"), 15295 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 15296 "nullptr"), 15297 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 15298 "nullptr")}); 15299 15300 format::FormatStyle Style = format::getLLVMStyle(); 15301 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 15302 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 15303 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 15304 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 15305 auto Result = applyAllReplacements(Code, *FormattedReplaces); 15306 EXPECT_TRUE(static_cast<bool>(Result)); 15307 EXPECT_EQ(Expected, *Result); 15308 } 15309 15310 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 15311 std::string Code = "#include \"a.h\"\n" 15312 "#include \"c.h\"\n" 15313 "\n" 15314 "int main() {\n" 15315 " return 0;\n" 15316 "}"; 15317 std::string Expected = "#include \"a.h\"\n" 15318 "#include \"b.h\"\n" 15319 "#include \"c.h\"\n" 15320 "\n" 15321 "int main() {\n" 15322 " return 0;\n" 15323 "}"; 15324 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 15325 tooling::Replacements Replaces = toReplacements( 15326 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 15327 "#include \"b.h\"\n")}); 15328 15329 format::FormatStyle Style = format::getLLVMStyle(); 15330 Style.SortIncludes = true; 15331 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 15332 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 15333 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 15334 auto Result = applyAllReplacements(Code, *FormattedReplaces); 15335 EXPECT_TRUE(static_cast<bool>(Result)); 15336 EXPECT_EQ(Expected, *Result); 15337 } 15338 15339 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 15340 EXPECT_EQ("using std::cin;\n" 15341 "using std::cout;", 15342 format("using std::cout;\n" 15343 "using std::cin;", 15344 getGoogleStyle())); 15345 } 15346 15347 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 15348 format::FormatStyle Style = format::getLLVMStyle(); 15349 Style.Standard = FormatStyle::LS_Cpp03; 15350 // cpp03 recognize this string as identifier u8 and literal character 'a' 15351 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 15352 } 15353 15354 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 15355 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 15356 // all modes, including C++11, C++14 and C++17 15357 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 15358 } 15359 15360 TEST_F(FormatTest, DoNotFormatLikelyXml) { 15361 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 15362 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 15363 } 15364 15365 TEST_F(FormatTest, StructuredBindings) { 15366 // Structured bindings is a C++17 feature. 15367 // all modes, including C++11, C++14 and C++17 15368 verifyFormat("auto [a, b] = f();"); 15369 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 15370 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 15371 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 15372 EXPECT_EQ("auto const volatile [a, b] = f();", 15373 format("auto const volatile[a, b] = f();")); 15374 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 15375 EXPECT_EQ("auto &[a, b, c] = f();", 15376 format("auto &[ a , b,c ] = f();")); 15377 EXPECT_EQ("auto &&[a, b, c] = f();", 15378 format("auto &&[ a , b,c ] = f();")); 15379 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 15380 EXPECT_EQ("auto const volatile &&[a, b] = f();", 15381 format("auto const volatile &&[a, b] = f();")); 15382 EXPECT_EQ("auto const &&[a, b] = f();", 15383 format("auto const && [a, b] = f();")); 15384 EXPECT_EQ("const auto &[a, b] = f();", 15385 format("const auto & [a, b] = f();")); 15386 EXPECT_EQ("const auto volatile &&[a, b] = f();", 15387 format("const auto volatile &&[a, b] = f();")); 15388 EXPECT_EQ("volatile const auto &&[a, b] = f();", 15389 format("volatile const auto &&[a, b] = f();")); 15390 EXPECT_EQ("const auto &&[a, b] = f();", 15391 format("const auto && [a, b] = f();")); 15392 15393 // Make sure we don't mistake structured bindings for lambdas. 15394 FormatStyle PointerMiddle = getLLVMStyle(); 15395 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 15396 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 15397 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 15398 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 15399 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 15400 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 15401 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 15402 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 15403 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 15404 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 15405 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 15406 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 15407 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 15408 15409 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 15410 format("for (const auto && [a, b] : some_range) {\n}")); 15411 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 15412 format("for (const auto & [a, b] : some_range) {\n}")); 15413 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 15414 format("for (const auto[a, b] : some_range) {\n}")); 15415 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 15416 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 15417 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 15418 EXPECT_EQ("auto const &[x, y](expr);", 15419 format("auto const & [x,y] (expr);")); 15420 EXPECT_EQ("auto const &&[x, y](expr);", 15421 format("auto const && [x,y] (expr);")); 15422 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 15423 EXPECT_EQ("auto const &[x, y]{expr};", 15424 format("auto const & [x,y] {expr};")); 15425 EXPECT_EQ("auto const &&[x, y]{expr};", 15426 format("auto const && [x,y] {expr};")); 15427 15428 format::FormatStyle Spaces = format::getLLVMStyle(); 15429 Spaces.SpacesInSquareBrackets = true; 15430 verifyFormat("auto [ a, b ] = f();", Spaces); 15431 verifyFormat("auto &&[ a, b ] = f();", Spaces); 15432 verifyFormat("auto &[ a, b ] = f();", Spaces); 15433 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 15434 verifyFormat("auto const &[ a, b ] = f();", Spaces); 15435 } 15436 15437 TEST_F(FormatTest, FileAndCode) { 15438 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 15439 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 15440 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 15441 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 15442 EXPECT_EQ(FormatStyle::LK_ObjC, 15443 guessLanguage("foo.h", "@interface Foo\n@end\n")); 15444 EXPECT_EQ( 15445 FormatStyle::LK_ObjC, 15446 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 15447 EXPECT_EQ(FormatStyle::LK_ObjC, 15448 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 15449 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 15450 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 15451 EXPECT_EQ(FormatStyle::LK_ObjC, 15452 guessLanguage("foo", "@interface Foo\n@end\n")); 15453 EXPECT_EQ(FormatStyle::LK_ObjC, 15454 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 15455 EXPECT_EQ( 15456 FormatStyle::LK_ObjC, 15457 guessLanguage("foo.h", 15458 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 15459 EXPECT_EQ( 15460 FormatStyle::LK_Cpp, 15461 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 15462 } 15463 15464 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 15465 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 15466 EXPECT_EQ(FormatStyle::LK_ObjC, 15467 guessLanguage("foo.h", "array[[calculator getIndex]];")); 15468 EXPECT_EQ(FormatStyle::LK_Cpp, 15469 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 15470 EXPECT_EQ( 15471 FormatStyle::LK_Cpp, 15472 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 15473 EXPECT_EQ(FormatStyle::LK_ObjC, 15474 guessLanguage("foo.h", "[[noreturn foo] bar];")); 15475 EXPECT_EQ(FormatStyle::LK_Cpp, 15476 guessLanguage("foo.h", "[[clang::fallthrough]];")); 15477 EXPECT_EQ(FormatStyle::LK_ObjC, 15478 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 15479 EXPECT_EQ(FormatStyle::LK_Cpp, 15480 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 15481 EXPECT_EQ(FormatStyle::LK_Cpp, 15482 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 15483 EXPECT_EQ(FormatStyle::LK_ObjC, 15484 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 15485 EXPECT_EQ(FormatStyle::LK_Cpp, 15486 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 15487 EXPECT_EQ( 15488 FormatStyle::LK_Cpp, 15489 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 15490 EXPECT_EQ( 15491 FormatStyle::LK_Cpp, 15492 guessLanguage("foo.h", 15493 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 15494 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 15495 } 15496 15497 TEST_F(FormatTest, GuessLanguageWithCaret) { 15498 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 15499 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 15500 EXPECT_EQ(FormatStyle::LK_ObjC, 15501 guessLanguage("foo.h", "int(^)(char, float);")); 15502 EXPECT_EQ(FormatStyle::LK_ObjC, 15503 guessLanguage("foo.h", "int(^foo)(char, float);")); 15504 EXPECT_EQ(FormatStyle::LK_ObjC, 15505 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 15506 EXPECT_EQ(FormatStyle::LK_ObjC, 15507 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 15508 EXPECT_EQ( 15509 FormatStyle::LK_ObjC, 15510 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 15511 } 15512 15513 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) { 15514 // ASM symbolic names are identifiers that must be surrounded by [] without 15515 // space in between: 15516 // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands 15517 15518 // Example from https://bugs.llvm.org/show_bug.cgi?id=45108. 15519 verifyFormat(R"(// 15520 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result)); 15521 )"); 15522 15523 // A list of several ASM symbolic names. 15524 verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)"); 15525 15526 // ASM symbolic names in inline ASM with inputs and outputs. 15527 verifyFormat(R"(// 15528 asm("cmoveq %1, %2, %[result]" 15529 : [result] "=r"(result) 15530 : "r"(test), "r"(new), "[result]"(old)); 15531 )"); 15532 15533 // ASM symbolic names in inline ASM with no outputs. 15534 verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)"); 15535 } 15536 15537 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 15538 EXPECT_EQ(FormatStyle::LK_Cpp, 15539 guessLanguage("foo.h", "void f() {\n" 15540 " asm (\"mov %[e], %[d]\"\n" 15541 " : [d] \"=rm\" (d)\n" 15542 " [e] \"rm\" (*e));\n" 15543 "}")); 15544 EXPECT_EQ(FormatStyle::LK_Cpp, 15545 guessLanguage("foo.h", "void f() {\n" 15546 " _asm (\"mov %[e], %[d]\"\n" 15547 " : [d] \"=rm\" (d)\n" 15548 " [e] \"rm\" (*e));\n" 15549 "}")); 15550 EXPECT_EQ(FormatStyle::LK_Cpp, 15551 guessLanguage("foo.h", "void f() {\n" 15552 " __asm (\"mov %[e], %[d]\"\n" 15553 " : [d] \"=rm\" (d)\n" 15554 " [e] \"rm\" (*e));\n" 15555 "}")); 15556 EXPECT_EQ(FormatStyle::LK_Cpp, 15557 guessLanguage("foo.h", "void f() {\n" 15558 " __asm__ (\"mov %[e], %[d]\"\n" 15559 " : [d] \"=rm\" (d)\n" 15560 " [e] \"rm\" (*e));\n" 15561 "}")); 15562 EXPECT_EQ(FormatStyle::LK_Cpp, 15563 guessLanguage("foo.h", "void f() {\n" 15564 " asm (\"mov %[e], %[d]\"\n" 15565 " : [d] \"=rm\" (d),\n" 15566 " [e] \"rm\" (*e));\n" 15567 "}")); 15568 EXPECT_EQ(FormatStyle::LK_Cpp, 15569 guessLanguage("foo.h", "void f() {\n" 15570 " asm volatile (\"mov %[e], %[d]\"\n" 15571 " : [d] \"=rm\" (d)\n" 15572 " [e] \"rm\" (*e));\n" 15573 "}")); 15574 } 15575 15576 TEST_F(FormatTest, GuessLanguageWithChildLines) { 15577 EXPECT_EQ(FormatStyle::LK_Cpp, 15578 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 15579 EXPECT_EQ(FormatStyle::LK_ObjC, 15580 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 15581 EXPECT_EQ( 15582 FormatStyle::LK_Cpp, 15583 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 15584 EXPECT_EQ( 15585 FormatStyle::LK_ObjC, 15586 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 15587 } 15588 15589 TEST_F(FormatTest, TypenameMacros) { 15590 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 15591 15592 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 15593 FormatStyle Google = getGoogleStyleWithColumns(0); 15594 Google.TypenameMacros = TypenameMacros; 15595 verifyFormat("struct foo {\n" 15596 " int bar;\n" 15597 " TAILQ_ENTRY(a) bleh;\n" 15598 "};", 15599 Google); 15600 15601 FormatStyle Macros = getLLVMStyle(); 15602 Macros.TypenameMacros = TypenameMacros; 15603 15604 verifyFormat("STACK_OF(int) a;", Macros); 15605 verifyFormat("STACK_OF(int) *a;", Macros); 15606 verifyFormat("STACK_OF(int const *) *a;", Macros); 15607 verifyFormat("STACK_OF(int *const) *a;", Macros); 15608 verifyFormat("STACK_OF(int, string) a;", Macros); 15609 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 15610 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 15611 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 15612 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 15613 15614 Macros.PointerAlignment = FormatStyle::PAS_Left; 15615 verifyFormat("STACK_OF(int)* a;", Macros); 15616 verifyFormat("STACK_OF(int*)* a;", Macros); 15617 } 15618 15619 TEST_F(FormatTest, AmbersandInLamda) { 15620 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 15621 FormatStyle AlignStyle = getLLVMStyle(); 15622 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 15623 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 15624 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 15625 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 15626 } 15627 15628 TEST_F(FormatTest, SpacesInConditionalStatement) { 15629 FormatStyle Spaces = getLLVMStyle(); 15630 Spaces.SpacesInConditionalStatement = true; 15631 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 15632 verifyFormat("if ( !a )\n return;", Spaces); 15633 verifyFormat("if ( a )\n return;", Spaces); 15634 verifyFormat("if constexpr ( a )\n return;", Spaces); 15635 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 15636 verifyFormat("while ( a )\n return;", Spaces); 15637 verifyFormat("while ( (a && b) )\n return;", Spaces); 15638 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 15639 verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces); 15640 // Check that space on the left of "::" is inserted as expected at beginning 15641 // of condition. 15642 verifyFormat("while ( ::func() )\n return;", Spaces); 15643 } 15644 15645 TEST_F(FormatTest, AlternativeOperators) { 15646 // Test case for ensuring alternate operators are not 15647 // combined with their right most neighbour. 15648 verifyFormat("int a and b;"); 15649 verifyFormat("int a and_eq b;"); 15650 verifyFormat("int a bitand b;"); 15651 verifyFormat("int a bitor b;"); 15652 verifyFormat("int a compl b;"); 15653 verifyFormat("int a not b;"); 15654 verifyFormat("int a not_eq b;"); 15655 verifyFormat("int a or b;"); 15656 verifyFormat("int a xor b;"); 15657 verifyFormat("int a xor_eq b;"); 15658 verifyFormat("return this not_eq bitand other;"); 15659 verifyFormat("bool operator not_eq(const X bitand other)"); 15660 15661 verifyFormat("int a and 5;"); 15662 verifyFormat("int a and_eq 5;"); 15663 verifyFormat("int a bitand 5;"); 15664 verifyFormat("int a bitor 5;"); 15665 verifyFormat("int a compl 5;"); 15666 verifyFormat("int a not 5;"); 15667 verifyFormat("int a not_eq 5;"); 15668 verifyFormat("int a or 5;"); 15669 verifyFormat("int a xor 5;"); 15670 verifyFormat("int a xor_eq 5;"); 15671 15672 verifyFormat("int a compl(5);"); 15673 verifyFormat("int a not(5);"); 15674 15675 /* FIXME handle alternate tokens 15676 * https://en.cppreference.com/w/cpp/language/operator_alternative 15677 // alternative tokens 15678 verifyFormat("compl foo();"); // ~foo(); 15679 verifyFormat("foo() <%%>;"); // foo(); 15680 verifyFormat("void foo() <%%>;"); // void foo(){} 15681 verifyFormat("int a <:1:>;"); // int a[1];[ 15682 verifyFormat("%:define ABC abc"); // #define ABC abc 15683 verifyFormat("%:%:"); // ## 15684 */ 15685 } 15686 15687 TEST_F(FormatTest, STLWhileNotDefineChed) { 15688 verifyFormat("#if defined(while)\n" 15689 "#define while EMIT WARNING C4005\n" 15690 "#endif // while"); 15691 } 15692 15693 TEST_F(FormatTest, OperatorSpacing) { 15694 FormatStyle Style = getLLVMStyle(); 15695 Style.PointerAlignment = FormatStyle::PAS_Right; 15696 verifyFormat("Foo::operator*();", Style); 15697 verifyFormat("Foo::operator void *();", Style); 15698 verifyFormat("Foo::operator void **();", Style); 15699 verifyFormat("Foo::operator()(void *);", Style); 15700 verifyFormat("Foo::operator*(void *);", Style); 15701 verifyFormat("Foo::operator*();", Style); 15702 verifyFormat("Foo::operator**();", Style); 15703 verifyFormat("Foo::operator&();", Style); 15704 verifyFormat("Foo::operator<int> *();", Style); 15705 verifyFormat("Foo::operator<Foo> *();", Style); 15706 verifyFormat("Foo::operator<int> **();", Style); 15707 verifyFormat("Foo::operator<Foo> **();", Style); 15708 verifyFormat("Foo::operator<int> &();", Style); 15709 verifyFormat("Foo::operator<Foo> &();", Style); 15710 verifyFormat("Foo::operator<int> &&();", Style); 15711 verifyFormat("Foo::operator<Foo> &&();", Style); 15712 verifyFormat("operator*(int (*)(), class Foo);", Style); 15713 15714 verifyFormat("Foo::operator&();", Style); 15715 verifyFormat("Foo::operator void &();", Style); 15716 verifyFormat("Foo::operator()(void &);", Style); 15717 verifyFormat("Foo::operator&(void &);", Style); 15718 verifyFormat("Foo::operator&();", Style); 15719 verifyFormat("operator&(int (&)(), class Foo);", Style); 15720 15721 verifyFormat("Foo::operator&&();", Style); 15722 verifyFormat("Foo::operator**();", Style); 15723 verifyFormat("Foo::operator void &&();", Style); 15724 verifyFormat("Foo::operator()(void &&);", Style); 15725 verifyFormat("Foo::operator&&(void &&);", Style); 15726 verifyFormat("Foo::operator&&();", Style); 15727 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15728 verifyFormat("operator const nsTArrayRight<E> &()", Style); 15729 verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()", 15730 Style); 15731 verifyFormat("operator void **()", Style); 15732 verifyFormat("operator const FooRight<Object> &()", Style); 15733 verifyFormat("operator const FooRight<Object> *()", Style); 15734 verifyFormat("operator const FooRight<Object> **()", Style); 15735 15736 Style.PointerAlignment = FormatStyle::PAS_Left; 15737 verifyFormat("Foo::operator*();", Style); 15738 verifyFormat("Foo::operator**();", Style); 15739 verifyFormat("Foo::operator void*();", Style); 15740 verifyFormat("Foo::operator void**();", Style); 15741 verifyFormat("Foo::operator/*comment*/ void*();", Style); 15742 verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); 15743 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); 15744 verifyFormat("Foo::operator()(void*);", Style); 15745 verifyFormat("Foo::operator*(void*);", Style); 15746 verifyFormat("Foo::operator*();", Style); 15747 verifyFormat("Foo::operator<int>*();", Style); 15748 verifyFormat("Foo::operator<Foo>*();", Style); 15749 verifyFormat("Foo::operator<int>**();", Style); 15750 verifyFormat("Foo::operator<Foo>**();", Style); 15751 verifyFormat("Foo::operator<int>&();", Style); 15752 verifyFormat("Foo::operator<Foo>&();", Style); 15753 verifyFormat("Foo::operator<int>&&();", Style); 15754 verifyFormat("Foo::operator<Foo>&&();", Style); 15755 verifyFormat("operator*(int (*)(), class Foo);", Style); 15756 15757 verifyFormat("Foo::operator&();", Style); 15758 verifyFormat("Foo::operator void&();", Style); 15759 verifyFormat("Foo::operator/*comment*/ void&();", Style); 15760 verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); 15761 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); 15762 verifyFormat("Foo::operator()(void&);", Style); 15763 verifyFormat("Foo::operator&(void&);", Style); 15764 verifyFormat("Foo::operator&();", Style); 15765 verifyFormat("operator&(int (&)(), class Foo);", Style); 15766 15767 verifyFormat("Foo::operator&&();", Style); 15768 verifyFormat("Foo::operator void&&();", Style); 15769 verifyFormat("Foo::operator/*comment*/ void&&();", Style); 15770 verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); 15771 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); 15772 verifyFormat("Foo::operator()(void&&);", Style); 15773 verifyFormat("Foo::operator&&(void&&);", Style); 15774 verifyFormat("Foo::operator&&();", Style); 15775 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15776 verifyFormat("operator const nsTArrayLeft<E>&()", Style); 15777 verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()", 15778 Style); 15779 verifyFormat("operator void**()", Style); 15780 verifyFormat("operator const FooLeft<Object>&()", Style); 15781 verifyFormat("operator const FooLeft<Object>*()", Style); 15782 verifyFormat("operator const FooLeft<Object>**()", Style); 15783 15784 // PR45107 15785 verifyFormat("operator Vector<String>&();", Style); 15786 verifyFormat("operator const Vector<String>&();", Style); 15787 verifyFormat("operator foo::Bar*();", Style); 15788 verifyFormat("operator const Foo<X>::Bar<Y>*();", Style); 15789 verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();", 15790 Style); 15791 15792 Style.PointerAlignment = FormatStyle::PAS_Middle; 15793 verifyFormat("Foo::operator*();", Style); 15794 verifyFormat("Foo::operator void *();", Style); 15795 verifyFormat("Foo::operator()(void *);", Style); 15796 verifyFormat("Foo::operator*(void *);", Style); 15797 verifyFormat("Foo::operator*();", Style); 15798 verifyFormat("operator*(int (*)(), class Foo);", Style); 15799 15800 verifyFormat("Foo::operator&();", Style); 15801 verifyFormat("Foo::operator void &();", Style); 15802 verifyFormat("Foo::operator()(void &);", Style); 15803 verifyFormat("Foo::operator&(void &);", Style); 15804 verifyFormat("Foo::operator&();", Style); 15805 verifyFormat("operator&(int (&)(), class Foo);", Style); 15806 15807 verifyFormat("Foo::operator&&();", Style); 15808 verifyFormat("Foo::operator void &&();", Style); 15809 verifyFormat("Foo::operator()(void &&);", Style); 15810 verifyFormat("Foo::operator&&(void &&);", Style); 15811 verifyFormat("Foo::operator&&();", Style); 15812 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15813 } 15814 15815 } // namespace 15816 } // namespace format 15817 } // namespace clang 15818