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 // As function-like macros. 976 verifyFormat("#define foreach(x, y)\n" 977 "#define Q_FOREACH(x, y)\n" 978 "#define BOOST_FOREACH(x, y)\n" 979 "#define UNKNOWN_FOREACH(x, y)\n"); 980 981 // Not as function-like macros. 982 verifyFormat("#define foreach (x, y)\n" 983 "#define Q_FOREACH (x, y)\n" 984 "#define BOOST_FOREACH (x, y)\n" 985 "#define UNKNOWN_FOREACH (x, y)\n"); 986 } 987 988 TEST_F(FormatTest, FormatsWhileLoop) { 989 verifyFormat("while (true) {\n}"); 990 verifyFormat("while (true)\n" 991 " f();"); 992 verifyFormat("while () {\n}"); 993 verifyFormat("while () {\n" 994 " f();\n" 995 "}"); 996 } 997 998 TEST_F(FormatTest, FormatsDoWhile) { 999 verifyFormat("do {\n" 1000 " do_something();\n" 1001 "} while (something());"); 1002 verifyFormat("do\n" 1003 " do_something();\n" 1004 "while (something());"); 1005 } 1006 1007 TEST_F(FormatTest, FormatsSwitchStatement) { 1008 verifyFormat("switch (x) {\n" 1009 "case 1:\n" 1010 " f();\n" 1011 " break;\n" 1012 "case kFoo:\n" 1013 "case ns::kBar:\n" 1014 "case kBaz:\n" 1015 " break;\n" 1016 "default:\n" 1017 " g();\n" 1018 " break;\n" 1019 "}"); 1020 verifyFormat("switch (x) {\n" 1021 "case 1: {\n" 1022 " f();\n" 1023 " break;\n" 1024 "}\n" 1025 "case 2: {\n" 1026 " break;\n" 1027 "}\n" 1028 "}"); 1029 verifyFormat("switch (x) {\n" 1030 "case 1: {\n" 1031 " f();\n" 1032 " {\n" 1033 " g();\n" 1034 " h();\n" 1035 " }\n" 1036 " break;\n" 1037 "}\n" 1038 "}"); 1039 verifyFormat("switch (x) {\n" 1040 "case 1: {\n" 1041 " f();\n" 1042 " if (foo) {\n" 1043 " g();\n" 1044 " h();\n" 1045 " }\n" 1046 " break;\n" 1047 "}\n" 1048 "}"); 1049 verifyFormat("switch (x) {\n" 1050 "case 1: {\n" 1051 " f();\n" 1052 " g();\n" 1053 "} break;\n" 1054 "}"); 1055 verifyFormat("switch (test)\n" 1056 " ;"); 1057 verifyFormat("switch (x) {\n" 1058 "default: {\n" 1059 " // Do nothing.\n" 1060 "}\n" 1061 "}"); 1062 verifyFormat("switch (x) {\n" 1063 "// comment\n" 1064 "// if 1, do f()\n" 1065 "case 1:\n" 1066 " f();\n" 1067 "}"); 1068 verifyFormat("switch (x) {\n" 1069 "case 1:\n" 1070 " // Do amazing stuff\n" 1071 " {\n" 1072 " f();\n" 1073 " g();\n" 1074 " }\n" 1075 " break;\n" 1076 "}"); 1077 verifyFormat("#define A \\\n" 1078 " switch (x) { \\\n" 1079 " case a: \\\n" 1080 " foo = b; \\\n" 1081 " }", 1082 getLLVMStyleWithColumns(20)); 1083 verifyFormat("#define OPERATION_CASE(name) \\\n" 1084 " case OP_name: \\\n" 1085 " return operations::Operation##name\n", 1086 getLLVMStyleWithColumns(40)); 1087 verifyFormat("switch (x) {\n" 1088 "case 1:;\n" 1089 "default:;\n" 1090 " int i;\n" 1091 "}"); 1092 1093 verifyGoogleFormat("switch (x) {\n" 1094 " case 1:\n" 1095 " f();\n" 1096 " break;\n" 1097 " case kFoo:\n" 1098 " case ns::kBar:\n" 1099 " case kBaz:\n" 1100 " break;\n" 1101 " default:\n" 1102 " g();\n" 1103 " break;\n" 1104 "}"); 1105 verifyGoogleFormat("switch (x) {\n" 1106 " case 1: {\n" 1107 " f();\n" 1108 " break;\n" 1109 " }\n" 1110 "}"); 1111 verifyGoogleFormat("switch (test)\n" 1112 " ;"); 1113 1114 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1115 " case OP_name: \\\n" 1116 " return operations::Operation##name\n"); 1117 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1118 " // Get the correction operation class.\n" 1119 " switch (OpCode) {\n" 1120 " CASE(Add);\n" 1121 " CASE(Subtract);\n" 1122 " default:\n" 1123 " return operations::Unknown;\n" 1124 " }\n" 1125 "#undef OPERATION_CASE\n" 1126 "}"); 1127 verifyFormat("DEBUG({\n" 1128 " switch (x) {\n" 1129 " case A:\n" 1130 " f();\n" 1131 " break;\n" 1132 " // fallthrough\n" 1133 " case B:\n" 1134 " g();\n" 1135 " break;\n" 1136 " }\n" 1137 "});"); 1138 EXPECT_EQ("DEBUG({\n" 1139 " switch (x) {\n" 1140 " case A:\n" 1141 " f();\n" 1142 " break;\n" 1143 " // On B:\n" 1144 " case B:\n" 1145 " g();\n" 1146 " break;\n" 1147 " }\n" 1148 "});", 1149 format("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 getLLVMStyle())); 1161 EXPECT_EQ("switch (n) {\n" 1162 "case 0: {\n" 1163 " return false;\n" 1164 "}\n" 1165 "default: {\n" 1166 " return true;\n" 1167 "}\n" 1168 "}", 1169 format("switch (n)\n" 1170 "{\n" 1171 "case 0: {\n" 1172 " return false;\n" 1173 "}\n" 1174 "default: {\n" 1175 " return true;\n" 1176 "}\n" 1177 "}", 1178 getLLVMStyle())); 1179 verifyFormat("switch (a) {\n" 1180 "case (b):\n" 1181 " return;\n" 1182 "}"); 1183 1184 verifyFormat("switch (a) {\n" 1185 "case some_namespace::\n" 1186 " some_constant:\n" 1187 " return;\n" 1188 "}", 1189 getLLVMStyleWithColumns(34)); 1190 1191 FormatStyle Style = getLLVMStyle(); 1192 Style.IndentCaseLabels = true; 1193 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1194 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1195 Style.BraceWrapping.AfterCaseLabel = true; 1196 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1197 EXPECT_EQ("switch (n)\n" 1198 "{\n" 1199 " case 0:\n" 1200 " {\n" 1201 " return false;\n" 1202 " }\n" 1203 " default:\n" 1204 " {\n" 1205 " return true;\n" 1206 " }\n" 1207 "}", 1208 format("switch (n) {\n" 1209 " case 0: {\n" 1210 " return false;\n" 1211 " }\n" 1212 " default: {\n" 1213 " return true;\n" 1214 " }\n" 1215 "}", 1216 Style)); 1217 Style.BraceWrapping.AfterCaseLabel = false; 1218 EXPECT_EQ("switch (n)\n" 1219 "{\n" 1220 " case 0: {\n" 1221 " return false;\n" 1222 " }\n" 1223 " default: {\n" 1224 " return true;\n" 1225 " }\n" 1226 "}", 1227 format("switch (n) {\n" 1228 " case 0:\n" 1229 " {\n" 1230 " return false;\n" 1231 " }\n" 1232 " default:\n" 1233 " {\n" 1234 " return true;\n" 1235 " }\n" 1236 "}", 1237 Style)); 1238 Style.IndentCaseLabels = false; 1239 Style.IndentCaseBlocks = true; 1240 EXPECT_EQ("switch (n)\n" 1241 "{\n" 1242 "case 0:\n" 1243 " {\n" 1244 " return false;\n" 1245 " }\n" 1246 "case 1:\n" 1247 " break;\n" 1248 "default:\n" 1249 " {\n" 1250 " return true;\n" 1251 " }\n" 1252 "}", 1253 format("switch (n) {\n" 1254 "case 0: {\n" 1255 " return false;\n" 1256 "}\n" 1257 "case 1:\n" 1258 " break;\n" 1259 "default: {\n" 1260 " return true;\n" 1261 "}\n" 1262 "}", 1263 Style)); 1264 Style.IndentCaseLabels = true; 1265 Style.IndentCaseBlocks = true; 1266 EXPECT_EQ("switch (n)\n" 1267 "{\n" 1268 " case 0:\n" 1269 " {\n" 1270 " return false;\n" 1271 " }\n" 1272 " case 1:\n" 1273 " break;\n" 1274 " default:\n" 1275 " {\n" 1276 " return true;\n" 1277 " }\n" 1278 "}", 1279 format("switch (n) {\n" 1280 "case 0: {\n" 1281 " return false;\n" 1282 "}\n" 1283 "case 1:\n" 1284 " break;\n" 1285 "default: {\n" 1286 " return true;\n" 1287 "}\n" 1288 "}", 1289 Style)); 1290 } 1291 1292 TEST_F(FormatTest, CaseRanges) { 1293 verifyFormat("switch (x) {\n" 1294 "case 'A' ... 'Z':\n" 1295 "case 1 ... 5:\n" 1296 "case a ... b:\n" 1297 " break;\n" 1298 "}"); 1299 } 1300 1301 TEST_F(FormatTest, ShortCaseLabels) { 1302 FormatStyle Style = getLLVMStyle(); 1303 Style.AllowShortCaseLabelsOnASingleLine = true; 1304 verifyFormat("switch (a) {\n" 1305 "case 1: x = 1; break;\n" 1306 "case 2: return;\n" 1307 "case 3:\n" 1308 "case 4:\n" 1309 "case 5: return;\n" 1310 "case 6: // comment\n" 1311 " return;\n" 1312 "case 7:\n" 1313 " // comment\n" 1314 " return;\n" 1315 "case 8:\n" 1316 " x = 8; // comment\n" 1317 " break;\n" 1318 "default: y = 1; break;\n" 1319 "}", 1320 Style); 1321 verifyFormat("switch (a) {\n" 1322 "case 0: return; // comment\n" 1323 "case 1: break; // comment\n" 1324 "case 2: return;\n" 1325 "// comment\n" 1326 "case 3: return;\n" 1327 "// comment 1\n" 1328 "// comment 2\n" 1329 "// comment 3\n" 1330 "case 4: break; /* comment */\n" 1331 "case 5:\n" 1332 " // comment\n" 1333 " break;\n" 1334 "case 6: /* comment */ x = 1; break;\n" 1335 "case 7: x = /* comment */ 1; break;\n" 1336 "case 8:\n" 1337 " x = 1; /* comment */\n" 1338 " break;\n" 1339 "case 9:\n" 1340 " break; // comment line 1\n" 1341 " // comment line 2\n" 1342 "}", 1343 Style); 1344 EXPECT_EQ("switch (a) {\n" 1345 "case 1:\n" 1346 " x = 8;\n" 1347 " // fall through\n" 1348 "case 2: x = 8;\n" 1349 "// comment\n" 1350 "case 3:\n" 1351 " return; /* comment line 1\n" 1352 " * comment line 2 */\n" 1353 "case 4: i = 8;\n" 1354 "// something else\n" 1355 "#if FOO\n" 1356 "case 5: break;\n" 1357 "#endif\n" 1358 "}", 1359 format("switch (a) {\n" 1360 "case 1: x = 8;\n" 1361 " // fall through\n" 1362 "case 2:\n" 1363 " x = 8;\n" 1364 "// comment\n" 1365 "case 3:\n" 1366 " return; /* comment line 1\n" 1367 " * comment line 2 */\n" 1368 "case 4:\n" 1369 " i = 8;\n" 1370 "// something else\n" 1371 "#if FOO\n" 1372 "case 5: break;\n" 1373 "#endif\n" 1374 "}", 1375 Style)); 1376 EXPECT_EQ("switch (a) {\n" 1377 "case 0:\n" 1378 " return; // long long long long long long long long long long " 1379 "long long comment\n" 1380 " // line\n" 1381 "}", 1382 format("switch (a) {\n" 1383 "case 0: return; // long long long long long long long long " 1384 "long long long long comment line\n" 1385 "}", 1386 Style)); 1387 EXPECT_EQ("switch (a) {\n" 1388 "case 0:\n" 1389 " return; /* long long long long long long long long long long " 1390 "long long comment\n" 1391 " line */\n" 1392 "}", 1393 format("switch (a) {\n" 1394 "case 0: return; /* long long long long long long long long " 1395 "long long long long comment line */\n" 1396 "}", 1397 Style)); 1398 verifyFormat("switch (a) {\n" 1399 "#if FOO\n" 1400 "case 0: return 0;\n" 1401 "#endif\n" 1402 "}", 1403 Style); 1404 verifyFormat("switch (a) {\n" 1405 "case 1: {\n" 1406 "}\n" 1407 "case 2: {\n" 1408 " return;\n" 1409 "}\n" 1410 "case 3: {\n" 1411 " x = 1;\n" 1412 " return;\n" 1413 "}\n" 1414 "case 4:\n" 1415 " if (x)\n" 1416 " return;\n" 1417 "}", 1418 Style); 1419 Style.ColumnLimit = 21; 1420 verifyFormat("switch (a) {\n" 1421 "case 1: x = 1; break;\n" 1422 "case 2: return;\n" 1423 "case 3:\n" 1424 "case 4:\n" 1425 "case 5: return;\n" 1426 "default:\n" 1427 " y = 1;\n" 1428 " break;\n" 1429 "}", 1430 Style); 1431 Style.ColumnLimit = 80; 1432 Style.AllowShortCaseLabelsOnASingleLine = false; 1433 Style.IndentCaseLabels = true; 1434 EXPECT_EQ("switch (n) {\n" 1435 " default /*comments*/:\n" 1436 " return true;\n" 1437 " case 0:\n" 1438 " return false;\n" 1439 "}", 1440 format("switch (n) {\n" 1441 "default/*comments*/:\n" 1442 " return true;\n" 1443 "case 0:\n" 1444 " return false;\n" 1445 "}", 1446 Style)); 1447 Style.AllowShortCaseLabelsOnASingleLine = true; 1448 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1449 Style.BraceWrapping.AfterCaseLabel = true; 1450 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1451 EXPECT_EQ("switch (n)\n" 1452 "{\n" 1453 " case 0:\n" 1454 " {\n" 1455 " return false;\n" 1456 " }\n" 1457 " default:\n" 1458 " {\n" 1459 " return true;\n" 1460 " }\n" 1461 "}", 1462 format("switch (n) {\n" 1463 " case 0: {\n" 1464 " return false;\n" 1465 " }\n" 1466 " default:\n" 1467 " {\n" 1468 " return true;\n" 1469 " }\n" 1470 "}", 1471 Style)); 1472 } 1473 1474 TEST_F(FormatTest, FormatsLabels) { 1475 verifyFormat("void f() {\n" 1476 " some_code();\n" 1477 "test_label:\n" 1478 " some_other_code();\n" 1479 " {\n" 1480 " some_more_code();\n" 1481 " another_label:\n" 1482 " some_more_code();\n" 1483 " }\n" 1484 "}"); 1485 verifyFormat("{\n" 1486 " some_code();\n" 1487 "test_label:\n" 1488 " some_other_code();\n" 1489 "}"); 1490 verifyFormat("{\n" 1491 " some_code();\n" 1492 "test_label:;\n" 1493 " int i = 0;\n" 1494 "}"); 1495 FormatStyle Style = getLLVMStyle(); 1496 Style.IndentGotoLabels = false; 1497 verifyFormat("void f() {\n" 1498 " some_code();\n" 1499 "test_label:\n" 1500 " some_other_code();\n" 1501 " {\n" 1502 " some_more_code();\n" 1503 "another_label:\n" 1504 " some_more_code();\n" 1505 " }\n" 1506 "}", 1507 Style); 1508 verifyFormat("{\n" 1509 " some_code();\n" 1510 "test_label:\n" 1511 " some_other_code();\n" 1512 "}", 1513 Style); 1514 verifyFormat("{\n" 1515 " some_code();\n" 1516 "test_label:;\n" 1517 " int i = 0;\n" 1518 "}"); 1519 } 1520 1521 TEST_F(FormatTest, MultiLineControlStatements) { 1522 FormatStyle Style = getLLVMStyle(); 1523 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1524 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; 1525 Style.ColumnLimit = 20; 1526 // Short lines should keep opening brace on same line. 1527 EXPECT_EQ("if (foo) {\n" 1528 " bar();\n" 1529 "}", 1530 format("if(foo){bar();}", Style)); 1531 EXPECT_EQ("if (foo) {\n" 1532 " bar();\n" 1533 "} else {\n" 1534 " baz();\n" 1535 "}", 1536 format("if(foo){bar();}else{baz();}", Style)); 1537 EXPECT_EQ("if (foo && bar) {\n" 1538 " baz();\n" 1539 "}", 1540 format("if(foo&&bar){baz();}", Style)); 1541 EXPECT_EQ("if (foo) {\n" 1542 " bar();\n" 1543 "} else if (baz) {\n" 1544 " quux();\n" 1545 "}", 1546 format("if(foo){bar();}else if(baz){quux();}", Style)); 1547 EXPECT_EQ( 1548 "if (foo) {\n" 1549 " bar();\n" 1550 "} else if (baz) {\n" 1551 " quux();\n" 1552 "} else {\n" 1553 " foobar();\n" 1554 "}", 1555 format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); 1556 EXPECT_EQ("for (;;) {\n" 1557 " foo();\n" 1558 "}", 1559 format("for(;;){foo();}")); 1560 EXPECT_EQ("while (1) {\n" 1561 " foo();\n" 1562 "}", 1563 format("while(1){foo();}", Style)); 1564 EXPECT_EQ("switch (foo) {\n" 1565 "case bar:\n" 1566 " return;\n" 1567 "}", 1568 format("switch(foo){case bar:return;}", Style)); 1569 EXPECT_EQ("try {\n" 1570 " foo();\n" 1571 "} catch (...) {\n" 1572 " bar();\n" 1573 "}", 1574 format("try{foo();}catch(...){bar();}", Style)); 1575 EXPECT_EQ("do {\n" 1576 " foo();\n" 1577 "} while (bar &&\n" 1578 " baz);", 1579 format("do{foo();}while(bar&&baz);", Style)); 1580 // Long lines should put opening brace on new line. 1581 EXPECT_EQ("if (foo && bar &&\n" 1582 " baz)\n" 1583 "{\n" 1584 " quux();\n" 1585 "}", 1586 format("if(foo&&bar&&baz){quux();}", Style)); 1587 EXPECT_EQ("if (foo && bar &&\n" 1588 " baz)\n" 1589 "{\n" 1590 " quux();\n" 1591 "}", 1592 format("if (foo && bar &&\n" 1593 " baz) {\n" 1594 " quux();\n" 1595 "}", 1596 Style)); 1597 EXPECT_EQ("if (foo) {\n" 1598 " bar();\n" 1599 "} else if (baz ||\n" 1600 " quux)\n" 1601 "{\n" 1602 " foobar();\n" 1603 "}", 1604 format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); 1605 EXPECT_EQ( 1606 "if (foo) {\n" 1607 " bar();\n" 1608 "} else if (baz ||\n" 1609 " quux)\n" 1610 "{\n" 1611 " foobar();\n" 1612 "} else {\n" 1613 " barbaz();\n" 1614 "}", 1615 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1616 Style)); 1617 EXPECT_EQ("for (int i = 0;\n" 1618 " i < 10; ++i)\n" 1619 "{\n" 1620 " foo();\n" 1621 "}", 1622 format("for(int i=0;i<10;++i){foo();}", Style)); 1623 EXPECT_EQ("while (foo || bar ||\n" 1624 " baz)\n" 1625 "{\n" 1626 " quux();\n" 1627 "}", 1628 format("while(foo||bar||baz){quux();}", Style)); 1629 EXPECT_EQ("switch (\n" 1630 " foo = barbaz)\n" 1631 "{\n" 1632 "case quux:\n" 1633 " return;\n" 1634 "}", 1635 format("switch(foo=barbaz){case quux:return;}", Style)); 1636 EXPECT_EQ("try {\n" 1637 " foo();\n" 1638 "} catch (\n" 1639 " Exception &bar)\n" 1640 "{\n" 1641 " baz();\n" 1642 "}", 1643 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1644 Style.ColumnLimit = 1645 40; // to concentrate at brace wrapping, not line wrap due to column limit 1646 EXPECT_EQ("try {\n" 1647 " foo();\n" 1648 "} catch (Exception &bar) {\n" 1649 " baz();\n" 1650 "}", 1651 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1652 Style.ColumnLimit = 1653 20; // to concentrate at brace wrapping, not line wrap due to column limit 1654 1655 Style.BraceWrapping.BeforeElse = true; 1656 EXPECT_EQ( 1657 "if (foo) {\n" 1658 " bar();\n" 1659 "}\n" 1660 "else if (baz ||\n" 1661 " quux)\n" 1662 "{\n" 1663 " foobar();\n" 1664 "}\n" 1665 "else {\n" 1666 " barbaz();\n" 1667 "}", 1668 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1669 Style)); 1670 1671 Style.BraceWrapping.BeforeCatch = true; 1672 EXPECT_EQ("try {\n" 1673 " foo();\n" 1674 "}\n" 1675 "catch (...) {\n" 1676 " baz();\n" 1677 "}", 1678 format("try{foo();}catch(...){baz();}", Style)); 1679 } 1680 1681 //===----------------------------------------------------------------------===// 1682 // Tests for classes, namespaces, etc. 1683 //===----------------------------------------------------------------------===// 1684 1685 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1686 verifyFormat("class A {};"); 1687 } 1688 1689 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1690 verifyFormat("class A {\n" 1691 "public:\n" 1692 "public: // comment\n" 1693 "protected:\n" 1694 "private:\n" 1695 " void f() {}\n" 1696 "};"); 1697 verifyFormat("export class A {\n" 1698 "public:\n" 1699 "public: // comment\n" 1700 "protected:\n" 1701 "private:\n" 1702 " void f() {}\n" 1703 "};"); 1704 verifyGoogleFormat("class A {\n" 1705 " public:\n" 1706 " protected:\n" 1707 " private:\n" 1708 " void f() {}\n" 1709 "};"); 1710 verifyGoogleFormat("export class A {\n" 1711 " public:\n" 1712 " protected:\n" 1713 " private:\n" 1714 " void f() {}\n" 1715 "};"); 1716 verifyFormat("class A {\n" 1717 "public slots:\n" 1718 " void f1() {}\n" 1719 "public Q_SLOTS:\n" 1720 " void f2() {}\n" 1721 "protected slots:\n" 1722 " void f3() {}\n" 1723 "protected Q_SLOTS:\n" 1724 " void f4() {}\n" 1725 "private slots:\n" 1726 " void f5() {}\n" 1727 "private Q_SLOTS:\n" 1728 " void f6() {}\n" 1729 "signals:\n" 1730 " void g1();\n" 1731 "Q_SIGNALS:\n" 1732 " void g2();\n" 1733 "};"); 1734 1735 // Don't interpret 'signals' the wrong way. 1736 verifyFormat("signals.set();"); 1737 verifyFormat("for (Signals signals : f()) {\n}"); 1738 verifyFormat("{\n" 1739 " signals.set(); // This needs indentation.\n" 1740 "}"); 1741 verifyFormat("void f() {\n" 1742 "label:\n" 1743 " signals.baz();\n" 1744 "}"); 1745 } 1746 1747 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1748 EXPECT_EQ("class A {\n" 1749 "public:\n" 1750 " void f();\n" 1751 "\n" 1752 "private:\n" 1753 " void g() {}\n" 1754 " // test\n" 1755 "protected:\n" 1756 " int h;\n" 1757 "};", 1758 format("class A {\n" 1759 "public:\n" 1760 "void f();\n" 1761 "private:\n" 1762 "void g() {}\n" 1763 "// test\n" 1764 "protected:\n" 1765 "int h;\n" 1766 "};")); 1767 EXPECT_EQ("class A {\n" 1768 "protected:\n" 1769 "public:\n" 1770 " void f();\n" 1771 "};", 1772 format("class A {\n" 1773 "protected:\n" 1774 "\n" 1775 "public:\n" 1776 "\n" 1777 " void f();\n" 1778 "};")); 1779 1780 // Even ensure proper spacing inside macros. 1781 EXPECT_EQ("#define B \\\n" 1782 " class A { \\\n" 1783 " protected: \\\n" 1784 " public: \\\n" 1785 " void f(); \\\n" 1786 " };", 1787 format("#define B \\\n" 1788 " class A { \\\n" 1789 " protected: \\\n" 1790 " \\\n" 1791 " public: \\\n" 1792 " \\\n" 1793 " void f(); \\\n" 1794 " };", 1795 getGoogleStyle())); 1796 // But don't remove empty lines after macros ending in access specifiers. 1797 EXPECT_EQ("#define A private:\n" 1798 "\n" 1799 "int i;", 1800 format("#define A private:\n" 1801 "\n" 1802 "int i;")); 1803 } 1804 1805 TEST_F(FormatTest, FormatsClasses) { 1806 verifyFormat("class A : public B {};"); 1807 verifyFormat("class A : public ::B {};"); 1808 1809 verifyFormat( 1810 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1811 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1812 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1813 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1814 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1815 verifyFormat( 1816 "class A : public B, public C, public D, public E, public F {};"); 1817 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1818 " public C,\n" 1819 " public D,\n" 1820 " public E,\n" 1821 " public F,\n" 1822 " public G {};"); 1823 1824 verifyFormat("class\n" 1825 " ReallyReallyLongClassName {\n" 1826 " int i;\n" 1827 "};", 1828 getLLVMStyleWithColumns(32)); 1829 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1830 " aaaaaaaaaaaaaaaa> {};"); 1831 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1832 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1833 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1834 verifyFormat("template <class R, class C>\n" 1835 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1836 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1837 verifyFormat("class ::A::B {};"); 1838 } 1839 1840 TEST_F(FormatTest, BreakInheritanceStyle) { 1841 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1842 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1843 FormatStyle::BILS_BeforeComma; 1844 verifyFormat("class MyClass : public X {};", 1845 StyleWithInheritanceBreakBeforeComma); 1846 verifyFormat("class MyClass\n" 1847 " : public X\n" 1848 " , public Y {};", 1849 StyleWithInheritanceBreakBeforeComma); 1850 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1851 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1852 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1853 StyleWithInheritanceBreakBeforeComma); 1854 verifyFormat("struct aaaaaaaaaaaaa\n" 1855 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1856 " aaaaaaaaaaaaaaaa> {};", 1857 StyleWithInheritanceBreakBeforeComma); 1858 1859 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1860 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1861 FormatStyle::BILS_AfterColon; 1862 verifyFormat("class MyClass : public X {};", 1863 StyleWithInheritanceBreakAfterColon); 1864 verifyFormat("class MyClass : public X, public Y {};", 1865 StyleWithInheritanceBreakAfterColon); 1866 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1867 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1868 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1869 StyleWithInheritanceBreakAfterColon); 1870 verifyFormat("struct aaaaaaaaaaaaa :\n" 1871 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1872 " aaaaaaaaaaaaaaaa> {};", 1873 StyleWithInheritanceBreakAfterColon); 1874 } 1875 1876 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1877 verifyFormat("class A {\n} a, b;"); 1878 verifyFormat("struct A {\n} a, b;"); 1879 verifyFormat("union A {\n} a;"); 1880 } 1881 1882 TEST_F(FormatTest, FormatsEnum) { 1883 verifyFormat("enum {\n" 1884 " Zero,\n" 1885 " One = 1,\n" 1886 " Two = One + 1,\n" 1887 " Three = (One + Two),\n" 1888 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1889 " Five = (One, Two, Three, Four, 5)\n" 1890 "};"); 1891 verifyGoogleFormat("enum {\n" 1892 " Zero,\n" 1893 " One = 1,\n" 1894 " Two = One + 1,\n" 1895 " Three = (One + Two),\n" 1896 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1897 " Five = (One, Two, Three, Four, 5)\n" 1898 "};"); 1899 verifyFormat("enum Enum {};"); 1900 verifyFormat("enum {};"); 1901 verifyFormat("enum X E {} d;"); 1902 verifyFormat("enum __attribute__((...)) E {} d;"); 1903 verifyFormat("enum __declspec__((...)) E {} d;"); 1904 verifyFormat("enum {\n" 1905 " Bar = Foo<int, int>::value\n" 1906 "};", 1907 getLLVMStyleWithColumns(30)); 1908 1909 verifyFormat("enum ShortEnum { A, B, C };"); 1910 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1911 1912 EXPECT_EQ("enum KeepEmptyLines {\n" 1913 " ONE,\n" 1914 "\n" 1915 " TWO,\n" 1916 "\n" 1917 " THREE\n" 1918 "}", 1919 format("enum KeepEmptyLines {\n" 1920 " ONE,\n" 1921 "\n" 1922 " TWO,\n" 1923 "\n" 1924 "\n" 1925 " THREE\n" 1926 "}")); 1927 verifyFormat("enum E { // comment\n" 1928 " ONE,\n" 1929 " TWO\n" 1930 "};\n" 1931 "int i;"); 1932 // Not enums. 1933 verifyFormat("enum X f() {\n" 1934 " a();\n" 1935 " return 42;\n" 1936 "}"); 1937 verifyFormat("enum X Type::f() {\n" 1938 " a();\n" 1939 " return 42;\n" 1940 "}"); 1941 verifyFormat("enum ::X f() {\n" 1942 " a();\n" 1943 " return 42;\n" 1944 "}"); 1945 verifyFormat("enum ns::X f() {\n" 1946 " a();\n" 1947 " return 42;\n" 1948 "}"); 1949 } 1950 1951 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1952 verifyFormat("enum Type {\n" 1953 " One = 0; // These semicolons should be commas.\n" 1954 " Two = 1;\n" 1955 "};"); 1956 verifyFormat("namespace n {\n" 1957 "enum Type {\n" 1958 " One,\n" 1959 " Two, // missing };\n" 1960 " int i;\n" 1961 "}\n" 1962 "void g() {}"); 1963 } 1964 1965 TEST_F(FormatTest, FormatsEnumStruct) { 1966 verifyFormat("enum struct {\n" 1967 " Zero,\n" 1968 " One = 1,\n" 1969 " Two = One + 1,\n" 1970 " Three = (One + Two),\n" 1971 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1972 " Five = (One, Two, Three, Four, 5)\n" 1973 "};"); 1974 verifyFormat("enum struct Enum {};"); 1975 verifyFormat("enum struct {};"); 1976 verifyFormat("enum struct X E {} d;"); 1977 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1978 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1979 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1980 } 1981 1982 TEST_F(FormatTest, FormatsEnumClass) { 1983 verifyFormat("enum class {\n" 1984 " Zero,\n" 1985 " One = 1,\n" 1986 " Two = One + 1,\n" 1987 " Three = (One + Two),\n" 1988 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1989 " Five = (One, Two, Three, Four, 5)\n" 1990 "};"); 1991 verifyFormat("enum class Enum {};"); 1992 verifyFormat("enum class {};"); 1993 verifyFormat("enum class X E {} d;"); 1994 verifyFormat("enum class __attribute__((...)) E {} d;"); 1995 verifyFormat("enum class __declspec__((...)) E {} d;"); 1996 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1997 } 1998 1999 TEST_F(FormatTest, FormatsEnumTypes) { 2000 verifyFormat("enum X : int {\n" 2001 " A, // Force multiple lines.\n" 2002 " B\n" 2003 "};"); 2004 verifyFormat("enum X : int { A, B };"); 2005 verifyFormat("enum X : std::uint32_t { A, B };"); 2006 } 2007 2008 TEST_F(FormatTest, FormatsTypedefEnum) { 2009 FormatStyle Style = getLLVMStyle(); 2010 Style.ColumnLimit = 40; 2011 verifyFormat("typedef enum {} EmptyEnum;"); 2012 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2013 verifyFormat("typedef enum {\n" 2014 " ZERO = 0,\n" 2015 " ONE = 1,\n" 2016 " TWO = 2,\n" 2017 " THREE = 3\n" 2018 "} LongEnum;", 2019 Style); 2020 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2021 Style.BraceWrapping.AfterEnum = true; 2022 verifyFormat("typedef enum {} EmptyEnum;"); 2023 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2024 verifyFormat("typedef enum\n" 2025 "{\n" 2026 " ZERO = 0,\n" 2027 " ONE = 1,\n" 2028 " TWO = 2,\n" 2029 " THREE = 3\n" 2030 "} LongEnum;", 2031 Style); 2032 } 2033 2034 TEST_F(FormatTest, FormatsNSEnums) { 2035 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2036 verifyGoogleFormat( 2037 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2038 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 2039 " // Information about someDecentlyLongValue.\n" 2040 " someDecentlyLongValue,\n" 2041 " // Information about anotherDecentlyLongValue.\n" 2042 " anotherDecentlyLongValue,\n" 2043 " // Information about aThirdDecentlyLongValue.\n" 2044 " aThirdDecentlyLongValue\n" 2045 "};"); 2046 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 2047 " // Information about someDecentlyLongValue.\n" 2048 " someDecentlyLongValue,\n" 2049 " // Information about anotherDecentlyLongValue.\n" 2050 " anotherDecentlyLongValue,\n" 2051 " // Information about aThirdDecentlyLongValue.\n" 2052 " aThirdDecentlyLongValue\n" 2053 "};"); 2054 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 2055 " a = 1,\n" 2056 " b = 2,\n" 2057 " c = 3,\n" 2058 "};"); 2059 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 2060 " a = 1,\n" 2061 " b = 2,\n" 2062 " c = 3,\n" 2063 "};"); 2064 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 2065 " a = 1,\n" 2066 " b = 2,\n" 2067 " c = 3,\n" 2068 "};"); 2069 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 2070 " a = 1,\n" 2071 " b = 2,\n" 2072 " c = 3,\n" 2073 "};"); 2074 } 2075 2076 TEST_F(FormatTest, FormatsBitfields) { 2077 verifyFormat("struct Bitfields {\n" 2078 " unsigned sClass : 8;\n" 2079 " unsigned ValueKind : 2;\n" 2080 "};"); 2081 verifyFormat("struct A {\n" 2082 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 2083 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 2084 "};"); 2085 verifyFormat("struct MyStruct {\n" 2086 " uchar data;\n" 2087 " uchar : 8;\n" 2088 " uchar : 8;\n" 2089 " uchar other;\n" 2090 "};"); 2091 } 2092 2093 TEST_F(FormatTest, FormatsNamespaces) { 2094 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 2095 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 2096 2097 verifyFormat("namespace some_namespace {\n" 2098 "class A {};\n" 2099 "void f() { f(); }\n" 2100 "}", 2101 LLVMWithNoNamespaceFix); 2102 verifyFormat("namespace N::inline D {\n" 2103 "class A {};\n" 2104 "void f() { f(); }\n" 2105 "}", 2106 LLVMWithNoNamespaceFix); 2107 verifyFormat("namespace N::inline D::E {\n" 2108 "class A {};\n" 2109 "void f() { f(); }\n" 2110 "}", 2111 LLVMWithNoNamespaceFix); 2112 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 2113 "class A {};\n" 2114 "void f() { f(); }\n" 2115 "}", 2116 LLVMWithNoNamespaceFix); 2117 verifyFormat("/* something */ namespace some_namespace {\n" 2118 "class A {};\n" 2119 "void f() { f(); }\n" 2120 "}", 2121 LLVMWithNoNamespaceFix); 2122 verifyFormat("namespace {\n" 2123 "class A {};\n" 2124 "void f() { f(); }\n" 2125 "}", 2126 LLVMWithNoNamespaceFix); 2127 verifyFormat("/* something */ namespace {\n" 2128 "class A {};\n" 2129 "void f() { f(); }\n" 2130 "}", 2131 LLVMWithNoNamespaceFix); 2132 verifyFormat("inline namespace X {\n" 2133 "class A {};\n" 2134 "void f() { f(); }\n" 2135 "}", 2136 LLVMWithNoNamespaceFix); 2137 verifyFormat("/* something */ inline namespace X {\n" 2138 "class A {};\n" 2139 "void f() { f(); }\n" 2140 "}", 2141 LLVMWithNoNamespaceFix); 2142 verifyFormat("export namespace X {\n" 2143 "class A {};\n" 2144 "void f() { f(); }\n" 2145 "}", 2146 LLVMWithNoNamespaceFix); 2147 verifyFormat("using namespace some_namespace;\n" 2148 "class A {};\n" 2149 "void f() { f(); }", 2150 LLVMWithNoNamespaceFix); 2151 2152 // This code is more common than we thought; if we 2153 // layout this correctly the semicolon will go into 2154 // its own line, which is undesirable. 2155 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 2156 verifyFormat("namespace {\n" 2157 "class A {};\n" 2158 "};", 2159 LLVMWithNoNamespaceFix); 2160 2161 verifyFormat("namespace {\n" 2162 "int SomeVariable = 0; // comment\n" 2163 "} // namespace", 2164 LLVMWithNoNamespaceFix); 2165 EXPECT_EQ("#ifndef HEADER_GUARD\n" 2166 "#define HEADER_GUARD\n" 2167 "namespace my_namespace {\n" 2168 "int i;\n" 2169 "} // my_namespace\n" 2170 "#endif // HEADER_GUARD", 2171 format("#ifndef HEADER_GUARD\n" 2172 " #define HEADER_GUARD\n" 2173 " namespace my_namespace {\n" 2174 "int i;\n" 2175 "} // my_namespace\n" 2176 "#endif // HEADER_GUARD", 2177 LLVMWithNoNamespaceFix)); 2178 2179 EXPECT_EQ("namespace A::B {\n" 2180 "class C {};\n" 2181 "}", 2182 format("namespace A::B {\n" 2183 "class C {};\n" 2184 "}", 2185 LLVMWithNoNamespaceFix)); 2186 2187 FormatStyle Style = getLLVMStyle(); 2188 Style.NamespaceIndentation = FormatStyle::NI_All; 2189 EXPECT_EQ("namespace out {\n" 2190 " int i;\n" 2191 " namespace in {\n" 2192 " int i;\n" 2193 " } // namespace in\n" 2194 "} // namespace out", 2195 format("namespace out {\n" 2196 "int i;\n" 2197 "namespace in {\n" 2198 "int i;\n" 2199 "} // namespace in\n" 2200 "} // namespace out", 2201 Style)); 2202 2203 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2204 EXPECT_EQ("namespace out {\n" 2205 "int i;\n" 2206 "namespace in {\n" 2207 " int i;\n" 2208 "} // namespace in\n" 2209 "} // namespace out", 2210 format("namespace out {\n" 2211 "int i;\n" 2212 "namespace in {\n" 2213 "int i;\n" 2214 "} // namespace in\n" 2215 "} // namespace out", 2216 Style)); 2217 } 2218 2219 TEST_F(FormatTest, NamespaceMacros) { 2220 FormatStyle Style = getLLVMStyle(); 2221 Style.NamespaceMacros.push_back("TESTSUITE"); 2222 2223 verifyFormat("TESTSUITE(A) {\n" 2224 "int foo();\n" 2225 "} // TESTSUITE(A)", 2226 Style); 2227 2228 verifyFormat("TESTSUITE(A, B) {\n" 2229 "int foo();\n" 2230 "} // TESTSUITE(A)", 2231 Style); 2232 2233 // Properly indent according to NamespaceIndentation style 2234 Style.NamespaceIndentation = FormatStyle::NI_All; 2235 verifyFormat("TESTSUITE(A) {\n" 2236 " int foo();\n" 2237 "} // TESTSUITE(A)", 2238 Style); 2239 verifyFormat("TESTSUITE(A) {\n" 2240 " namespace B {\n" 2241 " int foo();\n" 2242 " } // namespace B\n" 2243 "} // TESTSUITE(A)", 2244 Style); 2245 verifyFormat("namespace A {\n" 2246 " TESTSUITE(B) {\n" 2247 " int foo();\n" 2248 " } // TESTSUITE(B)\n" 2249 "} // namespace A", 2250 Style); 2251 2252 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2253 verifyFormat("TESTSUITE(A) {\n" 2254 "TESTSUITE(B) {\n" 2255 " int foo();\n" 2256 "} // TESTSUITE(B)\n" 2257 "} // TESTSUITE(A)", 2258 Style); 2259 verifyFormat("TESTSUITE(A) {\n" 2260 "namespace B {\n" 2261 " int foo();\n" 2262 "} // namespace B\n" 2263 "} // TESTSUITE(A)", 2264 Style); 2265 verifyFormat("namespace A {\n" 2266 "TESTSUITE(B) {\n" 2267 " int foo();\n" 2268 "} // TESTSUITE(B)\n" 2269 "} // namespace A", 2270 Style); 2271 2272 // Properly merge namespace-macros blocks in CompactNamespaces mode 2273 Style.NamespaceIndentation = FormatStyle::NI_None; 2274 Style.CompactNamespaces = true; 2275 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2276 "}} // TESTSUITE(A::B)", 2277 Style); 2278 2279 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2280 "}} // TESTSUITE(out::in)", 2281 format("TESTSUITE(out) {\n" 2282 "TESTSUITE(in) {\n" 2283 "} // TESTSUITE(in)\n" 2284 "} // TESTSUITE(out)", 2285 Style)); 2286 2287 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2288 "}} // TESTSUITE(out::in)", 2289 format("TESTSUITE(out) {\n" 2290 "TESTSUITE(in) {\n" 2291 "} // TESTSUITE(in)\n" 2292 "} // TESTSUITE(out)", 2293 Style)); 2294 2295 // Do not merge different namespaces/macros 2296 EXPECT_EQ("namespace out {\n" 2297 "TESTSUITE(in) {\n" 2298 "} // TESTSUITE(in)\n" 2299 "} // namespace out", 2300 format("namespace out {\n" 2301 "TESTSUITE(in) {\n" 2302 "} // TESTSUITE(in)\n" 2303 "} // namespace out", 2304 Style)); 2305 EXPECT_EQ("TESTSUITE(out) {\n" 2306 "namespace in {\n" 2307 "} // namespace in\n" 2308 "} // TESTSUITE(out)", 2309 format("TESTSUITE(out) {\n" 2310 "namespace in {\n" 2311 "} // namespace in\n" 2312 "} // TESTSUITE(out)", 2313 Style)); 2314 Style.NamespaceMacros.push_back("FOOBAR"); 2315 EXPECT_EQ("TESTSUITE(out) {\n" 2316 "FOOBAR(in) {\n" 2317 "} // FOOBAR(in)\n" 2318 "} // TESTSUITE(out)", 2319 format("TESTSUITE(out) {\n" 2320 "FOOBAR(in) {\n" 2321 "} // FOOBAR(in)\n" 2322 "} // TESTSUITE(out)", 2323 Style)); 2324 } 2325 2326 TEST_F(FormatTest, FormatsCompactNamespaces) { 2327 FormatStyle Style = getLLVMStyle(); 2328 Style.CompactNamespaces = true; 2329 Style.NamespaceMacros.push_back("TESTSUITE"); 2330 2331 verifyFormat("namespace A { namespace B {\n" 2332 "}} // namespace A::B", 2333 Style); 2334 2335 EXPECT_EQ("namespace out { namespace in {\n" 2336 "}} // namespace out::in", 2337 format("namespace out {\n" 2338 "namespace in {\n" 2339 "} // namespace in\n" 2340 "} // namespace out", 2341 Style)); 2342 2343 // Only namespaces which have both consecutive opening and end get compacted 2344 EXPECT_EQ("namespace out {\n" 2345 "namespace in1 {\n" 2346 "} // namespace in1\n" 2347 "namespace in2 {\n" 2348 "} // namespace in2\n" 2349 "} // namespace out", 2350 format("namespace out {\n" 2351 "namespace in1 {\n" 2352 "} // namespace in1\n" 2353 "namespace in2 {\n" 2354 "} // namespace in2\n" 2355 "} // namespace out", 2356 Style)); 2357 2358 EXPECT_EQ("namespace out {\n" 2359 "int i;\n" 2360 "namespace in {\n" 2361 "int j;\n" 2362 "} // namespace in\n" 2363 "int k;\n" 2364 "} // namespace out", 2365 format("namespace out { int i;\n" 2366 "namespace in { int j; } // namespace in\n" 2367 "int k; } // namespace out", 2368 Style)); 2369 2370 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2371 "}}} // namespace A::B::C\n", 2372 format("namespace A { namespace B {\n" 2373 "namespace C {\n" 2374 "}} // namespace B::C\n" 2375 "} // namespace A\n", 2376 Style)); 2377 2378 Style.ColumnLimit = 40; 2379 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2380 "namespace bbbbbbbbbb {\n" 2381 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2382 format("namespace aaaaaaaaaa {\n" 2383 "namespace bbbbbbbbbb {\n" 2384 "} // namespace bbbbbbbbbb\n" 2385 "} // namespace aaaaaaaaaa", 2386 Style)); 2387 2388 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2389 "namespace cccccc {\n" 2390 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2391 format("namespace aaaaaa {\n" 2392 "namespace bbbbbb {\n" 2393 "namespace cccccc {\n" 2394 "} // namespace cccccc\n" 2395 "} // namespace bbbbbb\n" 2396 "} // namespace aaaaaa", 2397 Style)); 2398 Style.ColumnLimit = 80; 2399 2400 // Extra semicolon after 'inner' closing brace prevents merging 2401 EXPECT_EQ("namespace out { namespace in {\n" 2402 "}; } // namespace out::in", 2403 format("namespace out {\n" 2404 "namespace in {\n" 2405 "}; // namespace in\n" 2406 "} // namespace out", 2407 Style)); 2408 2409 // Extra semicolon after 'outer' closing brace is conserved 2410 EXPECT_EQ("namespace out { namespace in {\n" 2411 "}}; // namespace out::in", 2412 format("namespace out {\n" 2413 "namespace in {\n" 2414 "} // namespace in\n" 2415 "}; // namespace out", 2416 Style)); 2417 2418 Style.NamespaceIndentation = FormatStyle::NI_All; 2419 EXPECT_EQ("namespace out { namespace in {\n" 2420 " int i;\n" 2421 "}} // namespace out::in", 2422 format("namespace out {\n" 2423 "namespace in {\n" 2424 "int i;\n" 2425 "} // namespace in\n" 2426 "} // namespace out", 2427 Style)); 2428 EXPECT_EQ("namespace out { namespace mid {\n" 2429 " namespace in {\n" 2430 " int j;\n" 2431 " } // namespace in\n" 2432 " int k;\n" 2433 "}} // namespace out::mid", 2434 format("namespace out { namespace mid {\n" 2435 "namespace in { int j; } // namespace in\n" 2436 "int k; }} // namespace out::mid", 2437 Style)); 2438 2439 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2440 EXPECT_EQ("namespace out { namespace in {\n" 2441 " int i;\n" 2442 "}} // namespace out::in", 2443 format("namespace out {\n" 2444 "namespace in {\n" 2445 "int i;\n" 2446 "} // namespace in\n" 2447 "} // namespace out", 2448 Style)); 2449 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2450 " int i;\n" 2451 "}}} // namespace out::mid::in", 2452 format("namespace out {\n" 2453 "namespace mid {\n" 2454 "namespace in {\n" 2455 "int i;\n" 2456 "} // namespace in\n" 2457 "} // namespace mid\n" 2458 "} // namespace out", 2459 Style)); 2460 } 2461 2462 TEST_F(FormatTest, FormatsExternC) { 2463 verifyFormat("extern \"C\" {\nint a;"); 2464 verifyFormat("extern \"C\" {}"); 2465 verifyFormat("extern \"C\" {\n" 2466 "int foo();\n" 2467 "}"); 2468 verifyFormat("extern \"C\" int foo() {}"); 2469 verifyFormat("extern \"C\" int foo();"); 2470 verifyFormat("extern \"C\" int foo() {\n" 2471 " int i = 42;\n" 2472 " return i;\n" 2473 "}"); 2474 2475 FormatStyle Style = getLLVMStyle(); 2476 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2477 Style.BraceWrapping.AfterFunction = true; 2478 verifyFormat("extern \"C\" int foo() {}", Style); 2479 verifyFormat("extern \"C\" int foo();", Style); 2480 verifyFormat("extern \"C\" int foo()\n" 2481 "{\n" 2482 " int i = 42;\n" 2483 " return i;\n" 2484 "}", 2485 Style); 2486 2487 Style.BraceWrapping.AfterExternBlock = true; 2488 Style.BraceWrapping.SplitEmptyRecord = false; 2489 verifyFormat("extern \"C\"\n" 2490 "{}", 2491 Style); 2492 verifyFormat("extern \"C\"\n" 2493 "{\n" 2494 " int foo();\n" 2495 "}", 2496 Style); 2497 } 2498 2499 TEST_F(FormatTest, FormatsInlineASM) { 2500 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2501 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2502 verifyFormat( 2503 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2504 " \"cpuid\\n\\t\"\n" 2505 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2506 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2507 " : \"a\"(value));"); 2508 EXPECT_EQ( 2509 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2510 " __asm {\n" 2511 " mov edx,[that] // vtable in edx\n" 2512 " mov eax,methodIndex\n" 2513 " call [edx][eax*4] // stdcall\n" 2514 " }\n" 2515 "}", 2516 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2517 " __asm {\n" 2518 " mov edx,[that] // vtable in edx\n" 2519 " mov eax,methodIndex\n" 2520 " call [edx][eax*4] // stdcall\n" 2521 " }\n" 2522 "}")); 2523 EXPECT_EQ("_asm {\n" 2524 " xor eax, eax;\n" 2525 " cpuid;\n" 2526 "}", 2527 format("_asm {\n" 2528 " xor eax, eax;\n" 2529 " cpuid;\n" 2530 "}")); 2531 verifyFormat("void function() {\n" 2532 " // comment\n" 2533 " asm(\"\");\n" 2534 "}"); 2535 EXPECT_EQ("__asm {\n" 2536 "}\n" 2537 "int i;", 2538 format("__asm {\n" 2539 "}\n" 2540 "int i;")); 2541 } 2542 2543 TEST_F(FormatTest, FormatTryCatch) { 2544 verifyFormat("try {\n" 2545 " throw a * b;\n" 2546 "} catch (int a) {\n" 2547 " // Do nothing.\n" 2548 "} catch (...) {\n" 2549 " exit(42);\n" 2550 "}"); 2551 2552 // Function-level try statements. 2553 verifyFormat("int f() try { return 4; } catch (...) {\n" 2554 " return 5;\n" 2555 "}"); 2556 verifyFormat("class A {\n" 2557 " int a;\n" 2558 " A() try : a(0) {\n" 2559 " } catch (...) {\n" 2560 " throw;\n" 2561 " }\n" 2562 "};\n"); 2563 2564 // Incomplete try-catch blocks. 2565 verifyIncompleteFormat("try {} catch ("); 2566 } 2567 2568 TEST_F(FormatTest, FormatSEHTryCatch) { 2569 verifyFormat("__try {\n" 2570 " int a = b * c;\n" 2571 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2572 " // Do nothing.\n" 2573 "}"); 2574 2575 verifyFormat("__try {\n" 2576 " int a = b * c;\n" 2577 "} __finally {\n" 2578 " // Do nothing.\n" 2579 "}"); 2580 2581 verifyFormat("DEBUG({\n" 2582 " __try {\n" 2583 " } __finally {\n" 2584 " }\n" 2585 "});\n"); 2586 } 2587 2588 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2589 verifyFormat("try {\n" 2590 " f();\n" 2591 "} catch {\n" 2592 " g();\n" 2593 "}"); 2594 verifyFormat("try {\n" 2595 " f();\n" 2596 "} catch (A a) MACRO(x) {\n" 2597 " g();\n" 2598 "} catch (B b) MACRO(x) {\n" 2599 " g();\n" 2600 "}"); 2601 } 2602 2603 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2604 FormatStyle Style = getLLVMStyle(); 2605 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2606 FormatStyle::BS_WebKit}) { 2607 Style.BreakBeforeBraces = BraceStyle; 2608 verifyFormat("try {\n" 2609 " // something\n" 2610 "} catch (...) {\n" 2611 " // something\n" 2612 "}", 2613 Style); 2614 } 2615 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2616 verifyFormat("try {\n" 2617 " // something\n" 2618 "}\n" 2619 "catch (...) {\n" 2620 " // something\n" 2621 "}", 2622 Style); 2623 verifyFormat("__try {\n" 2624 " // something\n" 2625 "}\n" 2626 "__finally {\n" 2627 " // something\n" 2628 "}", 2629 Style); 2630 verifyFormat("@try {\n" 2631 " // something\n" 2632 "}\n" 2633 "@finally {\n" 2634 " // something\n" 2635 "}", 2636 Style); 2637 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2638 verifyFormat("try\n" 2639 "{\n" 2640 " // something\n" 2641 "}\n" 2642 "catch (...)\n" 2643 "{\n" 2644 " // something\n" 2645 "}", 2646 Style); 2647 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2648 verifyFormat("try\n" 2649 " {\n" 2650 " // something white\n" 2651 " }\n" 2652 "catch (...)\n" 2653 " {\n" 2654 " // something white\n" 2655 " }", 2656 Style); 2657 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2658 verifyFormat("try\n" 2659 " {\n" 2660 " // something\n" 2661 " }\n" 2662 "catch (...)\n" 2663 " {\n" 2664 " // something\n" 2665 " }", 2666 Style); 2667 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2668 Style.BraceWrapping.BeforeCatch = true; 2669 verifyFormat("try {\n" 2670 " // something\n" 2671 "}\n" 2672 "catch (...) {\n" 2673 " // something\n" 2674 "}", 2675 Style); 2676 } 2677 2678 TEST_F(FormatTest, StaticInitializers) { 2679 verifyFormat("static SomeClass SC = {1, 'a'};"); 2680 2681 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2682 " 100000000, " 2683 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2684 2685 // Here, everything other than the "}" would fit on a line. 2686 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2687 " 10000000000000000000000000};"); 2688 EXPECT_EQ("S s = {a,\n" 2689 "\n" 2690 " b};", 2691 format("S s = {\n" 2692 " a,\n" 2693 "\n" 2694 " b\n" 2695 "};")); 2696 2697 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2698 // line. However, the formatting looks a bit off and this probably doesn't 2699 // happen often in practice. 2700 verifyFormat("static int Variable[1] = {\n" 2701 " {1000000000000000000000000000000000000}};", 2702 getLLVMStyleWithColumns(40)); 2703 } 2704 2705 TEST_F(FormatTest, DesignatedInitializers) { 2706 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2707 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2708 " .bbbbbbbbbb = 2,\n" 2709 " .cccccccccc = 3,\n" 2710 " .dddddddddd = 4,\n" 2711 " .eeeeeeeeee = 5};"); 2712 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2713 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2714 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2715 " .ccccccccccccccccccccccccccc = 3,\n" 2716 " .ddddddddddddddddddddddddddd = 4,\n" 2717 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2718 2719 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2720 2721 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2722 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2723 " [2] = bbbbbbbbbb,\n" 2724 " [3] = cccccccccc,\n" 2725 " [4] = dddddddddd,\n" 2726 " [5] = eeeeeeeeee};"); 2727 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2728 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2729 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2730 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2731 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2732 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2733 } 2734 2735 TEST_F(FormatTest, NestedStaticInitializers) { 2736 verifyFormat("static A x = {{{}}};\n"); 2737 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2738 " {init1, init2, init3, init4}}};", 2739 getLLVMStyleWithColumns(50)); 2740 2741 verifyFormat("somes Status::global_reps[3] = {\n" 2742 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2743 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2744 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2745 getLLVMStyleWithColumns(60)); 2746 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2747 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2748 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2749 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2750 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2751 " {rect.fRight - rect.fLeft, rect.fBottom - " 2752 "rect.fTop}};"); 2753 2754 verifyFormat( 2755 "SomeArrayOfSomeType a = {\n" 2756 " {{1, 2, 3},\n" 2757 " {1, 2, 3},\n" 2758 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2759 " 333333333333333333333333333333},\n" 2760 " {1, 2, 3},\n" 2761 " {1, 2, 3}}};"); 2762 verifyFormat( 2763 "SomeArrayOfSomeType a = {\n" 2764 " {{1, 2, 3}},\n" 2765 " {{1, 2, 3}},\n" 2766 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2767 " 333333333333333333333333333333}},\n" 2768 " {{1, 2, 3}},\n" 2769 " {{1, 2, 3}}};"); 2770 2771 verifyFormat("struct {\n" 2772 " unsigned bit;\n" 2773 " const char *const name;\n" 2774 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2775 " {kOsWin, \"Windows\"},\n" 2776 " {kOsLinux, \"Linux\"},\n" 2777 " {kOsCrOS, \"Chrome OS\"}};"); 2778 verifyFormat("struct {\n" 2779 " unsigned bit;\n" 2780 " const char *const name;\n" 2781 "} kBitsToOs[] = {\n" 2782 " {kOsMac, \"Mac\"},\n" 2783 " {kOsWin, \"Windows\"},\n" 2784 " {kOsLinux, \"Linux\"},\n" 2785 " {kOsCrOS, \"Chrome OS\"},\n" 2786 "};"); 2787 } 2788 2789 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2790 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2791 " \\\n" 2792 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2793 } 2794 2795 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2796 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2797 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2798 2799 // Do break defaulted and deleted functions. 2800 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2801 " default;", 2802 getLLVMStyleWithColumns(40)); 2803 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2804 " delete;", 2805 getLLVMStyleWithColumns(40)); 2806 } 2807 2808 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2809 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2810 getLLVMStyleWithColumns(40)); 2811 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2812 getLLVMStyleWithColumns(40)); 2813 EXPECT_EQ("#define Q \\\n" 2814 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2815 " \"aaaaaaaa.cpp\"", 2816 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2817 getLLVMStyleWithColumns(40))); 2818 } 2819 2820 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2821 EXPECT_EQ("# 123 \"A string literal\"", 2822 format(" # 123 \"A string literal\"")); 2823 } 2824 2825 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2826 EXPECT_EQ("#;", format("#;")); 2827 verifyFormat("#\n;\n;\n;"); 2828 } 2829 2830 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2831 EXPECT_EQ("#line 42 \"test\"\n", 2832 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2833 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2834 getLLVMStyleWithColumns(12))); 2835 } 2836 2837 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2838 EXPECT_EQ("#line 42 \"test\"", 2839 format("# \\\n line \\\n 42 \\\n \"test\"")); 2840 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2841 } 2842 2843 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2844 verifyFormat("#define A \\x20"); 2845 verifyFormat("#define A \\ x20"); 2846 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2847 verifyFormat("#define A ''"); 2848 verifyFormat("#define A ''qqq"); 2849 verifyFormat("#define A `qqq"); 2850 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2851 EXPECT_EQ("const char *c = STRINGIFY(\n" 2852 "\\na : b);", 2853 format("const char * c = STRINGIFY(\n" 2854 "\\na : b);")); 2855 2856 verifyFormat("a\r\\"); 2857 verifyFormat("a\v\\"); 2858 verifyFormat("a\f\\"); 2859 } 2860 2861 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2862 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2863 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2864 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2865 // FIXME: We never break before the macro name. 2866 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2867 2868 verifyFormat("#define A A\n#define A A"); 2869 verifyFormat("#define A(X) A\n#define A A"); 2870 2871 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2872 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2873 } 2874 2875 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2876 EXPECT_EQ("// somecomment\n" 2877 "#include \"a.h\"\n" 2878 "#define A( \\\n" 2879 " A, B)\n" 2880 "#include \"b.h\"\n" 2881 "// somecomment\n", 2882 format(" // somecomment\n" 2883 " #include \"a.h\"\n" 2884 "#define A(A,\\\n" 2885 " B)\n" 2886 " #include \"b.h\"\n" 2887 " // somecomment\n", 2888 getLLVMStyleWithColumns(13))); 2889 } 2890 2891 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2892 2893 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2894 EXPECT_EQ("#define A \\\n" 2895 " c; \\\n" 2896 " e;\n" 2897 "f;", 2898 format("#define A c; e;\n" 2899 "f;", 2900 getLLVMStyleWithColumns(14))); 2901 } 2902 2903 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2904 2905 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2906 EXPECT_EQ("int x,\n" 2907 "#define A\n" 2908 " y;", 2909 format("int x,\n#define A\ny;")); 2910 } 2911 2912 TEST_F(FormatTest, HashInMacroDefinition) { 2913 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2914 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2915 verifyFormat("#define A \\\n" 2916 " { \\\n" 2917 " f(#c); \\\n" 2918 " }", 2919 getLLVMStyleWithColumns(11)); 2920 2921 verifyFormat("#define A(X) \\\n" 2922 " void function##X()", 2923 getLLVMStyleWithColumns(22)); 2924 2925 verifyFormat("#define A(a, b, c) \\\n" 2926 " void a##b##c()", 2927 getLLVMStyleWithColumns(22)); 2928 2929 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2930 } 2931 2932 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2933 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2934 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2935 2936 FormatStyle Style = getLLVMStyle(); 2937 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2938 verifyFormat("#define true ((foo)1)", Style); 2939 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2940 verifyFormat("#define false((foo)0)", Style); 2941 } 2942 2943 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2944 EXPECT_EQ("#define A b;", format("#define A \\\n" 2945 " \\\n" 2946 " b;", 2947 getLLVMStyleWithColumns(25))); 2948 EXPECT_EQ("#define A \\\n" 2949 " \\\n" 2950 " a; \\\n" 2951 " b;", 2952 format("#define A \\\n" 2953 " \\\n" 2954 " a; \\\n" 2955 " b;", 2956 getLLVMStyleWithColumns(11))); 2957 EXPECT_EQ("#define A \\\n" 2958 " a; \\\n" 2959 " \\\n" 2960 " b;", 2961 format("#define A \\\n" 2962 " a; \\\n" 2963 " \\\n" 2964 " b;", 2965 getLLVMStyleWithColumns(11))); 2966 } 2967 2968 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2969 verifyIncompleteFormat("#define A :"); 2970 verifyFormat("#define SOMECASES \\\n" 2971 " case 1: \\\n" 2972 " case 2\n", 2973 getLLVMStyleWithColumns(20)); 2974 verifyFormat("#define MACRO(a) \\\n" 2975 " if (a) \\\n" 2976 " f(); \\\n" 2977 " else \\\n" 2978 " g()", 2979 getLLVMStyleWithColumns(18)); 2980 verifyFormat("#define A template <typename T>"); 2981 verifyIncompleteFormat("#define STR(x) #x\n" 2982 "f(STR(this_is_a_string_literal{));"); 2983 verifyFormat("#pragma omp threadprivate( \\\n" 2984 " y)), // expected-warning", 2985 getLLVMStyleWithColumns(28)); 2986 verifyFormat("#d, = };"); 2987 verifyFormat("#if \"a"); 2988 verifyIncompleteFormat("({\n" 2989 "#define b \\\n" 2990 " } \\\n" 2991 " a\n" 2992 "a", 2993 getLLVMStyleWithColumns(15)); 2994 verifyFormat("#define A \\\n" 2995 " { \\\n" 2996 " {\n" 2997 "#define B \\\n" 2998 " } \\\n" 2999 " }", 3000 getLLVMStyleWithColumns(15)); 3001 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 3002 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 3003 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 3004 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 3005 } 3006 3007 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 3008 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 3009 EXPECT_EQ("class A : public QObject {\n" 3010 " Q_OBJECT\n" 3011 "\n" 3012 " A() {}\n" 3013 "};", 3014 format("class A : public QObject {\n" 3015 " Q_OBJECT\n" 3016 "\n" 3017 " A() {\n}\n" 3018 "} ;")); 3019 EXPECT_EQ("MACRO\n" 3020 "/*static*/ int i;", 3021 format("MACRO\n" 3022 " /*static*/ int i;")); 3023 EXPECT_EQ("SOME_MACRO\n" 3024 "namespace {\n" 3025 "void f();\n" 3026 "} // namespace", 3027 format("SOME_MACRO\n" 3028 " namespace {\n" 3029 "void f( );\n" 3030 "} // namespace")); 3031 // Only if the identifier contains at least 5 characters. 3032 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 3033 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 3034 // Only if everything is upper case. 3035 EXPECT_EQ("class A : public QObject {\n" 3036 " Q_Object A() {}\n" 3037 "};", 3038 format("class A : public QObject {\n" 3039 " Q_Object\n" 3040 " A() {\n}\n" 3041 "} ;")); 3042 3043 // Only if the next line can actually start an unwrapped line. 3044 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 3045 format("SOME_WEIRD_LOG_MACRO\n" 3046 "<< SomeThing;")); 3047 3048 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 3049 "(n, buffers))\n", 3050 getChromiumStyle(FormatStyle::LK_Cpp)); 3051 3052 // See PR41483 3053 EXPECT_EQ("/**/ FOO(a)\n" 3054 "FOO(b)", 3055 format("/**/ FOO(a)\n" 3056 "FOO(b)")); 3057 } 3058 3059 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 3060 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3061 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3062 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3063 "class X {};\n" 3064 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3065 "int *createScopDetectionPass() { return 0; }", 3066 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3067 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3068 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3069 " class X {};\n" 3070 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3071 " int *createScopDetectionPass() { return 0; }")); 3072 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 3073 // braces, so that inner block is indented one level more. 3074 EXPECT_EQ("int q() {\n" 3075 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3076 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3077 " IPC_END_MESSAGE_MAP()\n" 3078 "}", 3079 format("int q() {\n" 3080 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3081 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3082 " IPC_END_MESSAGE_MAP()\n" 3083 "}")); 3084 3085 // Same inside macros. 3086 EXPECT_EQ("#define LIST(L) \\\n" 3087 " L(A) \\\n" 3088 " L(B) \\\n" 3089 " L(C)", 3090 format("#define LIST(L) \\\n" 3091 " L(A) \\\n" 3092 " L(B) \\\n" 3093 " L(C)", 3094 getGoogleStyle())); 3095 3096 // These must not be recognized as macros. 3097 EXPECT_EQ("int q() {\n" 3098 " f(x);\n" 3099 " f(x) {}\n" 3100 " f(x)->g();\n" 3101 " f(x)->*g();\n" 3102 " f(x).g();\n" 3103 " f(x) = x;\n" 3104 " f(x) += x;\n" 3105 " f(x) -= x;\n" 3106 " f(x) *= x;\n" 3107 " f(x) /= x;\n" 3108 " f(x) %= x;\n" 3109 " f(x) &= x;\n" 3110 " f(x) |= x;\n" 3111 " f(x) ^= x;\n" 3112 " f(x) >>= x;\n" 3113 " f(x) <<= x;\n" 3114 " f(x)[y].z();\n" 3115 " LOG(INFO) << x;\n" 3116 " ifstream(x) >> x;\n" 3117 "}\n", 3118 format("int q() {\n" 3119 " f(x)\n;\n" 3120 " f(x)\n {}\n" 3121 " f(x)\n->g();\n" 3122 " f(x)\n->*g();\n" 3123 " f(x)\n.g();\n" 3124 " f(x)\n = x;\n" 3125 " f(x)\n += x;\n" 3126 " f(x)\n -= x;\n" 3127 " f(x)\n *= x;\n" 3128 " f(x)\n /= x;\n" 3129 " f(x)\n %= x;\n" 3130 " f(x)\n &= x;\n" 3131 " f(x)\n |= x;\n" 3132 " f(x)\n ^= x;\n" 3133 " f(x)\n >>= x;\n" 3134 " f(x)\n <<= x;\n" 3135 " f(x)\n[y].z();\n" 3136 " LOG(INFO)\n << x;\n" 3137 " ifstream(x)\n >> x;\n" 3138 "}\n")); 3139 EXPECT_EQ("int q() {\n" 3140 " F(x)\n" 3141 " if (1) {\n" 3142 " }\n" 3143 " F(x)\n" 3144 " while (1) {\n" 3145 " }\n" 3146 " F(x)\n" 3147 " G(x);\n" 3148 " F(x)\n" 3149 " try {\n" 3150 " Q();\n" 3151 " } catch (...) {\n" 3152 " }\n" 3153 "}\n", 3154 format("int q() {\n" 3155 "F(x)\n" 3156 "if (1) {}\n" 3157 "F(x)\n" 3158 "while (1) {}\n" 3159 "F(x)\n" 3160 "G(x);\n" 3161 "F(x)\n" 3162 "try { Q(); } catch (...) {}\n" 3163 "}\n")); 3164 EXPECT_EQ("class A {\n" 3165 " A() : t(0) {}\n" 3166 " A(int i) noexcept() : {}\n" 3167 " A(X x)\n" // FIXME: function-level try blocks are broken. 3168 " try : t(0) {\n" 3169 " } catch (...) {\n" 3170 " }\n" 3171 "};", 3172 format("class A {\n" 3173 " A()\n : t(0) {}\n" 3174 " A(int i)\n noexcept() : {}\n" 3175 " A(X x)\n" 3176 " try : t(0) {} catch (...) {}\n" 3177 "};")); 3178 FormatStyle Style = getLLVMStyle(); 3179 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3180 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3181 Style.BraceWrapping.AfterFunction = true; 3182 EXPECT_EQ("void f()\n" 3183 "try\n" 3184 "{\n" 3185 "}", 3186 format("void f() try {\n" 3187 "}", 3188 Style)); 3189 EXPECT_EQ("class SomeClass {\n" 3190 "public:\n" 3191 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3192 "};", 3193 format("class SomeClass {\n" 3194 "public:\n" 3195 " SomeClass()\n" 3196 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3197 "};")); 3198 EXPECT_EQ("class SomeClass {\n" 3199 "public:\n" 3200 " SomeClass()\n" 3201 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3202 "};", 3203 format("class SomeClass {\n" 3204 "public:\n" 3205 " SomeClass()\n" 3206 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3207 "};", 3208 getLLVMStyleWithColumns(40))); 3209 3210 verifyFormat("MACRO(>)"); 3211 3212 // Some macros contain an implicit semicolon. 3213 Style = getLLVMStyle(); 3214 Style.StatementMacros.push_back("FOO"); 3215 verifyFormat("FOO(a) int b = 0;"); 3216 verifyFormat("FOO(a)\n" 3217 "int b = 0;", 3218 Style); 3219 verifyFormat("FOO(a);\n" 3220 "int b = 0;", 3221 Style); 3222 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3223 "int b = 0;", 3224 Style); 3225 verifyFormat("FOO()\n" 3226 "int b = 0;", 3227 Style); 3228 verifyFormat("FOO\n" 3229 "int b = 0;", 3230 Style); 3231 verifyFormat("void f() {\n" 3232 " FOO(a)\n" 3233 " return a;\n" 3234 "}", 3235 Style); 3236 verifyFormat("FOO(a)\n" 3237 "FOO(b)", 3238 Style); 3239 verifyFormat("int a = 0;\n" 3240 "FOO(b)\n" 3241 "int c = 0;", 3242 Style); 3243 verifyFormat("int a = 0;\n" 3244 "int x = FOO(a)\n" 3245 "int b = 0;", 3246 Style); 3247 verifyFormat("void foo(int a) { FOO(a) }\n" 3248 "uint32_t bar() {}", 3249 Style); 3250 } 3251 3252 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3253 verifyFormat("#define A \\\n" 3254 " f({ \\\n" 3255 " g(); \\\n" 3256 " });", 3257 getLLVMStyleWithColumns(11)); 3258 } 3259 3260 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3261 FormatStyle Style = getLLVMStyle(); 3262 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3263 Style.ColumnLimit = 40; 3264 verifyFormat("#ifdef _WIN32\n" 3265 "#define A 0\n" 3266 "#ifdef VAR2\n" 3267 "#define B 1\n" 3268 "#include <someheader.h>\n" 3269 "#define MACRO \\\n" 3270 " some_very_long_func_aaaaaaaaaa();\n" 3271 "#endif\n" 3272 "#else\n" 3273 "#define A 1\n" 3274 "#endif", 3275 Style); 3276 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3277 verifyFormat("#ifdef _WIN32\n" 3278 "# define A 0\n" 3279 "# ifdef VAR2\n" 3280 "# define B 1\n" 3281 "# include <someheader.h>\n" 3282 "# define MACRO \\\n" 3283 " some_very_long_func_aaaaaaaaaa();\n" 3284 "# endif\n" 3285 "#else\n" 3286 "# define A 1\n" 3287 "#endif", 3288 Style); 3289 verifyFormat("#if A\n" 3290 "# define MACRO \\\n" 3291 " void a(int x) { \\\n" 3292 " b(); \\\n" 3293 " c(); \\\n" 3294 " d(); \\\n" 3295 " e(); \\\n" 3296 " f(); \\\n" 3297 " }\n" 3298 "#endif", 3299 Style); 3300 // Comments before include guard. 3301 verifyFormat("// file comment\n" 3302 "// file comment\n" 3303 "#ifndef HEADER_H\n" 3304 "#define HEADER_H\n" 3305 "code();\n" 3306 "#endif", 3307 Style); 3308 // Test with include guards. 3309 verifyFormat("#ifndef HEADER_H\n" 3310 "#define HEADER_H\n" 3311 "code();\n" 3312 "#endif", 3313 Style); 3314 // Include guards must have a #define with the same variable immediately 3315 // after #ifndef. 3316 verifyFormat("#ifndef NOT_GUARD\n" 3317 "# define FOO\n" 3318 "code();\n" 3319 "#endif", 3320 Style); 3321 3322 // Include guards must cover the entire file. 3323 verifyFormat("code();\n" 3324 "code();\n" 3325 "#ifndef NOT_GUARD\n" 3326 "# define NOT_GUARD\n" 3327 "code();\n" 3328 "#endif", 3329 Style); 3330 verifyFormat("#ifndef NOT_GUARD\n" 3331 "# define NOT_GUARD\n" 3332 "code();\n" 3333 "#endif\n" 3334 "code();", 3335 Style); 3336 // Test with trailing blank lines. 3337 verifyFormat("#ifndef HEADER_H\n" 3338 "#define HEADER_H\n" 3339 "code();\n" 3340 "#endif\n", 3341 Style); 3342 // Include guards don't have #else. 3343 verifyFormat("#ifndef NOT_GUARD\n" 3344 "# define NOT_GUARD\n" 3345 "code();\n" 3346 "#else\n" 3347 "#endif", 3348 Style); 3349 verifyFormat("#ifndef NOT_GUARD\n" 3350 "# define NOT_GUARD\n" 3351 "code();\n" 3352 "#elif FOO\n" 3353 "#endif", 3354 Style); 3355 // Non-identifier #define after potential include guard. 3356 verifyFormat("#ifndef FOO\n" 3357 "# define 1\n" 3358 "#endif\n", 3359 Style); 3360 // #if closes past last non-preprocessor line. 3361 verifyFormat("#ifndef FOO\n" 3362 "#define FOO\n" 3363 "#if 1\n" 3364 "int i;\n" 3365 "# define A 0\n" 3366 "#endif\n" 3367 "#endif\n", 3368 Style); 3369 // Don't crash if there is an #elif directive without a condition. 3370 verifyFormat("#if 1\n" 3371 "int x;\n" 3372 "#elif\n" 3373 "int y;\n" 3374 "#else\n" 3375 "int z;\n" 3376 "#endif", 3377 Style); 3378 // FIXME: This doesn't handle the case where there's code between the 3379 // #ifndef and #define but all other conditions hold. This is because when 3380 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3381 // previous code line yet, so we can't detect it. 3382 EXPECT_EQ("#ifndef NOT_GUARD\n" 3383 "code();\n" 3384 "#define NOT_GUARD\n" 3385 "code();\n" 3386 "#endif", 3387 format("#ifndef NOT_GUARD\n" 3388 "code();\n" 3389 "# define NOT_GUARD\n" 3390 "code();\n" 3391 "#endif", 3392 Style)); 3393 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3394 // be outside an include guard. Examples are #pragma once and 3395 // #pragma GCC diagnostic, or anything else that does not change the meaning 3396 // of the file if it's included multiple times. 3397 EXPECT_EQ("#ifdef WIN32\n" 3398 "# pragma once\n" 3399 "#endif\n" 3400 "#ifndef HEADER_H\n" 3401 "# define HEADER_H\n" 3402 "code();\n" 3403 "#endif", 3404 format("#ifdef WIN32\n" 3405 "# pragma once\n" 3406 "#endif\n" 3407 "#ifndef HEADER_H\n" 3408 "#define HEADER_H\n" 3409 "code();\n" 3410 "#endif", 3411 Style)); 3412 // FIXME: This does not detect when there is a single non-preprocessor line 3413 // in front of an include-guard-like structure where other conditions hold 3414 // because ScopedLineState hides the line. 3415 EXPECT_EQ("code();\n" 3416 "#ifndef HEADER_H\n" 3417 "#define HEADER_H\n" 3418 "code();\n" 3419 "#endif", 3420 format("code();\n" 3421 "#ifndef HEADER_H\n" 3422 "# define HEADER_H\n" 3423 "code();\n" 3424 "#endif", 3425 Style)); 3426 // Keep comments aligned with #, otherwise indent comments normally. These 3427 // tests cannot use verifyFormat because messUp manipulates leading 3428 // whitespace. 3429 { 3430 const char *Expected = "" 3431 "void f() {\n" 3432 "#if 1\n" 3433 "// Preprocessor aligned.\n" 3434 "# define A 0\n" 3435 " // Code. Separated by blank line.\n" 3436 "\n" 3437 "# define B 0\n" 3438 " // Code. Not aligned with #\n" 3439 "# define C 0\n" 3440 "#endif"; 3441 const char *ToFormat = "" 3442 "void f() {\n" 3443 "#if 1\n" 3444 "// Preprocessor aligned.\n" 3445 "# define A 0\n" 3446 "// Code. Separated by blank line.\n" 3447 "\n" 3448 "# define B 0\n" 3449 " // Code. Not aligned with #\n" 3450 "# define C 0\n" 3451 "#endif"; 3452 EXPECT_EQ(Expected, format(ToFormat, Style)); 3453 EXPECT_EQ(Expected, format(Expected, Style)); 3454 } 3455 // Keep block quotes aligned. 3456 { 3457 const char *Expected = "" 3458 "void f() {\n" 3459 "#if 1\n" 3460 "/* Preprocessor aligned. */\n" 3461 "# define A 0\n" 3462 " /* Code. Separated by blank line. */\n" 3463 "\n" 3464 "# define B 0\n" 3465 " /* Code. Not aligned with # */\n" 3466 "# define C 0\n" 3467 "#endif"; 3468 const char *ToFormat = "" 3469 "void f() {\n" 3470 "#if 1\n" 3471 "/* Preprocessor aligned. */\n" 3472 "# define A 0\n" 3473 "/* Code. Separated by blank line. */\n" 3474 "\n" 3475 "# define B 0\n" 3476 " /* Code. Not aligned with # */\n" 3477 "# define C 0\n" 3478 "#endif"; 3479 EXPECT_EQ(Expected, format(ToFormat, Style)); 3480 EXPECT_EQ(Expected, format(Expected, Style)); 3481 } 3482 // Keep comments aligned with un-indented directives. 3483 { 3484 const char *Expected = "" 3485 "void f() {\n" 3486 "// Preprocessor aligned.\n" 3487 "#define A 0\n" 3488 " // Code. Separated by blank line.\n" 3489 "\n" 3490 "#define B 0\n" 3491 " // Code. Not aligned with #\n" 3492 "#define C 0\n"; 3493 const char *ToFormat = "" 3494 "void f() {\n" 3495 "// Preprocessor aligned.\n" 3496 "#define A 0\n" 3497 "// Code. Separated by blank line.\n" 3498 "\n" 3499 "#define B 0\n" 3500 " // Code. Not aligned with #\n" 3501 "#define C 0\n"; 3502 EXPECT_EQ(Expected, format(ToFormat, Style)); 3503 EXPECT_EQ(Expected, format(Expected, Style)); 3504 } 3505 // Test AfterHash with tabs. 3506 { 3507 FormatStyle Tabbed = Style; 3508 Tabbed.UseTab = FormatStyle::UT_Always; 3509 Tabbed.IndentWidth = 8; 3510 Tabbed.TabWidth = 8; 3511 verifyFormat("#ifdef _WIN32\n" 3512 "#\tdefine A 0\n" 3513 "#\tifdef VAR2\n" 3514 "#\t\tdefine B 1\n" 3515 "#\t\tinclude <someheader.h>\n" 3516 "#\t\tdefine MACRO \\\n" 3517 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3518 "#\tendif\n" 3519 "#else\n" 3520 "#\tdefine A 1\n" 3521 "#endif", 3522 Tabbed); 3523 } 3524 3525 // Regression test: Multiline-macro inside include guards. 3526 verifyFormat("#ifndef HEADER_H\n" 3527 "#define HEADER_H\n" 3528 "#define A() \\\n" 3529 " int i; \\\n" 3530 " int j;\n" 3531 "#endif // HEADER_H", 3532 getLLVMStyleWithColumns(20)); 3533 3534 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3535 // Basic before hash indent tests 3536 verifyFormat("#ifdef _WIN32\n" 3537 " #define A 0\n" 3538 " #ifdef VAR2\n" 3539 " #define B 1\n" 3540 " #include <someheader.h>\n" 3541 " #define MACRO \\\n" 3542 " some_very_long_func_aaaaaaaaaa();\n" 3543 " #endif\n" 3544 "#else\n" 3545 " #define A 1\n" 3546 "#endif", 3547 Style); 3548 verifyFormat("#if A\n" 3549 " #define MACRO \\\n" 3550 " void a(int x) { \\\n" 3551 " b(); \\\n" 3552 " c(); \\\n" 3553 " d(); \\\n" 3554 " e(); \\\n" 3555 " f(); \\\n" 3556 " }\n" 3557 "#endif", 3558 Style); 3559 // Keep comments aligned with indented directives. These 3560 // tests cannot use verifyFormat because messUp manipulates leading 3561 // whitespace. 3562 { 3563 const char *Expected = "void f() {\n" 3564 "// Aligned to preprocessor.\n" 3565 "#if 1\n" 3566 " // Aligned to code.\n" 3567 " int a;\n" 3568 " #if 1\n" 3569 " // Aligned to preprocessor.\n" 3570 " #define A 0\n" 3571 " // Aligned to code.\n" 3572 " int b;\n" 3573 " #endif\n" 3574 "#endif\n" 3575 "}"; 3576 const char *ToFormat = "void f() {\n" 3577 "// Aligned to preprocessor.\n" 3578 "#if 1\n" 3579 "// Aligned to code.\n" 3580 "int a;\n" 3581 "#if 1\n" 3582 "// Aligned to preprocessor.\n" 3583 "#define A 0\n" 3584 "// Aligned to code.\n" 3585 "int b;\n" 3586 "#endif\n" 3587 "#endif\n" 3588 "}"; 3589 EXPECT_EQ(Expected, format(ToFormat, Style)); 3590 EXPECT_EQ(Expected, format(Expected, Style)); 3591 } 3592 { 3593 const char *Expected = "void f() {\n" 3594 "/* Aligned to preprocessor. */\n" 3595 "#if 1\n" 3596 " /* Aligned to code. */\n" 3597 " int a;\n" 3598 " #if 1\n" 3599 " /* Aligned to preprocessor. */\n" 3600 " #define A 0\n" 3601 " /* Aligned to code. */\n" 3602 " int b;\n" 3603 " #endif\n" 3604 "#endif\n" 3605 "}"; 3606 const char *ToFormat = "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 EXPECT_EQ(Expected, format(ToFormat, Style)); 3620 EXPECT_EQ(Expected, format(Expected, Style)); 3621 } 3622 3623 // Test single comment before preprocessor 3624 verifyFormat("// Comment\n" 3625 "\n" 3626 "#if 1\n" 3627 "#endif", 3628 Style); 3629 } 3630 3631 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3632 verifyFormat("{\n { a #c; }\n}"); 3633 } 3634 3635 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3636 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3637 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3638 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3639 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3640 } 3641 3642 TEST_F(FormatTest, EscapedNewlines) { 3643 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3644 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3645 format("#define A \\\nint i;\\\n int j;", Narrow)); 3646 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3647 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3648 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3649 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3650 3651 FormatStyle AlignLeft = getLLVMStyle(); 3652 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3653 EXPECT_EQ("#define MACRO(x) \\\n" 3654 "private: \\\n" 3655 " int x(int a);\n", 3656 format("#define MACRO(x) \\\n" 3657 "private: \\\n" 3658 " int x(int a);\n", 3659 AlignLeft)); 3660 3661 // CRLF line endings 3662 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3663 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3664 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3665 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3666 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3667 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3668 EXPECT_EQ("#define MACRO(x) \\\r\n" 3669 "private: \\\r\n" 3670 " int x(int a);\r\n", 3671 format("#define MACRO(x) \\\r\n" 3672 "private: \\\r\n" 3673 " int x(int a);\r\n", 3674 AlignLeft)); 3675 3676 FormatStyle DontAlign = getLLVMStyle(); 3677 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3678 DontAlign.MaxEmptyLinesToKeep = 3; 3679 // FIXME: can't use verifyFormat here because the newline before 3680 // "public:" is not inserted the first time it's reformatted 3681 EXPECT_EQ("#define A \\\n" 3682 " class Foo { \\\n" 3683 " void bar(); \\\n" 3684 "\\\n" 3685 "\\\n" 3686 "\\\n" 3687 " public: \\\n" 3688 " void baz(); \\\n" 3689 " };", 3690 format("#define A \\\n" 3691 " class Foo { \\\n" 3692 " void bar(); \\\n" 3693 "\\\n" 3694 "\\\n" 3695 "\\\n" 3696 " public: \\\n" 3697 " void baz(); \\\n" 3698 " };", 3699 DontAlign)); 3700 } 3701 3702 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3703 verifyFormat("#define A \\\n" 3704 " int v( \\\n" 3705 " a); \\\n" 3706 " int i;", 3707 getLLVMStyleWithColumns(11)); 3708 } 3709 3710 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3711 EXPECT_EQ( 3712 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3713 " \\\n" 3714 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3715 "\n" 3716 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3717 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3718 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3719 "\\\n" 3720 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3721 " \n" 3722 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3723 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3724 } 3725 3726 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3727 EXPECT_EQ("int\n" 3728 "#define A\n" 3729 " a;", 3730 format("int\n#define A\na;")); 3731 verifyFormat("functionCallTo(\n" 3732 " someOtherFunction(\n" 3733 " withSomeParameters, whichInSequence,\n" 3734 " areLongerThanALine(andAnotherCall,\n" 3735 "#define A B\n" 3736 " withMoreParamters,\n" 3737 " whichStronglyInfluenceTheLayout),\n" 3738 " andMoreParameters),\n" 3739 " trailing);", 3740 getLLVMStyleWithColumns(69)); 3741 verifyFormat("Foo::Foo()\n" 3742 "#ifdef BAR\n" 3743 " : baz(0)\n" 3744 "#endif\n" 3745 "{\n" 3746 "}"); 3747 verifyFormat("void f() {\n" 3748 " if (true)\n" 3749 "#ifdef A\n" 3750 " f(42);\n" 3751 " x();\n" 3752 "#else\n" 3753 " g();\n" 3754 " x();\n" 3755 "#endif\n" 3756 "}"); 3757 verifyFormat("void f(param1, param2,\n" 3758 " param3,\n" 3759 "#ifdef A\n" 3760 " param4(param5,\n" 3761 "#ifdef A1\n" 3762 " param6,\n" 3763 "#ifdef A2\n" 3764 " param7),\n" 3765 "#else\n" 3766 " param8),\n" 3767 " param9,\n" 3768 "#endif\n" 3769 " param10,\n" 3770 "#endif\n" 3771 " param11)\n" 3772 "#else\n" 3773 " param12)\n" 3774 "#endif\n" 3775 "{\n" 3776 " x();\n" 3777 "}", 3778 getLLVMStyleWithColumns(28)); 3779 verifyFormat("#if 1\n" 3780 "int i;"); 3781 verifyFormat("#if 1\n" 3782 "#endif\n" 3783 "#if 1\n" 3784 "#else\n" 3785 "#endif\n"); 3786 verifyFormat("DEBUG({\n" 3787 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3789 "});\n" 3790 "#if a\n" 3791 "#else\n" 3792 "#endif"); 3793 3794 verifyIncompleteFormat("void f(\n" 3795 "#if A\n" 3796 ");\n" 3797 "#else\n" 3798 "#endif"); 3799 } 3800 3801 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3802 verifyFormat("#endif\n" 3803 "#if B"); 3804 } 3805 3806 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3807 FormatStyle SingleLine = getLLVMStyle(); 3808 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3809 verifyFormat("#if 0\n" 3810 "#elif 1\n" 3811 "#endif\n" 3812 "void foo() {\n" 3813 " if (test) foo2();\n" 3814 "}", 3815 SingleLine); 3816 } 3817 3818 TEST_F(FormatTest, LayoutBlockInsideParens) { 3819 verifyFormat("functionCall({ int i; });"); 3820 verifyFormat("functionCall({\n" 3821 " int i;\n" 3822 " int j;\n" 3823 "});"); 3824 verifyFormat("functionCall(\n" 3825 " {\n" 3826 " int i;\n" 3827 " int j;\n" 3828 " },\n" 3829 " aaaa, bbbb, cccc);"); 3830 verifyFormat("functionA(functionB({\n" 3831 " int i;\n" 3832 " int j;\n" 3833 " }),\n" 3834 " aaaa, bbbb, cccc);"); 3835 verifyFormat("functionCall(\n" 3836 " {\n" 3837 " int i;\n" 3838 " int j;\n" 3839 " },\n" 3840 " aaaa, bbbb, // comment\n" 3841 " cccc);"); 3842 verifyFormat("functionA(functionB({\n" 3843 " int i;\n" 3844 " int j;\n" 3845 " }),\n" 3846 " aaaa, bbbb, // comment\n" 3847 " cccc);"); 3848 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3849 verifyFormat("functionCall(aaaa, bbbb, {\n" 3850 " int i;\n" 3851 " int j;\n" 3852 "});"); 3853 verifyFormat( 3854 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3855 " {\n" 3856 " int i; // break\n" 3857 " },\n" 3858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3859 " ccccccccccccccccc));"); 3860 verifyFormat("DEBUG({\n" 3861 " if (a)\n" 3862 " f();\n" 3863 "});"); 3864 } 3865 3866 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3867 EXPECT_EQ("SOME_MACRO { int i; }\n" 3868 "int i;", 3869 format(" SOME_MACRO {int i;} int i;")); 3870 } 3871 3872 TEST_F(FormatTest, LayoutNestedBlocks) { 3873 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3874 " struct s {\n" 3875 " int i;\n" 3876 " };\n" 3877 " s kBitsToOs[] = {{10}};\n" 3878 " for (int i = 0; i < 10; ++i)\n" 3879 " return;\n" 3880 "}"); 3881 verifyFormat("call(parameter, {\n" 3882 " something();\n" 3883 " // Comment using all columns.\n" 3884 " somethingelse();\n" 3885 "});", 3886 getLLVMStyleWithColumns(40)); 3887 verifyFormat("DEBUG( //\n" 3888 " { f(); }, a);"); 3889 verifyFormat("DEBUG( //\n" 3890 " {\n" 3891 " f(); //\n" 3892 " },\n" 3893 " a);"); 3894 3895 EXPECT_EQ("call(parameter, {\n" 3896 " something();\n" 3897 " // Comment too\n" 3898 " // looooooooooong.\n" 3899 " somethingElse();\n" 3900 "});", 3901 format("call(parameter, {\n" 3902 " something();\n" 3903 " // Comment too looooooooooong.\n" 3904 " somethingElse();\n" 3905 "});", 3906 getLLVMStyleWithColumns(29))); 3907 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3908 EXPECT_EQ("DEBUG({ // comment\n" 3909 " int i;\n" 3910 "});", 3911 format("DEBUG({ // comment\n" 3912 "int i;\n" 3913 "});")); 3914 EXPECT_EQ("DEBUG({\n" 3915 " int i;\n" 3916 "\n" 3917 " // comment\n" 3918 " int j;\n" 3919 "});", 3920 format("DEBUG({\n" 3921 " int i;\n" 3922 "\n" 3923 " // comment\n" 3924 " int j;\n" 3925 "});")); 3926 3927 verifyFormat("DEBUG({\n" 3928 " if (a)\n" 3929 " return;\n" 3930 "});"); 3931 verifyGoogleFormat("DEBUG({\n" 3932 " if (a) return;\n" 3933 "});"); 3934 FormatStyle Style = getGoogleStyle(); 3935 Style.ColumnLimit = 45; 3936 verifyFormat("Debug(\n" 3937 " aaaaa,\n" 3938 " {\n" 3939 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3940 " },\n" 3941 " a);", 3942 Style); 3943 3944 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3945 3946 verifyNoCrash("^{v^{a}}"); 3947 } 3948 3949 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3950 EXPECT_EQ("#define MACRO() \\\n" 3951 " Debug(aaa, /* force line break */ \\\n" 3952 " { \\\n" 3953 " int i; \\\n" 3954 " int j; \\\n" 3955 " })", 3956 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3957 " { int i; int j; })", 3958 getGoogleStyle())); 3959 3960 EXPECT_EQ("#define A \\\n" 3961 " [] { \\\n" 3962 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3963 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3964 " }", 3965 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3966 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3967 getGoogleStyle())); 3968 } 3969 3970 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3971 EXPECT_EQ("{}", format("{}")); 3972 verifyFormat("enum E {};"); 3973 verifyFormat("enum E {}"); 3974 FormatStyle Style = getLLVMStyle(); 3975 Style.SpaceInEmptyBlock = true; 3976 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 3977 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 3978 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 3979 } 3980 3981 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 3982 FormatStyle Style = getLLVMStyle(); 3983 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 3984 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 3985 verifyFormat("FOO_BEGIN\n" 3986 " FOO_ENTRY\n" 3987 "FOO_END", 3988 Style); 3989 verifyFormat("FOO_BEGIN\n" 3990 " NESTED_FOO_BEGIN\n" 3991 " NESTED_FOO_ENTRY\n" 3992 " NESTED_FOO_END\n" 3993 "FOO_END", 3994 Style); 3995 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 3996 " int x;\n" 3997 " x = 1;\n" 3998 "FOO_END(Baz)", 3999 Style); 4000 } 4001 4002 //===----------------------------------------------------------------------===// 4003 // Line break tests. 4004 //===----------------------------------------------------------------------===// 4005 4006 TEST_F(FormatTest, PreventConfusingIndents) { 4007 verifyFormat( 4008 "void f() {\n" 4009 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 4010 " parameter, parameter, parameter)),\n" 4011 " SecondLongCall(parameter));\n" 4012 "}"); 4013 verifyFormat( 4014 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4015 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4016 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4017 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 4018 verifyFormat( 4019 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4020 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 4021 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 4022 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 4023 verifyFormat( 4024 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 4025 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 4026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 4027 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 4028 verifyFormat("int a = bbbb && ccc &&\n" 4029 " fffff(\n" 4030 "#define A Just forcing a new line\n" 4031 " ddd);"); 4032 } 4033 4034 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 4035 verifyFormat( 4036 "bool aaaaaaa =\n" 4037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 4038 " bbbbbbbb();"); 4039 verifyFormat( 4040 "bool aaaaaaa =\n" 4041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 4042 " bbbbbbbb();"); 4043 4044 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 4046 " ccccccccc == ddddddddddd;"); 4047 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 4049 " ccccccccc == ddddddddddd;"); 4050 verifyFormat( 4051 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 4052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 4053 " ccccccccc == ddddddddddd;"); 4054 4055 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4056 " aaaaaa) &&\n" 4057 " bbbbbb && cccccc;"); 4058 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4059 " aaaaaa) >>\n" 4060 " bbbbbb;"); 4061 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 4062 " SourceMgr.getSpellingColumnNumber(\n" 4063 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 4064 " 1);"); 4065 4066 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4067 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 4068 " cccccc) {\n}"); 4069 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4070 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4071 " cccccc) {\n}"); 4072 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4073 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4074 " cccccc) {\n}"); 4075 verifyFormat("b = a &&\n" 4076 " // Comment\n" 4077 " b.c && d;"); 4078 4079 // If the LHS of a comparison is not a binary expression itself, the 4080 // additional linebreak confuses many people. 4081 verifyFormat( 4082 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4083 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 4084 "}"); 4085 verifyFormat( 4086 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4088 "}"); 4089 verifyFormat( 4090 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 4091 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4092 "}"); 4093 verifyFormat( 4094 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4095 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 4096 "}"); 4097 // Even explicit parentheses stress the precedence enough to make the 4098 // additional break unnecessary. 4099 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4100 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4101 "}"); 4102 // This cases is borderline, but with the indentation it is still readable. 4103 verifyFormat( 4104 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4105 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4107 "}", 4108 getLLVMStyleWithColumns(75)); 4109 4110 // If the LHS is a binary expression, we should still use the additional break 4111 // as otherwise the formatting hides the operator precedence. 4112 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4114 " 5) {\n" 4115 "}"); 4116 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4117 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4118 " 5) {\n" 4119 "}"); 4120 4121 FormatStyle OnePerLine = getLLVMStyle(); 4122 OnePerLine.BinPackParameters = false; 4123 verifyFormat( 4124 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4126 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4127 OnePerLine); 4128 4129 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4130 " .aaa(aaaaaaaaaaaaa) *\n" 4131 " aaaaaaa +\n" 4132 " aaaaaaa;", 4133 getLLVMStyleWithColumns(40)); 4134 } 4135 4136 TEST_F(FormatTest, ExpressionIndentation) { 4137 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4139 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4140 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4141 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4142 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4145 " ccccccccccccccccccccccccccccccccccccccccc;"); 4146 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4147 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4148 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4149 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4150 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4153 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4154 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4155 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4157 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4158 verifyFormat("if () {\n" 4159 "} else if (aaaaa && bbbbb > // break\n" 4160 " ccccc) {\n" 4161 "}"); 4162 verifyFormat("if () {\n" 4163 "} else if constexpr (aaaaa && bbbbb > // break\n" 4164 " ccccc) {\n" 4165 "}"); 4166 verifyFormat("if () {\n" 4167 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4168 " ccccc) {\n" 4169 "}"); 4170 verifyFormat("if () {\n" 4171 "} else if (aaaaa &&\n" 4172 " bbbbb > // break\n" 4173 " ccccc &&\n" 4174 " ddddd) {\n" 4175 "}"); 4176 4177 // Presence of a trailing comment used to change indentation of b. 4178 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4179 " b;\n" 4180 "return aaaaaaaaaaaaaaaaaaa +\n" 4181 " b; //", 4182 getLLVMStyleWithColumns(30)); 4183 } 4184 4185 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4186 // Not sure what the best system is here. Like this, the LHS can be found 4187 // immediately above an operator (everything with the same or a higher 4188 // indent). The RHS is aligned right of the operator and so compasses 4189 // everything until something with the same indent as the operator is found. 4190 // FIXME: Is this a good system? 4191 FormatStyle Style = getLLVMStyle(); 4192 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4193 verifyFormat( 4194 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4195 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4196 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4197 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4198 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4199 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4200 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4201 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4202 " > ccccccccccccccccccccccccccccccccccccccccc;", 4203 Style); 4204 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4205 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4206 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4207 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4208 Style); 4209 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4210 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4211 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4212 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4213 Style); 4214 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4215 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4216 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4217 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4218 Style); 4219 verifyFormat("if () {\n" 4220 "} else if (aaaaa\n" 4221 " && bbbbb // break\n" 4222 " > ccccc) {\n" 4223 "}", 4224 Style); 4225 verifyFormat("return (a)\n" 4226 " // comment\n" 4227 " + b;", 4228 Style); 4229 verifyFormat( 4230 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4231 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4232 " + cc;", 4233 Style); 4234 4235 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4236 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4237 Style); 4238 4239 // Forced by comments. 4240 verifyFormat( 4241 "unsigned ContentSize =\n" 4242 " sizeof(int16_t) // DWARF ARange version number\n" 4243 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4244 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4245 " + sizeof(int8_t); // Segment Size (in bytes)"); 4246 4247 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4248 " == boost::fusion::at_c<1>(iiii).second;", 4249 Style); 4250 4251 Style.ColumnLimit = 60; 4252 verifyFormat("zzzzzzzzzz\n" 4253 " = bbbbbbbbbbbbbbbbb\n" 4254 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4255 Style); 4256 4257 Style.ColumnLimit = 80; 4258 Style.IndentWidth = 4; 4259 Style.TabWidth = 4; 4260 Style.UseTab = FormatStyle::UT_Always; 4261 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4262 Style.AlignOperands = false; 4263 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4264 "\t&& (someOtherLongishConditionPart1\n" 4265 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4266 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4267 "(someOtherLongishConditionPart1 || " 4268 "someOtherEvenLongerNestedConditionPart2);", 4269 Style)); 4270 } 4271 4272 TEST_F(FormatTest, EnforcedOperatorWraps) { 4273 // Here we'd like to wrap after the || operators, but a comment is forcing an 4274 // earlier wrap. 4275 verifyFormat("bool x = aaaaa //\n" 4276 " || bbbbb\n" 4277 " //\n" 4278 " || cccc;"); 4279 } 4280 4281 TEST_F(FormatTest, NoOperandAlignment) { 4282 FormatStyle Style = getLLVMStyle(); 4283 Style.AlignOperands = false; 4284 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4285 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4287 Style); 4288 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4289 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4290 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4291 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4292 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4293 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4294 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4295 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4296 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4297 " > ccccccccccccccccccccccccccccccccccccccccc;", 4298 Style); 4299 4300 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4301 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4302 " + cc;", 4303 Style); 4304 verifyFormat("int a = aa\n" 4305 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4306 " * cccccccccccccccccccccccccccccccccccc;\n", 4307 Style); 4308 4309 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4310 verifyFormat("return (a > b\n" 4311 " // comment1\n" 4312 " // comment2\n" 4313 " || c);", 4314 Style); 4315 } 4316 4317 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4318 FormatStyle Style = getLLVMStyle(); 4319 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4320 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4322 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4323 Style); 4324 } 4325 4326 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4327 FormatStyle Style = getLLVMStyle(); 4328 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4329 Style.BinPackArguments = false; 4330 Style.ColumnLimit = 40; 4331 verifyFormat("void test() {\n" 4332 " someFunction(\n" 4333 " this + argument + is + quite\n" 4334 " + long + so + it + gets + wrapped\n" 4335 " + but + remains + bin - packed);\n" 4336 "}", 4337 Style); 4338 verifyFormat("void test() {\n" 4339 " someFunction(arg1,\n" 4340 " this + argument + is\n" 4341 " + quite + long + so\n" 4342 " + it + gets + wrapped\n" 4343 " + but + remains + bin\n" 4344 " - packed,\n" 4345 " arg3);\n" 4346 "}", 4347 Style); 4348 verifyFormat("void test() {\n" 4349 " someFunction(\n" 4350 " arg1,\n" 4351 " this + argument + has\n" 4352 " + anotherFunc(nested,\n" 4353 " calls + whose\n" 4354 " + arguments\n" 4355 " + are + also\n" 4356 " + wrapped,\n" 4357 " in + addition)\n" 4358 " + to + being + bin - packed,\n" 4359 " arg3);\n" 4360 "}", 4361 Style); 4362 4363 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4364 verifyFormat("void test() {\n" 4365 " someFunction(\n" 4366 " arg1,\n" 4367 " this + argument + has +\n" 4368 " anotherFunc(nested,\n" 4369 " calls + whose +\n" 4370 " arguments +\n" 4371 " are + also +\n" 4372 " wrapped,\n" 4373 " in + addition) +\n" 4374 " to + being + bin - packed,\n" 4375 " arg3);\n" 4376 "}", 4377 Style); 4378 } 4379 4380 TEST_F(FormatTest, ConstructorInitializers) { 4381 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4382 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4383 getLLVMStyleWithColumns(45)); 4384 verifyFormat("Constructor()\n" 4385 " : Inttializer(FitsOnTheLine) {}", 4386 getLLVMStyleWithColumns(44)); 4387 verifyFormat("Constructor()\n" 4388 " : Inttializer(FitsOnTheLine) {}", 4389 getLLVMStyleWithColumns(43)); 4390 4391 verifyFormat("template <typename T>\n" 4392 "Constructor() : Initializer(FitsOnTheLine) {}", 4393 getLLVMStyleWithColumns(45)); 4394 4395 verifyFormat( 4396 "SomeClass::Constructor()\n" 4397 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4398 4399 verifyFormat( 4400 "SomeClass::Constructor()\n" 4401 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4402 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4403 verifyFormat( 4404 "SomeClass::Constructor()\n" 4405 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4406 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4407 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4408 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4409 " : aaaaaaaaaa(aaaaaa) {}"); 4410 4411 verifyFormat("Constructor()\n" 4412 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4413 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4414 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4415 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4416 4417 verifyFormat("Constructor()\n" 4418 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4419 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4420 4421 verifyFormat("Constructor(int Parameter = 0)\n" 4422 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4423 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4424 verifyFormat("Constructor()\n" 4425 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4426 "}", 4427 getLLVMStyleWithColumns(60)); 4428 verifyFormat("Constructor()\n" 4429 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4430 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4431 4432 // Here a line could be saved by splitting the second initializer onto two 4433 // lines, but that is not desirable. 4434 verifyFormat("Constructor()\n" 4435 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4436 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4437 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4438 4439 FormatStyle OnePerLine = getLLVMStyle(); 4440 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4441 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4442 verifyFormat("SomeClass::Constructor()\n" 4443 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4444 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4445 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4446 OnePerLine); 4447 verifyFormat("SomeClass::Constructor()\n" 4448 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4449 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4450 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4451 OnePerLine); 4452 verifyFormat("MyClass::MyClass(int var)\n" 4453 " : some_var_(var), // 4 space indent\n" 4454 " some_other_var_(var + 1) { // lined up\n" 4455 "}", 4456 OnePerLine); 4457 verifyFormat("Constructor()\n" 4458 " : aaaaa(aaaaaa),\n" 4459 " aaaaa(aaaaaa),\n" 4460 " aaaaa(aaaaaa),\n" 4461 " aaaaa(aaaaaa),\n" 4462 " aaaaa(aaaaaa) {}", 4463 OnePerLine); 4464 verifyFormat("Constructor()\n" 4465 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4466 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4467 OnePerLine); 4468 OnePerLine.BinPackParameters = false; 4469 verifyFormat( 4470 "Constructor()\n" 4471 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4472 " aaaaaaaaaaa().aaa(),\n" 4473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4474 OnePerLine); 4475 OnePerLine.ColumnLimit = 60; 4476 verifyFormat("Constructor()\n" 4477 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4478 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4479 OnePerLine); 4480 4481 EXPECT_EQ("Constructor()\n" 4482 " : // Comment forcing unwanted break.\n" 4483 " aaaa(aaaa) {}", 4484 format("Constructor() :\n" 4485 " // Comment forcing unwanted break.\n" 4486 " aaaa(aaaa) {}")); 4487 } 4488 4489 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4490 FormatStyle Style = getLLVMStyle(); 4491 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4492 Style.ColumnLimit = 60; 4493 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4494 Style.AllowAllConstructorInitializersOnNextLine = true; 4495 Style.BinPackParameters = false; 4496 4497 for (int i = 0; i < 4; ++i) { 4498 // Test all combinations of parameters that should not have an effect. 4499 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4500 Style.AllowAllArgumentsOnNextLine = i & 2; 4501 4502 Style.AllowAllConstructorInitializersOnNextLine = true; 4503 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4504 verifyFormat("Constructor()\n" 4505 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4506 Style); 4507 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4508 4509 Style.AllowAllConstructorInitializersOnNextLine = false; 4510 verifyFormat("Constructor()\n" 4511 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4512 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4513 Style); 4514 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4515 4516 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4517 Style.AllowAllConstructorInitializersOnNextLine = true; 4518 verifyFormat("Constructor()\n" 4519 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4520 Style); 4521 4522 Style.AllowAllConstructorInitializersOnNextLine = false; 4523 verifyFormat("Constructor()\n" 4524 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4525 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4526 Style); 4527 4528 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4529 Style.AllowAllConstructorInitializersOnNextLine = true; 4530 verifyFormat("Constructor() :\n" 4531 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4532 Style); 4533 4534 Style.AllowAllConstructorInitializersOnNextLine = false; 4535 verifyFormat("Constructor() :\n" 4536 " aaaaaaaaaaaaaaaaaa(a),\n" 4537 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4538 Style); 4539 } 4540 4541 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4542 // AllowAllConstructorInitializersOnNextLine in all 4543 // BreakConstructorInitializers modes 4544 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4545 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4546 Style.AllowAllConstructorInitializersOnNextLine = false; 4547 verifyFormat("SomeClassWithALongName::Constructor(\n" 4548 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4549 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4550 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4551 Style); 4552 4553 Style.AllowAllConstructorInitializersOnNextLine = true; 4554 verifyFormat("SomeClassWithALongName::Constructor(\n" 4555 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4556 " int bbbbbbbbbbbbb,\n" 4557 " int cccccccccccccccc)\n" 4558 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4559 Style); 4560 4561 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4562 Style.AllowAllConstructorInitializersOnNextLine = false; 4563 verifyFormat("SomeClassWithALongName::Constructor(\n" 4564 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4565 " int bbbbbbbbbbbbb)\n" 4566 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4567 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4568 Style); 4569 4570 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4571 4572 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4573 verifyFormat("SomeClassWithALongName::Constructor(\n" 4574 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4575 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4576 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4577 Style); 4578 4579 Style.AllowAllConstructorInitializersOnNextLine = true; 4580 verifyFormat("SomeClassWithALongName::Constructor(\n" 4581 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4582 " int bbbbbbbbbbbbb,\n" 4583 " int cccccccccccccccc)\n" 4584 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4585 Style); 4586 4587 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4588 Style.AllowAllConstructorInitializersOnNextLine = false; 4589 verifyFormat("SomeClassWithALongName::Constructor(\n" 4590 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4591 " int bbbbbbbbbbbbb)\n" 4592 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4593 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4594 Style); 4595 4596 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4597 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4598 verifyFormat("SomeClassWithALongName::Constructor(\n" 4599 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4600 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4601 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4602 Style); 4603 4604 Style.AllowAllConstructorInitializersOnNextLine = true; 4605 verifyFormat("SomeClassWithALongName::Constructor(\n" 4606 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4607 " int bbbbbbbbbbbbb,\n" 4608 " int cccccccccccccccc) :\n" 4609 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4610 Style); 4611 4612 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4613 Style.AllowAllConstructorInitializersOnNextLine = false; 4614 verifyFormat("SomeClassWithALongName::Constructor(\n" 4615 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4616 " int bbbbbbbbbbbbb) :\n" 4617 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4618 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4619 Style); 4620 } 4621 4622 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4623 FormatStyle Style = getLLVMStyle(); 4624 Style.ColumnLimit = 60; 4625 Style.BinPackArguments = false; 4626 for (int i = 0; i < 4; ++i) { 4627 // Test all combinations of parameters that should not have an effect. 4628 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4629 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4630 4631 Style.AllowAllArgumentsOnNextLine = true; 4632 verifyFormat("void foo() {\n" 4633 " FunctionCallWithReallyLongName(\n" 4634 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4635 "}", 4636 Style); 4637 Style.AllowAllArgumentsOnNextLine = false; 4638 verifyFormat("void foo() {\n" 4639 " FunctionCallWithReallyLongName(\n" 4640 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4641 " bbbbbbbbbbbb);\n" 4642 "}", 4643 Style); 4644 4645 Style.AllowAllArgumentsOnNextLine = true; 4646 verifyFormat("void foo() {\n" 4647 " auto VariableWithReallyLongName = {\n" 4648 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4649 "}", 4650 Style); 4651 Style.AllowAllArgumentsOnNextLine = false; 4652 verifyFormat("void foo() {\n" 4653 " auto VariableWithReallyLongName = {\n" 4654 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4655 " bbbbbbbbbbbb};\n" 4656 "}", 4657 Style); 4658 } 4659 4660 // This parameter should not affect declarations. 4661 Style.BinPackParameters = false; 4662 Style.AllowAllArgumentsOnNextLine = false; 4663 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4664 verifyFormat("void FunctionCallWithReallyLongName(\n" 4665 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4666 Style); 4667 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4668 verifyFormat("void FunctionCallWithReallyLongName(\n" 4669 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4670 " int bbbbbbbbbbbb);", 4671 Style); 4672 } 4673 4674 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4675 FormatStyle Style = getLLVMStyle(); 4676 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4677 4678 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4679 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4680 getStyleWithColumns(Style, 45)); 4681 verifyFormat("Constructor() :\n" 4682 " Initializer(FitsOnTheLine) {}", 4683 getStyleWithColumns(Style, 44)); 4684 verifyFormat("Constructor() :\n" 4685 " Initializer(FitsOnTheLine) {}", 4686 getStyleWithColumns(Style, 43)); 4687 4688 verifyFormat("template <typename T>\n" 4689 "Constructor() : Initializer(FitsOnTheLine) {}", 4690 getStyleWithColumns(Style, 50)); 4691 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4692 verifyFormat( 4693 "SomeClass::Constructor() :\n" 4694 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4695 Style); 4696 4697 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4698 verifyFormat( 4699 "SomeClass::Constructor() :\n" 4700 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4701 Style); 4702 4703 verifyFormat( 4704 "SomeClass::Constructor() :\n" 4705 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4706 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4707 Style); 4708 verifyFormat( 4709 "SomeClass::Constructor() :\n" 4710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4711 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4712 Style); 4713 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4714 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4715 " aaaaaaaaaa(aaaaaa) {}", 4716 Style); 4717 4718 verifyFormat("Constructor() :\n" 4719 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4720 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4722 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4723 Style); 4724 4725 verifyFormat("Constructor() :\n" 4726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4728 Style); 4729 4730 verifyFormat("Constructor(int Parameter = 0) :\n" 4731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4732 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4733 Style); 4734 verifyFormat("Constructor() :\n" 4735 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4736 "}", 4737 getStyleWithColumns(Style, 60)); 4738 verifyFormat("Constructor() :\n" 4739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4740 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4741 Style); 4742 4743 // Here a line could be saved by splitting the second initializer onto two 4744 // lines, but that is not desirable. 4745 verifyFormat("Constructor() :\n" 4746 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4747 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4748 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4749 Style); 4750 4751 FormatStyle OnePerLine = Style; 4752 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4753 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4754 verifyFormat("SomeClass::Constructor() :\n" 4755 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4756 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4757 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4758 OnePerLine); 4759 verifyFormat("SomeClass::Constructor() :\n" 4760 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4761 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4762 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4763 OnePerLine); 4764 verifyFormat("MyClass::MyClass(int var) :\n" 4765 " some_var_(var), // 4 space indent\n" 4766 " some_other_var_(var + 1) { // lined up\n" 4767 "}", 4768 OnePerLine); 4769 verifyFormat("Constructor() :\n" 4770 " aaaaa(aaaaaa),\n" 4771 " aaaaa(aaaaaa),\n" 4772 " aaaaa(aaaaaa),\n" 4773 " aaaaa(aaaaaa),\n" 4774 " aaaaa(aaaaaa) {}", 4775 OnePerLine); 4776 verifyFormat("Constructor() :\n" 4777 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4778 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4779 OnePerLine); 4780 OnePerLine.BinPackParameters = false; 4781 verifyFormat("Constructor() :\n" 4782 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4783 " aaaaaaaaaaa().aaa(),\n" 4784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4785 OnePerLine); 4786 OnePerLine.ColumnLimit = 60; 4787 verifyFormat("Constructor() :\n" 4788 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4789 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4790 OnePerLine); 4791 4792 EXPECT_EQ("Constructor() :\n" 4793 " // Comment forcing unwanted break.\n" 4794 " aaaa(aaaa) {}", 4795 format("Constructor() :\n" 4796 " // Comment forcing unwanted break.\n" 4797 " aaaa(aaaa) {}", 4798 Style)); 4799 4800 Style.ColumnLimit = 0; 4801 verifyFormat("SomeClass::Constructor() :\n" 4802 " a(a) {}", 4803 Style); 4804 verifyFormat("SomeClass::Constructor() noexcept :\n" 4805 " a(a) {}", 4806 Style); 4807 verifyFormat("SomeClass::Constructor() :\n" 4808 " a(a), b(b), c(c) {}", 4809 Style); 4810 verifyFormat("SomeClass::Constructor() :\n" 4811 " a(a) {\n" 4812 " foo();\n" 4813 " bar();\n" 4814 "}", 4815 Style); 4816 4817 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4818 verifyFormat("SomeClass::Constructor() :\n" 4819 " a(a), b(b), c(c) {\n" 4820 "}", 4821 Style); 4822 verifyFormat("SomeClass::Constructor() :\n" 4823 " a(a) {\n" 4824 "}", 4825 Style); 4826 4827 Style.ColumnLimit = 80; 4828 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4829 Style.ConstructorInitializerIndentWidth = 2; 4830 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 4831 verifyFormat("SomeClass::Constructor() :\n" 4832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4833 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4834 Style); 4835 4836 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 4837 // well 4838 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4839 verifyFormat( 4840 "class SomeClass\n" 4841 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4842 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4843 Style); 4844 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4845 verifyFormat( 4846 "class SomeClass\n" 4847 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4848 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4849 Style); 4850 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4851 verifyFormat( 4852 "class SomeClass :\n" 4853 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4854 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4855 Style); 4856 } 4857 4858 #ifndef EXPENSIVE_CHECKS 4859 // Expensive checks enables libstdc++ checking which includes validating the 4860 // state of ranges used in std::priority_queue - this blows out the 4861 // runtime/scalability of the function and makes this test unacceptably slow. 4862 TEST_F(FormatTest, MemoizationTests) { 4863 // This breaks if the memoization lookup does not take \c Indent and 4864 // \c LastSpace into account. 4865 verifyFormat( 4866 "extern CFRunLoopTimerRef\n" 4867 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4868 " CFTimeInterval interval, CFOptionFlags flags,\n" 4869 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4870 " CFRunLoopTimerContext *context) {}"); 4871 4872 // Deep nesting somewhat works around our memoization. 4873 verifyFormat( 4874 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4875 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4876 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4877 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4878 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4879 getLLVMStyleWithColumns(65)); 4880 verifyFormat( 4881 "aaaaa(\n" 4882 " aaaaa,\n" 4883 " aaaaa(\n" 4884 " aaaaa,\n" 4885 " aaaaa(\n" 4886 " aaaaa,\n" 4887 " aaaaa(\n" 4888 " aaaaa,\n" 4889 " aaaaa(\n" 4890 " aaaaa,\n" 4891 " aaaaa(\n" 4892 " aaaaa,\n" 4893 " aaaaa(\n" 4894 " aaaaa,\n" 4895 " aaaaa(\n" 4896 " aaaaa,\n" 4897 " aaaaa(\n" 4898 " aaaaa,\n" 4899 " aaaaa(\n" 4900 " aaaaa,\n" 4901 " aaaaa(\n" 4902 " aaaaa,\n" 4903 " aaaaa(\n" 4904 " aaaaa,\n" 4905 " aaaaa))))))))))));", 4906 getLLVMStyleWithColumns(65)); 4907 verifyFormat( 4908 "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" 4909 " a),\n" 4910 " a),\n" 4911 " a),\n" 4912 " a),\n" 4913 " a),\n" 4914 " a),\n" 4915 " a),\n" 4916 " a),\n" 4917 " a),\n" 4918 " a),\n" 4919 " a),\n" 4920 " a),\n" 4921 " a),\n" 4922 " a),\n" 4923 " a),\n" 4924 " a),\n" 4925 " a)", 4926 getLLVMStyleWithColumns(65)); 4927 4928 // This test takes VERY long when memoization is broken. 4929 FormatStyle OnePerLine = getLLVMStyle(); 4930 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4931 OnePerLine.BinPackParameters = false; 4932 std::string input = "Constructor()\n" 4933 " : aaaa(a,\n"; 4934 for (unsigned i = 0, e = 80; i != e; ++i) { 4935 input += " a,\n"; 4936 } 4937 input += " a) {}"; 4938 verifyFormat(input, OnePerLine); 4939 } 4940 #endif 4941 4942 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4943 verifyFormat( 4944 "void f() {\n" 4945 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4946 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4947 " f();\n" 4948 "}"); 4949 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4950 " Intervals[i - 1].getRange().getLast()) {\n}"); 4951 } 4952 4953 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4954 // Principially, we break function declarations in a certain order: 4955 // 1) break amongst arguments. 4956 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 4957 " Cccccccccccccc cccccccccccccc);"); 4958 verifyFormat("template <class TemplateIt>\n" 4959 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 4960 " TemplateIt *stop) {}"); 4961 4962 // 2) break after return type. 4963 verifyFormat( 4964 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4965 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 4966 getGoogleStyle()); 4967 4968 // 3) break after (. 4969 verifyFormat( 4970 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 4971 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 4972 getGoogleStyle()); 4973 4974 // 4) break before after nested name specifiers. 4975 verifyFormat( 4976 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4977 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 4978 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 4979 getGoogleStyle()); 4980 4981 // However, there are exceptions, if a sufficient amount of lines can be 4982 // saved. 4983 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 4984 // more adjusting. 4985 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4986 " Cccccccccccccc cccccccccc,\n" 4987 " Cccccccccccccc cccccccccc,\n" 4988 " Cccccccccccccc cccccccccc,\n" 4989 " Cccccccccccccc cccccccccc);"); 4990 verifyFormat( 4991 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4992 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4993 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4994 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 4995 getGoogleStyle()); 4996 verifyFormat( 4997 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4998 " Cccccccccccccc cccccccccc,\n" 4999 " Cccccccccccccc cccccccccc,\n" 5000 " Cccccccccccccc cccccccccc,\n" 5001 " Cccccccccccccc cccccccccc,\n" 5002 " Cccccccccccccc cccccccccc,\n" 5003 " Cccccccccccccc cccccccccc);"); 5004 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5005 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5006 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5007 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5008 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 5009 5010 // Break after multi-line parameters. 5011 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5012 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5013 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5014 " bbbb bbbb);"); 5015 verifyFormat("void SomeLoooooooooooongFunction(\n" 5016 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5017 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5018 " int bbbbbbbbbbbbb);"); 5019 5020 // Treat overloaded operators like other functions. 5021 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5022 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 5023 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5024 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 5025 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5026 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 5027 verifyGoogleFormat( 5028 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 5029 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5030 verifyGoogleFormat( 5031 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 5032 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5033 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5034 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5035 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 5036 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5037 verifyGoogleFormat( 5038 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 5039 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5040 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 5041 verifyGoogleFormat("template <typename T>\n" 5042 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5043 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 5044 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 5045 5046 FormatStyle Style = getLLVMStyle(); 5047 Style.PointerAlignment = FormatStyle::PAS_Left; 5048 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5049 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 5050 Style); 5051 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 5052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5053 Style); 5054 } 5055 5056 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 5057 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 5058 // Prefer keeping `::` followed by `operator` together. 5059 EXPECT_EQ("const aaaa::bbbbbbb &\n" 5060 "ccccccccc::operator++() {\n" 5061 " stuff();\n" 5062 "}", 5063 format("const aaaa::bbbbbbb\n" 5064 "&ccccccccc::operator++() { stuff(); }", 5065 getLLVMStyleWithColumns(40))); 5066 } 5067 5068 TEST_F(FormatTest, TrailingReturnType) { 5069 verifyFormat("auto foo() -> int;\n"); 5070 // correct trailing return type spacing 5071 verifyFormat("auto operator->() -> int;\n"); 5072 verifyFormat("auto operator++(int) -> int;\n"); 5073 5074 verifyFormat("struct S {\n" 5075 " auto bar() const -> int;\n" 5076 "};"); 5077 verifyFormat("template <size_t Order, typename T>\n" 5078 "auto load_img(const std::string &filename)\n" 5079 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5080 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5081 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5082 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5083 verifyFormat("template <typename T>\n" 5084 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5085 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5086 5087 // Not trailing return types. 5088 verifyFormat("void f() { auto a = b->c(); }"); 5089 } 5090 5091 TEST_F(FormatTest, DeductionGuides) { 5092 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5093 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5094 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5095 verifyFormat( 5096 "template <class... T>\n" 5097 "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5098 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5099 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5100 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5101 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5102 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5103 verifyFormat("template <class T> x() -> x<1>;"); 5104 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5105 5106 // Ensure not deduction guides. 5107 verifyFormat("c()->f<int>();"); 5108 verifyFormat("x()->foo<1>;"); 5109 verifyFormat("x = p->foo<3>();"); 5110 verifyFormat("x()->x<1>();"); 5111 verifyFormat("x()->x<1>;"); 5112 } 5113 5114 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5115 // Avoid breaking before trailing 'const' or other trailing annotations, if 5116 // they are not function-like. 5117 FormatStyle Style = getGoogleStyle(); 5118 Style.ColumnLimit = 47; 5119 verifyFormat("void someLongFunction(\n" 5120 " int someLoooooooooooooongParameter) const {\n}", 5121 getLLVMStyleWithColumns(47)); 5122 verifyFormat("LoooooongReturnType\n" 5123 "someLoooooooongFunction() const {}", 5124 getLLVMStyleWithColumns(47)); 5125 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5126 " const {}", 5127 Style); 5128 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5129 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5130 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5131 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5132 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5133 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5134 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5135 " aaaaaaaaaaa aaaaa) const override;"); 5136 verifyGoogleFormat( 5137 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5138 " const override;"); 5139 5140 // Even if the first parameter has to be wrapped. 5141 verifyFormat("void someLongFunction(\n" 5142 " int someLongParameter) const {}", 5143 getLLVMStyleWithColumns(46)); 5144 verifyFormat("void someLongFunction(\n" 5145 " int someLongParameter) const {}", 5146 Style); 5147 verifyFormat("void someLongFunction(\n" 5148 " int someLongParameter) override {}", 5149 Style); 5150 verifyFormat("void someLongFunction(\n" 5151 " int someLongParameter) OVERRIDE {}", 5152 Style); 5153 verifyFormat("void someLongFunction(\n" 5154 " int someLongParameter) final {}", 5155 Style); 5156 verifyFormat("void someLongFunction(\n" 5157 " int someLongParameter) FINAL {}", 5158 Style); 5159 verifyFormat("void someLongFunction(\n" 5160 " int parameter) const override {}", 5161 Style); 5162 5163 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5164 verifyFormat("void someLongFunction(\n" 5165 " int someLongParameter) const\n" 5166 "{\n" 5167 "}", 5168 Style); 5169 5170 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5171 verifyFormat("void someLongFunction(\n" 5172 " int someLongParameter) const\n" 5173 " {\n" 5174 " }", 5175 Style); 5176 5177 // Unless these are unknown annotations. 5178 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5179 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5180 " LONG_AND_UGLY_ANNOTATION;"); 5181 5182 // Breaking before function-like trailing annotations is fine to keep them 5183 // close to their arguments. 5184 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5185 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5186 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5187 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5188 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5189 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5190 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5191 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5192 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5193 5194 verifyFormat( 5195 "void aaaaaaaaaaaaaaaaaa()\n" 5196 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5197 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5198 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5199 " __attribute__((unused));"); 5200 verifyGoogleFormat( 5201 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5202 " GUARDED_BY(aaaaaaaaaaaa);"); 5203 verifyGoogleFormat( 5204 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5205 " GUARDED_BY(aaaaaaaaaaaa);"); 5206 verifyGoogleFormat( 5207 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5208 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5209 verifyGoogleFormat( 5210 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5211 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5212 } 5213 5214 TEST_F(FormatTest, FunctionAnnotations) { 5215 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5216 "int OldFunction(const string ¶meter) {}"); 5217 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5218 "string OldFunction(const string ¶meter) {}"); 5219 verifyFormat("template <typename T>\n" 5220 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5221 "string OldFunction(const string ¶meter) {}"); 5222 5223 // Not function annotations. 5224 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5225 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5226 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5227 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5228 verifyFormat("MACRO(abc).function() // wrap\n" 5229 " << abc;"); 5230 verifyFormat("MACRO(abc)->function() // wrap\n" 5231 " << abc;"); 5232 verifyFormat("MACRO(abc)::function() // wrap\n" 5233 " << abc;"); 5234 } 5235 5236 TEST_F(FormatTest, BreaksDesireably) { 5237 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5238 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5239 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5240 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5241 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5242 "}"); 5243 5244 verifyFormat( 5245 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5247 5248 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5251 5252 verifyFormat( 5253 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5254 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5256 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5258 5259 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5260 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5261 5262 verifyFormat( 5263 "void f() {\n" 5264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5265 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5266 "}"); 5267 verifyFormat( 5268 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5270 verifyFormat( 5271 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5273 verifyFormat( 5274 "aaaaaa(aaa,\n" 5275 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5277 " aaaa);"); 5278 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5281 5282 // Indent consistently independent of call expression and unary operator. 5283 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5284 " dddddddddddddddddddddddddddddd));"); 5285 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5286 " dddddddddddddddddddddddddddddd));"); 5287 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5288 " dddddddddddddddddddddddddddddd));"); 5289 5290 // This test case breaks on an incorrect memoization, i.e. an optimization not 5291 // taking into account the StopAt value. 5292 verifyFormat( 5293 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5294 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5295 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5296 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5297 5298 verifyFormat("{\n {\n {\n" 5299 " Annotation.SpaceRequiredBefore =\n" 5300 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5301 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5302 " }\n }\n}"); 5303 5304 // Break on an outer level if there was a break on an inner level. 5305 EXPECT_EQ("f(g(h(a, // comment\n" 5306 " b, c),\n" 5307 " d, e),\n" 5308 " x, y);", 5309 format("f(g(h(a, // comment\n" 5310 " b, c), d, e), x, y);")); 5311 5312 // Prefer breaking similar line breaks. 5313 verifyFormat( 5314 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5315 " NSTrackingMouseEnteredAndExited |\n" 5316 " NSTrackingActiveAlways;"); 5317 } 5318 5319 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5320 FormatStyle NoBinPacking = getGoogleStyle(); 5321 NoBinPacking.BinPackParameters = false; 5322 NoBinPacking.BinPackArguments = true; 5323 verifyFormat("void f() {\n" 5324 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5325 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5326 "}", 5327 NoBinPacking); 5328 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5329 " int aaaaaaaaaaaaaaaaaaaa,\n" 5330 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5331 NoBinPacking); 5332 5333 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5334 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5335 " vector<int> bbbbbbbbbbbbbbb);", 5336 NoBinPacking); 5337 // FIXME: This behavior difference is probably not wanted. However, currently 5338 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5339 // template arguments from BreakBeforeParameter being set because of the 5340 // one-per-line formatting. 5341 verifyFormat( 5342 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5343 " aaaaaaaaaa> aaaaaaaaaa);", 5344 NoBinPacking); 5345 verifyFormat( 5346 "void fffffffffff(\n" 5347 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5348 " aaaaaaaaaa);"); 5349 } 5350 5351 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5352 FormatStyle NoBinPacking = getGoogleStyle(); 5353 NoBinPacking.BinPackParameters = false; 5354 NoBinPacking.BinPackArguments = false; 5355 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5356 " aaaaaaaaaaaaaaaaaaaa,\n" 5357 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5358 NoBinPacking); 5359 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5360 " aaaaaaaaaaaaa,\n" 5361 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5362 NoBinPacking); 5363 verifyFormat( 5364 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5365 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5366 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5367 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5369 NoBinPacking); 5370 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5371 " .aaaaaaaaaaaaaaaaaa();", 5372 NoBinPacking); 5373 verifyFormat("void f() {\n" 5374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5375 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5376 "}", 5377 NoBinPacking); 5378 5379 verifyFormat( 5380 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5381 " aaaaaaaaaaaa,\n" 5382 " aaaaaaaaaaaa);", 5383 NoBinPacking); 5384 verifyFormat( 5385 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5386 " ddddddddddddddddddddddddddddd),\n" 5387 " test);", 5388 NoBinPacking); 5389 5390 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5391 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5392 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5393 " aaaaaaaaaaaaaaaaaa;", 5394 NoBinPacking); 5395 verifyFormat("a(\"a\"\n" 5396 " \"a\",\n" 5397 " a);"); 5398 5399 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5400 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5401 " aaaaaaaaa,\n" 5402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5403 NoBinPacking); 5404 verifyFormat( 5405 "void f() {\n" 5406 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5407 " .aaaaaaa();\n" 5408 "}", 5409 NoBinPacking); 5410 verifyFormat( 5411 "template <class SomeType, class SomeOtherType>\n" 5412 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5413 NoBinPacking); 5414 } 5415 5416 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5417 FormatStyle Style = getLLVMStyleWithColumns(15); 5418 Style.ExperimentalAutoDetectBinPacking = true; 5419 EXPECT_EQ("aaa(aaaa,\n" 5420 " aaaa,\n" 5421 " aaaa);\n" 5422 "aaa(aaaa,\n" 5423 " aaaa,\n" 5424 " aaaa);", 5425 format("aaa(aaaa,\n" // one-per-line 5426 " aaaa,\n" 5427 " aaaa );\n" 5428 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5429 Style)); 5430 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5431 " aaaa);\n" 5432 "aaa(aaaa, aaaa,\n" 5433 " aaaa);", 5434 format("aaa(aaaa, aaaa,\n" // bin-packed 5435 " aaaa );\n" 5436 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5437 Style)); 5438 } 5439 5440 TEST_F(FormatTest, FormatsBuilderPattern) { 5441 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5442 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5443 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5444 " .StartsWith(\".init\", ORDER_INIT)\n" 5445 " .StartsWith(\".fini\", ORDER_FINI)\n" 5446 " .StartsWith(\".hash\", ORDER_HASH)\n" 5447 " .Default(ORDER_TEXT);\n"); 5448 5449 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5450 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5451 verifyFormat("aaaaaaa->aaaaaaa\n" 5452 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5454 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5455 verifyFormat( 5456 "aaaaaaa->aaaaaaa\n" 5457 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5458 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5459 verifyFormat( 5460 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5461 " aaaaaaaaaaaaaa);"); 5462 verifyFormat( 5463 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5464 " aaaaaa->aaaaaaaaaaaa()\n" 5465 " ->aaaaaaaaaaaaaaaa(\n" 5466 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5467 " ->aaaaaaaaaaaaaaaaa();"); 5468 verifyGoogleFormat( 5469 "void f() {\n" 5470 " someo->Add((new util::filetools::Handler(dir))\n" 5471 " ->OnEvent1(NewPermanentCallback(\n" 5472 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5473 " ->OnEvent2(NewPermanentCallback(\n" 5474 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5475 " ->OnEvent3(NewPermanentCallback(\n" 5476 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5477 " ->OnEvent5(NewPermanentCallback(\n" 5478 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5479 " ->OnEvent6(NewPermanentCallback(\n" 5480 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5481 "}"); 5482 5483 verifyFormat( 5484 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5485 verifyFormat("aaaaaaaaaaaaaaa()\n" 5486 " .aaaaaaaaaaaaaaa()\n" 5487 " .aaaaaaaaaaaaaaa()\n" 5488 " .aaaaaaaaaaaaaaa()\n" 5489 " .aaaaaaaaaaaaaaa();"); 5490 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5491 " .aaaaaaaaaaaaaaa()\n" 5492 " .aaaaaaaaaaaaaaa()\n" 5493 " .aaaaaaaaaaaaaaa();"); 5494 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5495 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5496 " .aaaaaaaaaaaaaaa();"); 5497 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5498 " ->aaaaaaaaaaaaaae(0)\n" 5499 " ->aaaaaaaaaaaaaaa();"); 5500 5501 // Don't linewrap after very short segments. 5502 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5503 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5504 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5505 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5506 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5507 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5508 verifyFormat("aaa()\n" 5509 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5510 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5511 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5512 5513 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5514 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5515 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5516 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5517 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5519 5520 // Prefer not to break after empty parentheses. 5521 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5522 " First->LastNewlineOffset);"); 5523 5524 // Prefer not to create "hanging" indents. 5525 verifyFormat( 5526 "return !soooooooooooooome_map\n" 5527 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5528 " .second;"); 5529 verifyFormat( 5530 "return aaaaaaaaaaaaaaaa\n" 5531 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5532 " .aaaa(aaaaaaaaaaaaaa);"); 5533 // No hanging indent here. 5534 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5535 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5536 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5537 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5538 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5539 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5540 getLLVMStyleWithColumns(60)); 5541 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5542 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5543 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5544 getLLVMStyleWithColumns(59)); 5545 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5546 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5547 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5548 5549 // Dont break if only closing statements before member call 5550 verifyFormat("test() {\n" 5551 " ([]() -> {\n" 5552 " int b = 32;\n" 5553 " return 3;\n" 5554 " }).foo();\n" 5555 "}"); 5556 verifyFormat("test() {\n" 5557 " (\n" 5558 " []() -> {\n" 5559 " int b = 32;\n" 5560 " return 3;\n" 5561 " },\n" 5562 " foo, bar)\n" 5563 " .foo();\n" 5564 "}"); 5565 verifyFormat("test() {\n" 5566 " ([]() -> {\n" 5567 " int b = 32;\n" 5568 " return 3;\n" 5569 " })\n" 5570 " .foo()\n" 5571 " .bar();\n" 5572 "}"); 5573 verifyFormat("test() {\n" 5574 " ([]() -> {\n" 5575 " int b = 32;\n" 5576 " return 3;\n" 5577 " })\n" 5578 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5579 " \"bbbb\");\n" 5580 "}", 5581 getLLVMStyleWithColumns(30)); 5582 } 5583 5584 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5585 verifyFormat( 5586 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5587 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5588 verifyFormat( 5589 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5590 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5591 5592 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5593 " ccccccccccccccccccccccccc) {\n}"); 5594 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5595 " ccccccccccccccccccccccccc) {\n}"); 5596 5597 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5598 " ccccccccccccccccccccccccc) {\n}"); 5599 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5600 " ccccccccccccccccccccccccc) {\n}"); 5601 5602 verifyFormat( 5603 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5604 " ccccccccccccccccccccccccc) {\n}"); 5605 verifyFormat( 5606 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5607 " ccccccccccccccccccccccccc) {\n}"); 5608 5609 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5610 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5611 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5612 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5613 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5614 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5615 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5616 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5617 5618 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5619 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5620 " aaaaaaaaaaaaaaa != aa) {\n}"); 5621 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5622 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5623 " aaaaaaaaaaaaaaa != aa) {\n}"); 5624 } 5625 5626 TEST_F(FormatTest, BreaksAfterAssignments) { 5627 verifyFormat( 5628 "unsigned Cost =\n" 5629 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5630 " SI->getPointerAddressSpaceee());\n"); 5631 verifyFormat( 5632 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5633 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5634 5635 verifyFormat( 5636 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5637 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5638 verifyFormat("unsigned OriginalStartColumn =\n" 5639 " SourceMgr.getSpellingColumnNumber(\n" 5640 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5641 " 1;"); 5642 } 5643 5644 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5645 FormatStyle Style = getLLVMStyle(); 5646 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5647 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5648 Style); 5649 5650 Style.PenaltyBreakAssignment = 20; 5651 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5652 " cccccccccccccccccccccccccc;", 5653 Style); 5654 } 5655 5656 TEST_F(FormatTest, AlignsAfterAssignments) { 5657 verifyFormat( 5658 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5659 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5660 verifyFormat( 5661 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5662 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5663 verifyFormat( 5664 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5665 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5666 verifyFormat( 5667 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5668 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5669 verifyFormat( 5670 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5671 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5672 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5673 } 5674 5675 TEST_F(FormatTest, AlignsAfterReturn) { 5676 verifyFormat( 5677 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5678 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5679 verifyFormat( 5680 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5681 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5682 verifyFormat( 5683 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5684 " aaaaaaaaaaaaaaaaaaaaaa();"); 5685 verifyFormat( 5686 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5687 " aaaaaaaaaaaaaaaaaaaaaa());"); 5688 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5690 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5691 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5693 verifyFormat("return\n" 5694 " // true if code is one of a or b.\n" 5695 " code == a || code == b;"); 5696 } 5697 5698 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5699 verifyFormat( 5700 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5701 " aaaaaaaaa aaaaaaa) {}"); 5702 verifyFormat( 5703 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5704 " aaaaaaaaaaa aaaaaaaaa);"); 5705 verifyFormat( 5706 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5707 " aaaaaaaaaaaaaaaaaaaaa));"); 5708 FormatStyle Style = getLLVMStyle(); 5709 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5710 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5711 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5712 Style); 5713 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5714 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5715 Style); 5716 verifyFormat("SomeLongVariableName->someFunction(\n" 5717 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5718 Style); 5719 verifyFormat( 5720 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5721 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5722 Style); 5723 verifyFormat( 5724 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5725 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5726 Style); 5727 verifyFormat( 5728 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5729 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5730 Style); 5731 5732 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5733 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5734 " b));", 5735 Style); 5736 5737 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5738 Style.BinPackArguments = false; 5739 Style.BinPackParameters = false; 5740 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5741 " aaaaaaaaaaa aaaaaaaa,\n" 5742 " aaaaaaaaa aaaaaaa,\n" 5743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5744 Style); 5745 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5746 " aaaaaaaaaaa aaaaaaaaa,\n" 5747 " aaaaaaaaaaa aaaaaaaaa,\n" 5748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5749 Style); 5750 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5751 " aaaaaaaaaaaaaaa,\n" 5752 " aaaaaaaaaaaaaaaaaaaaa,\n" 5753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5754 Style); 5755 verifyFormat( 5756 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5757 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5758 Style); 5759 verifyFormat( 5760 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5761 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5762 Style); 5763 verifyFormat( 5764 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5765 " aaaaaaaaaaaaaaaaaaaaa(\n" 5766 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5767 " aaaaaaaaaaaaaaaa);", 5768 Style); 5769 verifyFormat( 5770 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5771 " aaaaaaaaaaaaaaaaaaaaa(\n" 5772 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5773 " aaaaaaaaaaaaaaaa);", 5774 Style); 5775 } 5776 5777 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5778 FormatStyle Style = getLLVMStyleWithColumns(40); 5779 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5780 " bbbbbbbbbbbbbbbbbbbbbb);", 5781 Style); 5782 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5783 Style.AlignOperands = false; 5784 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5785 " bbbbbbbbbbbbbbbbbbbbbb);", 5786 Style); 5787 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5788 Style.AlignOperands = true; 5789 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5790 " bbbbbbbbbbbbbbbbbbbbbb);", 5791 Style); 5792 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5793 Style.AlignOperands = false; 5794 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5795 " bbbbbbbbbbbbbbbbbbbbbb);", 5796 Style); 5797 } 5798 5799 TEST_F(FormatTest, BreaksConditionalExpressions) { 5800 verifyFormat( 5801 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5802 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5803 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5804 verifyFormat( 5805 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5806 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5807 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5808 verifyFormat( 5809 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5810 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5811 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5812 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5813 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5814 verifyFormat( 5815 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5816 " : aaaaaaaaaaaaa);"); 5817 verifyFormat( 5818 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5819 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5820 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5821 " aaaaaaaaaaaaa);"); 5822 verifyFormat( 5823 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5824 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5825 " aaaaaaaaaaaaa);"); 5826 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5827 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5829 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5830 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5831 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5833 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5835 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5836 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5837 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5838 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5839 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5840 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5841 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5842 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5843 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5844 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5845 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5846 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5847 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5848 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5849 " : aaaaaaaaaaaaaaaa;"); 5850 verifyFormat( 5851 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5852 " ? aaaaaaaaaaaaaaa\n" 5853 " : aaaaaaaaaaaaaaa;"); 5854 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5855 " aaaaaaaaa\n" 5856 " ? b\n" 5857 " : c);"); 5858 verifyFormat("return aaaa == bbbb\n" 5859 " // comment\n" 5860 " ? aaaa\n" 5861 " : bbbb;"); 5862 verifyFormat("unsigned Indent =\n" 5863 " format(TheLine.First,\n" 5864 " IndentForLevel[TheLine.Level] >= 0\n" 5865 " ? IndentForLevel[TheLine.Level]\n" 5866 " : TheLine * 2,\n" 5867 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5868 getLLVMStyleWithColumns(60)); 5869 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5870 " ? aaaaaaaaaaaaaaa\n" 5871 " : bbbbbbbbbbbbbbb //\n" 5872 " ? ccccccccccccccc\n" 5873 " : ddddddddddddddd;"); 5874 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5875 " ? aaaaaaaaaaaaaaa\n" 5876 " : (bbbbbbbbbbbbbbb //\n" 5877 " ? ccccccccccccccc\n" 5878 " : ddddddddddddddd);"); 5879 verifyFormat( 5880 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5881 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5882 " aaaaaaaaaaaaaaaaaaaaa +\n" 5883 " aaaaaaaaaaaaaaaaaaaaa\n" 5884 " : aaaaaaaaaa;"); 5885 verifyFormat( 5886 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5887 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5888 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5889 5890 FormatStyle NoBinPacking = getLLVMStyle(); 5891 NoBinPacking.BinPackArguments = false; 5892 verifyFormat( 5893 "void f() {\n" 5894 " g(aaa,\n" 5895 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5896 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5897 " ? aaaaaaaaaaaaaaa\n" 5898 " : aaaaaaaaaaaaaaa);\n" 5899 "}", 5900 NoBinPacking); 5901 verifyFormat( 5902 "void f() {\n" 5903 " g(aaa,\n" 5904 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5905 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5906 " ?: aaaaaaaaaaaaaaa);\n" 5907 "}", 5908 NoBinPacking); 5909 5910 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5911 " // comment.\n" 5912 " ccccccccccccccccccccccccccccccccccccccc\n" 5913 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5914 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5915 5916 // Assignments in conditional expressions. Apparently not uncommon :-(. 5917 verifyFormat("return a != b\n" 5918 " // comment\n" 5919 " ? a = b\n" 5920 " : a = b;"); 5921 verifyFormat("return a != b\n" 5922 " // comment\n" 5923 " ? a = a != b\n" 5924 " // comment\n" 5925 " ? a = b\n" 5926 " : a\n" 5927 " : a;\n"); 5928 verifyFormat("return a != b\n" 5929 " // comment\n" 5930 " ? a\n" 5931 " : a = a != b\n" 5932 " // comment\n" 5933 " ? a = b\n" 5934 " : a;"); 5935 } 5936 5937 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5938 FormatStyle Style = getLLVMStyle(); 5939 Style.BreakBeforeTernaryOperators = false; 5940 Style.ColumnLimit = 70; 5941 verifyFormat( 5942 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5943 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5945 Style); 5946 verifyFormat( 5947 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5948 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5950 Style); 5951 verifyFormat( 5952 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5953 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5954 Style); 5955 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5956 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5957 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5958 Style); 5959 verifyFormat( 5960 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 5961 " aaaaaaaaaaaaa);", 5962 Style); 5963 verifyFormat( 5964 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5965 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5967 " aaaaaaaaaaaaa);", 5968 Style); 5969 verifyFormat( 5970 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5971 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5972 " aaaaaaaaaaaaa);", 5973 Style); 5974 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5976 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5977 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5978 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5979 Style); 5980 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5981 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5982 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5983 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5986 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5987 Style); 5988 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 5990 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5991 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5992 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5993 Style); 5994 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5995 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5996 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5997 Style); 5998 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6002 Style); 6003 verifyFormat( 6004 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6005 " aaaaaaaaaaaaaaa :\n" 6006 " aaaaaaaaaaaaaaa;", 6007 Style); 6008 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6009 " aaaaaaaaa ?\n" 6010 " b :\n" 6011 " c);", 6012 Style); 6013 verifyFormat("unsigned Indent =\n" 6014 " format(TheLine.First,\n" 6015 " IndentForLevel[TheLine.Level] >= 0 ?\n" 6016 " IndentForLevel[TheLine.Level] :\n" 6017 " TheLine * 2,\n" 6018 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6019 Style); 6020 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6021 " aaaaaaaaaaaaaaa :\n" 6022 " bbbbbbbbbbbbbbb ? //\n" 6023 " ccccccccccccccc :\n" 6024 " ddddddddddddddd;", 6025 Style); 6026 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6027 " aaaaaaaaaaaaaaa :\n" 6028 " (bbbbbbbbbbbbbbb ? //\n" 6029 " ccccccccccccccc :\n" 6030 " ddddddddddddddd);", 6031 Style); 6032 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6033 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 6034 " ccccccccccccccccccccccccccc;", 6035 Style); 6036 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6037 " aaaaa :\n" 6038 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 6039 Style); 6040 } 6041 6042 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 6043 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 6044 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 6045 verifyFormat("bool a = true, b = false;"); 6046 6047 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 6049 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 6050 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 6051 verifyFormat( 6052 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 6053 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 6054 " d = e && f;"); 6055 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 6056 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 6057 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6058 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 6059 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 6060 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 6061 6062 FormatStyle Style = getGoogleStyle(); 6063 Style.PointerAlignment = FormatStyle::PAS_Left; 6064 Style.DerivePointerAlignment = false; 6065 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6066 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 6067 " *b = bbbbbbbbbbbbbbbbbbb;", 6068 Style); 6069 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6070 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 6071 Style); 6072 verifyFormat("vector<int*> a, b;", Style); 6073 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 6074 } 6075 6076 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6077 verifyFormat("arr[foo ? bar : baz];"); 6078 verifyFormat("f()[foo ? bar : baz];"); 6079 verifyFormat("(a + b)[foo ? bar : baz];"); 6080 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6081 } 6082 6083 TEST_F(FormatTest, AlignsStringLiterals) { 6084 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6085 " \"short literal\");"); 6086 verifyFormat( 6087 "looooooooooooooooooooooooongFunction(\n" 6088 " \"short literal\"\n" 6089 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6090 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6091 " \" string literals\",\n" 6092 " and, other, parameters);"); 6093 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6094 " \"5678\";", 6095 format("fun + \"1243\" /* comment */\n" 6096 " \"5678\";", 6097 getLLVMStyleWithColumns(28))); 6098 EXPECT_EQ( 6099 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6100 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6101 " \"aaaaaaaaaaaaaaaa\";", 6102 format("aaaaaa =" 6103 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6104 "aaaaaaaaaaaaaaaaaaaaa\" " 6105 "\"aaaaaaaaaaaaaaaa\";")); 6106 verifyFormat("a = a + \"a\"\n" 6107 " \"a\"\n" 6108 " \"a\";"); 6109 verifyFormat("f(\"a\", \"b\"\n" 6110 " \"c\");"); 6111 6112 verifyFormat( 6113 "#define LL_FORMAT \"ll\"\n" 6114 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6115 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6116 6117 verifyFormat("#define A(X) \\\n" 6118 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6119 " \"ccccc\"", 6120 getLLVMStyleWithColumns(23)); 6121 verifyFormat("#define A \"def\"\n" 6122 "f(\"abc\" A \"ghi\"\n" 6123 " \"jkl\");"); 6124 6125 verifyFormat("f(L\"a\"\n" 6126 " L\"b\");"); 6127 verifyFormat("#define A(X) \\\n" 6128 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6129 " L\"ccccc\"", 6130 getLLVMStyleWithColumns(25)); 6131 6132 verifyFormat("f(@\"a\"\n" 6133 " @\"b\");"); 6134 verifyFormat("NSString s = @\"a\"\n" 6135 " @\"b\"\n" 6136 " @\"c\";"); 6137 verifyFormat("NSString s = @\"a\"\n" 6138 " \"b\"\n" 6139 " \"c\";"); 6140 } 6141 6142 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6143 FormatStyle Style = getLLVMStyle(); 6144 // No declarations or definitions should be moved to own line. 6145 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6146 verifyFormat("class A {\n" 6147 " int f() { return 1; }\n" 6148 " int g();\n" 6149 "};\n" 6150 "int f() { return 1; }\n" 6151 "int g();\n", 6152 Style); 6153 6154 // All declarations and definitions should have the return type moved to its 6155 // own 6156 // line. 6157 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6158 verifyFormat("class E {\n" 6159 " int\n" 6160 " f() {\n" 6161 " return 1;\n" 6162 " }\n" 6163 " int\n" 6164 " g();\n" 6165 "};\n" 6166 "int\n" 6167 "f() {\n" 6168 " return 1;\n" 6169 "}\n" 6170 "int\n" 6171 "g();\n", 6172 Style); 6173 6174 // Top-level definitions, and no kinds of declarations should have the 6175 // return type moved to its own line. 6176 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6177 verifyFormat("class B {\n" 6178 " int f() { return 1; }\n" 6179 " int g();\n" 6180 "};\n" 6181 "int\n" 6182 "f() {\n" 6183 " return 1;\n" 6184 "}\n" 6185 "int g();\n", 6186 Style); 6187 6188 // Top-level definitions and declarations should have the return type moved 6189 // to its own line. 6190 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6191 verifyFormat("class C {\n" 6192 " int f() { return 1; }\n" 6193 " int g();\n" 6194 "};\n" 6195 "int\n" 6196 "f() {\n" 6197 " return 1;\n" 6198 "}\n" 6199 "int\n" 6200 "g();\n", 6201 Style); 6202 6203 // All definitions should have the return type moved to its own line, but no 6204 // kinds of declarations. 6205 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6206 verifyFormat("class D {\n" 6207 " int\n" 6208 " f() {\n" 6209 " return 1;\n" 6210 " }\n" 6211 " int g();\n" 6212 "};\n" 6213 "int\n" 6214 "f() {\n" 6215 " return 1;\n" 6216 "}\n" 6217 "int g();\n", 6218 Style); 6219 verifyFormat("const char *\n" 6220 "f(void) {\n" // Break here. 6221 " return \"\";\n" 6222 "}\n" 6223 "const char *bar(void);\n", // No break here. 6224 Style); 6225 verifyFormat("template <class T>\n" 6226 "T *\n" 6227 "f(T &c) {\n" // Break here. 6228 " return NULL;\n" 6229 "}\n" 6230 "template <class T> T *f(T &c);\n", // No break here. 6231 Style); 6232 verifyFormat("class C {\n" 6233 " int\n" 6234 " operator+() {\n" 6235 " return 1;\n" 6236 " }\n" 6237 " int\n" 6238 " operator()() {\n" 6239 " return 1;\n" 6240 " }\n" 6241 "};\n", 6242 Style); 6243 verifyFormat("void\n" 6244 "A::operator()() {}\n" 6245 "void\n" 6246 "A::operator>>() {}\n" 6247 "void\n" 6248 "A::operator+() {}\n" 6249 "void\n" 6250 "A::operator*() {}\n" 6251 "void\n" 6252 "A::operator->() {}\n" 6253 "void\n" 6254 "A::operator void *() {}\n" 6255 "void\n" 6256 "A::operator void &() {}\n" 6257 "void\n" 6258 "A::operator void &&() {}\n" 6259 "void\n" 6260 "A::operator char *() {}\n" 6261 "void\n" 6262 "A::operator[]() {}\n" 6263 "void\n" 6264 "A::operator!() {}\n", 6265 Style); 6266 verifyFormat("constexpr auto\n" 6267 "operator()() const -> reference {}\n" 6268 "constexpr auto\n" 6269 "operator>>() const -> reference {}\n" 6270 "constexpr auto\n" 6271 "operator+() const -> reference {}\n" 6272 "constexpr auto\n" 6273 "operator*() const -> reference {}\n" 6274 "constexpr auto\n" 6275 "operator->() const -> reference {}\n" 6276 "constexpr auto\n" 6277 "operator++() const -> reference {}\n" 6278 "constexpr auto\n" 6279 "operator void *() const -> reference {}\n" 6280 "constexpr auto\n" 6281 "operator void &() const -> reference {}\n" 6282 "constexpr auto\n" 6283 "operator void &&() const -> reference {}\n" 6284 "constexpr auto\n" 6285 "operator char *() const -> reference {}\n" 6286 "constexpr auto\n" 6287 "operator!() const -> reference {}\n" 6288 "constexpr auto\n" 6289 "operator[]() const -> reference {}\n", 6290 Style); 6291 verifyFormat("void *operator new(std::size_t s);", // No break here. 6292 Style); 6293 verifyFormat("void *\n" 6294 "operator new(std::size_t s) {}", 6295 Style); 6296 verifyFormat("void *\n" 6297 "operator delete[](void *ptr) {}", 6298 Style); 6299 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6300 verifyFormat("const char *\n" 6301 "f(void)\n" // Break here. 6302 "{\n" 6303 " return \"\";\n" 6304 "}\n" 6305 "const char *bar(void);\n", // No break here. 6306 Style); 6307 verifyFormat("template <class T>\n" 6308 "T *\n" // Problem here: no line break 6309 "f(T &c)\n" // Break here. 6310 "{\n" 6311 " return NULL;\n" 6312 "}\n" 6313 "template <class T> T *f(T &c);\n", // No break here. 6314 Style); 6315 verifyFormat("int\n" 6316 "foo(A<bool> a)\n" 6317 "{\n" 6318 " return a;\n" 6319 "}\n", 6320 Style); 6321 verifyFormat("int\n" 6322 "foo(A<8> a)\n" 6323 "{\n" 6324 " return a;\n" 6325 "}\n", 6326 Style); 6327 verifyFormat("int\n" 6328 "foo(A<B<bool>, 8> a)\n" 6329 "{\n" 6330 " return a;\n" 6331 "}\n", 6332 Style); 6333 verifyFormat("int\n" 6334 "foo(A<B<8>, bool> a)\n" 6335 "{\n" 6336 " return a;\n" 6337 "}\n", 6338 Style); 6339 verifyFormat("int\n" 6340 "foo(A<B<bool>, bool> a)\n" 6341 "{\n" 6342 " return a;\n" 6343 "}\n", 6344 Style); 6345 verifyFormat("int\n" 6346 "foo(A<B<8>, 8> a)\n" 6347 "{\n" 6348 " return a;\n" 6349 "}\n", 6350 Style); 6351 6352 Style = getGNUStyle(); 6353 6354 // Test for comments at the end of function declarations. 6355 verifyFormat("void\n" 6356 "foo (int a, /*abc*/ int b) // def\n" 6357 "{\n" 6358 "}\n", 6359 Style); 6360 6361 verifyFormat("void\n" 6362 "foo (int a, /* abc */ int b) /* def */\n" 6363 "{\n" 6364 "}\n", 6365 Style); 6366 6367 // Definitions that should not break after return type 6368 verifyFormat("void foo (int a, int b); // def\n", Style); 6369 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6370 verifyFormat("void foo (int a, int b);\n", Style); 6371 } 6372 6373 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6374 FormatStyle NoBreak = getLLVMStyle(); 6375 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6376 FormatStyle Break = getLLVMStyle(); 6377 Break.AlwaysBreakBeforeMultilineStrings = true; 6378 verifyFormat("aaaa = \"bbbb\"\n" 6379 " \"cccc\";", 6380 NoBreak); 6381 verifyFormat("aaaa =\n" 6382 " \"bbbb\"\n" 6383 " \"cccc\";", 6384 Break); 6385 verifyFormat("aaaa(\"bbbb\"\n" 6386 " \"cccc\");", 6387 NoBreak); 6388 verifyFormat("aaaa(\n" 6389 " \"bbbb\"\n" 6390 " \"cccc\");", 6391 Break); 6392 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6393 " \"cccc\");", 6394 NoBreak); 6395 verifyFormat("aaaa(qqq,\n" 6396 " \"bbbb\"\n" 6397 " \"cccc\");", 6398 Break); 6399 verifyFormat("aaaa(qqq,\n" 6400 " L\"bbbb\"\n" 6401 " L\"cccc\");", 6402 Break); 6403 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6404 " \"bbbb\"));", 6405 Break); 6406 verifyFormat("string s = someFunction(\n" 6407 " \"abc\"\n" 6408 " \"abc\");", 6409 Break); 6410 6411 // As we break before unary operators, breaking right after them is bad. 6412 verifyFormat("string foo = abc ? \"x\"\n" 6413 " \"blah blah blah blah blah blah\"\n" 6414 " : \"y\";", 6415 Break); 6416 6417 // Don't break if there is no column gain. 6418 verifyFormat("f(\"aaaa\"\n" 6419 " \"bbbb\");", 6420 Break); 6421 6422 // Treat literals with escaped newlines like multi-line string literals. 6423 EXPECT_EQ("x = \"a\\\n" 6424 "b\\\n" 6425 "c\";", 6426 format("x = \"a\\\n" 6427 "b\\\n" 6428 "c\";", 6429 NoBreak)); 6430 EXPECT_EQ("xxxx =\n" 6431 " \"a\\\n" 6432 "b\\\n" 6433 "c\";", 6434 format("xxxx = \"a\\\n" 6435 "b\\\n" 6436 "c\";", 6437 Break)); 6438 6439 EXPECT_EQ("NSString *const kString =\n" 6440 " @\"aaaa\"\n" 6441 " @\"bbbb\";", 6442 format("NSString *const kString = @\"aaaa\"\n" 6443 "@\"bbbb\";", 6444 Break)); 6445 6446 Break.ColumnLimit = 0; 6447 verifyFormat("const char *hello = \"hello llvm\";", Break); 6448 } 6449 6450 TEST_F(FormatTest, AlignsPipes) { 6451 verifyFormat( 6452 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6453 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6454 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6455 verifyFormat( 6456 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6457 " << aaaaaaaaaaaaaaaaaaaa;"); 6458 verifyFormat( 6459 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6460 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6461 verifyFormat( 6462 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6463 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6464 verifyFormat( 6465 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6466 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6467 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6468 verifyFormat( 6469 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6470 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6471 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6472 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6474 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6475 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6476 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6477 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6478 verifyFormat( 6479 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6481 verifyFormat( 6482 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6483 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6484 6485 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6486 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6487 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6488 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6489 " aaaaaaaaaaaaaaaaaaaaa)\n" 6490 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6491 verifyFormat("LOG_IF(aaa == //\n" 6492 " bbb)\n" 6493 " << a << b;"); 6494 6495 // But sometimes, breaking before the first "<<" is desirable. 6496 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6497 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6498 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6499 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6500 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6501 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6502 " << BEF << IsTemplate << Description << E->getType();"); 6503 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6504 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6506 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6507 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6509 " << aaa;"); 6510 6511 verifyFormat( 6512 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6513 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6514 6515 // Incomplete string literal. 6516 EXPECT_EQ("llvm::errs() << \"\n" 6517 " << a;", 6518 format("llvm::errs() << \"\n<<a;")); 6519 6520 verifyFormat("void f() {\n" 6521 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6522 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6523 "}"); 6524 6525 // Handle 'endl'. 6526 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6527 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6528 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6529 6530 // Handle '\n'. 6531 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6532 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6533 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6534 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6535 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6536 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6537 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6538 } 6539 6540 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6541 verifyFormat("return out << \"somepacket = {\\n\"\n" 6542 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6543 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6544 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6545 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6546 " << \"}\";"); 6547 6548 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6549 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6550 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6551 verifyFormat( 6552 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6553 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6554 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6555 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6556 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6557 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6558 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6559 verifyFormat( 6560 "void f() {\n" 6561 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6562 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6563 "}"); 6564 6565 // Breaking before the first "<<" is generally not desirable. 6566 verifyFormat( 6567 "llvm::errs()\n" 6568 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6569 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6570 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6571 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6572 getLLVMStyleWithColumns(70)); 6573 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6574 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6575 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6576 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6577 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6578 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6579 getLLVMStyleWithColumns(70)); 6580 6581 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6582 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6583 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6584 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6585 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6586 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6587 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6588 " (aaaa + aaaa);", 6589 getLLVMStyleWithColumns(40)); 6590 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6591 " (aaaaaaa + aaaaa));", 6592 getLLVMStyleWithColumns(40)); 6593 verifyFormat( 6594 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6595 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6596 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6597 } 6598 6599 TEST_F(FormatTest, UnderstandsEquals) { 6600 verifyFormat( 6601 "aaaaaaaaaaaaaaaaa =\n" 6602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6603 verifyFormat( 6604 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6606 verifyFormat( 6607 "if (a) {\n" 6608 " f();\n" 6609 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6610 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6611 "}"); 6612 6613 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6614 " 100000000 + 10000000) {\n}"); 6615 } 6616 6617 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6618 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6619 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6620 6621 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6622 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6623 6624 verifyFormat( 6625 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6626 " Parameter2);"); 6627 6628 verifyFormat( 6629 "ShortObject->shortFunction(\n" 6630 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6631 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6632 6633 verifyFormat("loooooooooooooongFunction(\n" 6634 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6635 6636 verifyFormat( 6637 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6638 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6639 6640 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6641 " .WillRepeatedly(Return(SomeValue));"); 6642 verifyFormat("void f() {\n" 6643 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6644 " .Times(2)\n" 6645 " .WillRepeatedly(Return(SomeValue));\n" 6646 "}"); 6647 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6648 " ccccccccccccccccccccccc);"); 6649 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6650 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6651 " .aaaaa(aaaaa),\n" 6652 " aaaaaaaaaaaaaaaaaaaaa);"); 6653 verifyFormat("void f() {\n" 6654 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6655 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6656 "}"); 6657 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6659 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6660 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6661 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6662 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6663 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6664 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6665 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6666 "}"); 6667 6668 // Here, it is not necessary to wrap at "." or "->". 6669 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6670 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6671 verifyFormat( 6672 "aaaaaaaaaaa->aaaaaaaaa(\n" 6673 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6674 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6675 6676 verifyFormat( 6677 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6678 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6679 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6680 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6681 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6682 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6683 6684 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6686 " .a();"); 6687 6688 FormatStyle NoBinPacking = getLLVMStyle(); 6689 NoBinPacking.BinPackParameters = false; 6690 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6691 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6692 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6693 " aaaaaaaaaaaaaaaaaaa,\n" 6694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6695 NoBinPacking); 6696 6697 // If there is a subsequent call, change to hanging indentation. 6698 verifyFormat( 6699 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6700 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6701 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6702 verifyFormat( 6703 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6704 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6705 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6706 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6707 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6708 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6710 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6711 } 6712 6713 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6714 verifyFormat("template <typename T>\n" 6715 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6716 verifyFormat("template <typename T>\n" 6717 "// T should be one of {A, B}.\n" 6718 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6719 verifyFormat( 6720 "template <typename T>\n" 6721 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6722 verifyFormat("template <typename T>\n" 6723 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6724 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6725 verifyFormat( 6726 "template <typename T>\n" 6727 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6728 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6729 verifyFormat( 6730 "template <typename T>\n" 6731 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6732 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6734 verifyFormat("template <typename T>\n" 6735 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6736 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6737 verifyFormat( 6738 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6739 " typename T4 = char>\n" 6740 "void f();"); 6741 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6742 " template <typename> class cccccccccccccccccccccc,\n" 6743 " typename ddddddddddddd>\n" 6744 "class C {};"); 6745 verifyFormat( 6746 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6747 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6748 6749 verifyFormat("void f() {\n" 6750 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6751 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6752 "}"); 6753 6754 verifyFormat("template <typename T> class C {};"); 6755 verifyFormat("template <typename T> void f();"); 6756 verifyFormat("template <typename T> void f() {}"); 6757 verifyFormat( 6758 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6759 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6761 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6762 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6764 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6765 getLLVMStyleWithColumns(72)); 6766 EXPECT_EQ("static_cast<A< //\n" 6767 " B> *>(\n" 6768 "\n" 6769 ");", 6770 format("static_cast<A<//\n" 6771 " B>*>(\n" 6772 "\n" 6773 " );")); 6774 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6775 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6776 6777 FormatStyle AlwaysBreak = getLLVMStyle(); 6778 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6779 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6780 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6781 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6782 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6783 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6784 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6785 verifyFormat("template <template <typename> class Fooooooo,\n" 6786 " template <typename> class Baaaaaaar>\n" 6787 "struct C {};", 6788 AlwaysBreak); 6789 verifyFormat("template <typename T> // T can be A, B or C.\n" 6790 "struct C {};", 6791 AlwaysBreak); 6792 verifyFormat("template <enum E> class A {\n" 6793 "public:\n" 6794 " E *f();\n" 6795 "};"); 6796 6797 FormatStyle NeverBreak = getLLVMStyle(); 6798 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6799 verifyFormat("template <typename T> class C {};", NeverBreak); 6800 verifyFormat("template <typename T> void f();", NeverBreak); 6801 verifyFormat("template <typename T> void f() {}", NeverBreak); 6802 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6803 "bbbbbbbbbbbbbbbbbbbb) {}", 6804 NeverBreak); 6805 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6806 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6807 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6808 NeverBreak); 6809 verifyFormat("template <template <typename> class Fooooooo,\n" 6810 " template <typename> class Baaaaaaar>\n" 6811 "struct C {};", 6812 NeverBreak); 6813 verifyFormat("template <typename T> // T can be A, B or C.\n" 6814 "struct C {};", 6815 NeverBreak); 6816 verifyFormat("template <enum E> class A {\n" 6817 "public:\n" 6818 " E *f();\n" 6819 "};", 6820 NeverBreak); 6821 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6822 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6823 "bbbbbbbbbbbbbbbbbbbb) {}", 6824 NeverBreak); 6825 } 6826 6827 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6828 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6829 Style.ColumnLimit = 60; 6830 EXPECT_EQ("// Baseline - no comments.\n" 6831 "template <\n" 6832 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6833 "void f() {}", 6834 format("// Baseline - no comments.\n" 6835 "template <\n" 6836 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6837 "void f() {}", 6838 Style)); 6839 6840 EXPECT_EQ("template <\n" 6841 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6842 "void f() {}", 6843 format("template <\n" 6844 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6845 "void f() {}", 6846 Style)); 6847 6848 EXPECT_EQ( 6849 "template <\n" 6850 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6851 "void f() {}", 6852 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6853 "void f() {}", 6854 Style)); 6855 6856 EXPECT_EQ( 6857 "template <\n" 6858 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6859 " // multiline\n" 6860 "void f() {}", 6861 format("template <\n" 6862 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6863 " // multiline\n" 6864 "void f() {}", 6865 Style)); 6866 6867 EXPECT_EQ( 6868 "template <typename aaaaaaaaaa<\n" 6869 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6870 "void f() {}", 6871 format( 6872 "template <\n" 6873 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6874 "void f() {}", 6875 Style)); 6876 } 6877 6878 TEST_F(FormatTest, WrapsTemplateParameters) { 6879 FormatStyle Style = getLLVMStyle(); 6880 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6881 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6882 verifyFormat( 6883 "template <typename... a> struct q {};\n" 6884 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6885 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6886 " y;", 6887 Style); 6888 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6889 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6890 verifyFormat( 6891 "template <typename... a> struct r {};\n" 6892 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6893 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6894 " y;", 6895 Style); 6896 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6897 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6898 verifyFormat("template <typename... a> struct s {};\n" 6899 "extern s<\n" 6900 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6901 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6902 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6903 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6904 " y;", 6905 Style); 6906 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6907 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6908 verifyFormat("template <typename... a> struct t {};\n" 6909 "extern t<\n" 6910 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6911 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6912 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6913 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6914 " y;", 6915 Style); 6916 } 6917 6918 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6919 verifyFormat( 6920 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6921 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6922 verifyFormat( 6923 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6924 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6925 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6926 6927 // FIXME: Should we have the extra indent after the second break? 6928 verifyFormat( 6929 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6931 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6932 6933 verifyFormat( 6934 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6935 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6936 6937 // Breaking at nested name specifiers is generally not desirable. 6938 verifyFormat( 6939 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6940 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6941 6942 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 6943 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6945 " aaaaaaaaaaaaaaaaaaaaa);", 6946 getLLVMStyleWithColumns(74)); 6947 6948 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6950 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6951 } 6952 6953 TEST_F(FormatTest, UnderstandsTemplateParameters) { 6954 verifyFormat("A<int> a;"); 6955 verifyFormat("A<A<A<int>>> a;"); 6956 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 6957 verifyFormat("bool x = a < 1 || 2 > a;"); 6958 verifyFormat("bool x = 5 < f<int>();"); 6959 verifyFormat("bool x = f<int>() > 5;"); 6960 verifyFormat("bool x = 5 < a<int>::x;"); 6961 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 6962 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 6963 6964 verifyGoogleFormat("A<A<int>> a;"); 6965 verifyGoogleFormat("A<A<A<int>>> a;"); 6966 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 6967 verifyGoogleFormat("A<A<int> > a;"); 6968 verifyGoogleFormat("A<A<A<int> > > a;"); 6969 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 6970 verifyGoogleFormat("A<::A<int>> a;"); 6971 verifyGoogleFormat("A<::A> a;"); 6972 verifyGoogleFormat("A< ::A> a;"); 6973 verifyGoogleFormat("A< ::A<int> > a;"); 6974 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 6975 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 6976 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 6977 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 6978 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 6979 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 6980 6981 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 6982 6983 // template closer followed by a token that starts with > or = 6984 verifyFormat("bool b = a<1> > 1;"); 6985 verifyFormat("bool b = a<1> >= 1;"); 6986 verifyFormat("int i = a<1> >> 1;"); 6987 FormatStyle Style = getLLVMStyle(); 6988 Style.SpaceBeforeAssignmentOperators = false; 6989 verifyFormat("bool b= a<1> == 1;", Style); 6990 verifyFormat("a<int> = 1;", Style); 6991 verifyFormat("a<int> >>= 1;", Style); 6992 6993 verifyFormat("test >> a >> b;"); 6994 verifyFormat("test << a >> b;"); 6995 6996 verifyFormat("f<int>();"); 6997 verifyFormat("template <typename T> void f() {}"); 6998 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 6999 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 7000 "sizeof(char)>::type>;"); 7001 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 7002 verifyFormat("f(a.operator()<A>());"); 7003 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7004 " .template operator()<A>());", 7005 getLLVMStyleWithColumns(35)); 7006 7007 // Not template parameters. 7008 verifyFormat("return a < b && c > d;"); 7009 verifyFormat("void f() {\n" 7010 " while (a < b && c > d) {\n" 7011 " }\n" 7012 "}"); 7013 verifyFormat("template <typename... Types>\n" 7014 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 7015 7016 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7017 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 7018 getLLVMStyleWithColumns(60)); 7019 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 7020 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 7021 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 7022 } 7023 7024 TEST_F(FormatTest, BitshiftOperatorWidth) { 7025 EXPECT_EQ("int a = 1 << 2; /* foo\n" 7026 " bar */", 7027 format("int a=1<<2; /* foo\n" 7028 " bar */")); 7029 7030 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 7031 " bar */", 7032 format("int b =256>>1 ; /* foo\n" 7033 " bar */")); 7034 } 7035 7036 TEST_F(FormatTest, UnderstandsBinaryOperators) { 7037 verifyFormat("COMPARE(a, ==, b);"); 7038 verifyFormat("auto s = sizeof...(Ts) - 1;"); 7039 } 7040 7041 TEST_F(FormatTest, UnderstandsPointersToMembers) { 7042 verifyFormat("int A::*x;"); 7043 verifyFormat("int (S::*func)(void *);"); 7044 verifyFormat("void f() { int (S::*func)(void *); }"); 7045 verifyFormat("typedef bool *(Class::*Member)() const;"); 7046 verifyFormat("void f() {\n" 7047 " (a->*f)();\n" 7048 " a->*x;\n" 7049 " (a.*f)();\n" 7050 " ((*a).*f)();\n" 7051 " a.*x;\n" 7052 "}"); 7053 verifyFormat("void f() {\n" 7054 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7055 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 7056 "}"); 7057 verifyFormat( 7058 "(aaaaaaaaaa->*bbbbbbb)(\n" 7059 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7060 FormatStyle Style = getLLVMStyle(); 7061 Style.PointerAlignment = FormatStyle::PAS_Left; 7062 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 7063 } 7064 7065 TEST_F(FormatTest, UnderstandsUnaryOperators) { 7066 verifyFormat("int a = -2;"); 7067 verifyFormat("f(-1, -2, -3);"); 7068 verifyFormat("a[-1] = 5;"); 7069 verifyFormat("int a = 5 + -2;"); 7070 verifyFormat("if (i == -1) {\n}"); 7071 verifyFormat("if (i != -1) {\n}"); 7072 verifyFormat("if (i > -1) {\n}"); 7073 verifyFormat("if (i < -1) {\n}"); 7074 verifyFormat("++(a->f());"); 7075 verifyFormat("--(a->f());"); 7076 verifyFormat("(a->f())++;"); 7077 verifyFormat("a[42]++;"); 7078 verifyFormat("if (!(a->f())) {\n}"); 7079 verifyFormat("if (!+i) {\n}"); 7080 verifyFormat("~&a;"); 7081 7082 verifyFormat("a-- > b;"); 7083 verifyFormat("b ? -a : c;"); 7084 verifyFormat("n * sizeof char16;"); 7085 verifyFormat("n * alignof char16;", getGoogleStyle()); 7086 verifyFormat("sizeof(char);"); 7087 verifyFormat("alignof(char);", getGoogleStyle()); 7088 7089 verifyFormat("return -1;"); 7090 verifyFormat("throw -1;"); 7091 verifyFormat("switch (a) {\n" 7092 "case -1:\n" 7093 " break;\n" 7094 "}"); 7095 verifyFormat("#define X -1"); 7096 verifyFormat("#define X -kConstant"); 7097 7098 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7099 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7100 7101 verifyFormat("int a = /* confusing comment */ -1;"); 7102 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7103 verifyFormat("int a = i /* confusing comment */++;"); 7104 7105 verifyFormat("co_yield -1;"); 7106 verifyFormat("co_return -1;"); 7107 } 7108 7109 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7110 verifyFormat("if (!aaaaaaaaaa( // break\n" 7111 " aaaaa)) {\n" 7112 "}"); 7113 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7114 " aaaaa));"); 7115 verifyFormat("*aaa = aaaaaaa( // break\n" 7116 " bbbbbb);"); 7117 } 7118 7119 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7120 verifyFormat("bool operator<();"); 7121 verifyFormat("bool operator>();"); 7122 verifyFormat("bool operator=();"); 7123 verifyFormat("bool operator==();"); 7124 verifyFormat("bool operator!=();"); 7125 verifyFormat("int operator+();"); 7126 verifyFormat("int operator++();"); 7127 verifyFormat("int operator++(int) volatile noexcept;"); 7128 verifyFormat("bool operator,();"); 7129 verifyFormat("bool operator();"); 7130 verifyFormat("bool operator()();"); 7131 verifyFormat("bool operator[]();"); 7132 verifyFormat("operator bool();"); 7133 verifyFormat("operator int();"); 7134 verifyFormat("operator void *();"); 7135 verifyFormat("operator SomeType<int>();"); 7136 verifyFormat("operator SomeType<int, int>();"); 7137 verifyFormat("operator SomeType<SomeType<int>>();"); 7138 verifyFormat("void *operator new(std::size_t size);"); 7139 verifyFormat("void *operator new[](std::size_t size);"); 7140 verifyFormat("void operator delete(void *ptr);"); 7141 verifyFormat("void operator delete[](void *ptr);"); 7142 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7143 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7144 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7145 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7146 7147 verifyFormat( 7148 "ostream &operator<<(ostream &OutputStream,\n" 7149 " SomeReallyLongType WithSomeReallyLongValue);"); 7150 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7151 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7152 " return left.group < right.group;\n" 7153 "}"); 7154 verifyFormat("SomeType &operator=(const SomeType &S);"); 7155 verifyFormat("f.template operator()<int>();"); 7156 7157 verifyGoogleFormat("operator void*();"); 7158 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7159 verifyGoogleFormat("operator ::A();"); 7160 7161 verifyFormat("using A::operator+;"); 7162 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7163 "int i;"); 7164 } 7165 7166 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7167 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7168 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7169 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7170 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7171 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7172 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7173 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7174 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7175 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7176 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7177 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7178 verifyFormat("void Fn(T const &) const &;"); 7179 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7180 verifyFormat("template <typename T>\n" 7181 "void F(T) && = delete;", 7182 getGoogleStyle()); 7183 7184 FormatStyle AlignLeft = getLLVMStyle(); 7185 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7186 verifyFormat("void A::b() && {}", AlignLeft); 7187 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7188 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7189 AlignLeft); 7190 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7191 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7192 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7193 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7194 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7195 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7196 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7197 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7198 7199 FormatStyle Spaces = getLLVMStyle(); 7200 Spaces.SpacesInCStyleCastParentheses = true; 7201 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7202 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7203 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7204 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7205 7206 Spaces.SpacesInCStyleCastParentheses = false; 7207 Spaces.SpacesInParentheses = true; 7208 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7209 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7210 Spaces); 7211 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7212 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7213 7214 FormatStyle BreakTemplate = getLLVMStyle(); 7215 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7216 7217 verifyFormat("struct f {\n" 7218 " template <class T>\n" 7219 " int &foo(const std::string &str) &noexcept {}\n" 7220 "};", 7221 BreakTemplate); 7222 7223 verifyFormat("struct f {\n" 7224 " template <class T>\n" 7225 " int &foo(const std::string &str) &&noexcept {}\n" 7226 "};", 7227 BreakTemplate); 7228 7229 verifyFormat("struct f {\n" 7230 " template <class T>\n" 7231 " int &foo(const std::string &str) const &noexcept {}\n" 7232 "};", 7233 BreakTemplate); 7234 7235 verifyFormat("struct f {\n" 7236 " template <class T>\n" 7237 " int &foo(const std::string &str) const &noexcept {}\n" 7238 "};", 7239 BreakTemplate); 7240 7241 verifyFormat("struct f {\n" 7242 " template <class T>\n" 7243 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7244 "};", 7245 BreakTemplate); 7246 7247 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7248 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7249 FormatStyle::BTDS_Yes; 7250 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7251 7252 verifyFormat("struct f {\n" 7253 " template <class T>\n" 7254 " int& foo(const std::string& str) & noexcept {}\n" 7255 "};", 7256 AlignLeftBreakTemplate); 7257 7258 verifyFormat("struct f {\n" 7259 " template <class T>\n" 7260 " int& foo(const std::string& str) && noexcept {}\n" 7261 "};", 7262 AlignLeftBreakTemplate); 7263 7264 verifyFormat("struct f {\n" 7265 " template <class T>\n" 7266 " int& foo(const std::string& str) const& noexcept {}\n" 7267 "};", 7268 AlignLeftBreakTemplate); 7269 7270 verifyFormat("struct f {\n" 7271 " template <class T>\n" 7272 " int& foo(const std::string& str) const&& noexcept {}\n" 7273 "};", 7274 AlignLeftBreakTemplate); 7275 7276 verifyFormat("struct f {\n" 7277 " template <class T>\n" 7278 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7279 "};", 7280 AlignLeftBreakTemplate); 7281 7282 // The `&` in `Type&` should not be confused with a trailing `&` of 7283 // DEPRECATED(reason) member function. 7284 verifyFormat("struct f {\n" 7285 " template <class T>\n" 7286 " DEPRECATED(reason)\n" 7287 " Type &foo(arguments) {}\n" 7288 "};", 7289 BreakTemplate); 7290 7291 verifyFormat("struct f {\n" 7292 " template <class T>\n" 7293 " DEPRECATED(reason)\n" 7294 " Type& foo(arguments) {}\n" 7295 "};", 7296 AlignLeftBreakTemplate); 7297 7298 verifyFormat("void (*foopt)(int) = &func;"); 7299 } 7300 7301 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7302 verifyFormat("void f() {\n" 7303 " A *a = new A;\n" 7304 " A *a = new (placement) A;\n" 7305 " delete a;\n" 7306 " delete (A *)a;\n" 7307 "}"); 7308 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7309 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7310 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7311 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7312 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7313 verifyFormat("delete[] h->p;"); 7314 } 7315 7316 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7317 verifyFormat("int *f(int *a) {}"); 7318 verifyFormat("int main(int argc, char **argv) {}"); 7319 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7320 verifyIndependentOfContext("f(a, *a);"); 7321 verifyFormat("void g() { f(*a); }"); 7322 verifyIndependentOfContext("int a = b * 10;"); 7323 verifyIndependentOfContext("int a = 10 * b;"); 7324 verifyIndependentOfContext("int a = b * c;"); 7325 verifyIndependentOfContext("int a += b * c;"); 7326 verifyIndependentOfContext("int a -= b * c;"); 7327 verifyIndependentOfContext("int a *= b * c;"); 7328 verifyIndependentOfContext("int a /= b * c;"); 7329 verifyIndependentOfContext("int a = *b;"); 7330 verifyIndependentOfContext("int a = *b * c;"); 7331 verifyIndependentOfContext("int a = b * *c;"); 7332 verifyIndependentOfContext("int a = b * (10);"); 7333 verifyIndependentOfContext("S << b * (10);"); 7334 verifyIndependentOfContext("return 10 * b;"); 7335 verifyIndependentOfContext("return *b * *c;"); 7336 verifyIndependentOfContext("return a & ~b;"); 7337 verifyIndependentOfContext("f(b ? *c : *d);"); 7338 verifyIndependentOfContext("int a = b ? *c : *d;"); 7339 verifyIndependentOfContext("*b = a;"); 7340 verifyIndependentOfContext("a * ~b;"); 7341 verifyIndependentOfContext("a * !b;"); 7342 verifyIndependentOfContext("a * +b;"); 7343 verifyIndependentOfContext("a * -b;"); 7344 verifyIndependentOfContext("a * ++b;"); 7345 verifyIndependentOfContext("a * --b;"); 7346 verifyIndependentOfContext("a[4] * b;"); 7347 verifyIndependentOfContext("a[a * a] = 1;"); 7348 verifyIndependentOfContext("f() * b;"); 7349 verifyIndependentOfContext("a * [self dostuff];"); 7350 verifyIndependentOfContext("int x = a * (a + b);"); 7351 verifyIndependentOfContext("(a *)(a + b);"); 7352 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7353 verifyIndependentOfContext("int *pa = (int *)&a;"); 7354 verifyIndependentOfContext("return sizeof(int **);"); 7355 verifyIndependentOfContext("return sizeof(int ******);"); 7356 verifyIndependentOfContext("return (int **&)a;"); 7357 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7358 verifyFormat("void f(Type (*parameter)[10]) {}"); 7359 verifyFormat("void f(Type (¶meter)[10]) {}"); 7360 verifyGoogleFormat("return sizeof(int**);"); 7361 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7362 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7363 verifyFormat("auto a = [](int **&, int ***) {};"); 7364 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7365 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7366 verifyFormat("[](const decltype(*a) &value) {}"); 7367 verifyFormat("decltype(a * b) F();"); 7368 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7369 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7370 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7371 verifyIndependentOfContext("int i{a * b};"); 7372 verifyIndependentOfContext("aaa && aaa->f();"); 7373 verifyIndependentOfContext("int x = ~*p;"); 7374 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7375 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7376 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7377 verifyFormat("void f() { f(a, c * d); }"); 7378 verifyFormat("void f() { f(new a(), c * d); }"); 7379 verifyFormat("void f(const MyOverride &override);"); 7380 verifyFormat("void f(const MyFinal &final);"); 7381 verifyIndependentOfContext("bool a = f() && override.f();"); 7382 verifyIndependentOfContext("bool a = f() && final.f();"); 7383 7384 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7385 7386 verifyIndependentOfContext("A<int *> a;"); 7387 verifyIndependentOfContext("A<int **> a;"); 7388 verifyIndependentOfContext("A<int *, int *> a;"); 7389 verifyIndependentOfContext("A<int *[]> a;"); 7390 verifyIndependentOfContext( 7391 "const char *const p = reinterpret_cast<const char *const>(q);"); 7392 verifyIndependentOfContext("A<int **, int **> a;"); 7393 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7394 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7395 verifyFormat("for (; a && b;) {\n}"); 7396 verifyFormat("bool foo = true && [] { return false; }();"); 7397 7398 verifyFormat( 7399 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7401 7402 verifyGoogleFormat("int const* a = &b;"); 7403 verifyGoogleFormat("**outparam = 1;"); 7404 verifyGoogleFormat("*outparam = a * b;"); 7405 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7406 verifyGoogleFormat("A<int*> a;"); 7407 verifyGoogleFormat("A<int**> a;"); 7408 verifyGoogleFormat("A<int*, int*> a;"); 7409 verifyGoogleFormat("A<int**, int**> a;"); 7410 verifyGoogleFormat("f(b ? *c : *d);"); 7411 verifyGoogleFormat("int a = b ? *c : *d;"); 7412 verifyGoogleFormat("Type* t = **x;"); 7413 verifyGoogleFormat("Type* t = *++*x;"); 7414 verifyGoogleFormat("*++*x;"); 7415 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7416 verifyGoogleFormat("Type* t = x++ * y;"); 7417 verifyGoogleFormat( 7418 "const char* const p = reinterpret_cast<const char* const>(q);"); 7419 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7420 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7421 verifyGoogleFormat("template <typename T>\n" 7422 "void f(int i = 0, SomeType** temps = NULL);"); 7423 7424 FormatStyle Left = getLLVMStyle(); 7425 Left.PointerAlignment = FormatStyle::PAS_Left; 7426 verifyFormat("x = *a(x) = *a(y);", Left); 7427 verifyFormat("for (;; *a = b) {\n}", Left); 7428 verifyFormat("return *this += 1;", Left); 7429 verifyFormat("throw *x;", Left); 7430 verifyFormat("delete *x;", Left); 7431 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7432 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7433 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7434 verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left); 7435 verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left); 7436 verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left); 7437 7438 verifyIndependentOfContext("a = *(x + y);"); 7439 verifyIndependentOfContext("a = &(x + y);"); 7440 verifyIndependentOfContext("*(x + y).call();"); 7441 verifyIndependentOfContext("&(x + y)->call();"); 7442 verifyFormat("void f() { &(*I).first; }"); 7443 7444 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7445 verifyFormat( 7446 "int *MyValues = {\n" 7447 " *A, // Operator detection might be confused by the '{'\n" 7448 " *BB // Operator detection might be confused by previous comment\n" 7449 "};"); 7450 7451 verifyIndependentOfContext("if (int *a = &b)"); 7452 verifyIndependentOfContext("if (int &a = *b)"); 7453 verifyIndependentOfContext("if (a & b[i])"); 7454 verifyIndependentOfContext("if constexpr (a & b[i])"); 7455 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7456 verifyIndependentOfContext("if (a * (b * c))"); 7457 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7458 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7459 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7460 verifyIndependentOfContext("if (*b[i])"); 7461 verifyIndependentOfContext("if (int *a = (&b))"); 7462 verifyIndependentOfContext("while (int *a = &b)"); 7463 verifyIndependentOfContext("while (a * (b * c))"); 7464 verifyIndependentOfContext("size = sizeof *a;"); 7465 verifyIndependentOfContext("if (a && (b = c))"); 7466 verifyFormat("void f() {\n" 7467 " for (const int &v : Values) {\n" 7468 " }\n" 7469 "}"); 7470 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7471 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7472 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7473 7474 verifyFormat("#define A (!a * b)"); 7475 verifyFormat("#define MACRO \\\n" 7476 " int *i = a * b; \\\n" 7477 " void f(a *b);", 7478 getLLVMStyleWithColumns(19)); 7479 7480 verifyIndependentOfContext("A = new SomeType *[Length];"); 7481 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7482 verifyIndependentOfContext("T **t = new T *;"); 7483 verifyIndependentOfContext("T **t = new T *();"); 7484 verifyGoogleFormat("A = new SomeType*[Length]();"); 7485 verifyGoogleFormat("A = new SomeType*[Length];"); 7486 verifyGoogleFormat("T** t = new T*;"); 7487 verifyGoogleFormat("T** t = new T*();"); 7488 7489 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7490 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7491 verifyFormat("template <bool a, bool b> " 7492 "typename t::if<x && y>::type f() {}"); 7493 verifyFormat("template <int *y> f() {}"); 7494 verifyFormat("vector<int *> v;"); 7495 verifyFormat("vector<int *const> v;"); 7496 verifyFormat("vector<int *const **const *> v;"); 7497 verifyFormat("vector<int *volatile> v;"); 7498 verifyFormat("vector<a * b> v;"); 7499 verifyFormat("foo<b && false>();"); 7500 verifyFormat("foo<b & 1>();"); 7501 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7502 verifyFormat( 7503 "template <class T, class = typename std::enable_if<\n" 7504 " std::is_integral<T>::value &&\n" 7505 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7506 "void F();", 7507 getLLVMStyleWithColumns(70)); 7508 verifyFormat("template <class T,\n" 7509 " class = typename std::enable_if<\n" 7510 " std::is_integral<T>::value &&\n" 7511 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7512 " class U>\n" 7513 "void F();", 7514 getLLVMStyleWithColumns(70)); 7515 verifyFormat( 7516 "template <class T,\n" 7517 " class = typename ::std::enable_if<\n" 7518 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7519 "void F();", 7520 getGoogleStyleWithColumns(68)); 7521 7522 verifyIndependentOfContext("MACRO(int *i);"); 7523 verifyIndependentOfContext("MACRO(auto *a);"); 7524 verifyIndependentOfContext("MACRO(const A *a);"); 7525 verifyIndependentOfContext("MACRO(A *const a);"); 7526 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7527 verifyFormat("void f() { f(float{1}, a * a); }"); 7528 // FIXME: Is there a way to make this work? 7529 // verifyIndependentOfContext("MACRO(A *a);"); 7530 7531 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7532 verifyFormat("return options != nullptr && operator==(*options);"); 7533 7534 EXPECT_EQ("#define OP(x) \\\n" 7535 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7536 " return s << a.DebugString(); \\\n" 7537 " }", 7538 format("#define OP(x) \\\n" 7539 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7540 " return s << a.DebugString(); \\\n" 7541 " }", 7542 getLLVMStyleWithColumns(50))); 7543 7544 // FIXME: We cannot handle this case yet; we might be able to figure out that 7545 // foo<x> d > v; doesn't make sense. 7546 verifyFormat("foo<a<b && c> d> v;"); 7547 7548 FormatStyle PointerMiddle = getLLVMStyle(); 7549 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7550 verifyFormat("delete *x;", PointerMiddle); 7551 verifyFormat("int * x;", PointerMiddle); 7552 verifyFormat("int *[] x;", PointerMiddle); 7553 verifyFormat("template <int * y> f() {}", PointerMiddle); 7554 verifyFormat("int * f(int * a) {}", PointerMiddle); 7555 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7556 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7557 verifyFormat("A<int *> a;", PointerMiddle); 7558 verifyFormat("A<int **> a;", PointerMiddle); 7559 verifyFormat("A<int *, int *> a;", PointerMiddle); 7560 verifyFormat("A<int *[]> a;", PointerMiddle); 7561 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7562 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7563 verifyFormat("T ** t = new T *;", PointerMiddle); 7564 7565 // Member function reference qualifiers aren't binary operators. 7566 verifyFormat("string // break\n" 7567 "operator()() & {}"); 7568 verifyFormat("string // break\n" 7569 "operator()() && {}"); 7570 verifyGoogleFormat("template <typename T>\n" 7571 "auto x() & -> int {}"); 7572 } 7573 7574 TEST_F(FormatTest, UnderstandsAttributes) { 7575 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7576 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7577 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7578 FormatStyle AfterType = getLLVMStyle(); 7579 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7580 verifyFormat("__attribute__((nodebug)) void\n" 7581 "foo() {}\n", 7582 AfterType); 7583 } 7584 7585 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7586 verifyFormat("SomeType s [[unused]] (InitValue);"); 7587 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7588 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7589 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7590 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7591 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7592 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7593 7594 // Make sure we do not mistake attributes for array subscripts. 7595 verifyFormat("int a() {}\n" 7596 "[[unused]] int b() {}\n"); 7597 verifyFormat("NSArray *arr;\n" 7598 "arr[[Foo() bar]];"); 7599 7600 // On the other hand, we still need to correctly find array subscripts. 7601 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7602 7603 // Make sure that we do not mistake Objective-C method inside array literals 7604 // as attributes, even if those method names are also keywords. 7605 verifyFormat("@[ [foo bar] ];"); 7606 verifyFormat("@[ [NSArray class] ];"); 7607 verifyFormat("@[ [foo enum] ];"); 7608 7609 // Make sure we do not parse attributes as lambda introducers. 7610 FormatStyle MultiLineFunctions = getLLVMStyle(); 7611 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7612 verifyFormat("[[unused]] int b() {\n" 7613 " return 42;\n" 7614 "}\n", 7615 MultiLineFunctions); 7616 } 7617 7618 TEST_F(FormatTest, UnderstandsEllipsis) { 7619 verifyFormat("int printf(const char *fmt, ...);"); 7620 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7621 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7622 7623 FormatStyle PointersLeft = getLLVMStyle(); 7624 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7625 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7626 } 7627 7628 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7629 EXPECT_EQ("int *a;\n" 7630 "int *a;\n" 7631 "int *a;", 7632 format("int *a;\n" 7633 "int* a;\n" 7634 "int *a;", 7635 getGoogleStyle())); 7636 EXPECT_EQ("int* a;\n" 7637 "int* a;\n" 7638 "int* a;", 7639 format("int* a;\n" 7640 "int* a;\n" 7641 "int *a;", 7642 getGoogleStyle())); 7643 EXPECT_EQ("int *a;\n" 7644 "int *a;\n" 7645 "int *a;", 7646 format("int *a;\n" 7647 "int * a;\n" 7648 "int * a;", 7649 getGoogleStyle())); 7650 EXPECT_EQ("auto x = [] {\n" 7651 " int *a;\n" 7652 " int *a;\n" 7653 " int *a;\n" 7654 "};", 7655 format("auto x=[]{int *a;\n" 7656 "int * a;\n" 7657 "int * a;};", 7658 getGoogleStyle())); 7659 } 7660 7661 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7662 verifyFormat("int f(int &&a) {}"); 7663 verifyFormat("int f(int a, char &&b) {}"); 7664 verifyFormat("void f() { int &&a = b; }"); 7665 verifyGoogleFormat("int f(int a, char&& b) {}"); 7666 verifyGoogleFormat("void f() { int&& a = b; }"); 7667 7668 verifyIndependentOfContext("A<int &&> a;"); 7669 verifyIndependentOfContext("A<int &&, int &&> a;"); 7670 verifyGoogleFormat("A<int&&> a;"); 7671 verifyGoogleFormat("A<int&&, int&&> a;"); 7672 7673 // Not rvalue references: 7674 verifyFormat("template <bool B, bool C> class A {\n" 7675 " static_assert(B && C, \"Something is wrong\");\n" 7676 "};"); 7677 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7678 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7679 verifyFormat("#define A(a, b) (a && b)"); 7680 } 7681 7682 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7683 verifyFormat("void f() {\n" 7684 " x[aaaaaaaaa -\n" 7685 " b] = 23;\n" 7686 "}", 7687 getLLVMStyleWithColumns(15)); 7688 } 7689 7690 TEST_F(FormatTest, FormatsCasts) { 7691 verifyFormat("Type *A = static_cast<Type *>(P);"); 7692 verifyFormat("Type *A = (Type *)P;"); 7693 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7694 verifyFormat("int a = (int)(2.0f);"); 7695 verifyFormat("int a = (int)2.0f;"); 7696 verifyFormat("x[(int32)y];"); 7697 verifyFormat("x = (int32)y;"); 7698 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7699 verifyFormat("int a = (int)*b;"); 7700 verifyFormat("int a = (int)2.0f;"); 7701 verifyFormat("int a = (int)~0;"); 7702 verifyFormat("int a = (int)++a;"); 7703 verifyFormat("int a = (int)sizeof(int);"); 7704 verifyFormat("int a = (int)+2;"); 7705 verifyFormat("my_int a = (my_int)2.0f;"); 7706 verifyFormat("my_int a = (my_int)sizeof(int);"); 7707 verifyFormat("return (my_int)aaa;"); 7708 verifyFormat("#define x ((int)-1)"); 7709 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7710 verifyFormat("#define p(q) ((int *)&q)"); 7711 verifyFormat("fn(a)(b) + 1;"); 7712 7713 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7714 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7715 verifyFormat("my_int a = (my_int)~0;"); 7716 verifyFormat("my_int a = (my_int)++a;"); 7717 verifyFormat("my_int a = (my_int)-2;"); 7718 verifyFormat("my_int a = (my_int)1;"); 7719 verifyFormat("my_int a = (my_int *)1;"); 7720 verifyFormat("my_int a = (const my_int)-1;"); 7721 verifyFormat("my_int a = (const my_int *)-1;"); 7722 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7723 verifyFormat("my_int a = (ns::my_int)-2;"); 7724 verifyFormat("case (my_int)ONE:"); 7725 verifyFormat("auto x = (X)this;"); 7726 // Casts in Obj-C style calls used to not be recognized as such. 7727 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 7728 7729 // FIXME: single value wrapped with paren will be treated as cast. 7730 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7731 7732 verifyFormat("{ (void)F; }"); 7733 7734 // Don't break after a cast's 7735 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7736 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7737 " bbbbbbbbbbbbbbbbbbbbbb);"); 7738 7739 // These are not casts. 7740 verifyFormat("void f(int *) {}"); 7741 verifyFormat("f(foo)->b;"); 7742 verifyFormat("f(foo).b;"); 7743 verifyFormat("f(foo)(b);"); 7744 verifyFormat("f(foo)[b];"); 7745 verifyFormat("[](foo) { return 4; }(bar);"); 7746 verifyFormat("(*funptr)(foo)[4];"); 7747 verifyFormat("funptrs[4](foo)[4];"); 7748 verifyFormat("void f(int *);"); 7749 verifyFormat("void f(int *) = 0;"); 7750 verifyFormat("void f(SmallVector<int>) {}"); 7751 verifyFormat("void f(SmallVector<int>);"); 7752 verifyFormat("void f(SmallVector<int>) = 0;"); 7753 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7754 verifyFormat("int a = sizeof(int) * b;"); 7755 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7756 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7757 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7758 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7759 7760 // These are not casts, but at some point were confused with casts. 7761 verifyFormat("virtual void foo(int *) override;"); 7762 verifyFormat("virtual void foo(char &) const;"); 7763 verifyFormat("virtual void foo(int *a, char *) const;"); 7764 verifyFormat("int a = sizeof(int *) + b;"); 7765 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7766 verifyFormat("bool b = f(g<int>) && c;"); 7767 verifyFormat("typedef void (*f)(int i) func;"); 7768 verifyFormat("void operator++(int) noexcept;"); 7769 verifyFormat("void operator++(int &) noexcept;"); 7770 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 7771 "&) noexcept;"); 7772 verifyFormat( 7773 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 7774 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 7775 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 7776 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 7777 verifyFormat("void operator delete(foo &) noexcept;"); 7778 verifyFormat("void operator delete(foo) noexcept;"); 7779 verifyFormat("void operator delete(int) noexcept;"); 7780 verifyFormat("void operator delete(int &) noexcept;"); 7781 verifyFormat("void operator delete(int &) volatile noexcept;"); 7782 verifyFormat("void operator delete(int &) const"); 7783 verifyFormat("void operator delete(int &) = default"); 7784 verifyFormat("void operator delete(int &) = delete"); 7785 verifyFormat("void operator delete(int &) [[noreturn]]"); 7786 verifyFormat("void operator delete(int &) throw();"); 7787 verifyFormat("void operator delete(int &) throw(int);"); 7788 verifyFormat("auto operator delete(int &) -> int;"); 7789 verifyFormat("auto operator delete(int &) override"); 7790 verifyFormat("auto operator delete(int &) final"); 7791 7792 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7793 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7794 // FIXME: The indentation here is not ideal. 7795 verifyFormat( 7796 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7797 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7798 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7799 } 7800 7801 TEST_F(FormatTest, FormatsFunctionTypes) { 7802 verifyFormat("A<bool()> a;"); 7803 verifyFormat("A<SomeType()> a;"); 7804 verifyFormat("A<void (*)(int, std::string)> a;"); 7805 verifyFormat("A<void *(int)>;"); 7806 verifyFormat("void *(*a)(int *, SomeType *);"); 7807 verifyFormat("int (*func)(void *);"); 7808 verifyFormat("void f() { int (*func)(void *); }"); 7809 verifyFormat("template <class CallbackClass>\n" 7810 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7811 7812 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7813 verifyGoogleFormat("void* (*a)(int);"); 7814 verifyGoogleFormat( 7815 "template <class CallbackClass>\n" 7816 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7817 7818 // Other constructs can look somewhat like function types: 7819 verifyFormat("A<sizeof(*x)> a;"); 7820 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7821 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7822 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7823 verifyFormat("int x = f(&h)();"); 7824 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7825 verifyFormat("std::function<\n" 7826 " LooooooooooongTemplatedType<\n" 7827 " SomeType>*(\n" 7828 " LooooooooooooooooongType type)>\n" 7829 " function;", 7830 getGoogleStyleWithColumns(40)); 7831 } 7832 7833 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7834 verifyFormat("A (*foo_)[6];"); 7835 verifyFormat("vector<int> (*foo_)[6];"); 7836 } 7837 7838 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7839 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7840 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7841 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7842 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7843 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7844 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7845 7846 // Different ways of ()-initializiation. 7847 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7848 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7849 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7850 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7851 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7852 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7853 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7854 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7855 7856 // Lambdas should not confuse the variable declaration heuristic. 7857 verifyFormat("LooooooooooooooooongType\n" 7858 " variable(nullptr, [](A *a) {});", 7859 getLLVMStyleWithColumns(40)); 7860 } 7861 7862 TEST_F(FormatTest, BreaksLongDeclarations) { 7863 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7864 " AnotherNameForTheLongType;"); 7865 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7866 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7867 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7868 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7869 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7870 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7871 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7872 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7873 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7874 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7875 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7876 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7877 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7878 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7879 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7880 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7881 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7882 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7883 FormatStyle Indented = getLLVMStyle(); 7884 Indented.IndentWrappedFunctionNames = true; 7885 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7886 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7887 Indented); 7888 verifyFormat( 7889 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7890 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7891 Indented); 7892 verifyFormat( 7893 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7894 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7895 Indented); 7896 verifyFormat( 7897 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7898 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7899 Indented); 7900 7901 // FIXME: Without the comment, this breaks after "(". 7902 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7903 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7904 getGoogleStyle()); 7905 7906 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7907 " int LoooooooooooooooooooongParam2) {}"); 7908 verifyFormat( 7909 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7910 " SourceLocation L, IdentifierIn *II,\n" 7911 " Type *T) {}"); 7912 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7913 "ReallyReaaallyLongFunctionName(\n" 7914 " const std::string &SomeParameter,\n" 7915 " const SomeType<string, SomeOtherTemplateParameter>\n" 7916 " &ReallyReallyLongParameterName,\n" 7917 " const SomeType<string, SomeOtherTemplateParameter>\n" 7918 " &AnotherLongParameterName) {}"); 7919 verifyFormat("template <typename A>\n" 7920 "SomeLoooooooooooooooooooooongType<\n" 7921 " typename some_namespace::SomeOtherType<A>::Type>\n" 7922 "Function() {}"); 7923 7924 verifyGoogleFormat( 7925 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7926 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7927 verifyGoogleFormat( 7928 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7929 " SourceLocation L) {}"); 7930 verifyGoogleFormat( 7931 "some_namespace::LongReturnType\n" 7932 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7933 " int first_long_parameter, int second_parameter) {}"); 7934 7935 verifyGoogleFormat("template <typename T>\n" 7936 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7937 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7938 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7939 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7940 7941 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7942 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7943 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7944 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7945 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7946 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7947 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7948 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7950 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7951 7952 verifyFormat("template <typename T> // Templates on own line.\n" 7953 "static int // Some comment.\n" 7954 "MyFunction(int a);", 7955 getLLVMStyle()); 7956 } 7957 7958 TEST_F(FormatTest, FormatsArrays) { 7959 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7960 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7961 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7962 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7963 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7964 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7965 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7966 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7967 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7968 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7969 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7970 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7971 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7972 verifyFormat( 7973 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7974 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7975 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7976 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7977 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7978 7979 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7981 verifyFormat( 7982 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 7983 " .aaaaaaa[0]\n" 7984 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7985 verifyFormat("a[::b::c];"); 7986 7987 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 7988 7989 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 7990 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 7991 } 7992 7993 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 7994 verifyFormat("(a)->b();"); 7995 verifyFormat("--a;"); 7996 } 7997 7998 TEST_F(FormatTest, HandlesIncludeDirectives) { 7999 verifyFormat("#include <string>\n" 8000 "#include <a/b/c.h>\n" 8001 "#include \"a/b/string\"\n" 8002 "#include \"string.h\"\n" 8003 "#include \"string.h\"\n" 8004 "#include <a-a>\n" 8005 "#include < path with space >\n" 8006 "#include_next <test.h>" 8007 "#include \"abc.h\" // this is included for ABC\n" 8008 "#include \"some long include\" // with a comment\n" 8009 "#include \"some very long include path\"\n" 8010 "#include <some/very/long/include/path>\n", 8011 getLLVMStyleWithColumns(35)); 8012 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 8013 EXPECT_EQ("#include <a>", format("#include<a>")); 8014 8015 verifyFormat("#import <string>"); 8016 verifyFormat("#import <a/b/c.h>"); 8017 verifyFormat("#import \"a/b/string\""); 8018 verifyFormat("#import \"string.h\""); 8019 verifyFormat("#import \"string.h\""); 8020 verifyFormat("#if __has_include(<strstream>)\n" 8021 "#include <strstream>\n" 8022 "#endif"); 8023 8024 verifyFormat("#define MY_IMPORT <a/b>"); 8025 8026 verifyFormat("#if __has_include(<a/b>)"); 8027 verifyFormat("#if __has_include_next(<a/b>)"); 8028 verifyFormat("#define F __has_include(<a/b>)"); 8029 verifyFormat("#define F __has_include_next(<a/b>)"); 8030 8031 // Protocol buffer definition or missing "#". 8032 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 8033 getLLVMStyleWithColumns(30)); 8034 8035 FormatStyle Style = getLLVMStyle(); 8036 Style.AlwaysBreakBeforeMultilineStrings = true; 8037 Style.ColumnLimit = 0; 8038 verifyFormat("#import \"abc.h\"", Style); 8039 8040 // But 'import' might also be a regular C++ namespace. 8041 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8042 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8043 } 8044 8045 //===----------------------------------------------------------------------===// 8046 // Error recovery tests. 8047 //===----------------------------------------------------------------------===// 8048 8049 TEST_F(FormatTest, IncompleteParameterLists) { 8050 FormatStyle NoBinPacking = getLLVMStyle(); 8051 NoBinPacking.BinPackParameters = false; 8052 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 8053 " double *min_x,\n" 8054 " double *max_x,\n" 8055 " double *min_y,\n" 8056 " double *max_y,\n" 8057 " double *min_z,\n" 8058 " double *max_z, ) {}", 8059 NoBinPacking); 8060 } 8061 8062 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 8063 verifyFormat("void f() { return; }\n42"); 8064 verifyFormat("void f() {\n" 8065 " if (0)\n" 8066 " return;\n" 8067 "}\n" 8068 "42"); 8069 verifyFormat("void f() { return }\n42"); 8070 verifyFormat("void f() {\n" 8071 " if (0)\n" 8072 " return\n" 8073 "}\n" 8074 "42"); 8075 } 8076 8077 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 8078 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 8079 EXPECT_EQ("void f() {\n" 8080 " if (a)\n" 8081 " return\n" 8082 "}", 8083 format("void f ( ) { if ( a ) return }")); 8084 EXPECT_EQ("namespace N {\n" 8085 "void f()\n" 8086 "}", 8087 format("namespace N { void f() }")); 8088 EXPECT_EQ("namespace N {\n" 8089 "void f() {}\n" 8090 "void g()\n" 8091 "} // namespace N", 8092 format("namespace N { void f( ) { } void g( ) }")); 8093 } 8094 8095 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 8096 verifyFormat("int aaaaaaaa =\n" 8097 " // Overlylongcomment\n" 8098 " b;", 8099 getLLVMStyleWithColumns(20)); 8100 verifyFormat("function(\n" 8101 " ShortArgument,\n" 8102 " LoooooooooooongArgument);\n", 8103 getLLVMStyleWithColumns(20)); 8104 } 8105 8106 TEST_F(FormatTest, IncorrectAccessSpecifier) { 8107 verifyFormat("public:"); 8108 verifyFormat("class A {\n" 8109 "public\n" 8110 " void f() {}\n" 8111 "};"); 8112 verifyFormat("public\n" 8113 "int qwerty;"); 8114 verifyFormat("public\n" 8115 "B {}"); 8116 verifyFormat("public\n" 8117 "{}"); 8118 verifyFormat("public\n" 8119 "B { int x; }"); 8120 } 8121 8122 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 8123 verifyFormat("{"); 8124 verifyFormat("#})"); 8125 verifyNoCrash("(/**/[:!] ?[)."); 8126 } 8127 8128 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 8129 // Found by oss-fuzz: 8130 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 8131 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 8132 Style.ColumnLimit = 60; 8133 verifyNoCrash( 8134 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 8135 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 8136 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 8137 Style); 8138 } 8139 8140 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 8141 verifyFormat("do {\n}"); 8142 verifyFormat("do {\n}\n" 8143 "f();"); 8144 verifyFormat("do {\n}\n" 8145 "wheeee(fun);"); 8146 verifyFormat("do {\n" 8147 " f();\n" 8148 "}"); 8149 } 8150 8151 TEST_F(FormatTest, IncorrectCodeMissingParens) { 8152 verifyFormat("if {\n foo;\n foo();\n}"); 8153 verifyFormat("switch {\n foo;\n foo();\n}"); 8154 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 8155 verifyFormat("while {\n foo;\n foo();\n}"); 8156 verifyFormat("do {\n foo;\n foo();\n} while;"); 8157 } 8158 8159 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 8160 verifyIncompleteFormat("namespace {\n" 8161 "class Foo { Foo (\n" 8162 "};\n" 8163 "} // namespace"); 8164 } 8165 8166 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 8167 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 8168 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 8169 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 8170 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 8171 8172 EXPECT_EQ("{\n" 8173 " {\n" 8174 " breakme(\n" 8175 " qwe);\n" 8176 " }\n", 8177 format("{\n" 8178 " {\n" 8179 " breakme(qwe);\n" 8180 "}\n", 8181 getLLVMStyleWithColumns(10))); 8182 } 8183 8184 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 8185 verifyFormat("int x = {\n" 8186 " avariable,\n" 8187 " b(alongervariable)};", 8188 getLLVMStyleWithColumns(25)); 8189 } 8190 8191 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 8192 verifyFormat("return (a)(b){1, 2, 3};"); 8193 } 8194 8195 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 8196 verifyFormat("vector<int> x{1, 2, 3, 4};"); 8197 verifyFormat("vector<int> x{\n" 8198 " 1,\n" 8199 " 2,\n" 8200 " 3,\n" 8201 " 4,\n" 8202 "};"); 8203 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 8204 verifyFormat("f({1, 2});"); 8205 verifyFormat("auto v = Foo{-1};"); 8206 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 8207 verifyFormat("Class::Class : member{1, 2, 3} {}"); 8208 verifyFormat("new vector<int>{1, 2, 3};"); 8209 verifyFormat("new int[3]{1, 2, 3};"); 8210 verifyFormat("new int{1};"); 8211 verifyFormat("return {arg1, arg2};"); 8212 verifyFormat("return {arg1, SomeType{parameter}};"); 8213 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 8214 verifyFormat("new T{arg1, arg2};"); 8215 verifyFormat("f(MyMap[{composite, key}]);"); 8216 verifyFormat("class Class {\n" 8217 " T member = {arg1, arg2};\n" 8218 "};"); 8219 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 8220 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 8221 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 8222 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 8223 verifyFormat("int a = std::is_integral<int>{} + 0;"); 8224 8225 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8226 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8227 verifyFormat("auto i = decltype(x){};"); 8228 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 8229 verifyFormat("Node n{1, Node{1000}, //\n" 8230 " 2};"); 8231 verifyFormat("Aaaa aaaaaaa{\n" 8232 " {\n" 8233 " aaaa,\n" 8234 " },\n" 8235 "};"); 8236 verifyFormat("class C : public D {\n" 8237 " SomeClass SC{2};\n" 8238 "};"); 8239 verifyFormat("class C : public A {\n" 8240 " class D : public B {\n" 8241 " void f() { int i{2}; }\n" 8242 " };\n" 8243 "};"); 8244 verifyFormat("#define A {a, a},"); 8245 8246 // Avoid breaking between equal sign and opening brace 8247 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 8248 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 8249 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 8250 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 8251 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 8252 " {\"ccccccccccccccccccccc\", 2}};", 8253 AvoidBreakingFirstArgument); 8254 8255 // Binpacking only if there is no trailing comma 8256 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 8257 " cccccccccc, dddddddddd};", 8258 getLLVMStyleWithColumns(50)); 8259 verifyFormat("const Aaaaaa aaaaa = {\n" 8260 " aaaaaaaaaaa,\n" 8261 " bbbbbbbbbbb,\n" 8262 " ccccccccccc,\n" 8263 " ddddddddddd,\n" 8264 "};", 8265 getLLVMStyleWithColumns(50)); 8266 8267 // Cases where distinguising braced lists and blocks is hard. 8268 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 8269 verifyFormat("void f() {\n" 8270 " return; // comment\n" 8271 "}\n" 8272 "SomeType t;"); 8273 verifyFormat("void f() {\n" 8274 " if (a) {\n" 8275 " f();\n" 8276 " }\n" 8277 "}\n" 8278 "SomeType t;"); 8279 8280 // In combination with BinPackArguments = false. 8281 FormatStyle NoBinPacking = getLLVMStyle(); 8282 NoBinPacking.BinPackArguments = false; 8283 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 8284 " bbbbb,\n" 8285 " ccccc,\n" 8286 " ddddd,\n" 8287 " eeeee,\n" 8288 " ffffff,\n" 8289 " ggggg,\n" 8290 " hhhhhh,\n" 8291 " iiiiii,\n" 8292 " jjjjjj,\n" 8293 " kkkkkk};", 8294 NoBinPacking); 8295 verifyFormat("const Aaaaaa aaaaa = {\n" 8296 " aaaaa,\n" 8297 " bbbbb,\n" 8298 " ccccc,\n" 8299 " ddddd,\n" 8300 " eeeee,\n" 8301 " ffffff,\n" 8302 " ggggg,\n" 8303 " hhhhhh,\n" 8304 " iiiiii,\n" 8305 " jjjjjj,\n" 8306 " kkkkkk,\n" 8307 "};", 8308 NoBinPacking); 8309 verifyFormat( 8310 "const Aaaaaa aaaaa = {\n" 8311 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 8312 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 8313 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 8314 "};", 8315 NoBinPacking); 8316 8317 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8318 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 8319 " CDDDP83848_BMCR_REGISTER,\n" 8320 " CDDDP83848_BMSR_REGISTER,\n" 8321 " CDDDP83848_RBR_REGISTER};", 8322 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 8323 " CDDDP83848_BMSR_REGISTER,\n" 8324 " CDDDP83848_RBR_REGISTER};", 8325 NoBinPacking)); 8326 8327 // FIXME: The alignment of these trailing comments might be bad. Then again, 8328 // this might be utterly useless in real code. 8329 verifyFormat("Constructor::Constructor()\n" 8330 " : some_value{ //\n" 8331 " aaaaaaa, //\n" 8332 " bbbbbbb} {}"); 8333 8334 // In braced lists, the first comment is always assumed to belong to the 8335 // first element. Thus, it can be moved to the next or previous line as 8336 // appropriate. 8337 EXPECT_EQ("function({// First element:\n" 8338 " 1,\n" 8339 " // Second element:\n" 8340 " 2});", 8341 format("function({\n" 8342 " // First element:\n" 8343 " 1,\n" 8344 " // Second element:\n" 8345 " 2});")); 8346 EXPECT_EQ("std::vector<int> MyNumbers{\n" 8347 " // First element:\n" 8348 " 1,\n" 8349 " // Second element:\n" 8350 " 2};", 8351 format("std::vector<int> MyNumbers{// First element:\n" 8352 " 1,\n" 8353 " // Second element:\n" 8354 " 2};", 8355 getLLVMStyleWithColumns(30))); 8356 // A trailing comma should still lead to an enforced line break and no 8357 // binpacking. 8358 EXPECT_EQ("vector<int> SomeVector = {\n" 8359 " // aaa\n" 8360 " 1,\n" 8361 " 2,\n" 8362 "};", 8363 format("vector<int> SomeVector = { // aaa\n" 8364 " 1, 2, };")); 8365 8366 FormatStyle ExtraSpaces = getLLVMStyle(); 8367 ExtraSpaces.Cpp11BracedListStyle = false; 8368 ExtraSpaces.ColumnLimit = 75; 8369 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8370 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8371 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8372 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8373 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8374 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8375 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8376 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8377 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8378 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8379 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8380 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8381 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8382 verifyFormat("class Class {\n" 8383 " T member = { arg1, arg2 };\n" 8384 "};", 8385 ExtraSpaces); 8386 verifyFormat( 8387 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8388 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8389 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8390 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8391 ExtraSpaces); 8392 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 8393 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 8394 ExtraSpaces); 8395 verifyFormat( 8396 "someFunction(OtherParam,\n" 8397 " BracedList{ // comment 1 (Forcing interesting break)\n" 8398 " param1, param2,\n" 8399 " // comment 2\n" 8400 " param3, param4 });", 8401 ExtraSpaces); 8402 verifyFormat( 8403 "std::this_thread::sleep_for(\n" 8404 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 8405 ExtraSpaces); 8406 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 8407 " aaaaaaa,\n" 8408 " aaaaaaaaaa,\n" 8409 " aaaaa,\n" 8410 " aaaaaaaaaaaaaaa,\n" 8411 " aaa,\n" 8412 " aaaaaaaaaa,\n" 8413 " a,\n" 8414 " aaaaaaaaaaaaaaaaaaaaa,\n" 8415 " aaaaaaaaaaaa,\n" 8416 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 8417 " aaaaaaa,\n" 8418 " a};"); 8419 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 8420 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 8421 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 8422 8423 // Avoid breaking between initializer/equal sign and opening brace 8424 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 8425 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 8426 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8427 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8428 " { \"ccccccccccccccccccccc\", 2 }\n" 8429 "};", 8430 ExtraSpaces); 8431 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 8432 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8433 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8434 " { \"ccccccccccccccccccccc\", 2 }\n" 8435 "};", 8436 ExtraSpaces); 8437 8438 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 8439 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 8440 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 8441 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 8442 8443 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 8444 SpaceBetweenBraces.SpacesInAngles = true; 8445 SpaceBetweenBraces.SpacesInParentheses = true; 8446 SpaceBetweenBraces.SpacesInSquareBrackets = true; 8447 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 8448 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 8449 verifyFormat("vector< int > x{ // comment 1\n" 8450 " 1, 2, 3, 4 };", 8451 SpaceBetweenBraces); 8452 SpaceBetweenBraces.ColumnLimit = 20; 8453 EXPECT_EQ("vector< int > x{\n" 8454 " 1, 2, 3, 4 };", 8455 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8456 SpaceBetweenBraces.ColumnLimit = 24; 8457 EXPECT_EQ("vector< int > x{ 1, 2,\n" 8458 " 3, 4 };", 8459 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8460 EXPECT_EQ("vector< int > x{\n" 8461 " 1,\n" 8462 " 2,\n" 8463 " 3,\n" 8464 " 4,\n" 8465 "};", 8466 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 8467 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 8468 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 8469 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 8470 } 8471 8472 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 8473 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8474 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8475 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8476 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8477 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8478 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8479 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 8480 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8481 " 1, 22, 333, 4444, 55555, //\n" 8482 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8483 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8484 verifyFormat( 8485 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8486 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8487 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 8488 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8489 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8490 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8491 " 7777777};"); 8492 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8493 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8494 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8495 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8496 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8497 " // Separating comment.\n" 8498 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8499 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8500 " // Leading comment\n" 8501 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8502 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8503 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8504 " 1, 1, 1, 1};", 8505 getLLVMStyleWithColumns(39)); 8506 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8507 " 1, 1, 1, 1};", 8508 getLLVMStyleWithColumns(38)); 8509 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 8510 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 8511 getLLVMStyleWithColumns(43)); 8512 verifyFormat( 8513 "static unsigned SomeValues[10][3] = {\n" 8514 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 8515 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 8516 verifyFormat("static auto fields = new vector<string>{\n" 8517 " \"aaaaaaaaaaaaa\",\n" 8518 " \"aaaaaaaaaaaaa\",\n" 8519 " \"aaaaaaaaaaaa\",\n" 8520 " \"aaaaaaaaaaaaaa\",\n" 8521 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8522 " \"aaaaaaaaaaaa\",\n" 8523 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8524 "};"); 8525 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8526 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8527 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8528 " 3, cccccccccccccccccccccc};", 8529 getLLVMStyleWithColumns(60)); 8530 8531 // Trailing commas. 8532 verifyFormat("vector<int> x = {\n" 8533 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8534 "};", 8535 getLLVMStyleWithColumns(39)); 8536 verifyFormat("vector<int> x = {\n" 8537 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8538 "};", 8539 getLLVMStyleWithColumns(39)); 8540 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8541 " 1, 1, 1, 1,\n" 8542 " /**/ /**/};", 8543 getLLVMStyleWithColumns(39)); 8544 8545 // Trailing comment in the first line. 8546 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8547 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8548 " 111111111, 222222222, 3333333333, 444444444, //\n" 8549 " 11111111, 22222222, 333333333, 44444444};"); 8550 // Trailing comment in the last line. 8551 verifyFormat("int aaaaa[] = {\n" 8552 " 1, 2, 3, // comment\n" 8553 " 4, 5, 6 // comment\n" 8554 "};"); 8555 8556 // With nested lists, we should either format one item per line or all nested 8557 // lists one on line. 8558 // FIXME: For some nested lists, we can do better. 8559 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8560 " {aaaaaaaaaaaaaaaaaaa},\n" 8561 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8562 " {aaaaaaaaaaaaaaaaa}};", 8563 getLLVMStyleWithColumns(60)); 8564 verifyFormat( 8565 "SomeStruct my_struct_array = {\n" 8566 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8567 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8568 " {aaa, aaa},\n" 8569 " {aaa, aaa},\n" 8570 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8571 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8572 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8573 8574 // No column layout should be used here. 8575 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8576 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8577 8578 verifyNoCrash("a<,"); 8579 8580 // No braced initializer here. 8581 verifyFormat("void f() {\n" 8582 " struct Dummy {};\n" 8583 " f(v);\n" 8584 "}"); 8585 8586 // Long lists should be formatted in columns even if they are nested. 8587 verifyFormat( 8588 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8589 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8590 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8591 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8592 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8593 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8594 8595 // Allow "single-column" layout even if that violates the column limit. There 8596 // isn't going to be a better way. 8597 verifyFormat("std::vector<int> a = {\n" 8598 " aaaaaaaa,\n" 8599 " aaaaaaaa,\n" 8600 " aaaaaaaa,\n" 8601 " aaaaaaaa,\n" 8602 " aaaaaaaaaa,\n" 8603 " aaaaaaaa,\n" 8604 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8605 getLLVMStyleWithColumns(30)); 8606 verifyFormat("vector<int> aaaa = {\n" 8607 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8608 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8609 " aaaaaa.aaaaaaa,\n" 8610 " aaaaaa.aaaaaaa,\n" 8611 " aaaaaa.aaaaaaa,\n" 8612 " aaaaaa.aaaaaaa,\n" 8613 "};"); 8614 8615 // Don't create hanging lists. 8616 verifyFormat("someFunction(Param, {List1, List2,\n" 8617 " List3});", 8618 getLLVMStyleWithColumns(35)); 8619 verifyFormat("someFunction(Param, Param,\n" 8620 " {List1, List2,\n" 8621 " List3});", 8622 getLLVMStyleWithColumns(35)); 8623 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8624 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8625 } 8626 8627 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8628 FormatStyle DoNotMerge = getLLVMStyle(); 8629 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8630 8631 verifyFormat("void f() { return 42; }"); 8632 verifyFormat("void f() {\n" 8633 " return 42;\n" 8634 "}", 8635 DoNotMerge); 8636 verifyFormat("void f() {\n" 8637 " // Comment\n" 8638 "}"); 8639 verifyFormat("{\n" 8640 "#error {\n" 8641 " int a;\n" 8642 "}"); 8643 verifyFormat("{\n" 8644 " int a;\n" 8645 "#error {\n" 8646 "}"); 8647 verifyFormat("void f() {} // comment"); 8648 verifyFormat("void f() { int a; } // comment"); 8649 verifyFormat("void f() {\n" 8650 "} // comment", 8651 DoNotMerge); 8652 verifyFormat("void f() {\n" 8653 " int a;\n" 8654 "} // comment", 8655 DoNotMerge); 8656 verifyFormat("void f() {\n" 8657 "} // comment", 8658 getLLVMStyleWithColumns(15)); 8659 8660 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8661 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8662 8663 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8664 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8665 verifyFormat("class C {\n" 8666 " C()\n" 8667 " : iiiiiiii(nullptr),\n" 8668 " kkkkkkk(nullptr),\n" 8669 " mmmmmmm(nullptr),\n" 8670 " nnnnnnn(nullptr) {}\n" 8671 "};", 8672 getGoogleStyle()); 8673 8674 FormatStyle NoColumnLimit = getLLVMStyle(); 8675 NoColumnLimit.ColumnLimit = 0; 8676 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8677 EXPECT_EQ("class C {\n" 8678 " A() : b(0) {}\n" 8679 "};", 8680 format("class C{A():b(0){}};", NoColumnLimit)); 8681 EXPECT_EQ("A()\n" 8682 " : b(0) {\n" 8683 "}", 8684 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8685 8686 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8687 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8688 FormatStyle::SFS_None; 8689 EXPECT_EQ("A()\n" 8690 " : b(0) {\n" 8691 "}", 8692 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8693 EXPECT_EQ("A()\n" 8694 " : b(0) {\n" 8695 "}", 8696 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8697 8698 verifyFormat("#define A \\\n" 8699 " void f() { \\\n" 8700 " int i; \\\n" 8701 " }", 8702 getLLVMStyleWithColumns(20)); 8703 verifyFormat("#define A \\\n" 8704 " void f() { int i; }", 8705 getLLVMStyleWithColumns(21)); 8706 verifyFormat("#define A \\\n" 8707 " void f() { \\\n" 8708 " int i; \\\n" 8709 " } \\\n" 8710 " int j;", 8711 getLLVMStyleWithColumns(22)); 8712 verifyFormat("#define A \\\n" 8713 " void f() { int i; } \\\n" 8714 " int j;", 8715 getLLVMStyleWithColumns(23)); 8716 } 8717 8718 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8719 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8720 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8721 verifyFormat("class C {\n" 8722 " int f() {}\n" 8723 "};", 8724 MergeEmptyOnly); 8725 verifyFormat("class C {\n" 8726 " int f() {\n" 8727 " return 42;\n" 8728 " }\n" 8729 "};", 8730 MergeEmptyOnly); 8731 verifyFormat("int f() {}", MergeEmptyOnly); 8732 verifyFormat("int f() {\n" 8733 " return 42;\n" 8734 "}", 8735 MergeEmptyOnly); 8736 8737 // Also verify behavior when BraceWrapping.AfterFunction = true 8738 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8739 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8740 verifyFormat("int f() {}", MergeEmptyOnly); 8741 verifyFormat("class C {\n" 8742 " int f() {}\n" 8743 "};", 8744 MergeEmptyOnly); 8745 } 8746 8747 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8748 FormatStyle MergeInlineOnly = getLLVMStyle(); 8749 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8750 verifyFormat("class C {\n" 8751 " int f() { return 42; }\n" 8752 "};", 8753 MergeInlineOnly); 8754 verifyFormat("int f() {\n" 8755 " return 42;\n" 8756 "}", 8757 MergeInlineOnly); 8758 8759 // SFS_Inline implies SFS_Empty 8760 verifyFormat("class C {\n" 8761 " int f() {}\n" 8762 "};", 8763 MergeInlineOnly); 8764 verifyFormat("int f() {}", MergeInlineOnly); 8765 8766 // Also verify behavior when BraceWrapping.AfterFunction = true 8767 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8768 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8769 verifyFormat("class C {\n" 8770 " int f() { return 42; }\n" 8771 "};", 8772 MergeInlineOnly); 8773 verifyFormat("int f()\n" 8774 "{\n" 8775 " return 42;\n" 8776 "}", 8777 MergeInlineOnly); 8778 8779 // SFS_Inline implies SFS_Empty 8780 verifyFormat("int f() {}", MergeInlineOnly); 8781 verifyFormat("class C {\n" 8782 " int f() {}\n" 8783 "};", 8784 MergeInlineOnly); 8785 } 8786 8787 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8788 FormatStyle MergeInlineOnly = getLLVMStyle(); 8789 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8790 FormatStyle::SFS_InlineOnly; 8791 verifyFormat("class C {\n" 8792 " int f() { return 42; }\n" 8793 "};", 8794 MergeInlineOnly); 8795 verifyFormat("int f() {\n" 8796 " return 42;\n" 8797 "}", 8798 MergeInlineOnly); 8799 8800 // SFS_InlineOnly does not imply SFS_Empty 8801 verifyFormat("class C {\n" 8802 " int f() {}\n" 8803 "};", 8804 MergeInlineOnly); 8805 verifyFormat("int f() {\n" 8806 "}", 8807 MergeInlineOnly); 8808 8809 // Also verify behavior when BraceWrapping.AfterFunction = true 8810 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8811 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8812 verifyFormat("class C {\n" 8813 " int f() { return 42; }\n" 8814 "};", 8815 MergeInlineOnly); 8816 verifyFormat("int f()\n" 8817 "{\n" 8818 " return 42;\n" 8819 "}", 8820 MergeInlineOnly); 8821 8822 // SFS_InlineOnly does not imply SFS_Empty 8823 verifyFormat("int f()\n" 8824 "{\n" 8825 "}", 8826 MergeInlineOnly); 8827 verifyFormat("class C {\n" 8828 " int f() {}\n" 8829 "};", 8830 MergeInlineOnly); 8831 } 8832 8833 TEST_F(FormatTest, SplitEmptyFunction) { 8834 FormatStyle Style = getLLVMStyle(); 8835 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8836 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8837 Style.BraceWrapping.AfterFunction = true; 8838 Style.BraceWrapping.SplitEmptyFunction = false; 8839 Style.ColumnLimit = 40; 8840 8841 verifyFormat("int f()\n" 8842 "{}", 8843 Style); 8844 verifyFormat("int f()\n" 8845 "{\n" 8846 " return 42;\n" 8847 "}", 8848 Style); 8849 verifyFormat("int f()\n" 8850 "{\n" 8851 " // some comment\n" 8852 "}", 8853 Style); 8854 8855 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8856 verifyFormat("int f() {}", Style); 8857 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8858 "{}", 8859 Style); 8860 verifyFormat("int f()\n" 8861 "{\n" 8862 " return 0;\n" 8863 "}", 8864 Style); 8865 8866 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8867 verifyFormat("class Foo {\n" 8868 " int f() {}\n" 8869 "};\n", 8870 Style); 8871 verifyFormat("class Foo {\n" 8872 " int f() { return 0; }\n" 8873 "};\n", 8874 Style); 8875 verifyFormat("class Foo {\n" 8876 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8877 " {}\n" 8878 "};\n", 8879 Style); 8880 verifyFormat("class Foo {\n" 8881 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8882 " {\n" 8883 " return 0;\n" 8884 " }\n" 8885 "};\n", 8886 Style); 8887 8888 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8889 verifyFormat("int f() {}", Style); 8890 verifyFormat("int f() { return 0; }", Style); 8891 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8892 "{}", 8893 Style); 8894 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8895 "{\n" 8896 " return 0;\n" 8897 "}", 8898 Style); 8899 } 8900 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8901 FormatStyle Style = getLLVMStyle(); 8902 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8903 verifyFormat("#ifdef A\n" 8904 "int f() {}\n" 8905 "#else\n" 8906 "int g() {}\n" 8907 "#endif", 8908 Style); 8909 } 8910 8911 TEST_F(FormatTest, SplitEmptyClass) { 8912 FormatStyle Style = getLLVMStyle(); 8913 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8914 Style.BraceWrapping.AfterClass = true; 8915 Style.BraceWrapping.SplitEmptyRecord = false; 8916 8917 verifyFormat("class Foo\n" 8918 "{};", 8919 Style); 8920 verifyFormat("/* something */ class Foo\n" 8921 "{};", 8922 Style); 8923 verifyFormat("template <typename X> class Foo\n" 8924 "{};", 8925 Style); 8926 verifyFormat("class Foo\n" 8927 "{\n" 8928 " Foo();\n" 8929 "};", 8930 Style); 8931 verifyFormat("typedef class Foo\n" 8932 "{\n" 8933 "} Foo_t;", 8934 Style); 8935 } 8936 8937 TEST_F(FormatTest, SplitEmptyStruct) { 8938 FormatStyle Style = getLLVMStyle(); 8939 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8940 Style.BraceWrapping.AfterStruct = true; 8941 Style.BraceWrapping.SplitEmptyRecord = false; 8942 8943 verifyFormat("struct Foo\n" 8944 "{};", 8945 Style); 8946 verifyFormat("/* something */ struct Foo\n" 8947 "{};", 8948 Style); 8949 verifyFormat("template <typename X> struct Foo\n" 8950 "{};", 8951 Style); 8952 verifyFormat("struct Foo\n" 8953 "{\n" 8954 " Foo();\n" 8955 "};", 8956 Style); 8957 verifyFormat("typedef struct Foo\n" 8958 "{\n" 8959 "} Foo_t;", 8960 Style); 8961 // typedef struct Bar {} Bar_t; 8962 } 8963 8964 TEST_F(FormatTest, SplitEmptyUnion) { 8965 FormatStyle Style = getLLVMStyle(); 8966 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8967 Style.BraceWrapping.AfterUnion = true; 8968 Style.BraceWrapping.SplitEmptyRecord = false; 8969 8970 verifyFormat("union Foo\n" 8971 "{};", 8972 Style); 8973 verifyFormat("/* something */ union Foo\n" 8974 "{};", 8975 Style); 8976 verifyFormat("union Foo\n" 8977 "{\n" 8978 " A,\n" 8979 "};", 8980 Style); 8981 verifyFormat("typedef union Foo\n" 8982 "{\n" 8983 "} Foo_t;", 8984 Style); 8985 } 8986 8987 TEST_F(FormatTest, SplitEmptyNamespace) { 8988 FormatStyle Style = getLLVMStyle(); 8989 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8990 Style.BraceWrapping.AfterNamespace = true; 8991 Style.BraceWrapping.SplitEmptyNamespace = false; 8992 8993 verifyFormat("namespace Foo\n" 8994 "{};", 8995 Style); 8996 verifyFormat("/* something */ namespace Foo\n" 8997 "{};", 8998 Style); 8999 verifyFormat("inline namespace Foo\n" 9000 "{};", 9001 Style); 9002 verifyFormat("/* something */ inline namespace Foo\n" 9003 "{};", 9004 Style); 9005 verifyFormat("export namespace Foo\n" 9006 "{};", 9007 Style); 9008 verifyFormat("namespace Foo\n" 9009 "{\n" 9010 "void Bar();\n" 9011 "};", 9012 Style); 9013 } 9014 9015 TEST_F(FormatTest, NeverMergeShortRecords) { 9016 FormatStyle Style = getLLVMStyle(); 9017 9018 verifyFormat("class Foo {\n" 9019 " Foo();\n" 9020 "};", 9021 Style); 9022 verifyFormat("typedef class Foo {\n" 9023 " Foo();\n" 9024 "} Foo_t;", 9025 Style); 9026 verifyFormat("struct Foo {\n" 9027 " Foo();\n" 9028 "};", 9029 Style); 9030 verifyFormat("typedef struct Foo {\n" 9031 " Foo();\n" 9032 "} Foo_t;", 9033 Style); 9034 verifyFormat("union Foo {\n" 9035 " A,\n" 9036 "};", 9037 Style); 9038 verifyFormat("typedef union Foo {\n" 9039 " A,\n" 9040 "} Foo_t;", 9041 Style); 9042 verifyFormat("namespace Foo {\n" 9043 "void Bar();\n" 9044 "};", 9045 Style); 9046 9047 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9048 Style.BraceWrapping.AfterClass = true; 9049 Style.BraceWrapping.AfterStruct = true; 9050 Style.BraceWrapping.AfterUnion = true; 9051 Style.BraceWrapping.AfterNamespace = true; 9052 verifyFormat("class Foo\n" 9053 "{\n" 9054 " Foo();\n" 9055 "};", 9056 Style); 9057 verifyFormat("typedef class Foo\n" 9058 "{\n" 9059 " Foo();\n" 9060 "} Foo_t;", 9061 Style); 9062 verifyFormat("struct Foo\n" 9063 "{\n" 9064 " Foo();\n" 9065 "};", 9066 Style); 9067 verifyFormat("typedef struct Foo\n" 9068 "{\n" 9069 " Foo();\n" 9070 "} Foo_t;", 9071 Style); 9072 verifyFormat("union Foo\n" 9073 "{\n" 9074 " A,\n" 9075 "};", 9076 Style); 9077 verifyFormat("typedef union Foo\n" 9078 "{\n" 9079 " A,\n" 9080 "} Foo_t;", 9081 Style); 9082 verifyFormat("namespace Foo\n" 9083 "{\n" 9084 "void Bar();\n" 9085 "};", 9086 Style); 9087 } 9088 9089 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 9090 // Elaborate type variable declarations. 9091 verifyFormat("struct foo a = {bar};\nint n;"); 9092 verifyFormat("class foo a = {bar};\nint n;"); 9093 verifyFormat("union foo a = {bar};\nint n;"); 9094 9095 // Elaborate types inside function definitions. 9096 verifyFormat("struct foo f() {}\nint n;"); 9097 verifyFormat("class foo f() {}\nint n;"); 9098 verifyFormat("union foo f() {}\nint n;"); 9099 9100 // Templates. 9101 verifyFormat("template <class X> void f() {}\nint n;"); 9102 verifyFormat("template <struct X> void f() {}\nint n;"); 9103 verifyFormat("template <union X> void f() {}\nint n;"); 9104 9105 // Actual definitions... 9106 verifyFormat("struct {\n} n;"); 9107 verifyFormat( 9108 "template <template <class T, class Y>, class Z> class X {\n} n;"); 9109 verifyFormat("union Z {\n int n;\n} x;"); 9110 verifyFormat("class MACRO Z {\n} n;"); 9111 verifyFormat("class MACRO(X) Z {\n} n;"); 9112 verifyFormat("class __attribute__(X) Z {\n} n;"); 9113 verifyFormat("class __declspec(X) Z {\n} n;"); 9114 verifyFormat("class A##B##C {\n} n;"); 9115 verifyFormat("class alignas(16) Z {\n} n;"); 9116 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 9117 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 9118 9119 // Redefinition from nested context: 9120 verifyFormat("class A::B::C {\n} n;"); 9121 9122 // Template definitions. 9123 verifyFormat( 9124 "template <typename F>\n" 9125 "Matcher(const Matcher<F> &Other,\n" 9126 " typename enable_if_c<is_base_of<F, T>::value &&\n" 9127 " !is_same<F, T>::value>::type * = 0)\n" 9128 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 9129 9130 // FIXME: This is still incorrectly handled at the formatter side. 9131 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 9132 verifyFormat("int i = SomeFunction(a<b, a> b);"); 9133 9134 // FIXME: 9135 // This now gets parsed incorrectly as class definition. 9136 // verifyFormat("class A<int> f() {\n}\nint n;"); 9137 9138 // Elaborate types where incorrectly parsing the structural element would 9139 // break the indent. 9140 verifyFormat("if (true)\n" 9141 " class X x;\n" 9142 "else\n" 9143 " f();\n"); 9144 9145 // This is simply incomplete. Formatting is not important, but must not crash. 9146 verifyFormat("class A:"); 9147 } 9148 9149 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 9150 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 9151 format("#error Leave all white!!!!! space* alone!\n")); 9152 EXPECT_EQ( 9153 "#warning Leave all white!!!!! space* alone!\n", 9154 format("#warning Leave all white!!!!! space* alone!\n")); 9155 EXPECT_EQ("#error 1", format(" # error 1")); 9156 EXPECT_EQ("#warning 1", format(" # warning 1")); 9157 } 9158 9159 TEST_F(FormatTest, FormatHashIfExpressions) { 9160 verifyFormat("#if AAAA && BBBB"); 9161 verifyFormat("#if (AAAA && BBBB)"); 9162 verifyFormat("#elif (AAAA && BBBB)"); 9163 // FIXME: Come up with a better indentation for #elif. 9164 verifyFormat( 9165 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 9166 " defined(BBBBBBBB)\n" 9167 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 9168 " defined(BBBBBBBB)\n" 9169 "#endif", 9170 getLLVMStyleWithColumns(65)); 9171 } 9172 9173 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 9174 FormatStyle AllowsMergedIf = getGoogleStyle(); 9175 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 9176 FormatStyle::SIS_WithoutElse; 9177 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 9178 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 9179 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 9180 EXPECT_EQ("if (true) return 42;", 9181 format("if (true)\nreturn 42;", AllowsMergedIf)); 9182 FormatStyle ShortMergedIf = AllowsMergedIf; 9183 ShortMergedIf.ColumnLimit = 25; 9184 verifyFormat("#define A \\\n" 9185 " if (true) return 42;", 9186 ShortMergedIf); 9187 verifyFormat("#define A \\\n" 9188 " f(); \\\n" 9189 " if (true)\n" 9190 "#define B", 9191 ShortMergedIf); 9192 verifyFormat("#define A \\\n" 9193 " f(); \\\n" 9194 " if (true)\n" 9195 "g();", 9196 ShortMergedIf); 9197 verifyFormat("{\n" 9198 "#ifdef A\n" 9199 " // Comment\n" 9200 " if (true) continue;\n" 9201 "#endif\n" 9202 " // Comment\n" 9203 " if (true) continue;\n" 9204 "}", 9205 ShortMergedIf); 9206 ShortMergedIf.ColumnLimit = 33; 9207 verifyFormat("#define A \\\n" 9208 " if constexpr (true) return 42;", 9209 ShortMergedIf); 9210 verifyFormat("#define A \\\n" 9211 " if CONSTEXPR (true) return 42;", 9212 ShortMergedIf); 9213 ShortMergedIf.ColumnLimit = 29; 9214 verifyFormat("#define A \\\n" 9215 " if (aaaaaaaaaa) return 1; \\\n" 9216 " return 2;", 9217 ShortMergedIf); 9218 ShortMergedIf.ColumnLimit = 28; 9219 verifyFormat("#define A \\\n" 9220 " if (aaaaaaaaaa) \\\n" 9221 " return 1; \\\n" 9222 " return 2;", 9223 ShortMergedIf); 9224 verifyFormat("#define A \\\n" 9225 " if constexpr (aaaaaaa) \\\n" 9226 " return 1; \\\n" 9227 " return 2;", 9228 ShortMergedIf); 9229 verifyFormat("#define A \\\n" 9230 " if CONSTEXPR (aaaaaaa) \\\n" 9231 " return 1; \\\n" 9232 " return 2;", 9233 ShortMergedIf); 9234 } 9235 9236 TEST_F(FormatTest, FormatStarDependingOnContext) { 9237 verifyFormat("void f(int *a);"); 9238 verifyFormat("void f() { f(fint * b); }"); 9239 verifyFormat("class A {\n void f(int *a);\n};"); 9240 verifyFormat("class A {\n int *a;\n};"); 9241 verifyFormat("namespace a {\n" 9242 "namespace b {\n" 9243 "class A {\n" 9244 " void f() {}\n" 9245 " int *a;\n" 9246 "};\n" 9247 "} // namespace b\n" 9248 "} // namespace a"); 9249 } 9250 9251 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 9252 verifyFormat("while"); 9253 verifyFormat("operator"); 9254 } 9255 9256 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 9257 // This code would be painfully slow to format if we didn't skip it. 9258 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 9259 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9260 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9261 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9262 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9263 "A(1, 1)\n" 9264 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 9265 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9266 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9267 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9268 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9269 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9270 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9271 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9272 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9273 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 9274 // Deeply nested part is untouched, rest is formatted. 9275 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 9276 format(std::string("int i;\n") + Code + "int j;\n", 9277 getLLVMStyle(), SC_ExpectIncomplete)); 9278 } 9279 9280 //===----------------------------------------------------------------------===// 9281 // Objective-C tests. 9282 //===----------------------------------------------------------------------===// 9283 9284 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 9285 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 9286 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 9287 format("-(NSUInteger)indexOfObject:(id)anObject;")); 9288 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 9289 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 9290 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 9291 format("-(NSInteger)Method3:(id)anObject;")); 9292 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 9293 format("-(NSInteger)Method4:(id)anObject;")); 9294 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 9295 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 9296 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 9297 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 9298 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9299 "forAllCells:(BOOL)flag;", 9300 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9301 "forAllCells:(BOOL)flag;")); 9302 9303 // Very long objectiveC method declaration. 9304 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 9305 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 9306 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 9307 " inRange:(NSRange)range\n" 9308 " outRange:(NSRange)out_range\n" 9309 " outRange1:(NSRange)out_range1\n" 9310 " outRange2:(NSRange)out_range2\n" 9311 " outRange3:(NSRange)out_range3\n" 9312 " outRange4:(NSRange)out_range4\n" 9313 " outRange5:(NSRange)out_range5\n" 9314 " outRange6:(NSRange)out_range6\n" 9315 " outRange7:(NSRange)out_range7\n" 9316 " outRange8:(NSRange)out_range8\n" 9317 " outRange9:(NSRange)out_range9;"); 9318 9319 // When the function name has to be wrapped. 9320 FormatStyle Style = getLLVMStyle(); 9321 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 9322 // and always indents instead. 9323 Style.IndentWrappedFunctionNames = false; 9324 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9325 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 9326 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 9327 "}", 9328 Style); 9329 Style.IndentWrappedFunctionNames = true; 9330 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9331 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 9332 " anotherName:(NSString)dddddddddddddd {\n" 9333 "}", 9334 Style); 9335 9336 verifyFormat("- (int)sum:(vector<int>)numbers;"); 9337 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 9338 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 9339 // protocol lists (but not for template classes): 9340 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 9341 9342 verifyFormat("- (int (*)())foo:(int (*)())f;"); 9343 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 9344 9345 // If there's no return type (very rare in practice!), LLVM and Google style 9346 // agree. 9347 verifyFormat("- foo;"); 9348 verifyFormat("- foo:(int)f;"); 9349 verifyGoogleFormat("- foo:(int)foo;"); 9350 } 9351 9352 TEST_F(FormatTest, BreaksStringLiterals) { 9353 EXPECT_EQ("\"some text \"\n" 9354 "\"other\";", 9355 format("\"some text other\";", getLLVMStyleWithColumns(12))); 9356 EXPECT_EQ("\"some text \"\n" 9357 "\"other\";", 9358 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 9359 EXPECT_EQ( 9360 "#define A \\\n" 9361 " \"some \" \\\n" 9362 " \"text \" \\\n" 9363 " \"other\";", 9364 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 9365 EXPECT_EQ( 9366 "#define A \\\n" 9367 " \"so \" \\\n" 9368 " \"text \" \\\n" 9369 " \"other\";", 9370 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 9371 9372 EXPECT_EQ("\"some text\"", 9373 format("\"some text\"", getLLVMStyleWithColumns(1))); 9374 EXPECT_EQ("\"some text\"", 9375 format("\"some text\"", getLLVMStyleWithColumns(11))); 9376 EXPECT_EQ("\"some \"\n" 9377 "\"text\"", 9378 format("\"some text\"", getLLVMStyleWithColumns(10))); 9379 EXPECT_EQ("\"some \"\n" 9380 "\"text\"", 9381 format("\"some text\"", getLLVMStyleWithColumns(7))); 9382 EXPECT_EQ("\"some\"\n" 9383 "\" tex\"\n" 9384 "\"t\"", 9385 format("\"some text\"", getLLVMStyleWithColumns(6))); 9386 EXPECT_EQ("\"some\"\n" 9387 "\" tex\"\n" 9388 "\" and\"", 9389 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 9390 EXPECT_EQ("\"some\"\n" 9391 "\"/tex\"\n" 9392 "\"/and\"", 9393 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 9394 9395 EXPECT_EQ("variable =\n" 9396 " \"long string \"\n" 9397 " \"literal\";", 9398 format("variable = \"long string literal\";", 9399 getLLVMStyleWithColumns(20))); 9400 9401 EXPECT_EQ("variable = f(\n" 9402 " \"long string \"\n" 9403 " \"literal\",\n" 9404 " short,\n" 9405 " loooooooooooooooooooong);", 9406 format("variable = f(\"long string literal\", short, " 9407 "loooooooooooooooooooong);", 9408 getLLVMStyleWithColumns(20))); 9409 9410 EXPECT_EQ( 9411 "f(g(\"long string \"\n" 9412 " \"literal\"),\n" 9413 " b);", 9414 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 9415 EXPECT_EQ("f(g(\"long string \"\n" 9416 " \"literal\",\n" 9417 " a),\n" 9418 " b);", 9419 format("f(g(\"long string literal\", a), b);", 9420 getLLVMStyleWithColumns(20))); 9421 EXPECT_EQ( 9422 "f(\"one two\".split(\n" 9423 " variable));", 9424 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 9425 EXPECT_EQ("f(\"one two three four five six \"\n" 9426 " \"seven\".split(\n" 9427 " really_looooong_variable));", 9428 format("f(\"one two three four five six seven\"." 9429 "split(really_looooong_variable));", 9430 getLLVMStyleWithColumns(33))); 9431 9432 EXPECT_EQ("f(\"some \"\n" 9433 " \"text\",\n" 9434 " other);", 9435 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 9436 9437 // Only break as a last resort. 9438 verifyFormat( 9439 "aaaaaaaaaaaaaaaaaaaa(\n" 9440 " aaaaaaaaaaaaaaaaaaaa,\n" 9441 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 9442 9443 EXPECT_EQ("\"splitmea\"\n" 9444 "\"trandomp\"\n" 9445 "\"oint\"", 9446 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 9447 9448 EXPECT_EQ("\"split/\"\n" 9449 "\"pathat/\"\n" 9450 "\"slashes\"", 9451 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9452 9453 EXPECT_EQ("\"split/\"\n" 9454 "\"pathat/\"\n" 9455 "\"slashes\"", 9456 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9457 EXPECT_EQ("\"split at \"\n" 9458 "\"spaces/at/\"\n" 9459 "\"slashes.at.any$\"\n" 9460 "\"non-alphanumeric%\"\n" 9461 "\"1111111111characte\"\n" 9462 "\"rs\"", 9463 format("\"split at " 9464 "spaces/at/" 9465 "slashes.at." 9466 "any$non-" 9467 "alphanumeric%" 9468 "1111111111characte" 9469 "rs\"", 9470 getLLVMStyleWithColumns(20))); 9471 9472 // Verify that splitting the strings understands 9473 // Style::AlwaysBreakBeforeMultilineStrings. 9474 EXPECT_EQ("aaaaaaaaaaaa(\n" 9475 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 9476 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 9477 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 9478 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9479 "aaaaaaaaaaaaaaaaaaaaaa\");", 9480 getGoogleStyle())); 9481 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9482 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9483 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9484 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9485 "aaaaaaaaaaaaaaaaaaaaaa\";", 9486 getGoogleStyle())); 9487 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9488 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9489 format("llvm::outs() << " 9490 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 9491 "aaaaaaaaaaaaaaaaaaa\";")); 9492 EXPECT_EQ("ffff(\n" 9493 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9494 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9495 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 9496 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9497 getGoogleStyle())); 9498 9499 FormatStyle Style = getLLVMStyleWithColumns(12); 9500 Style.BreakStringLiterals = false; 9501 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 9502 9503 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 9504 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9505 EXPECT_EQ("#define A \\\n" 9506 " \"some \" \\\n" 9507 " \"text \" \\\n" 9508 " \"other\";", 9509 format("#define A \"some text other\";", AlignLeft)); 9510 } 9511 9512 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 9513 EXPECT_EQ("C a = \"some more \"\n" 9514 " \"text\";", 9515 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9516 } 9517 9518 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9519 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9520 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9521 EXPECT_EQ("int i = a(b());", 9522 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9523 } 9524 9525 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9526 EXPECT_EQ( 9527 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9528 "(\n" 9529 " \"x\t\");", 9530 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9531 "aaaaaaa(" 9532 "\"x\t\");")); 9533 } 9534 9535 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9536 EXPECT_EQ( 9537 "u8\"utf8 string \"\n" 9538 "u8\"literal\";", 9539 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9540 EXPECT_EQ( 9541 "u\"utf16 string \"\n" 9542 "u\"literal\";", 9543 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9544 EXPECT_EQ( 9545 "U\"utf32 string \"\n" 9546 "U\"literal\";", 9547 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9548 EXPECT_EQ("L\"wide string \"\n" 9549 "L\"literal\";", 9550 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9551 EXPECT_EQ("@\"NSString \"\n" 9552 "@\"literal\";", 9553 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9554 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9555 9556 // This input makes clang-format try to split the incomplete unicode escape 9557 // sequence, which used to lead to a crasher. 9558 verifyNoCrash( 9559 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9560 getLLVMStyleWithColumns(60)); 9561 } 9562 9563 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9564 FormatStyle Style = getGoogleStyleWithColumns(15); 9565 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9566 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9567 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9568 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9569 EXPECT_EQ("u8R\"x(raw literal)x\";", 9570 format("u8R\"x(raw literal)x\";", Style)); 9571 } 9572 9573 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9574 FormatStyle Style = getLLVMStyleWithColumns(20); 9575 EXPECT_EQ( 9576 "_T(\"aaaaaaaaaaaaaa\")\n" 9577 "_T(\"aaaaaaaaaaaaaa\")\n" 9578 "_T(\"aaaaaaaaaaaa\")", 9579 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9580 EXPECT_EQ("f(x,\n" 9581 " _T(\"aaaaaaaaaaaa\")\n" 9582 " _T(\"aaa\"),\n" 9583 " z);", 9584 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9585 9586 // FIXME: Handle embedded spaces in one iteration. 9587 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9588 // "_T(\"aaaaaaaaaaaaa\")\n" 9589 // "_T(\"aaaaaaaaaaaaa\")\n" 9590 // "_T(\"a\")", 9591 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9592 // getLLVMStyleWithColumns(20))); 9593 EXPECT_EQ( 9594 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9595 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9596 EXPECT_EQ("f(\n" 9597 "#if !TEST\n" 9598 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9599 "#endif\n" 9600 ");", 9601 format("f(\n" 9602 "#if !TEST\n" 9603 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9604 "#endif\n" 9605 ");")); 9606 EXPECT_EQ("f(\n" 9607 "\n" 9608 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9609 format("f(\n" 9610 "\n" 9611 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9612 } 9613 9614 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9615 // In a function call with two operands, the second can be broken with no line 9616 // break before it. 9617 EXPECT_EQ( 9618 "func(a, \"long long \"\n" 9619 " \"long long\");", 9620 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 9621 // In a function call with three operands, the second must be broken with a 9622 // line break before it. 9623 EXPECT_EQ("func(a,\n" 9624 " \"long long long \"\n" 9625 " \"long\",\n" 9626 " c);", 9627 format("func(a, \"long long long long\", c);", 9628 getLLVMStyleWithColumns(24))); 9629 // In a function call with three operands, the third must be broken with a 9630 // line break before it. 9631 EXPECT_EQ("func(a, b,\n" 9632 " \"long long long \"\n" 9633 " \"long\");", 9634 format("func(a, b, \"long long long long\");", 9635 getLLVMStyleWithColumns(24))); 9636 // In a function call with three operands, both the second and the third must 9637 // be broken with a line break before them. 9638 EXPECT_EQ("func(a,\n" 9639 " \"long long long \"\n" 9640 " \"long\",\n" 9641 " \"long long long \"\n" 9642 " \"long\");", 9643 format("func(a, \"long long long long\", \"long long long long\");", 9644 getLLVMStyleWithColumns(24))); 9645 // In a chain of << with two operands, the second can be broken with no line 9646 // break before it. 9647 EXPECT_EQ("a << \"line line \"\n" 9648 " \"line\";", 9649 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 9650 // In a chain of << with three operands, the second can be broken with no line 9651 // break before it. 9652 EXPECT_EQ( 9653 "abcde << \"line \"\n" 9654 " \"line line\"\n" 9655 " << c;", 9656 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 9657 // In a chain of << with three operands, the third must be broken with a line 9658 // break before it. 9659 EXPECT_EQ( 9660 "a << b\n" 9661 " << \"line line \"\n" 9662 " \"line\";", 9663 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 9664 // In a chain of << with three operands, the second can be broken with no line 9665 // break before it and the third must be broken with a line break before it. 9666 EXPECT_EQ("abcd << \"line line \"\n" 9667 " \"line\"\n" 9668 " << \"line line \"\n" 9669 " \"line\";", 9670 format("abcd << \"line line line\" << \"line line line\";", 9671 getLLVMStyleWithColumns(20))); 9672 // In a chain of binary operators with two operands, the second can be broken 9673 // with no line break before it. 9674 EXPECT_EQ( 9675 "abcd + \"line line \"\n" 9676 " \"line line\";", 9677 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 9678 // In a chain of binary operators with three operands, the second must be 9679 // broken with a line break before it. 9680 EXPECT_EQ("abcd +\n" 9681 " \"line line \"\n" 9682 " \"line line\" +\n" 9683 " e;", 9684 format("abcd + \"line line line line\" + e;", 9685 getLLVMStyleWithColumns(20))); 9686 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9687 // the first must be broken with a line break before it. 9688 FormatStyle Style = getLLVMStyleWithColumns(25); 9689 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9690 EXPECT_EQ("someFunction(\n" 9691 " \"long long long \"\n" 9692 " \"long\",\n" 9693 " a);", 9694 format("someFunction(\"long long long long\", a);", Style)); 9695 } 9696 9697 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9698 EXPECT_EQ( 9699 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9702 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9703 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9705 } 9706 9707 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9708 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9709 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9710 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9711 "multiline raw string literal xxxxxxxxxxxxxx\n" 9712 ")x\",\n" 9713 " a),\n" 9714 " b);", 9715 format("fffffffffff(g(R\"x(\n" 9716 "multiline raw string literal xxxxxxxxxxxxxx\n" 9717 ")x\", a), b);", 9718 getGoogleStyleWithColumns(20))); 9719 EXPECT_EQ("fffffffffff(\n" 9720 " g(R\"x(qqq\n" 9721 "multiline raw string literal xxxxxxxxxxxxxx\n" 9722 ")x\",\n" 9723 " a),\n" 9724 " b);", 9725 format("fffffffffff(g(R\"x(qqq\n" 9726 "multiline raw string literal xxxxxxxxxxxxxx\n" 9727 ")x\", a), b);", 9728 getGoogleStyleWithColumns(20))); 9729 9730 EXPECT_EQ("fffffffffff(R\"x(\n" 9731 "multiline raw string literal xxxxxxxxxxxxxx\n" 9732 ")x\");", 9733 format("fffffffffff(R\"x(\n" 9734 "multiline raw string literal xxxxxxxxxxxxxx\n" 9735 ")x\");", 9736 getGoogleStyleWithColumns(20))); 9737 EXPECT_EQ("fffffffffff(R\"x(\n" 9738 "multiline raw string literal xxxxxxxxxxxxxx\n" 9739 ")x\" + bbbbbb);", 9740 format("fffffffffff(R\"x(\n" 9741 "multiline raw string literal xxxxxxxxxxxxxx\n" 9742 ")x\" + bbbbbb);", 9743 getGoogleStyleWithColumns(20))); 9744 EXPECT_EQ("fffffffffff(\n" 9745 " R\"x(\n" 9746 "multiline raw string literal xxxxxxxxxxxxxx\n" 9747 ")x\" +\n" 9748 " bbbbbb);", 9749 format("fffffffffff(\n" 9750 " R\"x(\n" 9751 "multiline raw string literal xxxxxxxxxxxxxx\n" 9752 ")x\" + bbbbbb);", 9753 getGoogleStyleWithColumns(20))); 9754 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9755 format("fffffffffff(\n" 9756 " R\"(single line raw string)\" + bbbbbb);")); 9757 } 9758 9759 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9760 verifyFormat("string a = \"unterminated;"); 9761 EXPECT_EQ("function(\"unterminated,\n" 9762 " OtherParameter);", 9763 format("function( \"unterminated,\n" 9764 " OtherParameter);")); 9765 } 9766 9767 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9768 FormatStyle Style = getLLVMStyle(); 9769 Style.Standard = FormatStyle::LS_Cpp03; 9770 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9771 format("#define x(_a) printf(\"foo\"_a);", Style)); 9772 } 9773 9774 TEST_F(FormatTest, CppLexVersion) { 9775 FormatStyle Style = getLLVMStyle(); 9776 // Formatting of x * y differs if x is a type. 9777 verifyFormat("void foo() { MACRO(a * b); }", Style); 9778 verifyFormat("void foo() { MACRO(int *b); }", Style); 9779 9780 // LLVM style uses latest lexer. 9781 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 9782 Style.Standard = FormatStyle::LS_Cpp17; 9783 // But in c++17, char8_t isn't a keyword. 9784 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 9785 } 9786 9787 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9788 9789 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9790 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9791 " \"ddeeefff\");", 9792 format("someFunction(\"aaabbbcccdddeeefff\");", 9793 getLLVMStyleWithColumns(25))); 9794 EXPECT_EQ("someFunction1234567890(\n" 9795 " \"aaabbbcccdddeeefff\");", 9796 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9797 getLLVMStyleWithColumns(26))); 9798 EXPECT_EQ("someFunction1234567890(\n" 9799 " \"aaabbbcccdddeeeff\"\n" 9800 " \"f\");", 9801 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9802 getLLVMStyleWithColumns(25))); 9803 EXPECT_EQ("someFunction1234567890(\n" 9804 " \"aaabbbcccdddeeeff\"\n" 9805 " \"f\");", 9806 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9807 getLLVMStyleWithColumns(24))); 9808 EXPECT_EQ("someFunction(\n" 9809 " \"aaabbbcc ddde \"\n" 9810 " \"efff\");", 9811 format("someFunction(\"aaabbbcc ddde efff\");", 9812 getLLVMStyleWithColumns(25))); 9813 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9814 " \"ddeeefff\");", 9815 format("someFunction(\"aaabbbccc ddeeefff\");", 9816 getLLVMStyleWithColumns(25))); 9817 EXPECT_EQ("someFunction1234567890(\n" 9818 " \"aaabb \"\n" 9819 " \"cccdddeeefff\");", 9820 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9821 getLLVMStyleWithColumns(25))); 9822 EXPECT_EQ("#define A \\\n" 9823 " string s = \\\n" 9824 " \"123456789\" \\\n" 9825 " \"0\"; \\\n" 9826 " int i;", 9827 format("#define A string s = \"1234567890\"; int i;", 9828 getLLVMStyleWithColumns(20))); 9829 EXPECT_EQ("someFunction(\n" 9830 " \"aaabbbcc \"\n" 9831 " \"dddeeefff\");", 9832 format("someFunction(\"aaabbbcc dddeeefff\");", 9833 getLLVMStyleWithColumns(25))); 9834 } 9835 9836 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9837 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9838 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9839 EXPECT_EQ("\"test\"\n" 9840 "\"\\n\"", 9841 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9842 EXPECT_EQ("\"tes\\\\\"\n" 9843 "\"n\"", 9844 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9845 EXPECT_EQ("\"\\\\\\\\\"\n" 9846 "\"\\n\"", 9847 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9848 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9849 EXPECT_EQ("\"\\uff01\"\n" 9850 "\"test\"", 9851 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9852 EXPECT_EQ("\"\\Uff01ff02\"", 9853 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9854 EXPECT_EQ("\"\\x000000000001\"\n" 9855 "\"next\"", 9856 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9857 EXPECT_EQ("\"\\x000000000001next\"", 9858 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9859 EXPECT_EQ("\"\\x000000000001\"", 9860 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9861 EXPECT_EQ("\"test\"\n" 9862 "\"\\000000\"\n" 9863 "\"000001\"", 9864 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9865 EXPECT_EQ("\"test\\000\"\n" 9866 "\"00000000\"\n" 9867 "\"1\"", 9868 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9869 } 9870 9871 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9872 verifyFormat("void f() {\n" 9873 " return g() {}\n" 9874 " void h() {}"); 9875 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9876 "g();\n" 9877 "}"); 9878 } 9879 9880 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9881 verifyFormat( 9882 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9883 } 9884 9885 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9886 verifyFormat("class X {\n" 9887 " void f() {\n" 9888 " }\n" 9889 "};", 9890 getLLVMStyleWithColumns(12)); 9891 } 9892 9893 TEST_F(FormatTest, ConfigurableIndentWidth) { 9894 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9895 EightIndent.IndentWidth = 8; 9896 EightIndent.ContinuationIndentWidth = 8; 9897 verifyFormat("void f() {\n" 9898 " someFunction();\n" 9899 " if (true) {\n" 9900 " f();\n" 9901 " }\n" 9902 "}", 9903 EightIndent); 9904 verifyFormat("class X {\n" 9905 " void f() {\n" 9906 " }\n" 9907 "};", 9908 EightIndent); 9909 verifyFormat("int x[] = {\n" 9910 " call(),\n" 9911 " call()};", 9912 EightIndent); 9913 } 9914 9915 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9916 verifyFormat("double\n" 9917 "f();", 9918 getLLVMStyleWithColumns(8)); 9919 } 9920 9921 TEST_F(FormatTest, ConfigurableUseOfTab) { 9922 FormatStyle Tab = getLLVMStyleWithColumns(42); 9923 Tab.IndentWidth = 8; 9924 Tab.UseTab = FormatStyle::UT_Always; 9925 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9926 9927 EXPECT_EQ("if (aaaaaaaa && // q\n" 9928 " bb)\t\t// w\n" 9929 "\t;", 9930 format("if (aaaaaaaa &&// q\n" 9931 "bb)// w\n" 9932 ";", 9933 Tab)); 9934 EXPECT_EQ("if (aaa && bbb) // w\n" 9935 "\t;", 9936 format("if(aaa&&bbb)// w\n" 9937 ";", 9938 Tab)); 9939 9940 verifyFormat("class X {\n" 9941 "\tvoid f() {\n" 9942 "\t\tsomeFunction(parameter1,\n" 9943 "\t\t\t parameter2);\n" 9944 "\t}\n" 9945 "};", 9946 Tab); 9947 verifyFormat("#define A \\\n" 9948 "\tvoid f() { \\\n" 9949 "\t\tsomeFunction( \\\n" 9950 "\t\t parameter1, \\\n" 9951 "\t\t parameter2); \\\n" 9952 "\t}", 9953 Tab); 9954 verifyFormat("int a;\t // x\n" 9955 "int bbbbbbbb; // x\n", 9956 Tab); 9957 9958 Tab.TabWidth = 4; 9959 Tab.IndentWidth = 8; 9960 verifyFormat("class TabWidth4Indent8 {\n" 9961 "\t\tvoid f() {\n" 9962 "\t\t\t\tsomeFunction(parameter1,\n" 9963 "\t\t\t\t\t\t\t parameter2);\n" 9964 "\t\t}\n" 9965 "};", 9966 Tab); 9967 9968 Tab.TabWidth = 4; 9969 Tab.IndentWidth = 4; 9970 verifyFormat("class TabWidth4Indent4 {\n" 9971 "\tvoid f() {\n" 9972 "\t\tsomeFunction(parameter1,\n" 9973 "\t\t\t\t\t parameter2);\n" 9974 "\t}\n" 9975 "};", 9976 Tab); 9977 9978 Tab.TabWidth = 8; 9979 Tab.IndentWidth = 4; 9980 verifyFormat("class TabWidth8Indent4 {\n" 9981 " void f() {\n" 9982 "\tsomeFunction(parameter1,\n" 9983 "\t\t parameter2);\n" 9984 " }\n" 9985 "};", 9986 Tab); 9987 9988 Tab.TabWidth = 8; 9989 Tab.IndentWidth = 8; 9990 EXPECT_EQ("/*\n" 9991 "\t a\t\tcomment\n" 9992 "\t in multiple lines\n" 9993 " */", 9994 format(" /*\t \t \n" 9995 " \t \t a\t\tcomment\t \t\n" 9996 " \t \t in multiple lines\t\n" 9997 " \t */", 9998 Tab)); 9999 10000 Tab.UseTab = FormatStyle::UT_ForIndentation; 10001 verifyFormat("{\n" 10002 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10003 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10004 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10005 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10006 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10007 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10008 "};", 10009 Tab); 10010 verifyFormat("enum AA {\n" 10011 "\ta1, // Force multiple lines\n" 10012 "\ta2,\n" 10013 "\ta3\n" 10014 "};", 10015 Tab); 10016 EXPECT_EQ("if (aaaaaaaa && // q\n" 10017 " bb) // w\n" 10018 "\t;", 10019 format("if (aaaaaaaa &&// q\n" 10020 "bb)// w\n" 10021 ";", 10022 Tab)); 10023 verifyFormat("class X {\n" 10024 "\tvoid f() {\n" 10025 "\t\tsomeFunction(parameter1,\n" 10026 "\t\t parameter2);\n" 10027 "\t}\n" 10028 "};", 10029 Tab); 10030 verifyFormat("{\n" 10031 "\tQ(\n" 10032 "\t {\n" 10033 "\t\t int a;\n" 10034 "\t\t someFunction(aaaaaaaa,\n" 10035 "\t\t bbbbbbb);\n" 10036 "\t },\n" 10037 "\t p);\n" 10038 "}", 10039 Tab); 10040 EXPECT_EQ("{\n" 10041 "\t/* aaaa\n" 10042 "\t bbbb */\n" 10043 "}", 10044 format("{\n" 10045 "/* aaaa\n" 10046 " bbbb */\n" 10047 "}", 10048 Tab)); 10049 EXPECT_EQ("{\n" 10050 "\t/*\n" 10051 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10052 "\t bbbbbbbbbbbbb\n" 10053 "\t*/\n" 10054 "}", 10055 format("{\n" 10056 "/*\n" 10057 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10058 "*/\n" 10059 "}", 10060 Tab)); 10061 EXPECT_EQ("{\n" 10062 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10063 "\t// bbbbbbbbbbbbb\n" 10064 "}", 10065 format("{\n" 10066 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10067 "}", 10068 Tab)); 10069 EXPECT_EQ("{\n" 10070 "\t/*\n" 10071 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10072 "\t bbbbbbbbbbbbb\n" 10073 "\t*/\n" 10074 "}", 10075 format("{\n" 10076 "\t/*\n" 10077 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10078 "\t*/\n" 10079 "}", 10080 Tab)); 10081 EXPECT_EQ("{\n" 10082 "\t/*\n" 10083 "\n" 10084 "\t*/\n" 10085 "}", 10086 format("{\n" 10087 "\t/*\n" 10088 "\n" 10089 "\t*/\n" 10090 "}", 10091 Tab)); 10092 EXPECT_EQ("{\n" 10093 "\t/*\n" 10094 " asdf\n" 10095 "\t*/\n" 10096 "}", 10097 format("{\n" 10098 "\t/*\n" 10099 " asdf\n" 10100 "\t*/\n" 10101 "}", 10102 Tab)); 10103 10104 Tab.UseTab = FormatStyle::UT_Never; 10105 EXPECT_EQ("/*\n" 10106 " a\t\tcomment\n" 10107 " in multiple lines\n" 10108 " */", 10109 format(" /*\t \t \n" 10110 " \t \t a\t\tcomment\t \t\n" 10111 " \t \t in multiple lines\t\n" 10112 " \t */", 10113 Tab)); 10114 EXPECT_EQ("/* some\n" 10115 " comment */", 10116 format(" \t \t /* some\n" 10117 " \t \t comment */", 10118 Tab)); 10119 EXPECT_EQ("int a; /* some\n" 10120 " comment */", 10121 format(" \t \t int a; /* some\n" 10122 " \t \t comment */", 10123 Tab)); 10124 10125 EXPECT_EQ("int a; /* some\n" 10126 "comment */", 10127 format(" \t \t int\ta; /* some\n" 10128 " \t \t comment */", 10129 Tab)); 10130 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10131 " comment */", 10132 format(" \t \t f(\"\t\t\"); /* some\n" 10133 " \t \t comment */", 10134 Tab)); 10135 EXPECT_EQ("{\n" 10136 " /*\n" 10137 " * Comment\n" 10138 " */\n" 10139 " int i;\n" 10140 "}", 10141 format("{\n" 10142 "\t/*\n" 10143 "\t * Comment\n" 10144 "\t */\n" 10145 "\t int i;\n" 10146 "}")); 10147 10148 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10149 Tab.TabWidth = 8; 10150 Tab.IndentWidth = 8; 10151 EXPECT_EQ("if (aaaaaaaa && // q\n" 10152 " bb) // w\n" 10153 "\t;", 10154 format("if (aaaaaaaa &&// q\n" 10155 "bb)// w\n" 10156 ";", 10157 Tab)); 10158 EXPECT_EQ("if (aaa && bbb) // w\n" 10159 "\t;", 10160 format("if(aaa&&bbb)// w\n" 10161 ";", 10162 Tab)); 10163 verifyFormat("class X {\n" 10164 "\tvoid f() {\n" 10165 "\t\tsomeFunction(parameter1,\n" 10166 "\t\t\t parameter2);\n" 10167 "\t}\n" 10168 "};", 10169 Tab); 10170 verifyFormat("#define A \\\n" 10171 "\tvoid f() { \\\n" 10172 "\t\tsomeFunction( \\\n" 10173 "\t\t parameter1, \\\n" 10174 "\t\t parameter2); \\\n" 10175 "\t}", 10176 Tab); 10177 Tab.TabWidth = 4; 10178 Tab.IndentWidth = 8; 10179 verifyFormat("class TabWidth4Indent8 {\n" 10180 "\t\tvoid f() {\n" 10181 "\t\t\t\tsomeFunction(parameter1,\n" 10182 "\t\t\t\t\t\t\t parameter2);\n" 10183 "\t\t}\n" 10184 "};", 10185 Tab); 10186 Tab.TabWidth = 4; 10187 Tab.IndentWidth = 4; 10188 verifyFormat("class TabWidth4Indent4 {\n" 10189 "\tvoid f() {\n" 10190 "\t\tsomeFunction(parameter1,\n" 10191 "\t\t\t\t\t parameter2);\n" 10192 "\t}\n" 10193 "};", 10194 Tab); 10195 Tab.TabWidth = 8; 10196 Tab.IndentWidth = 4; 10197 verifyFormat("class TabWidth8Indent4 {\n" 10198 " void f() {\n" 10199 "\tsomeFunction(parameter1,\n" 10200 "\t\t parameter2);\n" 10201 " }\n" 10202 "};", 10203 Tab); 10204 Tab.TabWidth = 8; 10205 Tab.IndentWidth = 8; 10206 EXPECT_EQ("/*\n" 10207 "\t a\t\tcomment\n" 10208 "\t in multiple lines\n" 10209 " */", 10210 format(" /*\t \t \n" 10211 " \t \t a\t\tcomment\t \t\n" 10212 " \t \t in multiple lines\t\n" 10213 " \t */", 10214 Tab)); 10215 verifyFormat("{\n" 10216 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10217 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10218 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10219 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10220 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10221 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10222 "};", 10223 Tab); 10224 verifyFormat("enum AA {\n" 10225 "\ta1, // Force multiple lines\n" 10226 "\ta2,\n" 10227 "\ta3\n" 10228 "};", 10229 Tab); 10230 EXPECT_EQ("if (aaaaaaaa && // q\n" 10231 " bb) // w\n" 10232 "\t;", 10233 format("if (aaaaaaaa &&// q\n" 10234 "bb)// w\n" 10235 ";", 10236 Tab)); 10237 verifyFormat("class X {\n" 10238 "\tvoid f() {\n" 10239 "\t\tsomeFunction(parameter1,\n" 10240 "\t\t\t parameter2);\n" 10241 "\t}\n" 10242 "};", 10243 Tab); 10244 verifyFormat("{\n" 10245 "\tQ(\n" 10246 "\t {\n" 10247 "\t\t int a;\n" 10248 "\t\t someFunction(aaaaaaaa,\n" 10249 "\t\t\t\t bbbbbbb);\n" 10250 "\t },\n" 10251 "\t p);\n" 10252 "}", 10253 Tab); 10254 EXPECT_EQ("{\n" 10255 "\t/* aaaa\n" 10256 "\t bbbb */\n" 10257 "}", 10258 format("{\n" 10259 "/* aaaa\n" 10260 " bbbb */\n" 10261 "}", 10262 Tab)); 10263 EXPECT_EQ("{\n" 10264 "\t/*\n" 10265 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10266 "\t bbbbbbbbbbbbb\n" 10267 "\t*/\n" 10268 "}", 10269 format("{\n" 10270 "/*\n" 10271 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10272 "*/\n" 10273 "}", 10274 Tab)); 10275 EXPECT_EQ("{\n" 10276 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10277 "\t// bbbbbbbbbbbbb\n" 10278 "}", 10279 format("{\n" 10280 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10281 "}", 10282 Tab)); 10283 EXPECT_EQ("{\n" 10284 "\t/*\n" 10285 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10286 "\t bbbbbbbbbbbbb\n" 10287 "\t*/\n" 10288 "}", 10289 format("{\n" 10290 "\t/*\n" 10291 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10292 "\t*/\n" 10293 "}", 10294 Tab)); 10295 EXPECT_EQ("{\n" 10296 "\t/*\n" 10297 "\n" 10298 "\t*/\n" 10299 "}", 10300 format("{\n" 10301 "\t/*\n" 10302 "\n" 10303 "\t*/\n" 10304 "}", 10305 Tab)); 10306 EXPECT_EQ("{\n" 10307 "\t/*\n" 10308 " asdf\n" 10309 "\t*/\n" 10310 "}", 10311 format("{\n" 10312 "\t/*\n" 10313 " asdf\n" 10314 "\t*/\n" 10315 "}", 10316 Tab)); 10317 EXPECT_EQ("/*\n" 10318 "\t a\t\tcomment\n" 10319 "\t in multiple lines\n" 10320 " */", 10321 format(" /*\t \t \n" 10322 " \t \t a\t\tcomment\t \t\n" 10323 " \t \t in multiple lines\t\n" 10324 " \t */", 10325 Tab)); 10326 EXPECT_EQ("/* some\n" 10327 " comment */", 10328 format(" \t \t /* some\n" 10329 " \t \t comment */", 10330 Tab)); 10331 EXPECT_EQ("int a; /* some\n" 10332 " comment */", 10333 format(" \t \t int a; /* some\n" 10334 " \t \t comment */", 10335 Tab)); 10336 EXPECT_EQ("int a; /* some\n" 10337 "comment */", 10338 format(" \t \t int\ta; /* some\n" 10339 " \t \t comment */", 10340 Tab)); 10341 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10342 " comment */", 10343 format(" \t \t f(\"\t\t\"); /* some\n" 10344 " \t \t comment */", 10345 Tab)); 10346 EXPECT_EQ("{\n" 10347 " /*\n" 10348 " * Comment\n" 10349 " */\n" 10350 " int i;\n" 10351 "}", 10352 format("{\n" 10353 "\t/*\n" 10354 "\t * Comment\n" 10355 "\t */\n" 10356 "\t int i;\n" 10357 "}")); 10358 Tab.AlignConsecutiveAssignments = true; 10359 Tab.AlignConsecutiveDeclarations = true; 10360 Tab.TabWidth = 4; 10361 Tab.IndentWidth = 4; 10362 verifyFormat("class Assign {\n" 10363 "\tvoid f() {\n" 10364 "\t\tint x = 123;\n" 10365 "\t\tint random = 4;\n" 10366 "\t\tstd::string alphabet =\n" 10367 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10368 "\t}\n" 10369 "};", 10370 Tab); 10371 } 10372 10373 TEST_F(FormatTest, ZeroTabWidth) { 10374 FormatStyle Tab = getLLVMStyleWithColumns(42); 10375 Tab.IndentWidth = 8; 10376 Tab.UseTab = FormatStyle::UT_Never; 10377 Tab.TabWidth = 0; 10378 EXPECT_EQ("void a(){\n" 10379 " // line starts with '\t'\n" 10380 "};", 10381 format("void a(){\n" 10382 "\t// line starts with '\t'\n" 10383 "};", 10384 Tab)); 10385 10386 EXPECT_EQ("void a(){\n" 10387 " // line starts with '\t'\n" 10388 "};", 10389 format("void a(){\n" 10390 "\t\t// line starts with '\t'\n" 10391 "};", 10392 Tab)); 10393 10394 Tab.UseTab = FormatStyle::UT_ForIndentation; 10395 EXPECT_EQ("void a(){\n" 10396 " // line starts with '\t'\n" 10397 "};", 10398 format("void a(){\n" 10399 "\t// line starts with '\t'\n" 10400 "};", 10401 Tab)); 10402 10403 EXPECT_EQ("void a(){\n" 10404 " // line starts with '\t'\n" 10405 "};", 10406 format("void a(){\n" 10407 "\t\t// line starts with '\t'\n" 10408 "};", 10409 Tab)); 10410 10411 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10412 EXPECT_EQ("void a(){\n" 10413 " // line starts with '\t'\n" 10414 "};", 10415 format("void a(){\n" 10416 "\t// line starts with '\t'\n" 10417 "};", 10418 Tab)); 10419 10420 EXPECT_EQ("void a(){\n" 10421 " // line starts with '\t'\n" 10422 "};", 10423 format("void a(){\n" 10424 "\t\t// line starts with '\t'\n" 10425 "};", 10426 Tab)); 10427 10428 Tab.UseTab = FormatStyle::UT_Always; 10429 EXPECT_EQ("void a(){\n" 10430 "// line starts with '\t'\n" 10431 "};", 10432 format("void a(){\n" 10433 "\t// line starts with '\t'\n" 10434 "};", 10435 Tab)); 10436 10437 EXPECT_EQ("void a(){\n" 10438 "// line starts with '\t'\n" 10439 "};", 10440 format("void a(){\n" 10441 "\t\t// line starts with '\t'\n" 10442 "};", 10443 Tab)); 10444 } 10445 10446 TEST_F(FormatTest, CalculatesOriginalColumn) { 10447 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10448 "q\"; /* some\n" 10449 " comment */", 10450 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10451 "q\"; /* some\n" 10452 " comment */", 10453 getLLVMStyle())); 10454 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10455 "/* some\n" 10456 " comment */", 10457 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10458 " /* some\n" 10459 " comment */", 10460 getLLVMStyle())); 10461 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10462 "qqq\n" 10463 "/* some\n" 10464 " comment */", 10465 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10466 "qqq\n" 10467 " /* some\n" 10468 " comment */", 10469 getLLVMStyle())); 10470 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10471 "wwww; /* some\n" 10472 " comment */", 10473 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10474 "wwww; /* some\n" 10475 " comment */", 10476 getLLVMStyle())); 10477 } 10478 10479 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 10480 FormatStyle NoSpace = getLLVMStyle(); 10481 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 10482 10483 verifyFormat("while(true)\n" 10484 " continue;", 10485 NoSpace); 10486 verifyFormat("for(;;)\n" 10487 " continue;", 10488 NoSpace); 10489 verifyFormat("if(true)\n" 10490 " f();\n" 10491 "else if(true)\n" 10492 " f();", 10493 NoSpace); 10494 verifyFormat("do {\n" 10495 " do_something();\n" 10496 "} while(something());", 10497 NoSpace); 10498 verifyFormat("switch(x) {\n" 10499 "default:\n" 10500 " break;\n" 10501 "}", 10502 NoSpace); 10503 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 10504 verifyFormat("size_t x = sizeof(x);", NoSpace); 10505 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 10506 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 10507 verifyFormat("alignas(128) char a[128];", NoSpace); 10508 verifyFormat("size_t x = alignof(MyType);", NoSpace); 10509 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 10510 verifyFormat("int f() throw(Deprecated);", NoSpace); 10511 verifyFormat("typedef void (*cb)(int);", NoSpace); 10512 verifyFormat("T A::operator()();", NoSpace); 10513 verifyFormat("X A::operator++(T);", NoSpace); 10514 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 10515 10516 FormatStyle Space = getLLVMStyle(); 10517 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 10518 10519 verifyFormat("int f ();", Space); 10520 verifyFormat("void f (int a, T b) {\n" 10521 " while (true)\n" 10522 " continue;\n" 10523 "}", 10524 Space); 10525 verifyFormat("if (true)\n" 10526 " f ();\n" 10527 "else if (true)\n" 10528 " f ();", 10529 Space); 10530 verifyFormat("do {\n" 10531 " do_something ();\n" 10532 "} while (something ());", 10533 Space); 10534 verifyFormat("switch (x) {\n" 10535 "default:\n" 10536 " break;\n" 10537 "}", 10538 Space); 10539 verifyFormat("A::A () : a (1) {}", Space); 10540 verifyFormat("void f () __attribute__ ((asdf));", Space); 10541 verifyFormat("*(&a + 1);\n" 10542 "&((&a)[1]);\n" 10543 "a[(b + c) * d];\n" 10544 "(((a + 1) * 2) + 3) * 4;", 10545 Space); 10546 verifyFormat("#define A(x) x", Space); 10547 verifyFormat("#define A (x) x", Space); 10548 verifyFormat("#if defined(x)\n" 10549 "#endif", 10550 Space); 10551 verifyFormat("auto i = std::make_unique<int> (5);", Space); 10552 verifyFormat("size_t x = sizeof (x);", Space); 10553 verifyFormat("auto f (int x) -> decltype (x);", Space); 10554 verifyFormat("int f (T x) noexcept (x.create ());", Space); 10555 verifyFormat("alignas (128) char a[128];", Space); 10556 verifyFormat("size_t x = alignof (MyType);", Space); 10557 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 10558 verifyFormat("int f () throw (Deprecated);", Space); 10559 verifyFormat("typedef void (*cb) (int);", Space); 10560 verifyFormat("T A::operator() ();", Space); 10561 verifyFormat("X A::operator++ (T);", Space); 10562 verifyFormat("auto lambda = [] () { return 0; };", Space); 10563 verifyFormat("int x = int (y);", Space); 10564 10565 FormatStyle SomeSpace = getLLVMStyle(); 10566 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 10567 10568 verifyFormat("[]() -> float {}", SomeSpace); 10569 verifyFormat("[] (auto foo) {}", SomeSpace); 10570 verifyFormat("[foo]() -> int {}", SomeSpace); 10571 verifyFormat("int f();", SomeSpace); 10572 verifyFormat("void f (int a, T b) {\n" 10573 " while (true)\n" 10574 " continue;\n" 10575 "}", 10576 SomeSpace); 10577 verifyFormat("if (true)\n" 10578 " f();\n" 10579 "else if (true)\n" 10580 " f();", 10581 SomeSpace); 10582 verifyFormat("do {\n" 10583 " do_something();\n" 10584 "} while (something());", 10585 SomeSpace); 10586 verifyFormat("switch (x) {\n" 10587 "default:\n" 10588 " break;\n" 10589 "}", 10590 SomeSpace); 10591 verifyFormat("A::A() : a (1) {}", SomeSpace); 10592 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 10593 verifyFormat("*(&a + 1);\n" 10594 "&((&a)[1]);\n" 10595 "a[(b + c) * d];\n" 10596 "(((a + 1) * 2) + 3) * 4;", 10597 SomeSpace); 10598 verifyFormat("#define A(x) x", SomeSpace); 10599 verifyFormat("#define A (x) x", SomeSpace); 10600 verifyFormat("#if defined(x)\n" 10601 "#endif", 10602 SomeSpace); 10603 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10604 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10605 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10606 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10607 verifyFormat("alignas (128) char a[128];", SomeSpace); 10608 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10609 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10610 SomeSpace); 10611 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10612 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10613 verifyFormat("T A::operator()();", SomeSpace); 10614 verifyFormat("X A::operator++ (T);", SomeSpace); 10615 verifyFormat("int x = int (y);", SomeSpace); 10616 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10617 } 10618 10619 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10620 FormatStyle Spaces = getLLVMStyle(); 10621 Spaces.SpaceAfterLogicalNot = true; 10622 10623 verifyFormat("bool x = ! y", Spaces); 10624 verifyFormat("if (! isFailure())", Spaces); 10625 verifyFormat("if (! (a && b))", Spaces); 10626 verifyFormat("\"Error!\"", Spaces); 10627 verifyFormat("! ! x", Spaces); 10628 } 10629 10630 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10631 FormatStyle Spaces = getLLVMStyle(); 10632 10633 Spaces.SpacesInParentheses = true; 10634 verifyFormat("do_something( ::globalVar );", Spaces); 10635 verifyFormat("call( x, y, z );", Spaces); 10636 verifyFormat("call();", Spaces); 10637 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10638 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10639 Spaces); 10640 verifyFormat("while ( (bool)1 )\n" 10641 " continue;", 10642 Spaces); 10643 verifyFormat("for ( ;; )\n" 10644 " continue;", 10645 Spaces); 10646 verifyFormat("if ( true )\n" 10647 " f();\n" 10648 "else if ( true )\n" 10649 " f();", 10650 Spaces); 10651 verifyFormat("do {\n" 10652 " do_something( (int)i );\n" 10653 "} while ( something() );", 10654 Spaces); 10655 verifyFormat("switch ( x ) {\n" 10656 "default:\n" 10657 " break;\n" 10658 "}", 10659 Spaces); 10660 10661 Spaces.SpacesInParentheses = false; 10662 Spaces.SpacesInCStyleCastParentheses = true; 10663 verifyFormat("Type *A = ( Type * )P;", Spaces); 10664 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 10665 verifyFormat("x = ( int32 )y;", Spaces); 10666 verifyFormat("int a = ( int )(2.0f);", Spaces); 10667 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 10668 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 10669 verifyFormat("#define x (( int )-1)", Spaces); 10670 10671 // Run the first set of tests again with: 10672 Spaces.SpacesInParentheses = false; 10673 Spaces.SpaceInEmptyParentheses = true; 10674 Spaces.SpacesInCStyleCastParentheses = true; 10675 verifyFormat("call(x, y, z);", Spaces); 10676 verifyFormat("call( );", Spaces); 10677 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10678 verifyFormat("while (( bool )1)\n" 10679 " continue;", 10680 Spaces); 10681 verifyFormat("for (;;)\n" 10682 " continue;", 10683 Spaces); 10684 verifyFormat("if (true)\n" 10685 " f( );\n" 10686 "else if (true)\n" 10687 " f( );", 10688 Spaces); 10689 verifyFormat("do {\n" 10690 " do_something(( int )i);\n" 10691 "} while (something( ));", 10692 Spaces); 10693 verifyFormat("switch (x) {\n" 10694 "default:\n" 10695 " break;\n" 10696 "}", 10697 Spaces); 10698 10699 // Run the first set of tests again with: 10700 Spaces.SpaceAfterCStyleCast = true; 10701 verifyFormat("call(x, y, z);", Spaces); 10702 verifyFormat("call( );", Spaces); 10703 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10704 verifyFormat("while (( bool ) 1)\n" 10705 " continue;", 10706 Spaces); 10707 verifyFormat("for (;;)\n" 10708 " continue;", 10709 Spaces); 10710 verifyFormat("if (true)\n" 10711 " f( );\n" 10712 "else if (true)\n" 10713 " f( );", 10714 Spaces); 10715 verifyFormat("do {\n" 10716 " do_something(( int ) i);\n" 10717 "} while (something( ));", 10718 Spaces); 10719 verifyFormat("switch (x) {\n" 10720 "default:\n" 10721 " break;\n" 10722 "}", 10723 Spaces); 10724 10725 // Run subset of tests again with: 10726 Spaces.SpacesInCStyleCastParentheses = false; 10727 Spaces.SpaceAfterCStyleCast = true; 10728 verifyFormat("while ((bool) 1)\n" 10729 " continue;", 10730 Spaces); 10731 verifyFormat("do {\n" 10732 " do_something((int) i);\n" 10733 "} while (something( ));", 10734 Spaces); 10735 } 10736 10737 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 10738 verifyFormat("int a[5];"); 10739 verifyFormat("a[3] += 42;"); 10740 10741 FormatStyle Spaces = getLLVMStyle(); 10742 Spaces.SpacesInSquareBrackets = true; 10743 // Not lambdas. 10744 verifyFormat("int a[ 5 ];", Spaces); 10745 verifyFormat("a[ 3 ] += 42;", Spaces); 10746 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 10747 verifyFormat("double &operator[](int i) { return 0; }\n" 10748 "int i;", 10749 Spaces); 10750 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 10751 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 10752 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 10753 // Lambdas. 10754 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 10755 verifyFormat("return [ i, args... ] {};", Spaces); 10756 verifyFormat("int foo = [ &bar ]() {};", Spaces); 10757 verifyFormat("int foo = [ = ]() {};", Spaces); 10758 verifyFormat("int foo = [ & ]() {};", Spaces); 10759 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 10760 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 10761 } 10762 10763 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 10764 FormatStyle NoSpaceStyle = getLLVMStyle(); 10765 verifyFormat("int a[5];", NoSpaceStyle); 10766 verifyFormat("a[3] += 42;", NoSpaceStyle); 10767 10768 verifyFormat("int a[1];", NoSpaceStyle); 10769 verifyFormat("int 1 [a];", NoSpaceStyle); 10770 verifyFormat("int a[1][2];", NoSpaceStyle); 10771 verifyFormat("a[7] = 5;", NoSpaceStyle); 10772 verifyFormat("int a = (f())[23];", NoSpaceStyle); 10773 verifyFormat("f([] {})", NoSpaceStyle); 10774 10775 FormatStyle Space = getLLVMStyle(); 10776 Space.SpaceBeforeSquareBrackets = true; 10777 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 10778 verifyFormat("return [i, args...] {};", Space); 10779 10780 verifyFormat("int a [5];", Space); 10781 verifyFormat("a [3] += 42;", Space); 10782 verifyFormat("constexpr char hello []{\"hello\"};", Space); 10783 verifyFormat("double &operator[](int i) { return 0; }\n" 10784 "int i;", 10785 Space); 10786 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 10787 verifyFormat("int i = a [a][a]->f();", Space); 10788 verifyFormat("int i = (*b) [a]->f();", Space); 10789 10790 verifyFormat("int a [1];", Space); 10791 verifyFormat("int 1 [a];", Space); 10792 verifyFormat("int a [1][2];", Space); 10793 verifyFormat("a [7] = 5;", Space); 10794 verifyFormat("int a = (f()) [23];", Space); 10795 verifyFormat("f([] {})", Space); 10796 } 10797 10798 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10799 verifyFormat("int a = 5;"); 10800 verifyFormat("a += 42;"); 10801 verifyFormat("a or_eq 8;"); 10802 10803 FormatStyle Spaces = getLLVMStyle(); 10804 Spaces.SpaceBeforeAssignmentOperators = false; 10805 verifyFormat("int a= 5;", Spaces); 10806 verifyFormat("a+= 42;", Spaces); 10807 verifyFormat("a or_eq 8;", Spaces); 10808 } 10809 10810 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10811 verifyFormat("class Foo : public Bar {};"); 10812 verifyFormat("Foo::Foo() : foo(1) {}"); 10813 verifyFormat("for (auto a : b) {\n}"); 10814 verifyFormat("int x = a ? b : c;"); 10815 verifyFormat("{\n" 10816 "label0:\n" 10817 " int x = 0;\n" 10818 "}"); 10819 verifyFormat("switch (x) {\n" 10820 "case 1:\n" 10821 "default:\n" 10822 "}"); 10823 10824 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10825 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10826 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10827 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10828 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10829 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10830 verifyFormat("{\n" 10831 "label1:\n" 10832 " int x = 0;\n" 10833 "}", 10834 CtorInitializerStyle); 10835 verifyFormat("switch (x) {\n" 10836 "case 1:\n" 10837 "default:\n" 10838 "}", 10839 CtorInitializerStyle); 10840 CtorInitializerStyle.BreakConstructorInitializers = 10841 FormatStyle::BCIS_AfterColon; 10842 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10843 " aaaaaaaaaaaaaaaa(1),\n" 10844 " bbbbbbbbbbbbbbbb(2) {}", 10845 CtorInitializerStyle); 10846 CtorInitializerStyle.BreakConstructorInitializers = 10847 FormatStyle::BCIS_BeforeComma; 10848 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10849 " : aaaaaaaaaaaaaaaa(1)\n" 10850 " , bbbbbbbbbbbbbbbb(2) {}", 10851 CtorInitializerStyle); 10852 CtorInitializerStyle.BreakConstructorInitializers = 10853 FormatStyle::BCIS_BeforeColon; 10854 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10855 " : aaaaaaaaaaaaaaaa(1),\n" 10856 " bbbbbbbbbbbbbbbb(2) {}", 10857 CtorInitializerStyle); 10858 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10859 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10860 ": aaaaaaaaaaaaaaaa(1),\n" 10861 " bbbbbbbbbbbbbbbb(2) {}", 10862 CtorInitializerStyle); 10863 10864 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10865 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10866 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10867 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10868 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10869 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10870 verifyFormat("{\n" 10871 "label2:\n" 10872 " int x = 0;\n" 10873 "}", 10874 InheritanceStyle); 10875 verifyFormat("switch (x) {\n" 10876 "case 1:\n" 10877 "default:\n" 10878 "}", 10879 InheritanceStyle); 10880 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10881 verifyFormat("class Foooooooooooooooooooooo:\n" 10882 " public aaaaaaaaaaaaaaaaaa,\n" 10883 " public bbbbbbbbbbbbbbbbbb {\n" 10884 "}", 10885 InheritanceStyle); 10886 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10887 verifyFormat("class Foooooooooooooooooooooo\n" 10888 " : public aaaaaaaaaaaaaaaaaa\n" 10889 " , public bbbbbbbbbbbbbbbbbb {\n" 10890 "}", 10891 InheritanceStyle); 10892 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10893 verifyFormat("class Foooooooooooooooooooooo\n" 10894 " : public aaaaaaaaaaaaaaaaaa,\n" 10895 " public bbbbbbbbbbbbbbbbbb {\n" 10896 "}", 10897 InheritanceStyle); 10898 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10899 verifyFormat("class Foooooooooooooooooooooo\n" 10900 ": public aaaaaaaaaaaaaaaaaa,\n" 10901 " public bbbbbbbbbbbbbbbbbb {}", 10902 InheritanceStyle); 10903 10904 FormatStyle ForLoopStyle = getLLVMStyle(); 10905 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10906 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10907 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10908 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10909 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10910 verifyFormat("{\n" 10911 "label2:\n" 10912 " int x = 0;\n" 10913 "}", 10914 ForLoopStyle); 10915 verifyFormat("switch (x) {\n" 10916 "case 1:\n" 10917 "default:\n" 10918 "}", 10919 ForLoopStyle); 10920 10921 FormatStyle NoSpaceStyle = getLLVMStyle(); 10922 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10923 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10924 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10925 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10926 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10927 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10928 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10929 verifyFormat("{\n" 10930 "label3:\n" 10931 " int x = 0;\n" 10932 "}", 10933 NoSpaceStyle); 10934 verifyFormat("switch (x) {\n" 10935 "case 1:\n" 10936 "default:\n" 10937 "}", 10938 NoSpaceStyle); 10939 } 10940 10941 TEST_F(FormatTest, AlignConsecutiveMacros) { 10942 FormatStyle Style = getLLVMStyle(); 10943 Style.AlignConsecutiveAssignments = true; 10944 Style.AlignConsecutiveDeclarations = true; 10945 Style.AlignConsecutiveMacros = false; 10946 10947 verifyFormat("#define a 3\n" 10948 "#define bbbb 4\n" 10949 "#define ccc (5)", 10950 Style); 10951 10952 verifyFormat("#define f(x) (x * x)\n" 10953 "#define fff(x, y, z) (x * y + z)\n" 10954 "#define ffff(x, y) (x - y)", 10955 Style); 10956 10957 verifyFormat("#define foo(x, y) (x + y)\n" 10958 "#define bar (5, 6)(2 + 2)", 10959 Style); 10960 10961 verifyFormat("#define a 3\n" 10962 "#define bbbb 4\n" 10963 "#define ccc (5)\n" 10964 "#define f(x) (x * x)\n" 10965 "#define fff(x, y, z) (x * y + z)\n" 10966 "#define ffff(x, y) (x - y)", 10967 Style); 10968 10969 Style.AlignConsecutiveMacros = true; 10970 verifyFormat("#define a 3\n" 10971 "#define bbbb 4\n" 10972 "#define ccc (5)", 10973 Style); 10974 10975 verifyFormat("#define f(x) (x * x)\n" 10976 "#define fff(x, y, z) (x * y + z)\n" 10977 "#define ffff(x, y) (x - y)", 10978 Style); 10979 10980 verifyFormat("#define foo(x, y) (x + y)\n" 10981 "#define bar (5, 6)(2 + 2)", 10982 Style); 10983 10984 verifyFormat("#define a 3\n" 10985 "#define bbbb 4\n" 10986 "#define ccc (5)\n" 10987 "#define f(x) (x * x)\n" 10988 "#define fff(x, y, z) (x * y + z)\n" 10989 "#define ffff(x, y) (x - y)", 10990 Style); 10991 10992 verifyFormat("#define a 5\n" 10993 "#define foo(x, y) (x + y)\n" 10994 "#define CCC (6)\n" 10995 "auto lambda = []() {\n" 10996 " auto ii = 0;\n" 10997 " float j = 0;\n" 10998 " return 0;\n" 10999 "};\n" 11000 "int i = 0;\n" 11001 "float i2 = 0;\n" 11002 "auto v = type{\n" 11003 " i = 1, //\n" 11004 " (i = 2), //\n" 11005 " i = 3 //\n" 11006 "};", 11007 Style); 11008 11009 Style.AlignConsecutiveMacros = false; 11010 Style.ColumnLimit = 20; 11011 11012 verifyFormat("#define a \\\n" 11013 " \"aabbbbbbbbbbbb\"\n" 11014 "#define D \\\n" 11015 " \"aabbbbbbbbbbbb\" \\\n" 11016 " \"ccddeeeeeeeee\"\n" 11017 "#define B \\\n" 11018 " \"QQQQQQQQQQQQQ\" \\\n" 11019 " \"FFFFFFFFFFFFF\" \\\n" 11020 " \"LLLLLLLL\"\n", 11021 Style); 11022 11023 Style.AlignConsecutiveMacros = true; 11024 verifyFormat("#define a \\\n" 11025 " \"aabbbbbbbbbbbb\"\n" 11026 "#define D \\\n" 11027 " \"aabbbbbbbbbbbb\" \\\n" 11028 " \"ccddeeeeeeeee\"\n" 11029 "#define B \\\n" 11030 " \"QQQQQQQQQQQQQ\" \\\n" 11031 " \"FFFFFFFFFFFFF\" \\\n" 11032 " \"LLLLLLLL\"\n", 11033 Style); 11034 } 11035 11036 TEST_F(FormatTest, AlignConsecutiveAssignments) { 11037 FormatStyle Alignment = getLLVMStyle(); 11038 Alignment.AlignConsecutiveMacros = true; 11039 Alignment.AlignConsecutiveAssignments = false; 11040 verifyFormat("int a = 5;\n" 11041 "int oneTwoThree = 123;", 11042 Alignment); 11043 verifyFormat("int a = 5;\n" 11044 "int oneTwoThree = 123;", 11045 Alignment); 11046 11047 Alignment.AlignConsecutiveAssignments = true; 11048 verifyFormat("int a = 5;\n" 11049 "int oneTwoThree = 123;", 11050 Alignment); 11051 verifyFormat("int a = method();\n" 11052 "int oneTwoThree = 133;", 11053 Alignment); 11054 verifyFormat("a &= 5;\n" 11055 "bcd *= 5;\n" 11056 "ghtyf += 5;\n" 11057 "dvfvdb -= 5;\n" 11058 "a /= 5;\n" 11059 "vdsvsv %= 5;\n" 11060 "sfdbddfbdfbb ^= 5;\n" 11061 "dvsdsv |= 5;\n" 11062 "int dsvvdvsdvvv = 123;", 11063 Alignment); 11064 verifyFormat("int i = 1, j = 10;\n" 11065 "something = 2000;", 11066 Alignment); 11067 verifyFormat("something = 2000;\n" 11068 "int i = 1, j = 10;\n", 11069 Alignment); 11070 verifyFormat("something = 2000;\n" 11071 "another = 911;\n" 11072 "int i = 1, j = 10;\n" 11073 "oneMore = 1;\n" 11074 "i = 2;", 11075 Alignment); 11076 verifyFormat("int a = 5;\n" 11077 "int one = 1;\n" 11078 "method();\n" 11079 "int oneTwoThree = 123;\n" 11080 "int oneTwo = 12;", 11081 Alignment); 11082 verifyFormat("int oneTwoThree = 123;\n" 11083 "int oneTwo = 12;\n" 11084 "method();\n", 11085 Alignment); 11086 verifyFormat("int oneTwoThree = 123; // comment\n" 11087 "int oneTwo = 12; // comment", 11088 Alignment); 11089 EXPECT_EQ("int a = 5;\n" 11090 "\n" 11091 "int oneTwoThree = 123;", 11092 format("int a = 5;\n" 11093 "\n" 11094 "int oneTwoThree= 123;", 11095 Alignment)); 11096 EXPECT_EQ("int a = 5;\n" 11097 "int one = 1;\n" 11098 "\n" 11099 "int oneTwoThree = 123;", 11100 format("int a = 5;\n" 11101 "int one = 1;\n" 11102 "\n" 11103 "int oneTwoThree = 123;", 11104 Alignment)); 11105 EXPECT_EQ("int a = 5;\n" 11106 "int one = 1;\n" 11107 "\n" 11108 "int oneTwoThree = 123;\n" 11109 "int oneTwo = 12;", 11110 format("int a = 5;\n" 11111 "int one = 1;\n" 11112 "\n" 11113 "int oneTwoThree = 123;\n" 11114 "int oneTwo = 12;", 11115 Alignment)); 11116 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11117 verifyFormat("#define A \\\n" 11118 " int aaaa = 12; \\\n" 11119 " int b = 23; \\\n" 11120 " int ccc = 234; \\\n" 11121 " int dddddddddd = 2345;", 11122 Alignment); 11123 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11124 verifyFormat("#define A \\\n" 11125 " int aaaa = 12; \\\n" 11126 " int b = 23; \\\n" 11127 " int ccc = 234; \\\n" 11128 " int dddddddddd = 2345;", 11129 Alignment); 11130 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11131 verifyFormat("#define A " 11132 " \\\n" 11133 " int aaaa = 12; " 11134 " \\\n" 11135 " int b = 23; " 11136 " \\\n" 11137 " int ccc = 234; " 11138 " \\\n" 11139 " int dddddddddd = 2345;", 11140 Alignment); 11141 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11142 "k = 4, int l = 5,\n" 11143 " int m = 6) {\n" 11144 " int j = 10;\n" 11145 " otherThing = 1;\n" 11146 "}", 11147 Alignment); 11148 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11149 " int i = 1;\n" 11150 " int j = 2;\n" 11151 " int big = 10000;\n" 11152 "}", 11153 Alignment); 11154 verifyFormat("class C {\n" 11155 "public:\n" 11156 " int i = 1;\n" 11157 " virtual void f() = 0;\n" 11158 "};", 11159 Alignment); 11160 verifyFormat("int i = 1;\n" 11161 "if (SomeType t = getSomething()) {\n" 11162 "}\n" 11163 "int j = 2;\n" 11164 "int big = 10000;", 11165 Alignment); 11166 verifyFormat("int j = 7;\n" 11167 "for (int k = 0; k < N; ++k) {\n" 11168 "}\n" 11169 "int j = 2;\n" 11170 "int big = 10000;\n" 11171 "}", 11172 Alignment); 11173 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11174 verifyFormat("int i = 1;\n" 11175 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11176 " = someLooooooooooooooooongFunction();\n" 11177 "int j = 2;", 11178 Alignment); 11179 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11180 verifyFormat("int i = 1;\n" 11181 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11182 " someLooooooooooooooooongFunction();\n" 11183 "int j = 2;", 11184 Alignment); 11185 11186 verifyFormat("auto lambda = []() {\n" 11187 " auto i = 0;\n" 11188 " return 0;\n" 11189 "};\n" 11190 "int i = 0;\n" 11191 "auto v = type{\n" 11192 " i = 1, //\n" 11193 " (i = 2), //\n" 11194 " i = 3 //\n" 11195 "};", 11196 Alignment); 11197 11198 verifyFormat( 11199 "int i = 1;\n" 11200 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11201 " loooooooooooooooooooooongParameterB);\n" 11202 "int j = 2;", 11203 Alignment); 11204 11205 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 11206 " typename B = very_long_type_name_1,\n" 11207 " typename T_2 = very_long_type_name_2>\n" 11208 "auto foo() {}\n", 11209 Alignment); 11210 verifyFormat("int a, b = 1;\n" 11211 "int c = 2;\n" 11212 "int dd = 3;\n", 11213 Alignment); 11214 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11215 "float b[1][] = {{3.f}};\n", 11216 Alignment); 11217 verifyFormat("for (int i = 0; i < 1; i++)\n" 11218 " int x = 1;\n", 11219 Alignment); 11220 verifyFormat("for (i = 0; i < 1; i++)\n" 11221 " x = 1;\n" 11222 "y = 1;\n", 11223 Alignment); 11224 } 11225 11226 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 11227 FormatStyle Alignment = getLLVMStyle(); 11228 Alignment.AlignConsecutiveMacros = true; 11229 Alignment.AlignConsecutiveDeclarations = false; 11230 verifyFormat("float const a = 5;\n" 11231 "int oneTwoThree = 123;", 11232 Alignment); 11233 verifyFormat("int a = 5;\n" 11234 "float const oneTwoThree = 123;", 11235 Alignment); 11236 11237 Alignment.AlignConsecutiveDeclarations = true; 11238 verifyFormat("float const a = 5;\n" 11239 "int oneTwoThree = 123;", 11240 Alignment); 11241 verifyFormat("int a = method();\n" 11242 "float const oneTwoThree = 133;", 11243 Alignment); 11244 verifyFormat("int i = 1, j = 10;\n" 11245 "something = 2000;", 11246 Alignment); 11247 verifyFormat("something = 2000;\n" 11248 "int i = 1, j = 10;\n", 11249 Alignment); 11250 verifyFormat("float something = 2000;\n" 11251 "double another = 911;\n" 11252 "int i = 1, j = 10;\n" 11253 "const int *oneMore = 1;\n" 11254 "unsigned i = 2;", 11255 Alignment); 11256 verifyFormat("float a = 5;\n" 11257 "int one = 1;\n" 11258 "method();\n" 11259 "const double oneTwoThree = 123;\n" 11260 "const unsigned int oneTwo = 12;", 11261 Alignment); 11262 verifyFormat("int oneTwoThree{0}; // comment\n" 11263 "unsigned oneTwo; // comment", 11264 Alignment); 11265 EXPECT_EQ("float const a = 5;\n" 11266 "\n" 11267 "int oneTwoThree = 123;", 11268 format("float const a = 5;\n" 11269 "\n" 11270 "int oneTwoThree= 123;", 11271 Alignment)); 11272 EXPECT_EQ("float a = 5;\n" 11273 "int one = 1;\n" 11274 "\n" 11275 "unsigned oneTwoThree = 123;", 11276 format("float a = 5;\n" 11277 "int one = 1;\n" 11278 "\n" 11279 "unsigned oneTwoThree = 123;", 11280 Alignment)); 11281 EXPECT_EQ("float a = 5;\n" 11282 "int one = 1;\n" 11283 "\n" 11284 "unsigned oneTwoThree = 123;\n" 11285 "int oneTwo = 12;", 11286 format("float a = 5;\n" 11287 "int one = 1;\n" 11288 "\n" 11289 "unsigned oneTwoThree = 123;\n" 11290 "int oneTwo = 12;", 11291 Alignment)); 11292 // Function prototype alignment 11293 verifyFormat("int a();\n" 11294 "double b();", 11295 Alignment); 11296 verifyFormat("int a(int x);\n" 11297 "double b();", 11298 Alignment); 11299 unsigned OldColumnLimit = Alignment.ColumnLimit; 11300 // We need to set ColumnLimit to zero, in order to stress nested alignments, 11301 // otherwise the function parameters will be re-flowed onto a single line. 11302 Alignment.ColumnLimit = 0; 11303 EXPECT_EQ("int a(int x,\n" 11304 " float y);\n" 11305 "double b(int x,\n" 11306 " double y);", 11307 format("int a(int x,\n" 11308 " float y);\n" 11309 "double b(int x,\n" 11310 " double y);", 11311 Alignment)); 11312 // This ensures that function parameters of function declarations are 11313 // correctly indented when their owning functions are indented. 11314 // The failure case here is for 'double y' to not be indented enough. 11315 EXPECT_EQ("double a(int x);\n" 11316 "int b(int y,\n" 11317 " double z);", 11318 format("double a(int x);\n" 11319 "int b(int y,\n" 11320 " double z);", 11321 Alignment)); 11322 // Set ColumnLimit low so that we induce wrapping immediately after 11323 // the function name and opening paren. 11324 Alignment.ColumnLimit = 13; 11325 verifyFormat("int function(\n" 11326 " int x,\n" 11327 " bool y);", 11328 Alignment); 11329 Alignment.ColumnLimit = OldColumnLimit; 11330 // Ensure function pointers don't screw up recursive alignment 11331 verifyFormat("int a(int x, void (*fp)(int y));\n" 11332 "double b();", 11333 Alignment); 11334 Alignment.AlignConsecutiveAssignments = true; 11335 // Ensure recursive alignment is broken by function braces, so that the 11336 // "a = 1" does not align with subsequent assignments inside the function 11337 // body. 11338 verifyFormat("int func(int a = 1) {\n" 11339 " int b = 2;\n" 11340 " int cc = 3;\n" 11341 "}", 11342 Alignment); 11343 verifyFormat("float something = 2000;\n" 11344 "double another = 911;\n" 11345 "int i = 1, j = 10;\n" 11346 "const int *oneMore = 1;\n" 11347 "unsigned i = 2;", 11348 Alignment); 11349 verifyFormat("int oneTwoThree = {0}; // comment\n" 11350 "unsigned oneTwo = 0; // comment", 11351 Alignment); 11352 // Make sure that scope is correctly tracked, in the absence of braces 11353 verifyFormat("for (int i = 0; i < n; i++)\n" 11354 " j = i;\n" 11355 "double x = 1;\n", 11356 Alignment); 11357 verifyFormat("if (int i = 0)\n" 11358 " j = i;\n" 11359 "double x = 1;\n", 11360 Alignment); 11361 // Ensure operator[] and operator() are comprehended 11362 verifyFormat("struct test {\n" 11363 " long long int foo();\n" 11364 " int operator[](int a);\n" 11365 " double bar();\n" 11366 "};\n", 11367 Alignment); 11368 verifyFormat("struct test {\n" 11369 " long long int foo();\n" 11370 " int operator()(int a);\n" 11371 " double bar();\n" 11372 "};\n", 11373 Alignment); 11374 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 11375 " int const i = 1;\n" 11376 " int * j = 2;\n" 11377 " int big = 10000;\n" 11378 "\n" 11379 " unsigned oneTwoThree = 123;\n" 11380 " int oneTwo = 12;\n" 11381 " method();\n" 11382 " float k = 2;\n" 11383 " int ll = 10000;\n" 11384 "}", 11385 format("void SomeFunction(int parameter= 0) {\n" 11386 " int const i= 1;\n" 11387 " int *j=2;\n" 11388 " int big = 10000;\n" 11389 "\n" 11390 "unsigned oneTwoThree =123;\n" 11391 "int oneTwo = 12;\n" 11392 " method();\n" 11393 "float k= 2;\n" 11394 "int ll=10000;\n" 11395 "}", 11396 Alignment)); 11397 Alignment.AlignConsecutiveAssignments = false; 11398 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11399 verifyFormat("#define A \\\n" 11400 " int aaaa = 12; \\\n" 11401 " float b = 23; \\\n" 11402 " const int ccc = 234; \\\n" 11403 " unsigned dddddddddd = 2345;", 11404 Alignment); 11405 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11406 verifyFormat("#define A \\\n" 11407 " int aaaa = 12; \\\n" 11408 " float b = 23; \\\n" 11409 " const int ccc = 234; \\\n" 11410 " unsigned dddddddddd = 2345;", 11411 Alignment); 11412 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11413 Alignment.ColumnLimit = 30; 11414 verifyFormat("#define A \\\n" 11415 " int aaaa = 12; \\\n" 11416 " float b = 23; \\\n" 11417 " const int ccc = 234; \\\n" 11418 " int dddddddddd = 2345;", 11419 Alignment); 11420 Alignment.ColumnLimit = 80; 11421 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11422 "k = 4, int l = 5,\n" 11423 " int m = 6) {\n" 11424 " const int j = 10;\n" 11425 " otherThing = 1;\n" 11426 "}", 11427 Alignment); 11428 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11429 " int const i = 1;\n" 11430 " int * j = 2;\n" 11431 " int big = 10000;\n" 11432 "}", 11433 Alignment); 11434 verifyFormat("class C {\n" 11435 "public:\n" 11436 " int i = 1;\n" 11437 " virtual void f() = 0;\n" 11438 "};", 11439 Alignment); 11440 verifyFormat("float i = 1;\n" 11441 "if (SomeType t = getSomething()) {\n" 11442 "}\n" 11443 "const unsigned j = 2;\n" 11444 "int big = 10000;", 11445 Alignment); 11446 verifyFormat("float j = 7;\n" 11447 "for (int k = 0; k < N; ++k) {\n" 11448 "}\n" 11449 "unsigned j = 2;\n" 11450 "int big = 10000;\n" 11451 "}", 11452 Alignment); 11453 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11454 verifyFormat("float i = 1;\n" 11455 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11456 " = someLooooooooooooooooongFunction();\n" 11457 "int j = 2;", 11458 Alignment); 11459 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11460 verifyFormat("int i = 1;\n" 11461 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11462 " someLooooooooooooooooongFunction();\n" 11463 "int j = 2;", 11464 Alignment); 11465 11466 Alignment.AlignConsecutiveAssignments = true; 11467 verifyFormat("auto lambda = []() {\n" 11468 " auto ii = 0;\n" 11469 " float j = 0;\n" 11470 " return 0;\n" 11471 "};\n" 11472 "int i = 0;\n" 11473 "float i2 = 0;\n" 11474 "auto v = type{\n" 11475 " i = 1, //\n" 11476 " (i = 2), //\n" 11477 " i = 3 //\n" 11478 "};", 11479 Alignment); 11480 Alignment.AlignConsecutiveAssignments = false; 11481 11482 verifyFormat( 11483 "int i = 1;\n" 11484 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11485 " loooooooooooooooooooooongParameterB);\n" 11486 "int j = 2;", 11487 Alignment); 11488 11489 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 11490 // We expect declarations and assignments to align, as long as it doesn't 11491 // exceed the column limit, starting a new alignment sequence whenever it 11492 // happens. 11493 Alignment.AlignConsecutiveAssignments = true; 11494 Alignment.ColumnLimit = 30; 11495 verifyFormat("float ii = 1;\n" 11496 "unsigned j = 2;\n" 11497 "int someVerylongVariable = 1;\n" 11498 "AnotherLongType ll = 123456;\n" 11499 "VeryVeryLongType k = 2;\n" 11500 "int myvar = 1;", 11501 Alignment); 11502 Alignment.ColumnLimit = 80; 11503 Alignment.AlignConsecutiveAssignments = false; 11504 11505 verifyFormat( 11506 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 11507 " typename LongType, typename B>\n" 11508 "auto foo() {}\n", 11509 Alignment); 11510 verifyFormat("float a, b = 1;\n" 11511 "int c = 2;\n" 11512 "int dd = 3;\n", 11513 Alignment); 11514 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11515 "float b[1][] = {{3.f}};\n", 11516 Alignment); 11517 Alignment.AlignConsecutiveAssignments = true; 11518 verifyFormat("float a, b = 1;\n" 11519 "int c = 2;\n" 11520 "int dd = 3;\n", 11521 Alignment); 11522 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11523 "float b[1][] = {{3.f}};\n", 11524 Alignment); 11525 Alignment.AlignConsecutiveAssignments = false; 11526 11527 Alignment.ColumnLimit = 30; 11528 Alignment.BinPackParameters = false; 11529 verifyFormat("void foo(float a,\n" 11530 " float b,\n" 11531 " int c,\n" 11532 " uint32_t *d) {\n" 11533 " int * e = 0;\n" 11534 " float f = 0;\n" 11535 " double g = 0;\n" 11536 "}\n" 11537 "void bar(ino_t a,\n" 11538 " int b,\n" 11539 " uint32_t *c,\n" 11540 " bool d) {}\n", 11541 Alignment); 11542 Alignment.BinPackParameters = true; 11543 Alignment.ColumnLimit = 80; 11544 11545 // Bug 33507 11546 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 11547 verifyFormat( 11548 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 11549 " static const Version verVs2017;\n" 11550 " return true;\n" 11551 "});\n", 11552 Alignment); 11553 Alignment.PointerAlignment = FormatStyle::PAS_Right; 11554 11555 // See llvm.org/PR35641 11556 Alignment.AlignConsecutiveDeclarations = true; 11557 verifyFormat("int func() { //\n" 11558 " int b;\n" 11559 " unsigned c;\n" 11560 "}", 11561 Alignment); 11562 11563 // See PR37175 11564 FormatStyle Style = getMozillaStyle(); 11565 Style.AlignConsecutiveDeclarations = true; 11566 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 11567 "foo(int a);", 11568 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 11569 } 11570 11571 TEST_F(FormatTest, LinuxBraceBreaking) { 11572 FormatStyle LinuxBraceStyle = getLLVMStyle(); 11573 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 11574 verifyFormat("namespace a\n" 11575 "{\n" 11576 "class A\n" 11577 "{\n" 11578 " void f()\n" 11579 " {\n" 11580 " if (true) {\n" 11581 " a();\n" 11582 " b();\n" 11583 " } else {\n" 11584 " a();\n" 11585 " }\n" 11586 " }\n" 11587 " void g() { return; }\n" 11588 "};\n" 11589 "struct B {\n" 11590 " int x;\n" 11591 "};\n" 11592 "} // namespace a\n", 11593 LinuxBraceStyle); 11594 verifyFormat("enum X {\n" 11595 " Y = 0,\n" 11596 "}\n", 11597 LinuxBraceStyle); 11598 verifyFormat("struct S {\n" 11599 " int Type;\n" 11600 " union {\n" 11601 " int x;\n" 11602 " double y;\n" 11603 " } Value;\n" 11604 " class C\n" 11605 " {\n" 11606 " MyFavoriteType Value;\n" 11607 " } Class;\n" 11608 "}\n", 11609 LinuxBraceStyle); 11610 } 11611 11612 TEST_F(FormatTest, MozillaBraceBreaking) { 11613 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11614 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11615 MozillaBraceStyle.FixNamespaceComments = false; 11616 verifyFormat("namespace a {\n" 11617 "class A\n" 11618 "{\n" 11619 " void f()\n" 11620 " {\n" 11621 " if (true) {\n" 11622 " a();\n" 11623 " b();\n" 11624 " }\n" 11625 " }\n" 11626 " void g() { return; }\n" 11627 "};\n" 11628 "enum E\n" 11629 "{\n" 11630 " A,\n" 11631 " // foo\n" 11632 " B,\n" 11633 " C\n" 11634 "};\n" 11635 "struct B\n" 11636 "{\n" 11637 " int x;\n" 11638 "};\n" 11639 "}\n", 11640 MozillaBraceStyle); 11641 verifyFormat("struct S\n" 11642 "{\n" 11643 " int Type;\n" 11644 " union\n" 11645 " {\n" 11646 " int x;\n" 11647 " double y;\n" 11648 " } Value;\n" 11649 " class C\n" 11650 " {\n" 11651 " MyFavoriteType Value;\n" 11652 " } Class;\n" 11653 "}\n", 11654 MozillaBraceStyle); 11655 } 11656 11657 TEST_F(FormatTest, StroustrupBraceBreaking) { 11658 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11659 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11660 verifyFormat("namespace a {\n" 11661 "class A {\n" 11662 " void f()\n" 11663 " {\n" 11664 " if (true) {\n" 11665 " a();\n" 11666 " b();\n" 11667 " }\n" 11668 " }\n" 11669 " void g() { return; }\n" 11670 "};\n" 11671 "struct B {\n" 11672 " int x;\n" 11673 "};\n" 11674 "} // namespace a\n", 11675 StroustrupBraceStyle); 11676 11677 verifyFormat("void foo()\n" 11678 "{\n" 11679 " if (a) {\n" 11680 " a();\n" 11681 " }\n" 11682 " else {\n" 11683 " b();\n" 11684 " }\n" 11685 "}\n", 11686 StroustrupBraceStyle); 11687 11688 verifyFormat("#ifdef _DEBUG\n" 11689 "int foo(int i = 0)\n" 11690 "#else\n" 11691 "int foo(int i = 5)\n" 11692 "#endif\n" 11693 "{\n" 11694 " return i;\n" 11695 "}", 11696 StroustrupBraceStyle); 11697 11698 verifyFormat("void foo() {}\n" 11699 "void bar()\n" 11700 "#ifdef _DEBUG\n" 11701 "{\n" 11702 " foo();\n" 11703 "}\n" 11704 "#else\n" 11705 "{\n" 11706 "}\n" 11707 "#endif", 11708 StroustrupBraceStyle); 11709 11710 verifyFormat("void foobar() { int i = 5; }\n" 11711 "#ifdef _DEBUG\n" 11712 "void bar() {}\n" 11713 "#else\n" 11714 "void bar() { foobar(); }\n" 11715 "#endif", 11716 StroustrupBraceStyle); 11717 } 11718 11719 TEST_F(FormatTest, AllmanBraceBreaking) { 11720 FormatStyle AllmanBraceStyle = getLLVMStyle(); 11721 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 11722 11723 EXPECT_EQ("namespace a\n" 11724 "{\n" 11725 "void f();\n" 11726 "void g();\n" 11727 "} // namespace a\n", 11728 format("namespace a\n" 11729 "{\n" 11730 "void f();\n" 11731 "void g();\n" 11732 "}\n", 11733 AllmanBraceStyle)); 11734 11735 verifyFormat("namespace a\n" 11736 "{\n" 11737 "class A\n" 11738 "{\n" 11739 " void f()\n" 11740 " {\n" 11741 " if (true)\n" 11742 " {\n" 11743 " a();\n" 11744 " b();\n" 11745 " }\n" 11746 " }\n" 11747 " void g() { return; }\n" 11748 "};\n" 11749 "struct B\n" 11750 "{\n" 11751 " int x;\n" 11752 "};\n" 11753 "union C\n" 11754 "{\n" 11755 "};\n" 11756 "} // namespace a", 11757 AllmanBraceStyle); 11758 11759 verifyFormat("void f()\n" 11760 "{\n" 11761 " if (true)\n" 11762 " {\n" 11763 " a();\n" 11764 " }\n" 11765 " else if (false)\n" 11766 " {\n" 11767 " b();\n" 11768 " }\n" 11769 " else\n" 11770 " {\n" 11771 " c();\n" 11772 " }\n" 11773 "}\n", 11774 AllmanBraceStyle); 11775 11776 verifyFormat("void f()\n" 11777 "{\n" 11778 " for (int i = 0; i < 10; ++i)\n" 11779 " {\n" 11780 " a();\n" 11781 " }\n" 11782 " while (false)\n" 11783 " {\n" 11784 " b();\n" 11785 " }\n" 11786 " do\n" 11787 " {\n" 11788 " c();\n" 11789 " } while (false)\n" 11790 "}\n", 11791 AllmanBraceStyle); 11792 11793 verifyFormat("void f(int a)\n" 11794 "{\n" 11795 " switch (a)\n" 11796 " {\n" 11797 " case 0:\n" 11798 " break;\n" 11799 " case 1:\n" 11800 " {\n" 11801 " break;\n" 11802 " }\n" 11803 " case 2:\n" 11804 " {\n" 11805 " }\n" 11806 " break;\n" 11807 " default:\n" 11808 " break;\n" 11809 " }\n" 11810 "}\n", 11811 AllmanBraceStyle); 11812 11813 verifyFormat("enum X\n" 11814 "{\n" 11815 " Y = 0,\n" 11816 "}\n", 11817 AllmanBraceStyle); 11818 verifyFormat("enum X\n" 11819 "{\n" 11820 " Y = 0\n" 11821 "}\n", 11822 AllmanBraceStyle); 11823 11824 verifyFormat("@interface BSApplicationController ()\n" 11825 "{\n" 11826 "@private\n" 11827 " id _extraIvar;\n" 11828 "}\n" 11829 "@end\n", 11830 AllmanBraceStyle); 11831 11832 verifyFormat("#ifdef _DEBUG\n" 11833 "int foo(int i = 0)\n" 11834 "#else\n" 11835 "int foo(int i = 5)\n" 11836 "#endif\n" 11837 "{\n" 11838 " return i;\n" 11839 "}", 11840 AllmanBraceStyle); 11841 11842 verifyFormat("void foo() {}\n" 11843 "void bar()\n" 11844 "#ifdef _DEBUG\n" 11845 "{\n" 11846 " foo();\n" 11847 "}\n" 11848 "#else\n" 11849 "{\n" 11850 "}\n" 11851 "#endif", 11852 AllmanBraceStyle); 11853 11854 verifyFormat("void foobar() { int i = 5; }\n" 11855 "#ifdef _DEBUG\n" 11856 "void bar() {}\n" 11857 "#else\n" 11858 "void bar() { foobar(); }\n" 11859 "#endif", 11860 AllmanBraceStyle); 11861 11862 // This shouldn't affect ObjC blocks.. 11863 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11864 " // ...\n" 11865 " int i;\n" 11866 "}];", 11867 AllmanBraceStyle); 11868 verifyFormat("void (^block)(void) = ^{\n" 11869 " // ...\n" 11870 " int i;\n" 11871 "};", 11872 AllmanBraceStyle); 11873 // .. or dict literals. 11874 verifyFormat("void f()\n" 11875 "{\n" 11876 " // ...\n" 11877 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11878 "}", 11879 AllmanBraceStyle); 11880 verifyFormat("void f()\n" 11881 "{\n" 11882 " // ...\n" 11883 " [object someMethod:@{a : @\"b\"}];\n" 11884 "}", 11885 AllmanBraceStyle); 11886 verifyFormat("int f()\n" 11887 "{ // comment\n" 11888 " return 42;\n" 11889 "}", 11890 AllmanBraceStyle); 11891 11892 AllmanBraceStyle.ColumnLimit = 19; 11893 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11894 AllmanBraceStyle.ColumnLimit = 18; 11895 verifyFormat("void f()\n" 11896 "{\n" 11897 " int i;\n" 11898 "}", 11899 AllmanBraceStyle); 11900 AllmanBraceStyle.ColumnLimit = 80; 11901 11902 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11903 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11904 FormatStyle::SIS_WithoutElse; 11905 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11906 verifyFormat("void f(bool b)\n" 11907 "{\n" 11908 " if (b)\n" 11909 " {\n" 11910 " return;\n" 11911 " }\n" 11912 "}\n", 11913 BreakBeforeBraceShortIfs); 11914 verifyFormat("void f(bool b)\n" 11915 "{\n" 11916 " if constexpr (b)\n" 11917 " {\n" 11918 " return;\n" 11919 " }\n" 11920 "}\n", 11921 BreakBeforeBraceShortIfs); 11922 verifyFormat("void f(bool b)\n" 11923 "{\n" 11924 " if CONSTEXPR (b)\n" 11925 " {\n" 11926 " return;\n" 11927 " }\n" 11928 "}\n", 11929 BreakBeforeBraceShortIfs); 11930 verifyFormat("void f(bool b)\n" 11931 "{\n" 11932 " if (b) return;\n" 11933 "}\n", 11934 BreakBeforeBraceShortIfs); 11935 verifyFormat("void f(bool b)\n" 11936 "{\n" 11937 " if constexpr (b) return;\n" 11938 "}\n", 11939 BreakBeforeBraceShortIfs); 11940 verifyFormat("void f(bool b)\n" 11941 "{\n" 11942 " if CONSTEXPR (b) return;\n" 11943 "}\n", 11944 BreakBeforeBraceShortIfs); 11945 verifyFormat("void f(bool b)\n" 11946 "{\n" 11947 " while (b)\n" 11948 " {\n" 11949 " return;\n" 11950 " }\n" 11951 "}\n", 11952 BreakBeforeBraceShortIfs); 11953 } 11954 11955 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 11956 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 11957 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 11958 11959 // Make a few changes to the style for testing purposes 11960 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 11961 FormatStyle::SFS_Empty; 11962 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 11963 WhitesmithsBraceStyle.ColumnLimit = 0; 11964 11965 // FIXME: this test case can't decide whether there should be a blank line 11966 // after the ~D() line or not. It adds one if one doesn't exist in the test 11967 // and it removes the line if one exists. 11968 /* 11969 verifyFormat("class A;\n" 11970 "namespace B\n" 11971 " {\n" 11972 "class C;\n" 11973 "// Comment\n" 11974 "class D\n" 11975 " {\n" 11976 "public:\n" 11977 " D();\n" 11978 " ~D() {}\n" 11979 "private:\n" 11980 " enum E\n" 11981 " {\n" 11982 " F\n" 11983 " }\n" 11984 " };\n" 11985 " } // namespace B\n", 11986 WhitesmithsBraceStyle); 11987 */ 11988 11989 verifyFormat("namespace a\n" 11990 " {\n" 11991 "class A\n" 11992 " {\n" 11993 " void f()\n" 11994 " {\n" 11995 " if (true)\n" 11996 " {\n" 11997 " a();\n" 11998 " b();\n" 11999 " }\n" 12000 " }\n" 12001 " void g()\n" 12002 " {\n" 12003 " return;\n" 12004 " }\n" 12005 " };\n" 12006 "struct B\n" 12007 " {\n" 12008 " int x;\n" 12009 " };\n" 12010 " } // namespace a", 12011 WhitesmithsBraceStyle); 12012 12013 verifyFormat("void f()\n" 12014 " {\n" 12015 " if (true)\n" 12016 " {\n" 12017 " a();\n" 12018 " }\n" 12019 " else if (false)\n" 12020 " {\n" 12021 " b();\n" 12022 " }\n" 12023 " else\n" 12024 " {\n" 12025 " c();\n" 12026 " }\n" 12027 " }\n", 12028 WhitesmithsBraceStyle); 12029 12030 verifyFormat("void f()\n" 12031 " {\n" 12032 " for (int i = 0; i < 10; ++i)\n" 12033 " {\n" 12034 " a();\n" 12035 " }\n" 12036 " while (false)\n" 12037 " {\n" 12038 " b();\n" 12039 " }\n" 12040 " do\n" 12041 " {\n" 12042 " c();\n" 12043 " } while (false)\n" 12044 " }\n", 12045 WhitesmithsBraceStyle); 12046 12047 // FIXME: the block and the break under case 2 in this test don't get indented 12048 // correctly 12049 /* 12050 verifyFormat("void switchTest1(int a)\n" 12051 " {\n" 12052 " switch (a)\n" 12053 " {\n" 12054 " case 2:\n" 12055 " {\n" 12056 " }\n" 12057 " break;\n" 12058 " }\n" 12059 " }\n", 12060 WhitesmithsBraceStyle); 12061 */ 12062 12063 // FIXME: the block and the break under case 2 in this test don't get indented 12064 // correctly 12065 /* 12066 verifyFormat("void switchTest2(int a)\n" 12067 " {\n" 12068 " switch (a)\n" 12069 " {\n" 12070 " case 0:\n" 12071 " break;\n" 12072 " case 1:\n" 12073 " {\n" 12074 " break;\n" 12075 " }\n" 12076 " case 2:\n" 12077 " {\n" 12078 " }\n" 12079 " break;\n" 12080 " default:\n" 12081 " break;\n" 12082 " }\n" 12083 " }\n", 12084 WhitesmithsBraceStyle); 12085 */ 12086 12087 verifyFormat("enum X\n" 12088 " {\n" 12089 " Y = 0, // testing\n" 12090 " }\n", 12091 WhitesmithsBraceStyle); 12092 12093 verifyFormat("enum X\n" 12094 " {\n" 12095 " Y = 0\n" 12096 " }\n", 12097 WhitesmithsBraceStyle); 12098 verifyFormat("enum X\n" 12099 " {\n" 12100 " Y = 0,\n" 12101 " Z = 1\n" 12102 " };\n", 12103 WhitesmithsBraceStyle); 12104 12105 verifyFormat("@interface BSApplicationController ()\n" 12106 " {\n" 12107 "@private\n" 12108 " id _extraIvar;\n" 12109 " }\n" 12110 "@end\n", 12111 WhitesmithsBraceStyle); 12112 12113 verifyFormat("#ifdef _DEBUG\n" 12114 "int foo(int i = 0)\n" 12115 "#else\n" 12116 "int foo(int i = 5)\n" 12117 "#endif\n" 12118 " {\n" 12119 " return i;\n" 12120 " }", 12121 WhitesmithsBraceStyle); 12122 12123 verifyFormat("void foo() {}\n" 12124 "void bar()\n" 12125 "#ifdef _DEBUG\n" 12126 " {\n" 12127 " foo();\n" 12128 " }\n" 12129 "#else\n" 12130 " {\n" 12131 " }\n" 12132 "#endif", 12133 WhitesmithsBraceStyle); 12134 12135 verifyFormat("void foobar()\n" 12136 " {\n" 12137 " int i = 5;\n" 12138 " }\n" 12139 "#ifdef _DEBUG\n" 12140 "void bar()\n" 12141 " {\n" 12142 " }\n" 12143 "#else\n" 12144 "void bar()\n" 12145 " {\n" 12146 " foobar();\n" 12147 " }\n" 12148 "#endif", 12149 WhitesmithsBraceStyle); 12150 12151 // This shouldn't affect ObjC blocks.. 12152 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 12153 " // ...\n" 12154 " int i;\n" 12155 "}];", 12156 WhitesmithsBraceStyle); 12157 verifyFormat("void (^block)(void) = ^{\n" 12158 " // ...\n" 12159 " int i;\n" 12160 "};", 12161 WhitesmithsBraceStyle); 12162 // .. or dict literals. 12163 verifyFormat("void f()\n" 12164 " {\n" 12165 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 12166 " }", 12167 WhitesmithsBraceStyle); 12168 12169 verifyFormat("int f()\n" 12170 " { // comment\n" 12171 " return 42;\n" 12172 " }", 12173 WhitesmithsBraceStyle); 12174 12175 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 12176 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 12177 FormatStyle::SIS_Always; 12178 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 12179 verifyFormat("void f(bool b)\n" 12180 " {\n" 12181 " if (b)\n" 12182 " {\n" 12183 " return;\n" 12184 " }\n" 12185 " }\n", 12186 BreakBeforeBraceShortIfs); 12187 verifyFormat("void f(bool b)\n" 12188 " {\n" 12189 " if (b) return;\n" 12190 " }\n", 12191 BreakBeforeBraceShortIfs); 12192 verifyFormat("void f(bool b)\n" 12193 " {\n" 12194 " while (b)\n" 12195 " {\n" 12196 " return;\n" 12197 " }\n" 12198 " }\n", 12199 BreakBeforeBraceShortIfs); 12200 } 12201 12202 TEST_F(FormatTest, GNUBraceBreaking) { 12203 FormatStyle GNUBraceStyle = getLLVMStyle(); 12204 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 12205 verifyFormat("namespace a\n" 12206 "{\n" 12207 "class A\n" 12208 "{\n" 12209 " void f()\n" 12210 " {\n" 12211 " int a;\n" 12212 " {\n" 12213 " int b;\n" 12214 " }\n" 12215 " if (true)\n" 12216 " {\n" 12217 " a();\n" 12218 " b();\n" 12219 " }\n" 12220 " }\n" 12221 " void g() { return; }\n" 12222 "}\n" 12223 "} // namespace a", 12224 GNUBraceStyle); 12225 12226 verifyFormat("void f()\n" 12227 "{\n" 12228 " if (true)\n" 12229 " {\n" 12230 " a();\n" 12231 " }\n" 12232 " else if (false)\n" 12233 " {\n" 12234 " b();\n" 12235 " }\n" 12236 " else\n" 12237 " {\n" 12238 " c();\n" 12239 " }\n" 12240 "}\n", 12241 GNUBraceStyle); 12242 12243 verifyFormat("void f()\n" 12244 "{\n" 12245 " for (int i = 0; i < 10; ++i)\n" 12246 " {\n" 12247 " a();\n" 12248 " }\n" 12249 " while (false)\n" 12250 " {\n" 12251 " b();\n" 12252 " }\n" 12253 " do\n" 12254 " {\n" 12255 " c();\n" 12256 " }\n" 12257 " while (false);\n" 12258 "}\n", 12259 GNUBraceStyle); 12260 12261 verifyFormat("void f(int a)\n" 12262 "{\n" 12263 " switch (a)\n" 12264 " {\n" 12265 " case 0:\n" 12266 " break;\n" 12267 " case 1:\n" 12268 " {\n" 12269 " break;\n" 12270 " }\n" 12271 " case 2:\n" 12272 " {\n" 12273 " }\n" 12274 " break;\n" 12275 " default:\n" 12276 " break;\n" 12277 " }\n" 12278 "}\n", 12279 GNUBraceStyle); 12280 12281 verifyFormat("enum X\n" 12282 "{\n" 12283 " Y = 0,\n" 12284 "}\n", 12285 GNUBraceStyle); 12286 12287 verifyFormat("@interface BSApplicationController ()\n" 12288 "{\n" 12289 "@private\n" 12290 " id _extraIvar;\n" 12291 "}\n" 12292 "@end\n", 12293 GNUBraceStyle); 12294 12295 verifyFormat("#ifdef _DEBUG\n" 12296 "int foo(int i = 0)\n" 12297 "#else\n" 12298 "int foo(int i = 5)\n" 12299 "#endif\n" 12300 "{\n" 12301 " return i;\n" 12302 "}", 12303 GNUBraceStyle); 12304 12305 verifyFormat("void foo() {}\n" 12306 "void bar()\n" 12307 "#ifdef _DEBUG\n" 12308 "{\n" 12309 " foo();\n" 12310 "}\n" 12311 "#else\n" 12312 "{\n" 12313 "}\n" 12314 "#endif", 12315 GNUBraceStyle); 12316 12317 verifyFormat("void foobar() { int i = 5; }\n" 12318 "#ifdef _DEBUG\n" 12319 "void bar() {}\n" 12320 "#else\n" 12321 "void bar() { foobar(); }\n" 12322 "#endif", 12323 GNUBraceStyle); 12324 } 12325 12326 TEST_F(FormatTest, WebKitBraceBreaking) { 12327 FormatStyle WebKitBraceStyle = getLLVMStyle(); 12328 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 12329 WebKitBraceStyle.FixNamespaceComments = false; 12330 verifyFormat("namespace a {\n" 12331 "class A {\n" 12332 " void f()\n" 12333 " {\n" 12334 " if (true) {\n" 12335 " a();\n" 12336 " b();\n" 12337 " }\n" 12338 " }\n" 12339 " void g() { return; }\n" 12340 "};\n" 12341 "enum E {\n" 12342 " A,\n" 12343 " // foo\n" 12344 " B,\n" 12345 " C\n" 12346 "};\n" 12347 "struct B {\n" 12348 " int x;\n" 12349 "};\n" 12350 "}\n", 12351 WebKitBraceStyle); 12352 verifyFormat("struct S {\n" 12353 " int Type;\n" 12354 " union {\n" 12355 " int x;\n" 12356 " double y;\n" 12357 " } Value;\n" 12358 " class C {\n" 12359 " MyFavoriteType Value;\n" 12360 " } Class;\n" 12361 "};\n", 12362 WebKitBraceStyle); 12363 } 12364 12365 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 12366 verifyFormat("void f() {\n" 12367 " try {\n" 12368 " } catch (const Exception &e) {\n" 12369 " }\n" 12370 "}\n", 12371 getLLVMStyle()); 12372 } 12373 12374 TEST_F(FormatTest, UnderstandsPragmas) { 12375 verifyFormat("#pragma omp reduction(| : var)"); 12376 verifyFormat("#pragma omp reduction(+ : var)"); 12377 12378 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 12379 "(including parentheses).", 12380 format("#pragma mark Any non-hyphenated or hyphenated string " 12381 "(including parentheses).")); 12382 } 12383 12384 TEST_F(FormatTest, UnderstandPragmaOption) { 12385 verifyFormat("#pragma option -C -A"); 12386 12387 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 12388 } 12389 12390 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 12391 FormatStyle Style = getLLVMStyle(); 12392 Style.ColumnLimit = 20; 12393 12394 // See PR41213 12395 EXPECT_EQ("/*\n" 12396 " *\t9012345\n" 12397 " * /8901\n" 12398 " */", 12399 format("/*\n" 12400 " *\t9012345 /8901\n" 12401 " */", 12402 Style)); 12403 EXPECT_EQ("/*\n" 12404 " *345678\n" 12405 " *\t/8901\n" 12406 " */", 12407 format("/*\n" 12408 " *345678\t/8901\n" 12409 " */", 12410 Style)); 12411 12412 verifyFormat("int a; // the\n" 12413 " // comment", 12414 Style); 12415 EXPECT_EQ("int a; /* first line\n" 12416 " * second\n" 12417 " * line third\n" 12418 " * line\n" 12419 " */", 12420 format("int a; /* first line\n" 12421 " * second\n" 12422 " * line third\n" 12423 " * line\n" 12424 " */", 12425 Style)); 12426 EXPECT_EQ("int a; // first line\n" 12427 " // second\n" 12428 " // line third\n" 12429 " // line", 12430 format("int a; // first line\n" 12431 " // second line\n" 12432 " // third line", 12433 Style)); 12434 12435 Style.PenaltyExcessCharacter = 90; 12436 verifyFormat("int a; // the comment", Style); 12437 EXPECT_EQ("int a; // the comment\n" 12438 " // aaa", 12439 format("int a; // the comment aaa", Style)); 12440 EXPECT_EQ("int a; /* first line\n" 12441 " * second line\n" 12442 " * third line\n" 12443 " */", 12444 format("int a; /* first line\n" 12445 " * second line\n" 12446 " * third line\n" 12447 " */", 12448 Style)); 12449 EXPECT_EQ("int a; // first line\n" 12450 " // second line\n" 12451 " // third line", 12452 format("int a; // first line\n" 12453 " // second line\n" 12454 " // third line", 12455 Style)); 12456 // FIXME: Investigate why this is not getting the same layout as the test 12457 // above. 12458 EXPECT_EQ("int a; /* first line\n" 12459 " * second line\n" 12460 " * third line\n" 12461 " */", 12462 format("int a; /* first line second line third line" 12463 "\n*/", 12464 Style)); 12465 12466 EXPECT_EQ("// foo bar baz bazfoo\n" 12467 "// foo bar foo bar\n", 12468 format("// foo bar baz bazfoo\n" 12469 "// foo bar foo bar\n", 12470 Style)); 12471 EXPECT_EQ("// foo bar baz bazfoo\n" 12472 "// foo bar foo bar\n", 12473 format("// foo bar baz bazfoo\n" 12474 "// foo bar foo bar\n", 12475 Style)); 12476 12477 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 12478 // next one. 12479 EXPECT_EQ("// foo bar baz bazfoo\n" 12480 "// bar foo bar\n", 12481 format("// foo bar baz bazfoo bar\n" 12482 "// foo bar\n", 12483 Style)); 12484 12485 EXPECT_EQ("// foo bar baz bazfoo\n" 12486 "// foo bar baz bazfoo\n" 12487 "// bar foo bar\n", 12488 format("// foo bar baz bazfoo\n" 12489 "// foo bar baz bazfoo bar\n" 12490 "// foo bar\n", 12491 Style)); 12492 12493 EXPECT_EQ("// foo bar baz bazfoo\n" 12494 "// foo bar baz bazfoo\n" 12495 "// bar foo bar\n", 12496 format("// foo bar baz bazfoo\n" 12497 "// foo bar baz bazfoo bar\n" 12498 "// foo bar\n", 12499 Style)); 12500 12501 // Make sure we do not keep protruding characters if strict mode reflow is 12502 // cheaper than keeping protruding characters. 12503 Style.ColumnLimit = 21; 12504 EXPECT_EQ( 12505 "// foo foo foo foo\n" 12506 "// foo foo foo foo\n" 12507 "// foo foo foo foo\n", 12508 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 12509 12510 EXPECT_EQ("int a = /* long block\n" 12511 " comment */\n" 12512 " 42;", 12513 format("int a = /* long block comment */ 42;", Style)); 12514 } 12515 12516 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 12517 for (size_t i = 1; i < Styles.size(); ++i) \ 12518 EXPECT_EQ(Styles[0], Styles[i]) \ 12519 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 12520 12521 TEST_F(FormatTest, GetsPredefinedStyleByName) { 12522 SmallVector<FormatStyle, 3> Styles; 12523 Styles.resize(3); 12524 12525 Styles[0] = getLLVMStyle(); 12526 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 12527 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 12528 EXPECT_ALL_STYLES_EQUAL(Styles); 12529 12530 Styles[0] = getGoogleStyle(); 12531 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 12532 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 12533 EXPECT_ALL_STYLES_EQUAL(Styles); 12534 12535 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12536 EXPECT_TRUE( 12537 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 12538 EXPECT_TRUE( 12539 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 12540 EXPECT_ALL_STYLES_EQUAL(Styles); 12541 12542 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 12543 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 12544 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 12545 EXPECT_ALL_STYLES_EQUAL(Styles); 12546 12547 Styles[0] = getMozillaStyle(); 12548 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 12549 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 12550 EXPECT_ALL_STYLES_EQUAL(Styles); 12551 12552 Styles[0] = getWebKitStyle(); 12553 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 12554 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 12555 EXPECT_ALL_STYLES_EQUAL(Styles); 12556 12557 Styles[0] = getGNUStyle(); 12558 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 12559 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 12560 EXPECT_ALL_STYLES_EQUAL(Styles); 12561 12562 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 12563 } 12564 12565 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 12566 SmallVector<FormatStyle, 8> Styles; 12567 Styles.resize(2); 12568 12569 Styles[0] = getGoogleStyle(); 12570 Styles[1] = getLLVMStyle(); 12571 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12572 EXPECT_ALL_STYLES_EQUAL(Styles); 12573 12574 Styles.resize(5); 12575 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12576 Styles[1] = getLLVMStyle(); 12577 Styles[1].Language = FormatStyle::LK_JavaScript; 12578 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12579 12580 Styles[2] = getLLVMStyle(); 12581 Styles[2].Language = FormatStyle::LK_JavaScript; 12582 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 12583 "BasedOnStyle: Google", 12584 &Styles[2]) 12585 .value()); 12586 12587 Styles[3] = getLLVMStyle(); 12588 Styles[3].Language = FormatStyle::LK_JavaScript; 12589 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 12590 "Language: JavaScript", 12591 &Styles[3]) 12592 .value()); 12593 12594 Styles[4] = getLLVMStyle(); 12595 Styles[4].Language = FormatStyle::LK_JavaScript; 12596 EXPECT_EQ(0, parseConfiguration("---\n" 12597 "BasedOnStyle: LLVM\n" 12598 "IndentWidth: 123\n" 12599 "---\n" 12600 "BasedOnStyle: Google\n" 12601 "Language: JavaScript", 12602 &Styles[4]) 12603 .value()); 12604 EXPECT_ALL_STYLES_EQUAL(Styles); 12605 } 12606 12607 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 12608 Style.FIELD = false; \ 12609 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 12610 EXPECT_TRUE(Style.FIELD); \ 12611 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 12612 EXPECT_FALSE(Style.FIELD); 12613 12614 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 12615 12616 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 12617 Style.STRUCT.FIELD = false; \ 12618 EXPECT_EQ(0, \ 12619 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 12620 .value()); \ 12621 EXPECT_TRUE(Style.STRUCT.FIELD); \ 12622 EXPECT_EQ(0, \ 12623 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 12624 .value()); \ 12625 EXPECT_FALSE(Style.STRUCT.FIELD); 12626 12627 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 12628 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 12629 12630 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 12631 EXPECT_NE(VALUE, Style.FIELD); \ 12632 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 12633 EXPECT_EQ(VALUE, Style.FIELD) 12634 12635 TEST_F(FormatTest, ParsesConfigurationBools) { 12636 FormatStyle Style = {}; 12637 Style.Language = FormatStyle::LK_Cpp; 12638 CHECK_PARSE_BOOL(AlignOperands); 12639 CHECK_PARSE_BOOL(AlignTrailingComments); 12640 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 12641 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 12642 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 12643 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 12644 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 12645 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 12646 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 12647 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 12648 CHECK_PARSE_BOOL(BinPackArguments); 12649 CHECK_PARSE_BOOL(BinPackParameters); 12650 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 12651 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 12652 CHECK_PARSE_BOOL(BreakStringLiterals); 12653 CHECK_PARSE_BOOL(CompactNamespaces); 12654 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 12655 CHECK_PARSE_BOOL(DeriveLineEnding); 12656 CHECK_PARSE_BOOL(DerivePointerAlignment); 12657 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 12658 CHECK_PARSE_BOOL(DisableFormat); 12659 CHECK_PARSE_BOOL(IndentCaseLabels); 12660 CHECK_PARSE_BOOL(IndentCaseBlocks); 12661 CHECK_PARSE_BOOL(IndentGotoLabels); 12662 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 12663 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 12664 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 12665 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 12666 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 12667 CHECK_PARSE_BOOL(ReflowComments); 12668 CHECK_PARSE_BOOL(SortIncludes); 12669 CHECK_PARSE_BOOL(SortUsingDeclarations); 12670 CHECK_PARSE_BOOL(SpacesInParentheses); 12671 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 12672 CHECK_PARSE_BOOL(SpacesInAngles); 12673 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 12674 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 12675 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 12676 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 12677 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 12678 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 12679 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 12680 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 12681 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 12682 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 12683 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 12684 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 12685 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 12686 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 12687 CHECK_PARSE_BOOL(UseCRLF); 12688 12689 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 12690 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 12691 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 12692 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 12693 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 12694 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 12695 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 12696 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 12697 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 12698 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 12699 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 12700 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody); 12701 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 12702 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 12703 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 12704 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 12705 } 12706 12707 #undef CHECK_PARSE_BOOL 12708 12709 TEST_F(FormatTest, ParsesConfiguration) { 12710 FormatStyle Style = {}; 12711 Style.Language = FormatStyle::LK_Cpp; 12712 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 12713 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 12714 ConstructorInitializerIndentWidth, 1234u); 12715 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 12716 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 12717 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 12718 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 12719 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 12720 PenaltyBreakBeforeFirstCallParameter, 1234u); 12721 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 12722 PenaltyBreakTemplateDeclaration, 1234u); 12723 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 12724 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 12725 PenaltyReturnTypeOnItsOwnLine, 1234u); 12726 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 12727 SpacesBeforeTrailingComments, 1234u); 12728 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 12729 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 12730 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 12731 12732 Style.PointerAlignment = FormatStyle::PAS_Middle; 12733 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 12734 FormatStyle::PAS_Left); 12735 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 12736 FormatStyle::PAS_Right); 12737 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 12738 FormatStyle::PAS_Middle); 12739 // For backward compatibility: 12740 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 12741 FormatStyle::PAS_Left); 12742 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 12743 FormatStyle::PAS_Right); 12744 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 12745 FormatStyle::PAS_Middle); 12746 12747 Style.Standard = FormatStyle::LS_Auto; 12748 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 12749 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 12750 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 12751 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 12752 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 12753 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 12754 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 12755 // Legacy aliases: 12756 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 12757 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 12758 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 12759 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 12760 12761 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12762 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 12763 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 12764 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 12765 FormatStyle::BOS_None); 12766 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 12767 FormatStyle::BOS_All); 12768 // For backward compatibility: 12769 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 12770 FormatStyle::BOS_None); 12771 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 12772 FormatStyle::BOS_All); 12773 12774 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 12775 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 12776 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12777 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 12778 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 12779 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 12780 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 12781 // For backward compatibility: 12782 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 12783 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12784 12785 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12786 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 12787 FormatStyle::BILS_BeforeComma); 12788 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 12789 FormatStyle::BILS_AfterColon); 12790 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 12791 FormatStyle::BILS_BeforeColon); 12792 // For backward compatibility: 12793 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 12794 FormatStyle::BILS_BeforeComma); 12795 12796 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12797 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 12798 FormatStyle::BAS_Align); 12799 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 12800 FormatStyle::BAS_DontAlign); 12801 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 12802 FormatStyle::BAS_AlwaysBreak); 12803 // For backward compatibility: 12804 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 12805 FormatStyle::BAS_DontAlign); 12806 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 12807 FormatStyle::BAS_Align); 12808 12809 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12810 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 12811 FormatStyle::ENAS_DontAlign); 12812 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 12813 FormatStyle::ENAS_Left); 12814 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 12815 FormatStyle::ENAS_Right); 12816 // For backward compatibility: 12817 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 12818 FormatStyle::ENAS_Left); 12819 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 12820 FormatStyle::ENAS_Right); 12821 12822 Style.UseTab = FormatStyle::UT_ForIndentation; 12823 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 12824 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 12825 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 12826 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 12827 FormatStyle::UT_ForContinuationAndIndentation); 12828 // For backward compatibility: 12829 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 12830 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 12831 12832 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 12833 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 12834 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12835 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 12836 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 12837 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 12838 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12839 // For backward compatibility: 12840 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 12841 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12842 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 12843 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12844 12845 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 12846 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 12847 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12848 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 12849 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 12850 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 12851 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 12852 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 12853 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12854 // For backward compatibility: 12855 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 12856 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12857 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 12858 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12859 12860 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 12861 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 12862 FormatStyle::SBPO_Never); 12863 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 12864 FormatStyle::SBPO_Always); 12865 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 12866 FormatStyle::SBPO_ControlStatements); 12867 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 12868 FormatStyle::SBPO_NonEmptyParentheses); 12869 // For backward compatibility: 12870 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 12871 FormatStyle::SBPO_Never); 12872 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 12873 FormatStyle::SBPO_ControlStatements); 12874 12875 Style.ColumnLimit = 123; 12876 FormatStyle BaseStyle = getLLVMStyle(); 12877 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 12878 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 12879 12880 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12881 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 12882 FormatStyle::BS_Attach); 12883 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 12884 FormatStyle::BS_Linux); 12885 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 12886 FormatStyle::BS_Mozilla); 12887 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 12888 FormatStyle::BS_Stroustrup); 12889 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 12890 FormatStyle::BS_Allman); 12891 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 12892 FormatStyle::BS_Whitesmiths); 12893 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 12894 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 12895 FormatStyle::BS_WebKit); 12896 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 12897 FormatStyle::BS_Custom); 12898 12899 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 12900 CHECK_PARSE("BraceWrapping:\n" 12901 " AfterControlStatement: MultiLine", 12902 BraceWrapping.AfterControlStatement, 12903 FormatStyle::BWACS_MultiLine); 12904 CHECK_PARSE("BraceWrapping:\n" 12905 " AfterControlStatement: Always", 12906 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12907 CHECK_PARSE("BraceWrapping:\n" 12908 " AfterControlStatement: Never", 12909 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12910 // For backward compatibility: 12911 CHECK_PARSE("BraceWrapping:\n" 12912 " AfterControlStatement: true", 12913 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12914 CHECK_PARSE("BraceWrapping:\n" 12915 " AfterControlStatement: false", 12916 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12917 12918 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 12919 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 12920 FormatStyle::RTBS_None); 12921 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 12922 FormatStyle::RTBS_All); 12923 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 12924 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 12925 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 12926 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 12927 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 12928 AlwaysBreakAfterReturnType, 12929 FormatStyle::RTBS_TopLevelDefinitions); 12930 12931 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 12932 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 12933 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 12934 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 12935 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12936 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 12937 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12938 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 12939 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12940 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 12941 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12942 12943 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 12944 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 12945 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 12946 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 12947 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 12948 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 12949 AlwaysBreakAfterDefinitionReturnType, 12950 FormatStyle::DRTBS_TopLevel); 12951 12952 Style.NamespaceIndentation = FormatStyle::NI_All; 12953 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 12954 FormatStyle::NI_None); 12955 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 12956 FormatStyle::NI_Inner); 12957 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 12958 FormatStyle::NI_All); 12959 12960 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 12961 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 12962 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12963 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 12964 AllowShortIfStatementsOnASingleLine, 12965 FormatStyle::SIS_WithoutElse); 12966 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 12967 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 12968 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 12969 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12970 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 12971 AllowShortIfStatementsOnASingleLine, 12972 FormatStyle::SIS_WithoutElse); 12973 12974 // FIXME: This is required because parsing a configuration simply overwrites 12975 // the first N elements of the list instead of resetting it. 12976 Style.ForEachMacros.clear(); 12977 std::vector<std::string> BoostForeach; 12978 BoostForeach.push_back("BOOST_FOREACH"); 12979 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 12980 std::vector<std::string> BoostAndQForeach; 12981 BoostAndQForeach.push_back("BOOST_FOREACH"); 12982 BoostAndQForeach.push_back("Q_FOREACH"); 12983 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 12984 BoostAndQForeach); 12985 12986 Style.StatementMacros.clear(); 12987 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 12988 std::vector<std::string>{"QUNUSED"}); 12989 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 12990 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 12991 12992 Style.NamespaceMacros.clear(); 12993 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 12994 std::vector<std::string>{"TESTSUITE"}); 12995 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 12996 std::vector<std::string>({"TESTSUITE", "SUITE"})); 12997 12998 Style.IncludeStyle.IncludeCategories.clear(); 12999 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 13000 {"abc/.*", 2, 0}, {".*", 1, 0}}; 13001 CHECK_PARSE("IncludeCategories:\n" 13002 " - Regex: abc/.*\n" 13003 " Priority: 2\n" 13004 " - Regex: .*\n" 13005 " Priority: 1", 13006 IncludeStyle.IncludeCategories, ExpectedCategories); 13007 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 13008 "abc$"); 13009 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 13010 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 13011 13012 Style.RawStringFormats.clear(); 13013 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 13014 { 13015 FormatStyle::LK_TextProto, 13016 {"pb", "proto"}, 13017 {"PARSE_TEXT_PROTO"}, 13018 /*CanonicalDelimiter=*/"", 13019 "llvm", 13020 }, 13021 { 13022 FormatStyle::LK_Cpp, 13023 {"cc", "cpp"}, 13024 {"C_CODEBLOCK", "CPPEVAL"}, 13025 /*CanonicalDelimiter=*/"cc", 13026 /*BasedOnStyle=*/"", 13027 }, 13028 }; 13029 13030 CHECK_PARSE("RawStringFormats:\n" 13031 " - Language: TextProto\n" 13032 " Delimiters:\n" 13033 " - 'pb'\n" 13034 " - 'proto'\n" 13035 " EnclosingFunctions:\n" 13036 " - 'PARSE_TEXT_PROTO'\n" 13037 " BasedOnStyle: llvm\n" 13038 " - Language: Cpp\n" 13039 " Delimiters:\n" 13040 " - 'cc'\n" 13041 " - 'cpp'\n" 13042 " EnclosingFunctions:\n" 13043 " - 'C_CODEBLOCK'\n" 13044 " - 'CPPEVAL'\n" 13045 " CanonicalDelimiter: 'cc'", 13046 RawStringFormats, ExpectedRawStringFormats); 13047 } 13048 13049 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 13050 FormatStyle Style = {}; 13051 Style.Language = FormatStyle::LK_Cpp; 13052 CHECK_PARSE("Language: Cpp\n" 13053 "IndentWidth: 12", 13054 IndentWidth, 12u); 13055 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 13056 "IndentWidth: 34", 13057 &Style), 13058 ParseError::Unsuitable); 13059 FormatStyle BinPackedTCS = {}; 13060 BinPackedTCS.Language = FormatStyle::LK_JavaScript; 13061 EXPECT_EQ(parseConfiguration("BinPackArguments: true\n" 13062 "InsertTrailingCommas: Wrapped", 13063 &BinPackedTCS), 13064 ParseError::BinPackTrailingCommaConflict); 13065 EXPECT_EQ(12u, Style.IndentWidth); 13066 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 13067 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 13068 13069 Style.Language = FormatStyle::LK_JavaScript; 13070 CHECK_PARSE("Language: JavaScript\n" 13071 "IndentWidth: 12", 13072 IndentWidth, 12u); 13073 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 13074 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 13075 "IndentWidth: 34", 13076 &Style), 13077 ParseError::Unsuitable); 13078 EXPECT_EQ(23u, Style.IndentWidth); 13079 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 13080 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 13081 13082 CHECK_PARSE("BasedOnStyle: LLVM\n" 13083 "IndentWidth: 67", 13084 IndentWidth, 67u); 13085 13086 CHECK_PARSE("---\n" 13087 "Language: JavaScript\n" 13088 "IndentWidth: 12\n" 13089 "---\n" 13090 "Language: Cpp\n" 13091 "IndentWidth: 34\n" 13092 "...\n", 13093 IndentWidth, 12u); 13094 13095 Style.Language = FormatStyle::LK_Cpp; 13096 CHECK_PARSE("---\n" 13097 "Language: JavaScript\n" 13098 "IndentWidth: 12\n" 13099 "---\n" 13100 "Language: Cpp\n" 13101 "IndentWidth: 34\n" 13102 "...\n", 13103 IndentWidth, 34u); 13104 CHECK_PARSE("---\n" 13105 "IndentWidth: 78\n" 13106 "---\n" 13107 "Language: JavaScript\n" 13108 "IndentWidth: 56\n" 13109 "...\n", 13110 IndentWidth, 78u); 13111 13112 Style.ColumnLimit = 123; 13113 Style.IndentWidth = 234; 13114 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 13115 Style.TabWidth = 345; 13116 EXPECT_FALSE(parseConfiguration("---\n" 13117 "IndentWidth: 456\n" 13118 "BreakBeforeBraces: Allman\n" 13119 "---\n" 13120 "Language: JavaScript\n" 13121 "IndentWidth: 111\n" 13122 "TabWidth: 111\n" 13123 "---\n" 13124 "Language: Cpp\n" 13125 "BreakBeforeBraces: Stroustrup\n" 13126 "TabWidth: 789\n" 13127 "...\n", 13128 &Style)); 13129 EXPECT_EQ(123u, Style.ColumnLimit); 13130 EXPECT_EQ(456u, Style.IndentWidth); 13131 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 13132 EXPECT_EQ(789u, Style.TabWidth); 13133 13134 EXPECT_EQ(parseConfiguration("---\n" 13135 "Language: JavaScript\n" 13136 "IndentWidth: 56\n" 13137 "---\n" 13138 "IndentWidth: 78\n" 13139 "...\n", 13140 &Style), 13141 ParseError::Error); 13142 EXPECT_EQ(parseConfiguration("---\n" 13143 "Language: JavaScript\n" 13144 "IndentWidth: 56\n" 13145 "---\n" 13146 "Language: JavaScript\n" 13147 "IndentWidth: 78\n" 13148 "...\n", 13149 &Style), 13150 ParseError::Error); 13151 13152 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 13153 } 13154 13155 #undef CHECK_PARSE 13156 13157 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 13158 FormatStyle Style = {}; 13159 Style.Language = FormatStyle::LK_JavaScript; 13160 Style.BreakBeforeTernaryOperators = true; 13161 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 13162 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 13163 13164 Style.BreakBeforeTernaryOperators = true; 13165 EXPECT_EQ(0, parseConfiguration("---\n" 13166 "BasedOnStyle: Google\n" 13167 "---\n" 13168 "Language: JavaScript\n" 13169 "IndentWidth: 76\n" 13170 "...\n", 13171 &Style) 13172 .value()); 13173 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 13174 EXPECT_EQ(76u, Style.IndentWidth); 13175 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 13176 } 13177 13178 TEST_F(FormatTest, ConfigurationRoundTripTest) { 13179 FormatStyle Style = getLLVMStyle(); 13180 std::string YAML = configurationAsText(Style); 13181 FormatStyle ParsedStyle = {}; 13182 ParsedStyle.Language = FormatStyle::LK_Cpp; 13183 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 13184 EXPECT_EQ(Style, ParsedStyle); 13185 } 13186 13187 TEST_F(FormatTest, WorksFor8bitEncodings) { 13188 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 13189 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 13190 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 13191 "\"\xef\xee\xf0\xf3...\"", 13192 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 13193 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 13194 "\xef\xee\xf0\xf3...\"", 13195 getLLVMStyleWithColumns(12))); 13196 } 13197 13198 TEST_F(FormatTest, HandlesUTF8BOM) { 13199 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 13200 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 13201 format("\xef\xbb\xbf#include <iostream>")); 13202 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 13203 format("\xef\xbb\xbf\n#include <iostream>")); 13204 } 13205 13206 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 13207 #if !defined(_MSC_VER) 13208 13209 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 13210 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 13211 getLLVMStyleWithColumns(35)); 13212 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 13213 getLLVMStyleWithColumns(31)); 13214 verifyFormat("// Однажды в студёную зимнюю пору...", 13215 getLLVMStyleWithColumns(36)); 13216 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 13217 verifyFormat("/* Однажды в студёную зимнюю пору... */", 13218 getLLVMStyleWithColumns(39)); 13219 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 13220 getLLVMStyleWithColumns(35)); 13221 } 13222 13223 TEST_F(FormatTest, SplitsUTF8Strings) { 13224 // Non-printable characters' width is currently considered to be the length in 13225 // bytes in UTF8. The characters can be displayed in very different manner 13226 // (zero-width, single width with a substitution glyph, expanded to their code 13227 // (e.g. "<8d>"), so there's no single correct way to handle them. 13228 EXPECT_EQ("\"aaaaÄ\"\n" 13229 "\"\xc2\x8d\";", 13230 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13231 EXPECT_EQ("\"aaaaaaaÄ\"\n" 13232 "\"\xc2\x8d\";", 13233 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13234 EXPECT_EQ("\"Однажды, в \"\n" 13235 "\"студёную \"\n" 13236 "\"зимнюю \"\n" 13237 "\"пору,\"", 13238 format("\"Однажды, в студёную зимнюю пору,\"", 13239 getLLVMStyleWithColumns(13))); 13240 EXPECT_EQ( 13241 "\"一 二 三 \"\n" 13242 "\"四 五六 \"\n" 13243 "\"七 八 九 \"\n" 13244 "\"十\"", 13245 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 13246 EXPECT_EQ("\"一\t\"\n" 13247 "\"二 \t\"\n" 13248 "\"三 四 \"\n" 13249 "\"五\t\"\n" 13250 "\"六 \t\"\n" 13251 "\"七 \"\n" 13252 "\"八九十\tqq\"", 13253 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 13254 getLLVMStyleWithColumns(11))); 13255 13256 // UTF8 character in an escape sequence. 13257 EXPECT_EQ("\"aaaaaa\"\n" 13258 "\"\\\xC2\x8D\"", 13259 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 13260 } 13261 13262 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 13263 EXPECT_EQ("const char *sssss =\n" 13264 " \"一二三四五六七八\\\n" 13265 " 九 十\";", 13266 format("const char *sssss = \"一二三四五六七八\\\n" 13267 " 九 十\";", 13268 getLLVMStyleWithColumns(30))); 13269 } 13270 13271 TEST_F(FormatTest, SplitsUTF8LineComments) { 13272 EXPECT_EQ("// aaaaÄ\xc2\x8d", 13273 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 13274 EXPECT_EQ("// Я из лесу\n" 13275 "// вышел; был\n" 13276 "// сильный\n" 13277 "// мороз.", 13278 format("// Я из лесу вышел; был сильный мороз.", 13279 getLLVMStyleWithColumns(13))); 13280 EXPECT_EQ("// 一二三\n" 13281 "// 四五六七\n" 13282 "// 八 九\n" 13283 "// 十", 13284 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 13285 } 13286 13287 TEST_F(FormatTest, SplitsUTF8BlockComments) { 13288 EXPECT_EQ("/* Гляжу,\n" 13289 " * поднимается\n" 13290 " * медленно в\n" 13291 " * гору\n" 13292 " * Лошадка,\n" 13293 " * везущая\n" 13294 " * хворосту\n" 13295 " * воз. */", 13296 format("/* Гляжу, поднимается медленно в гору\n" 13297 " * Лошадка, везущая хворосту воз. */", 13298 getLLVMStyleWithColumns(13))); 13299 EXPECT_EQ( 13300 "/* 一二三\n" 13301 " * 四五六七\n" 13302 " * 八 九\n" 13303 " * 十 */", 13304 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 13305 EXPECT_EQ("/* \n" 13306 " * \n" 13307 " * - */", 13308 format("/* - */", getLLVMStyleWithColumns(12))); 13309 } 13310 13311 #endif // _MSC_VER 13312 13313 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 13314 FormatStyle Style = getLLVMStyle(); 13315 13316 Style.ConstructorInitializerIndentWidth = 4; 13317 verifyFormat( 13318 "SomeClass::Constructor()\n" 13319 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13320 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13321 Style); 13322 13323 Style.ConstructorInitializerIndentWidth = 2; 13324 verifyFormat( 13325 "SomeClass::Constructor()\n" 13326 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13327 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13328 Style); 13329 13330 Style.ConstructorInitializerIndentWidth = 0; 13331 verifyFormat( 13332 "SomeClass::Constructor()\n" 13333 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13334 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13335 Style); 13336 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13337 verifyFormat( 13338 "SomeLongTemplateVariableName<\n" 13339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 13340 Style); 13341 verifyFormat("bool smaller = 1 < " 13342 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 13343 " " 13344 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 13345 Style); 13346 13347 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 13348 verifyFormat("SomeClass::Constructor() :\n" 13349 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 13350 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 13351 Style); 13352 } 13353 13354 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 13355 FormatStyle Style = getLLVMStyle(); 13356 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 13357 Style.ConstructorInitializerIndentWidth = 4; 13358 verifyFormat("SomeClass::Constructor()\n" 13359 " : a(a)\n" 13360 " , b(b)\n" 13361 " , c(c) {}", 13362 Style); 13363 verifyFormat("SomeClass::Constructor()\n" 13364 " : a(a) {}", 13365 Style); 13366 13367 Style.ColumnLimit = 0; 13368 verifyFormat("SomeClass::Constructor()\n" 13369 " : a(a) {}", 13370 Style); 13371 verifyFormat("SomeClass::Constructor() noexcept\n" 13372 " : a(a) {}", 13373 Style); 13374 verifyFormat("SomeClass::Constructor()\n" 13375 " : a(a)\n" 13376 " , b(b)\n" 13377 " , c(c) {}", 13378 Style); 13379 verifyFormat("SomeClass::Constructor()\n" 13380 " : a(a) {\n" 13381 " foo();\n" 13382 " bar();\n" 13383 "}", 13384 Style); 13385 13386 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 13387 verifyFormat("SomeClass::Constructor()\n" 13388 " : a(a)\n" 13389 " , b(b)\n" 13390 " , c(c) {\n}", 13391 Style); 13392 verifyFormat("SomeClass::Constructor()\n" 13393 " : a(a) {\n}", 13394 Style); 13395 13396 Style.ColumnLimit = 80; 13397 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 13398 Style.ConstructorInitializerIndentWidth = 2; 13399 verifyFormat("SomeClass::Constructor()\n" 13400 " : a(a)\n" 13401 " , b(b)\n" 13402 " , c(c) {}", 13403 Style); 13404 13405 Style.ConstructorInitializerIndentWidth = 0; 13406 verifyFormat("SomeClass::Constructor()\n" 13407 ": a(a)\n" 13408 ", b(b)\n" 13409 ", c(c) {}", 13410 Style); 13411 13412 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 13413 Style.ConstructorInitializerIndentWidth = 4; 13414 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 13415 verifyFormat( 13416 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 13417 Style); 13418 verifyFormat( 13419 "SomeClass::Constructor()\n" 13420 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 13421 Style); 13422 Style.ConstructorInitializerIndentWidth = 4; 13423 Style.ColumnLimit = 60; 13424 verifyFormat("SomeClass::Constructor()\n" 13425 " : aaaaaaaa(aaaaaaaa)\n" 13426 " , aaaaaaaa(aaaaaaaa)\n" 13427 " , aaaaaaaa(aaaaaaaa) {}", 13428 Style); 13429 } 13430 13431 TEST_F(FormatTest, Destructors) { 13432 verifyFormat("void F(int &i) { i.~int(); }"); 13433 verifyFormat("void F(int &i) { i->~int(); }"); 13434 } 13435 13436 TEST_F(FormatTest, FormatsWithWebKitStyle) { 13437 FormatStyle Style = getWebKitStyle(); 13438 13439 // Don't indent in outer namespaces. 13440 verifyFormat("namespace outer {\n" 13441 "int i;\n" 13442 "namespace inner {\n" 13443 " int i;\n" 13444 "} // namespace inner\n" 13445 "} // namespace outer\n" 13446 "namespace other_outer {\n" 13447 "int i;\n" 13448 "}", 13449 Style); 13450 13451 // Don't indent case labels. 13452 verifyFormat("switch (variable) {\n" 13453 "case 1:\n" 13454 "case 2:\n" 13455 " doSomething();\n" 13456 " break;\n" 13457 "default:\n" 13458 " ++variable;\n" 13459 "}", 13460 Style); 13461 13462 // Wrap before binary operators. 13463 EXPECT_EQ("void f()\n" 13464 "{\n" 13465 " if (aaaaaaaaaaaaaaaa\n" 13466 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 13467 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13468 " return;\n" 13469 "}", 13470 format("void f() {\n" 13471 "if (aaaaaaaaaaaaaaaa\n" 13472 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 13473 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13474 "return;\n" 13475 "}", 13476 Style)); 13477 13478 // Allow functions on a single line. 13479 verifyFormat("void f() { return; }", Style); 13480 13481 // Allow empty blocks on a single line and insert a space in empty blocks. 13482 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 13483 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 13484 // However, don't merge non-empty short loops. 13485 EXPECT_EQ("while (true) {\n" 13486 " continue;\n" 13487 "}", 13488 format("while (true) { continue; }", Style)); 13489 13490 // Constructor initializers are formatted one per line with the "," on the 13491 // new line. 13492 verifyFormat("Constructor()\n" 13493 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 13494 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 13495 " aaaaaaaaaaaaaa)\n" 13496 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 13497 "{\n" 13498 "}", 13499 Style); 13500 verifyFormat("SomeClass::Constructor()\n" 13501 " : a(a)\n" 13502 "{\n" 13503 "}", 13504 Style); 13505 EXPECT_EQ("SomeClass::Constructor()\n" 13506 " : a(a)\n" 13507 "{\n" 13508 "}", 13509 format("SomeClass::Constructor():a(a){}", Style)); 13510 verifyFormat("SomeClass::Constructor()\n" 13511 " : a(a)\n" 13512 " , b(b)\n" 13513 " , c(c)\n" 13514 "{\n" 13515 "}", 13516 Style); 13517 verifyFormat("SomeClass::Constructor()\n" 13518 " : a(a)\n" 13519 "{\n" 13520 " foo();\n" 13521 " bar();\n" 13522 "}", 13523 Style); 13524 13525 // Access specifiers should be aligned left. 13526 verifyFormat("class C {\n" 13527 "public:\n" 13528 " int i;\n" 13529 "};", 13530 Style); 13531 13532 // Do not align comments. 13533 verifyFormat("int a; // Do not\n" 13534 "double b; // align comments.", 13535 Style); 13536 13537 // Do not align operands. 13538 EXPECT_EQ("ASSERT(aaaa\n" 13539 " || bbbb);", 13540 format("ASSERT ( aaaa\n||bbbb);", Style)); 13541 13542 // Accept input's line breaks. 13543 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 13544 " || bbbbbbbbbbbbbbb) {\n" 13545 " i++;\n" 13546 "}", 13547 format("if (aaaaaaaaaaaaaaa\n" 13548 "|| bbbbbbbbbbbbbbb) { i++; }", 13549 Style)); 13550 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 13551 " i++;\n" 13552 "}", 13553 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 13554 13555 // Don't automatically break all macro definitions (llvm.org/PR17842). 13556 verifyFormat("#define aNumber 10", Style); 13557 // However, generally keep the line breaks that the user authored. 13558 EXPECT_EQ("#define aNumber \\\n" 13559 " 10", 13560 format("#define aNumber \\\n" 13561 " 10", 13562 Style)); 13563 13564 // Keep empty and one-element array literals on a single line. 13565 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 13566 " copyItems:YES];", 13567 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 13568 "copyItems:YES];", 13569 Style)); 13570 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 13571 " copyItems:YES];", 13572 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 13573 " copyItems:YES];", 13574 Style)); 13575 // FIXME: This does not seem right, there should be more indentation before 13576 // the array literal's entries. Nested blocks have the same problem. 13577 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13578 " @\"a\",\n" 13579 " @\"a\"\n" 13580 "]\n" 13581 " copyItems:YES];", 13582 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13583 " @\"a\",\n" 13584 " @\"a\"\n" 13585 " ]\n" 13586 " copyItems:YES];", 13587 Style)); 13588 EXPECT_EQ( 13589 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13590 " copyItems:YES];", 13591 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13592 " copyItems:YES];", 13593 Style)); 13594 13595 verifyFormat("[self.a b:c c:d];", Style); 13596 EXPECT_EQ("[self.a b:c\n" 13597 " c:d];", 13598 format("[self.a b:c\n" 13599 "c:d];", 13600 Style)); 13601 } 13602 13603 TEST_F(FormatTest, FormatsLambdas) { 13604 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 13605 verifyFormat( 13606 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 13607 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 13608 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 13609 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 13610 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 13611 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 13612 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 13613 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 13614 verifyFormat("int x = f(*+[] {});"); 13615 verifyFormat("void f() {\n" 13616 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 13617 "}\n"); 13618 verifyFormat("void f() {\n" 13619 " other(x.begin(), //\n" 13620 " x.end(), //\n" 13621 " [&](int, int) { return 1; });\n" 13622 "}\n"); 13623 verifyFormat("void f() {\n" 13624 " other.other.other.other.other(\n" 13625 " x.begin(), x.end(),\n" 13626 " [something, rather](int, int, int, int, int, int, int) { " 13627 "return 1; });\n" 13628 "}\n"); 13629 verifyFormat( 13630 "void f() {\n" 13631 " other.other.other.other.other(\n" 13632 " x.begin(), x.end(),\n" 13633 " [something, rather](int, int, int, int, int, int, int) {\n" 13634 " //\n" 13635 " });\n" 13636 "}\n"); 13637 verifyFormat("SomeFunction([]() { // A cool function...\n" 13638 " return 43;\n" 13639 "});"); 13640 EXPECT_EQ("SomeFunction([]() {\n" 13641 "#define A a\n" 13642 " return 43;\n" 13643 "});", 13644 format("SomeFunction([](){\n" 13645 "#define A a\n" 13646 "return 43;\n" 13647 "});")); 13648 verifyFormat("void f() {\n" 13649 " SomeFunction([](decltype(x), A *a) {});\n" 13650 "}"); 13651 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13652 " [](const aaaaaaaaaa &a) { return a; });"); 13653 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 13654 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 13655 "});"); 13656 verifyFormat("Constructor()\n" 13657 " : Field([] { // comment\n" 13658 " int i;\n" 13659 " }) {}"); 13660 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 13661 " return some_parameter.size();\n" 13662 "};"); 13663 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 13664 " [](const string &s) { return s; };"); 13665 verifyFormat("int i = aaaaaa ? 1 //\n" 13666 " : [] {\n" 13667 " return 2; //\n" 13668 " }();"); 13669 verifyFormat("llvm::errs() << \"number of twos is \"\n" 13670 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 13671 " return x == 2; // force break\n" 13672 " });"); 13673 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13674 " [=](int iiiiiiiiiiii) {\n" 13675 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 13676 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 13677 " });", 13678 getLLVMStyleWithColumns(60)); 13679 verifyFormat("SomeFunction({[&] {\n" 13680 " // comment\n" 13681 " },\n" 13682 " [&] {\n" 13683 " // comment\n" 13684 " }});"); 13685 verifyFormat("SomeFunction({[&] {\n" 13686 " // comment\n" 13687 "}});"); 13688 verifyFormat( 13689 "virtual aaaaaaaaaaaaaaaa(\n" 13690 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 13691 " aaaaa aaaaaaaaa);"); 13692 13693 // Lambdas with return types. 13694 verifyFormat("int c = []() -> int { return 2; }();\n"); 13695 verifyFormat("int c = []() -> int * { return 2; }();\n"); 13696 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 13697 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 13698 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 13699 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 13700 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 13701 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 13702 verifyFormat("[a, a]() -> a<1> {};"); 13703 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 13704 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 13705 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 13706 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 13707 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 13708 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 13709 verifyFormat("[]() -> foo<!5> { return {}; };"); 13710 verifyFormat("[]() -> foo<~5> { return {}; };"); 13711 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 13712 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 13713 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 13714 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 13715 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 13716 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 13717 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 13718 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 13719 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 13720 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 13721 verifyFormat("namespace bar {\n" 13722 "// broken:\n" 13723 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 13724 "} // namespace bar"); 13725 verifyFormat("namespace bar {\n" 13726 "// broken:\n" 13727 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 13728 "} // namespace bar"); 13729 verifyFormat("namespace bar {\n" 13730 "// broken:\n" 13731 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 13732 "} // namespace bar"); 13733 verifyFormat("namespace bar {\n" 13734 "// broken:\n" 13735 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 13736 "} // namespace bar"); 13737 verifyFormat("namespace bar {\n" 13738 "// broken:\n" 13739 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 13740 "} // namespace bar"); 13741 verifyFormat("namespace bar {\n" 13742 "// broken:\n" 13743 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 13744 "} // namespace bar"); 13745 verifyFormat("namespace bar {\n" 13746 "// broken:\n" 13747 "auto foo{[]() -> foo<!5> { return {}; }};\n" 13748 "} // namespace bar"); 13749 verifyFormat("namespace bar {\n" 13750 "// broken:\n" 13751 "auto foo{[]() -> foo<~5> { return {}; }};\n" 13752 "} // namespace bar"); 13753 verifyFormat("namespace bar {\n" 13754 "// broken:\n" 13755 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 13756 "} // namespace bar"); 13757 verifyFormat("namespace bar {\n" 13758 "// broken:\n" 13759 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 13760 "} // namespace bar"); 13761 verifyFormat("namespace bar {\n" 13762 "// broken:\n" 13763 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 13764 "} // namespace bar"); 13765 verifyFormat("namespace bar {\n" 13766 "// broken:\n" 13767 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 13768 "} // namespace bar"); 13769 verifyFormat("namespace bar {\n" 13770 "// broken:\n" 13771 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 13772 "} // namespace bar"); 13773 verifyFormat("namespace bar {\n" 13774 "// broken:\n" 13775 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 13776 "} // namespace bar"); 13777 verifyFormat("namespace bar {\n" 13778 "// broken:\n" 13779 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 13780 "} // namespace bar"); 13781 verifyFormat("namespace bar {\n" 13782 "// broken:\n" 13783 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 13784 "} // namespace bar"); 13785 verifyFormat("namespace bar {\n" 13786 "// broken:\n" 13787 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 13788 "} // namespace bar"); 13789 verifyFormat("namespace bar {\n" 13790 "// broken:\n" 13791 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 13792 "} // namespace bar"); 13793 verifyFormat("[]() -> a<1> {};"); 13794 verifyFormat("[]() -> a<1> { ; };"); 13795 verifyFormat("[]() -> a<1> { ; }();"); 13796 verifyFormat("[a, a]() -> a<true> {};"); 13797 verifyFormat("[]() -> a<true> {};"); 13798 verifyFormat("[]() -> a<true> { ; };"); 13799 verifyFormat("[]() -> a<true> { ; }();"); 13800 verifyFormat("[a, a]() -> a<false> {};"); 13801 verifyFormat("[]() -> a<false> {};"); 13802 verifyFormat("[]() -> a<false> { ; };"); 13803 verifyFormat("[]() -> a<false> { ; }();"); 13804 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 13805 verifyFormat("namespace bar {\n" 13806 "auto foo{[]() -> foo<false> { ; }};\n" 13807 "} // namespace bar"); 13808 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 13809 " int j) -> int {\n" 13810 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 13811 "};"); 13812 verifyFormat( 13813 "aaaaaaaaaaaaaaaaaaaaaa(\n" 13814 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 13815 " return aaaaaaaaaaaaaaaaa;\n" 13816 " });", 13817 getLLVMStyleWithColumns(70)); 13818 verifyFormat("[]() //\n" 13819 " -> int {\n" 13820 " return 1; //\n" 13821 "};"); 13822 13823 // Lambdas with explicit template argument lists. 13824 verifyFormat( 13825 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 13826 13827 // Multiple lambdas in the same parentheses change indentation rules. These 13828 // lambdas are forced to start on new lines. 13829 verifyFormat("SomeFunction(\n" 13830 " []() {\n" 13831 " //\n" 13832 " },\n" 13833 " []() {\n" 13834 " //\n" 13835 " });"); 13836 13837 // A lambda passed as arg0 is always pushed to the next line. 13838 verifyFormat("SomeFunction(\n" 13839 " [this] {\n" 13840 " //\n" 13841 " },\n" 13842 " 1);\n"); 13843 13844 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 13845 // the arg0 case above. 13846 auto Style = getGoogleStyle(); 13847 Style.BinPackArguments = false; 13848 verifyFormat("SomeFunction(\n" 13849 " a,\n" 13850 " [this] {\n" 13851 " //\n" 13852 " },\n" 13853 " b);\n", 13854 Style); 13855 verifyFormat("SomeFunction(\n" 13856 " a,\n" 13857 " [this] {\n" 13858 " //\n" 13859 " },\n" 13860 " b);\n"); 13861 13862 // A lambda with a very long line forces arg0 to be pushed out irrespective of 13863 // the BinPackArguments value (as long as the code is wide enough). 13864 verifyFormat( 13865 "something->SomeFunction(\n" 13866 " a,\n" 13867 " [this] {\n" 13868 " " 13869 "D0000000000000000000000000000000000000000000000000000000000001();\n" 13870 " },\n" 13871 " b);\n"); 13872 13873 // A multi-line lambda is pulled up as long as the introducer fits on the 13874 // previous line and there are no further args. 13875 verifyFormat("function(1, [this, that] {\n" 13876 " //\n" 13877 "});\n"); 13878 verifyFormat("function([this, that] {\n" 13879 " //\n" 13880 "});\n"); 13881 // FIXME: this format is not ideal and we should consider forcing the first 13882 // arg onto its own line. 13883 verifyFormat("function(a, b, c, //\n" 13884 " d, [this, that] {\n" 13885 " //\n" 13886 " });\n"); 13887 13888 // Multiple lambdas are treated correctly even when there is a short arg0. 13889 verifyFormat("SomeFunction(\n" 13890 " 1,\n" 13891 " [this] {\n" 13892 " //\n" 13893 " },\n" 13894 " [this] {\n" 13895 " //\n" 13896 " },\n" 13897 " 1);\n"); 13898 13899 // More complex introducers. 13900 verifyFormat("return [i, args...] {};"); 13901 13902 // Not lambdas. 13903 verifyFormat("constexpr char hello[]{\"hello\"};"); 13904 verifyFormat("double &operator[](int i) { return 0; }\n" 13905 "int i;"); 13906 verifyFormat("std::unique_ptr<int[]> foo() {}"); 13907 verifyFormat("int i = a[a][a]->f();"); 13908 verifyFormat("int i = (*b)[a]->f();"); 13909 13910 // Other corner cases. 13911 verifyFormat("void f() {\n" 13912 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 13913 " );\n" 13914 "}"); 13915 13916 // Lambdas created through weird macros. 13917 verifyFormat("void f() {\n" 13918 " MACRO((const AA &a) { return 1; });\n" 13919 " MACRO((AA &a) { return 1; });\n" 13920 "}"); 13921 13922 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 13923 " doo_dah();\n" 13924 " doo_dah();\n" 13925 " })) {\n" 13926 "}"); 13927 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 13928 " doo_dah();\n" 13929 " doo_dah();\n" 13930 " })) {\n" 13931 "}"); 13932 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 13933 " doo_dah();\n" 13934 " doo_dah();\n" 13935 " })) {\n" 13936 "}"); 13937 verifyFormat("auto lambda = []() {\n" 13938 " int a = 2\n" 13939 "#if A\n" 13940 " + 2\n" 13941 "#endif\n" 13942 " ;\n" 13943 "};"); 13944 13945 // Lambdas with complex multiline introducers. 13946 verifyFormat( 13947 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13948 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 13949 " -> ::std::unordered_set<\n" 13950 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 13951 " //\n" 13952 " });"); 13953 13954 FormatStyle DoNotMerge = getLLVMStyle(); 13955 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13956 verifyFormat("auto c = []() {\n" 13957 " return b;\n" 13958 "};", 13959 "auto c = []() { return b; };", DoNotMerge); 13960 verifyFormat("auto c = []() {\n" 13961 "};", 13962 " auto c = []() {};", DoNotMerge); 13963 13964 FormatStyle MergeEmptyOnly = getLLVMStyle(); 13965 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 13966 verifyFormat("auto c = []() {\n" 13967 " return b;\n" 13968 "};", 13969 "auto c = []() {\n" 13970 " return b;\n" 13971 " };", 13972 MergeEmptyOnly); 13973 verifyFormat("auto c = []() {};", 13974 "auto c = []() {\n" 13975 "};", 13976 MergeEmptyOnly); 13977 13978 FormatStyle MergeInline = getLLVMStyle(); 13979 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 13980 verifyFormat("auto c = []() {\n" 13981 " return b;\n" 13982 "};", 13983 "auto c = []() { return b; };", MergeInline); 13984 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 13985 MergeInline); 13986 verifyFormat("function([]() { return b; }, a)", 13987 "function([]() { return b; }, a)", MergeInline); 13988 verifyFormat("function(a, []() { return b; })", 13989 "function(a, []() { return b; })", MergeInline); 13990 13991 // Check option "BraceWrapping.BeforeLambdaBody" and different state of 13992 // AllowShortLambdasOnASingleLine 13993 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 13994 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 13995 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 13996 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 13997 FormatStyle::ShortLambdaStyle::SLS_None; 13998 verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n" 13999 " []()\n" 14000 " {\n" 14001 " return 17;\n" 14002 " });", 14003 LLVMWithBeforeLambdaBody); 14004 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n" 14005 " []()\n" 14006 " {\n" 14007 " });", 14008 LLVMWithBeforeLambdaBody); 14009 verifyFormat("auto fct_SLS_None = []()\n" 14010 "{\n" 14011 " return 17;\n" 14012 "};", 14013 LLVMWithBeforeLambdaBody); 14014 verifyFormat("TwoNestedLambdas_SLS_None(\n" 14015 " []()\n" 14016 " {\n" 14017 " return Call(\n" 14018 " []()\n" 14019 " {\n" 14020 " return 17;\n" 14021 " });\n" 14022 " });", 14023 LLVMWithBeforeLambdaBody); 14024 verifyFormat("void Fct()\n" 14025 "{\n" 14026 " return {[]()\n" 14027 " {\n" 14028 " return 17;\n" 14029 " }};\n" 14030 "}", 14031 LLVMWithBeforeLambdaBody); 14032 14033 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14034 FormatStyle::ShortLambdaStyle::SLS_Empty; 14035 verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" 14036 " []()\n" 14037 " {\n" 14038 " return 17;\n" 14039 " });", 14040 LLVMWithBeforeLambdaBody); 14041 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});", 14042 LLVMWithBeforeLambdaBody); 14043 verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL" 14044 "ongFunctionName_SLS_Empty(\n" 14045 " []() {});", 14046 LLVMWithBeforeLambdaBody); 14047 verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n" 14048 " []()\n" 14049 " {\n" 14050 " return 17;\n" 14051 " });", 14052 LLVMWithBeforeLambdaBody); 14053 verifyFormat("auto fct_SLS_Empty = []()\n" 14054 "{\n" 14055 " return 17;\n" 14056 "};", 14057 LLVMWithBeforeLambdaBody); 14058 verifyFormat("TwoNestedLambdas_SLS_Empty(\n" 14059 " []()\n" 14060 " {\n" 14061 " return Call([]() {});\n" 14062 " });", 14063 LLVMWithBeforeLambdaBody); 14064 verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n" 14065 " []()\n" 14066 " {\n" 14067 " return Call([]() {});\n" 14068 " });", 14069 LLVMWithBeforeLambdaBody); 14070 verifyFormat( 14071 "FctWithLongLineInLambda_SLS_Empty(\n" 14072 " []()\n" 14073 " {\n" 14074 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14075 " AndShouldNotBeConsiderAsInline,\n" 14076 " LambdaBodyMustBeBreak);\n" 14077 " });", 14078 LLVMWithBeforeLambdaBody); 14079 14080 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14081 FormatStyle::ShortLambdaStyle::SLS_Inline; 14082 verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });", 14083 LLVMWithBeforeLambdaBody); 14084 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});", 14085 LLVMWithBeforeLambdaBody); 14086 verifyFormat("auto fct_SLS_Inline = []()\n" 14087 "{\n" 14088 " return 17;\n" 14089 "};", 14090 LLVMWithBeforeLambdaBody); 14091 verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return " 14092 "17; }); });", 14093 LLVMWithBeforeLambdaBody); 14094 verifyFormat( 14095 "FctWithLongLineInLambda_SLS_Inline(\n" 14096 " []()\n" 14097 " {\n" 14098 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14099 " AndShouldNotBeConsiderAsInline,\n" 14100 " LambdaBodyMustBeBreak);\n" 14101 " });", 14102 LLVMWithBeforeLambdaBody); 14103 verifyFormat("FctWithMultipleParams_SLS_Inline(" 14104 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 14105 " []() { return 17; });", 14106 LLVMWithBeforeLambdaBody); 14107 verifyFormat( 14108 "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });", 14109 LLVMWithBeforeLambdaBody); 14110 14111 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14112 FormatStyle::ShortLambdaStyle::SLS_All; 14113 verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });", 14114 LLVMWithBeforeLambdaBody); 14115 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});", 14116 LLVMWithBeforeLambdaBody); 14117 verifyFormat("auto fct_SLS_All = []() { return 17; };", 14118 LLVMWithBeforeLambdaBody); 14119 verifyFormat("FctWithOneParam_SLS_All(\n" 14120 " []()\n" 14121 " {\n" 14122 " // A cool function...\n" 14123 " return 43;\n" 14124 " });", 14125 LLVMWithBeforeLambdaBody); 14126 verifyFormat("FctWithMultipleParams_SLS_All(" 14127 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 14128 " []() { return 17; });", 14129 LLVMWithBeforeLambdaBody); 14130 verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });", 14131 LLVMWithBeforeLambdaBody); 14132 verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });", 14133 LLVMWithBeforeLambdaBody); 14134 verifyFormat( 14135 "FctWithLongLineInLambda_SLS_All(\n" 14136 " []()\n" 14137 " {\n" 14138 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14139 " AndShouldNotBeConsiderAsInline,\n" 14140 " LambdaBodyMustBeBreak);\n" 14141 " });", 14142 LLVMWithBeforeLambdaBody); 14143 verifyFormat( 14144 "auto fct_SLS_All = []()\n" 14145 "{\n" 14146 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14147 " AndShouldNotBeConsiderAsInline,\n" 14148 " LambdaBodyMustBeBreak);\n" 14149 "};", 14150 LLVMWithBeforeLambdaBody); 14151 LLVMWithBeforeLambdaBody.BinPackParameters = false; 14152 verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);", 14153 LLVMWithBeforeLambdaBody); 14154 verifyFormat( 14155 "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n" 14156 " FirstParam,\n" 14157 " SecondParam,\n" 14158 " ThirdParam,\n" 14159 " FourthParam);", 14160 LLVMWithBeforeLambdaBody); 14161 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 14162 " []() { return " 14163 "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n" 14164 " FirstParam,\n" 14165 " SecondParam,\n" 14166 " ThirdParam,\n" 14167 " FourthParam);", 14168 LLVMWithBeforeLambdaBody); 14169 verifyFormat( 14170 "FctWithLongLineInLambda_SLS_All(FirstParam,\n" 14171 " SecondParam,\n" 14172 " ThirdParam,\n" 14173 " FourthParam,\n" 14174 " []() { return SomeValueNotSoLong; });", 14175 LLVMWithBeforeLambdaBody); 14176 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 14177 " []()\n" 14178 " {\n" 14179 " return " 14180 "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB" 14181 "eConsiderAsInline;\n" 14182 " });", 14183 LLVMWithBeforeLambdaBody); 14184 verifyFormat( 14185 "FctWithLongLineInLambda_SLS_All(\n" 14186 " []()\n" 14187 " {\n" 14188 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14189 " AndShouldNotBeConsiderAsInline,\n" 14190 " LambdaBodyMustBeBreak);\n" 14191 " });", 14192 LLVMWithBeforeLambdaBody); 14193 verifyFormat("FctWithTwoParams_SLS_All(\n" 14194 " []()\n" 14195 " {\n" 14196 " // A cool function...\n" 14197 " return 43;\n" 14198 " },\n" 14199 " 87);", 14200 LLVMWithBeforeLambdaBody); 14201 verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);", 14202 LLVMWithBeforeLambdaBody); 14203 verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });", 14204 LLVMWithBeforeLambdaBody); 14205 verifyFormat( 14206 "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });", 14207 LLVMWithBeforeLambdaBody); 14208 verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; " 14209 "}); }, x);", 14210 LLVMWithBeforeLambdaBody); 14211 verifyFormat("TwoNestedLambdas_SLS_All(\n" 14212 " []()\n" 14213 " {\n" 14214 " // A cool function...\n" 14215 " return Call([]() { return 17; });\n" 14216 " });", 14217 LLVMWithBeforeLambdaBody); 14218 verifyFormat("TwoNestedLambdas_SLS_All(\n" 14219 " []()\n" 14220 " {\n" 14221 " return Call(\n" 14222 " []()\n" 14223 " {\n" 14224 " // A cool function...\n" 14225 " return 17;\n" 14226 " });\n" 14227 " });", 14228 LLVMWithBeforeLambdaBody); 14229 } 14230 14231 TEST_F(FormatTest, EmptyLinesInLambdas) { 14232 verifyFormat("auto lambda = []() {\n" 14233 " x(); //\n" 14234 "};", 14235 "auto lambda = []() {\n" 14236 "\n" 14237 " x(); //\n" 14238 "\n" 14239 "};"); 14240 } 14241 14242 TEST_F(FormatTest, FormatsBlocks) { 14243 FormatStyle ShortBlocks = getLLVMStyle(); 14244 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 14245 verifyFormat("int (^Block)(int, int);", ShortBlocks); 14246 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 14247 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 14248 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 14249 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 14250 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 14251 14252 verifyFormat("foo(^{ bar(); });", ShortBlocks); 14253 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 14254 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 14255 14256 verifyFormat("[operation setCompletionBlock:^{\n" 14257 " [self onOperationDone];\n" 14258 "}];"); 14259 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 14260 " [self onOperationDone];\n" 14261 "}]};"); 14262 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 14263 " f();\n" 14264 "}];"); 14265 verifyFormat("int a = [operation block:^int(int *i) {\n" 14266 " return 1;\n" 14267 "}];"); 14268 verifyFormat("[myObject doSomethingWith:arg1\n" 14269 " aaa:^int(int *a) {\n" 14270 " return 1;\n" 14271 " }\n" 14272 " bbb:f(a * bbbbbbbb)];"); 14273 14274 verifyFormat("[operation setCompletionBlock:^{\n" 14275 " [self.delegate newDataAvailable];\n" 14276 "}];", 14277 getLLVMStyleWithColumns(60)); 14278 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 14279 " NSString *path = [self sessionFilePath];\n" 14280 " if (path) {\n" 14281 " // ...\n" 14282 " }\n" 14283 "});"); 14284 verifyFormat("[[SessionService sharedService]\n" 14285 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14286 " if (window) {\n" 14287 " [self windowDidLoad:window];\n" 14288 " } else {\n" 14289 " [self errorLoadingWindow];\n" 14290 " }\n" 14291 " }];"); 14292 verifyFormat("void (^largeBlock)(void) = ^{\n" 14293 " // ...\n" 14294 "};\n", 14295 getLLVMStyleWithColumns(40)); 14296 verifyFormat("[[SessionService sharedService]\n" 14297 " loadWindowWithCompletionBlock: //\n" 14298 " ^(SessionWindow *window) {\n" 14299 " if (window) {\n" 14300 " [self windowDidLoad:window];\n" 14301 " } else {\n" 14302 " [self errorLoadingWindow];\n" 14303 " }\n" 14304 " }];", 14305 getLLVMStyleWithColumns(60)); 14306 verifyFormat("[myObject doSomethingWith:arg1\n" 14307 " firstBlock:^(Foo *a) {\n" 14308 " // ...\n" 14309 " int i;\n" 14310 " }\n" 14311 " secondBlock:^(Bar *b) {\n" 14312 " // ...\n" 14313 " int i;\n" 14314 " }\n" 14315 " thirdBlock:^Foo(Bar *b) {\n" 14316 " // ...\n" 14317 " int i;\n" 14318 " }];"); 14319 verifyFormat("[myObject doSomethingWith:arg1\n" 14320 " firstBlock:-1\n" 14321 " secondBlock:^(Bar *b) {\n" 14322 " // ...\n" 14323 " int i;\n" 14324 " }];"); 14325 14326 verifyFormat("f(^{\n" 14327 " @autoreleasepool {\n" 14328 " if (a) {\n" 14329 " g();\n" 14330 " }\n" 14331 " }\n" 14332 "});"); 14333 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 14334 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 14335 "};"); 14336 14337 FormatStyle FourIndent = getLLVMStyle(); 14338 FourIndent.ObjCBlockIndentWidth = 4; 14339 verifyFormat("[operation setCompletionBlock:^{\n" 14340 " [self onOperationDone];\n" 14341 "}];", 14342 FourIndent); 14343 } 14344 14345 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 14346 FormatStyle ZeroColumn = getLLVMStyle(); 14347 ZeroColumn.ColumnLimit = 0; 14348 14349 verifyFormat("[[SessionService sharedService] " 14350 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14351 " if (window) {\n" 14352 " [self windowDidLoad:window];\n" 14353 " } else {\n" 14354 " [self errorLoadingWindow];\n" 14355 " }\n" 14356 "}];", 14357 ZeroColumn); 14358 EXPECT_EQ("[[SessionService sharedService]\n" 14359 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14360 " if (window) {\n" 14361 " [self windowDidLoad:window];\n" 14362 " } else {\n" 14363 " [self errorLoadingWindow];\n" 14364 " }\n" 14365 " }];", 14366 format("[[SessionService sharedService]\n" 14367 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14368 " if (window) {\n" 14369 " [self windowDidLoad:window];\n" 14370 " } else {\n" 14371 " [self errorLoadingWindow];\n" 14372 " }\n" 14373 "}];", 14374 ZeroColumn)); 14375 verifyFormat("[myObject doSomethingWith:arg1\n" 14376 " firstBlock:^(Foo *a) {\n" 14377 " // ...\n" 14378 " int i;\n" 14379 " }\n" 14380 " secondBlock:^(Bar *b) {\n" 14381 " // ...\n" 14382 " int i;\n" 14383 " }\n" 14384 " thirdBlock:^Foo(Bar *b) {\n" 14385 " // ...\n" 14386 " int i;\n" 14387 " }];", 14388 ZeroColumn); 14389 verifyFormat("f(^{\n" 14390 " @autoreleasepool {\n" 14391 " if (a) {\n" 14392 " g();\n" 14393 " }\n" 14394 " }\n" 14395 "});", 14396 ZeroColumn); 14397 verifyFormat("void (^largeBlock)(void) = ^{\n" 14398 " // ...\n" 14399 "};", 14400 ZeroColumn); 14401 14402 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 14403 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 14404 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 14405 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 14406 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 14407 " int i;\n" 14408 "};", 14409 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 14410 } 14411 14412 TEST_F(FormatTest, SupportsCRLF) { 14413 EXPECT_EQ("int a;\r\n" 14414 "int b;\r\n" 14415 "int c;\r\n", 14416 format("int a;\r\n" 14417 " int b;\r\n" 14418 " int c;\r\n", 14419 getLLVMStyle())); 14420 EXPECT_EQ("int a;\r\n" 14421 "int b;\r\n" 14422 "int c;\r\n", 14423 format("int a;\r\n" 14424 " int b;\n" 14425 " int c;\r\n", 14426 getLLVMStyle())); 14427 EXPECT_EQ("int a;\n" 14428 "int b;\n" 14429 "int c;\n", 14430 format("int a;\r\n" 14431 " int b;\n" 14432 " int c;\n", 14433 getLLVMStyle())); 14434 EXPECT_EQ("\"aaaaaaa \"\r\n" 14435 "\"bbbbbbb\";\r\n", 14436 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 14437 EXPECT_EQ("#define A \\\r\n" 14438 " b; \\\r\n" 14439 " c; \\\r\n" 14440 " d;\r\n", 14441 format("#define A \\\r\n" 14442 " b; \\\r\n" 14443 " c; d; \r\n", 14444 getGoogleStyle())); 14445 14446 EXPECT_EQ("/*\r\n" 14447 "multi line block comments\r\n" 14448 "should not introduce\r\n" 14449 "an extra carriage return\r\n" 14450 "*/\r\n", 14451 format("/*\r\n" 14452 "multi line block comments\r\n" 14453 "should not introduce\r\n" 14454 "an extra carriage return\r\n" 14455 "*/\r\n")); 14456 EXPECT_EQ("/*\r\n" 14457 "\r\n" 14458 "*/", 14459 format("/*\r\n" 14460 " \r\r\r\n" 14461 "*/")); 14462 14463 FormatStyle style = getLLVMStyle(); 14464 14465 style.DeriveLineEnding = true; 14466 style.UseCRLF = false; 14467 EXPECT_EQ("union FooBarBazQux {\n" 14468 " int foo;\n" 14469 " int bar;\n" 14470 " int baz;\n" 14471 "};", 14472 format("union FooBarBazQux {\r\n" 14473 " int foo;\n" 14474 " int bar;\r\n" 14475 " int baz;\n" 14476 "};", 14477 style)); 14478 style.UseCRLF = true; 14479 EXPECT_EQ("union FooBarBazQux {\r\n" 14480 " int foo;\r\n" 14481 " int bar;\r\n" 14482 " int baz;\r\n" 14483 "};", 14484 format("union FooBarBazQux {\r\n" 14485 " int foo;\n" 14486 " int bar;\r\n" 14487 " int baz;\n" 14488 "};", 14489 style)); 14490 14491 style.DeriveLineEnding = false; 14492 style.UseCRLF = false; 14493 EXPECT_EQ("union FooBarBazQux {\n" 14494 " int foo;\n" 14495 " int bar;\n" 14496 " int baz;\n" 14497 " int qux;\n" 14498 "};", 14499 format("union FooBarBazQux {\r\n" 14500 " int foo;\n" 14501 " int bar;\r\n" 14502 " int baz;\n" 14503 " int qux;\r\n" 14504 "};", 14505 style)); 14506 style.UseCRLF = true; 14507 EXPECT_EQ("union FooBarBazQux {\r\n" 14508 " int foo;\r\n" 14509 " int bar;\r\n" 14510 " int baz;\r\n" 14511 " int qux;\r\n" 14512 "};", 14513 format("union FooBarBazQux {\r\n" 14514 " int foo;\n" 14515 " int bar;\r\n" 14516 " int baz;\n" 14517 " int qux;\n" 14518 "};", 14519 style)); 14520 14521 style.DeriveLineEnding = true; 14522 style.UseCRLF = false; 14523 EXPECT_EQ("union FooBarBazQux {\r\n" 14524 " int foo;\r\n" 14525 " int bar;\r\n" 14526 " int baz;\r\n" 14527 " int qux;\r\n" 14528 "};", 14529 format("union FooBarBazQux {\r\n" 14530 " int foo;\n" 14531 " int bar;\r\n" 14532 " int baz;\n" 14533 " int qux;\r\n" 14534 "};", 14535 style)); 14536 style.UseCRLF = true; 14537 EXPECT_EQ("union FooBarBazQux {\n" 14538 " int foo;\n" 14539 " int bar;\n" 14540 " int baz;\n" 14541 " int qux;\n" 14542 "};", 14543 format("union FooBarBazQux {\r\n" 14544 " int foo;\n" 14545 " int bar;\r\n" 14546 " int baz;\n" 14547 " int qux;\n" 14548 "};", 14549 style)); 14550 } 14551 14552 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 14553 verifyFormat("MY_CLASS(C) {\n" 14554 " int i;\n" 14555 " int j;\n" 14556 "};"); 14557 } 14558 14559 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 14560 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 14561 TwoIndent.ContinuationIndentWidth = 2; 14562 14563 EXPECT_EQ("int i =\n" 14564 " longFunction(\n" 14565 " arg);", 14566 format("int i = longFunction(arg);", TwoIndent)); 14567 14568 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 14569 SixIndent.ContinuationIndentWidth = 6; 14570 14571 EXPECT_EQ("int i =\n" 14572 " longFunction(\n" 14573 " arg);", 14574 format("int i = longFunction(arg);", SixIndent)); 14575 } 14576 14577 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 14578 FormatStyle Style = getLLVMStyle(); 14579 verifyFormat("int Foo::getter(\n" 14580 " //\n" 14581 ") const {\n" 14582 " return foo;\n" 14583 "}", 14584 Style); 14585 verifyFormat("void Foo::setter(\n" 14586 " //\n" 14587 ") {\n" 14588 " foo = 1;\n" 14589 "}", 14590 Style); 14591 } 14592 14593 TEST_F(FormatTest, SpacesInAngles) { 14594 FormatStyle Spaces = getLLVMStyle(); 14595 Spaces.SpacesInAngles = true; 14596 14597 verifyFormat("static_cast< int >(arg);", Spaces); 14598 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 14599 verifyFormat("f< int, float >();", Spaces); 14600 verifyFormat("template <> g() {}", Spaces); 14601 verifyFormat("template < std::vector< int > > f() {}", Spaces); 14602 verifyFormat("std::function< void(int, int) > fct;", Spaces); 14603 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 14604 Spaces); 14605 14606 Spaces.Standard = FormatStyle::LS_Cpp03; 14607 Spaces.SpacesInAngles = true; 14608 verifyFormat("A< A< int > >();", Spaces); 14609 14610 Spaces.SpacesInAngles = false; 14611 verifyFormat("A<A<int> >();", Spaces); 14612 14613 Spaces.Standard = FormatStyle::LS_Cpp11; 14614 Spaces.SpacesInAngles = true; 14615 verifyFormat("A< A< int > >();", Spaces); 14616 14617 Spaces.SpacesInAngles = false; 14618 verifyFormat("A<A<int>>();", Spaces); 14619 } 14620 14621 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 14622 FormatStyle Style = getLLVMStyle(); 14623 Style.SpaceAfterTemplateKeyword = false; 14624 verifyFormat("template<int> void foo();", Style); 14625 } 14626 14627 TEST_F(FormatTest, TripleAngleBrackets) { 14628 verifyFormat("f<<<1, 1>>>();"); 14629 verifyFormat("f<<<1, 1, 1, s>>>();"); 14630 verifyFormat("f<<<a, b, c, d>>>();"); 14631 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 14632 verifyFormat("f<param><<<1, 1>>>();"); 14633 verifyFormat("f<1><<<1, 1>>>();"); 14634 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 14635 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14636 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 14637 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 14638 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 14639 } 14640 14641 TEST_F(FormatTest, MergeLessLessAtEnd) { 14642 verifyFormat("<<"); 14643 EXPECT_EQ("< < <", format("\\\n<<<")); 14644 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14645 "aaallvm::outs() <<"); 14646 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14647 "aaaallvm::outs()\n <<"); 14648 } 14649 14650 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 14651 std::string code = "#if A\n" 14652 "#if B\n" 14653 "a.\n" 14654 "#endif\n" 14655 " a = 1;\n" 14656 "#else\n" 14657 "#endif\n" 14658 "#if C\n" 14659 "#else\n" 14660 "#endif\n"; 14661 EXPECT_EQ(code, format(code)); 14662 } 14663 14664 TEST_F(FormatTest, HandleConflictMarkers) { 14665 // Git/SVN conflict markers. 14666 EXPECT_EQ("int a;\n" 14667 "void f() {\n" 14668 " callme(some(parameter1,\n" 14669 "<<<<<<< text by the vcs\n" 14670 " parameter2),\n" 14671 "||||||| text by the vcs\n" 14672 " parameter2),\n" 14673 " parameter3,\n" 14674 "======= text by the vcs\n" 14675 " parameter2, parameter3),\n" 14676 ">>>>>>> text by the vcs\n" 14677 " otherparameter);\n", 14678 format("int a;\n" 14679 "void f() {\n" 14680 " callme(some(parameter1,\n" 14681 "<<<<<<< text by the vcs\n" 14682 " parameter2),\n" 14683 "||||||| text by the vcs\n" 14684 " parameter2),\n" 14685 " parameter3,\n" 14686 "======= text by the vcs\n" 14687 " parameter2,\n" 14688 " parameter3),\n" 14689 ">>>>>>> text by the vcs\n" 14690 " otherparameter);\n")); 14691 14692 // Perforce markers. 14693 EXPECT_EQ("void f() {\n" 14694 " function(\n" 14695 ">>>> text by the vcs\n" 14696 " parameter,\n" 14697 "==== text by the vcs\n" 14698 " parameter,\n" 14699 "==== text by the vcs\n" 14700 " parameter,\n" 14701 "<<<< text by the vcs\n" 14702 " parameter);\n", 14703 format("void f() {\n" 14704 " function(\n" 14705 ">>>> text by the vcs\n" 14706 " parameter,\n" 14707 "==== text by the vcs\n" 14708 " parameter,\n" 14709 "==== text by the vcs\n" 14710 " parameter,\n" 14711 "<<<< text by the vcs\n" 14712 " parameter);\n")); 14713 14714 EXPECT_EQ("<<<<<<<\n" 14715 "|||||||\n" 14716 "=======\n" 14717 ">>>>>>>", 14718 format("<<<<<<<\n" 14719 "|||||||\n" 14720 "=======\n" 14721 ">>>>>>>")); 14722 14723 EXPECT_EQ("<<<<<<<\n" 14724 "|||||||\n" 14725 "int i;\n" 14726 "=======\n" 14727 ">>>>>>>", 14728 format("<<<<<<<\n" 14729 "|||||||\n" 14730 "int i;\n" 14731 "=======\n" 14732 ">>>>>>>")); 14733 14734 // FIXME: Handle parsing of macros around conflict markers correctly: 14735 EXPECT_EQ("#define Macro \\\n" 14736 "<<<<<<<\n" 14737 "Something \\\n" 14738 "|||||||\n" 14739 "Else \\\n" 14740 "=======\n" 14741 "Other \\\n" 14742 ">>>>>>>\n" 14743 " End int i;\n", 14744 format("#define Macro \\\n" 14745 "<<<<<<<\n" 14746 " Something \\\n" 14747 "|||||||\n" 14748 " Else \\\n" 14749 "=======\n" 14750 " Other \\\n" 14751 ">>>>>>>\n" 14752 " End\n" 14753 "int i;\n")); 14754 } 14755 14756 TEST_F(FormatTest, DisableRegions) { 14757 EXPECT_EQ("int i;\n" 14758 "// clang-format off\n" 14759 " int j;\n" 14760 "// clang-format on\n" 14761 "int k;", 14762 format(" int i;\n" 14763 " // clang-format off\n" 14764 " int j;\n" 14765 " // clang-format on\n" 14766 " int k;")); 14767 EXPECT_EQ("int i;\n" 14768 "/* clang-format off */\n" 14769 " int j;\n" 14770 "/* clang-format on */\n" 14771 "int k;", 14772 format(" int i;\n" 14773 " /* clang-format off */\n" 14774 " int j;\n" 14775 " /* clang-format on */\n" 14776 " int k;")); 14777 14778 // Don't reflow comments within disabled regions. 14779 EXPECT_EQ("// clang-format off\n" 14780 "// long long long long long long line\n" 14781 "/* clang-format on */\n" 14782 "/* long long long\n" 14783 " * long long long\n" 14784 " * line */\n" 14785 "int i;\n" 14786 "/* clang-format off */\n" 14787 "/* long long long long long long line */\n", 14788 format("// clang-format off\n" 14789 "// long long long long long long line\n" 14790 "/* clang-format on */\n" 14791 "/* long long long long long long line */\n" 14792 "int i;\n" 14793 "/* clang-format off */\n" 14794 "/* long long long long long long line */\n", 14795 getLLVMStyleWithColumns(20))); 14796 } 14797 14798 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 14799 format("? ) ="); 14800 verifyNoCrash("#define a\\\n /**/}"); 14801 } 14802 14803 TEST_F(FormatTest, FormatsTableGenCode) { 14804 FormatStyle Style = getLLVMStyle(); 14805 Style.Language = FormatStyle::LK_TableGen; 14806 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 14807 } 14808 14809 TEST_F(FormatTest, ArrayOfTemplates) { 14810 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 14811 format("auto a = new unique_ptr<int > [ 10];")); 14812 14813 FormatStyle Spaces = getLLVMStyle(); 14814 Spaces.SpacesInSquareBrackets = true; 14815 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 14816 format("auto a = new unique_ptr<int > [10];", Spaces)); 14817 } 14818 14819 TEST_F(FormatTest, ArrayAsTemplateType) { 14820 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 14821 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 14822 14823 FormatStyle Spaces = getLLVMStyle(); 14824 Spaces.SpacesInSquareBrackets = true; 14825 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 14826 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 14827 } 14828 14829 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 14830 14831 TEST(FormatStyle, GetStyleWithEmptyFileName) { 14832 llvm::vfs::InMemoryFileSystem FS; 14833 auto Style1 = getStyle("file", "", "Google", "", &FS); 14834 ASSERT_TRUE((bool)Style1); 14835 ASSERT_EQ(*Style1, getGoogleStyle()); 14836 } 14837 14838 TEST(FormatStyle, GetStyleOfFile) { 14839 llvm::vfs::InMemoryFileSystem FS; 14840 // Test 1: format file in the same directory. 14841 ASSERT_TRUE( 14842 FS.addFile("/a/.clang-format", 0, 14843 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 14844 ASSERT_TRUE( 14845 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14846 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 14847 ASSERT_TRUE((bool)Style1); 14848 ASSERT_EQ(*Style1, getLLVMStyle()); 14849 14850 // Test 2.1: fallback to default. 14851 ASSERT_TRUE( 14852 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14853 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 14854 ASSERT_TRUE((bool)Style2); 14855 ASSERT_EQ(*Style2, getMozillaStyle()); 14856 14857 // Test 2.2: no format on 'none' fallback style. 14858 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14859 ASSERT_TRUE((bool)Style2); 14860 ASSERT_EQ(*Style2, getNoStyle()); 14861 14862 // Test 2.3: format if config is found with no based style while fallback is 14863 // 'none'. 14864 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 14865 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 14866 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14867 ASSERT_TRUE((bool)Style2); 14868 ASSERT_EQ(*Style2, getLLVMStyle()); 14869 14870 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 14871 Style2 = getStyle("{}", "a.h", "none", "", &FS); 14872 ASSERT_TRUE((bool)Style2); 14873 ASSERT_EQ(*Style2, getLLVMStyle()); 14874 14875 // Test 3: format file in parent directory. 14876 ASSERT_TRUE( 14877 FS.addFile("/c/.clang-format", 0, 14878 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 14879 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 14880 llvm::MemoryBuffer::getMemBuffer("int i;"))); 14881 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 14882 ASSERT_TRUE((bool)Style3); 14883 ASSERT_EQ(*Style3, getGoogleStyle()); 14884 14885 // Test 4: error on invalid fallback style 14886 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 14887 ASSERT_FALSE((bool)Style4); 14888 llvm::consumeError(Style4.takeError()); 14889 14890 // Test 5: error on invalid yaml on command line 14891 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 14892 ASSERT_FALSE((bool)Style5); 14893 llvm::consumeError(Style5.takeError()); 14894 14895 // Test 6: error on invalid style 14896 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 14897 ASSERT_FALSE((bool)Style6); 14898 llvm::consumeError(Style6.takeError()); 14899 14900 // Test 7: found config file, error on parsing it 14901 ASSERT_TRUE( 14902 FS.addFile("/d/.clang-format", 0, 14903 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 14904 "InvalidKey: InvalidValue"))); 14905 ASSERT_TRUE( 14906 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14907 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 14908 ASSERT_FALSE((bool)Style7); 14909 llvm::consumeError(Style7.takeError()); 14910 14911 // Test 8: inferred per-language defaults apply. 14912 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 14913 ASSERT_TRUE((bool)StyleTd); 14914 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 14915 } 14916 14917 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 14918 // Column limit is 20. 14919 std::string Code = "Type *a =\n" 14920 " new Type();\n" 14921 "g(iiiii, 0, jjjjj,\n" 14922 " 0, kkkkk, 0, mm);\n" 14923 "int bad = format ;"; 14924 std::string Expected = "auto a = new Type();\n" 14925 "g(iiiii, nullptr,\n" 14926 " jjjjj, nullptr,\n" 14927 " kkkkk, nullptr,\n" 14928 " mm);\n" 14929 "int bad = format ;"; 14930 FileID ID = Context.createInMemoryFile("format.cpp", Code); 14931 tooling::Replacements Replaces = toReplacements( 14932 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 14933 "auto "), 14934 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 14935 "nullptr"), 14936 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 14937 "nullptr"), 14938 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 14939 "nullptr")}); 14940 14941 format::FormatStyle Style = format::getLLVMStyle(); 14942 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 14943 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14944 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14945 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14946 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14947 EXPECT_TRUE(static_cast<bool>(Result)); 14948 EXPECT_EQ(Expected, *Result); 14949 } 14950 14951 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 14952 std::string Code = "#include \"a.h\"\n" 14953 "#include \"c.h\"\n" 14954 "\n" 14955 "int main() {\n" 14956 " return 0;\n" 14957 "}"; 14958 std::string Expected = "#include \"a.h\"\n" 14959 "#include \"b.h\"\n" 14960 "#include \"c.h\"\n" 14961 "\n" 14962 "int main() {\n" 14963 " return 0;\n" 14964 "}"; 14965 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 14966 tooling::Replacements Replaces = toReplacements( 14967 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 14968 "#include \"b.h\"\n")}); 14969 14970 format::FormatStyle Style = format::getLLVMStyle(); 14971 Style.SortIncludes = true; 14972 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14973 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14974 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14975 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14976 EXPECT_TRUE(static_cast<bool>(Result)); 14977 EXPECT_EQ(Expected, *Result); 14978 } 14979 14980 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 14981 EXPECT_EQ("using std::cin;\n" 14982 "using std::cout;", 14983 format("using std::cout;\n" 14984 "using std::cin;", 14985 getGoogleStyle())); 14986 } 14987 14988 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 14989 format::FormatStyle Style = format::getLLVMStyle(); 14990 Style.Standard = FormatStyle::LS_Cpp03; 14991 // cpp03 recognize this string as identifier u8 and literal character 'a' 14992 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 14993 } 14994 14995 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 14996 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 14997 // all modes, including C++11, C++14 and C++17 14998 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 14999 } 15000 15001 TEST_F(FormatTest, DoNotFormatLikelyXml) { 15002 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 15003 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 15004 } 15005 15006 TEST_F(FormatTest, StructuredBindings) { 15007 // Structured bindings is a C++17 feature. 15008 // all modes, including C++11, C++14 and C++17 15009 verifyFormat("auto [a, b] = f();"); 15010 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 15011 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 15012 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 15013 EXPECT_EQ("auto const volatile [a, b] = f();", 15014 format("auto const volatile[a, b] = f();")); 15015 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 15016 EXPECT_EQ("auto &[a, b, c] = f();", 15017 format("auto &[ a , b,c ] = f();")); 15018 EXPECT_EQ("auto &&[a, b, c] = f();", 15019 format("auto &&[ a , b,c ] = f();")); 15020 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 15021 EXPECT_EQ("auto const volatile &&[a, b] = f();", 15022 format("auto const volatile &&[a, b] = f();")); 15023 EXPECT_EQ("auto const &&[a, b] = f();", 15024 format("auto const && [a, b] = f();")); 15025 EXPECT_EQ("const auto &[a, b] = f();", 15026 format("const auto & [a, b] = f();")); 15027 EXPECT_EQ("const auto volatile &&[a, b] = f();", 15028 format("const auto volatile &&[a, b] = f();")); 15029 EXPECT_EQ("volatile const auto &&[a, b] = f();", 15030 format("volatile const auto &&[a, b] = f();")); 15031 EXPECT_EQ("const auto &&[a, b] = f();", 15032 format("const auto && [a, b] = f();")); 15033 15034 // Make sure we don't mistake structured bindings for lambdas. 15035 FormatStyle PointerMiddle = getLLVMStyle(); 15036 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 15037 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 15038 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 15039 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 15040 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 15041 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 15042 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 15043 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 15044 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 15045 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 15046 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 15047 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 15048 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 15049 15050 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 15051 format("for (const auto && [a, b] : some_range) {\n}")); 15052 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 15053 format("for (const auto & [a, b] : some_range) {\n}")); 15054 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 15055 format("for (const auto[a, b] : some_range) {\n}")); 15056 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 15057 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 15058 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 15059 EXPECT_EQ("auto const &[x, y](expr);", 15060 format("auto const & [x,y] (expr);")); 15061 EXPECT_EQ("auto const &&[x, y](expr);", 15062 format("auto const && [x,y] (expr);")); 15063 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 15064 EXPECT_EQ("auto const &[x, y]{expr};", 15065 format("auto const & [x,y] {expr};")); 15066 EXPECT_EQ("auto const &&[x, y]{expr};", 15067 format("auto const && [x,y] {expr};")); 15068 15069 format::FormatStyle Spaces = format::getLLVMStyle(); 15070 Spaces.SpacesInSquareBrackets = true; 15071 verifyFormat("auto [ a, b ] = f();", Spaces); 15072 verifyFormat("auto &&[ a, b ] = f();", Spaces); 15073 verifyFormat("auto &[ a, b ] = f();", Spaces); 15074 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 15075 verifyFormat("auto const &[ a, b ] = f();", Spaces); 15076 } 15077 15078 TEST_F(FormatTest, FileAndCode) { 15079 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 15080 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 15081 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 15082 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 15083 EXPECT_EQ(FormatStyle::LK_ObjC, 15084 guessLanguage("foo.h", "@interface Foo\n@end\n")); 15085 EXPECT_EQ( 15086 FormatStyle::LK_ObjC, 15087 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 15088 EXPECT_EQ(FormatStyle::LK_ObjC, 15089 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 15090 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 15091 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 15092 EXPECT_EQ(FormatStyle::LK_ObjC, 15093 guessLanguage("foo", "@interface Foo\n@end\n")); 15094 EXPECT_EQ(FormatStyle::LK_ObjC, 15095 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 15096 EXPECT_EQ( 15097 FormatStyle::LK_ObjC, 15098 guessLanguage("foo.h", 15099 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 15100 EXPECT_EQ( 15101 FormatStyle::LK_Cpp, 15102 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 15103 } 15104 15105 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 15106 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 15107 EXPECT_EQ(FormatStyle::LK_ObjC, 15108 guessLanguage("foo.h", "array[[calculator getIndex]];")); 15109 EXPECT_EQ(FormatStyle::LK_Cpp, 15110 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 15111 EXPECT_EQ( 15112 FormatStyle::LK_Cpp, 15113 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 15114 EXPECT_EQ(FormatStyle::LK_ObjC, 15115 guessLanguage("foo.h", "[[noreturn foo] bar];")); 15116 EXPECT_EQ(FormatStyle::LK_Cpp, 15117 guessLanguage("foo.h", "[[clang::fallthrough]];")); 15118 EXPECT_EQ(FormatStyle::LK_ObjC, 15119 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 15120 EXPECT_EQ(FormatStyle::LK_Cpp, 15121 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 15122 EXPECT_EQ(FormatStyle::LK_Cpp, 15123 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 15124 EXPECT_EQ(FormatStyle::LK_ObjC, 15125 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 15126 EXPECT_EQ(FormatStyle::LK_Cpp, 15127 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 15128 EXPECT_EQ( 15129 FormatStyle::LK_Cpp, 15130 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 15131 EXPECT_EQ( 15132 FormatStyle::LK_Cpp, 15133 guessLanguage("foo.h", 15134 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 15135 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 15136 } 15137 15138 TEST_F(FormatTest, GuessLanguageWithCaret) { 15139 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 15140 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 15141 EXPECT_EQ(FormatStyle::LK_ObjC, 15142 guessLanguage("foo.h", "int(^)(char, float);")); 15143 EXPECT_EQ(FormatStyle::LK_ObjC, 15144 guessLanguage("foo.h", "int(^foo)(char, float);")); 15145 EXPECT_EQ(FormatStyle::LK_ObjC, 15146 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 15147 EXPECT_EQ(FormatStyle::LK_ObjC, 15148 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 15149 EXPECT_EQ( 15150 FormatStyle::LK_ObjC, 15151 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 15152 } 15153 15154 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) { 15155 // ASM symbolic names are identifiers that must be surrounded by [] without 15156 // space in between: 15157 // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands 15158 15159 // Example from https://bugs.llvm.org/show_bug.cgi?id=45108. 15160 verifyFormat(R"(// 15161 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result)); 15162 )"); 15163 15164 // A list of several ASM symbolic names. 15165 verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)"); 15166 15167 // ASM symbolic names in inline ASM with inputs and outputs. 15168 verifyFormat(R"(// 15169 asm("cmoveq %1, %2, %[result]" 15170 : [result] "=r"(result) 15171 : "r"(test), "r"(new), "[result]"(old)); 15172 )"); 15173 15174 // ASM symbolic names in inline ASM with no outputs. 15175 verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)"); 15176 } 15177 15178 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 15179 EXPECT_EQ(FormatStyle::LK_Cpp, 15180 guessLanguage("foo.h", "void f() {\n" 15181 " asm (\"mov %[e], %[d]\"\n" 15182 " : [d] \"=rm\" (d)\n" 15183 " [e] \"rm\" (*e));\n" 15184 "}")); 15185 EXPECT_EQ(FormatStyle::LK_Cpp, 15186 guessLanguage("foo.h", "void f() {\n" 15187 " _asm (\"mov %[e], %[d]\"\n" 15188 " : [d] \"=rm\" (d)\n" 15189 " [e] \"rm\" (*e));\n" 15190 "}")); 15191 EXPECT_EQ(FormatStyle::LK_Cpp, 15192 guessLanguage("foo.h", "void f() {\n" 15193 " __asm (\"mov %[e], %[d]\"\n" 15194 " : [d] \"=rm\" (d)\n" 15195 " [e] \"rm\" (*e));\n" 15196 "}")); 15197 EXPECT_EQ(FormatStyle::LK_Cpp, 15198 guessLanguage("foo.h", "void f() {\n" 15199 " __asm__ (\"mov %[e], %[d]\"\n" 15200 " : [d] \"=rm\" (d)\n" 15201 " [e] \"rm\" (*e));\n" 15202 "}")); 15203 EXPECT_EQ(FormatStyle::LK_Cpp, 15204 guessLanguage("foo.h", "void f() {\n" 15205 " asm (\"mov %[e], %[d]\"\n" 15206 " : [d] \"=rm\" (d),\n" 15207 " [e] \"rm\" (*e));\n" 15208 "}")); 15209 EXPECT_EQ(FormatStyle::LK_Cpp, 15210 guessLanguage("foo.h", "void f() {\n" 15211 " asm volatile (\"mov %[e], %[d]\"\n" 15212 " : [d] \"=rm\" (d)\n" 15213 " [e] \"rm\" (*e));\n" 15214 "}")); 15215 } 15216 15217 TEST_F(FormatTest, GuessLanguageWithChildLines) { 15218 EXPECT_EQ(FormatStyle::LK_Cpp, 15219 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 15220 EXPECT_EQ(FormatStyle::LK_ObjC, 15221 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 15222 EXPECT_EQ( 15223 FormatStyle::LK_Cpp, 15224 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 15225 EXPECT_EQ( 15226 FormatStyle::LK_ObjC, 15227 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 15228 } 15229 15230 TEST_F(FormatTest, TypenameMacros) { 15231 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 15232 15233 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 15234 FormatStyle Google = getGoogleStyleWithColumns(0); 15235 Google.TypenameMacros = TypenameMacros; 15236 verifyFormat("struct foo {\n" 15237 " int bar;\n" 15238 " TAILQ_ENTRY(a) bleh;\n" 15239 "};", 15240 Google); 15241 15242 FormatStyle Macros = getLLVMStyle(); 15243 Macros.TypenameMacros = TypenameMacros; 15244 15245 verifyFormat("STACK_OF(int) a;", Macros); 15246 verifyFormat("STACK_OF(int) *a;", Macros); 15247 verifyFormat("STACK_OF(int const *) *a;", Macros); 15248 verifyFormat("STACK_OF(int *const) *a;", Macros); 15249 verifyFormat("STACK_OF(int, string) a;", Macros); 15250 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 15251 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 15252 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 15253 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 15254 15255 Macros.PointerAlignment = FormatStyle::PAS_Left; 15256 verifyFormat("STACK_OF(int)* a;", Macros); 15257 verifyFormat("STACK_OF(int*)* a;", Macros); 15258 } 15259 15260 TEST_F(FormatTest, AmbersandInLamda) { 15261 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 15262 FormatStyle AlignStyle = getLLVMStyle(); 15263 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 15264 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 15265 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 15266 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 15267 } 15268 15269 TEST_F(FormatTest, SpacesInConditionalStatement) { 15270 FormatStyle Spaces = getLLVMStyle(); 15271 Spaces.SpacesInConditionalStatement = true; 15272 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 15273 verifyFormat("if ( !a )\n return;", Spaces); 15274 verifyFormat("if ( a )\n return;", Spaces); 15275 verifyFormat("if constexpr ( a )\n return;", Spaces); 15276 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 15277 verifyFormat("while ( a )\n return;", Spaces); 15278 verifyFormat("while ( (a && b) )\n return;", Spaces); 15279 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 15280 verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces); 15281 // Check that space on the left of "::" is inserted as expected at beginning 15282 // of condition. 15283 verifyFormat("while ( ::func() )\n return;", Spaces); 15284 } 15285 15286 TEST_F(FormatTest, AlternativeOperators) { 15287 // Test case for ensuring alternate operators are not 15288 // combined with their right most neighbour. 15289 verifyFormat("int a and b;"); 15290 verifyFormat("int a and_eq b;"); 15291 verifyFormat("int a bitand b;"); 15292 verifyFormat("int a bitor b;"); 15293 verifyFormat("int a compl b;"); 15294 verifyFormat("int a not b;"); 15295 verifyFormat("int a not_eq b;"); 15296 verifyFormat("int a or b;"); 15297 verifyFormat("int a xor b;"); 15298 verifyFormat("int a xor_eq b;"); 15299 verifyFormat("return this not_eq bitand other;"); 15300 verifyFormat("bool operator not_eq(const X bitand other)"); 15301 15302 verifyFormat("int a and 5;"); 15303 verifyFormat("int a and_eq 5;"); 15304 verifyFormat("int a bitand 5;"); 15305 verifyFormat("int a bitor 5;"); 15306 verifyFormat("int a compl 5;"); 15307 verifyFormat("int a not 5;"); 15308 verifyFormat("int a not_eq 5;"); 15309 verifyFormat("int a or 5;"); 15310 verifyFormat("int a xor 5;"); 15311 verifyFormat("int a xor_eq 5;"); 15312 15313 verifyFormat("int a compl(5);"); 15314 verifyFormat("int a not(5);"); 15315 15316 /* FIXME handle alternate tokens 15317 * https://en.cppreference.com/w/cpp/language/operator_alternative 15318 // alternative tokens 15319 verifyFormat("compl foo();"); // ~foo(); 15320 verifyFormat("foo() <%%>;"); // foo(); 15321 verifyFormat("void foo() <%%>;"); // void foo(){} 15322 verifyFormat("int a <:1:>;"); // int a[1];[ 15323 verifyFormat("%:define ABC abc"); // #define ABC abc 15324 verifyFormat("%:%:"); // ## 15325 */ 15326 } 15327 15328 TEST_F(FormatTest, STLWhileNotDefineChed) { 15329 verifyFormat("#if defined(while)\n" 15330 "#define while EMIT WARNING C4005\n" 15331 "#endif // while"); 15332 } 15333 15334 TEST_F(FormatTest, OperatorSpacing) { 15335 FormatStyle Style = getLLVMStyle(); 15336 Style.PointerAlignment = FormatStyle::PAS_Right; 15337 verifyFormat("Foo::operator*();", Style); 15338 verifyFormat("Foo::operator void *();", Style); 15339 verifyFormat("Foo::operator()(void *);", Style); 15340 verifyFormat("Foo::operator*(void *);", Style); 15341 verifyFormat("Foo::operator*();", Style); 15342 verifyFormat("operator*(int (*)(), class Foo);", Style); 15343 15344 verifyFormat("Foo::operator&();", Style); 15345 verifyFormat("Foo::operator void &();", Style); 15346 verifyFormat("Foo::operator()(void &);", Style); 15347 verifyFormat("Foo::operator&(void &);", Style); 15348 verifyFormat("Foo::operator&();", Style); 15349 verifyFormat("operator&(int (&)(), class Foo);", Style); 15350 15351 verifyFormat("Foo::operator&&();", Style); 15352 verifyFormat("Foo::operator void &&();", Style); 15353 verifyFormat("Foo::operator()(void &&);", Style); 15354 verifyFormat("Foo::operator&&(void &&);", Style); 15355 verifyFormat("Foo::operator&&();", Style); 15356 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15357 15358 Style.PointerAlignment = FormatStyle::PAS_Left; 15359 verifyFormat("Foo::operator*();", Style); 15360 verifyFormat("Foo::operator void*();", Style); 15361 verifyFormat("Foo::operator/*comment*/ void*();", Style); 15362 verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); 15363 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); 15364 verifyFormat("Foo::operator()(void*);", Style); 15365 verifyFormat("Foo::operator*(void*);", Style); 15366 verifyFormat("Foo::operator*();", Style); 15367 verifyFormat("operator*(int (*)(), class Foo);", Style); 15368 15369 verifyFormat("Foo::operator&();", Style); 15370 verifyFormat("Foo::operator void&();", Style); 15371 verifyFormat("Foo::operator/*comment*/ void&();", Style); 15372 verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); 15373 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); 15374 verifyFormat("Foo::operator()(void&);", Style); 15375 verifyFormat("Foo::operator&(void&);", Style); 15376 verifyFormat("Foo::operator&();", Style); 15377 verifyFormat("operator&(int (&)(), class Foo);", Style); 15378 15379 verifyFormat("Foo::operator&&();", Style); 15380 verifyFormat("Foo::operator void&&();", Style); 15381 verifyFormat("Foo::operator/*comment*/ void&&();", Style); 15382 verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); 15383 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); 15384 verifyFormat("Foo::operator()(void&&);", Style); 15385 verifyFormat("Foo::operator&&(void&&);", Style); 15386 verifyFormat("Foo::operator&&();", Style); 15387 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15388 15389 // PR45107 15390 verifyFormat("operator Vector<String>&();", Style); 15391 verifyFormat("operator foo::Bar*();", Style); 15392 verifyFormat("operator const Foo<X>::Bar<Y>*();", Style); 15393 verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();", 15394 Style); 15395 15396 Style.PointerAlignment = FormatStyle::PAS_Middle; 15397 verifyFormat("Foo::operator*();", Style); 15398 verifyFormat("Foo::operator void *();", Style); 15399 verifyFormat("Foo::operator()(void *);", Style); 15400 verifyFormat("Foo::operator*(void *);", Style); 15401 verifyFormat("Foo::operator*();", Style); 15402 verifyFormat("operator*(int (*)(), class Foo);", Style); 15403 15404 verifyFormat("Foo::operator&();", Style); 15405 verifyFormat("Foo::operator void &();", Style); 15406 verifyFormat("Foo::operator()(void &);", Style); 15407 verifyFormat("Foo::operator&(void &);", Style); 15408 verifyFormat("Foo::operator&();", Style); 15409 verifyFormat("operator&(int (&)(), class Foo);", Style); 15410 15411 verifyFormat("Foo::operator&&();", Style); 15412 verifyFormat("Foo::operator void &&();", Style); 15413 verifyFormat("Foo::operator()(void &&);", Style); 15414 verifyFormat("Foo::operator&&(void &&);", Style); 15415 verifyFormat("Foo::operator&&();", Style); 15416 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15417 } 15418 15419 } // namespace 15420 } // namespace format 15421 } // namespace clang 15422