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 } 560 561 TEST_F(FormatTest, FormatShortBracedStatements) { 562 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 563 AllowSimpleBracedStatements.ColumnLimit = 40; 564 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = 565 FormatStyle::SBS_Always; 566 567 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 568 FormatStyle::SIS_WithoutElse; 569 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 570 571 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom; 572 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true; 573 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false; 574 575 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 576 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 577 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 578 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 579 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 580 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 581 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 582 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 583 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 584 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 585 verifyFormat("if (true) {\n" 586 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 587 "}", 588 AllowSimpleBracedStatements); 589 verifyFormat("if (true) { //\n" 590 " f();\n" 591 "}", 592 AllowSimpleBracedStatements); 593 verifyFormat("if (true) {\n" 594 " f();\n" 595 " f();\n" 596 "}", 597 AllowSimpleBracedStatements); 598 verifyFormat("if (true) {\n" 599 " f();\n" 600 "} else {\n" 601 " f();\n" 602 "}", 603 AllowSimpleBracedStatements); 604 605 verifyFormat("struct A2 {\n" 606 " int X;\n" 607 "};", 608 AllowSimpleBracedStatements); 609 verifyFormat("typedef struct A2 {\n" 610 " int X;\n" 611 "} A2_t;", 612 AllowSimpleBracedStatements); 613 verifyFormat("template <int> struct A2 {\n" 614 " struct B {};\n" 615 "};", 616 AllowSimpleBracedStatements); 617 618 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 619 FormatStyle::SIS_Never; 620 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 621 verifyFormat("if (true) {\n" 622 " f();\n" 623 "}", 624 AllowSimpleBracedStatements); 625 verifyFormat("if (true) {\n" 626 " f();\n" 627 "} else {\n" 628 " f();\n" 629 "}", 630 AllowSimpleBracedStatements); 631 632 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 633 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 634 verifyFormat("while (true) {\n" 635 " f();\n" 636 "}", 637 AllowSimpleBracedStatements); 638 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 639 verifyFormat("for (;;) {\n" 640 " f();\n" 641 "}", 642 AllowSimpleBracedStatements); 643 644 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 645 FormatStyle::SIS_WithoutElse; 646 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 647 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = 648 FormatStyle::BWACS_Always; 649 650 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 651 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 652 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 653 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 654 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 655 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 656 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 657 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 658 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 659 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 660 verifyFormat("if (true)\n" 661 "{\n" 662 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 663 "}", 664 AllowSimpleBracedStatements); 665 verifyFormat("if (true)\n" 666 "{ //\n" 667 " f();\n" 668 "}", 669 AllowSimpleBracedStatements); 670 verifyFormat("if (true)\n" 671 "{\n" 672 " f();\n" 673 " f();\n" 674 "}", 675 AllowSimpleBracedStatements); 676 verifyFormat("if (true)\n" 677 "{\n" 678 " f();\n" 679 "} else\n" 680 "{\n" 681 " f();\n" 682 "}", 683 AllowSimpleBracedStatements); 684 685 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 686 FormatStyle::SIS_Never; 687 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 688 verifyFormat("if (true)\n" 689 "{\n" 690 " f();\n" 691 "}", 692 AllowSimpleBracedStatements); 693 verifyFormat("if (true)\n" 694 "{\n" 695 " f();\n" 696 "} else\n" 697 "{\n" 698 " f();\n" 699 "}", 700 AllowSimpleBracedStatements); 701 702 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 703 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 704 verifyFormat("while (true)\n" 705 "{\n" 706 " f();\n" 707 "}", 708 AllowSimpleBracedStatements); 709 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 710 verifyFormat("for (;;)\n" 711 "{\n" 712 " f();\n" 713 "}", 714 AllowSimpleBracedStatements); 715 } 716 717 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 718 FormatStyle Style = getLLVMStyleWithColumns(60); 719 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 720 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 721 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 722 EXPECT_EQ("#define A \\\n" 723 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 724 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 725 "X;", 726 format("#define A \\\n" 727 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 728 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 729 " }\n" 730 "X;", 731 Style)); 732 } 733 734 TEST_F(FormatTest, ParseIfElse) { 735 verifyFormat("if (true)\n" 736 " if (true)\n" 737 " if (true)\n" 738 " f();\n" 739 " else\n" 740 " g();\n" 741 " else\n" 742 " h();\n" 743 "else\n" 744 " i();"); 745 verifyFormat("if (true)\n" 746 " if (true)\n" 747 " if (true) {\n" 748 " if (true)\n" 749 " f();\n" 750 " } else {\n" 751 " g();\n" 752 " }\n" 753 " else\n" 754 " h();\n" 755 "else {\n" 756 " i();\n" 757 "}"); 758 verifyFormat("if (true)\n" 759 " if constexpr (true)\n" 760 " if (true) {\n" 761 " if constexpr (true)\n" 762 " f();\n" 763 " } else {\n" 764 " g();\n" 765 " }\n" 766 " else\n" 767 " h();\n" 768 "else {\n" 769 " i();\n" 770 "}"); 771 verifyFormat("if (true)\n" 772 " if CONSTEXPR (true)\n" 773 " if (true) {\n" 774 " if CONSTEXPR (true)\n" 775 " f();\n" 776 " } else {\n" 777 " g();\n" 778 " }\n" 779 " else\n" 780 " h();\n" 781 "else {\n" 782 " i();\n" 783 "}"); 784 verifyFormat("void f() {\n" 785 " if (a) {\n" 786 " } else {\n" 787 " }\n" 788 "}"); 789 } 790 791 TEST_F(FormatTest, ElseIf) { 792 verifyFormat("if (a) {\n} else if (b) {\n}"); 793 verifyFormat("if (a)\n" 794 " f();\n" 795 "else if (b)\n" 796 " g();\n" 797 "else\n" 798 " h();"); 799 verifyFormat("if constexpr (a)\n" 800 " f();\n" 801 "else if constexpr (b)\n" 802 " g();\n" 803 "else\n" 804 " h();"); 805 verifyFormat("if CONSTEXPR (a)\n" 806 " f();\n" 807 "else if CONSTEXPR (b)\n" 808 " g();\n" 809 "else\n" 810 " h();"); 811 verifyFormat("if (a) {\n" 812 " f();\n" 813 "}\n" 814 "// or else ..\n" 815 "else {\n" 816 " g()\n" 817 "}"); 818 819 verifyFormat("if (a) {\n" 820 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 821 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 822 "}"); 823 verifyFormat("if (a) {\n" 824 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 826 "}"); 827 verifyFormat("if (a) {\n" 828 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 830 "}"); 831 verifyFormat("if (a) {\n" 832 "} else if (\n" 833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 834 "}", 835 getLLVMStyleWithColumns(62)); 836 verifyFormat("if (a) {\n" 837 "} else if constexpr (\n" 838 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 839 "}", 840 getLLVMStyleWithColumns(62)); 841 verifyFormat("if (a) {\n" 842 "} else if CONSTEXPR (\n" 843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 844 "}", 845 getLLVMStyleWithColumns(62)); 846 } 847 848 TEST_F(FormatTest, FormatsForLoop) { 849 verifyFormat( 850 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 851 " ++VeryVeryLongLoopVariable)\n" 852 " ;"); 853 verifyFormat("for (;;)\n" 854 " f();"); 855 verifyFormat("for (;;) {\n}"); 856 verifyFormat("for (;;) {\n" 857 " f();\n" 858 "}"); 859 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 860 861 verifyFormat( 862 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 863 " E = UnwrappedLines.end();\n" 864 " I != E; ++I) {\n}"); 865 866 verifyFormat( 867 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 868 " ++IIIII) {\n}"); 869 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 870 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 871 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 872 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 873 " I = FD->getDeclsInPrototypeScope().begin(),\n" 874 " E = FD->getDeclsInPrototypeScope().end();\n" 875 " I != E; ++I) {\n}"); 876 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 877 " I = Container.begin(),\n" 878 " E = Container.end();\n" 879 " I != E; ++I) {\n}", 880 getLLVMStyleWithColumns(76)); 881 882 verifyFormat( 883 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 886 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 887 " ++aaaaaaaaaaa) {\n}"); 888 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 889 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 890 " ++i) {\n}"); 891 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 892 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 893 "}"); 894 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 895 " aaaaaaaaaa);\n" 896 " iter; ++iter) {\n" 897 "}"); 898 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 899 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 900 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 901 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 902 903 // These should not be formatted as Objective-C for-in loops. 904 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 905 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 906 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 907 verifyFormat( 908 "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 909 910 FormatStyle NoBinPacking = getLLVMStyle(); 911 NoBinPacking.BinPackParameters = false; 912 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 913 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 914 " aaaaaaaaaaaaaaaa,\n" 915 " aaaaaaaaaaaaaaaa,\n" 916 " aaaaaaaaaaaaaaaa);\n" 917 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 918 "}", 919 NoBinPacking); 920 verifyFormat( 921 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 922 " E = UnwrappedLines.end();\n" 923 " I != E;\n" 924 " ++I) {\n}", 925 NoBinPacking); 926 927 FormatStyle AlignLeft = getLLVMStyle(); 928 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 929 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 930 } 931 932 TEST_F(FormatTest, RangeBasedForLoops) { 933 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 935 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 936 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 937 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 938 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 939 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 940 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 941 } 942 943 TEST_F(FormatTest, ForEachLoops) { 944 verifyFormat("void f() {\n" 945 " foreach (Item *item, itemlist) {}\n" 946 " Q_FOREACH (Item *item, itemlist) {}\n" 947 " BOOST_FOREACH (Item *item, itemlist) {}\n" 948 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 949 "}"); 950 951 // As function-like macros. 952 verifyFormat("#define foreach(x, y)\n" 953 "#define Q_FOREACH(x, y)\n" 954 "#define BOOST_FOREACH(x, y)\n" 955 "#define UNKNOWN_FOREACH(x, y)\n"); 956 957 // Not as function-like macros. 958 verifyFormat("#define foreach (x, y)\n" 959 "#define Q_FOREACH (x, y)\n" 960 "#define BOOST_FOREACH (x, y)\n" 961 "#define UNKNOWN_FOREACH (x, y)\n"); 962 } 963 964 TEST_F(FormatTest, FormatsWhileLoop) { 965 verifyFormat("while (true) {\n}"); 966 verifyFormat("while (true)\n" 967 " f();"); 968 verifyFormat("while () {\n}"); 969 verifyFormat("while () {\n" 970 " f();\n" 971 "}"); 972 } 973 974 TEST_F(FormatTest, FormatsDoWhile) { 975 verifyFormat("do {\n" 976 " do_something();\n" 977 "} while (something());"); 978 verifyFormat("do\n" 979 " do_something();\n" 980 "while (something());"); 981 } 982 983 TEST_F(FormatTest, FormatsSwitchStatement) { 984 verifyFormat("switch (x) {\n" 985 "case 1:\n" 986 " f();\n" 987 " break;\n" 988 "case kFoo:\n" 989 "case ns::kBar:\n" 990 "case kBaz:\n" 991 " break;\n" 992 "default:\n" 993 " g();\n" 994 " break;\n" 995 "}"); 996 verifyFormat("switch (x) {\n" 997 "case 1: {\n" 998 " f();\n" 999 " break;\n" 1000 "}\n" 1001 "case 2: {\n" 1002 " break;\n" 1003 "}\n" 1004 "}"); 1005 verifyFormat("switch (x) {\n" 1006 "case 1: {\n" 1007 " f();\n" 1008 " {\n" 1009 " g();\n" 1010 " h();\n" 1011 " }\n" 1012 " break;\n" 1013 "}\n" 1014 "}"); 1015 verifyFormat("switch (x) {\n" 1016 "case 1: {\n" 1017 " f();\n" 1018 " if (foo) {\n" 1019 " g();\n" 1020 " h();\n" 1021 " }\n" 1022 " break;\n" 1023 "}\n" 1024 "}"); 1025 verifyFormat("switch (x) {\n" 1026 "case 1: {\n" 1027 " f();\n" 1028 " g();\n" 1029 "} break;\n" 1030 "}"); 1031 verifyFormat("switch (test)\n" 1032 " ;"); 1033 verifyFormat("switch (x) {\n" 1034 "default: {\n" 1035 " // Do nothing.\n" 1036 "}\n" 1037 "}"); 1038 verifyFormat("switch (x) {\n" 1039 "// comment\n" 1040 "// if 1, do f()\n" 1041 "case 1:\n" 1042 " f();\n" 1043 "}"); 1044 verifyFormat("switch (x) {\n" 1045 "case 1:\n" 1046 " // Do amazing stuff\n" 1047 " {\n" 1048 " f();\n" 1049 " g();\n" 1050 " }\n" 1051 " break;\n" 1052 "}"); 1053 verifyFormat("#define A \\\n" 1054 " switch (x) { \\\n" 1055 " case a: \\\n" 1056 " foo = b; \\\n" 1057 " }", 1058 getLLVMStyleWithColumns(20)); 1059 verifyFormat("#define OPERATION_CASE(name) \\\n" 1060 " case OP_name: \\\n" 1061 " return operations::Operation##name\n", 1062 getLLVMStyleWithColumns(40)); 1063 verifyFormat("switch (x) {\n" 1064 "case 1:;\n" 1065 "default:;\n" 1066 " int i;\n" 1067 "}"); 1068 1069 verifyGoogleFormat("switch (x) {\n" 1070 " case 1:\n" 1071 " f();\n" 1072 " break;\n" 1073 " case kFoo:\n" 1074 " case ns::kBar:\n" 1075 " case kBaz:\n" 1076 " break;\n" 1077 " default:\n" 1078 " g();\n" 1079 " break;\n" 1080 "}"); 1081 verifyGoogleFormat("switch (x) {\n" 1082 " case 1: {\n" 1083 " f();\n" 1084 " break;\n" 1085 " }\n" 1086 "}"); 1087 verifyGoogleFormat("switch (test)\n" 1088 " ;"); 1089 1090 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1091 " case OP_name: \\\n" 1092 " return operations::Operation##name\n"); 1093 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1094 " // Get the correction operation class.\n" 1095 " switch (OpCode) {\n" 1096 " CASE(Add);\n" 1097 " CASE(Subtract);\n" 1098 " default:\n" 1099 " return operations::Unknown;\n" 1100 " }\n" 1101 "#undef OPERATION_CASE\n" 1102 "}"); 1103 verifyFormat("DEBUG({\n" 1104 " switch (x) {\n" 1105 " case A:\n" 1106 " f();\n" 1107 " break;\n" 1108 " // fallthrough\n" 1109 " case B:\n" 1110 " g();\n" 1111 " break;\n" 1112 " }\n" 1113 "});"); 1114 EXPECT_EQ("DEBUG({\n" 1115 " switch (x) {\n" 1116 " case A:\n" 1117 " f();\n" 1118 " break;\n" 1119 " // On B:\n" 1120 " case B:\n" 1121 " g();\n" 1122 " break;\n" 1123 " }\n" 1124 "});", 1125 format("DEBUG({\n" 1126 " switch (x) {\n" 1127 " case A:\n" 1128 " f();\n" 1129 " break;\n" 1130 " // On B:\n" 1131 " case B:\n" 1132 " g();\n" 1133 " break;\n" 1134 " }\n" 1135 "});", 1136 getLLVMStyle())); 1137 EXPECT_EQ("switch (n) {\n" 1138 "case 0: {\n" 1139 " return false;\n" 1140 "}\n" 1141 "default: {\n" 1142 " return true;\n" 1143 "}\n" 1144 "}", 1145 format("switch (n)\n" 1146 "{\n" 1147 "case 0: {\n" 1148 " return false;\n" 1149 "}\n" 1150 "default: {\n" 1151 " return true;\n" 1152 "}\n" 1153 "}", 1154 getLLVMStyle())); 1155 verifyFormat("switch (a) {\n" 1156 "case (b):\n" 1157 " return;\n" 1158 "}"); 1159 1160 verifyFormat("switch (a) {\n" 1161 "case some_namespace::\n" 1162 " some_constant:\n" 1163 " return;\n" 1164 "}", 1165 getLLVMStyleWithColumns(34)); 1166 1167 FormatStyle Style = getLLVMStyle(); 1168 Style.IndentCaseLabels = true; 1169 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1170 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1171 Style.BraceWrapping.AfterCaseLabel = true; 1172 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1173 EXPECT_EQ("switch (n)\n" 1174 "{\n" 1175 " case 0:\n" 1176 " {\n" 1177 " return false;\n" 1178 " }\n" 1179 " default:\n" 1180 " {\n" 1181 " return true;\n" 1182 " }\n" 1183 "}", 1184 format("switch (n) {\n" 1185 " case 0: {\n" 1186 " return false;\n" 1187 " }\n" 1188 " default: {\n" 1189 " return true;\n" 1190 " }\n" 1191 "}", 1192 Style)); 1193 Style.BraceWrapping.AfterCaseLabel = false; 1194 EXPECT_EQ("switch (n)\n" 1195 "{\n" 1196 " case 0: {\n" 1197 " return false;\n" 1198 " }\n" 1199 " default: {\n" 1200 " return true;\n" 1201 " }\n" 1202 "}", 1203 format("switch (n) {\n" 1204 " case 0:\n" 1205 " {\n" 1206 " return false;\n" 1207 " }\n" 1208 " default:\n" 1209 " {\n" 1210 " return true;\n" 1211 " }\n" 1212 "}", 1213 Style)); 1214 } 1215 1216 TEST_F(FormatTest, CaseRanges) { 1217 verifyFormat("switch (x) {\n" 1218 "case 'A' ... 'Z':\n" 1219 "case 1 ... 5:\n" 1220 "case a ... b:\n" 1221 " break;\n" 1222 "}"); 1223 } 1224 1225 TEST_F(FormatTest, ShortCaseLabels) { 1226 FormatStyle Style = getLLVMStyle(); 1227 Style.AllowShortCaseLabelsOnASingleLine = true; 1228 verifyFormat("switch (a) {\n" 1229 "case 1: x = 1; break;\n" 1230 "case 2: return;\n" 1231 "case 3:\n" 1232 "case 4:\n" 1233 "case 5: return;\n" 1234 "case 6: // comment\n" 1235 " return;\n" 1236 "case 7:\n" 1237 " // comment\n" 1238 " return;\n" 1239 "case 8:\n" 1240 " x = 8; // comment\n" 1241 " break;\n" 1242 "default: y = 1; break;\n" 1243 "}", 1244 Style); 1245 verifyFormat("switch (a) {\n" 1246 "case 0: return; // comment\n" 1247 "case 1: break; // comment\n" 1248 "case 2: return;\n" 1249 "// comment\n" 1250 "case 3: return;\n" 1251 "// comment 1\n" 1252 "// comment 2\n" 1253 "// comment 3\n" 1254 "case 4: break; /* comment */\n" 1255 "case 5:\n" 1256 " // comment\n" 1257 " break;\n" 1258 "case 6: /* comment */ x = 1; break;\n" 1259 "case 7: x = /* comment */ 1; break;\n" 1260 "case 8:\n" 1261 " x = 1; /* comment */\n" 1262 " break;\n" 1263 "case 9:\n" 1264 " break; // comment line 1\n" 1265 " // comment line 2\n" 1266 "}", 1267 Style); 1268 EXPECT_EQ("switch (a) {\n" 1269 "case 1:\n" 1270 " x = 8;\n" 1271 " // fall through\n" 1272 "case 2: x = 8;\n" 1273 "// comment\n" 1274 "case 3:\n" 1275 " return; /* comment line 1\n" 1276 " * comment line 2 */\n" 1277 "case 4: i = 8;\n" 1278 "// something else\n" 1279 "#if FOO\n" 1280 "case 5: break;\n" 1281 "#endif\n" 1282 "}", 1283 format("switch (a) {\n" 1284 "case 1: x = 8;\n" 1285 " // fall through\n" 1286 "case 2:\n" 1287 " x = 8;\n" 1288 "// comment\n" 1289 "case 3:\n" 1290 " return; /* comment line 1\n" 1291 " * comment line 2 */\n" 1292 "case 4:\n" 1293 " i = 8;\n" 1294 "// something else\n" 1295 "#if FOO\n" 1296 "case 5: break;\n" 1297 "#endif\n" 1298 "}", 1299 Style)); 1300 EXPECT_EQ("switch (a) {\n" 1301 "case 0:\n" 1302 " return; // long long long long long long long long long long " 1303 "long long comment\n" 1304 " // line\n" 1305 "}", 1306 format("switch (a) {\n" 1307 "case 0: return; // long long long long long long long long " 1308 "long long long long comment line\n" 1309 "}", 1310 Style)); 1311 EXPECT_EQ("switch (a) {\n" 1312 "case 0:\n" 1313 " return; /* long long long long long long long long long long " 1314 "long long comment\n" 1315 " line */\n" 1316 "}", 1317 format("switch (a) {\n" 1318 "case 0: return; /* long long long long long long long long " 1319 "long long long long comment line */\n" 1320 "}", 1321 Style)); 1322 verifyFormat("switch (a) {\n" 1323 "#if FOO\n" 1324 "case 0: return 0;\n" 1325 "#endif\n" 1326 "}", 1327 Style); 1328 verifyFormat("switch (a) {\n" 1329 "case 1: {\n" 1330 "}\n" 1331 "case 2: {\n" 1332 " return;\n" 1333 "}\n" 1334 "case 3: {\n" 1335 " x = 1;\n" 1336 " return;\n" 1337 "}\n" 1338 "case 4:\n" 1339 " if (x)\n" 1340 " return;\n" 1341 "}", 1342 Style); 1343 Style.ColumnLimit = 21; 1344 verifyFormat("switch (a) {\n" 1345 "case 1: x = 1; break;\n" 1346 "case 2: return;\n" 1347 "case 3:\n" 1348 "case 4:\n" 1349 "case 5: return;\n" 1350 "default:\n" 1351 " y = 1;\n" 1352 " break;\n" 1353 "}", 1354 Style); 1355 Style.ColumnLimit = 80; 1356 Style.AllowShortCaseLabelsOnASingleLine = false; 1357 Style.IndentCaseLabels = true; 1358 EXPECT_EQ("switch (n) {\n" 1359 " default /*comments*/:\n" 1360 " return true;\n" 1361 " case 0:\n" 1362 " return false;\n" 1363 "}", 1364 format("switch (n) {\n" 1365 "default/*comments*/:\n" 1366 " return true;\n" 1367 "case 0:\n" 1368 " return false;\n" 1369 "}", 1370 Style)); 1371 Style.AllowShortCaseLabelsOnASingleLine = true; 1372 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1373 Style.BraceWrapping.AfterCaseLabel = true; 1374 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1375 EXPECT_EQ("switch (n)\n" 1376 "{\n" 1377 " case 0:\n" 1378 " {\n" 1379 " return false;\n" 1380 " }\n" 1381 " default:\n" 1382 " {\n" 1383 " return true;\n" 1384 " }\n" 1385 "}", 1386 format("switch (n) {\n" 1387 " case 0: {\n" 1388 " return false;\n" 1389 " }\n" 1390 " default:\n" 1391 " {\n" 1392 " return true;\n" 1393 " }\n" 1394 "}", 1395 Style)); 1396 } 1397 1398 TEST_F(FormatTest, FormatsLabels) { 1399 verifyFormat("void f() {\n" 1400 " some_code();\n" 1401 "test_label:\n" 1402 " some_other_code();\n" 1403 " {\n" 1404 " some_more_code();\n" 1405 " another_label:\n" 1406 " some_more_code();\n" 1407 " }\n" 1408 "}"); 1409 verifyFormat("{\n" 1410 " some_code();\n" 1411 "test_label:\n" 1412 " some_other_code();\n" 1413 "}"); 1414 verifyFormat("{\n" 1415 " some_code();\n" 1416 "test_label:;\n" 1417 " int i = 0;\n" 1418 "}"); 1419 FormatStyle Style = getLLVMStyle(); 1420 Style.IndentGotoLabels = false; 1421 verifyFormat("void f() {\n" 1422 " some_code();\n" 1423 "test_label:\n" 1424 " some_other_code();\n" 1425 " {\n" 1426 " some_more_code();\n" 1427 "another_label:\n" 1428 " some_more_code();\n" 1429 " }\n" 1430 "}", 1431 Style); 1432 verifyFormat("{\n" 1433 " some_code();\n" 1434 "test_label:\n" 1435 " some_other_code();\n" 1436 "}", 1437 Style); 1438 verifyFormat("{\n" 1439 " some_code();\n" 1440 "test_label:;\n" 1441 " int i = 0;\n" 1442 "}"); 1443 } 1444 1445 TEST_F(FormatTest, MultiLineControlStatements) { 1446 FormatStyle Style = getLLVMStyle(); 1447 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1448 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; 1449 Style.ColumnLimit = 20; 1450 // Short lines should keep opening brace on same line. 1451 EXPECT_EQ("if (foo) {\n" 1452 " bar();\n" 1453 "}", 1454 format("if(foo){bar();}", Style)); 1455 EXPECT_EQ("if (foo) {\n" 1456 " bar();\n" 1457 "} else {\n" 1458 " baz();\n" 1459 "}", 1460 format("if(foo){bar();}else{baz();}", Style)); 1461 EXPECT_EQ("if (foo && bar) {\n" 1462 " baz();\n" 1463 "}", 1464 format("if(foo&&bar){baz();}", Style)); 1465 EXPECT_EQ("if (foo) {\n" 1466 " bar();\n" 1467 "} else if (baz) {\n" 1468 " quux();\n" 1469 "}", 1470 format("if(foo){bar();}else if(baz){quux();}", Style)); 1471 EXPECT_EQ( 1472 "if (foo) {\n" 1473 " bar();\n" 1474 "} else if (baz) {\n" 1475 " quux();\n" 1476 "} else {\n" 1477 " foobar();\n" 1478 "}", 1479 format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); 1480 EXPECT_EQ("for (;;) {\n" 1481 " foo();\n" 1482 "}", 1483 format("for(;;){foo();}")); 1484 EXPECT_EQ("while (1) {\n" 1485 " foo();\n" 1486 "}", 1487 format("while(1){foo();}", Style)); 1488 EXPECT_EQ("switch (foo) {\n" 1489 "case bar:\n" 1490 " return;\n" 1491 "}", 1492 format("switch(foo){case bar:return;}", Style)); 1493 EXPECT_EQ("try {\n" 1494 " foo();\n" 1495 "} catch (...) {\n" 1496 " bar();\n" 1497 "}", 1498 format("try{foo();}catch(...){bar();}", Style)); 1499 EXPECT_EQ("do {\n" 1500 " foo();\n" 1501 "} while (bar &&\n" 1502 " baz);", 1503 format("do{foo();}while(bar&&baz);", Style)); 1504 // Long lines should put opening brace on new line. 1505 EXPECT_EQ("if (foo && bar &&\n" 1506 " baz)\n" 1507 "{\n" 1508 " quux();\n" 1509 "}", 1510 format("if(foo&&bar&&baz){quux();}", Style)); 1511 EXPECT_EQ("if (foo && bar &&\n" 1512 " baz)\n" 1513 "{\n" 1514 " quux();\n" 1515 "}", 1516 format("if (foo && bar &&\n" 1517 " baz) {\n" 1518 " quux();\n" 1519 "}", 1520 Style)); 1521 EXPECT_EQ("if (foo) {\n" 1522 " bar();\n" 1523 "} else if (baz ||\n" 1524 " quux)\n" 1525 "{\n" 1526 " foobar();\n" 1527 "}", 1528 format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); 1529 EXPECT_EQ( 1530 "if (foo) {\n" 1531 " bar();\n" 1532 "} else if (baz ||\n" 1533 " quux)\n" 1534 "{\n" 1535 " foobar();\n" 1536 "} else {\n" 1537 " barbaz();\n" 1538 "}", 1539 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1540 Style)); 1541 EXPECT_EQ("for (int i = 0;\n" 1542 " i < 10; ++i)\n" 1543 "{\n" 1544 " foo();\n" 1545 "}", 1546 format("for(int i=0;i<10;++i){foo();}", Style)); 1547 EXPECT_EQ("while (foo || bar ||\n" 1548 " baz)\n" 1549 "{\n" 1550 " quux();\n" 1551 "}", 1552 format("while(foo||bar||baz){quux();}", Style)); 1553 EXPECT_EQ("switch (\n" 1554 " foo = barbaz)\n" 1555 "{\n" 1556 "case quux:\n" 1557 " return;\n" 1558 "}", 1559 format("switch(foo=barbaz){case quux:return;}", Style)); 1560 EXPECT_EQ("try {\n" 1561 " foo();\n" 1562 "} catch (\n" 1563 " Exception &bar)\n" 1564 "{\n" 1565 " baz();\n" 1566 "}", 1567 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1568 } 1569 1570 //===----------------------------------------------------------------------===// 1571 // Tests for classes, namespaces, etc. 1572 //===----------------------------------------------------------------------===// 1573 1574 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1575 verifyFormat("class A {};"); 1576 } 1577 1578 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1579 verifyFormat("class A {\n" 1580 "public:\n" 1581 "public: // comment\n" 1582 "protected:\n" 1583 "private:\n" 1584 " void f() {}\n" 1585 "};"); 1586 verifyFormat("export class A {\n" 1587 "public:\n" 1588 "public: // comment\n" 1589 "protected:\n" 1590 "private:\n" 1591 " void f() {}\n" 1592 "};"); 1593 verifyGoogleFormat("class A {\n" 1594 " public:\n" 1595 " protected:\n" 1596 " private:\n" 1597 " void f() {}\n" 1598 "};"); 1599 verifyGoogleFormat("export class A {\n" 1600 " public:\n" 1601 " protected:\n" 1602 " private:\n" 1603 " void f() {}\n" 1604 "};"); 1605 verifyFormat("class A {\n" 1606 "public slots:\n" 1607 " void f1() {}\n" 1608 "public Q_SLOTS:\n" 1609 " void f2() {}\n" 1610 "protected slots:\n" 1611 " void f3() {}\n" 1612 "protected Q_SLOTS:\n" 1613 " void f4() {}\n" 1614 "private slots:\n" 1615 " void f5() {}\n" 1616 "private Q_SLOTS:\n" 1617 " void f6() {}\n" 1618 "signals:\n" 1619 " void g1();\n" 1620 "Q_SIGNALS:\n" 1621 " void g2();\n" 1622 "};"); 1623 1624 // Don't interpret 'signals' the wrong way. 1625 verifyFormat("signals.set();"); 1626 verifyFormat("for (Signals signals : f()) {\n}"); 1627 verifyFormat("{\n" 1628 " signals.set(); // This needs indentation.\n" 1629 "}"); 1630 verifyFormat("void f() {\n" 1631 "label:\n" 1632 " signals.baz();\n" 1633 "}"); 1634 } 1635 1636 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1637 EXPECT_EQ("class A {\n" 1638 "public:\n" 1639 " void f();\n" 1640 "\n" 1641 "private:\n" 1642 " void g() {}\n" 1643 " // test\n" 1644 "protected:\n" 1645 " int h;\n" 1646 "};", 1647 format("class A {\n" 1648 "public:\n" 1649 "void f();\n" 1650 "private:\n" 1651 "void g() {}\n" 1652 "// test\n" 1653 "protected:\n" 1654 "int h;\n" 1655 "};")); 1656 EXPECT_EQ("class A {\n" 1657 "protected:\n" 1658 "public:\n" 1659 " void f();\n" 1660 "};", 1661 format("class A {\n" 1662 "protected:\n" 1663 "\n" 1664 "public:\n" 1665 "\n" 1666 " void f();\n" 1667 "};")); 1668 1669 // Even ensure proper spacing inside macros. 1670 EXPECT_EQ("#define B \\\n" 1671 " class A { \\\n" 1672 " protected: \\\n" 1673 " public: \\\n" 1674 " void f(); \\\n" 1675 " };", 1676 format("#define B \\\n" 1677 " class A { \\\n" 1678 " protected: \\\n" 1679 " \\\n" 1680 " public: \\\n" 1681 " \\\n" 1682 " void f(); \\\n" 1683 " };", 1684 getGoogleStyle())); 1685 // But don't remove empty lines after macros ending in access specifiers. 1686 EXPECT_EQ("#define A private:\n" 1687 "\n" 1688 "int i;", 1689 format("#define A private:\n" 1690 "\n" 1691 "int i;")); 1692 } 1693 1694 TEST_F(FormatTest, FormatsClasses) { 1695 verifyFormat("class A : public B {};"); 1696 verifyFormat("class A : public ::B {};"); 1697 1698 verifyFormat( 1699 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1700 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1701 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1702 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1703 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1704 verifyFormat( 1705 "class A : public B, public C, public D, public E, public F {};"); 1706 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1707 " public C,\n" 1708 " public D,\n" 1709 " public E,\n" 1710 " public F,\n" 1711 " public G {};"); 1712 1713 verifyFormat("class\n" 1714 " ReallyReallyLongClassName {\n" 1715 " int i;\n" 1716 "};", 1717 getLLVMStyleWithColumns(32)); 1718 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1719 " aaaaaaaaaaaaaaaa> {};"); 1720 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1721 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1722 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1723 verifyFormat("template <class R, class C>\n" 1724 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1725 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1726 verifyFormat("class ::A::B {};"); 1727 } 1728 1729 TEST_F(FormatTest, BreakInheritanceStyle) { 1730 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1731 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1732 FormatStyle::BILS_BeforeComma; 1733 verifyFormat("class MyClass : public X {};", 1734 StyleWithInheritanceBreakBeforeComma); 1735 verifyFormat("class MyClass\n" 1736 " : public X\n" 1737 " , public Y {};", 1738 StyleWithInheritanceBreakBeforeComma); 1739 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1740 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1741 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1742 StyleWithInheritanceBreakBeforeComma); 1743 verifyFormat("struct aaaaaaaaaaaaa\n" 1744 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1745 " aaaaaaaaaaaaaaaa> {};", 1746 StyleWithInheritanceBreakBeforeComma); 1747 1748 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1749 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1750 FormatStyle::BILS_AfterColon; 1751 verifyFormat("class MyClass : public X {};", 1752 StyleWithInheritanceBreakAfterColon); 1753 verifyFormat("class MyClass : public X, public Y {};", 1754 StyleWithInheritanceBreakAfterColon); 1755 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1756 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1757 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1758 StyleWithInheritanceBreakAfterColon); 1759 verifyFormat("struct aaaaaaaaaaaaa :\n" 1760 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1761 " aaaaaaaaaaaaaaaa> {};", 1762 StyleWithInheritanceBreakAfterColon); 1763 } 1764 1765 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1766 verifyFormat("class A {\n} a, b;"); 1767 verifyFormat("struct A {\n} a, b;"); 1768 verifyFormat("union A {\n} a;"); 1769 } 1770 1771 TEST_F(FormatTest, FormatsEnum) { 1772 verifyFormat("enum {\n" 1773 " Zero,\n" 1774 " One = 1,\n" 1775 " Two = One + 1,\n" 1776 " Three = (One + Two),\n" 1777 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1778 " Five = (One, Two, Three, Four, 5)\n" 1779 "};"); 1780 verifyGoogleFormat("enum {\n" 1781 " Zero,\n" 1782 " One = 1,\n" 1783 " Two = One + 1,\n" 1784 " Three = (One + Two),\n" 1785 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1786 " Five = (One, Two, Three, Four, 5)\n" 1787 "};"); 1788 verifyFormat("enum Enum {};"); 1789 verifyFormat("enum {};"); 1790 verifyFormat("enum X E {} d;"); 1791 verifyFormat("enum __attribute__((...)) E {} d;"); 1792 verifyFormat("enum __declspec__((...)) E {} d;"); 1793 verifyFormat("enum {\n" 1794 " Bar = Foo<int, int>::value\n" 1795 "};", 1796 getLLVMStyleWithColumns(30)); 1797 1798 verifyFormat("enum ShortEnum { A, B, C };"); 1799 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1800 1801 EXPECT_EQ("enum KeepEmptyLines {\n" 1802 " ONE,\n" 1803 "\n" 1804 " TWO,\n" 1805 "\n" 1806 " THREE\n" 1807 "}", 1808 format("enum KeepEmptyLines {\n" 1809 " ONE,\n" 1810 "\n" 1811 " TWO,\n" 1812 "\n" 1813 "\n" 1814 " THREE\n" 1815 "}")); 1816 verifyFormat("enum E { // comment\n" 1817 " ONE,\n" 1818 " TWO\n" 1819 "};\n" 1820 "int i;"); 1821 // Not enums. 1822 verifyFormat("enum X f() {\n" 1823 " a();\n" 1824 " return 42;\n" 1825 "}"); 1826 verifyFormat("enum X Type::f() {\n" 1827 " a();\n" 1828 " return 42;\n" 1829 "}"); 1830 verifyFormat("enum ::X f() {\n" 1831 " a();\n" 1832 " return 42;\n" 1833 "}"); 1834 verifyFormat("enum ns::X f() {\n" 1835 " a();\n" 1836 " return 42;\n" 1837 "}"); 1838 } 1839 1840 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1841 verifyFormat("enum Type {\n" 1842 " One = 0; // These semicolons should be commas.\n" 1843 " Two = 1;\n" 1844 "};"); 1845 verifyFormat("namespace n {\n" 1846 "enum Type {\n" 1847 " One,\n" 1848 " Two, // missing };\n" 1849 " int i;\n" 1850 "}\n" 1851 "void g() {}"); 1852 } 1853 1854 TEST_F(FormatTest, FormatsEnumStruct) { 1855 verifyFormat("enum struct {\n" 1856 " Zero,\n" 1857 " One = 1,\n" 1858 " Two = One + 1,\n" 1859 " Three = (One + Two),\n" 1860 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1861 " Five = (One, Two, Three, Four, 5)\n" 1862 "};"); 1863 verifyFormat("enum struct Enum {};"); 1864 verifyFormat("enum struct {};"); 1865 verifyFormat("enum struct X E {} d;"); 1866 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1867 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1868 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1869 } 1870 1871 TEST_F(FormatTest, FormatsEnumClass) { 1872 verifyFormat("enum class {\n" 1873 " Zero,\n" 1874 " One = 1,\n" 1875 " Two = One + 1,\n" 1876 " Three = (One + Two),\n" 1877 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1878 " Five = (One, Two, Three, Four, 5)\n" 1879 "};"); 1880 verifyFormat("enum class Enum {};"); 1881 verifyFormat("enum class {};"); 1882 verifyFormat("enum class X E {} d;"); 1883 verifyFormat("enum class __attribute__((...)) E {} d;"); 1884 verifyFormat("enum class __declspec__((...)) E {} d;"); 1885 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1886 } 1887 1888 TEST_F(FormatTest, FormatsEnumTypes) { 1889 verifyFormat("enum X : int {\n" 1890 " A, // Force multiple lines.\n" 1891 " B\n" 1892 "};"); 1893 verifyFormat("enum X : int { A, B };"); 1894 verifyFormat("enum X : std::uint32_t { A, B };"); 1895 } 1896 1897 TEST_F(FormatTest, FormatsTypedefEnum) { 1898 FormatStyle Style = getLLVMStyle(); 1899 Style.ColumnLimit = 40; 1900 verifyFormat("typedef enum {} EmptyEnum;"); 1901 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1902 verifyFormat("typedef enum {\n" 1903 " ZERO = 0,\n" 1904 " ONE = 1,\n" 1905 " TWO = 2,\n" 1906 " THREE = 3\n" 1907 "} LongEnum;", 1908 Style); 1909 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1910 Style.BraceWrapping.AfterEnum = true; 1911 verifyFormat("typedef enum {} EmptyEnum;"); 1912 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1913 verifyFormat("typedef enum\n" 1914 "{\n" 1915 " ZERO = 0,\n" 1916 " ONE = 1,\n" 1917 " TWO = 2,\n" 1918 " THREE = 3\n" 1919 "} LongEnum;", 1920 Style); 1921 } 1922 1923 TEST_F(FormatTest, FormatsNSEnums) { 1924 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1925 verifyGoogleFormat( 1926 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1927 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 1928 " // Information about someDecentlyLongValue.\n" 1929 " someDecentlyLongValue,\n" 1930 " // Information about anotherDecentlyLongValue.\n" 1931 " anotherDecentlyLongValue,\n" 1932 " // Information about aThirdDecentlyLongValue.\n" 1933 " aThirdDecentlyLongValue\n" 1934 "};"); 1935 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 1936 " // Information about someDecentlyLongValue.\n" 1937 " someDecentlyLongValue,\n" 1938 " // Information about anotherDecentlyLongValue.\n" 1939 " anotherDecentlyLongValue,\n" 1940 " // Information about aThirdDecentlyLongValue.\n" 1941 " aThirdDecentlyLongValue\n" 1942 "};"); 1943 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 1944 " a = 1,\n" 1945 " b = 2,\n" 1946 " c = 3,\n" 1947 "};"); 1948 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 1949 " a = 1,\n" 1950 " b = 2,\n" 1951 " c = 3,\n" 1952 "};"); 1953 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 1954 " a = 1,\n" 1955 " b = 2,\n" 1956 " c = 3,\n" 1957 "};"); 1958 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 1959 " a = 1,\n" 1960 " b = 2,\n" 1961 " c = 3,\n" 1962 "};"); 1963 } 1964 1965 TEST_F(FormatTest, FormatsBitfields) { 1966 verifyFormat("struct Bitfields {\n" 1967 " unsigned sClass : 8;\n" 1968 " unsigned ValueKind : 2;\n" 1969 "};"); 1970 verifyFormat("struct A {\n" 1971 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 1972 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 1973 "};"); 1974 verifyFormat("struct MyStruct {\n" 1975 " uchar data;\n" 1976 " uchar : 8;\n" 1977 " uchar : 8;\n" 1978 " uchar other;\n" 1979 "};"); 1980 } 1981 1982 TEST_F(FormatTest, FormatsNamespaces) { 1983 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 1984 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 1985 1986 verifyFormat("namespace some_namespace {\n" 1987 "class A {};\n" 1988 "void f() { f(); }\n" 1989 "}", 1990 LLVMWithNoNamespaceFix); 1991 verifyFormat("namespace N::inline D {\n" 1992 "class A {};\n" 1993 "void f() { f(); }\n" 1994 "}", 1995 LLVMWithNoNamespaceFix); 1996 verifyFormat("namespace N::inline D::E {\n" 1997 "class A {};\n" 1998 "void f() { f(); }\n" 1999 "}", 2000 LLVMWithNoNamespaceFix); 2001 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 2002 "class A {};\n" 2003 "void f() { f(); }\n" 2004 "}", 2005 LLVMWithNoNamespaceFix); 2006 verifyFormat("/* something */ namespace some_namespace {\n" 2007 "class A {};\n" 2008 "void f() { f(); }\n" 2009 "}", 2010 LLVMWithNoNamespaceFix); 2011 verifyFormat("namespace {\n" 2012 "class A {};\n" 2013 "void f() { f(); }\n" 2014 "}", 2015 LLVMWithNoNamespaceFix); 2016 verifyFormat("/* something */ namespace {\n" 2017 "class A {};\n" 2018 "void f() { f(); }\n" 2019 "}", 2020 LLVMWithNoNamespaceFix); 2021 verifyFormat("inline namespace X {\n" 2022 "class A {};\n" 2023 "void f() { f(); }\n" 2024 "}", 2025 LLVMWithNoNamespaceFix); 2026 verifyFormat("/* something */ inline namespace X {\n" 2027 "class A {};\n" 2028 "void f() { f(); }\n" 2029 "}", 2030 LLVMWithNoNamespaceFix); 2031 verifyFormat("export namespace X {\n" 2032 "class A {};\n" 2033 "void f() { f(); }\n" 2034 "}", 2035 LLVMWithNoNamespaceFix); 2036 verifyFormat("using namespace some_namespace;\n" 2037 "class A {};\n" 2038 "void f() { f(); }", 2039 LLVMWithNoNamespaceFix); 2040 2041 // This code is more common than we thought; if we 2042 // layout this correctly the semicolon will go into 2043 // its own line, which is undesirable. 2044 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 2045 verifyFormat("namespace {\n" 2046 "class A {};\n" 2047 "};", 2048 LLVMWithNoNamespaceFix); 2049 2050 verifyFormat("namespace {\n" 2051 "int SomeVariable = 0; // comment\n" 2052 "} // namespace", 2053 LLVMWithNoNamespaceFix); 2054 EXPECT_EQ("#ifndef HEADER_GUARD\n" 2055 "#define HEADER_GUARD\n" 2056 "namespace my_namespace {\n" 2057 "int i;\n" 2058 "} // my_namespace\n" 2059 "#endif // HEADER_GUARD", 2060 format("#ifndef HEADER_GUARD\n" 2061 " #define HEADER_GUARD\n" 2062 " namespace my_namespace {\n" 2063 "int i;\n" 2064 "} // my_namespace\n" 2065 "#endif // HEADER_GUARD", 2066 LLVMWithNoNamespaceFix)); 2067 2068 EXPECT_EQ("namespace A::B {\n" 2069 "class C {};\n" 2070 "}", 2071 format("namespace A::B {\n" 2072 "class C {};\n" 2073 "}", 2074 LLVMWithNoNamespaceFix)); 2075 2076 FormatStyle Style = getLLVMStyle(); 2077 Style.NamespaceIndentation = FormatStyle::NI_All; 2078 EXPECT_EQ("namespace out {\n" 2079 " int i;\n" 2080 " namespace in {\n" 2081 " int i;\n" 2082 " } // namespace in\n" 2083 "} // namespace out", 2084 format("namespace out {\n" 2085 "int i;\n" 2086 "namespace in {\n" 2087 "int i;\n" 2088 "} // namespace in\n" 2089 "} // namespace out", 2090 Style)); 2091 2092 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2093 EXPECT_EQ("namespace out {\n" 2094 "int i;\n" 2095 "namespace in {\n" 2096 " int i;\n" 2097 "} // namespace in\n" 2098 "} // namespace out", 2099 format("namespace out {\n" 2100 "int i;\n" 2101 "namespace in {\n" 2102 "int i;\n" 2103 "} // namespace in\n" 2104 "} // namespace out", 2105 Style)); 2106 } 2107 2108 TEST_F(FormatTest, NamespaceMacros) { 2109 FormatStyle Style = getLLVMStyle(); 2110 Style.NamespaceMacros.push_back("TESTSUITE"); 2111 2112 verifyFormat("TESTSUITE(A) {\n" 2113 "int foo();\n" 2114 "} // TESTSUITE(A)", 2115 Style); 2116 2117 verifyFormat("TESTSUITE(A, B) {\n" 2118 "int foo();\n" 2119 "} // TESTSUITE(A)", 2120 Style); 2121 2122 // Properly indent according to NamespaceIndentation style 2123 Style.NamespaceIndentation = FormatStyle::NI_All; 2124 verifyFormat("TESTSUITE(A) {\n" 2125 " int foo();\n" 2126 "} // TESTSUITE(A)", 2127 Style); 2128 verifyFormat("TESTSUITE(A) {\n" 2129 " namespace B {\n" 2130 " int foo();\n" 2131 " } // namespace B\n" 2132 "} // TESTSUITE(A)", 2133 Style); 2134 verifyFormat("namespace A {\n" 2135 " TESTSUITE(B) {\n" 2136 " int foo();\n" 2137 " } // TESTSUITE(B)\n" 2138 "} // namespace A", 2139 Style); 2140 2141 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2142 verifyFormat("TESTSUITE(A) {\n" 2143 "TESTSUITE(B) {\n" 2144 " int foo();\n" 2145 "} // TESTSUITE(B)\n" 2146 "} // TESTSUITE(A)", 2147 Style); 2148 verifyFormat("TESTSUITE(A) {\n" 2149 "namespace B {\n" 2150 " int foo();\n" 2151 "} // namespace B\n" 2152 "} // TESTSUITE(A)", 2153 Style); 2154 verifyFormat("namespace A {\n" 2155 "TESTSUITE(B) {\n" 2156 " int foo();\n" 2157 "} // TESTSUITE(B)\n" 2158 "} // namespace A", 2159 Style); 2160 2161 // Properly merge namespace-macros blocks in CompactNamespaces mode 2162 Style.NamespaceIndentation = FormatStyle::NI_None; 2163 Style.CompactNamespaces = true; 2164 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2165 "}} // TESTSUITE(A::B)", 2166 Style); 2167 2168 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2169 "}} // TESTSUITE(out::in)", 2170 format("TESTSUITE(out) {\n" 2171 "TESTSUITE(in) {\n" 2172 "} // TESTSUITE(in)\n" 2173 "} // TESTSUITE(out)", 2174 Style)); 2175 2176 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2177 "}} // TESTSUITE(out::in)", 2178 format("TESTSUITE(out) {\n" 2179 "TESTSUITE(in) {\n" 2180 "} // TESTSUITE(in)\n" 2181 "} // TESTSUITE(out)", 2182 Style)); 2183 2184 // Do not merge different namespaces/macros 2185 EXPECT_EQ("namespace out {\n" 2186 "TESTSUITE(in) {\n" 2187 "} // TESTSUITE(in)\n" 2188 "} // namespace out", 2189 format("namespace out {\n" 2190 "TESTSUITE(in) {\n" 2191 "} // TESTSUITE(in)\n" 2192 "} // namespace out", 2193 Style)); 2194 EXPECT_EQ("TESTSUITE(out) {\n" 2195 "namespace in {\n" 2196 "} // namespace in\n" 2197 "} // TESTSUITE(out)", 2198 format("TESTSUITE(out) {\n" 2199 "namespace in {\n" 2200 "} // namespace in\n" 2201 "} // TESTSUITE(out)", 2202 Style)); 2203 Style.NamespaceMacros.push_back("FOOBAR"); 2204 EXPECT_EQ("TESTSUITE(out) {\n" 2205 "FOOBAR(in) {\n" 2206 "} // FOOBAR(in)\n" 2207 "} // TESTSUITE(out)", 2208 format("TESTSUITE(out) {\n" 2209 "FOOBAR(in) {\n" 2210 "} // FOOBAR(in)\n" 2211 "} // TESTSUITE(out)", 2212 Style)); 2213 } 2214 2215 TEST_F(FormatTest, FormatsCompactNamespaces) { 2216 FormatStyle Style = getLLVMStyle(); 2217 Style.CompactNamespaces = true; 2218 Style.NamespaceMacros.push_back("TESTSUITE"); 2219 2220 verifyFormat("namespace A { namespace B {\n" 2221 "}} // namespace A::B", 2222 Style); 2223 2224 EXPECT_EQ("namespace out { namespace in {\n" 2225 "}} // namespace out::in", 2226 format("namespace out {\n" 2227 "namespace in {\n" 2228 "} // namespace in\n" 2229 "} // namespace out", 2230 Style)); 2231 2232 // Only namespaces which have both consecutive opening and end get compacted 2233 EXPECT_EQ("namespace out {\n" 2234 "namespace in1 {\n" 2235 "} // namespace in1\n" 2236 "namespace in2 {\n" 2237 "} // namespace in2\n" 2238 "} // namespace out", 2239 format("namespace out {\n" 2240 "namespace in1 {\n" 2241 "} // namespace in1\n" 2242 "namespace in2 {\n" 2243 "} // namespace in2\n" 2244 "} // namespace out", 2245 Style)); 2246 2247 EXPECT_EQ("namespace out {\n" 2248 "int i;\n" 2249 "namespace in {\n" 2250 "int j;\n" 2251 "} // namespace in\n" 2252 "int k;\n" 2253 "} // namespace out", 2254 format("namespace out { int i;\n" 2255 "namespace in { int j; } // namespace in\n" 2256 "int k; } // namespace out", 2257 Style)); 2258 2259 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2260 "}}} // namespace A::B::C\n", 2261 format("namespace A { namespace B {\n" 2262 "namespace C {\n" 2263 "}} // namespace B::C\n" 2264 "} // namespace A\n", 2265 Style)); 2266 2267 Style.ColumnLimit = 40; 2268 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2269 "namespace bbbbbbbbbb {\n" 2270 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2271 format("namespace aaaaaaaaaa {\n" 2272 "namespace bbbbbbbbbb {\n" 2273 "} // namespace bbbbbbbbbb\n" 2274 "} // namespace aaaaaaaaaa", 2275 Style)); 2276 2277 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2278 "namespace cccccc {\n" 2279 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2280 format("namespace aaaaaa {\n" 2281 "namespace bbbbbb {\n" 2282 "namespace cccccc {\n" 2283 "} // namespace cccccc\n" 2284 "} // namespace bbbbbb\n" 2285 "} // namespace aaaaaa", 2286 Style)); 2287 Style.ColumnLimit = 80; 2288 2289 // Extra semicolon after 'inner' closing brace prevents merging 2290 EXPECT_EQ("namespace out { namespace in {\n" 2291 "}; } // namespace out::in", 2292 format("namespace out {\n" 2293 "namespace in {\n" 2294 "}; // namespace in\n" 2295 "} // namespace out", 2296 Style)); 2297 2298 // Extra semicolon after 'outer' closing brace is conserved 2299 EXPECT_EQ("namespace out { namespace in {\n" 2300 "}}; // namespace out::in", 2301 format("namespace out {\n" 2302 "namespace in {\n" 2303 "} // namespace in\n" 2304 "}; // namespace out", 2305 Style)); 2306 2307 Style.NamespaceIndentation = FormatStyle::NI_All; 2308 EXPECT_EQ("namespace out { namespace in {\n" 2309 " int i;\n" 2310 "}} // namespace out::in", 2311 format("namespace out {\n" 2312 "namespace in {\n" 2313 "int i;\n" 2314 "} // namespace in\n" 2315 "} // namespace out", 2316 Style)); 2317 EXPECT_EQ("namespace out { namespace mid {\n" 2318 " namespace in {\n" 2319 " int j;\n" 2320 " } // namespace in\n" 2321 " int k;\n" 2322 "}} // namespace out::mid", 2323 format("namespace out { namespace mid {\n" 2324 "namespace in { int j; } // namespace in\n" 2325 "int k; }} // namespace out::mid", 2326 Style)); 2327 2328 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2329 EXPECT_EQ("namespace out { namespace in {\n" 2330 " int i;\n" 2331 "}} // namespace out::in", 2332 format("namespace out {\n" 2333 "namespace in {\n" 2334 "int i;\n" 2335 "} // namespace in\n" 2336 "} // namespace out", 2337 Style)); 2338 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2339 " int i;\n" 2340 "}}} // namespace out::mid::in", 2341 format("namespace out {\n" 2342 "namespace mid {\n" 2343 "namespace in {\n" 2344 "int i;\n" 2345 "} // namespace in\n" 2346 "} // namespace mid\n" 2347 "} // namespace out", 2348 Style)); 2349 } 2350 2351 TEST_F(FormatTest, FormatsExternC) { 2352 verifyFormat("extern \"C\" {\nint a;"); 2353 verifyFormat("extern \"C\" {}"); 2354 verifyFormat("extern \"C\" {\n" 2355 "int foo();\n" 2356 "}"); 2357 verifyFormat("extern \"C\" int foo() {}"); 2358 verifyFormat("extern \"C\" int foo();"); 2359 verifyFormat("extern \"C\" int foo() {\n" 2360 " int i = 42;\n" 2361 " return i;\n" 2362 "}"); 2363 2364 FormatStyle Style = getLLVMStyle(); 2365 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2366 Style.BraceWrapping.AfterFunction = true; 2367 verifyFormat("extern \"C\" int foo() {}", Style); 2368 verifyFormat("extern \"C\" int foo();", Style); 2369 verifyFormat("extern \"C\" int foo()\n" 2370 "{\n" 2371 " int i = 42;\n" 2372 " return i;\n" 2373 "}", 2374 Style); 2375 2376 Style.BraceWrapping.AfterExternBlock = true; 2377 Style.BraceWrapping.SplitEmptyRecord = false; 2378 verifyFormat("extern \"C\"\n" 2379 "{}", 2380 Style); 2381 verifyFormat("extern \"C\"\n" 2382 "{\n" 2383 " int foo();\n" 2384 "}", 2385 Style); 2386 } 2387 2388 TEST_F(FormatTest, FormatsInlineASM) { 2389 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2390 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2391 verifyFormat( 2392 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2393 " \"cpuid\\n\\t\"\n" 2394 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2395 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2396 " : \"a\"(value));"); 2397 EXPECT_EQ( 2398 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2399 " __asm {\n" 2400 " mov edx,[that] // vtable in edx\n" 2401 " mov eax,methodIndex\n" 2402 " call [edx][eax*4] // stdcall\n" 2403 " }\n" 2404 "}", 2405 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2406 " __asm {\n" 2407 " mov edx,[that] // vtable in edx\n" 2408 " mov eax,methodIndex\n" 2409 " call [edx][eax*4] // stdcall\n" 2410 " }\n" 2411 "}")); 2412 EXPECT_EQ("_asm {\n" 2413 " xor eax, eax;\n" 2414 " cpuid;\n" 2415 "}", 2416 format("_asm {\n" 2417 " xor eax, eax;\n" 2418 " cpuid;\n" 2419 "}")); 2420 verifyFormat("void function() {\n" 2421 " // comment\n" 2422 " asm(\"\");\n" 2423 "}"); 2424 EXPECT_EQ("__asm {\n" 2425 "}\n" 2426 "int i;", 2427 format("__asm {\n" 2428 "}\n" 2429 "int i;")); 2430 } 2431 2432 TEST_F(FormatTest, FormatTryCatch) { 2433 verifyFormat("try {\n" 2434 " throw a * b;\n" 2435 "} catch (int a) {\n" 2436 " // Do nothing.\n" 2437 "} catch (...) {\n" 2438 " exit(42);\n" 2439 "}"); 2440 2441 // Function-level try statements. 2442 verifyFormat("int f() try { return 4; } catch (...) {\n" 2443 " return 5;\n" 2444 "}"); 2445 verifyFormat("class A {\n" 2446 " int a;\n" 2447 " A() try : a(0) {\n" 2448 " } catch (...) {\n" 2449 " throw;\n" 2450 " }\n" 2451 "};\n"); 2452 2453 // Incomplete try-catch blocks. 2454 verifyIncompleteFormat("try {} catch ("); 2455 } 2456 2457 TEST_F(FormatTest, FormatSEHTryCatch) { 2458 verifyFormat("__try {\n" 2459 " int a = b * c;\n" 2460 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2461 " // Do nothing.\n" 2462 "}"); 2463 2464 verifyFormat("__try {\n" 2465 " int a = b * c;\n" 2466 "} __finally {\n" 2467 " // Do nothing.\n" 2468 "}"); 2469 2470 verifyFormat("DEBUG({\n" 2471 " __try {\n" 2472 " } __finally {\n" 2473 " }\n" 2474 "});\n"); 2475 } 2476 2477 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2478 verifyFormat("try {\n" 2479 " f();\n" 2480 "} catch {\n" 2481 " g();\n" 2482 "}"); 2483 verifyFormat("try {\n" 2484 " f();\n" 2485 "} catch (A a) MACRO(x) {\n" 2486 " g();\n" 2487 "} catch (B b) MACRO(x) {\n" 2488 " g();\n" 2489 "}"); 2490 } 2491 2492 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2493 FormatStyle Style = getLLVMStyle(); 2494 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2495 FormatStyle::BS_WebKit}) { 2496 Style.BreakBeforeBraces = BraceStyle; 2497 verifyFormat("try {\n" 2498 " // something\n" 2499 "} catch (...) {\n" 2500 " // something\n" 2501 "}", 2502 Style); 2503 } 2504 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2505 verifyFormat("try {\n" 2506 " // something\n" 2507 "}\n" 2508 "catch (...) {\n" 2509 " // something\n" 2510 "}", 2511 Style); 2512 verifyFormat("__try {\n" 2513 " // something\n" 2514 "}\n" 2515 "__finally {\n" 2516 " // something\n" 2517 "}", 2518 Style); 2519 verifyFormat("@try {\n" 2520 " // something\n" 2521 "}\n" 2522 "@finally {\n" 2523 " // something\n" 2524 "}", 2525 Style); 2526 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2527 verifyFormat("try\n" 2528 "{\n" 2529 " // something\n" 2530 "}\n" 2531 "catch (...)\n" 2532 "{\n" 2533 " // something\n" 2534 "}", 2535 Style); 2536 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2537 verifyFormat("try\n" 2538 " {\n" 2539 " // something white\n" 2540 " }\n" 2541 "catch (...)\n" 2542 " {\n" 2543 " // something white\n" 2544 " }", 2545 Style); 2546 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2547 verifyFormat("try\n" 2548 " {\n" 2549 " // something\n" 2550 " }\n" 2551 "catch (...)\n" 2552 " {\n" 2553 " // something\n" 2554 " }", 2555 Style); 2556 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2557 Style.BraceWrapping.BeforeCatch = true; 2558 verifyFormat("try {\n" 2559 " // something\n" 2560 "}\n" 2561 "catch (...) {\n" 2562 " // something\n" 2563 "}", 2564 Style); 2565 } 2566 2567 TEST_F(FormatTest, StaticInitializers) { 2568 verifyFormat("static SomeClass SC = {1, 'a'};"); 2569 2570 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2571 " 100000000, " 2572 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2573 2574 // Here, everything other than the "}" would fit on a line. 2575 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2576 " 10000000000000000000000000};"); 2577 EXPECT_EQ("S s = {a,\n" 2578 "\n" 2579 " b};", 2580 format("S s = {\n" 2581 " a,\n" 2582 "\n" 2583 " b\n" 2584 "};")); 2585 2586 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2587 // line. However, the formatting looks a bit off and this probably doesn't 2588 // happen often in practice. 2589 verifyFormat("static int Variable[1] = {\n" 2590 " {1000000000000000000000000000000000000}};", 2591 getLLVMStyleWithColumns(40)); 2592 } 2593 2594 TEST_F(FormatTest, DesignatedInitializers) { 2595 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2596 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2597 " .bbbbbbbbbb = 2,\n" 2598 " .cccccccccc = 3,\n" 2599 " .dddddddddd = 4,\n" 2600 " .eeeeeeeeee = 5};"); 2601 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2602 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2603 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2604 " .ccccccccccccccccccccccccccc = 3,\n" 2605 " .ddddddddddddddddddddddddddd = 4,\n" 2606 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2607 2608 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2609 2610 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2611 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2612 " [2] = bbbbbbbbbb,\n" 2613 " [3] = cccccccccc,\n" 2614 " [4] = dddddddddd,\n" 2615 " [5] = eeeeeeeeee};"); 2616 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2617 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2618 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2619 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2620 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2621 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2622 } 2623 2624 TEST_F(FormatTest, NestedStaticInitializers) { 2625 verifyFormat("static A x = {{{}}};\n"); 2626 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2627 " {init1, init2, init3, init4}}};", 2628 getLLVMStyleWithColumns(50)); 2629 2630 verifyFormat("somes Status::global_reps[3] = {\n" 2631 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2632 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2633 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2634 getLLVMStyleWithColumns(60)); 2635 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2636 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2637 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2638 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2639 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2640 " {rect.fRight - rect.fLeft, rect.fBottom - " 2641 "rect.fTop}};"); 2642 2643 verifyFormat( 2644 "SomeArrayOfSomeType a = {\n" 2645 " {{1, 2, 3},\n" 2646 " {1, 2, 3},\n" 2647 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2648 " 333333333333333333333333333333},\n" 2649 " {1, 2, 3},\n" 2650 " {1, 2, 3}}};"); 2651 verifyFormat( 2652 "SomeArrayOfSomeType a = {\n" 2653 " {{1, 2, 3}},\n" 2654 " {{1, 2, 3}},\n" 2655 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2656 " 333333333333333333333333333333}},\n" 2657 " {{1, 2, 3}},\n" 2658 " {{1, 2, 3}}};"); 2659 2660 verifyFormat("struct {\n" 2661 " unsigned bit;\n" 2662 " const char *const name;\n" 2663 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2664 " {kOsWin, \"Windows\"},\n" 2665 " {kOsLinux, \"Linux\"},\n" 2666 " {kOsCrOS, \"Chrome OS\"}};"); 2667 verifyFormat("struct {\n" 2668 " unsigned bit;\n" 2669 " const char *const name;\n" 2670 "} kBitsToOs[] = {\n" 2671 " {kOsMac, \"Mac\"},\n" 2672 " {kOsWin, \"Windows\"},\n" 2673 " {kOsLinux, \"Linux\"},\n" 2674 " {kOsCrOS, \"Chrome OS\"},\n" 2675 "};"); 2676 } 2677 2678 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2679 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2680 " \\\n" 2681 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2682 } 2683 2684 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2685 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2686 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2687 2688 // Do break defaulted and deleted functions. 2689 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2690 " default;", 2691 getLLVMStyleWithColumns(40)); 2692 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2693 " delete;", 2694 getLLVMStyleWithColumns(40)); 2695 } 2696 2697 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2698 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2699 getLLVMStyleWithColumns(40)); 2700 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2701 getLLVMStyleWithColumns(40)); 2702 EXPECT_EQ("#define Q \\\n" 2703 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2704 " \"aaaaaaaa.cpp\"", 2705 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2706 getLLVMStyleWithColumns(40))); 2707 } 2708 2709 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2710 EXPECT_EQ("# 123 \"A string literal\"", 2711 format(" # 123 \"A string literal\"")); 2712 } 2713 2714 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2715 EXPECT_EQ("#;", format("#;")); 2716 verifyFormat("#\n;\n;\n;"); 2717 } 2718 2719 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2720 EXPECT_EQ("#line 42 \"test\"\n", 2721 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2722 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2723 getLLVMStyleWithColumns(12))); 2724 } 2725 2726 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2727 EXPECT_EQ("#line 42 \"test\"", 2728 format("# \\\n line \\\n 42 \\\n \"test\"")); 2729 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2730 } 2731 2732 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2733 verifyFormat("#define A \\x20"); 2734 verifyFormat("#define A \\ x20"); 2735 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2736 verifyFormat("#define A ''"); 2737 verifyFormat("#define A ''qqq"); 2738 verifyFormat("#define A `qqq"); 2739 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2740 EXPECT_EQ("const char *c = STRINGIFY(\n" 2741 "\\na : b);", 2742 format("const char * c = STRINGIFY(\n" 2743 "\\na : b);")); 2744 2745 verifyFormat("a\r\\"); 2746 verifyFormat("a\v\\"); 2747 verifyFormat("a\f\\"); 2748 } 2749 2750 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2751 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2752 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2753 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2754 // FIXME: We never break before the macro name. 2755 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2756 2757 verifyFormat("#define A A\n#define A A"); 2758 verifyFormat("#define A(X) A\n#define A A"); 2759 2760 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2761 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2762 } 2763 2764 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2765 EXPECT_EQ("// somecomment\n" 2766 "#include \"a.h\"\n" 2767 "#define A( \\\n" 2768 " A, B)\n" 2769 "#include \"b.h\"\n" 2770 "// somecomment\n", 2771 format(" // somecomment\n" 2772 " #include \"a.h\"\n" 2773 "#define A(A,\\\n" 2774 " B)\n" 2775 " #include \"b.h\"\n" 2776 " // somecomment\n", 2777 getLLVMStyleWithColumns(13))); 2778 } 2779 2780 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2781 2782 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2783 EXPECT_EQ("#define A \\\n" 2784 " c; \\\n" 2785 " e;\n" 2786 "f;", 2787 format("#define A c; e;\n" 2788 "f;", 2789 getLLVMStyleWithColumns(14))); 2790 } 2791 2792 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2793 2794 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2795 EXPECT_EQ("int x,\n" 2796 "#define A\n" 2797 " y;", 2798 format("int x,\n#define A\ny;")); 2799 } 2800 2801 TEST_F(FormatTest, HashInMacroDefinition) { 2802 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2803 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2804 verifyFormat("#define A \\\n" 2805 " { \\\n" 2806 " f(#c); \\\n" 2807 " }", 2808 getLLVMStyleWithColumns(11)); 2809 2810 verifyFormat("#define A(X) \\\n" 2811 " void function##X()", 2812 getLLVMStyleWithColumns(22)); 2813 2814 verifyFormat("#define A(a, b, c) \\\n" 2815 " void a##b##c()", 2816 getLLVMStyleWithColumns(22)); 2817 2818 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2819 } 2820 2821 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2822 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2823 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2824 2825 FormatStyle Style = getLLVMStyle(); 2826 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2827 verifyFormat("#define true ((foo)1)", Style); 2828 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2829 verifyFormat("#define false((foo)0)", Style); 2830 } 2831 2832 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2833 EXPECT_EQ("#define A b;", format("#define A \\\n" 2834 " \\\n" 2835 " b;", 2836 getLLVMStyleWithColumns(25))); 2837 EXPECT_EQ("#define A \\\n" 2838 " \\\n" 2839 " a; \\\n" 2840 " b;", 2841 format("#define A \\\n" 2842 " \\\n" 2843 " a; \\\n" 2844 " b;", 2845 getLLVMStyleWithColumns(11))); 2846 EXPECT_EQ("#define A \\\n" 2847 " a; \\\n" 2848 " \\\n" 2849 " b;", 2850 format("#define A \\\n" 2851 " a; \\\n" 2852 " \\\n" 2853 " b;", 2854 getLLVMStyleWithColumns(11))); 2855 } 2856 2857 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2858 verifyIncompleteFormat("#define A :"); 2859 verifyFormat("#define SOMECASES \\\n" 2860 " case 1: \\\n" 2861 " case 2\n", 2862 getLLVMStyleWithColumns(20)); 2863 verifyFormat("#define MACRO(a) \\\n" 2864 " if (a) \\\n" 2865 " f(); \\\n" 2866 " else \\\n" 2867 " g()", 2868 getLLVMStyleWithColumns(18)); 2869 verifyFormat("#define A template <typename T>"); 2870 verifyIncompleteFormat("#define STR(x) #x\n" 2871 "f(STR(this_is_a_string_literal{));"); 2872 verifyFormat("#pragma omp threadprivate( \\\n" 2873 " y)), // expected-warning", 2874 getLLVMStyleWithColumns(28)); 2875 verifyFormat("#d, = };"); 2876 verifyFormat("#if \"a"); 2877 verifyIncompleteFormat("({\n" 2878 "#define b \\\n" 2879 " } \\\n" 2880 " a\n" 2881 "a", 2882 getLLVMStyleWithColumns(15)); 2883 verifyFormat("#define A \\\n" 2884 " { \\\n" 2885 " {\n" 2886 "#define B \\\n" 2887 " } \\\n" 2888 " }", 2889 getLLVMStyleWithColumns(15)); 2890 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 2891 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 2892 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 2893 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 2894 } 2895 2896 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 2897 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 2898 EXPECT_EQ("class A : public QObject {\n" 2899 " Q_OBJECT\n" 2900 "\n" 2901 " A() {}\n" 2902 "};", 2903 format("class A : public QObject {\n" 2904 " Q_OBJECT\n" 2905 "\n" 2906 " A() {\n}\n" 2907 "} ;")); 2908 EXPECT_EQ("MACRO\n" 2909 "/*static*/ int i;", 2910 format("MACRO\n" 2911 " /*static*/ int i;")); 2912 EXPECT_EQ("SOME_MACRO\n" 2913 "namespace {\n" 2914 "void f();\n" 2915 "} // namespace", 2916 format("SOME_MACRO\n" 2917 " namespace {\n" 2918 "void f( );\n" 2919 "} // namespace")); 2920 // Only if the identifier contains at least 5 characters. 2921 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 2922 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 2923 // Only if everything is upper case. 2924 EXPECT_EQ("class A : public QObject {\n" 2925 " Q_Object A() {}\n" 2926 "};", 2927 format("class A : public QObject {\n" 2928 " Q_Object\n" 2929 " A() {\n}\n" 2930 "} ;")); 2931 2932 // Only if the next line can actually start an unwrapped line. 2933 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 2934 format("SOME_WEIRD_LOG_MACRO\n" 2935 "<< SomeThing;")); 2936 2937 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 2938 "(n, buffers))\n", 2939 getChromiumStyle(FormatStyle::LK_Cpp)); 2940 2941 // See PR41483 2942 EXPECT_EQ("/**/ FOO(a)\n" 2943 "FOO(b)", 2944 format("/**/ FOO(a)\n" 2945 "FOO(b)")); 2946 } 2947 2948 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 2949 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2950 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2951 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2952 "class X {};\n" 2953 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2954 "int *createScopDetectionPass() { return 0; }", 2955 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2956 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2957 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2958 " class X {};\n" 2959 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2960 " int *createScopDetectionPass() { return 0; }")); 2961 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 2962 // braces, so that inner block is indented one level more. 2963 EXPECT_EQ("int q() {\n" 2964 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2965 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2966 " IPC_END_MESSAGE_MAP()\n" 2967 "}", 2968 format("int q() {\n" 2969 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2970 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2971 " IPC_END_MESSAGE_MAP()\n" 2972 "}")); 2973 2974 // Same inside macros. 2975 EXPECT_EQ("#define LIST(L) \\\n" 2976 " L(A) \\\n" 2977 " L(B) \\\n" 2978 " L(C)", 2979 format("#define LIST(L) \\\n" 2980 " L(A) \\\n" 2981 " L(B) \\\n" 2982 " L(C)", 2983 getGoogleStyle())); 2984 2985 // These must not be recognized as macros. 2986 EXPECT_EQ("int q() {\n" 2987 " f(x);\n" 2988 " f(x) {}\n" 2989 " f(x)->g();\n" 2990 " f(x)->*g();\n" 2991 " f(x).g();\n" 2992 " f(x) = x;\n" 2993 " f(x) += x;\n" 2994 " f(x) -= x;\n" 2995 " f(x) *= x;\n" 2996 " f(x) /= x;\n" 2997 " f(x) %= x;\n" 2998 " f(x) &= x;\n" 2999 " f(x) |= x;\n" 3000 " f(x) ^= x;\n" 3001 " f(x) >>= x;\n" 3002 " f(x) <<= x;\n" 3003 " f(x)[y].z();\n" 3004 " LOG(INFO) << x;\n" 3005 " ifstream(x) >> x;\n" 3006 "}\n", 3007 format("int q() {\n" 3008 " f(x)\n;\n" 3009 " f(x)\n {}\n" 3010 " f(x)\n->g();\n" 3011 " f(x)\n->*g();\n" 3012 " f(x)\n.g();\n" 3013 " f(x)\n = x;\n" 3014 " f(x)\n += x;\n" 3015 " f(x)\n -= x;\n" 3016 " f(x)\n *= x;\n" 3017 " f(x)\n /= x;\n" 3018 " f(x)\n %= x;\n" 3019 " f(x)\n &= x;\n" 3020 " f(x)\n |= x;\n" 3021 " f(x)\n ^= x;\n" 3022 " f(x)\n >>= x;\n" 3023 " f(x)\n <<= x;\n" 3024 " f(x)\n[y].z();\n" 3025 " LOG(INFO)\n << x;\n" 3026 " ifstream(x)\n >> x;\n" 3027 "}\n")); 3028 EXPECT_EQ("int q() {\n" 3029 " F(x)\n" 3030 " if (1) {\n" 3031 " }\n" 3032 " F(x)\n" 3033 " while (1) {\n" 3034 " }\n" 3035 " F(x)\n" 3036 " G(x);\n" 3037 " F(x)\n" 3038 " try {\n" 3039 " Q();\n" 3040 " } catch (...) {\n" 3041 " }\n" 3042 "}\n", 3043 format("int q() {\n" 3044 "F(x)\n" 3045 "if (1) {}\n" 3046 "F(x)\n" 3047 "while (1) {}\n" 3048 "F(x)\n" 3049 "G(x);\n" 3050 "F(x)\n" 3051 "try { Q(); } catch (...) {}\n" 3052 "}\n")); 3053 EXPECT_EQ("class A {\n" 3054 " A() : t(0) {}\n" 3055 " A(int i) noexcept() : {}\n" 3056 " A(X x)\n" // FIXME: function-level try blocks are broken. 3057 " try : t(0) {\n" 3058 " } catch (...) {\n" 3059 " }\n" 3060 "};", 3061 format("class A {\n" 3062 " A()\n : t(0) {}\n" 3063 " A(int i)\n noexcept() : {}\n" 3064 " A(X x)\n" 3065 " try : t(0) {} catch (...) {}\n" 3066 "};")); 3067 FormatStyle Style = getLLVMStyle(); 3068 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3069 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3070 Style.BraceWrapping.AfterFunction = true; 3071 EXPECT_EQ("void f()\n" 3072 "try\n" 3073 "{\n" 3074 "}", 3075 format("void f() try {\n" 3076 "}", 3077 Style)); 3078 EXPECT_EQ("class SomeClass {\n" 3079 "public:\n" 3080 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3081 "};", 3082 format("class SomeClass {\n" 3083 "public:\n" 3084 " SomeClass()\n" 3085 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3086 "};")); 3087 EXPECT_EQ("class SomeClass {\n" 3088 "public:\n" 3089 " SomeClass()\n" 3090 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3091 "};", 3092 format("class SomeClass {\n" 3093 "public:\n" 3094 " SomeClass()\n" 3095 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3096 "};", 3097 getLLVMStyleWithColumns(40))); 3098 3099 verifyFormat("MACRO(>)"); 3100 3101 // Some macros contain an implicit semicolon. 3102 Style = getLLVMStyle(); 3103 Style.StatementMacros.push_back("FOO"); 3104 verifyFormat("FOO(a) int b = 0;"); 3105 verifyFormat("FOO(a)\n" 3106 "int b = 0;", 3107 Style); 3108 verifyFormat("FOO(a);\n" 3109 "int b = 0;", 3110 Style); 3111 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3112 "int b = 0;", 3113 Style); 3114 verifyFormat("FOO()\n" 3115 "int b = 0;", 3116 Style); 3117 verifyFormat("FOO\n" 3118 "int b = 0;", 3119 Style); 3120 verifyFormat("void f() {\n" 3121 " FOO(a)\n" 3122 " return a;\n" 3123 "}", 3124 Style); 3125 verifyFormat("FOO(a)\n" 3126 "FOO(b)", 3127 Style); 3128 verifyFormat("int a = 0;\n" 3129 "FOO(b)\n" 3130 "int c = 0;", 3131 Style); 3132 verifyFormat("int a = 0;\n" 3133 "int x = FOO(a)\n" 3134 "int b = 0;", 3135 Style); 3136 verifyFormat("void foo(int a) { FOO(a) }\n" 3137 "uint32_t bar() {}", 3138 Style); 3139 } 3140 3141 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3142 verifyFormat("#define A \\\n" 3143 " f({ \\\n" 3144 " g(); \\\n" 3145 " });", 3146 getLLVMStyleWithColumns(11)); 3147 } 3148 3149 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3150 FormatStyle Style = getLLVMStyle(); 3151 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3152 Style.ColumnLimit = 40; 3153 verifyFormat("#ifdef _WIN32\n" 3154 "#define A 0\n" 3155 "#ifdef VAR2\n" 3156 "#define B 1\n" 3157 "#include <someheader.h>\n" 3158 "#define MACRO \\\n" 3159 " some_very_long_func_aaaaaaaaaa();\n" 3160 "#endif\n" 3161 "#else\n" 3162 "#define A 1\n" 3163 "#endif", 3164 Style); 3165 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3166 verifyFormat("#ifdef _WIN32\n" 3167 "# define A 0\n" 3168 "# ifdef VAR2\n" 3169 "# define B 1\n" 3170 "# include <someheader.h>\n" 3171 "# define MACRO \\\n" 3172 " some_very_long_func_aaaaaaaaaa();\n" 3173 "# endif\n" 3174 "#else\n" 3175 "# define A 1\n" 3176 "#endif", 3177 Style); 3178 verifyFormat("#if A\n" 3179 "# define MACRO \\\n" 3180 " void a(int x) { \\\n" 3181 " b(); \\\n" 3182 " c(); \\\n" 3183 " d(); \\\n" 3184 " e(); \\\n" 3185 " f(); \\\n" 3186 " }\n" 3187 "#endif", 3188 Style); 3189 // Comments before include guard. 3190 verifyFormat("// file comment\n" 3191 "// file comment\n" 3192 "#ifndef HEADER_H\n" 3193 "#define HEADER_H\n" 3194 "code();\n" 3195 "#endif", 3196 Style); 3197 // Test with include guards. 3198 verifyFormat("#ifndef HEADER_H\n" 3199 "#define HEADER_H\n" 3200 "code();\n" 3201 "#endif", 3202 Style); 3203 // Include guards must have a #define with the same variable immediately 3204 // after #ifndef. 3205 verifyFormat("#ifndef NOT_GUARD\n" 3206 "# define FOO\n" 3207 "code();\n" 3208 "#endif", 3209 Style); 3210 3211 // Include guards must cover the entire file. 3212 verifyFormat("code();\n" 3213 "code();\n" 3214 "#ifndef NOT_GUARD\n" 3215 "# define NOT_GUARD\n" 3216 "code();\n" 3217 "#endif", 3218 Style); 3219 verifyFormat("#ifndef NOT_GUARD\n" 3220 "# define NOT_GUARD\n" 3221 "code();\n" 3222 "#endif\n" 3223 "code();", 3224 Style); 3225 // Test with trailing blank lines. 3226 verifyFormat("#ifndef HEADER_H\n" 3227 "#define HEADER_H\n" 3228 "code();\n" 3229 "#endif\n", 3230 Style); 3231 // Include guards don't have #else. 3232 verifyFormat("#ifndef NOT_GUARD\n" 3233 "# define NOT_GUARD\n" 3234 "code();\n" 3235 "#else\n" 3236 "#endif", 3237 Style); 3238 verifyFormat("#ifndef NOT_GUARD\n" 3239 "# define NOT_GUARD\n" 3240 "code();\n" 3241 "#elif FOO\n" 3242 "#endif", 3243 Style); 3244 // Non-identifier #define after potential include guard. 3245 verifyFormat("#ifndef FOO\n" 3246 "# define 1\n" 3247 "#endif\n", 3248 Style); 3249 // #if closes past last non-preprocessor line. 3250 verifyFormat("#ifndef FOO\n" 3251 "#define FOO\n" 3252 "#if 1\n" 3253 "int i;\n" 3254 "# define A 0\n" 3255 "#endif\n" 3256 "#endif\n", 3257 Style); 3258 // Don't crash if there is an #elif directive without a condition. 3259 verifyFormat("#if 1\n" 3260 "int x;\n" 3261 "#elif\n" 3262 "int y;\n" 3263 "#else\n" 3264 "int z;\n" 3265 "#endif", 3266 Style); 3267 // FIXME: This doesn't handle the case where there's code between the 3268 // #ifndef and #define but all other conditions hold. This is because when 3269 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3270 // previous code line yet, so we can't detect it. 3271 EXPECT_EQ("#ifndef NOT_GUARD\n" 3272 "code();\n" 3273 "#define NOT_GUARD\n" 3274 "code();\n" 3275 "#endif", 3276 format("#ifndef NOT_GUARD\n" 3277 "code();\n" 3278 "# define NOT_GUARD\n" 3279 "code();\n" 3280 "#endif", 3281 Style)); 3282 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3283 // be outside an include guard. Examples are #pragma once and 3284 // #pragma GCC diagnostic, or anything else that does not change the meaning 3285 // of the file if it's included multiple times. 3286 EXPECT_EQ("#ifdef WIN32\n" 3287 "# pragma once\n" 3288 "#endif\n" 3289 "#ifndef HEADER_H\n" 3290 "# define HEADER_H\n" 3291 "code();\n" 3292 "#endif", 3293 format("#ifdef WIN32\n" 3294 "# pragma once\n" 3295 "#endif\n" 3296 "#ifndef HEADER_H\n" 3297 "#define HEADER_H\n" 3298 "code();\n" 3299 "#endif", 3300 Style)); 3301 // FIXME: This does not detect when there is a single non-preprocessor line 3302 // in front of an include-guard-like structure where other conditions hold 3303 // because ScopedLineState hides the line. 3304 EXPECT_EQ("code();\n" 3305 "#ifndef HEADER_H\n" 3306 "#define HEADER_H\n" 3307 "code();\n" 3308 "#endif", 3309 format("code();\n" 3310 "#ifndef HEADER_H\n" 3311 "# define HEADER_H\n" 3312 "code();\n" 3313 "#endif", 3314 Style)); 3315 // Keep comments aligned with #, otherwise indent comments normally. These 3316 // tests cannot use verifyFormat because messUp manipulates leading 3317 // whitespace. 3318 { 3319 const char *Expected = "" 3320 "void f() {\n" 3321 "#if 1\n" 3322 "// Preprocessor aligned.\n" 3323 "# define A 0\n" 3324 " // Code. Separated by blank line.\n" 3325 "\n" 3326 "# define B 0\n" 3327 " // Code. Not aligned with #\n" 3328 "# define C 0\n" 3329 "#endif"; 3330 const char *ToFormat = "" 3331 "void f() {\n" 3332 "#if 1\n" 3333 "// Preprocessor aligned.\n" 3334 "# define A 0\n" 3335 "// Code. Separated by blank line.\n" 3336 "\n" 3337 "# define B 0\n" 3338 " // Code. Not aligned with #\n" 3339 "# define C 0\n" 3340 "#endif"; 3341 EXPECT_EQ(Expected, format(ToFormat, Style)); 3342 EXPECT_EQ(Expected, format(Expected, Style)); 3343 } 3344 // Keep block quotes aligned. 3345 { 3346 const char *Expected = "" 3347 "void f() {\n" 3348 "#if 1\n" 3349 "/* Preprocessor aligned. */\n" 3350 "# define A 0\n" 3351 " /* Code. Separated by blank line. */\n" 3352 "\n" 3353 "# define B 0\n" 3354 " /* Code. Not aligned with # */\n" 3355 "# define C 0\n" 3356 "#endif"; 3357 const char *ToFormat = "" 3358 "void f() {\n" 3359 "#if 1\n" 3360 "/* Preprocessor aligned. */\n" 3361 "# define A 0\n" 3362 "/* Code. Separated by blank line. */\n" 3363 "\n" 3364 "# define B 0\n" 3365 " /* Code. Not aligned with # */\n" 3366 "# define C 0\n" 3367 "#endif"; 3368 EXPECT_EQ(Expected, format(ToFormat, Style)); 3369 EXPECT_EQ(Expected, format(Expected, Style)); 3370 } 3371 // Keep comments aligned with un-indented directives. 3372 { 3373 const char *Expected = "" 3374 "void f() {\n" 3375 "// Preprocessor aligned.\n" 3376 "#define A 0\n" 3377 " // Code. Separated by blank line.\n" 3378 "\n" 3379 "#define B 0\n" 3380 " // Code. Not aligned with #\n" 3381 "#define C 0\n"; 3382 const char *ToFormat = "" 3383 "void f() {\n" 3384 "// Preprocessor aligned.\n" 3385 "#define A 0\n" 3386 "// Code. Separated by blank line.\n" 3387 "\n" 3388 "#define B 0\n" 3389 " // Code. Not aligned with #\n" 3390 "#define C 0\n"; 3391 EXPECT_EQ(Expected, format(ToFormat, Style)); 3392 EXPECT_EQ(Expected, format(Expected, Style)); 3393 } 3394 // Test AfterHash with tabs. 3395 { 3396 FormatStyle Tabbed = Style; 3397 Tabbed.UseTab = FormatStyle::UT_Always; 3398 Tabbed.IndentWidth = 8; 3399 Tabbed.TabWidth = 8; 3400 verifyFormat("#ifdef _WIN32\n" 3401 "#\tdefine A 0\n" 3402 "#\tifdef VAR2\n" 3403 "#\t\tdefine B 1\n" 3404 "#\t\tinclude <someheader.h>\n" 3405 "#\t\tdefine MACRO \\\n" 3406 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3407 "#\tendif\n" 3408 "#else\n" 3409 "#\tdefine A 1\n" 3410 "#endif", 3411 Tabbed); 3412 } 3413 3414 // Regression test: Multiline-macro inside include guards. 3415 verifyFormat("#ifndef HEADER_H\n" 3416 "#define HEADER_H\n" 3417 "#define A() \\\n" 3418 " int i; \\\n" 3419 " int j;\n" 3420 "#endif // HEADER_H", 3421 getLLVMStyleWithColumns(20)); 3422 3423 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3424 // Basic before hash indent tests 3425 verifyFormat("#ifdef _WIN32\n" 3426 " #define A 0\n" 3427 " #ifdef VAR2\n" 3428 " #define B 1\n" 3429 " #include <someheader.h>\n" 3430 " #define MACRO \\\n" 3431 " some_very_long_func_aaaaaaaaaa();\n" 3432 " #endif\n" 3433 "#else\n" 3434 " #define A 1\n" 3435 "#endif", 3436 Style); 3437 verifyFormat("#if A\n" 3438 " #define MACRO \\\n" 3439 " void a(int x) { \\\n" 3440 " b(); \\\n" 3441 " c(); \\\n" 3442 " d(); \\\n" 3443 " e(); \\\n" 3444 " f(); \\\n" 3445 " }\n" 3446 "#endif", 3447 Style); 3448 // Keep comments aligned with indented directives. These 3449 // tests cannot use verifyFormat because messUp manipulates leading 3450 // whitespace. 3451 { 3452 const char *Expected = "void f() {\n" 3453 "// Aligned to preprocessor.\n" 3454 "#if 1\n" 3455 " // Aligned to code.\n" 3456 " int a;\n" 3457 " #if 1\n" 3458 " // Aligned to preprocessor.\n" 3459 " #define A 0\n" 3460 " // Aligned to code.\n" 3461 " int b;\n" 3462 " #endif\n" 3463 "#endif\n" 3464 "}"; 3465 const char *ToFormat = "void f() {\n" 3466 "// Aligned to preprocessor.\n" 3467 "#if 1\n" 3468 "// Aligned to code.\n" 3469 "int a;\n" 3470 "#if 1\n" 3471 "// Aligned to preprocessor.\n" 3472 "#define A 0\n" 3473 "// Aligned to code.\n" 3474 "int b;\n" 3475 "#endif\n" 3476 "#endif\n" 3477 "}"; 3478 EXPECT_EQ(Expected, format(ToFormat, Style)); 3479 EXPECT_EQ(Expected, format(Expected, Style)); 3480 } 3481 { 3482 const char *Expected = "void f() {\n" 3483 "/* Aligned to preprocessor. */\n" 3484 "#if 1\n" 3485 " /* Aligned to code. */\n" 3486 " int a;\n" 3487 " #if 1\n" 3488 " /* Aligned to preprocessor. */\n" 3489 " #define A 0\n" 3490 " /* Aligned to code. */\n" 3491 " int b;\n" 3492 " #endif\n" 3493 "#endif\n" 3494 "}"; 3495 const char *ToFormat = "void f() {\n" 3496 "/* Aligned to preprocessor. */\n" 3497 "#if 1\n" 3498 "/* Aligned to code. */\n" 3499 "int a;\n" 3500 "#if 1\n" 3501 "/* Aligned to preprocessor. */\n" 3502 "#define A 0\n" 3503 "/* Aligned to code. */\n" 3504 "int b;\n" 3505 "#endif\n" 3506 "#endif\n" 3507 "}"; 3508 EXPECT_EQ(Expected, format(ToFormat, Style)); 3509 EXPECT_EQ(Expected, format(Expected, Style)); 3510 } 3511 3512 // Test single comment before preprocessor 3513 verifyFormat("// Comment\n" 3514 "\n" 3515 "#if 1\n" 3516 "#endif", 3517 Style); 3518 } 3519 3520 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3521 verifyFormat("{\n { a #c; }\n}"); 3522 } 3523 3524 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3525 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3526 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3527 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3528 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3529 } 3530 3531 TEST_F(FormatTest, EscapedNewlines) { 3532 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3533 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3534 format("#define A \\\nint i;\\\n int j;", Narrow)); 3535 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3536 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3537 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3538 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3539 3540 FormatStyle AlignLeft = getLLVMStyle(); 3541 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3542 EXPECT_EQ("#define MACRO(x) \\\n" 3543 "private: \\\n" 3544 " int x(int a);\n", 3545 format("#define MACRO(x) \\\n" 3546 "private: \\\n" 3547 " int x(int a);\n", 3548 AlignLeft)); 3549 3550 // CRLF line endings 3551 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3552 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3553 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3554 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3555 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3556 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3557 EXPECT_EQ("#define MACRO(x) \\\r\n" 3558 "private: \\\r\n" 3559 " int x(int a);\r\n", 3560 format("#define MACRO(x) \\\r\n" 3561 "private: \\\r\n" 3562 " int x(int a);\r\n", 3563 AlignLeft)); 3564 3565 FormatStyle DontAlign = getLLVMStyle(); 3566 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3567 DontAlign.MaxEmptyLinesToKeep = 3; 3568 // FIXME: can't use verifyFormat here because the newline before 3569 // "public:" is not inserted the first time it's reformatted 3570 EXPECT_EQ("#define A \\\n" 3571 " class Foo { \\\n" 3572 " void bar(); \\\n" 3573 "\\\n" 3574 "\\\n" 3575 "\\\n" 3576 " public: \\\n" 3577 " void baz(); \\\n" 3578 " };", 3579 format("#define A \\\n" 3580 " class Foo { \\\n" 3581 " void bar(); \\\n" 3582 "\\\n" 3583 "\\\n" 3584 "\\\n" 3585 " public: \\\n" 3586 " void baz(); \\\n" 3587 " };", 3588 DontAlign)); 3589 } 3590 3591 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3592 verifyFormat("#define A \\\n" 3593 " int v( \\\n" 3594 " a); \\\n" 3595 " int i;", 3596 getLLVMStyleWithColumns(11)); 3597 } 3598 3599 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3600 EXPECT_EQ( 3601 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3602 " \\\n" 3603 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3604 "\n" 3605 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3606 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3607 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3608 "\\\n" 3609 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3610 " \n" 3611 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3612 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3613 } 3614 3615 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3616 EXPECT_EQ("int\n" 3617 "#define A\n" 3618 " a;", 3619 format("int\n#define A\na;")); 3620 verifyFormat("functionCallTo(\n" 3621 " someOtherFunction(\n" 3622 " withSomeParameters, whichInSequence,\n" 3623 " areLongerThanALine(andAnotherCall,\n" 3624 "#define A B\n" 3625 " withMoreParamters,\n" 3626 " whichStronglyInfluenceTheLayout),\n" 3627 " andMoreParameters),\n" 3628 " trailing);", 3629 getLLVMStyleWithColumns(69)); 3630 verifyFormat("Foo::Foo()\n" 3631 "#ifdef BAR\n" 3632 " : baz(0)\n" 3633 "#endif\n" 3634 "{\n" 3635 "}"); 3636 verifyFormat("void f() {\n" 3637 " if (true)\n" 3638 "#ifdef A\n" 3639 " f(42);\n" 3640 " x();\n" 3641 "#else\n" 3642 " g();\n" 3643 " x();\n" 3644 "#endif\n" 3645 "}"); 3646 verifyFormat("void f(param1, param2,\n" 3647 " param3,\n" 3648 "#ifdef A\n" 3649 " param4(param5,\n" 3650 "#ifdef A1\n" 3651 " param6,\n" 3652 "#ifdef A2\n" 3653 " param7),\n" 3654 "#else\n" 3655 " param8),\n" 3656 " param9,\n" 3657 "#endif\n" 3658 " param10,\n" 3659 "#endif\n" 3660 " param11)\n" 3661 "#else\n" 3662 " param12)\n" 3663 "#endif\n" 3664 "{\n" 3665 " x();\n" 3666 "}", 3667 getLLVMStyleWithColumns(28)); 3668 verifyFormat("#if 1\n" 3669 "int i;"); 3670 verifyFormat("#if 1\n" 3671 "#endif\n" 3672 "#if 1\n" 3673 "#else\n" 3674 "#endif\n"); 3675 verifyFormat("DEBUG({\n" 3676 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3677 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3678 "});\n" 3679 "#if a\n" 3680 "#else\n" 3681 "#endif"); 3682 3683 verifyIncompleteFormat("void f(\n" 3684 "#if A\n" 3685 ");\n" 3686 "#else\n" 3687 "#endif"); 3688 } 3689 3690 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3691 verifyFormat("#endif\n" 3692 "#if B"); 3693 } 3694 3695 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3696 FormatStyle SingleLine = getLLVMStyle(); 3697 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3698 verifyFormat("#if 0\n" 3699 "#elif 1\n" 3700 "#endif\n" 3701 "void foo() {\n" 3702 " if (test) foo2();\n" 3703 "}", 3704 SingleLine); 3705 } 3706 3707 TEST_F(FormatTest, LayoutBlockInsideParens) { 3708 verifyFormat("functionCall({ int i; });"); 3709 verifyFormat("functionCall({\n" 3710 " int i;\n" 3711 " int j;\n" 3712 "});"); 3713 verifyFormat("functionCall(\n" 3714 " {\n" 3715 " int i;\n" 3716 " int j;\n" 3717 " },\n" 3718 " aaaa, bbbb, cccc);"); 3719 verifyFormat("functionA(functionB({\n" 3720 " int i;\n" 3721 " int j;\n" 3722 " }),\n" 3723 " aaaa, bbbb, cccc);"); 3724 verifyFormat("functionCall(\n" 3725 " {\n" 3726 " int i;\n" 3727 " int j;\n" 3728 " },\n" 3729 " aaaa, bbbb, // comment\n" 3730 " cccc);"); 3731 verifyFormat("functionA(functionB({\n" 3732 " int i;\n" 3733 " int j;\n" 3734 " }),\n" 3735 " aaaa, bbbb, // comment\n" 3736 " cccc);"); 3737 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3738 verifyFormat("functionCall(aaaa, bbbb, {\n" 3739 " int i;\n" 3740 " int j;\n" 3741 "});"); 3742 verifyFormat( 3743 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3744 " {\n" 3745 " int i; // break\n" 3746 " },\n" 3747 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3748 " ccccccccccccccccc));"); 3749 verifyFormat("DEBUG({\n" 3750 " if (a)\n" 3751 " f();\n" 3752 "});"); 3753 } 3754 3755 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3756 EXPECT_EQ("SOME_MACRO { int i; }\n" 3757 "int i;", 3758 format(" SOME_MACRO {int i;} int i;")); 3759 } 3760 3761 TEST_F(FormatTest, LayoutNestedBlocks) { 3762 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3763 " struct s {\n" 3764 " int i;\n" 3765 " };\n" 3766 " s kBitsToOs[] = {{10}};\n" 3767 " for (int i = 0; i < 10; ++i)\n" 3768 " return;\n" 3769 "}"); 3770 verifyFormat("call(parameter, {\n" 3771 " something();\n" 3772 " // Comment using all columns.\n" 3773 " somethingelse();\n" 3774 "});", 3775 getLLVMStyleWithColumns(40)); 3776 verifyFormat("DEBUG( //\n" 3777 " { f(); }, a);"); 3778 verifyFormat("DEBUG( //\n" 3779 " {\n" 3780 " f(); //\n" 3781 " },\n" 3782 " a);"); 3783 3784 EXPECT_EQ("call(parameter, {\n" 3785 " something();\n" 3786 " // Comment too\n" 3787 " // looooooooooong.\n" 3788 " somethingElse();\n" 3789 "});", 3790 format("call(parameter, {\n" 3791 " something();\n" 3792 " // Comment too looooooooooong.\n" 3793 " somethingElse();\n" 3794 "});", 3795 getLLVMStyleWithColumns(29))); 3796 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3797 EXPECT_EQ("DEBUG({ // comment\n" 3798 " int i;\n" 3799 "});", 3800 format("DEBUG({ // comment\n" 3801 "int i;\n" 3802 "});")); 3803 EXPECT_EQ("DEBUG({\n" 3804 " int i;\n" 3805 "\n" 3806 " // comment\n" 3807 " int j;\n" 3808 "});", 3809 format("DEBUG({\n" 3810 " int i;\n" 3811 "\n" 3812 " // comment\n" 3813 " int j;\n" 3814 "});")); 3815 3816 verifyFormat("DEBUG({\n" 3817 " if (a)\n" 3818 " return;\n" 3819 "});"); 3820 verifyGoogleFormat("DEBUG({\n" 3821 " if (a) return;\n" 3822 "});"); 3823 FormatStyle Style = getGoogleStyle(); 3824 Style.ColumnLimit = 45; 3825 verifyFormat("Debug(\n" 3826 " aaaaa,\n" 3827 " {\n" 3828 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3829 " },\n" 3830 " a);", 3831 Style); 3832 3833 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3834 3835 verifyNoCrash("^{v^{a}}"); 3836 } 3837 3838 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3839 EXPECT_EQ("#define MACRO() \\\n" 3840 " Debug(aaa, /* force line break */ \\\n" 3841 " { \\\n" 3842 " int i; \\\n" 3843 " int j; \\\n" 3844 " })", 3845 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3846 " { int i; int j; })", 3847 getGoogleStyle())); 3848 3849 EXPECT_EQ("#define A \\\n" 3850 " [] { \\\n" 3851 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3852 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3853 " }", 3854 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3855 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3856 getGoogleStyle())); 3857 } 3858 3859 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3860 EXPECT_EQ("{}", format("{}")); 3861 verifyFormat("enum E {};"); 3862 verifyFormat("enum E {}"); 3863 FormatStyle Style = getLLVMStyle(); 3864 Style.SpaceInEmptyBlock = true; 3865 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 3866 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 3867 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 3868 } 3869 3870 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 3871 FormatStyle Style = getLLVMStyle(); 3872 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 3873 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 3874 verifyFormat("FOO_BEGIN\n" 3875 " FOO_ENTRY\n" 3876 "FOO_END", 3877 Style); 3878 verifyFormat("FOO_BEGIN\n" 3879 " NESTED_FOO_BEGIN\n" 3880 " NESTED_FOO_ENTRY\n" 3881 " NESTED_FOO_END\n" 3882 "FOO_END", 3883 Style); 3884 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 3885 " int x;\n" 3886 " x = 1;\n" 3887 "FOO_END(Baz)", 3888 Style); 3889 } 3890 3891 //===----------------------------------------------------------------------===// 3892 // Line break tests. 3893 //===----------------------------------------------------------------------===// 3894 3895 TEST_F(FormatTest, PreventConfusingIndents) { 3896 verifyFormat( 3897 "void f() {\n" 3898 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 3899 " parameter, parameter, parameter)),\n" 3900 " SecondLongCall(parameter));\n" 3901 "}"); 3902 verifyFormat( 3903 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3904 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3905 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3906 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 3907 verifyFormat( 3908 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3909 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 3910 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 3911 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 3912 verifyFormat( 3913 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 3914 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 3915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 3916 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 3917 verifyFormat("int a = bbbb && ccc &&\n" 3918 " fffff(\n" 3919 "#define A Just forcing a new line\n" 3920 " ddd);"); 3921 } 3922 3923 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 3924 verifyFormat( 3925 "bool aaaaaaa =\n" 3926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 3927 " bbbbbbbb();"); 3928 verifyFormat( 3929 "bool aaaaaaa =\n" 3930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 3931 " bbbbbbbb();"); 3932 3933 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 3935 " ccccccccc == ddddddddddd;"); 3936 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3937 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 3938 " ccccccccc == ddddddddddd;"); 3939 verifyFormat( 3940 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 3941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 3942 " ccccccccc == ddddddddddd;"); 3943 3944 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3945 " aaaaaa) &&\n" 3946 " bbbbbb && cccccc;"); 3947 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3948 " aaaaaa) >>\n" 3949 " bbbbbb;"); 3950 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 3951 " SourceMgr.getSpellingColumnNumber(\n" 3952 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 3953 " 1);"); 3954 3955 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3956 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 3957 " cccccc) {\n}"); 3958 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3959 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3960 " cccccc) {\n}"); 3961 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3962 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3963 " cccccc) {\n}"); 3964 verifyFormat("b = a &&\n" 3965 " // Comment\n" 3966 " b.c && d;"); 3967 3968 // If the LHS of a comparison is not a binary expression itself, the 3969 // additional linebreak confuses many people. 3970 verifyFormat( 3971 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 3973 "}"); 3974 verifyFormat( 3975 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3976 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3977 "}"); 3978 verifyFormat( 3979 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 3980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3981 "}"); 3982 verifyFormat( 3983 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 3985 "}"); 3986 // Even explicit parentheses stress the precedence enough to make the 3987 // additional break unnecessary. 3988 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3990 "}"); 3991 // This cases is borderline, but with the indentation it is still readable. 3992 verifyFormat( 3993 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3994 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 3996 "}", 3997 getLLVMStyleWithColumns(75)); 3998 3999 // If the LHS is a binary expression, we should still use the additional break 4000 // as otherwise the formatting hides the operator precedence. 4001 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4003 " 5) {\n" 4004 "}"); 4005 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4007 " 5) {\n" 4008 "}"); 4009 4010 FormatStyle OnePerLine = getLLVMStyle(); 4011 OnePerLine.BinPackParameters = false; 4012 verifyFormat( 4013 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4016 OnePerLine); 4017 4018 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4019 " .aaa(aaaaaaaaaaaaa) *\n" 4020 " aaaaaaa +\n" 4021 " aaaaaaa;", 4022 getLLVMStyleWithColumns(40)); 4023 } 4024 4025 TEST_F(FormatTest, ExpressionIndentation) { 4026 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4030 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4031 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4034 " ccccccccccccccccccccccccccccccccccccccccc;"); 4035 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4036 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4038 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4039 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4040 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4042 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4043 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4046 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4047 verifyFormat("if () {\n" 4048 "} else if (aaaaa && bbbbb > // break\n" 4049 " ccccc) {\n" 4050 "}"); 4051 verifyFormat("if () {\n" 4052 "} else if constexpr (aaaaa && bbbbb > // break\n" 4053 " ccccc) {\n" 4054 "}"); 4055 verifyFormat("if () {\n" 4056 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4057 " ccccc) {\n" 4058 "}"); 4059 verifyFormat("if () {\n" 4060 "} else if (aaaaa &&\n" 4061 " bbbbb > // break\n" 4062 " ccccc &&\n" 4063 " ddddd) {\n" 4064 "}"); 4065 4066 // Presence of a trailing comment used to change indentation of b. 4067 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4068 " b;\n" 4069 "return aaaaaaaaaaaaaaaaaaa +\n" 4070 " b; //", 4071 getLLVMStyleWithColumns(30)); 4072 } 4073 4074 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4075 // Not sure what the best system is here. Like this, the LHS can be found 4076 // immediately above an operator (everything with the same or a higher 4077 // indent). The RHS is aligned right of the operator and so compasses 4078 // everything until something with the same indent as the operator is found. 4079 // FIXME: Is this a good system? 4080 FormatStyle Style = getLLVMStyle(); 4081 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4082 verifyFormat( 4083 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4084 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4085 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4086 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4087 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4088 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4089 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4090 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4091 " > ccccccccccccccccccccccccccccccccccccccccc;", 4092 Style); 4093 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4094 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4095 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4096 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4097 Style); 4098 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4099 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4100 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4101 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4102 Style); 4103 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4104 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4105 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4106 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4107 Style); 4108 verifyFormat("if () {\n" 4109 "} else if (aaaaa\n" 4110 " && bbbbb // break\n" 4111 " > ccccc) {\n" 4112 "}", 4113 Style); 4114 verifyFormat("return (a)\n" 4115 " // comment\n" 4116 " + b;", 4117 Style); 4118 verifyFormat( 4119 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4120 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4121 " + cc;", 4122 Style); 4123 4124 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4125 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4126 Style); 4127 4128 // Forced by comments. 4129 verifyFormat( 4130 "unsigned ContentSize =\n" 4131 " sizeof(int16_t) // DWARF ARange version number\n" 4132 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4133 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4134 " + sizeof(int8_t); // Segment Size (in bytes)"); 4135 4136 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4137 " == boost::fusion::at_c<1>(iiii).second;", 4138 Style); 4139 4140 Style.ColumnLimit = 60; 4141 verifyFormat("zzzzzzzzzz\n" 4142 " = bbbbbbbbbbbbbbbbb\n" 4143 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4144 Style); 4145 4146 Style.ColumnLimit = 80; 4147 Style.IndentWidth = 4; 4148 Style.TabWidth = 4; 4149 Style.UseTab = FormatStyle::UT_Always; 4150 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4151 Style.AlignOperands = false; 4152 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4153 "\t&& (someOtherLongishConditionPart1\n" 4154 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4155 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4156 "(someOtherLongishConditionPart1 || " 4157 "someOtherEvenLongerNestedConditionPart2);", 4158 Style)); 4159 } 4160 4161 TEST_F(FormatTest, EnforcedOperatorWraps) { 4162 // Here we'd like to wrap after the || operators, but a comment is forcing an 4163 // earlier wrap. 4164 verifyFormat("bool x = aaaaa //\n" 4165 " || bbbbb\n" 4166 " //\n" 4167 " || cccc;"); 4168 } 4169 4170 TEST_F(FormatTest, NoOperandAlignment) { 4171 FormatStyle Style = getLLVMStyle(); 4172 Style.AlignOperands = false; 4173 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4176 Style); 4177 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4178 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4179 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4180 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4181 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4182 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4183 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4184 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4185 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4186 " > ccccccccccccccccccccccccccccccccccccccccc;", 4187 Style); 4188 4189 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4190 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4191 " + cc;", 4192 Style); 4193 verifyFormat("int a = aa\n" 4194 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4195 " * cccccccccccccccccccccccccccccccccccc;\n", 4196 Style); 4197 4198 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4199 verifyFormat("return (a > b\n" 4200 " // comment1\n" 4201 " // comment2\n" 4202 " || c);", 4203 Style); 4204 } 4205 4206 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4207 FormatStyle Style = getLLVMStyle(); 4208 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4209 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4211 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4212 Style); 4213 } 4214 4215 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4216 FormatStyle Style = getLLVMStyle(); 4217 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4218 Style.BinPackArguments = false; 4219 Style.ColumnLimit = 40; 4220 verifyFormat("void test() {\n" 4221 " someFunction(\n" 4222 " this + argument + is + quite\n" 4223 " + long + so + it + gets + wrapped\n" 4224 " + but + remains + bin - packed);\n" 4225 "}", 4226 Style); 4227 verifyFormat("void test() {\n" 4228 " someFunction(arg1,\n" 4229 " this + argument + is\n" 4230 " + quite + long + so\n" 4231 " + it + gets + wrapped\n" 4232 " + but + remains + bin\n" 4233 " - packed,\n" 4234 " arg3);\n" 4235 "}", 4236 Style); 4237 verifyFormat("void test() {\n" 4238 " someFunction(\n" 4239 " arg1,\n" 4240 " this + argument + has\n" 4241 " + anotherFunc(nested,\n" 4242 " calls + whose\n" 4243 " + arguments\n" 4244 " + are + also\n" 4245 " + wrapped,\n" 4246 " in + addition)\n" 4247 " + to + being + bin - packed,\n" 4248 " arg3);\n" 4249 "}", 4250 Style); 4251 4252 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4253 verifyFormat("void test() {\n" 4254 " someFunction(\n" 4255 " arg1,\n" 4256 " this + argument + has +\n" 4257 " anotherFunc(nested,\n" 4258 " calls + whose +\n" 4259 " arguments +\n" 4260 " are + also +\n" 4261 " wrapped,\n" 4262 " in + addition) +\n" 4263 " to + being + bin - packed,\n" 4264 " arg3);\n" 4265 "}", 4266 Style); 4267 } 4268 4269 TEST_F(FormatTest, ConstructorInitializers) { 4270 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4271 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4272 getLLVMStyleWithColumns(45)); 4273 verifyFormat("Constructor()\n" 4274 " : Inttializer(FitsOnTheLine) {}", 4275 getLLVMStyleWithColumns(44)); 4276 verifyFormat("Constructor()\n" 4277 " : Inttializer(FitsOnTheLine) {}", 4278 getLLVMStyleWithColumns(43)); 4279 4280 verifyFormat("template <typename T>\n" 4281 "Constructor() : Initializer(FitsOnTheLine) {}", 4282 getLLVMStyleWithColumns(45)); 4283 4284 verifyFormat( 4285 "SomeClass::Constructor()\n" 4286 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4287 4288 verifyFormat( 4289 "SomeClass::Constructor()\n" 4290 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4291 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4292 verifyFormat( 4293 "SomeClass::Constructor()\n" 4294 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4295 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4296 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4297 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4298 " : aaaaaaaaaa(aaaaaa) {}"); 4299 4300 verifyFormat("Constructor()\n" 4301 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4302 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4303 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4304 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4305 4306 verifyFormat("Constructor()\n" 4307 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4308 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4309 4310 verifyFormat("Constructor(int Parameter = 0)\n" 4311 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4312 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4313 verifyFormat("Constructor()\n" 4314 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4315 "}", 4316 getLLVMStyleWithColumns(60)); 4317 verifyFormat("Constructor()\n" 4318 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4319 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4320 4321 // Here a line could be saved by splitting the second initializer onto two 4322 // lines, but that is not desirable. 4323 verifyFormat("Constructor()\n" 4324 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4325 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4326 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4327 4328 FormatStyle OnePerLine = getLLVMStyle(); 4329 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4330 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4331 verifyFormat("SomeClass::Constructor()\n" 4332 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4333 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4334 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4335 OnePerLine); 4336 verifyFormat("SomeClass::Constructor()\n" 4337 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4338 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4339 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4340 OnePerLine); 4341 verifyFormat("MyClass::MyClass(int var)\n" 4342 " : some_var_(var), // 4 space indent\n" 4343 " some_other_var_(var + 1) { // lined up\n" 4344 "}", 4345 OnePerLine); 4346 verifyFormat("Constructor()\n" 4347 " : aaaaa(aaaaaa),\n" 4348 " aaaaa(aaaaaa),\n" 4349 " aaaaa(aaaaaa),\n" 4350 " aaaaa(aaaaaa),\n" 4351 " aaaaa(aaaaaa) {}", 4352 OnePerLine); 4353 verifyFormat("Constructor()\n" 4354 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4355 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4356 OnePerLine); 4357 OnePerLine.BinPackParameters = false; 4358 verifyFormat( 4359 "Constructor()\n" 4360 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4361 " aaaaaaaaaaa().aaa(),\n" 4362 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4363 OnePerLine); 4364 OnePerLine.ColumnLimit = 60; 4365 verifyFormat("Constructor()\n" 4366 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4367 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4368 OnePerLine); 4369 4370 EXPECT_EQ("Constructor()\n" 4371 " : // Comment forcing unwanted break.\n" 4372 " aaaa(aaaa) {}", 4373 format("Constructor() :\n" 4374 " // Comment forcing unwanted break.\n" 4375 " aaaa(aaaa) {}")); 4376 } 4377 4378 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4379 FormatStyle Style = getLLVMStyle(); 4380 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4381 Style.ColumnLimit = 60; 4382 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4383 Style.AllowAllConstructorInitializersOnNextLine = true; 4384 Style.BinPackParameters = false; 4385 4386 for (int i = 0; i < 4; ++i) { 4387 // Test all combinations of parameters that should not have an effect. 4388 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4389 Style.AllowAllArgumentsOnNextLine = i & 2; 4390 4391 Style.AllowAllConstructorInitializersOnNextLine = true; 4392 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4393 verifyFormat("Constructor()\n" 4394 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4395 Style); 4396 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4397 4398 Style.AllowAllConstructorInitializersOnNextLine = false; 4399 verifyFormat("Constructor()\n" 4400 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4401 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4402 Style); 4403 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4404 4405 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4406 Style.AllowAllConstructorInitializersOnNextLine = true; 4407 verifyFormat("Constructor()\n" 4408 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4409 Style); 4410 4411 Style.AllowAllConstructorInitializersOnNextLine = false; 4412 verifyFormat("Constructor()\n" 4413 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4414 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4415 Style); 4416 4417 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4418 Style.AllowAllConstructorInitializersOnNextLine = true; 4419 verifyFormat("Constructor() :\n" 4420 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4421 Style); 4422 4423 Style.AllowAllConstructorInitializersOnNextLine = false; 4424 verifyFormat("Constructor() :\n" 4425 " aaaaaaaaaaaaaaaaaa(a),\n" 4426 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4427 Style); 4428 } 4429 4430 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4431 // AllowAllConstructorInitializersOnNextLine in all 4432 // BreakConstructorInitializers modes 4433 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4434 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4435 Style.AllowAllConstructorInitializersOnNextLine = false; 4436 verifyFormat("SomeClassWithALongName::Constructor(\n" 4437 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4438 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4439 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4440 Style); 4441 4442 Style.AllowAllConstructorInitializersOnNextLine = true; 4443 verifyFormat("SomeClassWithALongName::Constructor(\n" 4444 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4445 " int bbbbbbbbbbbbb,\n" 4446 " int cccccccccccccccc)\n" 4447 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4448 Style); 4449 4450 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4451 Style.AllowAllConstructorInitializersOnNextLine = false; 4452 verifyFormat("SomeClassWithALongName::Constructor(\n" 4453 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4454 " int bbbbbbbbbbbbb)\n" 4455 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4456 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4457 Style); 4458 4459 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4460 4461 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4462 verifyFormat("SomeClassWithALongName::Constructor(\n" 4463 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4464 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4465 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4466 Style); 4467 4468 Style.AllowAllConstructorInitializersOnNextLine = true; 4469 verifyFormat("SomeClassWithALongName::Constructor(\n" 4470 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4471 " int bbbbbbbbbbbbb,\n" 4472 " int cccccccccccccccc)\n" 4473 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4474 Style); 4475 4476 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4477 Style.AllowAllConstructorInitializersOnNextLine = false; 4478 verifyFormat("SomeClassWithALongName::Constructor(\n" 4479 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4480 " int bbbbbbbbbbbbb)\n" 4481 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4482 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4483 Style); 4484 4485 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4486 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4487 verifyFormat("SomeClassWithALongName::Constructor(\n" 4488 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4489 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4490 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4491 Style); 4492 4493 Style.AllowAllConstructorInitializersOnNextLine = true; 4494 verifyFormat("SomeClassWithALongName::Constructor(\n" 4495 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4496 " int bbbbbbbbbbbbb,\n" 4497 " int cccccccccccccccc) :\n" 4498 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4499 Style); 4500 4501 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4502 Style.AllowAllConstructorInitializersOnNextLine = false; 4503 verifyFormat("SomeClassWithALongName::Constructor(\n" 4504 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4505 " int bbbbbbbbbbbbb) :\n" 4506 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4507 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4508 Style); 4509 } 4510 4511 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4512 FormatStyle Style = getLLVMStyle(); 4513 Style.ColumnLimit = 60; 4514 Style.BinPackArguments = false; 4515 for (int i = 0; i < 4; ++i) { 4516 // Test all combinations of parameters that should not have an effect. 4517 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4518 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4519 4520 Style.AllowAllArgumentsOnNextLine = true; 4521 verifyFormat("void foo() {\n" 4522 " FunctionCallWithReallyLongName(\n" 4523 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4524 "}", 4525 Style); 4526 Style.AllowAllArgumentsOnNextLine = false; 4527 verifyFormat("void foo() {\n" 4528 " FunctionCallWithReallyLongName(\n" 4529 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4530 " bbbbbbbbbbbb);\n" 4531 "}", 4532 Style); 4533 4534 Style.AllowAllArgumentsOnNextLine = true; 4535 verifyFormat("void foo() {\n" 4536 " auto VariableWithReallyLongName = {\n" 4537 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4538 "}", 4539 Style); 4540 Style.AllowAllArgumentsOnNextLine = false; 4541 verifyFormat("void foo() {\n" 4542 " auto VariableWithReallyLongName = {\n" 4543 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4544 " bbbbbbbbbbbb};\n" 4545 "}", 4546 Style); 4547 } 4548 4549 // This parameter should not affect declarations. 4550 Style.BinPackParameters = false; 4551 Style.AllowAllArgumentsOnNextLine = false; 4552 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4553 verifyFormat("void FunctionCallWithReallyLongName(\n" 4554 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4555 Style); 4556 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4557 verifyFormat("void FunctionCallWithReallyLongName(\n" 4558 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4559 " int bbbbbbbbbbbb);", 4560 Style); 4561 } 4562 4563 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4564 FormatStyle Style = getLLVMStyle(); 4565 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4566 4567 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4568 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4569 getStyleWithColumns(Style, 45)); 4570 verifyFormat("Constructor() :\n" 4571 " Initializer(FitsOnTheLine) {}", 4572 getStyleWithColumns(Style, 44)); 4573 verifyFormat("Constructor() :\n" 4574 " Initializer(FitsOnTheLine) {}", 4575 getStyleWithColumns(Style, 43)); 4576 4577 verifyFormat("template <typename T>\n" 4578 "Constructor() : Initializer(FitsOnTheLine) {}", 4579 getStyleWithColumns(Style, 50)); 4580 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4581 verifyFormat( 4582 "SomeClass::Constructor() :\n" 4583 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4584 Style); 4585 4586 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4587 verifyFormat( 4588 "SomeClass::Constructor() :\n" 4589 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4590 Style); 4591 4592 verifyFormat( 4593 "SomeClass::Constructor() :\n" 4594 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4595 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4596 Style); 4597 verifyFormat( 4598 "SomeClass::Constructor() :\n" 4599 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4600 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4601 Style); 4602 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4603 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4604 " aaaaaaaaaa(aaaaaa) {}", 4605 Style); 4606 4607 verifyFormat("Constructor() :\n" 4608 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4609 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4610 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4611 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4612 Style); 4613 4614 verifyFormat("Constructor() :\n" 4615 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4616 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4617 Style); 4618 4619 verifyFormat("Constructor(int Parameter = 0) :\n" 4620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4621 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4622 Style); 4623 verifyFormat("Constructor() :\n" 4624 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4625 "}", 4626 getStyleWithColumns(Style, 60)); 4627 verifyFormat("Constructor() :\n" 4628 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4629 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4630 Style); 4631 4632 // Here a line could be saved by splitting the second initializer onto two 4633 // lines, but that is not desirable. 4634 verifyFormat("Constructor() :\n" 4635 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4636 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4637 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4638 Style); 4639 4640 FormatStyle OnePerLine = Style; 4641 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4642 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4643 verifyFormat("SomeClass::Constructor() :\n" 4644 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4645 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4646 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4647 OnePerLine); 4648 verifyFormat("SomeClass::Constructor() :\n" 4649 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4650 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4651 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4652 OnePerLine); 4653 verifyFormat("MyClass::MyClass(int var) :\n" 4654 " some_var_(var), // 4 space indent\n" 4655 " some_other_var_(var + 1) { // lined up\n" 4656 "}", 4657 OnePerLine); 4658 verifyFormat("Constructor() :\n" 4659 " aaaaa(aaaaaa),\n" 4660 " aaaaa(aaaaaa),\n" 4661 " aaaaa(aaaaaa),\n" 4662 " aaaaa(aaaaaa),\n" 4663 " aaaaa(aaaaaa) {}", 4664 OnePerLine); 4665 verifyFormat("Constructor() :\n" 4666 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4667 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4668 OnePerLine); 4669 OnePerLine.BinPackParameters = false; 4670 verifyFormat("Constructor() :\n" 4671 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4672 " aaaaaaaaaaa().aaa(),\n" 4673 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4674 OnePerLine); 4675 OnePerLine.ColumnLimit = 60; 4676 verifyFormat("Constructor() :\n" 4677 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4678 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4679 OnePerLine); 4680 4681 EXPECT_EQ("Constructor() :\n" 4682 " // Comment forcing unwanted break.\n" 4683 " aaaa(aaaa) {}", 4684 format("Constructor() :\n" 4685 " // Comment forcing unwanted break.\n" 4686 " aaaa(aaaa) {}", 4687 Style)); 4688 4689 Style.ColumnLimit = 0; 4690 verifyFormat("SomeClass::Constructor() :\n" 4691 " a(a) {}", 4692 Style); 4693 verifyFormat("SomeClass::Constructor() noexcept :\n" 4694 " a(a) {}", 4695 Style); 4696 verifyFormat("SomeClass::Constructor() :\n" 4697 " a(a), b(b), c(c) {}", 4698 Style); 4699 verifyFormat("SomeClass::Constructor() :\n" 4700 " a(a) {\n" 4701 " foo();\n" 4702 " bar();\n" 4703 "}", 4704 Style); 4705 4706 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4707 verifyFormat("SomeClass::Constructor() :\n" 4708 " a(a), b(b), c(c) {\n" 4709 "}", 4710 Style); 4711 verifyFormat("SomeClass::Constructor() :\n" 4712 " a(a) {\n" 4713 "}", 4714 Style); 4715 4716 Style.ColumnLimit = 80; 4717 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4718 Style.ConstructorInitializerIndentWidth = 2; 4719 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 4720 verifyFormat("SomeClass::Constructor() :\n" 4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4722 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4723 Style); 4724 4725 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 4726 // well 4727 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4728 verifyFormat( 4729 "class SomeClass\n" 4730 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4731 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4732 Style); 4733 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4734 verifyFormat( 4735 "class SomeClass\n" 4736 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4737 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4738 Style); 4739 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4740 verifyFormat( 4741 "class SomeClass :\n" 4742 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4743 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4744 Style); 4745 } 4746 4747 #ifndef EXPENSIVE_CHECKS 4748 // Expensive checks enables libstdc++ checking which includes validating the 4749 // state of ranges used in std::priority_queue - this blows out the 4750 // runtime/scalability of the function and makes this test unacceptably slow. 4751 TEST_F(FormatTest, MemoizationTests) { 4752 // This breaks if the memoization lookup does not take \c Indent and 4753 // \c LastSpace into account. 4754 verifyFormat( 4755 "extern CFRunLoopTimerRef\n" 4756 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4757 " CFTimeInterval interval, CFOptionFlags flags,\n" 4758 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4759 " CFRunLoopTimerContext *context) {}"); 4760 4761 // Deep nesting somewhat works around our memoization. 4762 verifyFormat( 4763 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4764 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4765 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4766 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4767 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4768 getLLVMStyleWithColumns(65)); 4769 verifyFormat( 4770 "aaaaa(\n" 4771 " aaaaa,\n" 4772 " aaaaa(\n" 4773 " aaaaa,\n" 4774 " aaaaa(\n" 4775 " aaaaa,\n" 4776 " aaaaa(\n" 4777 " aaaaa,\n" 4778 " aaaaa(\n" 4779 " aaaaa,\n" 4780 " aaaaa(\n" 4781 " aaaaa,\n" 4782 " aaaaa(\n" 4783 " aaaaa,\n" 4784 " aaaaa(\n" 4785 " aaaaa,\n" 4786 " aaaaa(\n" 4787 " aaaaa,\n" 4788 " aaaaa(\n" 4789 " aaaaa,\n" 4790 " aaaaa(\n" 4791 " aaaaa,\n" 4792 " aaaaa(\n" 4793 " aaaaa,\n" 4794 " aaaaa))))))))))));", 4795 getLLVMStyleWithColumns(65)); 4796 verifyFormat( 4797 "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" 4798 " a),\n" 4799 " a),\n" 4800 " a),\n" 4801 " a),\n" 4802 " a),\n" 4803 " a),\n" 4804 " a),\n" 4805 " a),\n" 4806 " a),\n" 4807 " a),\n" 4808 " a),\n" 4809 " a),\n" 4810 " a),\n" 4811 " a),\n" 4812 " a),\n" 4813 " a),\n" 4814 " a)", 4815 getLLVMStyleWithColumns(65)); 4816 4817 // This test takes VERY long when memoization is broken. 4818 FormatStyle OnePerLine = getLLVMStyle(); 4819 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4820 OnePerLine.BinPackParameters = false; 4821 std::string input = "Constructor()\n" 4822 " : aaaa(a,\n"; 4823 for (unsigned i = 0, e = 80; i != e; ++i) { 4824 input += " a,\n"; 4825 } 4826 input += " a) {}"; 4827 verifyFormat(input, OnePerLine); 4828 } 4829 #endif 4830 4831 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4832 verifyFormat( 4833 "void f() {\n" 4834 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4835 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4836 " f();\n" 4837 "}"); 4838 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4839 " Intervals[i - 1].getRange().getLast()) {\n}"); 4840 } 4841 4842 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4843 // Principially, we break function declarations in a certain order: 4844 // 1) break amongst arguments. 4845 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 4846 " Cccccccccccccc cccccccccccccc);"); 4847 verifyFormat("template <class TemplateIt>\n" 4848 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 4849 " TemplateIt *stop) {}"); 4850 4851 // 2) break after return type. 4852 verifyFormat( 4853 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4854 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 4855 getGoogleStyle()); 4856 4857 // 3) break after (. 4858 verifyFormat( 4859 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 4860 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 4861 getGoogleStyle()); 4862 4863 // 4) break before after nested name specifiers. 4864 verifyFormat( 4865 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4866 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 4867 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 4868 getGoogleStyle()); 4869 4870 // However, there are exceptions, if a sufficient amount of lines can be 4871 // saved. 4872 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 4873 // more adjusting. 4874 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4875 " Cccccccccccccc cccccccccc,\n" 4876 " Cccccccccccccc cccccccccc,\n" 4877 " Cccccccccccccc cccccccccc,\n" 4878 " Cccccccccccccc cccccccccc);"); 4879 verifyFormat( 4880 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4881 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4882 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4883 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 4884 getGoogleStyle()); 4885 verifyFormat( 4886 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4887 " Cccccccccccccc cccccccccc,\n" 4888 " Cccccccccccccc cccccccccc,\n" 4889 " Cccccccccccccc cccccccccc,\n" 4890 " Cccccccccccccc cccccccccc,\n" 4891 " Cccccccccccccc cccccccccc,\n" 4892 " Cccccccccccccc cccccccccc);"); 4893 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4894 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4895 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4896 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4897 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 4898 4899 // Break after multi-line parameters. 4900 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4901 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4902 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4903 " bbbb bbbb);"); 4904 verifyFormat("void SomeLoooooooooooongFunction(\n" 4905 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 4906 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4907 " int bbbbbbbbbbbbb);"); 4908 4909 // Treat overloaded operators like other functions. 4910 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4911 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 4912 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4913 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 4914 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4915 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 4916 verifyGoogleFormat( 4917 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 4918 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4919 verifyGoogleFormat( 4920 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 4921 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4922 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4923 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4924 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 4925 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4926 verifyGoogleFormat( 4927 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 4928 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4929 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 4930 verifyGoogleFormat("template <typename T>\n" 4931 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4932 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 4933 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 4934 4935 FormatStyle Style = getLLVMStyle(); 4936 Style.PointerAlignment = FormatStyle::PAS_Left; 4937 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4938 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 4939 Style); 4940 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 4941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4942 Style); 4943 } 4944 4945 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 4946 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 4947 // Prefer keeping `::` followed by `operator` together. 4948 EXPECT_EQ("const aaaa::bbbbbbb &\n" 4949 "ccccccccc::operator++() {\n" 4950 " stuff();\n" 4951 "}", 4952 format("const aaaa::bbbbbbb\n" 4953 "&ccccccccc::operator++() { stuff(); }", 4954 getLLVMStyleWithColumns(40))); 4955 } 4956 4957 TEST_F(FormatTest, TrailingReturnType) { 4958 verifyFormat("auto foo() -> int;\n"); 4959 // correct trailing return type spacing 4960 verifyFormat("auto operator->() -> int;\n"); 4961 verifyFormat("auto operator++(int) -> int;\n"); 4962 4963 verifyFormat("struct S {\n" 4964 " auto bar() const -> int;\n" 4965 "};"); 4966 verifyFormat("template <size_t Order, typename T>\n" 4967 "auto load_img(const std::string &filename)\n" 4968 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 4969 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 4970 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 4971 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 4972 verifyFormat("template <typename T>\n" 4973 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 4974 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 4975 4976 // Not trailing return types. 4977 verifyFormat("void f() { auto a = b->c(); }"); 4978 } 4979 4980 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 4981 // Avoid breaking before trailing 'const' or other trailing annotations, if 4982 // they are not function-like. 4983 FormatStyle Style = getGoogleStyle(); 4984 Style.ColumnLimit = 47; 4985 verifyFormat("void someLongFunction(\n" 4986 " int someLoooooooooooooongParameter) const {\n}", 4987 getLLVMStyleWithColumns(47)); 4988 verifyFormat("LoooooongReturnType\n" 4989 "someLoooooooongFunction() const {}", 4990 getLLVMStyleWithColumns(47)); 4991 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 4992 " const {}", 4993 Style); 4994 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4995 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 4996 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4997 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 4998 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4999 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5000 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5001 " aaaaaaaaaaa aaaaa) const override;"); 5002 verifyGoogleFormat( 5003 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5004 " const override;"); 5005 5006 // Even if the first parameter has to be wrapped. 5007 verifyFormat("void someLongFunction(\n" 5008 " int someLongParameter) const {}", 5009 getLLVMStyleWithColumns(46)); 5010 verifyFormat("void someLongFunction(\n" 5011 " int someLongParameter) const {}", 5012 Style); 5013 verifyFormat("void someLongFunction(\n" 5014 " int someLongParameter) override {}", 5015 Style); 5016 verifyFormat("void someLongFunction(\n" 5017 " int someLongParameter) OVERRIDE {}", 5018 Style); 5019 verifyFormat("void someLongFunction(\n" 5020 " int someLongParameter) final {}", 5021 Style); 5022 verifyFormat("void someLongFunction(\n" 5023 " int someLongParameter) FINAL {}", 5024 Style); 5025 verifyFormat("void someLongFunction(\n" 5026 " int parameter) const override {}", 5027 Style); 5028 5029 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5030 verifyFormat("void someLongFunction(\n" 5031 " int someLongParameter) const\n" 5032 "{\n" 5033 "}", 5034 Style); 5035 5036 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5037 verifyFormat("void someLongFunction(\n" 5038 " int someLongParameter) const\n" 5039 " {\n" 5040 " }", 5041 Style); 5042 5043 // Unless these are unknown annotations. 5044 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5045 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5046 " LONG_AND_UGLY_ANNOTATION;"); 5047 5048 // Breaking before function-like trailing annotations is fine to keep them 5049 // close to their arguments. 5050 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5051 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5052 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5053 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5054 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5055 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5056 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5057 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5058 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5059 5060 verifyFormat( 5061 "void aaaaaaaaaaaaaaaaaa()\n" 5062 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5063 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5064 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5065 " __attribute__((unused));"); 5066 verifyGoogleFormat( 5067 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5068 " GUARDED_BY(aaaaaaaaaaaa);"); 5069 verifyGoogleFormat( 5070 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5071 " GUARDED_BY(aaaaaaaaaaaa);"); 5072 verifyGoogleFormat( 5073 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5074 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5075 verifyGoogleFormat( 5076 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5077 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5078 } 5079 5080 TEST_F(FormatTest, FunctionAnnotations) { 5081 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5082 "int OldFunction(const string ¶meter) {}"); 5083 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5084 "string OldFunction(const string ¶meter) {}"); 5085 verifyFormat("template <typename T>\n" 5086 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5087 "string OldFunction(const string ¶meter) {}"); 5088 5089 // Not function annotations. 5090 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5091 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5092 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5093 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5094 verifyFormat("MACRO(abc).function() // wrap\n" 5095 " << abc;"); 5096 verifyFormat("MACRO(abc)->function() // wrap\n" 5097 " << abc;"); 5098 verifyFormat("MACRO(abc)::function() // wrap\n" 5099 " << abc;"); 5100 } 5101 5102 TEST_F(FormatTest, BreaksDesireably) { 5103 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5104 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5105 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5106 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5108 "}"); 5109 5110 verifyFormat( 5111 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5113 5114 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5115 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5117 5118 verifyFormat( 5119 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5120 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5122 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5124 5125 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5126 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5127 5128 verifyFormat( 5129 "void f() {\n" 5130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5132 "}"); 5133 verifyFormat( 5134 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5135 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5136 verifyFormat( 5137 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5139 verifyFormat( 5140 "aaaaaa(aaa,\n" 5141 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5143 " aaaa);"); 5144 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5146 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5147 5148 // Indent consistently independent of call expression and unary operator. 5149 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5150 " dddddddddddddddddddddddddddddd));"); 5151 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5152 " dddddddddddddddddddddddddddddd));"); 5153 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5154 " dddddddddddddddddddddddddddddd));"); 5155 5156 // This test case breaks on an incorrect memoization, i.e. an optimization not 5157 // taking into account the StopAt value. 5158 verifyFormat( 5159 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5160 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5161 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5162 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5163 5164 verifyFormat("{\n {\n {\n" 5165 " Annotation.SpaceRequiredBefore =\n" 5166 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5167 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5168 " }\n }\n}"); 5169 5170 // Break on an outer level if there was a break on an inner level. 5171 EXPECT_EQ("f(g(h(a, // comment\n" 5172 " b, c),\n" 5173 " d, e),\n" 5174 " x, y);", 5175 format("f(g(h(a, // comment\n" 5176 " b, c), d, e), x, y);")); 5177 5178 // Prefer breaking similar line breaks. 5179 verifyFormat( 5180 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5181 " NSTrackingMouseEnteredAndExited |\n" 5182 " NSTrackingActiveAlways;"); 5183 } 5184 5185 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5186 FormatStyle NoBinPacking = getGoogleStyle(); 5187 NoBinPacking.BinPackParameters = false; 5188 NoBinPacking.BinPackArguments = true; 5189 verifyFormat("void f() {\n" 5190 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5191 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5192 "}", 5193 NoBinPacking); 5194 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5195 " int aaaaaaaaaaaaaaaaaaaa,\n" 5196 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5197 NoBinPacking); 5198 5199 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5200 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5201 " vector<int> bbbbbbbbbbbbbbb);", 5202 NoBinPacking); 5203 // FIXME: This behavior difference is probably not wanted. However, currently 5204 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5205 // template arguments from BreakBeforeParameter being set because of the 5206 // one-per-line formatting. 5207 verifyFormat( 5208 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5209 " aaaaaaaaaa> aaaaaaaaaa);", 5210 NoBinPacking); 5211 verifyFormat( 5212 "void fffffffffff(\n" 5213 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5214 " aaaaaaaaaa);"); 5215 } 5216 5217 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5218 FormatStyle NoBinPacking = getGoogleStyle(); 5219 NoBinPacking.BinPackParameters = false; 5220 NoBinPacking.BinPackArguments = false; 5221 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5222 " aaaaaaaaaaaaaaaaaaaa,\n" 5223 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5224 NoBinPacking); 5225 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5226 " aaaaaaaaaaaaa,\n" 5227 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5228 NoBinPacking); 5229 verifyFormat( 5230 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5231 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5232 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5233 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5234 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5235 NoBinPacking); 5236 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5237 " .aaaaaaaaaaaaaaaaaa();", 5238 NoBinPacking); 5239 verifyFormat("void f() {\n" 5240 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5241 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5242 "}", 5243 NoBinPacking); 5244 5245 verifyFormat( 5246 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5247 " aaaaaaaaaaaa,\n" 5248 " aaaaaaaaaaaa);", 5249 NoBinPacking); 5250 verifyFormat( 5251 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5252 " ddddddddddddddddddddddddddddd),\n" 5253 " test);", 5254 NoBinPacking); 5255 5256 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5257 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5258 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5259 " aaaaaaaaaaaaaaaaaa;", 5260 NoBinPacking); 5261 verifyFormat("a(\"a\"\n" 5262 " \"a\",\n" 5263 " a);"); 5264 5265 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5266 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5267 " aaaaaaaaa,\n" 5268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5269 NoBinPacking); 5270 verifyFormat( 5271 "void f() {\n" 5272 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5273 " .aaaaaaa();\n" 5274 "}", 5275 NoBinPacking); 5276 verifyFormat( 5277 "template <class SomeType, class SomeOtherType>\n" 5278 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5279 NoBinPacking); 5280 } 5281 5282 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5283 FormatStyle Style = getLLVMStyleWithColumns(15); 5284 Style.ExperimentalAutoDetectBinPacking = true; 5285 EXPECT_EQ("aaa(aaaa,\n" 5286 " aaaa,\n" 5287 " aaaa);\n" 5288 "aaa(aaaa,\n" 5289 " aaaa,\n" 5290 " aaaa);", 5291 format("aaa(aaaa,\n" // one-per-line 5292 " aaaa,\n" 5293 " aaaa );\n" 5294 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5295 Style)); 5296 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5297 " aaaa);\n" 5298 "aaa(aaaa, aaaa,\n" 5299 " aaaa);", 5300 format("aaa(aaaa, aaaa,\n" // bin-packed 5301 " aaaa );\n" 5302 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5303 Style)); 5304 } 5305 5306 TEST_F(FormatTest, FormatsBuilderPattern) { 5307 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5308 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5309 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5310 " .StartsWith(\".init\", ORDER_INIT)\n" 5311 " .StartsWith(\".fini\", ORDER_FINI)\n" 5312 " .StartsWith(\".hash\", ORDER_HASH)\n" 5313 " .Default(ORDER_TEXT);\n"); 5314 5315 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5316 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5317 verifyFormat("aaaaaaa->aaaaaaa\n" 5318 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5320 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5321 verifyFormat( 5322 "aaaaaaa->aaaaaaa\n" 5323 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5324 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5325 verifyFormat( 5326 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5327 " aaaaaaaaaaaaaa);"); 5328 verifyFormat( 5329 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5330 " aaaaaa->aaaaaaaaaaaa()\n" 5331 " ->aaaaaaaaaaaaaaaa(\n" 5332 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5333 " ->aaaaaaaaaaaaaaaaa();"); 5334 verifyGoogleFormat( 5335 "void f() {\n" 5336 " someo->Add((new util::filetools::Handler(dir))\n" 5337 " ->OnEvent1(NewPermanentCallback(\n" 5338 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5339 " ->OnEvent2(NewPermanentCallback(\n" 5340 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5341 " ->OnEvent3(NewPermanentCallback(\n" 5342 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5343 " ->OnEvent5(NewPermanentCallback(\n" 5344 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5345 " ->OnEvent6(NewPermanentCallback(\n" 5346 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5347 "}"); 5348 5349 verifyFormat( 5350 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5351 verifyFormat("aaaaaaaaaaaaaaa()\n" 5352 " .aaaaaaaaaaaaaaa()\n" 5353 " .aaaaaaaaaaaaaaa()\n" 5354 " .aaaaaaaaaaaaaaa()\n" 5355 " .aaaaaaaaaaaaaaa();"); 5356 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5357 " .aaaaaaaaaaaaaaa()\n" 5358 " .aaaaaaaaaaaaaaa()\n" 5359 " .aaaaaaaaaaaaaaa();"); 5360 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5361 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5362 " .aaaaaaaaaaaaaaa();"); 5363 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5364 " ->aaaaaaaaaaaaaae(0)\n" 5365 " ->aaaaaaaaaaaaaaa();"); 5366 5367 // Don't linewrap after very short segments. 5368 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5369 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5370 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5371 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5372 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5373 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5374 verifyFormat("aaa()\n" 5375 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5376 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5377 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5378 5379 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5380 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5381 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5382 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5383 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5385 5386 // Prefer not to break after empty parentheses. 5387 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5388 " First->LastNewlineOffset);"); 5389 5390 // Prefer not to create "hanging" indents. 5391 verifyFormat( 5392 "return !soooooooooooooome_map\n" 5393 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5394 " .second;"); 5395 verifyFormat( 5396 "return aaaaaaaaaaaaaaaa\n" 5397 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5398 " .aaaa(aaaaaaaaaaaaaa);"); 5399 // No hanging indent here. 5400 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5402 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5404 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5405 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5406 getLLVMStyleWithColumns(60)); 5407 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5408 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5409 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5410 getLLVMStyleWithColumns(59)); 5411 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5413 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5414 5415 // Dont break if only closing statements before member call 5416 verifyFormat("test() {\n" 5417 " ([]() -> {\n" 5418 " int b = 32;\n" 5419 " return 3;\n" 5420 " }).foo();\n" 5421 "}"); 5422 verifyFormat("test() {\n" 5423 " (\n" 5424 " []() -> {\n" 5425 " int b = 32;\n" 5426 " return 3;\n" 5427 " },\n" 5428 " foo, bar)\n" 5429 " .foo();\n" 5430 "}"); 5431 verifyFormat("test() {\n" 5432 " ([]() -> {\n" 5433 " int b = 32;\n" 5434 " return 3;\n" 5435 " })\n" 5436 " .foo()\n" 5437 " .bar();\n" 5438 "}"); 5439 verifyFormat("test() {\n" 5440 " ([]() -> {\n" 5441 " int b = 32;\n" 5442 " return 3;\n" 5443 " })\n" 5444 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5445 " \"bbbb\");\n" 5446 "}", 5447 getLLVMStyleWithColumns(30)); 5448 } 5449 5450 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5451 verifyFormat( 5452 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5453 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5454 verifyFormat( 5455 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5456 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5457 5458 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5459 " ccccccccccccccccccccccccc) {\n}"); 5460 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5461 " ccccccccccccccccccccccccc) {\n}"); 5462 5463 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5464 " ccccccccccccccccccccccccc) {\n}"); 5465 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5466 " ccccccccccccccccccccccccc) {\n}"); 5467 5468 verifyFormat( 5469 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5470 " ccccccccccccccccccccccccc) {\n}"); 5471 verifyFormat( 5472 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5473 " ccccccccccccccccccccccccc) {\n}"); 5474 5475 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5476 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5477 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5478 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5479 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5480 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5481 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5482 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5483 5484 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5485 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5486 " aaaaaaaaaaaaaaa != aa) {\n}"); 5487 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5488 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5489 " aaaaaaaaaaaaaaa != aa) {\n}"); 5490 } 5491 5492 TEST_F(FormatTest, BreaksAfterAssignments) { 5493 verifyFormat( 5494 "unsigned Cost =\n" 5495 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5496 " SI->getPointerAddressSpaceee());\n"); 5497 verifyFormat( 5498 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5499 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5500 5501 verifyFormat( 5502 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5503 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5504 verifyFormat("unsigned OriginalStartColumn =\n" 5505 " SourceMgr.getSpellingColumnNumber(\n" 5506 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5507 " 1;"); 5508 } 5509 5510 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5511 FormatStyle Style = getLLVMStyle(); 5512 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5513 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5514 Style); 5515 5516 Style.PenaltyBreakAssignment = 20; 5517 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5518 " cccccccccccccccccccccccccc;", 5519 Style); 5520 } 5521 5522 TEST_F(FormatTest, AlignsAfterAssignments) { 5523 verifyFormat( 5524 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5525 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5526 verifyFormat( 5527 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5528 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5529 verifyFormat( 5530 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5531 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5532 verifyFormat( 5533 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5534 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5535 verifyFormat( 5536 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5537 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5538 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5539 } 5540 5541 TEST_F(FormatTest, AlignsAfterReturn) { 5542 verifyFormat( 5543 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5544 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5545 verifyFormat( 5546 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5547 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5548 verifyFormat( 5549 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5550 " aaaaaaaaaaaaaaaaaaaaaa();"); 5551 verifyFormat( 5552 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5553 " aaaaaaaaaaaaaaaaaaaaaa());"); 5554 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5555 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5556 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5557 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5558 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5559 verifyFormat("return\n" 5560 " // true if code is one of a or b.\n" 5561 " code == a || code == b;"); 5562 } 5563 5564 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5565 verifyFormat( 5566 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5567 " aaaaaaaaa aaaaaaa) {}"); 5568 verifyFormat( 5569 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5570 " aaaaaaaaaaa aaaaaaaaa);"); 5571 verifyFormat( 5572 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5573 " aaaaaaaaaaaaaaaaaaaaa));"); 5574 FormatStyle Style = getLLVMStyle(); 5575 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5576 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5577 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5578 Style); 5579 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5580 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5581 Style); 5582 verifyFormat("SomeLongVariableName->someFunction(\n" 5583 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5584 Style); 5585 verifyFormat( 5586 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5587 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5588 Style); 5589 verifyFormat( 5590 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5591 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5592 Style); 5593 verifyFormat( 5594 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5595 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5596 Style); 5597 5598 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5599 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5600 " b));", 5601 Style); 5602 5603 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5604 Style.BinPackArguments = false; 5605 Style.BinPackParameters = false; 5606 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5607 " aaaaaaaaaaa aaaaaaaa,\n" 5608 " aaaaaaaaa aaaaaaa,\n" 5609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5610 Style); 5611 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5612 " aaaaaaaaaaa aaaaaaaaa,\n" 5613 " aaaaaaaaaaa aaaaaaaaa,\n" 5614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5615 Style); 5616 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5617 " aaaaaaaaaaaaaaa,\n" 5618 " aaaaaaaaaaaaaaaaaaaaa,\n" 5619 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5620 Style); 5621 verifyFormat( 5622 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5623 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5624 Style); 5625 verifyFormat( 5626 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5627 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5628 Style); 5629 verifyFormat( 5630 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5631 " aaaaaaaaaaaaaaaaaaaaa(\n" 5632 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5633 " aaaaaaaaaaaaaaaa);", 5634 Style); 5635 verifyFormat( 5636 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5637 " aaaaaaaaaaaaaaaaaaaaa(\n" 5638 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5639 " aaaaaaaaaaaaaaaa);", 5640 Style); 5641 } 5642 5643 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5644 FormatStyle Style = getLLVMStyleWithColumns(40); 5645 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5646 " bbbbbbbbbbbbbbbbbbbbbb);", 5647 Style); 5648 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5649 Style.AlignOperands = false; 5650 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5651 " bbbbbbbbbbbbbbbbbbbbbb);", 5652 Style); 5653 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5654 Style.AlignOperands = true; 5655 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5656 " bbbbbbbbbbbbbbbbbbbbbb);", 5657 Style); 5658 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5659 Style.AlignOperands = false; 5660 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5661 " bbbbbbbbbbbbbbbbbbbbbb);", 5662 Style); 5663 } 5664 5665 TEST_F(FormatTest, BreaksConditionalExpressions) { 5666 verifyFormat( 5667 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5668 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5669 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5670 verifyFormat( 5671 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5672 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5673 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5674 verifyFormat( 5675 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5676 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5677 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5678 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5679 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5680 verifyFormat( 5681 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5682 " : aaaaaaaaaaaaa);"); 5683 verifyFormat( 5684 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5685 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5686 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5687 " aaaaaaaaaaaaa);"); 5688 verifyFormat( 5689 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5690 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5691 " aaaaaaaaaaaaa);"); 5692 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5693 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5695 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5697 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5698 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5699 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5701 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5703 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5704 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5705 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5706 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5708 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5709 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5710 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5711 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5712 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5714 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5715 " : aaaaaaaaaaaaaaaa;"); 5716 verifyFormat( 5717 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5718 " ? aaaaaaaaaaaaaaa\n" 5719 " : aaaaaaaaaaaaaaa;"); 5720 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5721 " aaaaaaaaa\n" 5722 " ? b\n" 5723 " : c);"); 5724 verifyFormat("return aaaa == bbbb\n" 5725 " // comment\n" 5726 " ? aaaa\n" 5727 " : bbbb;"); 5728 verifyFormat("unsigned Indent =\n" 5729 " format(TheLine.First,\n" 5730 " IndentForLevel[TheLine.Level] >= 0\n" 5731 " ? IndentForLevel[TheLine.Level]\n" 5732 " : TheLine * 2,\n" 5733 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5734 getLLVMStyleWithColumns(60)); 5735 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5736 " ? aaaaaaaaaaaaaaa\n" 5737 " : bbbbbbbbbbbbbbb //\n" 5738 " ? ccccccccccccccc\n" 5739 " : ddddddddddddddd;"); 5740 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5741 " ? aaaaaaaaaaaaaaa\n" 5742 " : (bbbbbbbbbbbbbbb //\n" 5743 " ? ccccccccccccccc\n" 5744 " : ddddddddddddddd);"); 5745 verifyFormat( 5746 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5747 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5748 " aaaaaaaaaaaaaaaaaaaaa +\n" 5749 " aaaaaaaaaaaaaaaaaaaaa\n" 5750 " : aaaaaaaaaa;"); 5751 verifyFormat( 5752 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5753 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5754 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5755 5756 FormatStyle NoBinPacking = getLLVMStyle(); 5757 NoBinPacking.BinPackArguments = false; 5758 verifyFormat( 5759 "void f() {\n" 5760 " g(aaa,\n" 5761 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5762 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5763 " ? aaaaaaaaaaaaaaa\n" 5764 " : aaaaaaaaaaaaaaa);\n" 5765 "}", 5766 NoBinPacking); 5767 verifyFormat( 5768 "void f() {\n" 5769 " g(aaa,\n" 5770 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5771 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5772 " ?: aaaaaaaaaaaaaaa);\n" 5773 "}", 5774 NoBinPacking); 5775 5776 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5777 " // comment.\n" 5778 " ccccccccccccccccccccccccccccccccccccccc\n" 5779 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5780 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5781 5782 // Assignments in conditional expressions. Apparently not uncommon :-(. 5783 verifyFormat("return a != b\n" 5784 " // comment\n" 5785 " ? a = b\n" 5786 " : a = b;"); 5787 verifyFormat("return a != b\n" 5788 " // comment\n" 5789 " ? a = a != b\n" 5790 " // comment\n" 5791 " ? a = b\n" 5792 " : a\n" 5793 " : a;\n"); 5794 verifyFormat("return a != b\n" 5795 " // comment\n" 5796 " ? a\n" 5797 " : a = a != b\n" 5798 " // comment\n" 5799 " ? a = b\n" 5800 " : a;"); 5801 } 5802 5803 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5804 FormatStyle Style = getLLVMStyle(); 5805 Style.BreakBeforeTernaryOperators = false; 5806 Style.ColumnLimit = 70; 5807 verifyFormat( 5808 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5809 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5810 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5811 Style); 5812 verifyFormat( 5813 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5814 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5815 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5816 Style); 5817 verifyFormat( 5818 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5819 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5820 Style); 5821 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5822 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5823 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5824 Style); 5825 verifyFormat( 5826 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 5827 " aaaaaaaaaaaaa);", 5828 Style); 5829 verifyFormat( 5830 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5831 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5833 " aaaaaaaaaaaaa);", 5834 Style); 5835 verifyFormat( 5836 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5837 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5838 " aaaaaaaaaaaaa);", 5839 Style); 5840 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5841 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5844 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5845 Style); 5846 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5847 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5848 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5849 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5852 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5853 Style); 5854 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5855 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 5856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5858 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5859 Style); 5860 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5861 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5862 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5863 Style); 5864 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5865 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5866 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5868 Style); 5869 verifyFormat( 5870 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5871 " aaaaaaaaaaaaaaa :\n" 5872 " aaaaaaaaaaaaaaa;", 5873 Style); 5874 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5875 " aaaaaaaaa ?\n" 5876 " b :\n" 5877 " c);", 5878 Style); 5879 verifyFormat("unsigned Indent =\n" 5880 " format(TheLine.First,\n" 5881 " IndentForLevel[TheLine.Level] >= 0 ?\n" 5882 " IndentForLevel[TheLine.Level] :\n" 5883 " TheLine * 2,\n" 5884 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5885 Style); 5886 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5887 " aaaaaaaaaaaaaaa :\n" 5888 " bbbbbbbbbbbbbbb ? //\n" 5889 " ccccccccccccccc :\n" 5890 " ddddddddddddddd;", 5891 Style); 5892 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5893 " aaaaaaaaaaaaaaa :\n" 5894 " (bbbbbbbbbbbbbbb ? //\n" 5895 " ccccccccccccccc :\n" 5896 " ddddddddddddddd);", 5897 Style); 5898 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5899 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 5900 " ccccccccccccccccccccccccccc;", 5901 Style); 5902 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5903 " aaaaa :\n" 5904 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 5905 Style); 5906 } 5907 5908 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 5909 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 5910 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 5911 verifyFormat("bool a = true, b = false;"); 5912 5913 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5914 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 5915 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 5916 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 5917 verifyFormat( 5918 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 5919 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 5920 " d = e && f;"); 5921 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 5922 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 5923 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5924 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 5925 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 5926 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 5927 5928 FormatStyle Style = getGoogleStyle(); 5929 Style.PointerAlignment = FormatStyle::PAS_Left; 5930 Style.DerivePointerAlignment = false; 5931 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5932 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 5933 " *b = bbbbbbbbbbbbbbbbbbb;", 5934 Style); 5935 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5936 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 5937 Style); 5938 verifyFormat("vector<int*> a, b;", Style); 5939 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 5940 } 5941 5942 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 5943 verifyFormat("arr[foo ? bar : baz];"); 5944 verifyFormat("f()[foo ? bar : baz];"); 5945 verifyFormat("(a + b)[foo ? bar : baz];"); 5946 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 5947 } 5948 5949 TEST_F(FormatTest, AlignsStringLiterals) { 5950 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 5951 " \"short literal\");"); 5952 verifyFormat( 5953 "looooooooooooooooooooooooongFunction(\n" 5954 " \"short literal\"\n" 5955 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 5956 verifyFormat("someFunction(\"Always break between multi-line\"\n" 5957 " \" string literals\",\n" 5958 " and, other, parameters);"); 5959 EXPECT_EQ("fun + \"1243\" /* comment */\n" 5960 " \"5678\";", 5961 format("fun + \"1243\" /* comment */\n" 5962 " \"5678\";", 5963 getLLVMStyleWithColumns(28))); 5964 EXPECT_EQ( 5965 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 5966 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 5967 " \"aaaaaaaaaaaaaaaa\";", 5968 format("aaaaaa =" 5969 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 5970 "aaaaaaaaaaaaaaaaaaaaa\" " 5971 "\"aaaaaaaaaaaaaaaa\";")); 5972 verifyFormat("a = a + \"a\"\n" 5973 " \"a\"\n" 5974 " \"a\";"); 5975 verifyFormat("f(\"a\", \"b\"\n" 5976 " \"c\");"); 5977 5978 verifyFormat( 5979 "#define LL_FORMAT \"ll\"\n" 5980 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 5981 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 5982 5983 verifyFormat("#define A(X) \\\n" 5984 " \"aaaaa\" #X \"bbbbbb\" \\\n" 5985 " \"ccccc\"", 5986 getLLVMStyleWithColumns(23)); 5987 verifyFormat("#define A \"def\"\n" 5988 "f(\"abc\" A \"ghi\"\n" 5989 " \"jkl\");"); 5990 5991 verifyFormat("f(L\"a\"\n" 5992 " L\"b\");"); 5993 verifyFormat("#define A(X) \\\n" 5994 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 5995 " L\"ccccc\"", 5996 getLLVMStyleWithColumns(25)); 5997 5998 verifyFormat("f(@\"a\"\n" 5999 " @\"b\");"); 6000 verifyFormat("NSString s = @\"a\"\n" 6001 " @\"b\"\n" 6002 " @\"c\";"); 6003 verifyFormat("NSString s = @\"a\"\n" 6004 " \"b\"\n" 6005 " \"c\";"); 6006 } 6007 6008 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6009 FormatStyle Style = getLLVMStyle(); 6010 // No declarations or definitions should be moved to own line. 6011 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6012 verifyFormat("class A {\n" 6013 " int f() { return 1; }\n" 6014 " int g();\n" 6015 "};\n" 6016 "int f() { return 1; }\n" 6017 "int g();\n", 6018 Style); 6019 6020 // All declarations and definitions should have the return type moved to its 6021 // own 6022 // line. 6023 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6024 verifyFormat("class E {\n" 6025 " int\n" 6026 " f() {\n" 6027 " return 1;\n" 6028 " }\n" 6029 " int\n" 6030 " g();\n" 6031 "};\n" 6032 "int\n" 6033 "f() {\n" 6034 " return 1;\n" 6035 "}\n" 6036 "int\n" 6037 "g();\n", 6038 Style); 6039 6040 // Top-level definitions, and no kinds of declarations should have the 6041 // return type moved to its own line. 6042 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6043 verifyFormat("class B {\n" 6044 " int f() { return 1; }\n" 6045 " int g();\n" 6046 "};\n" 6047 "int\n" 6048 "f() {\n" 6049 " return 1;\n" 6050 "}\n" 6051 "int g();\n", 6052 Style); 6053 6054 // Top-level definitions and declarations should have the return type moved 6055 // to its own line. 6056 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6057 verifyFormat("class C {\n" 6058 " int f() { return 1; }\n" 6059 " int g();\n" 6060 "};\n" 6061 "int\n" 6062 "f() {\n" 6063 " return 1;\n" 6064 "}\n" 6065 "int\n" 6066 "g();\n", 6067 Style); 6068 6069 // All definitions should have the return type moved to its own line, but no 6070 // kinds of declarations. 6071 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6072 verifyFormat("class D {\n" 6073 " int\n" 6074 " f() {\n" 6075 " return 1;\n" 6076 " }\n" 6077 " int g();\n" 6078 "};\n" 6079 "int\n" 6080 "f() {\n" 6081 " return 1;\n" 6082 "}\n" 6083 "int g();\n", 6084 Style); 6085 verifyFormat("const char *\n" 6086 "f(void) {\n" // Break here. 6087 " return \"\";\n" 6088 "}\n" 6089 "const char *bar(void);\n", // No break here. 6090 Style); 6091 verifyFormat("template <class T>\n" 6092 "T *\n" 6093 "f(T &c) {\n" // Break here. 6094 " return NULL;\n" 6095 "}\n" 6096 "template <class T> T *f(T &c);\n", // No break here. 6097 Style); 6098 verifyFormat("class C {\n" 6099 " int\n" 6100 " operator+() {\n" 6101 " return 1;\n" 6102 " }\n" 6103 " int\n" 6104 " operator()() {\n" 6105 " return 1;\n" 6106 " }\n" 6107 "};\n", 6108 Style); 6109 verifyFormat("void\n" 6110 "A::operator()() {}\n" 6111 "void\n" 6112 "A::operator>>() {}\n" 6113 "void\n" 6114 "A::operator+() {}\n", 6115 Style); 6116 verifyFormat("void *operator new(std::size_t s);", // No break here. 6117 Style); 6118 verifyFormat("void *\n" 6119 "operator new(std::size_t s) {}", 6120 Style); 6121 verifyFormat("void *\n" 6122 "operator delete[](void *ptr) {}", 6123 Style); 6124 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6125 verifyFormat("const char *\n" 6126 "f(void)\n" // Break here. 6127 "{\n" 6128 " return \"\";\n" 6129 "}\n" 6130 "const char *bar(void);\n", // No break here. 6131 Style); 6132 verifyFormat("template <class T>\n" 6133 "T *\n" // Problem here: no line break 6134 "f(T &c)\n" // Break here. 6135 "{\n" 6136 " return NULL;\n" 6137 "}\n" 6138 "template <class T> T *f(T &c);\n", // No break here. 6139 Style); 6140 verifyFormat("int\n" 6141 "foo(A<bool> a)\n" 6142 "{\n" 6143 " return a;\n" 6144 "}\n", 6145 Style); 6146 verifyFormat("int\n" 6147 "foo(A<8> a)\n" 6148 "{\n" 6149 " return a;\n" 6150 "}\n", 6151 Style); 6152 verifyFormat("int\n" 6153 "foo(A<B<bool>, 8> a)\n" 6154 "{\n" 6155 " return a;\n" 6156 "}\n", 6157 Style); 6158 verifyFormat("int\n" 6159 "foo(A<B<8>, bool> a)\n" 6160 "{\n" 6161 " return a;\n" 6162 "}\n", 6163 Style); 6164 verifyFormat("int\n" 6165 "foo(A<B<bool>, bool> a)\n" 6166 "{\n" 6167 " return a;\n" 6168 "}\n", 6169 Style); 6170 verifyFormat("int\n" 6171 "foo(A<B<8>, 8> a)\n" 6172 "{\n" 6173 " return a;\n" 6174 "}\n", 6175 Style); 6176 6177 Style = getGNUStyle(); 6178 6179 // Test for comments at the end of function declarations. 6180 verifyFormat("void\n" 6181 "foo (int a, /*abc*/ int b) // def\n" 6182 "{\n" 6183 "}\n", 6184 Style); 6185 6186 verifyFormat("void\n" 6187 "foo (int a, /* abc */ int b) /* def */\n" 6188 "{\n" 6189 "}\n", 6190 Style); 6191 6192 // Definitions that should not break after return type 6193 verifyFormat("void foo (int a, int b); // def\n", Style); 6194 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6195 verifyFormat("void foo (int a, int b);\n", Style); 6196 } 6197 6198 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6199 FormatStyle NoBreak = getLLVMStyle(); 6200 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6201 FormatStyle Break = getLLVMStyle(); 6202 Break.AlwaysBreakBeforeMultilineStrings = true; 6203 verifyFormat("aaaa = \"bbbb\"\n" 6204 " \"cccc\";", 6205 NoBreak); 6206 verifyFormat("aaaa =\n" 6207 " \"bbbb\"\n" 6208 " \"cccc\";", 6209 Break); 6210 verifyFormat("aaaa(\"bbbb\"\n" 6211 " \"cccc\");", 6212 NoBreak); 6213 verifyFormat("aaaa(\n" 6214 " \"bbbb\"\n" 6215 " \"cccc\");", 6216 Break); 6217 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6218 " \"cccc\");", 6219 NoBreak); 6220 verifyFormat("aaaa(qqq,\n" 6221 " \"bbbb\"\n" 6222 " \"cccc\");", 6223 Break); 6224 verifyFormat("aaaa(qqq,\n" 6225 " L\"bbbb\"\n" 6226 " L\"cccc\");", 6227 Break); 6228 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6229 " \"bbbb\"));", 6230 Break); 6231 verifyFormat("string s = someFunction(\n" 6232 " \"abc\"\n" 6233 " \"abc\");", 6234 Break); 6235 6236 // As we break before unary operators, breaking right after them is bad. 6237 verifyFormat("string foo = abc ? \"x\"\n" 6238 " \"blah blah blah blah blah blah\"\n" 6239 " : \"y\";", 6240 Break); 6241 6242 // Don't break if there is no column gain. 6243 verifyFormat("f(\"aaaa\"\n" 6244 " \"bbbb\");", 6245 Break); 6246 6247 // Treat literals with escaped newlines like multi-line string literals. 6248 EXPECT_EQ("x = \"a\\\n" 6249 "b\\\n" 6250 "c\";", 6251 format("x = \"a\\\n" 6252 "b\\\n" 6253 "c\";", 6254 NoBreak)); 6255 EXPECT_EQ("xxxx =\n" 6256 " \"a\\\n" 6257 "b\\\n" 6258 "c\";", 6259 format("xxxx = \"a\\\n" 6260 "b\\\n" 6261 "c\";", 6262 Break)); 6263 6264 EXPECT_EQ("NSString *const kString =\n" 6265 " @\"aaaa\"\n" 6266 " @\"bbbb\";", 6267 format("NSString *const kString = @\"aaaa\"\n" 6268 "@\"bbbb\";", 6269 Break)); 6270 6271 Break.ColumnLimit = 0; 6272 verifyFormat("const char *hello = \"hello llvm\";", Break); 6273 } 6274 6275 TEST_F(FormatTest, AlignsPipes) { 6276 verifyFormat( 6277 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6278 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6279 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6280 verifyFormat( 6281 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6282 " << aaaaaaaaaaaaaaaaaaaa;"); 6283 verifyFormat( 6284 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6285 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6286 verifyFormat( 6287 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6288 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6289 verifyFormat( 6290 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6291 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6292 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6293 verifyFormat( 6294 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6295 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6296 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6297 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6300 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6301 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6302 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6303 verifyFormat( 6304 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6305 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6306 verifyFormat( 6307 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6308 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6309 6310 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6311 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6312 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6313 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6314 " aaaaaaaaaaaaaaaaaaaaa)\n" 6315 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6316 verifyFormat("LOG_IF(aaa == //\n" 6317 " bbb)\n" 6318 " << a << b;"); 6319 6320 // But sometimes, breaking before the first "<<" is desirable. 6321 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6322 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6323 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6324 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6325 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6326 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6327 " << BEF << IsTemplate << Description << E->getType();"); 6328 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6329 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6331 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6332 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6333 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6334 " << aaa;"); 6335 6336 verifyFormat( 6337 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6338 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6339 6340 // Incomplete string literal. 6341 EXPECT_EQ("llvm::errs() << \"\n" 6342 " << a;", 6343 format("llvm::errs() << \"\n<<a;")); 6344 6345 verifyFormat("void f() {\n" 6346 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6347 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6348 "}"); 6349 6350 // Handle 'endl'. 6351 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6352 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6353 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6354 6355 // Handle '\n'. 6356 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6357 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6358 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6359 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6360 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6361 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6362 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6363 } 6364 6365 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6366 verifyFormat("return out << \"somepacket = {\\n\"\n" 6367 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6368 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6369 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6370 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6371 " << \"}\";"); 6372 6373 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6374 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6375 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6376 verifyFormat( 6377 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6378 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6379 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6380 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6381 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6382 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6383 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6384 verifyFormat( 6385 "void f() {\n" 6386 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6387 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6388 "}"); 6389 6390 // Breaking before the first "<<" is generally not desirable. 6391 verifyFormat( 6392 "llvm::errs()\n" 6393 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6394 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6395 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6396 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6397 getLLVMStyleWithColumns(70)); 6398 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6399 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6400 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6401 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6402 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6403 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6404 getLLVMStyleWithColumns(70)); 6405 6406 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6407 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6408 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6409 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6410 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6411 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6412 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6413 " (aaaa + aaaa);", 6414 getLLVMStyleWithColumns(40)); 6415 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6416 " (aaaaaaa + aaaaa));", 6417 getLLVMStyleWithColumns(40)); 6418 verifyFormat( 6419 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6420 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6421 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6422 } 6423 6424 TEST_F(FormatTest, UnderstandsEquals) { 6425 verifyFormat( 6426 "aaaaaaaaaaaaaaaaa =\n" 6427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6428 verifyFormat( 6429 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6431 verifyFormat( 6432 "if (a) {\n" 6433 " f();\n" 6434 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6436 "}"); 6437 6438 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6439 " 100000000 + 10000000) {\n}"); 6440 } 6441 6442 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6443 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6444 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6445 6446 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6447 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6448 6449 verifyFormat( 6450 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6451 " Parameter2);"); 6452 6453 verifyFormat( 6454 "ShortObject->shortFunction(\n" 6455 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6456 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6457 6458 verifyFormat("loooooooooooooongFunction(\n" 6459 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6460 6461 verifyFormat( 6462 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6463 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6464 6465 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6466 " .WillRepeatedly(Return(SomeValue));"); 6467 verifyFormat("void f() {\n" 6468 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6469 " .Times(2)\n" 6470 " .WillRepeatedly(Return(SomeValue));\n" 6471 "}"); 6472 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6473 " ccccccccccccccccccccccc);"); 6474 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6476 " .aaaaa(aaaaa),\n" 6477 " aaaaaaaaaaaaaaaaaaaaa);"); 6478 verifyFormat("void f() {\n" 6479 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6480 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6481 "}"); 6482 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6483 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6484 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6485 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6486 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6487 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6488 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6489 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6490 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6491 "}"); 6492 6493 // Here, it is not necessary to wrap at "." or "->". 6494 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6495 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6496 verifyFormat( 6497 "aaaaaaaaaaa->aaaaaaaaa(\n" 6498 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6499 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6500 6501 verifyFormat( 6502 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6504 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6505 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6506 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6507 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6508 6509 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6510 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6511 " .a();"); 6512 6513 FormatStyle NoBinPacking = getLLVMStyle(); 6514 NoBinPacking.BinPackParameters = false; 6515 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6516 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6517 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6518 " aaaaaaaaaaaaaaaaaaa,\n" 6519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6520 NoBinPacking); 6521 6522 // If there is a subsequent call, change to hanging indentation. 6523 verifyFormat( 6524 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6525 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6526 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6527 verifyFormat( 6528 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6529 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6530 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6532 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6533 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6534 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6535 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6536 } 6537 6538 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6539 verifyFormat("template <typename T>\n" 6540 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6541 verifyFormat("template <typename T>\n" 6542 "// T should be one of {A, B}.\n" 6543 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6544 verifyFormat( 6545 "template <typename T>\n" 6546 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6547 verifyFormat("template <typename T>\n" 6548 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6549 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6550 verifyFormat( 6551 "template <typename T>\n" 6552 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6553 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6554 verifyFormat( 6555 "template <typename T>\n" 6556 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6557 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6558 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6559 verifyFormat("template <typename T>\n" 6560 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6561 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6562 verifyFormat( 6563 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6564 " typename T4 = char>\n" 6565 "void f();"); 6566 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6567 " template <typename> class cccccccccccccccccccccc,\n" 6568 " typename ddddddddddddd>\n" 6569 "class C {};"); 6570 verifyFormat( 6571 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6573 6574 verifyFormat("void f() {\n" 6575 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6576 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6577 "}"); 6578 6579 verifyFormat("template <typename T> class C {};"); 6580 verifyFormat("template <typename T> void f();"); 6581 verifyFormat("template <typename T> void f() {}"); 6582 verifyFormat( 6583 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6585 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6586 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6587 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6589 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6590 getLLVMStyleWithColumns(72)); 6591 EXPECT_EQ("static_cast<A< //\n" 6592 " B> *>(\n" 6593 "\n" 6594 ");", 6595 format("static_cast<A<//\n" 6596 " B>*>(\n" 6597 "\n" 6598 " );")); 6599 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6600 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6601 6602 FormatStyle AlwaysBreak = getLLVMStyle(); 6603 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6604 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6605 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6606 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6607 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6608 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6609 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6610 verifyFormat("template <template <typename> class Fooooooo,\n" 6611 " template <typename> class Baaaaaaar>\n" 6612 "struct C {};", 6613 AlwaysBreak); 6614 verifyFormat("template <typename T> // T can be A, B or C.\n" 6615 "struct C {};", 6616 AlwaysBreak); 6617 verifyFormat("template <enum E> class A {\n" 6618 "public:\n" 6619 " E *f();\n" 6620 "};"); 6621 6622 FormatStyle NeverBreak = getLLVMStyle(); 6623 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6624 verifyFormat("template <typename T> class C {};", NeverBreak); 6625 verifyFormat("template <typename T> void f();", NeverBreak); 6626 verifyFormat("template <typename T> void f() {}", NeverBreak); 6627 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6628 "bbbbbbbbbbbbbbbbbbbb) {}", 6629 NeverBreak); 6630 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6631 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6632 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6633 NeverBreak); 6634 verifyFormat("template <template <typename> class Fooooooo,\n" 6635 " template <typename> class Baaaaaaar>\n" 6636 "struct C {};", 6637 NeverBreak); 6638 verifyFormat("template <typename T> // T can be A, B or C.\n" 6639 "struct C {};", 6640 NeverBreak); 6641 verifyFormat("template <enum E> class A {\n" 6642 "public:\n" 6643 " E *f();\n" 6644 "};", 6645 NeverBreak); 6646 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6647 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6648 "bbbbbbbbbbbbbbbbbbbb) {}", 6649 NeverBreak); 6650 } 6651 6652 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6653 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6654 Style.ColumnLimit = 60; 6655 EXPECT_EQ("// Baseline - no comments.\n" 6656 "template <\n" 6657 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6658 "void f() {}", 6659 format("// Baseline - no comments.\n" 6660 "template <\n" 6661 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6662 "void f() {}", 6663 Style)); 6664 6665 EXPECT_EQ("template <\n" 6666 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6667 "void f() {}", 6668 format("template <\n" 6669 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6670 "void f() {}", 6671 Style)); 6672 6673 EXPECT_EQ( 6674 "template <\n" 6675 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6676 "void f() {}", 6677 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6678 "void f() {}", 6679 Style)); 6680 6681 EXPECT_EQ( 6682 "template <\n" 6683 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6684 " // multiline\n" 6685 "void f() {}", 6686 format("template <\n" 6687 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6688 " // multiline\n" 6689 "void f() {}", 6690 Style)); 6691 6692 EXPECT_EQ( 6693 "template <typename aaaaaaaaaa<\n" 6694 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6695 "void f() {}", 6696 format( 6697 "template <\n" 6698 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6699 "void f() {}", 6700 Style)); 6701 } 6702 6703 TEST_F(FormatTest, WrapsTemplateParameters) { 6704 FormatStyle Style = getLLVMStyle(); 6705 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6706 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6707 verifyFormat( 6708 "template <typename... a> struct q {};\n" 6709 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6710 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6711 " y;", 6712 Style); 6713 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6714 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6715 verifyFormat( 6716 "template <typename... a> struct r {};\n" 6717 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6718 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6719 " y;", 6720 Style); 6721 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6722 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6723 verifyFormat("template <typename... a> struct s {};\n" 6724 "extern s<\n" 6725 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6726 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6727 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6728 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6729 " y;", 6730 Style); 6731 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6732 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6733 verifyFormat("template <typename... a> struct t {};\n" 6734 "extern t<\n" 6735 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6736 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6737 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6738 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6739 " y;", 6740 Style); 6741 } 6742 6743 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6744 verifyFormat( 6745 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6746 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6747 verifyFormat( 6748 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6751 6752 // FIXME: Should we have the extra indent after the second break? 6753 verifyFormat( 6754 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6755 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6757 6758 verifyFormat( 6759 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6760 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6761 6762 // Breaking at nested name specifiers is generally not desirable. 6763 verifyFormat( 6764 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6765 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6766 6767 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 6768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6769 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6770 " aaaaaaaaaaaaaaaaaaaaa);", 6771 getLLVMStyleWithColumns(74)); 6772 6773 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6775 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6776 } 6777 6778 TEST_F(FormatTest, UnderstandsTemplateParameters) { 6779 verifyFormat("A<int> a;"); 6780 verifyFormat("A<A<A<int>>> a;"); 6781 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 6782 verifyFormat("bool x = a < 1 || 2 > a;"); 6783 verifyFormat("bool x = 5 < f<int>();"); 6784 verifyFormat("bool x = f<int>() > 5;"); 6785 verifyFormat("bool x = 5 < a<int>::x;"); 6786 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 6787 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 6788 6789 verifyGoogleFormat("A<A<int>> a;"); 6790 verifyGoogleFormat("A<A<A<int>>> a;"); 6791 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 6792 verifyGoogleFormat("A<A<int> > a;"); 6793 verifyGoogleFormat("A<A<A<int> > > a;"); 6794 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 6795 verifyGoogleFormat("A<::A<int>> a;"); 6796 verifyGoogleFormat("A<::A> a;"); 6797 verifyGoogleFormat("A< ::A> a;"); 6798 verifyGoogleFormat("A< ::A<int> > a;"); 6799 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 6800 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 6801 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 6802 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 6803 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 6804 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 6805 6806 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 6807 6808 // template closer followed by a token that starts with > or = 6809 verifyFormat("bool b = a<1> > 1;"); 6810 verifyFormat("bool b = a<1> >= 1;"); 6811 verifyFormat("int i = a<1> >> 1;"); 6812 FormatStyle Style = getLLVMStyle(); 6813 Style.SpaceBeforeAssignmentOperators = false; 6814 verifyFormat("bool b= a<1> == 1;", Style); 6815 verifyFormat("a<int> = 1;", Style); 6816 verifyFormat("a<int> >>= 1;", Style); 6817 6818 verifyFormat("test >> a >> b;"); 6819 verifyFormat("test << a >> b;"); 6820 6821 verifyFormat("f<int>();"); 6822 verifyFormat("template <typename T> void f() {}"); 6823 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 6824 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 6825 "sizeof(char)>::type>;"); 6826 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 6827 verifyFormat("f(a.operator()<A>());"); 6828 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6829 " .template operator()<A>());", 6830 getLLVMStyleWithColumns(35)); 6831 6832 // Not template parameters. 6833 verifyFormat("return a < b && c > d;"); 6834 verifyFormat("void f() {\n" 6835 " while (a < b && c > d) {\n" 6836 " }\n" 6837 "}"); 6838 verifyFormat("template <typename... Types>\n" 6839 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 6840 6841 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 6843 getLLVMStyleWithColumns(60)); 6844 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 6845 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 6846 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 6847 } 6848 6849 TEST_F(FormatTest, BitshiftOperatorWidth) { 6850 EXPECT_EQ("int a = 1 << 2; /* foo\n" 6851 " bar */", 6852 format("int a=1<<2; /* foo\n" 6853 " bar */")); 6854 6855 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 6856 " bar */", 6857 format("int b =256>>1 ; /* foo\n" 6858 " bar */")); 6859 } 6860 6861 TEST_F(FormatTest, UnderstandsBinaryOperators) { 6862 verifyFormat("COMPARE(a, ==, b);"); 6863 verifyFormat("auto s = sizeof...(Ts) - 1;"); 6864 } 6865 6866 TEST_F(FormatTest, UnderstandsPointersToMembers) { 6867 verifyFormat("int A::*x;"); 6868 verifyFormat("int (S::*func)(void *);"); 6869 verifyFormat("void f() { int (S::*func)(void *); }"); 6870 verifyFormat("typedef bool *(Class::*Member)() const;"); 6871 verifyFormat("void f() {\n" 6872 " (a->*f)();\n" 6873 " a->*x;\n" 6874 " (a.*f)();\n" 6875 " ((*a).*f)();\n" 6876 " a.*x;\n" 6877 "}"); 6878 verifyFormat("void f() {\n" 6879 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 6880 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 6881 "}"); 6882 verifyFormat( 6883 "(aaaaaaaaaa->*bbbbbbb)(\n" 6884 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6885 FormatStyle Style = getLLVMStyle(); 6886 Style.PointerAlignment = FormatStyle::PAS_Left; 6887 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 6888 } 6889 6890 TEST_F(FormatTest, UnderstandsUnaryOperators) { 6891 verifyFormat("int a = -2;"); 6892 verifyFormat("f(-1, -2, -3);"); 6893 verifyFormat("a[-1] = 5;"); 6894 verifyFormat("int a = 5 + -2;"); 6895 verifyFormat("if (i == -1) {\n}"); 6896 verifyFormat("if (i != -1) {\n}"); 6897 verifyFormat("if (i > -1) {\n}"); 6898 verifyFormat("if (i < -1) {\n}"); 6899 verifyFormat("++(a->f());"); 6900 verifyFormat("--(a->f());"); 6901 verifyFormat("(a->f())++;"); 6902 verifyFormat("a[42]++;"); 6903 verifyFormat("if (!(a->f())) {\n}"); 6904 verifyFormat("if (!+i) {\n}"); 6905 verifyFormat("~&a;"); 6906 6907 verifyFormat("a-- > b;"); 6908 verifyFormat("b ? -a : c;"); 6909 verifyFormat("n * sizeof char16;"); 6910 verifyFormat("n * alignof char16;", getGoogleStyle()); 6911 verifyFormat("sizeof(char);"); 6912 verifyFormat("alignof(char);", getGoogleStyle()); 6913 6914 verifyFormat("return -1;"); 6915 verifyFormat("throw -1;"); 6916 verifyFormat("switch (a) {\n" 6917 "case -1:\n" 6918 " break;\n" 6919 "}"); 6920 verifyFormat("#define X -1"); 6921 verifyFormat("#define X -kConstant"); 6922 6923 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 6924 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 6925 6926 verifyFormat("int a = /* confusing comment */ -1;"); 6927 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 6928 verifyFormat("int a = i /* confusing comment */++;"); 6929 } 6930 6931 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 6932 verifyFormat("if (!aaaaaaaaaa( // break\n" 6933 " aaaaa)) {\n" 6934 "}"); 6935 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 6936 " aaaaa));"); 6937 verifyFormat("*aaa = aaaaaaa( // break\n" 6938 " bbbbbb);"); 6939 } 6940 6941 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 6942 verifyFormat("bool operator<();"); 6943 verifyFormat("bool operator>();"); 6944 verifyFormat("bool operator=();"); 6945 verifyFormat("bool operator==();"); 6946 verifyFormat("bool operator!=();"); 6947 verifyFormat("int operator+();"); 6948 verifyFormat("int operator++();"); 6949 verifyFormat("int operator++(int) volatile noexcept;"); 6950 verifyFormat("bool operator,();"); 6951 verifyFormat("bool operator();"); 6952 verifyFormat("bool operator()();"); 6953 verifyFormat("bool operator[]();"); 6954 verifyFormat("operator bool();"); 6955 verifyFormat("operator int();"); 6956 verifyFormat("operator void *();"); 6957 verifyFormat("operator SomeType<int>();"); 6958 verifyFormat("operator SomeType<int, int>();"); 6959 verifyFormat("operator SomeType<SomeType<int>>();"); 6960 verifyFormat("void *operator new(std::size_t size);"); 6961 verifyFormat("void *operator new[](std::size_t size);"); 6962 verifyFormat("void operator delete(void *ptr);"); 6963 verifyFormat("void operator delete[](void *ptr);"); 6964 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 6965 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 6966 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 6967 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 6968 6969 verifyFormat( 6970 "ostream &operator<<(ostream &OutputStream,\n" 6971 " SomeReallyLongType WithSomeReallyLongValue);"); 6972 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 6973 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 6974 " return left.group < right.group;\n" 6975 "}"); 6976 verifyFormat("SomeType &operator=(const SomeType &S);"); 6977 verifyFormat("f.template operator()<int>();"); 6978 6979 verifyGoogleFormat("operator void*();"); 6980 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 6981 verifyGoogleFormat("operator ::A();"); 6982 6983 verifyFormat("using A::operator+;"); 6984 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 6985 "int i;"); 6986 } 6987 6988 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 6989 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 6990 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 6991 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 6992 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 6993 verifyFormat("Deleted &operator=(const Deleted &) &;"); 6994 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 6995 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 6996 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 6997 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 6998 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 6999 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7000 verifyFormat("void Fn(T const &) const &;"); 7001 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7002 verifyFormat("template <typename T>\n" 7003 "void F(T) && = delete;", 7004 getGoogleStyle()); 7005 7006 FormatStyle AlignLeft = getLLVMStyle(); 7007 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7008 verifyFormat("void A::b() && {}", AlignLeft); 7009 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7010 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7011 AlignLeft); 7012 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7013 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7014 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7015 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7016 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7017 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7018 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7019 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7020 7021 FormatStyle Spaces = getLLVMStyle(); 7022 Spaces.SpacesInCStyleCastParentheses = true; 7023 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7024 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7025 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7026 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7027 7028 Spaces.SpacesInCStyleCastParentheses = false; 7029 Spaces.SpacesInParentheses = true; 7030 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7031 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7032 Spaces); 7033 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7034 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7035 7036 FormatStyle BreakTemplate = getLLVMStyle(); 7037 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7038 7039 verifyFormat("struct f {\n" 7040 " template <class T>\n" 7041 " int &foo(const std::string &str) &noexcept {}\n" 7042 "};", 7043 BreakTemplate); 7044 7045 verifyFormat("struct f {\n" 7046 " template <class T>\n" 7047 " int &foo(const std::string &str) &&noexcept {}\n" 7048 "};", 7049 BreakTemplate); 7050 7051 verifyFormat("struct f {\n" 7052 " template <class T>\n" 7053 " int &foo(const std::string &str) const &noexcept {}\n" 7054 "};", 7055 BreakTemplate); 7056 7057 verifyFormat("struct f {\n" 7058 " template <class T>\n" 7059 " int &foo(const std::string &str) const &noexcept {}\n" 7060 "};", 7061 BreakTemplate); 7062 7063 verifyFormat("struct f {\n" 7064 " template <class T>\n" 7065 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7066 "};", 7067 BreakTemplate); 7068 7069 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7070 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7071 FormatStyle::BTDS_Yes; 7072 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7073 7074 verifyFormat("struct f {\n" 7075 " template <class T>\n" 7076 " int& foo(const std::string& str) & noexcept {}\n" 7077 "};", 7078 AlignLeftBreakTemplate); 7079 7080 verifyFormat("struct f {\n" 7081 " template <class T>\n" 7082 " int& foo(const std::string& str) && noexcept {}\n" 7083 "};", 7084 AlignLeftBreakTemplate); 7085 7086 verifyFormat("struct f {\n" 7087 " template <class T>\n" 7088 " int& foo(const std::string& str) const& noexcept {}\n" 7089 "};", 7090 AlignLeftBreakTemplate); 7091 7092 verifyFormat("struct f {\n" 7093 " template <class T>\n" 7094 " int& foo(const std::string& str) const&& noexcept {}\n" 7095 "};", 7096 AlignLeftBreakTemplate); 7097 7098 verifyFormat("struct f {\n" 7099 " template <class T>\n" 7100 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7101 "};", 7102 AlignLeftBreakTemplate); 7103 7104 // The `&` in `Type&` should not be confused with a trailing `&` of 7105 // DEPRECATED(reason) member function. 7106 verifyFormat("struct f {\n" 7107 " template <class T>\n" 7108 " DEPRECATED(reason)\n" 7109 " Type &foo(arguments) {}\n" 7110 "};", 7111 BreakTemplate); 7112 7113 verifyFormat("struct f {\n" 7114 " template <class T>\n" 7115 " DEPRECATED(reason)\n" 7116 " Type& foo(arguments) {}\n" 7117 "};", 7118 AlignLeftBreakTemplate); 7119 7120 verifyFormat("void (*foopt)(int) = &func;"); 7121 } 7122 7123 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7124 verifyFormat("void f() {\n" 7125 " A *a = new A;\n" 7126 " A *a = new (placement) A;\n" 7127 " delete a;\n" 7128 " delete (A *)a;\n" 7129 "}"); 7130 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7131 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7132 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7133 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7134 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7135 verifyFormat("delete[] h->p;"); 7136 } 7137 7138 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7139 verifyFormat("int *f(int *a) {}"); 7140 verifyFormat("int main(int argc, char **argv) {}"); 7141 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7142 verifyIndependentOfContext("f(a, *a);"); 7143 verifyFormat("void g() { f(*a); }"); 7144 verifyIndependentOfContext("int a = b * 10;"); 7145 verifyIndependentOfContext("int a = 10 * b;"); 7146 verifyIndependentOfContext("int a = b * c;"); 7147 verifyIndependentOfContext("int a += b * c;"); 7148 verifyIndependentOfContext("int a -= b * c;"); 7149 verifyIndependentOfContext("int a *= b * c;"); 7150 verifyIndependentOfContext("int a /= b * c;"); 7151 verifyIndependentOfContext("int a = *b;"); 7152 verifyIndependentOfContext("int a = *b * c;"); 7153 verifyIndependentOfContext("int a = b * *c;"); 7154 verifyIndependentOfContext("int a = b * (10);"); 7155 verifyIndependentOfContext("S << b * (10);"); 7156 verifyIndependentOfContext("return 10 * b;"); 7157 verifyIndependentOfContext("return *b * *c;"); 7158 verifyIndependentOfContext("return a & ~b;"); 7159 verifyIndependentOfContext("f(b ? *c : *d);"); 7160 verifyIndependentOfContext("int a = b ? *c : *d;"); 7161 verifyIndependentOfContext("*b = a;"); 7162 verifyIndependentOfContext("a * ~b;"); 7163 verifyIndependentOfContext("a * !b;"); 7164 verifyIndependentOfContext("a * +b;"); 7165 verifyIndependentOfContext("a * -b;"); 7166 verifyIndependentOfContext("a * ++b;"); 7167 verifyIndependentOfContext("a * --b;"); 7168 verifyIndependentOfContext("a[4] * b;"); 7169 verifyIndependentOfContext("a[a * a] = 1;"); 7170 verifyIndependentOfContext("f() * b;"); 7171 verifyIndependentOfContext("a * [self dostuff];"); 7172 verifyIndependentOfContext("int x = a * (a + b);"); 7173 verifyIndependentOfContext("(a *)(a + b);"); 7174 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7175 verifyIndependentOfContext("int *pa = (int *)&a;"); 7176 verifyIndependentOfContext("return sizeof(int **);"); 7177 verifyIndependentOfContext("return sizeof(int ******);"); 7178 verifyIndependentOfContext("return (int **&)a;"); 7179 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7180 verifyFormat("void f(Type (*parameter)[10]) {}"); 7181 verifyFormat("void f(Type (¶meter)[10]) {}"); 7182 verifyGoogleFormat("return sizeof(int**);"); 7183 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7184 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7185 verifyFormat("auto a = [](int **&, int ***) {};"); 7186 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7187 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7188 verifyFormat("[](const decltype(*a) &value) {}"); 7189 verifyFormat("decltype(a * b) F();"); 7190 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7191 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7192 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7193 verifyIndependentOfContext("int i{a * b};"); 7194 verifyIndependentOfContext("aaa && aaa->f();"); 7195 verifyIndependentOfContext("int x = ~*p;"); 7196 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7197 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7198 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7199 verifyFormat("void f() { f(a, c * d); }"); 7200 verifyFormat("void f() { f(new a(), c * d); }"); 7201 verifyFormat("void f(const MyOverride &override);"); 7202 verifyFormat("void f(const MyFinal &final);"); 7203 verifyIndependentOfContext("bool a = f() && override.f();"); 7204 verifyIndependentOfContext("bool a = f() && final.f();"); 7205 7206 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7207 7208 verifyIndependentOfContext("A<int *> a;"); 7209 verifyIndependentOfContext("A<int **> a;"); 7210 verifyIndependentOfContext("A<int *, int *> a;"); 7211 verifyIndependentOfContext("A<int *[]> a;"); 7212 verifyIndependentOfContext( 7213 "const char *const p = reinterpret_cast<const char *const>(q);"); 7214 verifyIndependentOfContext("A<int **, int **> a;"); 7215 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7216 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7217 verifyFormat("for (; a && b;) {\n}"); 7218 verifyFormat("bool foo = true && [] { return false; }();"); 7219 7220 verifyFormat( 7221 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7223 7224 verifyGoogleFormat("int const* a = &b;"); 7225 verifyGoogleFormat("**outparam = 1;"); 7226 verifyGoogleFormat("*outparam = a * b;"); 7227 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7228 verifyGoogleFormat("A<int*> a;"); 7229 verifyGoogleFormat("A<int**> a;"); 7230 verifyGoogleFormat("A<int*, int*> a;"); 7231 verifyGoogleFormat("A<int**, int**> a;"); 7232 verifyGoogleFormat("f(b ? *c : *d);"); 7233 verifyGoogleFormat("int a = b ? *c : *d;"); 7234 verifyGoogleFormat("Type* t = **x;"); 7235 verifyGoogleFormat("Type* t = *++*x;"); 7236 verifyGoogleFormat("*++*x;"); 7237 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7238 verifyGoogleFormat("Type* t = x++ * y;"); 7239 verifyGoogleFormat( 7240 "const char* const p = reinterpret_cast<const char* const>(q);"); 7241 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7242 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7243 verifyGoogleFormat("template <typename T>\n" 7244 "void f(int i = 0, SomeType** temps = NULL);"); 7245 7246 FormatStyle Left = getLLVMStyle(); 7247 Left.PointerAlignment = FormatStyle::PAS_Left; 7248 verifyFormat("x = *a(x) = *a(y);", Left); 7249 verifyFormat("for (;; *a = b) {\n}", Left); 7250 verifyFormat("return *this += 1;", Left); 7251 verifyFormat("throw *x;", Left); 7252 verifyFormat("delete *x;", Left); 7253 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7254 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7255 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7256 7257 verifyIndependentOfContext("a = *(x + y);"); 7258 verifyIndependentOfContext("a = &(x + y);"); 7259 verifyIndependentOfContext("*(x + y).call();"); 7260 verifyIndependentOfContext("&(x + y)->call();"); 7261 verifyFormat("void f() { &(*I).first; }"); 7262 7263 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7264 verifyFormat( 7265 "int *MyValues = {\n" 7266 " *A, // Operator detection might be confused by the '{'\n" 7267 " *BB // Operator detection might be confused by previous comment\n" 7268 "};"); 7269 7270 verifyIndependentOfContext("if (int *a = &b)"); 7271 verifyIndependentOfContext("if (int &a = *b)"); 7272 verifyIndependentOfContext("if (a & b[i])"); 7273 verifyIndependentOfContext("if constexpr (a & b[i])"); 7274 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7275 verifyIndependentOfContext("if (a * (b * c))"); 7276 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7277 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7278 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7279 verifyIndependentOfContext("if (*b[i])"); 7280 verifyIndependentOfContext("if (int *a = (&b))"); 7281 verifyIndependentOfContext("while (int *a = &b)"); 7282 verifyIndependentOfContext("while (a * (b * c))"); 7283 verifyIndependentOfContext("size = sizeof *a;"); 7284 verifyIndependentOfContext("if (a && (b = c))"); 7285 verifyFormat("void f() {\n" 7286 " for (const int &v : Values) {\n" 7287 " }\n" 7288 "}"); 7289 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7290 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7291 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7292 7293 verifyFormat("#define A (!a * b)"); 7294 verifyFormat("#define MACRO \\\n" 7295 " int *i = a * b; \\\n" 7296 " void f(a *b);", 7297 getLLVMStyleWithColumns(19)); 7298 7299 verifyIndependentOfContext("A = new SomeType *[Length];"); 7300 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7301 verifyIndependentOfContext("T **t = new T *;"); 7302 verifyIndependentOfContext("T **t = new T *();"); 7303 verifyGoogleFormat("A = new SomeType*[Length]();"); 7304 verifyGoogleFormat("A = new SomeType*[Length];"); 7305 verifyGoogleFormat("T** t = new T*;"); 7306 verifyGoogleFormat("T** t = new T*();"); 7307 7308 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7309 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7310 verifyFormat("template <bool a, bool b> " 7311 "typename t::if<x && y>::type f() {}"); 7312 verifyFormat("template <int *y> f() {}"); 7313 verifyFormat("vector<int *> v;"); 7314 verifyFormat("vector<int *const> v;"); 7315 verifyFormat("vector<int *const **const *> v;"); 7316 verifyFormat("vector<int *volatile> v;"); 7317 verifyFormat("vector<a * b> v;"); 7318 verifyFormat("foo<b && false>();"); 7319 verifyFormat("foo<b & 1>();"); 7320 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7321 verifyFormat( 7322 "template <class T, class = typename std::enable_if<\n" 7323 " std::is_integral<T>::value &&\n" 7324 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7325 "void F();", 7326 getLLVMStyleWithColumns(70)); 7327 verifyFormat("template <class T,\n" 7328 " class = typename std::enable_if<\n" 7329 " std::is_integral<T>::value &&\n" 7330 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7331 " class U>\n" 7332 "void F();", 7333 getLLVMStyleWithColumns(70)); 7334 verifyFormat( 7335 "template <class T,\n" 7336 " class = typename ::std::enable_if<\n" 7337 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7338 "void F();", 7339 getGoogleStyleWithColumns(68)); 7340 7341 verifyIndependentOfContext("MACRO(int *i);"); 7342 verifyIndependentOfContext("MACRO(auto *a);"); 7343 verifyIndependentOfContext("MACRO(const A *a);"); 7344 verifyIndependentOfContext("MACRO(A *const a);"); 7345 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7346 verifyFormat("void f() { f(float{1}, a * a); }"); 7347 // FIXME: Is there a way to make this work? 7348 // verifyIndependentOfContext("MACRO(A *a);"); 7349 7350 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7351 verifyFormat("return options != nullptr && operator==(*options);"); 7352 7353 EXPECT_EQ("#define OP(x) \\\n" 7354 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7355 " return s << a.DebugString(); \\\n" 7356 " }", 7357 format("#define OP(x) \\\n" 7358 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7359 " return s << a.DebugString(); \\\n" 7360 " }", 7361 getLLVMStyleWithColumns(50))); 7362 7363 // FIXME: We cannot handle this case yet; we might be able to figure out that 7364 // foo<x> d > v; doesn't make sense. 7365 verifyFormat("foo<a<b && c> d> v;"); 7366 7367 FormatStyle PointerMiddle = getLLVMStyle(); 7368 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7369 verifyFormat("delete *x;", PointerMiddle); 7370 verifyFormat("int * x;", PointerMiddle); 7371 verifyFormat("int *[] x;", PointerMiddle); 7372 verifyFormat("template <int * y> f() {}", PointerMiddle); 7373 verifyFormat("int * f(int * a) {}", PointerMiddle); 7374 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7375 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7376 verifyFormat("A<int *> a;", PointerMiddle); 7377 verifyFormat("A<int **> a;", PointerMiddle); 7378 verifyFormat("A<int *, int *> a;", PointerMiddle); 7379 verifyFormat("A<int *[]> a;", PointerMiddle); 7380 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7381 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7382 verifyFormat("T ** t = new T *;", PointerMiddle); 7383 7384 // Member function reference qualifiers aren't binary operators. 7385 verifyFormat("string // break\n" 7386 "operator()() & {}"); 7387 verifyFormat("string // break\n" 7388 "operator()() && {}"); 7389 verifyGoogleFormat("template <typename T>\n" 7390 "auto x() & -> int {}"); 7391 } 7392 7393 TEST_F(FormatTest, UnderstandsAttributes) { 7394 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7395 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7396 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7397 FormatStyle AfterType = getLLVMStyle(); 7398 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7399 verifyFormat("__attribute__((nodebug)) void\n" 7400 "foo() {}\n", 7401 AfterType); 7402 } 7403 7404 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7405 verifyFormat("SomeType s [[unused]] (InitValue);"); 7406 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7407 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7408 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7409 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7410 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7411 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7412 7413 // Make sure we do not mistake attributes for array subscripts. 7414 verifyFormat("int a() {}\n" 7415 "[[unused]] int b() {}\n"); 7416 verifyFormat("NSArray *arr;\n" 7417 "arr[[Foo() bar]];"); 7418 7419 // On the other hand, we still need to correctly find array subscripts. 7420 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7421 7422 // Make sure that we do not mistake Objective-C method inside array literals 7423 // as attributes, even if those method names are also keywords. 7424 verifyFormat("@[ [foo bar] ];"); 7425 verifyFormat("@[ [NSArray class] ];"); 7426 verifyFormat("@[ [foo enum] ];"); 7427 7428 // Make sure we do not parse attributes as lambda introducers. 7429 FormatStyle MultiLineFunctions = getLLVMStyle(); 7430 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7431 verifyFormat("[[unused]] int b() {\n" 7432 " return 42;\n" 7433 "}\n", 7434 MultiLineFunctions); 7435 } 7436 7437 TEST_F(FormatTest, UnderstandsEllipsis) { 7438 verifyFormat("int printf(const char *fmt, ...);"); 7439 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7440 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7441 7442 FormatStyle PointersLeft = getLLVMStyle(); 7443 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7444 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7445 } 7446 7447 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7448 EXPECT_EQ("int *a;\n" 7449 "int *a;\n" 7450 "int *a;", 7451 format("int *a;\n" 7452 "int* a;\n" 7453 "int *a;", 7454 getGoogleStyle())); 7455 EXPECT_EQ("int* a;\n" 7456 "int* a;\n" 7457 "int* a;", 7458 format("int* a;\n" 7459 "int* a;\n" 7460 "int *a;", 7461 getGoogleStyle())); 7462 EXPECT_EQ("int *a;\n" 7463 "int *a;\n" 7464 "int *a;", 7465 format("int *a;\n" 7466 "int * a;\n" 7467 "int * a;", 7468 getGoogleStyle())); 7469 EXPECT_EQ("auto x = [] {\n" 7470 " int *a;\n" 7471 " int *a;\n" 7472 " int *a;\n" 7473 "};", 7474 format("auto x=[]{int *a;\n" 7475 "int * a;\n" 7476 "int * a;};", 7477 getGoogleStyle())); 7478 } 7479 7480 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7481 verifyFormat("int f(int &&a) {}"); 7482 verifyFormat("int f(int a, char &&b) {}"); 7483 verifyFormat("void f() { int &&a = b; }"); 7484 verifyGoogleFormat("int f(int a, char&& b) {}"); 7485 verifyGoogleFormat("void f() { int&& a = b; }"); 7486 7487 verifyIndependentOfContext("A<int &&> a;"); 7488 verifyIndependentOfContext("A<int &&, int &&> a;"); 7489 verifyGoogleFormat("A<int&&> a;"); 7490 verifyGoogleFormat("A<int&&, int&&> a;"); 7491 7492 // Not rvalue references: 7493 verifyFormat("template <bool B, bool C> class A {\n" 7494 " static_assert(B && C, \"Something is wrong\");\n" 7495 "};"); 7496 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7497 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7498 verifyFormat("#define A(a, b) (a && b)"); 7499 } 7500 7501 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7502 verifyFormat("void f() {\n" 7503 " x[aaaaaaaaa -\n" 7504 " b] = 23;\n" 7505 "}", 7506 getLLVMStyleWithColumns(15)); 7507 } 7508 7509 TEST_F(FormatTest, FormatsCasts) { 7510 verifyFormat("Type *A = static_cast<Type *>(P);"); 7511 verifyFormat("Type *A = (Type *)P;"); 7512 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7513 verifyFormat("int a = (int)(2.0f);"); 7514 verifyFormat("int a = (int)2.0f;"); 7515 verifyFormat("x[(int32)y];"); 7516 verifyFormat("x = (int32)y;"); 7517 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7518 verifyFormat("int a = (int)*b;"); 7519 verifyFormat("int a = (int)2.0f;"); 7520 verifyFormat("int a = (int)~0;"); 7521 verifyFormat("int a = (int)++a;"); 7522 verifyFormat("int a = (int)sizeof(int);"); 7523 verifyFormat("int a = (int)+2;"); 7524 verifyFormat("my_int a = (my_int)2.0f;"); 7525 verifyFormat("my_int a = (my_int)sizeof(int);"); 7526 verifyFormat("return (my_int)aaa;"); 7527 verifyFormat("#define x ((int)-1)"); 7528 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7529 verifyFormat("#define p(q) ((int *)&q)"); 7530 verifyFormat("fn(a)(b) + 1;"); 7531 7532 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7533 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7534 verifyFormat("my_int a = (my_int)~0;"); 7535 verifyFormat("my_int a = (my_int)++a;"); 7536 verifyFormat("my_int a = (my_int)-2;"); 7537 verifyFormat("my_int a = (my_int)1;"); 7538 verifyFormat("my_int a = (my_int *)1;"); 7539 verifyFormat("my_int a = (const my_int)-1;"); 7540 verifyFormat("my_int a = (const my_int *)-1;"); 7541 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7542 verifyFormat("my_int a = (ns::my_int)-2;"); 7543 verifyFormat("case (my_int)ONE:"); 7544 verifyFormat("auto x = (X)this;"); 7545 // Casts in Obj-C style calls used to not be recognized as such. 7546 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 7547 7548 // FIXME: single value wrapped with paren will be treated as cast. 7549 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7550 7551 verifyFormat("{ (void)F; }"); 7552 7553 // Don't break after a cast's 7554 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7555 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7556 " bbbbbbbbbbbbbbbbbbbbbb);"); 7557 7558 // These are not casts. 7559 verifyFormat("void f(int *) {}"); 7560 verifyFormat("f(foo)->b;"); 7561 verifyFormat("f(foo).b;"); 7562 verifyFormat("f(foo)(b);"); 7563 verifyFormat("f(foo)[b];"); 7564 verifyFormat("[](foo) { return 4; }(bar);"); 7565 verifyFormat("(*funptr)(foo)[4];"); 7566 verifyFormat("funptrs[4](foo)[4];"); 7567 verifyFormat("void f(int *);"); 7568 verifyFormat("void f(int *) = 0;"); 7569 verifyFormat("void f(SmallVector<int>) {}"); 7570 verifyFormat("void f(SmallVector<int>);"); 7571 verifyFormat("void f(SmallVector<int>) = 0;"); 7572 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7573 verifyFormat("int a = sizeof(int) * b;"); 7574 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7575 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7576 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7577 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7578 7579 // These are not casts, but at some point were confused with casts. 7580 verifyFormat("virtual void foo(int *) override;"); 7581 verifyFormat("virtual void foo(char &) const;"); 7582 verifyFormat("virtual void foo(int *a, char *) const;"); 7583 verifyFormat("int a = sizeof(int *) + b;"); 7584 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7585 verifyFormat("bool b = f(g<int>) && c;"); 7586 verifyFormat("typedef void (*f)(int i) func;"); 7587 verifyFormat("void operator++(int) noexcept;"); 7588 verifyFormat("void operator++(int &) noexcept;"); 7589 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 7590 "&) noexcept;"); 7591 verifyFormat( 7592 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 7593 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 7594 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 7595 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 7596 verifyFormat("void operator delete(foo &) noexcept;"); 7597 verifyFormat("void operator delete(foo) noexcept;"); 7598 verifyFormat("void operator delete(int) noexcept;"); 7599 verifyFormat("void operator delete(int &) noexcept;"); 7600 verifyFormat("void operator delete(int &) volatile noexcept;"); 7601 verifyFormat("void operator delete(int &) const"); 7602 verifyFormat("void operator delete(int &) = default"); 7603 verifyFormat("void operator delete(int &) = delete"); 7604 verifyFormat("void operator delete(int &) [[noreturn]]"); 7605 verifyFormat("void operator delete(int &) throw();"); 7606 verifyFormat("void operator delete(int &) throw(int);"); 7607 verifyFormat("auto operator delete(int &) -> int;"); 7608 verifyFormat("auto operator delete(int &) override"); 7609 verifyFormat("auto operator delete(int &) final"); 7610 7611 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7612 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7613 // FIXME: The indentation here is not ideal. 7614 verifyFormat( 7615 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7616 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7617 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7618 } 7619 7620 TEST_F(FormatTest, FormatsFunctionTypes) { 7621 verifyFormat("A<bool()> a;"); 7622 verifyFormat("A<SomeType()> a;"); 7623 verifyFormat("A<void (*)(int, std::string)> a;"); 7624 verifyFormat("A<void *(int)>;"); 7625 verifyFormat("void *(*a)(int *, SomeType *);"); 7626 verifyFormat("int (*func)(void *);"); 7627 verifyFormat("void f() { int (*func)(void *); }"); 7628 verifyFormat("template <class CallbackClass>\n" 7629 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7630 7631 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7632 verifyGoogleFormat("void* (*a)(int);"); 7633 verifyGoogleFormat( 7634 "template <class CallbackClass>\n" 7635 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7636 7637 // Other constructs can look somewhat like function types: 7638 verifyFormat("A<sizeof(*x)> a;"); 7639 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7640 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7641 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7642 verifyFormat("int x = f(&h)();"); 7643 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7644 verifyFormat("std::function<\n" 7645 " LooooooooooongTemplatedType<\n" 7646 " SomeType>*(\n" 7647 " LooooooooooooooooongType type)>\n" 7648 " function;", 7649 getGoogleStyleWithColumns(40)); 7650 } 7651 7652 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7653 verifyFormat("A (*foo_)[6];"); 7654 verifyFormat("vector<int> (*foo_)[6];"); 7655 } 7656 7657 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7658 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7659 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7660 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7661 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7662 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7663 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7664 7665 // Different ways of ()-initializiation. 7666 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7667 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7668 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7669 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7670 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7671 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7672 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7673 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7674 7675 // Lambdas should not confuse the variable declaration heuristic. 7676 verifyFormat("LooooooooooooooooongType\n" 7677 " variable(nullptr, [](A *a) {});", 7678 getLLVMStyleWithColumns(40)); 7679 } 7680 7681 TEST_F(FormatTest, BreaksLongDeclarations) { 7682 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7683 " AnotherNameForTheLongType;"); 7684 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7686 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7687 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7688 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7689 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7690 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7691 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7692 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7693 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7694 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7695 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7696 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7697 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7698 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7699 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7700 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7701 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7702 FormatStyle Indented = getLLVMStyle(); 7703 Indented.IndentWrappedFunctionNames = true; 7704 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7705 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7706 Indented); 7707 verifyFormat( 7708 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7709 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7710 Indented); 7711 verifyFormat( 7712 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7713 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7714 Indented); 7715 verifyFormat( 7716 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7717 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7718 Indented); 7719 7720 // FIXME: Without the comment, this breaks after "(". 7721 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7722 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7723 getGoogleStyle()); 7724 7725 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7726 " int LoooooooooooooooooooongParam2) {}"); 7727 verifyFormat( 7728 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7729 " SourceLocation L, IdentifierIn *II,\n" 7730 " Type *T) {}"); 7731 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7732 "ReallyReaaallyLongFunctionName(\n" 7733 " const std::string &SomeParameter,\n" 7734 " const SomeType<string, SomeOtherTemplateParameter>\n" 7735 " &ReallyReallyLongParameterName,\n" 7736 " const SomeType<string, SomeOtherTemplateParameter>\n" 7737 " &AnotherLongParameterName) {}"); 7738 verifyFormat("template <typename A>\n" 7739 "SomeLoooooooooooooooooooooongType<\n" 7740 " typename some_namespace::SomeOtherType<A>::Type>\n" 7741 "Function() {}"); 7742 7743 verifyGoogleFormat( 7744 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7745 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7746 verifyGoogleFormat( 7747 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7748 " SourceLocation L) {}"); 7749 verifyGoogleFormat( 7750 "some_namespace::LongReturnType\n" 7751 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7752 " int first_long_parameter, int second_parameter) {}"); 7753 7754 verifyGoogleFormat("template <typename T>\n" 7755 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7756 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7757 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7758 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7759 7760 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7761 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7762 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7763 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7764 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7765 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7766 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7767 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7769 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7770 7771 verifyFormat("template <typename T> // Templates on own line.\n" 7772 "static int // Some comment.\n" 7773 "MyFunction(int a);", 7774 getLLVMStyle()); 7775 } 7776 7777 TEST_F(FormatTest, FormatsArrays) { 7778 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7779 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7780 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7781 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7782 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7783 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7784 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7785 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7786 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7787 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7788 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7789 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7790 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7791 verifyFormat( 7792 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7793 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7794 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7795 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7796 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7797 7798 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7799 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7800 verifyFormat( 7801 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 7802 " .aaaaaaa[0]\n" 7803 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7804 verifyFormat("a[::b::c];"); 7805 7806 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 7807 7808 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 7809 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 7810 } 7811 7812 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 7813 verifyFormat("(a)->b();"); 7814 verifyFormat("--a;"); 7815 } 7816 7817 TEST_F(FormatTest, HandlesIncludeDirectives) { 7818 verifyFormat("#include <string>\n" 7819 "#include <a/b/c.h>\n" 7820 "#include \"a/b/string\"\n" 7821 "#include \"string.h\"\n" 7822 "#include \"string.h\"\n" 7823 "#include <a-a>\n" 7824 "#include < path with space >\n" 7825 "#include_next <test.h>" 7826 "#include \"abc.h\" // this is included for ABC\n" 7827 "#include \"some long include\" // with a comment\n" 7828 "#include \"some very long include path\"\n" 7829 "#include <some/very/long/include/path>\n", 7830 getLLVMStyleWithColumns(35)); 7831 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 7832 EXPECT_EQ("#include <a>", format("#include<a>")); 7833 7834 verifyFormat("#import <string>"); 7835 verifyFormat("#import <a/b/c.h>"); 7836 verifyFormat("#import \"a/b/string\""); 7837 verifyFormat("#import \"string.h\""); 7838 verifyFormat("#import \"string.h\""); 7839 verifyFormat("#if __has_include(<strstream>)\n" 7840 "#include <strstream>\n" 7841 "#endif"); 7842 7843 verifyFormat("#define MY_IMPORT <a/b>"); 7844 7845 verifyFormat("#if __has_include(<a/b>)"); 7846 verifyFormat("#if __has_include_next(<a/b>)"); 7847 verifyFormat("#define F __has_include(<a/b>)"); 7848 verifyFormat("#define F __has_include_next(<a/b>)"); 7849 7850 // Protocol buffer definition or missing "#". 7851 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 7852 getLLVMStyleWithColumns(30)); 7853 7854 FormatStyle Style = getLLVMStyle(); 7855 Style.AlwaysBreakBeforeMultilineStrings = true; 7856 Style.ColumnLimit = 0; 7857 verifyFormat("#import \"abc.h\"", Style); 7858 7859 // But 'import' might also be a regular C++ namespace. 7860 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7861 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7862 } 7863 7864 //===----------------------------------------------------------------------===// 7865 // Error recovery tests. 7866 //===----------------------------------------------------------------------===// 7867 7868 TEST_F(FormatTest, IncompleteParameterLists) { 7869 FormatStyle NoBinPacking = getLLVMStyle(); 7870 NoBinPacking.BinPackParameters = false; 7871 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 7872 " double *min_x,\n" 7873 " double *max_x,\n" 7874 " double *min_y,\n" 7875 " double *max_y,\n" 7876 " double *min_z,\n" 7877 " double *max_z, ) {}", 7878 NoBinPacking); 7879 } 7880 7881 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 7882 verifyFormat("void f() { return; }\n42"); 7883 verifyFormat("void f() {\n" 7884 " if (0)\n" 7885 " return;\n" 7886 "}\n" 7887 "42"); 7888 verifyFormat("void f() { return }\n42"); 7889 verifyFormat("void f() {\n" 7890 " if (0)\n" 7891 " return\n" 7892 "}\n" 7893 "42"); 7894 } 7895 7896 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 7897 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 7898 EXPECT_EQ("void f() {\n" 7899 " if (a)\n" 7900 " return\n" 7901 "}", 7902 format("void f ( ) { if ( a ) return }")); 7903 EXPECT_EQ("namespace N {\n" 7904 "void f()\n" 7905 "}", 7906 format("namespace N { void f() }")); 7907 EXPECT_EQ("namespace N {\n" 7908 "void f() {}\n" 7909 "void g()\n" 7910 "} // namespace N", 7911 format("namespace N { void f( ) { } void g( ) }")); 7912 } 7913 7914 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 7915 verifyFormat("int aaaaaaaa =\n" 7916 " // Overlylongcomment\n" 7917 " b;", 7918 getLLVMStyleWithColumns(20)); 7919 verifyFormat("function(\n" 7920 " ShortArgument,\n" 7921 " LoooooooooooongArgument);\n", 7922 getLLVMStyleWithColumns(20)); 7923 } 7924 7925 TEST_F(FormatTest, IncorrectAccessSpecifier) { 7926 verifyFormat("public:"); 7927 verifyFormat("class A {\n" 7928 "public\n" 7929 " void f() {}\n" 7930 "};"); 7931 verifyFormat("public\n" 7932 "int qwerty;"); 7933 verifyFormat("public\n" 7934 "B {}"); 7935 verifyFormat("public\n" 7936 "{}"); 7937 verifyFormat("public\n" 7938 "B { int x; }"); 7939 } 7940 7941 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 7942 verifyFormat("{"); 7943 verifyFormat("#})"); 7944 verifyNoCrash("(/**/[:!] ?[)."); 7945 } 7946 7947 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 7948 // Found by oss-fuzz: 7949 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 7950 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7951 Style.ColumnLimit = 60; 7952 verifyNoCrash( 7953 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 7954 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 7955 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 7956 Style); 7957 } 7958 7959 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 7960 verifyFormat("do {\n}"); 7961 verifyFormat("do {\n}\n" 7962 "f();"); 7963 verifyFormat("do {\n}\n" 7964 "wheeee(fun);"); 7965 verifyFormat("do {\n" 7966 " f();\n" 7967 "}"); 7968 } 7969 7970 TEST_F(FormatTest, IncorrectCodeMissingParens) { 7971 verifyFormat("if {\n foo;\n foo();\n}"); 7972 verifyFormat("switch {\n foo;\n foo();\n}"); 7973 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 7974 verifyFormat("while {\n foo;\n foo();\n}"); 7975 verifyFormat("do {\n foo;\n foo();\n} while;"); 7976 } 7977 7978 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 7979 verifyIncompleteFormat("namespace {\n" 7980 "class Foo { Foo (\n" 7981 "};\n" 7982 "} // namespace"); 7983 } 7984 7985 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 7986 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 7987 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 7988 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 7989 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 7990 7991 EXPECT_EQ("{\n" 7992 " {\n" 7993 " breakme(\n" 7994 " qwe);\n" 7995 " }\n", 7996 format("{\n" 7997 " {\n" 7998 " breakme(qwe);\n" 7999 "}\n", 8000 getLLVMStyleWithColumns(10))); 8001 } 8002 8003 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 8004 verifyFormat("int x = {\n" 8005 " avariable,\n" 8006 " b(alongervariable)};", 8007 getLLVMStyleWithColumns(25)); 8008 } 8009 8010 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 8011 verifyFormat("return (a)(b){1, 2, 3};"); 8012 } 8013 8014 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 8015 verifyFormat("vector<int> x{1, 2, 3, 4};"); 8016 verifyFormat("vector<int> x{\n" 8017 " 1,\n" 8018 " 2,\n" 8019 " 3,\n" 8020 " 4,\n" 8021 "};"); 8022 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 8023 verifyFormat("f({1, 2});"); 8024 verifyFormat("auto v = Foo{-1};"); 8025 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 8026 verifyFormat("Class::Class : member{1, 2, 3} {}"); 8027 verifyFormat("new vector<int>{1, 2, 3};"); 8028 verifyFormat("new int[3]{1, 2, 3};"); 8029 verifyFormat("new int{1};"); 8030 verifyFormat("return {arg1, arg2};"); 8031 verifyFormat("return {arg1, SomeType{parameter}};"); 8032 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 8033 verifyFormat("new T{arg1, arg2};"); 8034 verifyFormat("f(MyMap[{composite, key}]);"); 8035 verifyFormat("class Class {\n" 8036 " T member = {arg1, arg2};\n" 8037 "};"); 8038 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 8039 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 8040 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 8041 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 8042 verifyFormat("int a = std::is_integral<int>{} + 0;"); 8043 8044 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8045 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8046 verifyFormat("auto i = decltype(x){};"); 8047 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 8048 verifyFormat("Node n{1, Node{1000}, //\n" 8049 " 2};"); 8050 verifyFormat("Aaaa aaaaaaa{\n" 8051 " {\n" 8052 " aaaa,\n" 8053 " },\n" 8054 "};"); 8055 verifyFormat("class C : public D {\n" 8056 " SomeClass SC{2};\n" 8057 "};"); 8058 verifyFormat("class C : public A {\n" 8059 " class D : public B {\n" 8060 " void f() { int i{2}; }\n" 8061 " };\n" 8062 "};"); 8063 verifyFormat("#define A {a, a},"); 8064 8065 // Avoid breaking between equal sign and opening brace 8066 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 8067 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 8068 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 8069 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 8070 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 8071 " {\"ccccccccccccccccccccc\", 2}};", 8072 AvoidBreakingFirstArgument); 8073 8074 // Binpacking only if there is no trailing comma 8075 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 8076 " cccccccccc, dddddddddd};", 8077 getLLVMStyleWithColumns(50)); 8078 verifyFormat("const Aaaaaa aaaaa = {\n" 8079 " aaaaaaaaaaa,\n" 8080 " bbbbbbbbbbb,\n" 8081 " ccccccccccc,\n" 8082 " ddddddddddd,\n" 8083 "};", 8084 getLLVMStyleWithColumns(50)); 8085 8086 // Cases where distinguising braced lists and blocks is hard. 8087 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 8088 verifyFormat("void f() {\n" 8089 " return; // comment\n" 8090 "}\n" 8091 "SomeType t;"); 8092 verifyFormat("void f() {\n" 8093 " if (a) {\n" 8094 " f();\n" 8095 " }\n" 8096 "}\n" 8097 "SomeType t;"); 8098 8099 // In combination with BinPackArguments = false. 8100 FormatStyle NoBinPacking = getLLVMStyle(); 8101 NoBinPacking.BinPackArguments = false; 8102 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 8103 " bbbbb,\n" 8104 " ccccc,\n" 8105 " ddddd,\n" 8106 " eeeee,\n" 8107 " ffffff,\n" 8108 " ggggg,\n" 8109 " hhhhhh,\n" 8110 " iiiiii,\n" 8111 " jjjjjj,\n" 8112 " kkkkkk};", 8113 NoBinPacking); 8114 verifyFormat("const Aaaaaa aaaaa = {\n" 8115 " aaaaa,\n" 8116 " bbbbb,\n" 8117 " ccccc,\n" 8118 " ddddd,\n" 8119 " eeeee,\n" 8120 " ffffff,\n" 8121 " ggggg,\n" 8122 " hhhhhh,\n" 8123 " iiiiii,\n" 8124 " jjjjjj,\n" 8125 " kkkkkk,\n" 8126 "};", 8127 NoBinPacking); 8128 verifyFormat( 8129 "const Aaaaaa aaaaa = {\n" 8130 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 8131 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 8132 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 8133 "};", 8134 NoBinPacking); 8135 8136 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8137 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 8138 " CDDDP83848_BMCR_REGISTER,\n" 8139 " CDDDP83848_BMSR_REGISTER,\n" 8140 " CDDDP83848_RBR_REGISTER};", 8141 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 8142 " CDDDP83848_BMSR_REGISTER,\n" 8143 " CDDDP83848_RBR_REGISTER};", 8144 NoBinPacking)); 8145 8146 // FIXME: The alignment of these trailing comments might be bad. Then again, 8147 // this might be utterly useless in real code. 8148 verifyFormat("Constructor::Constructor()\n" 8149 " : some_value{ //\n" 8150 " aaaaaaa, //\n" 8151 " bbbbbbb} {}"); 8152 8153 // In braced lists, the first comment is always assumed to belong to the 8154 // first element. Thus, it can be moved to the next or previous line as 8155 // appropriate. 8156 EXPECT_EQ("function({// First element:\n" 8157 " 1,\n" 8158 " // Second element:\n" 8159 " 2});", 8160 format("function({\n" 8161 " // First element:\n" 8162 " 1,\n" 8163 " // Second element:\n" 8164 " 2});")); 8165 EXPECT_EQ("std::vector<int> MyNumbers{\n" 8166 " // First element:\n" 8167 " 1,\n" 8168 " // Second element:\n" 8169 " 2};", 8170 format("std::vector<int> MyNumbers{// First element:\n" 8171 " 1,\n" 8172 " // Second element:\n" 8173 " 2};", 8174 getLLVMStyleWithColumns(30))); 8175 // A trailing comma should still lead to an enforced line break and no 8176 // binpacking. 8177 EXPECT_EQ("vector<int> SomeVector = {\n" 8178 " // aaa\n" 8179 " 1,\n" 8180 " 2,\n" 8181 "};", 8182 format("vector<int> SomeVector = { // aaa\n" 8183 " 1, 2, };")); 8184 8185 FormatStyle ExtraSpaces = getLLVMStyle(); 8186 ExtraSpaces.Cpp11BracedListStyle = false; 8187 ExtraSpaces.ColumnLimit = 75; 8188 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8189 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8190 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8191 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8192 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8193 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8194 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8195 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8196 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8197 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8198 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8199 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8200 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8201 verifyFormat("class Class {\n" 8202 " T member = { arg1, arg2 };\n" 8203 "};", 8204 ExtraSpaces); 8205 verifyFormat( 8206 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8207 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8208 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8209 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8210 ExtraSpaces); 8211 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 8212 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 8213 ExtraSpaces); 8214 verifyFormat( 8215 "someFunction(OtherParam,\n" 8216 " BracedList{ // comment 1 (Forcing interesting break)\n" 8217 " param1, param2,\n" 8218 " // comment 2\n" 8219 " param3, param4 });", 8220 ExtraSpaces); 8221 verifyFormat( 8222 "std::this_thread::sleep_for(\n" 8223 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 8224 ExtraSpaces); 8225 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 8226 " aaaaaaa,\n" 8227 " aaaaaaaaaa,\n" 8228 " aaaaa,\n" 8229 " aaaaaaaaaaaaaaa,\n" 8230 " aaa,\n" 8231 " aaaaaaaaaa,\n" 8232 " a,\n" 8233 " aaaaaaaaaaaaaaaaaaaaa,\n" 8234 " aaaaaaaaaaaa,\n" 8235 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 8236 " aaaaaaa,\n" 8237 " a};"); 8238 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 8239 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 8240 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 8241 8242 // Avoid breaking between initializer/equal sign and opening brace 8243 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 8244 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 8245 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8246 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8247 " { \"ccccccccccccccccccccc\", 2 }\n" 8248 "};", 8249 ExtraSpaces); 8250 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 8251 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8252 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8253 " { \"ccccccccccccccccccccc\", 2 }\n" 8254 "};", 8255 ExtraSpaces); 8256 8257 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 8258 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 8259 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 8260 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 8261 8262 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 8263 SpaceBetweenBraces.SpacesInAngles = true; 8264 SpaceBetweenBraces.SpacesInParentheses = true; 8265 SpaceBetweenBraces.SpacesInSquareBrackets = true; 8266 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 8267 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 8268 verifyFormat("vector< int > x{ // comment 1\n" 8269 " 1, 2, 3, 4 };", 8270 SpaceBetweenBraces); 8271 SpaceBetweenBraces.ColumnLimit = 20; 8272 EXPECT_EQ("vector< int > x{\n" 8273 " 1, 2, 3, 4 };", 8274 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8275 SpaceBetweenBraces.ColumnLimit = 24; 8276 EXPECT_EQ("vector< int > x{ 1, 2,\n" 8277 " 3, 4 };", 8278 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8279 EXPECT_EQ("vector< int > x{\n" 8280 " 1,\n" 8281 " 2,\n" 8282 " 3,\n" 8283 " 4,\n" 8284 "};", 8285 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 8286 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 8287 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 8288 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 8289 } 8290 8291 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 8292 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8293 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8294 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8295 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8296 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8297 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8298 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 8299 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8300 " 1, 22, 333, 4444, 55555, //\n" 8301 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8302 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8303 verifyFormat( 8304 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8305 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8306 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 8307 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8308 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8309 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8310 " 7777777};"); 8311 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8312 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8313 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8314 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8315 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8316 " // Separating comment.\n" 8317 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8318 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8319 " // Leading comment\n" 8320 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8321 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8322 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8323 " 1, 1, 1, 1};", 8324 getLLVMStyleWithColumns(39)); 8325 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8326 " 1, 1, 1, 1};", 8327 getLLVMStyleWithColumns(38)); 8328 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 8329 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 8330 getLLVMStyleWithColumns(43)); 8331 verifyFormat( 8332 "static unsigned SomeValues[10][3] = {\n" 8333 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 8334 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 8335 verifyFormat("static auto fields = new vector<string>{\n" 8336 " \"aaaaaaaaaaaaa\",\n" 8337 " \"aaaaaaaaaaaaa\",\n" 8338 " \"aaaaaaaaaaaa\",\n" 8339 " \"aaaaaaaaaaaaaa\",\n" 8340 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8341 " \"aaaaaaaaaaaa\",\n" 8342 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8343 "};"); 8344 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8345 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8346 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8347 " 3, cccccccccccccccccccccc};", 8348 getLLVMStyleWithColumns(60)); 8349 8350 // Trailing commas. 8351 verifyFormat("vector<int> x = {\n" 8352 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8353 "};", 8354 getLLVMStyleWithColumns(39)); 8355 verifyFormat("vector<int> x = {\n" 8356 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8357 "};", 8358 getLLVMStyleWithColumns(39)); 8359 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8360 " 1, 1, 1, 1,\n" 8361 " /**/ /**/};", 8362 getLLVMStyleWithColumns(39)); 8363 8364 // Trailing comment in the first line. 8365 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8366 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8367 " 111111111, 222222222, 3333333333, 444444444, //\n" 8368 " 11111111, 22222222, 333333333, 44444444};"); 8369 // Trailing comment in the last line. 8370 verifyFormat("int aaaaa[] = {\n" 8371 " 1, 2, 3, // comment\n" 8372 " 4, 5, 6 // comment\n" 8373 "};"); 8374 8375 // With nested lists, we should either format one item per line or all nested 8376 // lists one on line. 8377 // FIXME: For some nested lists, we can do better. 8378 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8379 " {aaaaaaaaaaaaaaaaaaa},\n" 8380 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8381 " {aaaaaaaaaaaaaaaaa}};", 8382 getLLVMStyleWithColumns(60)); 8383 verifyFormat( 8384 "SomeStruct my_struct_array = {\n" 8385 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8386 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8387 " {aaa, aaa},\n" 8388 " {aaa, aaa},\n" 8389 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8390 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8391 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8392 8393 // No column layout should be used here. 8394 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8395 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8396 8397 verifyNoCrash("a<,"); 8398 8399 // No braced initializer here. 8400 verifyFormat("void f() {\n" 8401 " struct Dummy {};\n" 8402 " f(v);\n" 8403 "}"); 8404 8405 // Long lists should be formatted in columns even if they are nested. 8406 verifyFormat( 8407 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8408 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8409 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8410 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8411 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8412 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8413 8414 // Allow "single-column" layout even if that violates the column limit. There 8415 // isn't going to be a better way. 8416 verifyFormat("std::vector<int> a = {\n" 8417 " aaaaaaaa,\n" 8418 " aaaaaaaa,\n" 8419 " aaaaaaaa,\n" 8420 " aaaaaaaa,\n" 8421 " aaaaaaaaaa,\n" 8422 " aaaaaaaa,\n" 8423 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8424 getLLVMStyleWithColumns(30)); 8425 verifyFormat("vector<int> aaaa = {\n" 8426 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8427 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8428 " aaaaaa.aaaaaaa,\n" 8429 " aaaaaa.aaaaaaa,\n" 8430 " aaaaaa.aaaaaaa,\n" 8431 " aaaaaa.aaaaaaa,\n" 8432 "};"); 8433 8434 // Don't create hanging lists. 8435 verifyFormat("someFunction(Param, {List1, List2,\n" 8436 " List3});", 8437 getLLVMStyleWithColumns(35)); 8438 verifyFormat("someFunction(Param, Param,\n" 8439 " {List1, List2,\n" 8440 " List3});", 8441 getLLVMStyleWithColumns(35)); 8442 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8443 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8444 } 8445 8446 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8447 FormatStyle DoNotMerge = getLLVMStyle(); 8448 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8449 8450 verifyFormat("void f() { return 42; }"); 8451 verifyFormat("void f() {\n" 8452 " return 42;\n" 8453 "}", 8454 DoNotMerge); 8455 verifyFormat("void f() {\n" 8456 " // Comment\n" 8457 "}"); 8458 verifyFormat("{\n" 8459 "#error {\n" 8460 " int a;\n" 8461 "}"); 8462 verifyFormat("{\n" 8463 " int a;\n" 8464 "#error {\n" 8465 "}"); 8466 verifyFormat("void f() {} // comment"); 8467 verifyFormat("void f() { int a; } // comment"); 8468 verifyFormat("void f() {\n" 8469 "} // comment", 8470 DoNotMerge); 8471 verifyFormat("void f() {\n" 8472 " int a;\n" 8473 "} // comment", 8474 DoNotMerge); 8475 verifyFormat("void f() {\n" 8476 "} // comment", 8477 getLLVMStyleWithColumns(15)); 8478 8479 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8480 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8481 8482 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8483 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8484 verifyFormat("class C {\n" 8485 " C()\n" 8486 " : iiiiiiii(nullptr),\n" 8487 " kkkkkkk(nullptr),\n" 8488 " mmmmmmm(nullptr),\n" 8489 " nnnnnnn(nullptr) {}\n" 8490 "};", 8491 getGoogleStyle()); 8492 8493 FormatStyle NoColumnLimit = getLLVMStyle(); 8494 NoColumnLimit.ColumnLimit = 0; 8495 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8496 EXPECT_EQ("class C {\n" 8497 " A() : b(0) {}\n" 8498 "};", 8499 format("class C{A():b(0){}};", NoColumnLimit)); 8500 EXPECT_EQ("A()\n" 8501 " : b(0) {\n" 8502 "}", 8503 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8504 8505 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8506 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8507 FormatStyle::SFS_None; 8508 EXPECT_EQ("A()\n" 8509 " : b(0) {\n" 8510 "}", 8511 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8512 EXPECT_EQ("A()\n" 8513 " : b(0) {\n" 8514 "}", 8515 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8516 8517 verifyFormat("#define A \\\n" 8518 " void f() { \\\n" 8519 " int i; \\\n" 8520 " }", 8521 getLLVMStyleWithColumns(20)); 8522 verifyFormat("#define A \\\n" 8523 " void f() { int i; }", 8524 getLLVMStyleWithColumns(21)); 8525 verifyFormat("#define A \\\n" 8526 " void f() { \\\n" 8527 " int i; \\\n" 8528 " } \\\n" 8529 " int j;", 8530 getLLVMStyleWithColumns(22)); 8531 verifyFormat("#define A \\\n" 8532 " void f() { int i; } \\\n" 8533 " int j;", 8534 getLLVMStyleWithColumns(23)); 8535 } 8536 8537 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8538 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8539 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8540 verifyFormat("class C {\n" 8541 " int f() {}\n" 8542 "};", 8543 MergeEmptyOnly); 8544 verifyFormat("class C {\n" 8545 " int f() {\n" 8546 " return 42;\n" 8547 " }\n" 8548 "};", 8549 MergeEmptyOnly); 8550 verifyFormat("int f() {}", MergeEmptyOnly); 8551 verifyFormat("int f() {\n" 8552 " return 42;\n" 8553 "}", 8554 MergeEmptyOnly); 8555 8556 // Also verify behavior when BraceWrapping.AfterFunction = true 8557 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8558 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8559 verifyFormat("int f() {}", MergeEmptyOnly); 8560 verifyFormat("class C {\n" 8561 " int f() {}\n" 8562 "};", 8563 MergeEmptyOnly); 8564 } 8565 8566 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8567 FormatStyle MergeInlineOnly = getLLVMStyle(); 8568 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8569 verifyFormat("class C {\n" 8570 " int f() { return 42; }\n" 8571 "};", 8572 MergeInlineOnly); 8573 verifyFormat("int f() {\n" 8574 " return 42;\n" 8575 "}", 8576 MergeInlineOnly); 8577 8578 // SFS_Inline implies SFS_Empty 8579 verifyFormat("class C {\n" 8580 " int f() {}\n" 8581 "};", 8582 MergeInlineOnly); 8583 verifyFormat("int f() {}", MergeInlineOnly); 8584 8585 // Also verify behavior when BraceWrapping.AfterFunction = true 8586 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8587 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8588 verifyFormat("class C {\n" 8589 " int f() { return 42; }\n" 8590 "};", 8591 MergeInlineOnly); 8592 verifyFormat("int f()\n" 8593 "{\n" 8594 " return 42;\n" 8595 "}", 8596 MergeInlineOnly); 8597 8598 // SFS_Inline implies SFS_Empty 8599 verifyFormat("int f() {}", MergeInlineOnly); 8600 verifyFormat("class C {\n" 8601 " int f() {}\n" 8602 "};", 8603 MergeInlineOnly); 8604 } 8605 8606 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8607 FormatStyle MergeInlineOnly = getLLVMStyle(); 8608 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8609 FormatStyle::SFS_InlineOnly; 8610 verifyFormat("class C {\n" 8611 " int f() { return 42; }\n" 8612 "};", 8613 MergeInlineOnly); 8614 verifyFormat("int f() {\n" 8615 " return 42;\n" 8616 "}", 8617 MergeInlineOnly); 8618 8619 // SFS_InlineOnly does not imply SFS_Empty 8620 verifyFormat("class C {\n" 8621 " int f() {}\n" 8622 "};", 8623 MergeInlineOnly); 8624 verifyFormat("int f() {\n" 8625 "}", 8626 MergeInlineOnly); 8627 8628 // Also verify behavior when BraceWrapping.AfterFunction = true 8629 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8630 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8631 verifyFormat("class C {\n" 8632 " int f() { return 42; }\n" 8633 "};", 8634 MergeInlineOnly); 8635 verifyFormat("int f()\n" 8636 "{\n" 8637 " return 42;\n" 8638 "}", 8639 MergeInlineOnly); 8640 8641 // SFS_InlineOnly does not imply SFS_Empty 8642 verifyFormat("int f()\n" 8643 "{\n" 8644 "}", 8645 MergeInlineOnly); 8646 verifyFormat("class C {\n" 8647 " int f() {}\n" 8648 "};", 8649 MergeInlineOnly); 8650 } 8651 8652 TEST_F(FormatTest, SplitEmptyFunction) { 8653 FormatStyle Style = getLLVMStyle(); 8654 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8655 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8656 Style.BraceWrapping.AfterFunction = true; 8657 Style.BraceWrapping.SplitEmptyFunction = false; 8658 Style.ColumnLimit = 40; 8659 8660 verifyFormat("int f()\n" 8661 "{}", 8662 Style); 8663 verifyFormat("int f()\n" 8664 "{\n" 8665 " return 42;\n" 8666 "}", 8667 Style); 8668 verifyFormat("int f()\n" 8669 "{\n" 8670 " // some comment\n" 8671 "}", 8672 Style); 8673 8674 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8675 verifyFormat("int f() {}", Style); 8676 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8677 "{}", 8678 Style); 8679 verifyFormat("int f()\n" 8680 "{\n" 8681 " return 0;\n" 8682 "}", 8683 Style); 8684 8685 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8686 verifyFormat("class Foo {\n" 8687 " int f() {}\n" 8688 "};\n", 8689 Style); 8690 verifyFormat("class Foo {\n" 8691 " int f() { return 0; }\n" 8692 "};\n", 8693 Style); 8694 verifyFormat("class Foo {\n" 8695 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8696 " {}\n" 8697 "};\n", 8698 Style); 8699 verifyFormat("class Foo {\n" 8700 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8701 " {\n" 8702 " return 0;\n" 8703 " }\n" 8704 "};\n", 8705 Style); 8706 8707 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8708 verifyFormat("int f() {}", Style); 8709 verifyFormat("int f() { return 0; }", Style); 8710 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8711 "{}", 8712 Style); 8713 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8714 "{\n" 8715 " return 0;\n" 8716 "}", 8717 Style); 8718 } 8719 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8720 FormatStyle Style = getLLVMStyle(); 8721 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8722 verifyFormat("#ifdef A\n" 8723 "int f() {}\n" 8724 "#else\n" 8725 "int g() {}\n" 8726 "#endif", 8727 Style); 8728 } 8729 8730 TEST_F(FormatTest, SplitEmptyClass) { 8731 FormatStyle Style = getLLVMStyle(); 8732 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8733 Style.BraceWrapping.AfterClass = true; 8734 Style.BraceWrapping.SplitEmptyRecord = false; 8735 8736 verifyFormat("class Foo\n" 8737 "{};", 8738 Style); 8739 verifyFormat("/* something */ class Foo\n" 8740 "{};", 8741 Style); 8742 verifyFormat("template <typename X> class Foo\n" 8743 "{};", 8744 Style); 8745 verifyFormat("class Foo\n" 8746 "{\n" 8747 " Foo();\n" 8748 "};", 8749 Style); 8750 verifyFormat("typedef class Foo\n" 8751 "{\n" 8752 "} Foo_t;", 8753 Style); 8754 } 8755 8756 TEST_F(FormatTest, SplitEmptyStruct) { 8757 FormatStyle Style = getLLVMStyle(); 8758 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8759 Style.BraceWrapping.AfterStruct = true; 8760 Style.BraceWrapping.SplitEmptyRecord = false; 8761 8762 verifyFormat("struct Foo\n" 8763 "{};", 8764 Style); 8765 verifyFormat("/* something */ struct Foo\n" 8766 "{};", 8767 Style); 8768 verifyFormat("template <typename X> struct Foo\n" 8769 "{};", 8770 Style); 8771 verifyFormat("struct Foo\n" 8772 "{\n" 8773 " Foo();\n" 8774 "};", 8775 Style); 8776 verifyFormat("typedef struct Foo\n" 8777 "{\n" 8778 "} Foo_t;", 8779 Style); 8780 // typedef struct Bar {} Bar_t; 8781 } 8782 8783 TEST_F(FormatTest, SplitEmptyUnion) { 8784 FormatStyle Style = getLLVMStyle(); 8785 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8786 Style.BraceWrapping.AfterUnion = true; 8787 Style.BraceWrapping.SplitEmptyRecord = false; 8788 8789 verifyFormat("union Foo\n" 8790 "{};", 8791 Style); 8792 verifyFormat("/* something */ union Foo\n" 8793 "{};", 8794 Style); 8795 verifyFormat("union Foo\n" 8796 "{\n" 8797 " A,\n" 8798 "};", 8799 Style); 8800 verifyFormat("typedef union Foo\n" 8801 "{\n" 8802 "} Foo_t;", 8803 Style); 8804 } 8805 8806 TEST_F(FormatTest, SplitEmptyNamespace) { 8807 FormatStyle Style = getLLVMStyle(); 8808 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8809 Style.BraceWrapping.AfterNamespace = true; 8810 Style.BraceWrapping.SplitEmptyNamespace = false; 8811 8812 verifyFormat("namespace Foo\n" 8813 "{};", 8814 Style); 8815 verifyFormat("/* something */ namespace Foo\n" 8816 "{};", 8817 Style); 8818 verifyFormat("inline namespace Foo\n" 8819 "{};", 8820 Style); 8821 verifyFormat("/* something */ inline namespace Foo\n" 8822 "{};", 8823 Style); 8824 verifyFormat("export namespace Foo\n" 8825 "{};", 8826 Style); 8827 verifyFormat("namespace Foo\n" 8828 "{\n" 8829 "void Bar();\n" 8830 "};", 8831 Style); 8832 } 8833 8834 TEST_F(FormatTest, NeverMergeShortRecords) { 8835 FormatStyle Style = getLLVMStyle(); 8836 8837 verifyFormat("class Foo {\n" 8838 " Foo();\n" 8839 "};", 8840 Style); 8841 verifyFormat("typedef class Foo {\n" 8842 " Foo();\n" 8843 "} Foo_t;", 8844 Style); 8845 verifyFormat("struct Foo {\n" 8846 " Foo();\n" 8847 "};", 8848 Style); 8849 verifyFormat("typedef struct Foo {\n" 8850 " Foo();\n" 8851 "} Foo_t;", 8852 Style); 8853 verifyFormat("union Foo {\n" 8854 " A,\n" 8855 "};", 8856 Style); 8857 verifyFormat("typedef union Foo {\n" 8858 " A,\n" 8859 "} Foo_t;", 8860 Style); 8861 verifyFormat("namespace Foo {\n" 8862 "void Bar();\n" 8863 "};", 8864 Style); 8865 8866 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8867 Style.BraceWrapping.AfterClass = true; 8868 Style.BraceWrapping.AfterStruct = true; 8869 Style.BraceWrapping.AfterUnion = true; 8870 Style.BraceWrapping.AfterNamespace = true; 8871 verifyFormat("class Foo\n" 8872 "{\n" 8873 " Foo();\n" 8874 "};", 8875 Style); 8876 verifyFormat("typedef class Foo\n" 8877 "{\n" 8878 " Foo();\n" 8879 "} Foo_t;", 8880 Style); 8881 verifyFormat("struct Foo\n" 8882 "{\n" 8883 " Foo();\n" 8884 "};", 8885 Style); 8886 verifyFormat("typedef struct Foo\n" 8887 "{\n" 8888 " Foo();\n" 8889 "} Foo_t;", 8890 Style); 8891 verifyFormat("union Foo\n" 8892 "{\n" 8893 " A,\n" 8894 "};", 8895 Style); 8896 verifyFormat("typedef union Foo\n" 8897 "{\n" 8898 " A,\n" 8899 "} Foo_t;", 8900 Style); 8901 verifyFormat("namespace Foo\n" 8902 "{\n" 8903 "void Bar();\n" 8904 "};", 8905 Style); 8906 } 8907 8908 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 8909 // Elaborate type variable declarations. 8910 verifyFormat("struct foo a = {bar};\nint n;"); 8911 verifyFormat("class foo a = {bar};\nint n;"); 8912 verifyFormat("union foo a = {bar};\nint n;"); 8913 8914 // Elaborate types inside function definitions. 8915 verifyFormat("struct foo f() {}\nint n;"); 8916 verifyFormat("class foo f() {}\nint n;"); 8917 verifyFormat("union foo f() {}\nint n;"); 8918 8919 // Templates. 8920 verifyFormat("template <class X> void f() {}\nint n;"); 8921 verifyFormat("template <struct X> void f() {}\nint n;"); 8922 verifyFormat("template <union X> void f() {}\nint n;"); 8923 8924 // Actual definitions... 8925 verifyFormat("struct {\n} n;"); 8926 verifyFormat( 8927 "template <template <class T, class Y>, class Z> class X {\n} n;"); 8928 verifyFormat("union Z {\n int n;\n} x;"); 8929 verifyFormat("class MACRO Z {\n} n;"); 8930 verifyFormat("class MACRO(X) Z {\n} n;"); 8931 verifyFormat("class __attribute__(X) Z {\n} n;"); 8932 verifyFormat("class __declspec(X) Z {\n} n;"); 8933 verifyFormat("class A##B##C {\n} n;"); 8934 verifyFormat("class alignas(16) Z {\n} n;"); 8935 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 8936 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 8937 8938 // Redefinition from nested context: 8939 verifyFormat("class A::B::C {\n} n;"); 8940 8941 // Template definitions. 8942 verifyFormat( 8943 "template <typename F>\n" 8944 "Matcher(const Matcher<F> &Other,\n" 8945 " typename enable_if_c<is_base_of<F, T>::value &&\n" 8946 " !is_same<F, T>::value>::type * = 0)\n" 8947 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 8948 8949 // FIXME: This is still incorrectly handled at the formatter side. 8950 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 8951 verifyFormat("int i = SomeFunction(a<b, a> b);"); 8952 8953 // FIXME: 8954 // This now gets parsed incorrectly as class definition. 8955 // verifyFormat("class A<int> f() {\n}\nint n;"); 8956 8957 // Elaborate types where incorrectly parsing the structural element would 8958 // break the indent. 8959 verifyFormat("if (true)\n" 8960 " class X x;\n" 8961 "else\n" 8962 " f();\n"); 8963 8964 // This is simply incomplete. Formatting is not important, but must not crash. 8965 verifyFormat("class A:"); 8966 } 8967 8968 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 8969 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 8970 format("#error Leave all white!!!!! space* alone!\n")); 8971 EXPECT_EQ( 8972 "#warning Leave all white!!!!! space* alone!\n", 8973 format("#warning Leave all white!!!!! space* alone!\n")); 8974 EXPECT_EQ("#error 1", format(" # error 1")); 8975 EXPECT_EQ("#warning 1", format(" # warning 1")); 8976 } 8977 8978 TEST_F(FormatTest, FormatHashIfExpressions) { 8979 verifyFormat("#if AAAA && BBBB"); 8980 verifyFormat("#if (AAAA && BBBB)"); 8981 verifyFormat("#elif (AAAA && BBBB)"); 8982 // FIXME: Come up with a better indentation for #elif. 8983 verifyFormat( 8984 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 8985 " defined(BBBBBBBB)\n" 8986 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 8987 " defined(BBBBBBBB)\n" 8988 "#endif", 8989 getLLVMStyleWithColumns(65)); 8990 } 8991 8992 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 8993 FormatStyle AllowsMergedIf = getGoogleStyle(); 8994 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 8995 FormatStyle::SIS_WithoutElse; 8996 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 8997 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 8998 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 8999 EXPECT_EQ("if (true) return 42;", 9000 format("if (true)\nreturn 42;", AllowsMergedIf)); 9001 FormatStyle ShortMergedIf = AllowsMergedIf; 9002 ShortMergedIf.ColumnLimit = 25; 9003 verifyFormat("#define A \\\n" 9004 " if (true) return 42;", 9005 ShortMergedIf); 9006 verifyFormat("#define A \\\n" 9007 " f(); \\\n" 9008 " if (true)\n" 9009 "#define B", 9010 ShortMergedIf); 9011 verifyFormat("#define A \\\n" 9012 " f(); \\\n" 9013 " if (true)\n" 9014 "g();", 9015 ShortMergedIf); 9016 verifyFormat("{\n" 9017 "#ifdef A\n" 9018 " // Comment\n" 9019 " if (true) continue;\n" 9020 "#endif\n" 9021 " // Comment\n" 9022 " if (true) continue;\n" 9023 "}", 9024 ShortMergedIf); 9025 ShortMergedIf.ColumnLimit = 33; 9026 verifyFormat("#define A \\\n" 9027 " if constexpr (true) return 42;", 9028 ShortMergedIf); 9029 verifyFormat("#define A \\\n" 9030 " if CONSTEXPR (true) return 42;", 9031 ShortMergedIf); 9032 ShortMergedIf.ColumnLimit = 29; 9033 verifyFormat("#define A \\\n" 9034 " if (aaaaaaaaaa) return 1; \\\n" 9035 " return 2;", 9036 ShortMergedIf); 9037 ShortMergedIf.ColumnLimit = 28; 9038 verifyFormat("#define A \\\n" 9039 " if (aaaaaaaaaa) \\\n" 9040 " return 1; \\\n" 9041 " return 2;", 9042 ShortMergedIf); 9043 verifyFormat("#define A \\\n" 9044 " if constexpr (aaaaaaa) \\\n" 9045 " return 1; \\\n" 9046 " return 2;", 9047 ShortMergedIf); 9048 verifyFormat("#define A \\\n" 9049 " if CONSTEXPR (aaaaaaa) \\\n" 9050 " return 1; \\\n" 9051 " return 2;", 9052 ShortMergedIf); 9053 } 9054 9055 TEST_F(FormatTest, FormatStarDependingOnContext) { 9056 verifyFormat("void f(int *a);"); 9057 verifyFormat("void f() { f(fint * b); }"); 9058 verifyFormat("class A {\n void f(int *a);\n};"); 9059 verifyFormat("class A {\n int *a;\n};"); 9060 verifyFormat("namespace a {\n" 9061 "namespace b {\n" 9062 "class A {\n" 9063 " void f() {}\n" 9064 " int *a;\n" 9065 "};\n" 9066 "} // namespace b\n" 9067 "} // namespace a"); 9068 } 9069 9070 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 9071 verifyFormat("while"); 9072 verifyFormat("operator"); 9073 } 9074 9075 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 9076 // This code would be painfully slow to format if we didn't skip it. 9077 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 9078 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9079 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9080 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9081 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9082 "A(1, 1)\n" 9083 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 9084 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9085 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9086 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9087 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9088 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9089 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9090 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9091 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9092 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 9093 // Deeply nested part is untouched, rest is formatted. 9094 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 9095 format(std::string("int i;\n") + Code + "int j;\n", 9096 getLLVMStyle(), SC_ExpectIncomplete)); 9097 } 9098 9099 //===----------------------------------------------------------------------===// 9100 // Objective-C tests. 9101 //===----------------------------------------------------------------------===// 9102 9103 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 9104 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 9105 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 9106 format("-(NSUInteger)indexOfObject:(id)anObject;")); 9107 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 9108 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 9109 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 9110 format("-(NSInteger)Method3:(id)anObject;")); 9111 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 9112 format("-(NSInteger)Method4:(id)anObject;")); 9113 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 9114 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 9115 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 9116 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 9117 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9118 "forAllCells:(BOOL)flag;", 9119 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9120 "forAllCells:(BOOL)flag;")); 9121 9122 // Very long objectiveC method declaration. 9123 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 9124 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 9125 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 9126 " inRange:(NSRange)range\n" 9127 " outRange:(NSRange)out_range\n" 9128 " outRange1:(NSRange)out_range1\n" 9129 " outRange2:(NSRange)out_range2\n" 9130 " outRange3:(NSRange)out_range3\n" 9131 " outRange4:(NSRange)out_range4\n" 9132 " outRange5:(NSRange)out_range5\n" 9133 " outRange6:(NSRange)out_range6\n" 9134 " outRange7:(NSRange)out_range7\n" 9135 " outRange8:(NSRange)out_range8\n" 9136 " outRange9:(NSRange)out_range9;"); 9137 9138 // When the function name has to be wrapped. 9139 FormatStyle Style = getLLVMStyle(); 9140 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 9141 // and always indents instead. 9142 Style.IndentWrappedFunctionNames = false; 9143 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9144 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 9145 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 9146 "}", 9147 Style); 9148 Style.IndentWrappedFunctionNames = true; 9149 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9150 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 9151 " anotherName:(NSString)dddddddddddddd {\n" 9152 "}", 9153 Style); 9154 9155 verifyFormat("- (int)sum:(vector<int>)numbers;"); 9156 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 9157 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 9158 // protocol lists (but not for template classes): 9159 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 9160 9161 verifyFormat("- (int (*)())foo:(int (*)())f;"); 9162 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 9163 9164 // If there's no return type (very rare in practice!), LLVM and Google style 9165 // agree. 9166 verifyFormat("- foo;"); 9167 verifyFormat("- foo:(int)f;"); 9168 verifyGoogleFormat("- foo:(int)foo;"); 9169 } 9170 9171 TEST_F(FormatTest, BreaksStringLiterals) { 9172 EXPECT_EQ("\"some text \"\n" 9173 "\"other\";", 9174 format("\"some text other\";", getLLVMStyleWithColumns(12))); 9175 EXPECT_EQ("\"some text \"\n" 9176 "\"other\";", 9177 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 9178 EXPECT_EQ( 9179 "#define A \\\n" 9180 " \"some \" \\\n" 9181 " \"text \" \\\n" 9182 " \"other\";", 9183 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 9184 EXPECT_EQ( 9185 "#define A \\\n" 9186 " \"so \" \\\n" 9187 " \"text \" \\\n" 9188 " \"other\";", 9189 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 9190 9191 EXPECT_EQ("\"some text\"", 9192 format("\"some text\"", getLLVMStyleWithColumns(1))); 9193 EXPECT_EQ("\"some text\"", 9194 format("\"some text\"", getLLVMStyleWithColumns(11))); 9195 EXPECT_EQ("\"some \"\n" 9196 "\"text\"", 9197 format("\"some text\"", getLLVMStyleWithColumns(10))); 9198 EXPECT_EQ("\"some \"\n" 9199 "\"text\"", 9200 format("\"some text\"", getLLVMStyleWithColumns(7))); 9201 EXPECT_EQ("\"some\"\n" 9202 "\" tex\"\n" 9203 "\"t\"", 9204 format("\"some text\"", getLLVMStyleWithColumns(6))); 9205 EXPECT_EQ("\"some\"\n" 9206 "\" tex\"\n" 9207 "\" and\"", 9208 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 9209 EXPECT_EQ("\"some\"\n" 9210 "\"/tex\"\n" 9211 "\"/and\"", 9212 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 9213 9214 EXPECT_EQ("variable =\n" 9215 " \"long string \"\n" 9216 " \"literal\";", 9217 format("variable = \"long string literal\";", 9218 getLLVMStyleWithColumns(20))); 9219 9220 EXPECT_EQ("variable = f(\n" 9221 " \"long string \"\n" 9222 " \"literal\",\n" 9223 " short,\n" 9224 " loooooooooooooooooooong);", 9225 format("variable = f(\"long string literal\", short, " 9226 "loooooooooooooooooooong);", 9227 getLLVMStyleWithColumns(20))); 9228 9229 EXPECT_EQ( 9230 "f(g(\"long string \"\n" 9231 " \"literal\"),\n" 9232 " b);", 9233 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 9234 EXPECT_EQ("f(g(\"long string \"\n" 9235 " \"literal\",\n" 9236 " a),\n" 9237 " b);", 9238 format("f(g(\"long string literal\", a), b);", 9239 getLLVMStyleWithColumns(20))); 9240 EXPECT_EQ( 9241 "f(\"one two\".split(\n" 9242 " variable));", 9243 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 9244 EXPECT_EQ("f(\"one two three four five six \"\n" 9245 " \"seven\".split(\n" 9246 " really_looooong_variable));", 9247 format("f(\"one two three four five six seven\"." 9248 "split(really_looooong_variable));", 9249 getLLVMStyleWithColumns(33))); 9250 9251 EXPECT_EQ("f(\"some \"\n" 9252 " \"text\",\n" 9253 " other);", 9254 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 9255 9256 // Only break as a last resort. 9257 verifyFormat( 9258 "aaaaaaaaaaaaaaaaaaaa(\n" 9259 " aaaaaaaaaaaaaaaaaaaa,\n" 9260 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 9261 9262 EXPECT_EQ("\"splitmea\"\n" 9263 "\"trandomp\"\n" 9264 "\"oint\"", 9265 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 9266 9267 EXPECT_EQ("\"split/\"\n" 9268 "\"pathat/\"\n" 9269 "\"slashes\"", 9270 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9271 9272 EXPECT_EQ("\"split/\"\n" 9273 "\"pathat/\"\n" 9274 "\"slashes\"", 9275 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9276 EXPECT_EQ("\"split at \"\n" 9277 "\"spaces/at/\"\n" 9278 "\"slashes.at.any$\"\n" 9279 "\"non-alphanumeric%\"\n" 9280 "\"1111111111characte\"\n" 9281 "\"rs\"", 9282 format("\"split at " 9283 "spaces/at/" 9284 "slashes.at." 9285 "any$non-" 9286 "alphanumeric%" 9287 "1111111111characte" 9288 "rs\"", 9289 getLLVMStyleWithColumns(20))); 9290 9291 // Verify that splitting the strings understands 9292 // Style::AlwaysBreakBeforeMultilineStrings. 9293 EXPECT_EQ("aaaaaaaaaaaa(\n" 9294 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 9295 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 9296 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 9297 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9298 "aaaaaaaaaaaaaaaaaaaaaa\");", 9299 getGoogleStyle())); 9300 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9301 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9302 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9303 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9304 "aaaaaaaaaaaaaaaaaaaaaa\";", 9305 getGoogleStyle())); 9306 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9307 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9308 format("llvm::outs() << " 9309 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 9310 "aaaaaaaaaaaaaaaaaaa\";")); 9311 EXPECT_EQ("ffff(\n" 9312 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9313 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9314 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 9315 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9316 getGoogleStyle())); 9317 9318 FormatStyle Style = getLLVMStyleWithColumns(12); 9319 Style.BreakStringLiterals = false; 9320 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 9321 9322 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 9323 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9324 EXPECT_EQ("#define A \\\n" 9325 " \"some \" \\\n" 9326 " \"text \" \\\n" 9327 " \"other\";", 9328 format("#define A \"some text other\";", AlignLeft)); 9329 } 9330 9331 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 9332 EXPECT_EQ("C a = \"some more \"\n" 9333 " \"text\";", 9334 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9335 } 9336 9337 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9338 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9339 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9340 EXPECT_EQ("int i = a(b());", 9341 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9342 } 9343 9344 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9345 EXPECT_EQ( 9346 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9347 "(\n" 9348 " \"x\t\");", 9349 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9350 "aaaaaaa(" 9351 "\"x\t\");")); 9352 } 9353 9354 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9355 EXPECT_EQ( 9356 "u8\"utf8 string \"\n" 9357 "u8\"literal\";", 9358 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9359 EXPECT_EQ( 9360 "u\"utf16 string \"\n" 9361 "u\"literal\";", 9362 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9363 EXPECT_EQ( 9364 "U\"utf32 string \"\n" 9365 "U\"literal\";", 9366 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9367 EXPECT_EQ("L\"wide string \"\n" 9368 "L\"literal\";", 9369 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9370 EXPECT_EQ("@\"NSString \"\n" 9371 "@\"literal\";", 9372 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9373 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9374 9375 // This input makes clang-format try to split the incomplete unicode escape 9376 // sequence, which used to lead to a crasher. 9377 verifyNoCrash( 9378 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9379 getLLVMStyleWithColumns(60)); 9380 } 9381 9382 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9383 FormatStyle Style = getGoogleStyleWithColumns(15); 9384 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9385 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9386 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9387 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9388 EXPECT_EQ("u8R\"x(raw literal)x\";", 9389 format("u8R\"x(raw literal)x\";", Style)); 9390 } 9391 9392 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9393 FormatStyle Style = getLLVMStyleWithColumns(20); 9394 EXPECT_EQ( 9395 "_T(\"aaaaaaaaaaaaaa\")\n" 9396 "_T(\"aaaaaaaaaaaaaa\")\n" 9397 "_T(\"aaaaaaaaaaaa\")", 9398 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9399 EXPECT_EQ("f(x,\n" 9400 " _T(\"aaaaaaaaaaaa\")\n" 9401 " _T(\"aaa\"),\n" 9402 " z);", 9403 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9404 9405 // FIXME: Handle embedded spaces in one iteration. 9406 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9407 // "_T(\"aaaaaaaaaaaaa\")\n" 9408 // "_T(\"aaaaaaaaaaaaa\")\n" 9409 // "_T(\"a\")", 9410 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9411 // getLLVMStyleWithColumns(20))); 9412 EXPECT_EQ( 9413 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9414 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9415 EXPECT_EQ("f(\n" 9416 "#if !TEST\n" 9417 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9418 "#endif\n" 9419 ");", 9420 format("f(\n" 9421 "#if !TEST\n" 9422 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9423 "#endif\n" 9424 ");")); 9425 EXPECT_EQ("f(\n" 9426 "\n" 9427 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9428 format("f(\n" 9429 "\n" 9430 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9431 } 9432 9433 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9434 // In a function call with two operands, the second can be broken with no line 9435 // break before it. 9436 EXPECT_EQ( 9437 "func(a, \"long long \"\n" 9438 " \"long long\");", 9439 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 9440 // In a function call with three operands, the second must be broken with a 9441 // line break before it. 9442 EXPECT_EQ("func(a,\n" 9443 " \"long long long \"\n" 9444 " \"long\",\n" 9445 " c);", 9446 format("func(a, \"long long long long\", c);", 9447 getLLVMStyleWithColumns(24))); 9448 // In a function call with three operands, the third must be broken with a 9449 // line break before it. 9450 EXPECT_EQ("func(a, b,\n" 9451 " \"long long long \"\n" 9452 " \"long\");", 9453 format("func(a, b, \"long long long long\");", 9454 getLLVMStyleWithColumns(24))); 9455 // In a function call with three operands, both the second and the third must 9456 // be broken with a line break before them. 9457 EXPECT_EQ("func(a,\n" 9458 " \"long long long \"\n" 9459 " \"long\",\n" 9460 " \"long long long \"\n" 9461 " \"long\");", 9462 format("func(a, \"long long long long\", \"long long long long\");", 9463 getLLVMStyleWithColumns(24))); 9464 // In a chain of << with two operands, the second can be broken with no line 9465 // break before it. 9466 EXPECT_EQ("a << \"line line \"\n" 9467 " \"line\";", 9468 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 9469 // In a chain of << with three operands, the second can be broken with no line 9470 // break before it. 9471 EXPECT_EQ( 9472 "abcde << \"line \"\n" 9473 " \"line line\"\n" 9474 " << c;", 9475 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 9476 // In a chain of << with three operands, the third must be broken with a line 9477 // break before it. 9478 EXPECT_EQ( 9479 "a << b\n" 9480 " << \"line line \"\n" 9481 " \"line\";", 9482 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 9483 // In a chain of << with three operands, the second can be broken with no line 9484 // break before it and the third must be broken with a line break before it. 9485 EXPECT_EQ("abcd << \"line line \"\n" 9486 " \"line\"\n" 9487 " << \"line line \"\n" 9488 " \"line\";", 9489 format("abcd << \"line line line\" << \"line line line\";", 9490 getLLVMStyleWithColumns(20))); 9491 // In a chain of binary operators with two operands, the second can be broken 9492 // with no line break before it. 9493 EXPECT_EQ( 9494 "abcd + \"line line \"\n" 9495 " \"line line\";", 9496 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 9497 // In a chain of binary operators with three operands, the second must be 9498 // broken with a line break before it. 9499 EXPECT_EQ("abcd +\n" 9500 " \"line line \"\n" 9501 " \"line line\" +\n" 9502 " e;", 9503 format("abcd + \"line line line line\" + e;", 9504 getLLVMStyleWithColumns(20))); 9505 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9506 // the first must be broken with a line break before it. 9507 FormatStyle Style = getLLVMStyleWithColumns(25); 9508 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9509 EXPECT_EQ("someFunction(\n" 9510 " \"long long long \"\n" 9511 " \"long\",\n" 9512 " a);", 9513 format("someFunction(\"long long long long\", a);", Style)); 9514 } 9515 9516 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9517 EXPECT_EQ( 9518 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9520 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9521 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9524 } 9525 9526 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9527 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9528 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9529 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9530 "multiline raw string literal xxxxxxxxxxxxxx\n" 9531 ")x\",\n" 9532 " a),\n" 9533 " b);", 9534 format("fffffffffff(g(R\"x(\n" 9535 "multiline raw string literal xxxxxxxxxxxxxx\n" 9536 ")x\", a), b);", 9537 getGoogleStyleWithColumns(20))); 9538 EXPECT_EQ("fffffffffff(\n" 9539 " g(R\"x(qqq\n" 9540 "multiline raw string literal xxxxxxxxxxxxxx\n" 9541 ")x\",\n" 9542 " a),\n" 9543 " b);", 9544 format("fffffffffff(g(R\"x(qqq\n" 9545 "multiline raw string literal xxxxxxxxxxxxxx\n" 9546 ")x\", a), b);", 9547 getGoogleStyleWithColumns(20))); 9548 9549 EXPECT_EQ("fffffffffff(R\"x(\n" 9550 "multiline raw string literal xxxxxxxxxxxxxx\n" 9551 ")x\");", 9552 format("fffffffffff(R\"x(\n" 9553 "multiline raw string literal xxxxxxxxxxxxxx\n" 9554 ")x\");", 9555 getGoogleStyleWithColumns(20))); 9556 EXPECT_EQ("fffffffffff(R\"x(\n" 9557 "multiline raw string literal xxxxxxxxxxxxxx\n" 9558 ")x\" + bbbbbb);", 9559 format("fffffffffff(R\"x(\n" 9560 "multiline raw string literal xxxxxxxxxxxxxx\n" 9561 ")x\" + bbbbbb);", 9562 getGoogleStyleWithColumns(20))); 9563 EXPECT_EQ("fffffffffff(\n" 9564 " R\"x(\n" 9565 "multiline raw string literal xxxxxxxxxxxxxx\n" 9566 ")x\" +\n" 9567 " bbbbbb);", 9568 format("fffffffffff(\n" 9569 " R\"x(\n" 9570 "multiline raw string literal xxxxxxxxxxxxxx\n" 9571 ")x\" + bbbbbb);", 9572 getGoogleStyleWithColumns(20))); 9573 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9574 format("fffffffffff(\n" 9575 " R\"(single line raw string)\" + bbbbbb);")); 9576 } 9577 9578 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9579 verifyFormat("string a = \"unterminated;"); 9580 EXPECT_EQ("function(\"unterminated,\n" 9581 " OtherParameter);", 9582 format("function( \"unterminated,\n" 9583 " OtherParameter);")); 9584 } 9585 9586 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9587 FormatStyle Style = getLLVMStyle(); 9588 Style.Standard = FormatStyle::LS_Cpp03; 9589 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9590 format("#define x(_a) printf(\"foo\"_a);", Style)); 9591 } 9592 9593 TEST_F(FormatTest, CppLexVersion) { 9594 FormatStyle Style = getLLVMStyle(); 9595 // Formatting of x * y differs if x is a type. 9596 verifyFormat("void foo() { MACRO(a * b); }", Style); 9597 verifyFormat("void foo() { MACRO(int *b); }", Style); 9598 9599 // LLVM style uses latest lexer. 9600 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 9601 Style.Standard = FormatStyle::LS_Cpp17; 9602 // But in c++17, char8_t isn't a keyword. 9603 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 9604 } 9605 9606 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9607 9608 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9609 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9610 " \"ddeeefff\");", 9611 format("someFunction(\"aaabbbcccdddeeefff\");", 9612 getLLVMStyleWithColumns(25))); 9613 EXPECT_EQ("someFunction1234567890(\n" 9614 " \"aaabbbcccdddeeefff\");", 9615 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9616 getLLVMStyleWithColumns(26))); 9617 EXPECT_EQ("someFunction1234567890(\n" 9618 " \"aaabbbcccdddeeeff\"\n" 9619 " \"f\");", 9620 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9621 getLLVMStyleWithColumns(25))); 9622 EXPECT_EQ("someFunction1234567890(\n" 9623 " \"aaabbbcccdddeeeff\"\n" 9624 " \"f\");", 9625 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9626 getLLVMStyleWithColumns(24))); 9627 EXPECT_EQ("someFunction(\n" 9628 " \"aaabbbcc ddde \"\n" 9629 " \"efff\");", 9630 format("someFunction(\"aaabbbcc ddde efff\");", 9631 getLLVMStyleWithColumns(25))); 9632 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9633 " \"ddeeefff\");", 9634 format("someFunction(\"aaabbbccc ddeeefff\");", 9635 getLLVMStyleWithColumns(25))); 9636 EXPECT_EQ("someFunction1234567890(\n" 9637 " \"aaabb \"\n" 9638 " \"cccdddeeefff\");", 9639 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9640 getLLVMStyleWithColumns(25))); 9641 EXPECT_EQ("#define A \\\n" 9642 " string s = \\\n" 9643 " \"123456789\" \\\n" 9644 " \"0\"; \\\n" 9645 " int i;", 9646 format("#define A string s = \"1234567890\"; int i;", 9647 getLLVMStyleWithColumns(20))); 9648 EXPECT_EQ("someFunction(\n" 9649 " \"aaabbbcc \"\n" 9650 " \"dddeeefff\");", 9651 format("someFunction(\"aaabbbcc dddeeefff\");", 9652 getLLVMStyleWithColumns(25))); 9653 } 9654 9655 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9656 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9657 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9658 EXPECT_EQ("\"test\"\n" 9659 "\"\\n\"", 9660 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9661 EXPECT_EQ("\"tes\\\\\"\n" 9662 "\"n\"", 9663 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9664 EXPECT_EQ("\"\\\\\\\\\"\n" 9665 "\"\\n\"", 9666 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9667 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9668 EXPECT_EQ("\"\\uff01\"\n" 9669 "\"test\"", 9670 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9671 EXPECT_EQ("\"\\Uff01ff02\"", 9672 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9673 EXPECT_EQ("\"\\x000000000001\"\n" 9674 "\"next\"", 9675 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9676 EXPECT_EQ("\"\\x000000000001next\"", 9677 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9678 EXPECT_EQ("\"\\x000000000001\"", 9679 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9680 EXPECT_EQ("\"test\"\n" 9681 "\"\\000000\"\n" 9682 "\"000001\"", 9683 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9684 EXPECT_EQ("\"test\\000\"\n" 9685 "\"00000000\"\n" 9686 "\"1\"", 9687 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9688 } 9689 9690 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9691 verifyFormat("void f() {\n" 9692 " return g() {}\n" 9693 " void h() {}"); 9694 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9695 "g();\n" 9696 "}"); 9697 } 9698 9699 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9700 verifyFormat( 9701 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9702 } 9703 9704 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9705 verifyFormat("class X {\n" 9706 " void f() {\n" 9707 " }\n" 9708 "};", 9709 getLLVMStyleWithColumns(12)); 9710 } 9711 9712 TEST_F(FormatTest, ConfigurableIndentWidth) { 9713 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9714 EightIndent.IndentWidth = 8; 9715 EightIndent.ContinuationIndentWidth = 8; 9716 verifyFormat("void f() {\n" 9717 " someFunction();\n" 9718 " if (true) {\n" 9719 " f();\n" 9720 " }\n" 9721 "}", 9722 EightIndent); 9723 verifyFormat("class X {\n" 9724 " void f() {\n" 9725 " }\n" 9726 "};", 9727 EightIndent); 9728 verifyFormat("int x[] = {\n" 9729 " call(),\n" 9730 " call()};", 9731 EightIndent); 9732 } 9733 9734 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9735 verifyFormat("double\n" 9736 "f();", 9737 getLLVMStyleWithColumns(8)); 9738 } 9739 9740 TEST_F(FormatTest, ConfigurableUseOfTab) { 9741 FormatStyle Tab = getLLVMStyleWithColumns(42); 9742 Tab.IndentWidth = 8; 9743 Tab.UseTab = FormatStyle::UT_Always; 9744 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9745 9746 EXPECT_EQ("if (aaaaaaaa && // q\n" 9747 " bb)\t\t// w\n" 9748 "\t;", 9749 format("if (aaaaaaaa &&// q\n" 9750 "bb)// w\n" 9751 ";", 9752 Tab)); 9753 EXPECT_EQ("if (aaa && bbb) // w\n" 9754 "\t;", 9755 format("if(aaa&&bbb)// w\n" 9756 ";", 9757 Tab)); 9758 9759 verifyFormat("class X {\n" 9760 "\tvoid f() {\n" 9761 "\t\tsomeFunction(parameter1,\n" 9762 "\t\t\t parameter2);\n" 9763 "\t}\n" 9764 "};", 9765 Tab); 9766 verifyFormat("#define A \\\n" 9767 "\tvoid f() { \\\n" 9768 "\t\tsomeFunction( \\\n" 9769 "\t\t parameter1, \\\n" 9770 "\t\t parameter2); \\\n" 9771 "\t}", 9772 Tab); 9773 verifyFormat("int a;\t // x\n" 9774 "int bbbbbbbb; // x\n", 9775 Tab); 9776 9777 Tab.TabWidth = 4; 9778 Tab.IndentWidth = 8; 9779 verifyFormat("class TabWidth4Indent8 {\n" 9780 "\t\tvoid f() {\n" 9781 "\t\t\t\tsomeFunction(parameter1,\n" 9782 "\t\t\t\t\t\t\t parameter2);\n" 9783 "\t\t}\n" 9784 "};", 9785 Tab); 9786 9787 Tab.TabWidth = 4; 9788 Tab.IndentWidth = 4; 9789 verifyFormat("class TabWidth4Indent4 {\n" 9790 "\tvoid f() {\n" 9791 "\t\tsomeFunction(parameter1,\n" 9792 "\t\t\t\t\t parameter2);\n" 9793 "\t}\n" 9794 "};", 9795 Tab); 9796 9797 Tab.TabWidth = 8; 9798 Tab.IndentWidth = 4; 9799 verifyFormat("class TabWidth8Indent4 {\n" 9800 " void f() {\n" 9801 "\tsomeFunction(parameter1,\n" 9802 "\t\t parameter2);\n" 9803 " }\n" 9804 "};", 9805 Tab); 9806 9807 Tab.TabWidth = 8; 9808 Tab.IndentWidth = 8; 9809 EXPECT_EQ("/*\n" 9810 "\t a\t\tcomment\n" 9811 "\t in multiple lines\n" 9812 " */", 9813 format(" /*\t \t \n" 9814 " \t \t a\t\tcomment\t \t\n" 9815 " \t \t in multiple lines\t\n" 9816 " \t */", 9817 Tab)); 9818 9819 Tab.UseTab = FormatStyle::UT_ForIndentation; 9820 verifyFormat("{\n" 9821 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9822 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9823 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9824 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9825 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9826 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9827 "};", 9828 Tab); 9829 verifyFormat("enum AA {\n" 9830 "\ta1, // Force multiple lines\n" 9831 "\ta2,\n" 9832 "\ta3\n" 9833 "};", 9834 Tab); 9835 EXPECT_EQ("if (aaaaaaaa && // q\n" 9836 " bb) // w\n" 9837 "\t;", 9838 format("if (aaaaaaaa &&// q\n" 9839 "bb)// w\n" 9840 ";", 9841 Tab)); 9842 verifyFormat("class X {\n" 9843 "\tvoid f() {\n" 9844 "\t\tsomeFunction(parameter1,\n" 9845 "\t\t parameter2);\n" 9846 "\t}\n" 9847 "};", 9848 Tab); 9849 verifyFormat("{\n" 9850 "\tQ(\n" 9851 "\t {\n" 9852 "\t\t int a;\n" 9853 "\t\t someFunction(aaaaaaaa,\n" 9854 "\t\t bbbbbbb);\n" 9855 "\t },\n" 9856 "\t p);\n" 9857 "}", 9858 Tab); 9859 EXPECT_EQ("{\n" 9860 "\t/* aaaa\n" 9861 "\t bbbb */\n" 9862 "}", 9863 format("{\n" 9864 "/* aaaa\n" 9865 " bbbb */\n" 9866 "}", 9867 Tab)); 9868 EXPECT_EQ("{\n" 9869 "\t/*\n" 9870 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9871 "\t bbbbbbbbbbbbb\n" 9872 "\t*/\n" 9873 "}", 9874 format("{\n" 9875 "/*\n" 9876 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9877 "*/\n" 9878 "}", 9879 Tab)); 9880 EXPECT_EQ("{\n" 9881 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9882 "\t// bbbbbbbbbbbbb\n" 9883 "}", 9884 format("{\n" 9885 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9886 "}", 9887 Tab)); 9888 EXPECT_EQ("{\n" 9889 "\t/*\n" 9890 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9891 "\t bbbbbbbbbbbbb\n" 9892 "\t*/\n" 9893 "}", 9894 format("{\n" 9895 "\t/*\n" 9896 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9897 "\t*/\n" 9898 "}", 9899 Tab)); 9900 EXPECT_EQ("{\n" 9901 "\t/*\n" 9902 "\n" 9903 "\t*/\n" 9904 "}", 9905 format("{\n" 9906 "\t/*\n" 9907 "\n" 9908 "\t*/\n" 9909 "}", 9910 Tab)); 9911 EXPECT_EQ("{\n" 9912 "\t/*\n" 9913 " asdf\n" 9914 "\t*/\n" 9915 "}", 9916 format("{\n" 9917 "\t/*\n" 9918 " asdf\n" 9919 "\t*/\n" 9920 "}", 9921 Tab)); 9922 9923 Tab.UseTab = FormatStyle::UT_Never; 9924 EXPECT_EQ("/*\n" 9925 " a\t\tcomment\n" 9926 " in multiple lines\n" 9927 " */", 9928 format(" /*\t \t \n" 9929 " \t \t a\t\tcomment\t \t\n" 9930 " \t \t in multiple lines\t\n" 9931 " \t */", 9932 Tab)); 9933 EXPECT_EQ("/* some\n" 9934 " comment */", 9935 format(" \t \t /* some\n" 9936 " \t \t comment */", 9937 Tab)); 9938 EXPECT_EQ("int a; /* some\n" 9939 " comment */", 9940 format(" \t \t int a; /* some\n" 9941 " \t \t comment */", 9942 Tab)); 9943 9944 EXPECT_EQ("int a; /* some\n" 9945 "comment */", 9946 format(" \t \t int\ta; /* some\n" 9947 " \t \t comment */", 9948 Tab)); 9949 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9950 " comment */", 9951 format(" \t \t f(\"\t\t\"); /* some\n" 9952 " \t \t comment */", 9953 Tab)); 9954 EXPECT_EQ("{\n" 9955 " /*\n" 9956 " * Comment\n" 9957 " */\n" 9958 " int i;\n" 9959 "}", 9960 format("{\n" 9961 "\t/*\n" 9962 "\t * Comment\n" 9963 "\t */\n" 9964 "\t int i;\n" 9965 "}")); 9966 9967 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 9968 Tab.TabWidth = 8; 9969 Tab.IndentWidth = 8; 9970 EXPECT_EQ("if (aaaaaaaa && // q\n" 9971 " bb) // w\n" 9972 "\t;", 9973 format("if (aaaaaaaa &&// q\n" 9974 "bb)// w\n" 9975 ";", 9976 Tab)); 9977 EXPECT_EQ("if (aaa && bbb) // w\n" 9978 "\t;", 9979 format("if(aaa&&bbb)// w\n" 9980 ";", 9981 Tab)); 9982 verifyFormat("class X {\n" 9983 "\tvoid f() {\n" 9984 "\t\tsomeFunction(parameter1,\n" 9985 "\t\t\t parameter2);\n" 9986 "\t}\n" 9987 "};", 9988 Tab); 9989 verifyFormat("#define A \\\n" 9990 "\tvoid f() { \\\n" 9991 "\t\tsomeFunction( \\\n" 9992 "\t\t parameter1, \\\n" 9993 "\t\t parameter2); \\\n" 9994 "\t}", 9995 Tab); 9996 Tab.TabWidth = 4; 9997 Tab.IndentWidth = 8; 9998 verifyFormat("class TabWidth4Indent8 {\n" 9999 "\t\tvoid f() {\n" 10000 "\t\t\t\tsomeFunction(parameter1,\n" 10001 "\t\t\t\t\t\t\t parameter2);\n" 10002 "\t\t}\n" 10003 "};", 10004 Tab); 10005 Tab.TabWidth = 4; 10006 Tab.IndentWidth = 4; 10007 verifyFormat("class TabWidth4Indent4 {\n" 10008 "\tvoid f() {\n" 10009 "\t\tsomeFunction(parameter1,\n" 10010 "\t\t\t\t\t parameter2);\n" 10011 "\t}\n" 10012 "};", 10013 Tab); 10014 Tab.TabWidth = 8; 10015 Tab.IndentWidth = 4; 10016 verifyFormat("class TabWidth8Indent4 {\n" 10017 " void f() {\n" 10018 "\tsomeFunction(parameter1,\n" 10019 "\t\t parameter2);\n" 10020 " }\n" 10021 "};", 10022 Tab); 10023 Tab.TabWidth = 8; 10024 Tab.IndentWidth = 8; 10025 EXPECT_EQ("/*\n" 10026 "\t a\t\tcomment\n" 10027 "\t in multiple lines\n" 10028 " */", 10029 format(" /*\t \t \n" 10030 " \t \t a\t\tcomment\t \t\n" 10031 " \t \t in multiple lines\t\n" 10032 " \t */", 10033 Tab)); 10034 verifyFormat("{\n" 10035 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10036 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10037 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10038 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10039 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10040 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10041 "};", 10042 Tab); 10043 verifyFormat("enum AA {\n" 10044 "\ta1, // Force multiple lines\n" 10045 "\ta2,\n" 10046 "\ta3\n" 10047 "};", 10048 Tab); 10049 EXPECT_EQ("if (aaaaaaaa && // q\n" 10050 " bb) // w\n" 10051 "\t;", 10052 format("if (aaaaaaaa &&// q\n" 10053 "bb)// w\n" 10054 ";", 10055 Tab)); 10056 verifyFormat("class X {\n" 10057 "\tvoid f() {\n" 10058 "\t\tsomeFunction(parameter1,\n" 10059 "\t\t\t parameter2);\n" 10060 "\t}\n" 10061 "};", 10062 Tab); 10063 verifyFormat("{\n" 10064 "\tQ(\n" 10065 "\t {\n" 10066 "\t\t int a;\n" 10067 "\t\t someFunction(aaaaaaaa,\n" 10068 "\t\t\t\t bbbbbbb);\n" 10069 "\t },\n" 10070 "\t p);\n" 10071 "}", 10072 Tab); 10073 EXPECT_EQ("{\n" 10074 "\t/* aaaa\n" 10075 "\t bbbb */\n" 10076 "}", 10077 format("{\n" 10078 "/* aaaa\n" 10079 " bbbb */\n" 10080 "}", 10081 Tab)); 10082 EXPECT_EQ("{\n" 10083 "\t/*\n" 10084 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10085 "\t bbbbbbbbbbbbb\n" 10086 "\t*/\n" 10087 "}", 10088 format("{\n" 10089 "/*\n" 10090 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10091 "*/\n" 10092 "}", 10093 Tab)); 10094 EXPECT_EQ("{\n" 10095 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10096 "\t// bbbbbbbbbbbbb\n" 10097 "}", 10098 format("{\n" 10099 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10100 "}", 10101 Tab)); 10102 EXPECT_EQ("{\n" 10103 "\t/*\n" 10104 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10105 "\t bbbbbbbbbbbbb\n" 10106 "\t*/\n" 10107 "}", 10108 format("{\n" 10109 "\t/*\n" 10110 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10111 "\t*/\n" 10112 "}", 10113 Tab)); 10114 EXPECT_EQ("{\n" 10115 "\t/*\n" 10116 "\n" 10117 "\t*/\n" 10118 "}", 10119 format("{\n" 10120 "\t/*\n" 10121 "\n" 10122 "\t*/\n" 10123 "}", 10124 Tab)); 10125 EXPECT_EQ("{\n" 10126 "\t/*\n" 10127 " asdf\n" 10128 "\t*/\n" 10129 "}", 10130 format("{\n" 10131 "\t/*\n" 10132 " asdf\n" 10133 "\t*/\n" 10134 "}", 10135 Tab)); 10136 EXPECT_EQ("/*\n" 10137 "\t a\t\tcomment\n" 10138 "\t in multiple lines\n" 10139 " */", 10140 format(" /*\t \t \n" 10141 " \t \t a\t\tcomment\t \t\n" 10142 " \t \t in multiple lines\t\n" 10143 " \t */", 10144 Tab)); 10145 EXPECT_EQ("/* some\n" 10146 " comment */", 10147 format(" \t \t /* some\n" 10148 " \t \t comment */", 10149 Tab)); 10150 EXPECT_EQ("int a; /* some\n" 10151 " comment */", 10152 format(" \t \t int a; /* some\n" 10153 " \t \t comment */", 10154 Tab)); 10155 EXPECT_EQ("int a; /* some\n" 10156 "comment */", 10157 format(" \t \t int\ta; /* some\n" 10158 " \t \t comment */", 10159 Tab)); 10160 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10161 " comment */", 10162 format(" \t \t f(\"\t\t\"); /* some\n" 10163 " \t \t comment */", 10164 Tab)); 10165 EXPECT_EQ("{\n" 10166 " /*\n" 10167 " * Comment\n" 10168 " */\n" 10169 " int i;\n" 10170 "}", 10171 format("{\n" 10172 "\t/*\n" 10173 "\t * Comment\n" 10174 "\t */\n" 10175 "\t int i;\n" 10176 "}")); 10177 Tab.AlignConsecutiveAssignments = true; 10178 Tab.AlignConsecutiveDeclarations = true; 10179 Tab.TabWidth = 4; 10180 Tab.IndentWidth = 4; 10181 verifyFormat("class Assign {\n" 10182 "\tvoid f() {\n" 10183 "\t\tint x = 123;\n" 10184 "\t\tint random = 4;\n" 10185 "\t\tstd::string alphabet =\n" 10186 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10187 "\t}\n" 10188 "};", 10189 Tab); 10190 } 10191 10192 TEST_F(FormatTest, ZeroTabWidth) { 10193 FormatStyle Tab = getLLVMStyleWithColumns(42); 10194 Tab.IndentWidth = 8; 10195 Tab.UseTab = FormatStyle::UT_Never; 10196 Tab.TabWidth = 0; 10197 EXPECT_EQ("void a(){\n" 10198 " // line starts with '\t'\n" 10199 "};", 10200 format("void a(){\n" 10201 "\t// line starts with '\t'\n" 10202 "};", 10203 Tab)); 10204 10205 EXPECT_EQ("void a(){\n" 10206 " // line starts with '\t'\n" 10207 "};", 10208 format("void a(){\n" 10209 "\t\t// line starts with '\t'\n" 10210 "};", 10211 Tab)); 10212 10213 Tab.UseTab = FormatStyle::UT_ForIndentation; 10214 EXPECT_EQ("void a(){\n" 10215 " // line starts with '\t'\n" 10216 "};", 10217 format("void a(){\n" 10218 "\t// line starts with '\t'\n" 10219 "};", 10220 Tab)); 10221 10222 EXPECT_EQ("void a(){\n" 10223 " // line starts with '\t'\n" 10224 "};", 10225 format("void a(){\n" 10226 "\t\t// line starts with '\t'\n" 10227 "};", 10228 Tab)); 10229 10230 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10231 EXPECT_EQ("void a(){\n" 10232 " // line starts with '\t'\n" 10233 "};", 10234 format("void a(){\n" 10235 "\t// line starts with '\t'\n" 10236 "};", 10237 Tab)); 10238 10239 EXPECT_EQ("void a(){\n" 10240 " // line starts with '\t'\n" 10241 "};", 10242 format("void a(){\n" 10243 "\t\t// line starts with '\t'\n" 10244 "};", 10245 Tab)); 10246 10247 Tab.UseTab = FormatStyle::UT_Always; 10248 EXPECT_EQ("void a(){\n" 10249 "// line starts with '\t'\n" 10250 "};", 10251 format("void a(){\n" 10252 "\t// line starts with '\t'\n" 10253 "};", 10254 Tab)); 10255 10256 EXPECT_EQ("void a(){\n" 10257 "// line starts with '\t'\n" 10258 "};", 10259 format("void a(){\n" 10260 "\t\t// line starts with '\t'\n" 10261 "};", 10262 Tab)); 10263 } 10264 10265 TEST_F(FormatTest, CalculatesOriginalColumn) { 10266 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10267 "q\"; /* some\n" 10268 " comment */", 10269 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10270 "q\"; /* some\n" 10271 " comment */", 10272 getLLVMStyle())); 10273 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10274 "/* some\n" 10275 " comment */", 10276 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10277 " /* some\n" 10278 " comment */", 10279 getLLVMStyle())); 10280 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10281 "qqq\n" 10282 "/* some\n" 10283 " comment */", 10284 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10285 "qqq\n" 10286 " /* some\n" 10287 " comment */", 10288 getLLVMStyle())); 10289 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10290 "wwww; /* some\n" 10291 " comment */", 10292 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10293 "wwww; /* some\n" 10294 " comment */", 10295 getLLVMStyle())); 10296 } 10297 10298 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 10299 FormatStyle NoSpace = getLLVMStyle(); 10300 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 10301 10302 verifyFormat("while(true)\n" 10303 " continue;", 10304 NoSpace); 10305 verifyFormat("for(;;)\n" 10306 " continue;", 10307 NoSpace); 10308 verifyFormat("if(true)\n" 10309 " f();\n" 10310 "else if(true)\n" 10311 " f();", 10312 NoSpace); 10313 verifyFormat("do {\n" 10314 " do_something();\n" 10315 "} while(something());", 10316 NoSpace); 10317 verifyFormat("switch(x) {\n" 10318 "default:\n" 10319 " break;\n" 10320 "}", 10321 NoSpace); 10322 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 10323 verifyFormat("size_t x = sizeof(x);", NoSpace); 10324 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 10325 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 10326 verifyFormat("alignas(128) char a[128];", NoSpace); 10327 verifyFormat("size_t x = alignof(MyType);", NoSpace); 10328 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 10329 verifyFormat("int f() throw(Deprecated);", NoSpace); 10330 verifyFormat("typedef void (*cb)(int);", NoSpace); 10331 verifyFormat("T A::operator()();", NoSpace); 10332 verifyFormat("X A::operator++(T);", NoSpace); 10333 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 10334 10335 FormatStyle Space = getLLVMStyle(); 10336 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 10337 10338 verifyFormat("int f ();", Space); 10339 verifyFormat("void f (int a, T b) {\n" 10340 " while (true)\n" 10341 " continue;\n" 10342 "}", 10343 Space); 10344 verifyFormat("if (true)\n" 10345 " f ();\n" 10346 "else if (true)\n" 10347 " f ();", 10348 Space); 10349 verifyFormat("do {\n" 10350 " do_something ();\n" 10351 "} while (something ());", 10352 Space); 10353 verifyFormat("switch (x) {\n" 10354 "default:\n" 10355 " break;\n" 10356 "}", 10357 Space); 10358 verifyFormat("A::A () : a (1) {}", Space); 10359 verifyFormat("void f () __attribute__ ((asdf));", Space); 10360 verifyFormat("*(&a + 1);\n" 10361 "&((&a)[1]);\n" 10362 "a[(b + c) * d];\n" 10363 "(((a + 1) * 2) + 3) * 4;", 10364 Space); 10365 verifyFormat("#define A(x) x", Space); 10366 verifyFormat("#define A (x) x", Space); 10367 verifyFormat("#if defined(x)\n" 10368 "#endif", 10369 Space); 10370 verifyFormat("auto i = std::make_unique<int> (5);", Space); 10371 verifyFormat("size_t x = sizeof (x);", Space); 10372 verifyFormat("auto f (int x) -> decltype (x);", Space); 10373 verifyFormat("int f (T x) noexcept (x.create ());", Space); 10374 verifyFormat("alignas (128) char a[128];", Space); 10375 verifyFormat("size_t x = alignof (MyType);", Space); 10376 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 10377 verifyFormat("int f () throw (Deprecated);", Space); 10378 verifyFormat("typedef void (*cb) (int);", Space); 10379 verifyFormat("T A::operator() ();", Space); 10380 verifyFormat("X A::operator++ (T);", Space); 10381 verifyFormat("auto lambda = [] () { return 0; };", Space); 10382 verifyFormat("int x = int (y);", Space); 10383 10384 FormatStyle SomeSpace = getLLVMStyle(); 10385 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 10386 10387 verifyFormat("[]() -> float {}", SomeSpace); 10388 verifyFormat("[] (auto foo) {}", SomeSpace); 10389 verifyFormat("[foo]() -> int {}", SomeSpace); 10390 verifyFormat("int f();", SomeSpace); 10391 verifyFormat("void f (int a, T b) {\n" 10392 " while (true)\n" 10393 " continue;\n" 10394 "}", 10395 SomeSpace); 10396 verifyFormat("if (true)\n" 10397 " f();\n" 10398 "else if (true)\n" 10399 " f();", 10400 SomeSpace); 10401 verifyFormat("do {\n" 10402 " do_something();\n" 10403 "} while (something());", 10404 SomeSpace); 10405 verifyFormat("switch (x) {\n" 10406 "default:\n" 10407 " break;\n" 10408 "}", 10409 SomeSpace); 10410 verifyFormat("A::A() : a (1) {}", SomeSpace); 10411 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 10412 verifyFormat("*(&a + 1);\n" 10413 "&((&a)[1]);\n" 10414 "a[(b + c) * d];\n" 10415 "(((a + 1) * 2) + 3) * 4;", 10416 SomeSpace); 10417 verifyFormat("#define A(x) x", SomeSpace); 10418 verifyFormat("#define A (x) x", SomeSpace); 10419 verifyFormat("#if defined(x)\n" 10420 "#endif", 10421 SomeSpace); 10422 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10423 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10424 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10425 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10426 verifyFormat("alignas (128) char a[128];", SomeSpace); 10427 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10428 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10429 SomeSpace); 10430 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10431 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10432 verifyFormat("T A::operator()();", SomeSpace); 10433 verifyFormat("X A::operator++ (T);", SomeSpace); 10434 verifyFormat("int x = int (y);", SomeSpace); 10435 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10436 } 10437 10438 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10439 FormatStyle Spaces = getLLVMStyle(); 10440 Spaces.SpaceAfterLogicalNot = true; 10441 10442 verifyFormat("bool x = ! y", Spaces); 10443 verifyFormat("if (! isFailure())", Spaces); 10444 verifyFormat("if (! (a && b))", Spaces); 10445 verifyFormat("\"Error!\"", Spaces); 10446 verifyFormat("! ! x", Spaces); 10447 } 10448 10449 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10450 FormatStyle Spaces = getLLVMStyle(); 10451 10452 Spaces.SpacesInParentheses = true; 10453 verifyFormat("do_something( ::globalVar );", Spaces); 10454 verifyFormat("call( x, y, z );", Spaces); 10455 verifyFormat("call();", Spaces); 10456 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10457 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10458 Spaces); 10459 verifyFormat("while ( (bool)1 )\n" 10460 " continue;", 10461 Spaces); 10462 verifyFormat("for ( ;; )\n" 10463 " continue;", 10464 Spaces); 10465 verifyFormat("if ( true )\n" 10466 " f();\n" 10467 "else if ( true )\n" 10468 " f();", 10469 Spaces); 10470 verifyFormat("do {\n" 10471 " do_something( (int)i );\n" 10472 "} while ( something() );", 10473 Spaces); 10474 verifyFormat("switch ( x ) {\n" 10475 "default:\n" 10476 " break;\n" 10477 "}", 10478 Spaces); 10479 10480 Spaces.SpacesInParentheses = false; 10481 Spaces.SpacesInCStyleCastParentheses = true; 10482 verifyFormat("Type *A = ( Type * )P;", Spaces); 10483 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 10484 verifyFormat("x = ( int32 )y;", Spaces); 10485 verifyFormat("int a = ( int )(2.0f);", Spaces); 10486 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 10487 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 10488 verifyFormat("#define x (( int )-1)", Spaces); 10489 10490 // Run the first set of tests again with: 10491 Spaces.SpacesInParentheses = false; 10492 Spaces.SpaceInEmptyParentheses = true; 10493 Spaces.SpacesInCStyleCastParentheses = true; 10494 verifyFormat("call(x, y, z);", Spaces); 10495 verifyFormat("call( );", Spaces); 10496 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10497 verifyFormat("while (( bool )1)\n" 10498 " continue;", 10499 Spaces); 10500 verifyFormat("for (;;)\n" 10501 " continue;", 10502 Spaces); 10503 verifyFormat("if (true)\n" 10504 " f( );\n" 10505 "else if (true)\n" 10506 " f( );", 10507 Spaces); 10508 verifyFormat("do {\n" 10509 " do_something(( int )i);\n" 10510 "} while (something( ));", 10511 Spaces); 10512 verifyFormat("switch (x) {\n" 10513 "default:\n" 10514 " break;\n" 10515 "}", 10516 Spaces); 10517 10518 // Run the first set of tests again with: 10519 Spaces.SpaceAfterCStyleCast = true; 10520 verifyFormat("call(x, y, z);", Spaces); 10521 verifyFormat("call( );", Spaces); 10522 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10523 verifyFormat("while (( bool ) 1)\n" 10524 " continue;", 10525 Spaces); 10526 verifyFormat("for (;;)\n" 10527 " continue;", 10528 Spaces); 10529 verifyFormat("if (true)\n" 10530 " f( );\n" 10531 "else if (true)\n" 10532 " f( );", 10533 Spaces); 10534 verifyFormat("do {\n" 10535 " do_something(( int ) i);\n" 10536 "} while (something( ));", 10537 Spaces); 10538 verifyFormat("switch (x) {\n" 10539 "default:\n" 10540 " break;\n" 10541 "}", 10542 Spaces); 10543 10544 // Run subset of tests again with: 10545 Spaces.SpacesInCStyleCastParentheses = false; 10546 Spaces.SpaceAfterCStyleCast = true; 10547 verifyFormat("while ((bool) 1)\n" 10548 " continue;", 10549 Spaces); 10550 verifyFormat("do {\n" 10551 " do_something((int) i);\n" 10552 "} while (something( ));", 10553 Spaces); 10554 } 10555 10556 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 10557 verifyFormat("int a[5];"); 10558 verifyFormat("a[3] += 42;"); 10559 10560 FormatStyle Spaces = getLLVMStyle(); 10561 Spaces.SpacesInSquareBrackets = true; 10562 // Not lambdas. 10563 verifyFormat("int a[ 5 ];", Spaces); 10564 verifyFormat("a[ 3 ] += 42;", Spaces); 10565 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 10566 verifyFormat("double &operator[](int i) { return 0; }\n" 10567 "int i;", 10568 Spaces); 10569 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 10570 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 10571 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 10572 // Lambdas. 10573 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 10574 verifyFormat("return [ i, args... ] {};", Spaces); 10575 verifyFormat("int foo = [ &bar ]() {};", Spaces); 10576 verifyFormat("int foo = [ = ]() {};", Spaces); 10577 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 10578 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 10579 } 10580 10581 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10582 verifyFormat("int a = 5;"); 10583 verifyFormat("a += 42;"); 10584 verifyFormat("a or_eq 8;"); 10585 10586 FormatStyle Spaces = getLLVMStyle(); 10587 Spaces.SpaceBeforeAssignmentOperators = false; 10588 verifyFormat("int a= 5;", Spaces); 10589 verifyFormat("a+= 42;", Spaces); 10590 verifyFormat("a or_eq 8;", Spaces); 10591 } 10592 10593 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10594 verifyFormat("class Foo : public Bar {};"); 10595 verifyFormat("Foo::Foo() : foo(1) {}"); 10596 verifyFormat("for (auto a : b) {\n}"); 10597 verifyFormat("int x = a ? b : c;"); 10598 verifyFormat("{\n" 10599 "label0:\n" 10600 " int x = 0;\n" 10601 "}"); 10602 verifyFormat("switch (x) {\n" 10603 "case 1:\n" 10604 "default:\n" 10605 "}"); 10606 10607 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10608 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10609 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10610 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10611 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10612 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10613 verifyFormat("{\n" 10614 "label1:\n" 10615 " int x = 0;\n" 10616 "}", 10617 CtorInitializerStyle); 10618 verifyFormat("switch (x) {\n" 10619 "case 1:\n" 10620 "default:\n" 10621 "}", 10622 CtorInitializerStyle); 10623 CtorInitializerStyle.BreakConstructorInitializers = 10624 FormatStyle::BCIS_AfterColon; 10625 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10626 " aaaaaaaaaaaaaaaa(1),\n" 10627 " bbbbbbbbbbbbbbbb(2) {}", 10628 CtorInitializerStyle); 10629 CtorInitializerStyle.BreakConstructorInitializers = 10630 FormatStyle::BCIS_BeforeComma; 10631 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10632 " : aaaaaaaaaaaaaaaa(1)\n" 10633 " , bbbbbbbbbbbbbbbb(2) {}", 10634 CtorInitializerStyle); 10635 CtorInitializerStyle.BreakConstructorInitializers = 10636 FormatStyle::BCIS_BeforeColon; 10637 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10638 " : aaaaaaaaaaaaaaaa(1),\n" 10639 " bbbbbbbbbbbbbbbb(2) {}", 10640 CtorInitializerStyle); 10641 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10642 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10643 ": aaaaaaaaaaaaaaaa(1),\n" 10644 " bbbbbbbbbbbbbbbb(2) {}", 10645 CtorInitializerStyle); 10646 10647 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10648 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10649 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10650 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10651 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10652 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10653 verifyFormat("{\n" 10654 "label2:\n" 10655 " int x = 0;\n" 10656 "}", 10657 InheritanceStyle); 10658 verifyFormat("switch (x) {\n" 10659 "case 1:\n" 10660 "default:\n" 10661 "}", 10662 InheritanceStyle); 10663 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10664 verifyFormat("class Foooooooooooooooooooooo:\n" 10665 " public aaaaaaaaaaaaaaaaaa,\n" 10666 " public bbbbbbbbbbbbbbbbbb {\n" 10667 "}", 10668 InheritanceStyle); 10669 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10670 verifyFormat("class Foooooooooooooooooooooo\n" 10671 " : public aaaaaaaaaaaaaaaaaa\n" 10672 " , public bbbbbbbbbbbbbbbbbb {\n" 10673 "}", 10674 InheritanceStyle); 10675 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10676 verifyFormat("class Foooooooooooooooooooooo\n" 10677 " : public aaaaaaaaaaaaaaaaaa,\n" 10678 " public bbbbbbbbbbbbbbbbbb {\n" 10679 "}", 10680 InheritanceStyle); 10681 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10682 verifyFormat("class Foooooooooooooooooooooo\n" 10683 ": public aaaaaaaaaaaaaaaaaa,\n" 10684 " public bbbbbbbbbbbbbbbbbb {}", 10685 InheritanceStyle); 10686 10687 FormatStyle ForLoopStyle = getLLVMStyle(); 10688 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10689 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10690 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10691 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10692 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10693 verifyFormat("{\n" 10694 "label2:\n" 10695 " int x = 0;\n" 10696 "}", 10697 ForLoopStyle); 10698 verifyFormat("switch (x) {\n" 10699 "case 1:\n" 10700 "default:\n" 10701 "}", 10702 ForLoopStyle); 10703 10704 FormatStyle NoSpaceStyle = getLLVMStyle(); 10705 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10706 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10707 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10708 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10709 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10710 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10711 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10712 verifyFormat("{\n" 10713 "label3:\n" 10714 " int x = 0;\n" 10715 "}", 10716 NoSpaceStyle); 10717 verifyFormat("switch (x) {\n" 10718 "case 1:\n" 10719 "default:\n" 10720 "}", 10721 NoSpaceStyle); 10722 } 10723 10724 TEST_F(FormatTest, AlignConsecutiveMacros) { 10725 FormatStyle Style = getLLVMStyle(); 10726 Style.AlignConsecutiveAssignments = true; 10727 Style.AlignConsecutiveDeclarations = true; 10728 Style.AlignConsecutiveMacros = false; 10729 10730 verifyFormat("#define a 3\n" 10731 "#define bbbb 4\n" 10732 "#define ccc (5)", 10733 Style); 10734 10735 verifyFormat("#define f(x) (x * x)\n" 10736 "#define fff(x, y, z) (x * y + z)\n" 10737 "#define ffff(x, y) (x - y)", 10738 Style); 10739 10740 verifyFormat("#define foo(x, y) (x + y)\n" 10741 "#define bar (5, 6)(2 + 2)", 10742 Style); 10743 10744 verifyFormat("#define a 3\n" 10745 "#define bbbb 4\n" 10746 "#define ccc (5)\n" 10747 "#define f(x) (x * x)\n" 10748 "#define fff(x, y, z) (x * y + z)\n" 10749 "#define ffff(x, y) (x - y)", 10750 Style); 10751 10752 Style.AlignConsecutiveMacros = true; 10753 verifyFormat("#define a 3\n" 10754 "#define bbbb 4\n" 10755 "#define ccc (5)", 10756 Style); 10757 10758 verifyFormat("#define f(x) (x * x)\n" 10759 "#define fff(x, y, z) (x * y + z)\n" 10760 "#define ffff(x, y) (x - y)", 10761 Style); 10762 10763 verifyFormat("#define foo(x, y) (x + y)\n" 10764 "#define bar (5, 6)(2 + 2)", 10765 Style); 10766 10767 verifyFormat("#define a 3\n" 10768 "#define bbbb 4\n" 10769 "#define ccc (5)\n" 10770 "#define f(x) (x * x)\n" 10771 "#define fff(x, y, z) (x * y + z)\n" 10772 "#define ffff(x, y) (x - y)", 10773 Style); 10774 10775 verifyFormat("#define a 5\n" 10776 "#define foo(x, y) (x + y)\n" 10777 "#define CCC (6)\n" 10778 "auto lambda = []() {\n" 10779 " auto ii = 0;\n" 10780 " float j = 0;\n" 10781 " return 0;\n" 10782 "};\n" 10783 "int i = 0;\n" 10784 "float i2 = 0;\n" 10785 "auto v = type{\n" 10786 " i = 1, //\n" 10787 " (i = 2), //\n" 10788 " i = 3 //\n" 10789 "};", 10790 Style); 10791 10792 Style.AlignConsecutiveMacros = false; 10793 Style.ColumnLimit = 20; 10794 10795 verifyFormat("#define a \\\n" 10796 " \"aabbbbbbbbbbbb\"\n" 10797 "#define D \\\n" 10798 " \"aabbbbbbbbbbbb\" \\\n" 10799 " \"ccddeeeeeeeee\"\n" 10800 "#define B \\\n" 10801 " \"QQQQQQQQQQQQQ\" \\\n" 10802 " \"FFFFFFFFFFFFF\" \\\n" 10803 " \"LLLLLLLL\"\n", 10804 Style); 10805 10806 Style.AlignConsecutiveMacros = true; 10807 verifyFormat("#define a \\\n" 10808 " \"aabbbbbbbbbbbb\"\n" 10809 "#define D \\\n" 10810 " \"aabbbbbbbbbbbb\" \\\n" 10811 " \"ccddeeeeeeeee\"\n" 10812 "#define B \\\n" 10813 " \"QQQQQQQQQQQQQ\" \\\n" 10814 " \"FFFFFFFFFFFFF\" \\\n" 10815 " \"LLLLLLLL\"\n", 10816 Style); 10817 } 10818 10819 TEST_F(FormatTest, AlignConsecutiveAssignments) { 10820 FormatStyle Alignment = getLLVMStyle(); 10821 Alignment.AlignConsecutiveMacros = true; 10822 Alignment.AlignConsecutiveAssignments = false; 10823 verifyFormat("int a = 5;\n" 10824 "int oneTwoThree = 123;", 10825 Alignment); 10826 verifyFormat("int a = 5;\n" 10827 "int oneTwoThree = 123;", 10828 Alignment); 10829 10830 Alignment.AlignConsecutiveAssignments = true; 10831 verifyFormat("int a = 5;\n" 10832 "int oneTwoThree = 123;", 10833 Alignment); 10834 verifyFormat("int a = method();\n" 10835 "int oneTwoThree = 133;", 10836 Alignment); 10837 verifyFormat("a &= 5;\n" 10838 "bcd *= 5;\n" 10839 "ghtyf += 5;\n" 10840 "dvfvdb -= 5;\n" 10841 "a /= 5;\n" 10842 "vdsvsv %= 5;\n" 10843 "sfdbddfbdfbb ^= 5;\n" 10844 "dvsdsv |= 5;\n" 10845 "int dsvvdvsdvvv = 123;", 10846 Alignment); 10847 verifyFormat("int i = 1, j = 10;\n" 10848 "something = 2000;", 10849 Alignment); 10850 verifyFormat("something = 2000;\n" 10851 "int i = 1, j = 10;\n", 10852 Alignment); 10853 verifyFormat("something = 2000;\n" 10854 "another = 911;\n" 10855 "int i = 1, j = 10;\n" 10856 "oneMore = 1;\n" 10857 "i = 2;", 10858 Alignment); 10859 verifyFormat("int a = 5;\n" 10860 "int one = 1;\n" 10861 "method();\n" 10862 "int oneTwoThree = 123;\n" 10863 "int oneTwo = 12;", 10864 Alignment); 10865 verifyFormat("int oneTwoThree = 123;\n" 10866 "int oneTwo = 12;\n" 10867 "method();\n", 10868 Alignment); 10869 verifyFormat("int oneTwoThree = 123; // comment\n" 10870 "int oneTwo = 12; // comment", 10871 Alignment); 10872 EXPECT_EQ("int a = 5;\n" 10873 "\n" 10874 "int oneTwoThree = 123;", 10875 format("int a = 5;\n" 10876 "\n" 10877 "int oneTwoThree= 123;", 10878 Alignment)); 10879 EXPECT_EQ("int a = 5;\n" 10880 "int one = 1;\n" 10881 "\n" 10882 "int oneTwoThree = 123;", 10883 format("int a = 5;\n" 10884 "int one = 1;\n" 10885 "\n" 10886 "int oneTwoThree = 123;", 10887 Alignment)); 10888 EXPECT_EQ("int a = 5;\n" 10889 "int one = 1;\n" 10890 "\n" 10891 "int oneTwoThree = 123;\n" 10892 "int oneTwo = 12;", 10893 format("int a = 5;\n" 10894 "int one = 1;\n" 10895 "\n" 10896 "int oneTwoThree = 123;\n" 10897 "int oneTwo = 12;", 10898 Alignment)); 10899 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10900 verifyFormat("#define A \\\n" 10901 " int aaaa = 12; \\\n" 10902 " int b = 23; \\\n" 10903 " int ccc = 234; \\\n" 10904 " int dddddddddd = 2345;", 10905 Alignment); 10906 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10907 verifyFormat("#define A \\\n" 10908 " int aaaa = 12; \\\n" 10909 " int b = 23; \\\n" 10910 " int ccc = 234; \\\n" 10911 " int dddddddddd = 2345;", 10912 Alignment); 10913 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10914 verifyFormat("#define A " 10915 " \\\n" 10916 " int aaaa = 12; " 10917 " \\\n" 10918 " int b = 23; " 10919 " \\\n" 10920 " int ccc = 234; " 10921 " \\\n" 10922 " int dddddddddd = 2345;", 10923 Alignment); 10924 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10925 "k = 4, int l = 5,\n" 10926 " int m = 6) {\n" 10927 " int j = 10;\n" 10928 " otherThing = 1;\n" 10929 "}", 10930 Alignment); 10931 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10932 " int i = 1;\n" 10933 " int j = 2;\n" 10934 " int big = 10000;\n" 10935 "}", 10936 Alignment); 10937 verifyFormat("class C {\n" 10938 "public:\n" 10939 " int i = 1;\n" 10940 " virtual void f() = 0;\n" 10941 "};", 10942 Alignment); 10943 verifyFormat("int i = 1;\n" 10944 "if (SomeType t = getSomething()) {\n" 10945 "}\n" 10946 "int j = 2;\n" 10947 "int big = 10000;", 10948 Alignment); 10949 verifyFormat("int j = 7;\n" 10950 "for (int k = 0; k < N; ++k) {\n" 10951 "}\n" 10952 "int j = 2;\n" 10953 "int big = 10000;\n" 10954 "}", 10955 Alignment); 10956 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10957 verifyFormat("int i = 1;\n" 10958 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10959 " = someLooooooooooooooooongFunction();\n" 10960 "int j = 2;", 10961 Alignment); 10962 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10963 verifyFormat("int i = 1;\n" 10964 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10965 " someLooooooooooooooooongFunction();\n" 10966 "int j = 2;", 10967 Alignment); 10968 10969 verifyFormat("auto lambda = []() {\n" 10970 " auto i = 0;\n" 10971 " return 0;\n" 10972 "};\n" 10973 "int i = 0;\n" 10974 "auto v = type{\n" 10975 " i = 1, //\n" 10976 " (i = 2), //\n" 10977 " i = 3 //\n" 10978 "};", 10979 Alignment); 10980 10981 verifyFormat( 10982 "int i = 1;\n" 10983 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10984 " loooooooooooooooooooooongParameterB);\n" 10985 "int j = 2;", 10986 Alignment); 10987 10988 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 10989 " typename B = very_long_type_name_1,\n" 10990 " typename T_2 = very_long_type_name_2>\n" 10991 "auto foo() {}\n", 10992 Alignment); 10993 verifyFormat("int a, b = 1;\n" 10994 "int c = 2;\n" 10995 "int dd = 3;\n", 10996 Alignment); 10997 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10998 "float b[1][] = {{3.f}};\n", 10999 Alignment); 11000 verifyFormat("for (int i = 0; i < 1; i++)\n" 11001 " int x = 1;\n", 11002 Alignment); 11003 verifyFormat("for (i = 0; i < 1; i++)\n" 11004 " x = 1;\n" 11005 "y = 1;\n", 11006 Alignment); 11007 } 11008 11009 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 11010 FormatStyle Alignment = getLLVMStyle(); 11011 Alignment.AlignConsecutiveMacros = true; 11012 Alignment.AlignConsecutiveDeclarations = false; 11013 verifyFormat("float const a = 5;\n" 11014 "int oneTwoThree = 123;", 11015 Alignment); 11016 verifyFormat("int a = 5;\n" 11017 "float const oneTwoThree = 123;", 11018 Alignment); 11019 11020 Alignment.AlignConsecutiveDeclarations = true; 11021 verifyFormat("float const a = 5;\n" 11022 "int oneTwoThree = 123;", 11023 Alignment); 11024 verifyFormat("int a = method();\n" 11025 "float const oneTwoThree = 133;", 11026 Alignment); 11027 verifyFormat("int i = 1, j = 10;\n" 11028 "something = 2000;", 11029 Alignment); 11030 verifyFormat("something = 2000;\n" 11031 "int i = 1, j = 10;\n", 11032 Alignment); 11033 verifyFormat("float something = 2000;\n" 11034 "double another = 911;\n" 11035 "int i = 1, j = 10;\n" 11036 "const int *oneMore = 1;\n" 11037 "unsigned i = 2;", 11038 Alignment); 11039 verifyFormat("float a = 5;\n" 11040 "int one = 1;\n" 11041 "method();\n" 11042 "const double oneTwoThree = 123;\n" 11043 "const unsigned int oneTwo = 12;", 11044 Alignment); 11045 verifyFormat("int oneTwoThree{0}; // comment\n" 11046 "unsigned oneTwo; // comment", 11047 Alignment); 11048 EXPECT_EQ("float const a = 5;\n" 11049 "\n" 11050 "int oneTwoThree = 123;", 11051 format("float const a = 5;\n" 11052 "\n" 11053 "int oneTwoThree= 123;", 11054 Alignment)); 11055 EXPECT_EQ("float a = 5;\n" 11056 "int one = 1;\n" 11057 "\n" 11058 "unsigned oneTwoThree = 123;", 11059 format("float a = 5;\n" 11060 "int one = 1;\n" 11061 "\n" 11062 "unsigned oneTwoThree = 123;", 11063 Alignment)); 11064 EXPECT_EQ("float a = 5;\n" 11065 "int one = 1;\n" 11066 "\n" 11067 "unsigned oneTwoThree = 123;\n" 11068 "int oneTwo = 12;", 11069 format("float a = 5;\n" 11070 "int one = 1;\n" 11071 "\n" 11072 "unsigned oneTwoThree = 123;\n" 11073 "int oneTwo = 12;", 11074 Alignment)); 11075 // Function prototype alignment 11076 verifyFormat("int a();\n" 11077 "double b();", 11078 Alignment); 11079 verifyFormat("int a(int x);\n" 11080 "double b();", 11081 Alignment); 11082 unsigned OldColumnLimit = Alignment.ColumnLimit; 11083 // We need to set ColumnLimit to zero, in order to stress nested alignments, 11084 // otherwise the function parameters will be re-flowed onto a single line. 11085 Alignment.ColumnLimit = 0; 11086 EXPECT_EQ("int a(int x,\n" 11087 " float y);\n" 11088 "double b(int x,\n" 11089 " double y);", 11090 format("int a(int x,\n" 11091 " float y);\n" 11092 "double b(int x,\n" 11093 " double y);", 11094 Alignment)); 11095 // This ensures that function parameters of function declarations are 11096 // correctly indented when their owning functions are indented. 11097 // The failure case here is for 'double y' to not be indented enough. 11098 EXPECT_EQ("double a(int x);\n" 11099 "int b(int y,\n" 11100 " double z);", 11101 format("double a(int x);\n" 11102 "int b(int y,\n" 11103 " double z);", 11104 Alignment)); 11105 // Set ColumnLimit low so that we induce wrapping immediately after 11106 // the function name and opening paren. 11107 Alignment.ColumnLimit = 13; 11108 verifyFormat("int function(\n" 11109 " int x,\n" 11110 " bool y);", 11111 Alignment); 11112 Alignment.ColumnLimit = OldColumnLimit; 11113 // Ensure function pointers don't screw up recursive alignment 11114 verifyFormat("int a(int x, void (*fp)(int y));\n" 11115 "double b();", 11116 Alignment); 11117 Alignment.AlignConsecutiveAssignments = true; 11118 // Ensure recursive alignment is broken by function braces, so that the 11119 // "a = 1" does not align with subsequent assignments inside the function 11120 // body. 11121 verifyFormat("int func(int a = 1) {\n" 11122 " int b = 2;\n" 11123 " int cc = 3;\n" 11124 "}", 11125 Alignment); 11126 verifyFormat("float something = 2000;\n" 11127 "double another = 911;\n" 11128 "int i = 1, j = 10;\n" 11129 "const int *oneMore = 1;\n" 11130 "unsigned i = 2;", 11131 Alignment); 11132 verifyFormat("int oneTwoThree = {0}; // comment\n" 11133 "unsigned oneTwo = 0; // comment", 11134 Alignment); 11135 // Make sure that scope is correctly tracked, in the absence of braces 11136 verifyFormat("for (int i = 0; i < n; i++)\n" 11137 " j = i;\n" 11138 "double x = 1;\n", 11139 Alignment); 11140 verifyFormat("if (int i = 0)\n" 11141 " j = i;\n" 11142 "double x = 1;\n", 11143 Alignment); 11144 // Ensure operator[] and operator() are comprehended 11145 verifyFormat("struct test {\n" 11146 " long long int foo();\n" 11147 " int operator[](int a);\n" 11148 " double bar();\n" 11149 "};\n", 11150 Alignment); 11151 verifyFormat("struct test {\n" 11152 " long long int foo();\n" 11153 " int operator()(int a);\n" 11154 " double bar();\n" 11155 "};\n", 11156 Alignment); 11157 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 11158 " int const i = 1;\n" 11159 " int * j = 2;\n" 11160 " int big = 10000;\n" 11161 "\n" 11162 " unsigned oneTwoThree = 123;\n" 11163 " int oneTwo = 12;\n" 11164 " method();\n" 11165 " float k = 2;\n" 11166 " int ll = 10000;\n" 11167 "}", 11168 format("void SomeFunction(int parameter= 0) {\n" 11169 " int const i= 1;\n" 11170 " int *j=2;\n" 11171 " int big = 10000;\n" 11172 "\n" 11173 "unsigned oneTwoThree =123;\n" 11174 "int oneTwo = 12;\n" 11175 " method();\n" 11176 "float k= 2;\n" 11177 "int ll=10000;\n" 11178 "}", 11179 Alignment)); 11180 Alignment.AlignConsecutiveAssignments = false; 11181 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11182 verifyFormat("#define A \\\n" 11183 " int aaaa = 12; \\\n" 11184 " float b = 23; \\\n" 11185 " const int ccc = 234; \\\n" 11186 " unsigned dddddddddd = 2345;", 11187 Alignment); 11188 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11189 verifyFormat("#define A \\\n" 11190 " int aaaa = 12; \\\n" 11191 " float b = 23; \\\n" 11192 " const int ccc = 234; \\\n" 11193 " unsigned dddddddddd = 2345;", 11194 Alignment); 11195 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11196 Alignment.ColumnLimit = 30; 11197 verifyFormat("#define A \\\n" 11198 " int aaaa = 12; \\\n" 11199 " float b = 23; \\\n" 11200 " const int ccc = 234; \\\n" 11201 " int dddddddddd = 2345;", 11202 Alignment); 11203 Alignment.ColumnLimit = 80; 11204 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11205 "k = 4, int l = 5,\n" 11206 " int m = 6) {\n" 11207 " const int j = 10;\n" 11208 " otherThing = 1;\n" 11209 "}", 11210 Alignment); 11211 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11212 " int const i = 1;\n" 11213 " int * j = 2;\n" 11214 " int big = 10000;\n" 11215 "}", 11216 Alignment); 11217 verifyFormat("class C {\n" 11218 "public:\n" 11219 " int i = 1;\n" 11220 " virtual void f() = 0;\n" 11221 "};", 11222 Alignment); 11223 verifyFormat("float i = 1;\n" 11224 "if (SomeType t = getSomething()) {\n" 11225 "}\n" 11226 "const unsigned j = 2;\n" 11227 "int big = 10000;", 11228 Alignment); 11229 verifyFormat("float j = 7;\n" 11230 "for (int k = 0; k < N; ++k) {\n" 11231 "}\n" 11232 "unsigned j = 2;\n" 11233 "int big = 10000;\n" 11234 "}", 11235 Alignment); 11236 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11237 verifyFormat("float i = 1;\n" 11238 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11239 " = someLooooooooooooooooongFunction();\n" 11240 "int j = 2;", 11241 Alignment); 11242 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11243 verifyFormat("int i = 1;\n" 11244 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11245 " someLooooooooooooooooongFunction();\n" 11246 "int j = 2;", 11247 Alignment); 11248 11249 Alignment.AlignConsecutiveAssignments = true; 11250 verifyFormat("auto lambda = []() {\n" 11251 " auto ii = 0;\n" 11252 " float j = 0;\n" 11253 " return 0;\n" 11254 "};\n" 11255 "int i = 0;\n" 11256 "float i2 = 0;\n" 11257 "auto v = type{\n" 11258 " i = 1, //\n" 11259 " (i = 2), //\n" 11260 " i = 3 //\n" 11261 "};", 11262 Alignment); 11263 Alignment.AlignConsecutiveAssignments = false; 11264 11265 verifyFormat( 11266 "int i = 1;\n" 11267 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11268 " loooooooooooooooooooooongParameterB);\n" 11269 "int j = 2;", 11270 Alignment); 11271 11272 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 11273 // We expect declarations and assignments to align, as long as it doesn't 11274 // exceed the column limit, starting a new alignment sequence whenever it 11275 // happens. 11276 Alignment.AlignConsecutiveAssignments = true; 11277 Alignment.ColumnLimit = 30; 11278 verifyFormat("float ii = 1;\n" 11279 "unsigned j = 2;\n" 11280 "int someVerylongVariable = 1;\n" 11281 "AnotherLongType ll = 123456;\n" 11282 "VeryVeryLongType k = 2;\n" 11283 "int myvar = 1;", 11284 Alignment); 11285 Alignment.ColumnLimit = 80; 11286 Alignment.AlignConsecutiveAssignments = false; 11287 11288 verifyFormat( 11289 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 11290 " typename LongType, typename B>\n" 11291 "auto foo() {}\n", 11292 Alignment); 11293 verifyFormat("float a, b = 1;\n" 11294 "int c = 2;\n" 11295 "int dd = 3;\n", 11296 Alignment); 11297 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11298 "float b[1][] = {{3.f}};\n", 11299 Alignment); 11300 Alignment.AlignConsecutiveAssignments = true; 11301 verifyFormat("float a, b = 1;\n" 11302 "int c = 2;\n" 11303 "int dd = 3;\n", 11304 Alignment); 11305 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11306 "float b[1][] = {{3.f}};\n", 11307 Alignment); 11308 Alignment.AlignConsecutiveAssignments = false; 11309 11310 Alignment.ColumnLimit = 30; 11311 Alignment.BinPackParameters = false; 11312 verifyFormat("void foo(float a,\n" 11313 " float b,\n" 11314 " int c,\n" 11315 " uint32_t *d) {\n" 11316 " int * e = 0;\n" 11317 " float f = 0;\n" 11318 " double g = 0;\n" 11319 "}\n" 11320 "void bar(ino_t a,\n" 11321 " int b,\n" 11322 " uint32_t *c,\n" 11323 " bool d) {}\n", 11324 Alignment); 11325 Alignment.BinPackParameters = true; 11326 Alignment.ColumnLimit = 80; 11327 11328 // Bug 33507 11329 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 11330 verifyFormat( 11331 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 11332 " static const Version verVs2017;\n" 11333 " return true;\n" 11334 "});\n", 11335 Alignment); 11336 Alignment.PointerAlignment = FormatStyle::PAS_Right; 11337 11338 // See llvm.org/PR35641 11339 Alignment.AlignConsecutiveDeclarations = true; 11340 verifyFormat("int func() { //\n" 11341 " int b;\n" 11342 " unsigned c;\n" 11343 "}", 11344 Alignment); 11345 11346 // See PR37175 11347 FormatStyle Style = getMozillaStyle(); 11348 Style.AlignConsecutiveDeclarations = true; 11349 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 11350 "foo(int a);", 11351 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 11352 } 11353 11354 TEST_F(FormatTest, LinuxBraceBreaking) { 11355 FormatStyle LinuxBraceStyle = getLLVMStyle(); 11356 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 11357 verifyFormat("namespace a\n" 11358 "{\n" 11359 "class A\n" 11360 "{\n" 11361 " void f()\n" 11362 " {\n" 11363 " if (true) {\n" 11364 " a();\n" 11365 " b();\n" 11366 " } else {\n" 11367 " a();\n" 11368 " }\n" 11369 " }\n" 11370 " void g() { return; }\n" 11371 "};\n" 11372 "struct B {\n" 11373 " int x;\n" 11374 "};\n" 11375 "} // namespace a\n", 11376 LinuxBraceStyle); 11377 verifyFormat("enum X {\n" 11378 " Y = 0,\n" 11379 "}\n", 11380 LinuxBraceStyle); 11381 verifyFormat("struct S {\n" 11382 " int Type;\n" 11383 " union {\n" 11384 " int x;\n" 11385 " double y;\n" 11386 " } Value;\n" 11387 " class C\n" 11388 " {\n" 11389 " MyFavoriteType Value;\n" 11390 " } Class;\n" 11391 "}\n", 11392 LinuxBraceStyle); 11393 } 11394 11395 TEST_F(FormatTest, MozillaBraceBreaking) { 11396 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11397 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11398 MozillaBraceStyle.FixNamespaceComments = false; 11399 verifyFormat("namespace a {\n" 11400 "class A\n" 11401 "{\n" 11402 " void f()\n" 11403 " {\n" 11404 " if (true) {\n" 11405 " a();\n" 11406 " b();\n" 11407 " }\n" 11408 " }\n" 11409 " void g() { return; }\n" 11410 "};\n" 11411 "enum E\n" 11412 "{\n" 11413 " A,\n" 11414 " // foo\n" 11415 " B,\n" 11416 " C\n" 11417 "};\n" 11418 "struct B\n" 11419 "{\n" 11420 " int x;\n" 11421 "};\n" 11422 "}\n", 11423 MozillaBraceStyle); 11424 verifyFormat("struct S\n" 11425 "{\n" 11426 " int Type;\n" 11427 " union\n" 11428 " {\n" 11429 " int x;\n" 11430 " double y;\n" 11431 " } Value;\n" 11432 " class C\n" 11433 " {\n" 11434 " MyFavoriteType Value;\n" 11435 " } Class;\n" 11436 "}\n", 11437 MozillaBraceStyle); 11438 } 11439 11440 TEST_F(FormatTest, StroustrupBraceBreaking) { 11441 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11442 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11443 verifyFormat("namespace a {\n" 11444 "class A {\n" 11445 " void f()\n" 11446 " {\n" 11447 " if (true) {\n" 11448 " a();\n" 11449 " b();\n" 11450 " }\n" 11451 " }\n" 11452 " void g() { return; }\n" 11453 "};\n" 11454 "struct B {\n" 11455 " int x;\n" 11456 "};\n" 11457 "} // namespace a\n", 11458 StroustrupBraceStyle); 11459 11460 verifyFormat("void foo()\n" 11461 "{\n" 11462 " if (a) {\n" 11463 " a();\n" 11464 " }\n" 11465 " else {\n" 11466 " b();\n" 11467 " }\n" 11468 "}\n", 11469 StroustrupBraceStyle); 11470 11471 verifyFormat("#ifdef _DEBUG\n" 11472 "int foo(int i = 0)\n" 11473 "#else\n" 11474 "int foo(int i = 5)\n" 11475 "#endif\n" 11476 "{\n" 11477 " return i;\n" 11478 "}", 11479 StroustrupBraceStyle); 11480 11481 verifyFormat("void foo() {}\n" 11482 "void bar()\n" 11483 "#ifdef _DEBUG\n" 11484 "{\n" 11485 " foo();\n" 11486 "}\n" 11487 "#else\n" 11488 "{\n" 11489 "}\n" 11490 "#endif", 11491 StroustrupBraceStyle); 11492 11493 verifyFormat("void foobar() { int i = 5; }\n" 11494 "#ifdef _DEBUG\n" 11495 "void bar() {}\n" 11496 "#else\n" 11497 "void bar() { foobar(); }\n" 11498 "#endif", 11499 StroustrupBraceStyle); 11500 } 11501 11502 TEST_F(FormatTest, AllmanBraceBreaking) { 11503 FormatStyle AllmanBraceStyle = getLLVMStyle(); 11504 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 11505 11506 EXPECT_EQ("namespace a\n" 11507 "{\n" 11508 "void f();\n" 11509 "void g();\n" 11510 "} // namespace a\n", 11511 format("namespace a\n" 11512 "{\n" 11513 "void f();\n" 11514 "void g();\n" 11515 "}\n", 11516 AllmanBraceStyle)); 11517 11518 verifyFormat("namespace a\n" 11519 "{\n" 11520 "class A\n" 11521 "{\n" 11522 " void f()\n" 11523 " {\n" 11524 " if (true)\n" 11525 " {\n" 11526 " a();\n" 11527 " b();\n" 11528 " }\n" 11529 " }\n" 11530 " void g() { return; }\n" 11531 "};\n" 11532 "struct B\n" 11533 "{\n" 11534 " int x;\n" 11535 "};\n" 11536 "union C\n" 11537 "{\n" 11538 "};\n" 11539 "} // namespace a", 11540 AllmanBraceStyle); 11541 11542 verifyFormat("void f()\n" 11543 "{\n" 11544 " if (true)\n" 11545 " {\n" 11546 " a();\n" 11547 " }\n" 11548 " else if (false)\n" 11549 " {\n" 11550 " b();\n" 11551 " }\n" 11552 " else\n" 11553 " {\n" 11554 " c();\n" 11555 " }\n" 11556 "}\n", 11557 AllmanBraceStyle); 11558 11559 verifyFormat("void f()\n" 11560 "{\n" 11561 " for (int i = 0; i < 10; ++i)\n" 11562 " {\n" 11563 " a();\n" 11564 " }\n" 11565 " while (false)\n" 11566 " {\n" 11567 " b();\n" 11568 " }\n" 11569 " do\n" 11570 " {\n" 11571 " c();\n" 11572 " } while (false)\n" 11573 "}\n", 11574 AllmanBraceStyle); 11575 11576 verifyFormat("void f(int a)\n" 11577 "{\n" 11578 " switch (a)\n" 11579 " {\n" 11580 " case 0:\n" 11581 " break;\n" 11582 " case 1:\n" 11583 " {\n" 11584 " break;\n" 11585 " }\n" 11586 " case 2:\n" 11587 " {\n" 11588 " }\n" 11589 " break;\n" 11590 " default:\n" 11591 " break;\n" 11592 " }\n" 11593 "}\n", 11594 AllmanBraceStyle); 11595 11596 verifyFormat("enum X\n" 11597 "{\n" 11598 " Y = 0,\n" 11599 "}\n", 11600 AllmanBraceStyle); 11601 verifyFormat("enum X\n" 11602 "{\n" 11603 " Y = 0\n" 11604 "}\n", 11605 AllmanBraceStyle); 11606 11607 verifyFormat("@interface BSApplicationController ()\n" 11608 "{\n" 11609 "@private\n" 11610 " id _extraIvar;\n" 11611 "}\n" 11612 "@end\n", 11613 AllmanBraceStyle); 11614 11615 verifyFormat("#ifdef _DEBUG\n" 11616 "int foo(int i = 0)\n" 11617 "#else\n" 11618 "int foo(int i = 5)\n" 11619 "#endif\n" 11620 "{\n" 11621 " return i;\n" 11622 "}", 11623 AllmanBraceStyle); 11624 11625 verifyFormat("void foo() {}\n" 11626 "void bar()\n" 11627 "#ifdef _DEBUG\n" 11628 "{\n" 11629 " foo();\n" 11630 "}\n" 11631 "#else\n" 11632 "{\n" 11633 "}\n" 11634 "#endif", 11635 AllmanBraceStyle); 11636 11637 verifyFormat("void foobar() { int i = 5; }\n" 11638 "#ifdef _DEBUG\n" 11639 "void bar() {}\n" 11640 "#else\n" 11641 "void bar() { foobar(); }\n" 11642 "#endif", 11643 AllmanBraceStyle); 11644 11645 // This shouldn't affect ObjC blocks.. 11646 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11647 " // ...\n" 11648 " int i;\n" 11649 "}];", 11650 AllmanBraceStyle); 11651 verifyFormat("void (^block)(void) = ^{\n" 11652 " // ...\n" 11653 " int i;\n" 11654 "};", 11655 AllmanBraceStyle); 11656 // .. or dict literals. 11657 verifyFormat("void f()\n" 11658 "{\n" 11659 " // ...\n" 11660 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11661 "}", 11662 AllmanBraceStyle); 11663 verifyFormat("void f()\n" 11664 "{\n" 11665 " // ...\n" 11666 " [object someMethod:@{a : @\"b\"}];\n" 11667 "}", 11668 AllmanBraceStyle); 11669 verifyFormat("int f()\n" 11670 "{ // comment\n" 11671 " return 42;\n" 11672 "}", 11673 AllmanBraceStyle); 11674 11675 AllmanBraceStyle.ColumnLimit = 19; 11676 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11677 AllmanBraceStyle.ColumnLimit = 18; 11678 verifyFormat("void f()\n" 11679 "{\n" 11680 " int i;\n" 11681 "}", 11682 AllmanBraceStyle); 11683 AllmanBraceStyle.ColumnLimit = 80; 11684 11685 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11686 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11687 FormatStyle::SIS_WithoutElse; 11688 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11689 verifyFormat("void f(bool b)\n" 11690 "{\n" 11691 " if (b)\n" 11692 " {\n" 11693 " return;\n" 11694 " }\n" 11695 "}\n", 11696 BreakBeforeBraceShortIfs); 11697 verifyFormat("void f(bool b)\n" 11698 "{\n" 11699 " if constexpr (b)\n" 11700 " {\n" 11701 " return;\n" 11702 " }\n" 11703 "}\n", 11704 BreakBeforeBraceShortIfs); 11705 verifyFormat("void f(bool b)\n" 11706 "{\n" 11707 " if CONSTEXPR (b)\n" 11708 " {\n" 11709 " return;\n" 11710 " }\n" 11711 "}\n", 11712 BreakBeforeBraceShortIfs); 11713 verifyFormat("void f(bool b)\n" 11714 "{\n" 11715 " if (b) return;\n" 11716 "}\n", 11717 BreakBeforeBraceShortIfs); 11718 verifyFormat("void f(bool b)\n" 11719 "{\n" 11720 " if constexpr (b) return;\n" 11721 "}\n", 11722 BreakBeforeBraceShortIfs); 11723 verifyFormat("void f(bool b)\n" 11724 "{\n" 11725 " if CONSTEXPR (b) return;\n" 11726 "}\n", 11727 BreakBeforeBraceShortIfs); 11728 verifyFormat("void f(bool b)\n" 11729 "{\n" 11730 " while (b)\n" 11731 " {\n" 11732 " return;\n" 11733 " }\n" 11734 "}\n", 11735 BreakBeforeBraceShortIfs); 11736 } 11737 11738 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 11739 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 11740 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 11741 11742 // Make a few changes to the style for testing purposes 11743 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 11744 FormatStyle::SFS_Empty; 11745 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 11746 WhitesmithsBraceStyle.ColumnLimit = 0; 11747 11748 // FIXME: this test case can't decide whether there should be a blank line 11749 // after the ~D() line or not. It adds one if one doesn't exist in the test 11750 // and it removes the line if one exists. 11751 /* 11752 verifyFormat("class A;\n" 11753 "namespace B\n" 11754 " {\n" 11755 "class C;\n" 11756 "// Comment\n" 11757 "class D\n" 11758 " {\n" 11759 "public:\n" 11760 " D();\n" 11761 " ~D() {}\n" 11762 "private:\n" 11763 " enum E\n" 11764 " {\n" 11765 " F\n" 11766 " }\n" 11767 " };\n" 11768 " } // namespace B\n", 11769 WhitesmithsBraceStyle); 11770 */ 11771 11772 verifyFormat("namespace a\n" 11773 " {\n" 11774 "class A\n" 11775 " {\n" 11776 " void f()\n" 11777 " {\n" 11778 " if (true)\n" 11779 " {\n" 11780 " a();\n" 11781 " b();\n" 11782 " }\n" 11783 " }\n" 11784 " void g()\n" 11785 " {\n" 11786 " return;\n" 11787 " }\n" 11788 " };\n" 11789 "struct B\n" 11790 " {\n" 11791 " int x;\n" 11792 " };\n" 11793 " } // namespace a", 11794 WhitesmithsBraceStyle); 11795 11796 verifyFormat("void f()\n" 11797 " {\n" 11798 " if (true)\n" 11799 " {\n" 11800 " a();\n" 11801 " }\n" 11802 " else if (false)\n" 11803 " {\n" 11804 " b();\n" 11805 " }\n" 11806 " else\n" 11807 " {\n" 11808 " c();\n" 11809 " }\n" 11810 " }\n", 11811 WhitesmithsBraceStyle); 11812 11813 verifyFormat("void f()\n" 11814 " {\n" 11815 " for (int i = 0; i < 10; ++i)\n" 11816 " {\n" 11817 " a();\n" 11818 " }\n" 11819 " while (false)\n" 11820 " {\n" 11821 " b();\n" 11822 " }\n" 11823 " do\n" 11824 " {\n" 11825 " c();\n" 11826 " } while (false)\n" 11827 " }\n", 11828 WhitesmithsBraceStyle); 11829 11830 // FIXME: the block and the break under case 2 in this test don't get indented 11831 // correctly 11832 /* 11833 verifyFormat("void switchTest1(int a)\n" 11834 " {\n" 11835 " switch (a)\n" 11836 " {\n" 11837 " case 2:\n" 11838 " {\n" 11839 " }\n" 11840 " break;\n" 11841 " }\n" 11842 " }\n", 11843 WhitesmithsBraceStyle); 11844 */ 11845 11846 // FIXME: the block and the break under case 2 in this test don't get indented 11847 // correctly 11848 /* 11849 verifyFormat("void switchTest2(int a)\n" 11850 " {\n" 11851 " switch (a)\n" 11852 " {\n" 11853 " case 0:\n" 11854 " break;\n" 11855 " case 1:\n" 11856 " {\n" 11857 " break;\n" 11858 " }\n" 11859 " case 2:\n" 11860 " {\n" 11861 " }\n" 11862 " break;\n" 11863 " default:\n" 11864 " break;\n" 11865 " }\n" 11866 " }\n", 11867 WhitesmithsBraceStyle); 11868 */ 11869 11870 verifyFormat("enum X\n" 11871 " {\n" 11872 " Y = 0, // testing\n" 11873 " }\n", 11874 WhitesmithsBraceStyle); 11875 11876 verifyFormat("enum X\n" 11877 " {\n" 11878 " Y = 0\n" 11879 " }\n", 11880 WhitesmithsBraceStyle); 11881 verifyFormat("enum X\n" 11882 " {\n" 11883 " Y = 0,\n" 11884 " Z = 1\n" 11885 " };\n", 11886 WhitesmithsBraceStyle); 11887 11888 verifyFormat("@interface BSApplicationController ()\n" 11889 " {\n" 11890 "@private\n" 11891 " id _extraIvar;\n" 11892 " }\n" 11893 "@end\n", 11894 WhitesmithsBraceStyle); 11895 11896 verifyFormat("#ifdef _DEBUG\n" 11897 "int foo(int i = 0)\n" 11898 "#else\n" 11899 "int foo(int i = 5)\n" 11900 "#endif\n" 11901 " {\n" 11902 " return i;\n" 11903 " }", 11904 WhitesmithsBraceStyle); 11905 11906 verifyFormat("void foo() {}\n" 11907 "void bar()\n" 11908 "#ifdef _DEBUG\n" 11909 " {\n" 11910 " foo();\n" 11911 " }\n" 11912 "#else\n" 11913 " {\n" 11914 " }\n" 11915 "#endif", 11916 WhitesmithsBraceStyle); 11917 11918 verifyFormat("void foobar()\n" 11919 " {\n" 11920 " int i = 5;\n" 11921 " }\n" 11922 "#ifdef _DEBUG\n" 11923 "void bar()\n" 11924 " {\n" 11925 " }\n" 11926 "#else\n" 11927 "void bar()\n" 11928 " {\n" 11929 " foobar();\n" 11930 " }\n" 11931 "#endif", 11932 WhitesmithsBraceStyle); 11933 11934 // This shouldn't affect ObjC blocks.. 11935 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11936 " // ...\n" 11937 " int i;\n" 11938 "}];", 11939 WhitesmithsBraceStyle); 11940 verifyFormat("void (^block)(void) = ^{\n" 11941 " // ...\n" 11942 " int i;\n" 11943 "};", 11944 WhitesmithsBraceStyle); 11945 // .. or dict literals. 11946 verifyFormat("void f()\n" 11947 " {\n" 11948 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11949 " }", 11950 WhitesmithsBraceStyle); 11951 11952 verifyFormat("int f()\n" 11953 " { // comment\n" 11954 " return 42;\n" 11955 " }", 11956 WhitesmithsBraceStyle); 11957 11958 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 11959 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11960 FormatStyle::SIS_Always; 11961 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11962 verifyFormat("void f(bool b)\n" 11963 " {\n" 11964 " if (b)\n" 11965 " {\n" 11966 " return;\n" 11967 " }\n" 11968 " }\n", 11969 BreakBeforeBraceShortIfs); 11970 verifyFormat("void f(bool b)\n" 11971 " {\n" 11972 " if (b) return;\n" 11973 " }\n", 11974 BreakBeforeBraceShortIfs); 11975 verifyFormat("void f(bool b)\n" 11976 " {\n" 11977 " while (b)\n" 11978 " {\n" 11979 " return;\n" 11980 " }\n" 11981 " }\n", 11982 BreakBeforeBraceShortIfs); 11983 } 11984 11985 TEST_F(FormatTest, GNUBraceBreaking) { 11986 FormatStyle GNUBraceStyle = getLLVMStyle(); 11987 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 11988 verifyFormat("namespace a\n" 11989 "{\n" 11990 "class A\n" 11991 "{\n" 11992 " void f()\n" 11993 " {\n" 11994 " int a;\n" 11995 " {\n" 11996 " int b;\n" 11997 " }\n" 11998 " if (true)\n" 11999 " {\n" 12000 " a();\n" 12001 " b();\n" 12002 " }\n" 12003 " }\n" 12004 " void g() { return; }\n" 12005 "}\n" 12006 "} // namespace a", 12007 GNUBraceStyle); 12008 12009 verifyFormat("void f()\n" 12010 "{\n" 12011 " if (true)\n" 12012 " {\n" 12013 " a();\n" 12014 " }\n" 12015 " else if (false)\n" 12016 " {\n" 12017 " b();\n" 12018 " }\n" 12019 " else\n" 12020 " {\n" 12021 " c();\n" 12022 " }\n" 12023 "}\n", 12024 GNUBraceStyle); 12025 12026 verifyFormat("void f()\n" 12027 "{\n" 12028 " for (int i = 0; i < 10; ++i)\n" 12029 " {\n" 12030 " a();\n" 12031 " }\n" 12032 " while (false)\n" 12033 " {\n" 12034 " b();\n" 12035 " }\n" 12036 " do\n" 12037 " {\n" 12038 " c();\n" 12039 " }\n" 12040 " while (false);\n" 12041 "}\n", 12042 GNUBraceStyle); 12043 12044 verifyFormat("void f(int a)\n" 12045 "{\n" 12046 " switch (a)\n" 12047 " {\n" 12048 " case 0:\n" 12049 " break;\n" 12050 " case 1:\n" 12051 " {\n" 12052 " break;\n" 12053 " }\n" 12054 " case 2:\n" 12055 " {\n" 12056 " }\n" 12057 " break;\n" 12058 " default:\n" 12059 " break;\n" 12060 " }\n" 12061 "}\n", 12062 GNUBraceStyle); 12063 12064 verifyFormat("enum X\n" 12065 "{\n" 12066 " Y = 0,\n" 12067 "}\n", 12068 GNUBraceStyle); 12069 12070 verifyFormat("@interface BSApplicationController ()\n" 12071 "{\n" 12072 "@private\n" 12073 " id _extraIvar;\n" 12074 "}\n" 12075 "@end\n", 12076 GNUBraceStyle); 12077 12078 verifyFormat("#ifdef _DEBUG\n" 12079 "int foo(int i = 0)\n" 12080 "#else\n" 12081 "int foo(int i = 5)\n" 12082 "#endif\n" 12083 "{\n" 12084 " return i;\n" 12085 "}", 12086 GNUBraceStyle); 12087 12088 verifyFormat("void foo() {}\n" 12089 "void bar()\n" 12090 "#ifdef _DEBUG\n" 12091 "{\n" 12092 " foo();\n" 12093 "}\n" 12094 "#else\n" 12095 "{\n" 12096 "}\n" 12097 "#endif", 12098 GNUBraceStyle); 12099 12100 verifyFormat("void foobar() { int i = 5; }\n" 12101 "#ifdef _DEBUG\n" 12102 "void bar() {}\n" 12103 "#else\n" 12104 "void bar() { foobar(); }\n" 12105 "#endif", 12106 GNUBraceStyle); 12107 } 12108 12109 TEST_F(FormatTest, WebKitBraceBreaking) { 12110 FormatStyle WebKitBraceStyle = getLLVMStyle(); 12111 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 12112 WebKitBraceStyle.FixNamespaceComments = false; 12113 verifyFormat("namespace a {\n" 12114 "class A {\n" 12115 " void f()\n" 12116 " {\n" 12117 " if (true) {\n" 12118 " a();\n" 12119 " b();\n" 12120 " }\n" 12121 " }\n" 12122 " void g() { return; }\n" 12123 "};\n" 12124 "enum E {\n" 12125 " A,\n" 12126 " // foo\n" 12127 " B,\n" 12128 " C\n" 12129 "};\n" 12130 "struct B {\n" 12131 " int x;\n" 12132 "};\n" 12133 "}\n", 12134 WebKitBraceStyle); 12135 verifyFormat("struct S {\n" 12136 " int Type;\n" 12137 " union {\n" 12138 " int x;\n" 12139 " double y;\n" 12140 " } Value;\n" 12141 " class C {\n" 12142 " MyFavoriteType Value;\n" 12143 " } Class;\n" 12144 "};\n", 12145 WebKitBraceStyle); 12146 } 12147 12148 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 12149 verifyFormat("void f() {\n" 12150 " try {\n" 12151 " } catch (const Exception &e) {\n" 12152 " }\n" 12153 "}\n", 12154 getLLVMStyle()); 12155 } 12156 12157 TEST_F(FormatTest, UnderstandsPragmas) { 12158 verifyFormat("#pragma omp reduction(| : var)"); 12159 verifyFormat("#pragma omp reduction(+ : var)"); 12160 12161 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 12162 "(including parentheses).", 12163 format("#pragma mark Any non-hyphenated or hyphenated string " 12164 "(including parentheses).")); 12165 } 12166 12167 TEST_F(FormatTest, UnderstandPragmaOption) { 12168 verifyFormat("#pragma option -C -A"); 12169 12170 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 12171 } 12172 12173 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 12174 FormatStyle Style = getLLVMStyle(); 12175 Style.ColumnLimit = 20; 12176 12177 // See PR41213 12178 EXPECT_EQ("/*\n" 12179 " *\t9012345\n" 12180 " * /8901\n" 12181 " */", 12182 format("/*\n" 12183 " *\t9012345 /8901\n" 12184 " */", 12185 Style)); 12186 EXPECT_EQ("/*\n" 12187 " *345678\n" 12188 " *\t/8901\n" 12189 " */", 12190 format("/*\n" 12191 " *345678\t/8901\n" 12192 " */", 12193 Style)); 12194 12195 verifyFormat("int a; // the\n" 12196 " // comment", 12197 Style); 12198 EXPECT_EQ("int a; /* first line\n" 12199 " * second\n" 12200 " * line third\n" 12201 " * line\n" 12202 " */", 12203 format("int a; /* first line\n" 12204 " * second\n" 12205 " * line third\n" 12206 " * line\n" 12207 " */", 12208 Style)); 12209 EXPECT_EQ("int a; // first line\n" 12210 " // second\n" 12211 " // line third\n" 12212 " // line", 12213 format("int a; // first line\n" 12214 " // second line\n" 12215 " // third line", 12216 Style)); 12217 12218 Style.PenaltyExcessCharacter = 90; 12219 verifyFormat("int a; // the comment", Style); 12220 EXPECT_EQ("int a; // the comment\n" 12221 " // aaa", 12222 format("int a; // the comment aaa", Style)); 12223 EXPECT_EQ("int a; /* first line\n" 12224 " * second line\n" 12225 " * third line\n" 12226 " */", 12227 format("int a; /* first line\n" 12228 " * second line\n" 12229 " * third line\n" 12230 " */", 12231 Style)); 12232 EXPECT_EQ("int a; // first line\n" 12233 " // second line\n" 12234 " // third line", 12235 format("int a; // first line\n" 12236 " // second line\n" 12237 " // third line", 12238 Style)); 12239 // FIXME: Investigate why this is not getting the same layout as the test 12240 // above. 12241 EXPECT_EQ("int a; /* first line\n" 12242 " * second line\n" 12243 " * third line\n" 12244 " */", 12245 format("int a; /* first line second line third line" 12246 "\n*/", 12247 Style)); 12248 12249 EXPECT_EQ("// foo bar baz bazfoo\n" 12250 "// foo bar foo bar\n", 12251 format("// foo bar baz bazfoo\n" 12252 "// foo bar foo bar\n", 12253 Style)); 12254 EXPECT_EQ("// foo bar baz bazfoo\n" 12255 "// foo bar foo bar\n", 12256 format("// foo bar baz bazfoo\n" 12257 "// foo bar foo bar\n", 12258 Style)); 12259 12260 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 12261 // next one. 12262 EXPECT_EQ("// foo bar baz bazfoo\n" 12263 "// bar foo bar\n", 12264 format("// foo bar baz bazfoo bar\n" 12265 "// foo bar\n", 12266 Style)); 12267 12268 EXPECT_EQ("// foo bar baz bazfoo\n" 12269 "// foo bar baz bazfoo\n" 12270 "// bar foo bar\n", 12271 format("// foo bar baz bazfoo\n" 12272 "// foo bar baz bazfoo bar\n" 12273 "// foo bar\n", 12274 Style)); 12275 12276 EXPECT_EQ("// foo bar baz bazfoo\n" 12277 "// foo bar baz bazfoo\n" 12278 "// bar foo bar\n", 12279 format("// foo bar baz bazfoo\n" 12280 "// foo bar baz bazfoo bar\n" 12281 "// foo bar\n", 12282 Style)); 12283 12284 // Make sure we do not keep protruding characters if strict mode reflow is 12285 // cheaper than keeping protruding characters. 12286 Style.ColumnLimit = 21; 12287 EXPECT_EQ( 12288 "// foo foo foo foo\n" 12289 "// foo foo foo foo\n" 12290 "// foo foo foo foo\n", 12291 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 12292 12293 EXPECT_EQ("int a = /* long block\n" 12294 " comment */\n" 12295 " 42;", 12296 format("int a = /* long block comment */ 42;", Style)); 12297 } 12298 12299 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 12300 for (size_t i = 1; i < Styles.size(); ++i) \ 12301 EXPECT_EQ(Styles[0], Styles[i]) \ 12302 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 12303 12304 TEST_F(FormatTest, GetsPredefinedStyleByName) { 12305 SmallVector<FormatStyle, 3> Styles; 12306 Styles.resize(3); 12307 12308 Styles[0] = getLLVMStyle(); 12309 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 12310 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 12311 EXPECT_ALL_STYLES_EQUAL(Styles); 12312 12313 Styles[0] = getGoogleStyle(); 12314 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 12315 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 12316 EXPECT_ALL_STYLES_EQUAL(Styles); 12317 12318 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12319 EXPECT_TRUE( 12320 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 12321 EXPECT_TRUE( 12322 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 12323 EXPECT_ALL_STYLES_EQUAL(Styles); 12324 12325 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 12326 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 12327 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 12328 EXPECT_ALL_STYLES_EQUAL(Styles); 12329 12330 Styles[0] = getMozillaStyle(); 12331 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 12332 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 12333 EXPECT_ALL_STYLES_EQUAL(Styles); 12334 12335 Styles[0] = getWebKitStyle(); 12336 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 12337 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 12338 EXPECT_ALL_STYLES_EQUAL(Styles); 12339 12340 Styles[0] = getGNUStyle(); 12341 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 12342 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 12343 EXPECT_ALL_STYLES_EQUAL(Styles); 12344 12345 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 12346 } 12347 12348 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 12349 SmallVector<FormatStyle, 8> Styles; 12350 Styles.resize(2); 12351 12352 Styles[0] = getGoogleStyle(); 12353 Styles[1] = getLLVMStyle(); 12354 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12355 EXPECT_ALL_STYLES_EQUAL(Styles); 12356 12357 Styles.resize(5); 12358 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12359 Styles[1] = getLLVMStyle(); 12360 Styles[1].Language = FormatStyle::LK_JavaScript; 12361 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12362 12363 Styles[2] = getLLVMStyle(); 12364 Styles[2].Language = FormatStyle::LK_JavaScript; 12365 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 12366 "BasedOnStyle: Google", 12367 &Styles[2]) 12368 .value()); 12369 12370 Styles[3] = getLLVMStyle(); 12371 Styles[3].Language = FormatStyle::LK_JavaScript; 12372 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 12373 "Language: JavaScript", 12374 &Styles[3]) 12375 .value()); 12376 12377 Styles[4] = getLLVMStyle(); 12378 Styles[4].Language = FormatStyle::LK_JavaScript; 12379 EXPECT_EQ(0, parseConfiguration("---\n" 12380 "BasedOnStyle: LLVM\n" 12381 "IndentWidth: 123\n" 12382 "---\n" 12383 "BasedOnStyle: Google\n" 12384 "Language: JavaScript", 12385 &Styles[4]) 12386 .value()); 12387 EXPECT_ALL_STYLES_EQUAL(Styles); 12388 } 12389 12390 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 12391 Style.FIELD = false; \ 12392 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 12393 EXPECT_TRUE(Style.FIELD); \ 12394 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 12395 EXPECT_FALSE(Style.FIELD); 12396 12397 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 12398 12399 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 12400 Style.STRUCT.FIELD = false; \ 12401 EXPECT_EQ(0, \ 12402 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 12403 .value()); \ 12404 EXPECT_TRUE(Style.STRUCT.FIELD); \ 12405 EXPECT_EQ(0, \ 12406 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 12407 .value()); \ 12408 EXPECT_FALSE(Style.STRUCT.FIELD); 12409 12410 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 12411 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 12412 12413 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 12414 EXPECT_NE(VALUE, Style.FIELD); \ 12415 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 12416 EXPECT_EQ(VALUE, Style.FIELD) 12417 12418 TEST_F(FormatTest, ParsesConfigurationBools) { 12419 FormatStyle Style = {}; 12420 Style.Language = FormatStyle::LK_Cpp; 12421 CHECK_PARSE_BOOL(AlignOperands); 12422 CHECK_PARSE_BOOL(AlignTrailingComments); 12423 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 12424 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 12425 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 12426 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 12427 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 12428 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 12429 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 12430 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 12431 CHECK_PARSE_BOOL(BinPackArguments); 12432 CHECK_PARSE_BOOL(BinPackParameters); 12433 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 12434 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 12435 CHECK_PARSE_BOOL(BreakStringLiterals); 12436 CHECK_PARSE_BOOL(CompactNamespaces); 12437 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 12438 CHECK_PARSE_BOOL(DerivePointerAlignment); 12439 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 12440 CHECK_PARSE_BOOL(DisableFormat); 12441 CHECK_PARSE_BOOL(IndentCaseLabels); 12442 CHECK_PARSE_BOOL(IndentGotoLabels); 12443 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 12444 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 12445 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 12446 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 12447 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 12448 CHECK_PARSE_BOOL(ReflowComments); 12449 CHECK_PARSE_BOOL(SortIncludes); 12450 CHECK_PARSE_BOOL(SortUsingDeclarations); 12451 CHECK_PARSE_BOOL(SpacesInParentheses); 12452 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 12453 CHECK_PARSE_BOOL(SpacesInAngles); 12454 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 12455 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 12456 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 12457 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 12458 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 12459 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 12460 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 12461 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 12462 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 12463 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 12464 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 12465 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 12466 12467 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 12468 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 12469 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 12470 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 12471 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 12472 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 12473 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 12474 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 12475 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 12476 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 12477 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 12478 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 12479 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 12480 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 12481 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 12482 } 12483 12484 #undef CHECK_PARSE_BOOL 12485 12486 TEST_F(FormatTest, ParsesConfiguration) { 12487 FormatStyle Style = {}; 12488 Style.Language = FormatStyle::LK_Cpp; 12489 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 12490 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 12491 ConstructorInitializerIndentWidth, 1234u); 12492 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 12493 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 12494 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 12495 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 12496 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 12497 PenaltyBreakBeforeFirstCallParameter, 1234u); 12498 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 12499 PenaltyBreakTemplateDeclaration, 1234u); 12500 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 12501 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 12502 PenaltyReturnTypeOnItsOwnLine, 1234u); 12503 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 12504 SpacesBeforeTrailingComments, 1234u); 12505 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 12506 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 12507 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 12508 12509 Style.PointerAlignment = FormatStyle::PAS_Middle; 12510 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 12511 FormatStyle::PAS_Left); 12512 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 12513 FormatStyle::PAS_Right); 12514 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 12515 FormatStyle::PAS_Middle); 12516 // For backward compatibility: 12517 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 12518 FormatStyle::PAS_Left); 12519 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 12520 FormatStyle::PAS_Right); 12521 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 12522 FormatStyle::PAS_Middle); 12523 12524 Style.Standard = FormatStyle::LS_Auto; 12525 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 12526 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 12527 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 12528 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 12529 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 12530 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 12531 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 12532 // Legacy aliases: 12533 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 12534 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 12535 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 12536 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 12537 12538 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12539 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 12540 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 12541 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 12542 FormatStyle::BOS_None); 12543 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 12544 FormatStyle::BOS_All); 12545 // For backward compatibility: 12546 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 12547 FormatStyle::BOS_None); 12548 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 12549 FormatStyle::BOS_All); 12550 12551 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 12552 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 12553 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12554 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 12555 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 12556 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 12557 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 12558 // For backward compatibility: 12559 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 12560 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12561 12562 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12563 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 12564 FormatStyle::BILS_BeforeComma); 12565 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 12566 FormatStyle::BILS_AfterColon); 12567 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 12568 FormatStyle::BILS_BeforeColon); 12569 // For backward compatibility: 12570 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 12571 FormatStyle::BILS_BeforeComma); 12572 12573 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12574 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 12575 FormatStyle::BAS_Align); 12576 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 12577 FormatStyle::BAS_DontAlign); 12578 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 12579 FormatStyle::BAS_AlwaysBreak); 12580 // For backward compatibility: 12581 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 12582 FormatStyle::BAS_DontAlign); 12583 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 12584 FormatStyle::BAS_Align); 12585 12586 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12587 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 12588 FormatStyle::ENAS_DontAlign); 12589 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 12590 FormatStyle::ENAS_Left); 12591 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 12592 FormatStyle::ENAS_Right); 12593 // For backward compatibility: 12594 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 12595 FormatStyle::ENAS_Left); 12596 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 12597 FormatStyle::ENAS_Right); 12598 12599 Style.UseTab = FormatStyle::UT_ForIndentation; 12600 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 12601 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 12602 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 12603 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 12604 FormatStyle::UT_ForContinuationAndIndentation); 12605 // For backward compatibility: 12606 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 12607 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 12608 12609 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 12610 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 12611 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12612 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 12613 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 12614 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 12615 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12616 // For backward compatibility: 12617 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 12618 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12619 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 12620 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12621 12622 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 12623 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 12624 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12625 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 12626 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 12627 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 12628 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 12629 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 12630 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12631 // For backward compatibility: 12632 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 12633 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12634 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 12635 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12636 12637 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 12638 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 12639 FormatStyle::SBPO_Never); 12640 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 12641 FormatStyle::SBPO_Always); 12642 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 12643 FormatStyle::SBPO_ControlStatements); 12644 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 12645 FormatStyle::SBPO_NonEmptyParentheses); 12646 // For backward compatibility: 12647 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 12648 FormatStyle::SBPO_Never); 12649 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 12650 FormatStyle::SBPO_ControlStatements); 12651 12652 Style.ColumnLimit = 123; 12653 FormatStyle BaseStyle = getLLVMStyle(); 12654 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 12655 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 12656 12657 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12658 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 12659 FormatStyle::BS_Attach); 12660 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 12661 FormatStyle::BS_Linux); 12662 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 12663 FormatStyle::BS_Mozilla); 12664 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 12665 FormatStyle::BS_Stroustrup); 12666 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 12667 FormatStyle::BS_Allman); 12668 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 12669 FormatStyle::BS_Whitesmiths); 12670 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 12671 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 12672 FormatStyle::BS_WebKit); 12673 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 12674 FormatStyle::BS_Custom); 12675 12676 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 12677 CHECK_PARSE("BraceWrapping:\n" 12678 " AfterControlStatement: MultiLine", 12679 BraceWrapping.AfterControlStatement, 12680 FormatStyle::BWACS_MultiLine); 12681 CHECK_PARSE("BraceWrapping:\n" 12682 " AfterControlStatement: Always", 12683 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12684 CHECK_PARSE("BraceWrapping:\n" 12685 " AfterControlStatement: Never", 12686 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12687 // For backward compatibility: 12688 CHECK_PARSE("BraceWrapping:\n" 12689 " AfterControlStatement: true", 12690 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12691 CHECK_PARSE("BraceWrapping:\n" 12692 " AfterControlStatement: false", 12693 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12694 12695 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 12696 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 12697 FormatStyle::RTBS_None); 12698 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 12699 FormatStyle::RTBS_All); 12700 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 12701 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 12702 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 12703 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 12704 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 12705 AlwaysBreakAfterReturnType, 12706 FormatStyle::RTBS_TopLevelDefinitions); 12707 12708 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 12709 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 12710 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 12711 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 12712 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12713 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 12714 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12715 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 12716 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12717 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 12718 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12719 12720 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 12721 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 12722 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 12723 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 12724 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 12725 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 12726 AlwaysBreakAfterDefinitionReturnType, 12727 FormatStyle::DRTBS_TopLevel); 12728 12729 Style.NamespaceIndentation = FormatStyle::NI_All; 12730 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 12731 FormatStyle::NI_None); 12732 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 12733 FormatStyle::NI_Inner); 12734 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 12735 FormatStyle::NI_All); 12736 12737 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 12738 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 12739 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12740 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 12741 AllowShortIfStatementsOnASingleLine, 12742 FormatStyle::SIS_WithoutElse); 12743 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 12744 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 12745 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 12746 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12747 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 12748 AllowShortIfStatementsOnASingleLine, 12749 FormatStyle::SIS_WithoutElse); 12750 12751 // FIXME: This is required because parsing a configuration simply overwrites 12752 // the first N elements of the list instead of resetting it. 12753 Style.ForEachMacros.clear(); 12754 std::vector<std::string> BoostForeach; 12755 BoostForeach.push_back("BOOST_FOREACH"); 12756 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 12757 std::vector<std::string> BoostAndQForeach; 12758 BoostAndQForeach.push_back("BOOST_FOREACH"); 12759 BoostAndQForeach.push_back("Q_FOREACH"); 12760 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 12761 BoostAndQForeach); 12762 12763 Style.StatementMacros.clear(); 12764 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 12765 std::vector<std::string>{"QUNUSED"}); 12766 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 12767 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 12768 12769 Style.NamespaceMacros.clear(); 12770 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 12771 std::vector<std::string>{"TESTSUITE"}); 12772 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 12773 std::vector<std::string>({"TESTSUITE", "SUITE"})); 12774 12775 Style.IncludeStyle.IncludeCategories.clear(); 12776 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 12777 {"abc/.*", 2, 0}, {".*", 1, 0}}; 12778 CHECK_PARSE("IncludeCategories:\n" 12779 " - Regex: abc/.*\n" 12780 " Priority: 2\n" 12781 " - Regex: .*\n" 12782 " Priority: 1", 12783 IncludeStyle.IncludeCategories, ExpectedCategories); 12784 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 12785 "abc$"); 12786 12787 Style.RawStringFormats.clear(); 12788 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 12789 { 12790 FormatStyle::LK_TextProto, 12791 {"pb", "proto"}, 12792 {"PARSE_TEXT_PROTO"}, 12793 /*CanonicalDelimiter=*/"", 12794 "llvm", 12795 }, 12796 { 12797 FormatStyle::LK_Cpp, 12798 {"cc", "cpp"}, 12799 {"C_CODEBLOCK", "CPPEVAL"}, 12800 /*CanonicalDelimiter=*/"cc", 12801 /*BasedOnStyle=*/"", 12802 }, 12803 }; 12804 12805 CHECK_PARSE("RawStringFormats:\n" 12806 " - Language: TextProto\n" 12807 " Delimiters:\n" 12808 " - 'pb'\n" 12809 " - 'proto'\n" 12810 " EnclosingFunctions:\n" 12811 " - 'PARSE_TEXT_PROTO'\n" 12812 " BasedOnStyle: llvm\n" 12813 " - Language: Cpp\n" 12814 " Delimiters:\n" 12815 " - 'cc'\n" 12816 " - 'cpp'\n" 12817 " EnclosingFunctions:\n" 12818 " - 'C_CODEBLOCK'\n" 12819 " - 'CPPEVAL'\n" 12820 " CanonicalDelimiter: 'cc'", 12821 RawStringFormats, ExpectedRawStringFormats); 12822 } 12823 12824 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 12825 FormatStyle Style = {}; 12826 Style.Language = FormatStyle::LK_Cpp; 12827 CHECK_PARSE("Language: Cpp\n" 12828 "IndentWidth: 12", 12829 IndentWidth, 12u); 12830 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 12831 "IndentWidth: 34", 12832 &Style), 12833 ParseError::Unsuitable); 12834 EXPECT_EQ(12u, Style.IndentWidth); 12835 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12836 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12837 12838 Style.Language = FormatStyle::LK_JavaScript; 12839 CHECK_PARSE("Language: JavaScript\n" 12840 "IndentWidth: 12", 12841 IndentWidth, 12u); 12842 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 12843 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 12844 "IndentWidth: 34", 12845 &Style), 12846 ParseError::Unsuitable); 12847 EXPECT_EQ(23u, Style.IndentWidth); 12848 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12849 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12850 12851 CHECK_PARSE("BasedOnStyle: LLVM\n" 12852 "IndentWidth: 67", 12853 IndentWidth, 67u); 12854 12855 CHECK_PARSE("---\n" 12856 "Language: JavaScript\n" 12857 "IndentWidth: 12\n" 12858 "---\n" 12859 "Language: Cpp\n" 12860 "IndentWidth: 34\n" 12861 "...\n", 12862 IndentWidth, 12u); 12863 12864 Style.Language = FormatStyle::LK_Cpp; 12865 CHECK_PARSE("---\n" 12866 "Language: JavaScript\n" 12867 "IndentWidth: 12\n" 12868 "---\n" 12869 "Language: Cpp\n" 12870 "IndentWidth: 34\n" 12871 "...\n", 12872 IndentWidth, 34u); 12873 CHECK_PARSE("---\n" 12874 "IndentWidth: 78\n" 12875 "---\n" 12876 "Language: JavaScript\n" 12877 "IndentWidth: 56\n" 12878 "...\n", 12879 IndentWidth, 78u); 12880 12881 Style.ColumnLimit = 123; 12882 Style.IndentWidth = 234; 12883 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 12884 Style.TabWidth = 345; 12885 EXPECT_FALSE(parseConfiguration("---\n" 12886 "IndentWidth: 456\n" 12887 "BreakBeforeBraces: Allman\n" 12888 "---\n" 12889 "Language: JavaScript\n" 12890 "IndentWidth: 111\n" 12891 "TabWidth: 111\n" 12892 "---\n" 12893 "Language: Cpp\n" 12894 "BreakBeforeBraces: Stroustrup\n" 12895 "TabWidth: 789\n" 12896 "...\n", 12897 &Style)); 12898 EXPECT_EQ(123u, Style.ColumnLimit); 12899 EXPECT_EQ(456u, Style.IndentWidth); 12900 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 12901 EXPECT_EQ(789u, Style.TabWidth); 12902 12903 EXPECT_EQ(parseConfiguration("---\n" 12904 "Language: JavaScript\n" 12905 "IndentWidth: 56\n" 12906 "---\n" 12907 "IndentWidth: 78\n" 12908 "...\n", 12909 &Style), 12910 ParseError::Error); 12911 EXPECT_EQ(parseConfiguration("---\n" 12912 "Language: JavaScript\n" 12913 "IndentWidth: 56\n" 12914 "---\n" 12915 "Language: JavaScript\n" 12916 "IndentWidth: 78\n" 12917 "...\n", 12918 &Style), 12919 ParseError::Error); 12920 12921 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12922 } 12923 12924 #undef CHECK_PARSE 12925 12926 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 12927 FormatStyle Style = {}; 12928 Style.Language = FormatStyle::LK_JavaScript; 12929 Style.BreakBeforeTernaryOperators = true; 12930 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 12931 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12932 12933 Style.BreakBeforeTernaryOperators = true; 12934 EXPECT_EQ(0, parseConfiguration("---\n" 12935 "BasedOnStyle: Google\n" 12936 "---\n" 12937 "Language: JavaScript\n" 12938 "IndentWidth: 76\n" 12939 "...\n", 12940 &Style) 12941 .value()); 12942 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12943 EXPECT_EQ(76u, Style.IndentWidth); 12944 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12945 } 12946 12947 TEST_F(FormatTest, ConfigurationRoundTripTest) { 12948 FormatStyle Style = getLLVMStyle(); 12949 std::string YAML = configurationAsText(Style); 12950 FormatStyle ParsedStyle = {}; 12951 ParsedStyle.Language = FormatStyle::LK_Cpp; 12952 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 12953 EXPECT_EQ(Style, ParsedStyle); 12954 } 12955 12956 TEST_F(FormatTest, WorksFor8bitEncodings) { 12957 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 12958 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 12959 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 12960 "\"\xef\xee\xf0\xf3...\"", 12961 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 12962 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 12963 "\xef\xee\xf0\xf3...\"", 12964 getLLVMStyleWithColumns(12))); 12965 } 12966 12967 TEST_F(FormatTest, HandlesUTF8BOM) { 12968 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 12969 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 12970 format("\xef\xbb\xbf#include <iostream>")); 12971 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 12972 format("\xef\xbb\xbf\n#include <iostream>")); 12973 } 12974 12975 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 12976 #if !defined(_MSC_VER) 12977 12978 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 12979 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 12980 getLLVMStyleWithColumns(35)); 12981 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 12982 getLLVMStyleWithColumns(31)); 12983 verifyFormat("// Однажды в студёную зимнюю пору...", 12984 getLLVMStyleWithColumns(36)); 12985 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 12986 verifyFormat("/* Однажды в студёную зимнюю пору... */", 12987 getLLVMStyleWithColumns(39)); 12988 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 12989 getLLVMStyleWithColumns(35)); 12990 } 12991 12992 TEST_F(FormatTest, SplitsUTF8Strings) { 12993 // Non-printable characters' width is currently considered to be the length in 12994 // bytes in UTF8. The characters can be displayed in very different manner 12995 // (zero-width, single width with a substitution glyph, expanded to their code 12996 // (e.g. "<8d>"), so there's no single correct way to handle them. 12997 EXPECT_EQ("\"aaaaÄ\"\n" 12998 "\"\xc2\x8d\";", 12999 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13000 EXPECT_EQ("\"aaaaaaaÄ\"\n" 13001 "\"\xc2\x8d\";", 13002 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13003 EXPECT_EQ("\"Однажды, в \"\n" 13004 "\"студёную \"\n" 13005 "\"зимнюю \"\n" 13006 "\"пору,\"", 13007 format("\"Однажды, в студёную зимнюю пору,\"", 13008 getLLVMStyleWithColumns(13))); 13009 EXPECT_EQ( 13010 "\"一 二 三 \"\n" 13011 "\"四 五六 \"\n" 13012 "\"七 八 九 \"\n" 13013 "\"十\"", 13014 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 13015 EXPECT_EQ("\"一\t\"\n" 13016 "\"二 \t\"\n" 13017 "\"三 四 \"\n" 13018 "\"五\t\"\n" 13019 "\"六 \t\"\n" 13020 "\"七 \"\n" 13021 "\"八九十\tqq\"", 13022 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 13023 getLLVMStyleWithColumns(11))); 13024 13025 // UTF8 character in an escape sequence. 13026 EXPECT_EQ("\"aaaaaa\"\n" 13027 "\"\\\xC2\x8D\"", 13028 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 13029 } 13030 13031 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 13032 EXPECT_EQ("const char *sssss =\n" 13033 " \"一二三四五六七八\\\n" 13034 " 九 十\";", 13035 format("const char *sssss = \"一二三四五六七八\\\n" 13036 " 九 十\";", 13037 getLLVMStyleWithColumns(30))); 13038 } 13039 13040 TEST_F(FormatTest, SplitsUTF8LineComments) { 13041 EXPECT_EQ("// aaaaÄ\xc2\x8d", 13042 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 13043 EXPECT_EQ("// Я из лесу\n" 13044 "// вышел; был\n" 13045 "// сильный\n" 13046 "// мороз.", 13047 format("// Я из лесу вышел; был сильный мороз.", 13048 getLLVMStyleWithColumns(13))); 13049 EXPECT_EQ("// 一二三\n" 13050 "// 四五六七\n" 13051 "// 八 九\n" 13052 "// 十", 13053 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 13054 } 13055 13056 TEST_F(FormatTest, SplitsUTF8BlockComments) { 13057 EXPECT_EQ("/* Гляжу,\n" 13058 " * поднимается\n" 13059 " * медленно в\n" 13060 " * гору\n" 13061 " * Лошадка,\n" 13062 " * везущая\n" 13063 " * хворосту\n" 13064 " * воз. */", 13065 format("/* Гляжу, поднимается медленно в гору\n" 13066 " * Лошадка, везущая хворосту воз. */", 13067 getLLVMStyleWithColumns(13))); 13068 EXPECT_EQ( 13069 "/* 一二三\n" 13070 " * 四五六七\n" 13071 " * 八 九\n" 13072 " * 十 */", 13073 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 13074 EXPECT_EQ("/* \n" 13075 " * \n" 13076 " * - */", 13077 format("/* - */", getLLVMStyleWithColumns(12))); 13078 } 13079 13080 #endif // _MSC_VER 13081 13082 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 13083 FormatStyle Style = getLLVMStyle(); 13084 13085 Style.ConstructorInitializerIndentWidth = 4; 13086 verifyFormat( 13087 "SomeClass::Constructor()\n" 13088 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13089 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13090 Style); 13091 13092 Style.ConstructorInitializerIndentWidth = 2; 13093 verifyFormat( 13094 "SomeClass::Constructor()\n" 13095 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13096 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13097 Style); 13098 13099 Style.ConstructorInitializerIndentWidth = 0; 13100 verifyFormat( 13101 "SomeClass::Constructor()\n" 13102 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13103 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13104 Style); 13105 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13106 verifyFormat( 13107 "SomeLongTemplateVariableName<\n" 13108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 13109 Style); 13110 verifyFormat("bool smaller = 1 < " 13111 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 13112 " " 13113 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 13114 Style); 13115 13116 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 13117 verifyFormat("SomeClass::Constructor() :\n" 13118 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 13119 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 13120 Style); 13121 } 13122 13123 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 13124 FormatStyle Style = getLLVMStyle(); 13125 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 13126 Style.ConstructorInitializerIndentWidth = 4; 13127 verifyFormat("SomeClass::Constructor()\n" 13128 " : a(a)\n" 13129 " , b(b)\n" 13130 " , c(c) {}", 13131 Style); 13132 verifyFormat("SomeClass::Constructor()\n" 13133 " : a(a) {}", 13134 Style); 13135 13136 Style.ColumnLimit = 0; 13137 verifyFormat("SomeClass::Constructor()\n" 13138 " : a(a) {}", 13139 Style); 13140 verifyFormat("SomeClass::Constructor() noexcept\n" 13141 " : a(a) {}", 13142 Style); 13143 verifyFormat("SomeClass::Constructor()\n" 13144 " : a(a)\n" 13145 " , b(b)\n" 13146 " , c(c) {}", 13147 Style); 13148 verifyFormat("SomeClass::Constructor()\n" 13149 " : a(a) {\n" 13150 " foo();\n" 13151 " bar();\n" 13152 "}", 13153 Style); 13154 13155 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 13156 verifyFormat("SomeClass::Constructor()\n" 13157 " : a(a)\n" 13158 " , b(b)\n" 13159 " , c(c) {\n}", 13160 Style); 13161 verifyFormat("SomeClass::Constructor()\n" 13162 " : a(a) {\n}", 13163 Style); 13164 13165 Style.ColumnLimit = 80; 13166 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 13167 Style.ConstructorInitializerIndentWidth = 2; 13168 verifyFormat("SomeClass::Constructor()\n" 13169 " : a(a)\n" 13170 " , b(b)\n" 13171 " , c(c) {}", 13172 Style); 13173 13174 Style.ConstructorInitializerIndentWidth = 0; 13175 verifyFormat("SomeClass::Constructor()\n" 13176 ": a(a)\n" 13177 ", b(b)\n" 13178 ", c(c) {}", 13179 Style); 13180 13181 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 13182 Style.ConstructorInitializerIndentWidth = 4; 13183 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 13184 verifyFormat( 13185 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 13186 Style); 13187 verifyFormat( 13188 "SomeClass::Constructor()\n" 13189 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 13190 Style); 13191 Style.ConstructorInitializerIndentWidth = 4; 13192 Style.ColumnLimit = 60; 13193 verifyFormat("SomeClass::Constructor()\n" 13194 " : aaaaaaaa(aaaaaaaa)\n" 13195 " , aaaaaaaa(aaaaaaaa)\n" 13196 " , aaaaaaaa(aaaaaaaa) {}", 13197 Style); 13198 } 13199 13200 TEST_F(FormatTest, Destructors) { 13201 verifyFormat("void F(int &i) { i.~int(); }"); 13202 verifyFormat("void F(int &i) { i->~int(); }"); 13203 } 13204 13205 TEST_F(FormatTest, FormatsWithWebKitStyle) { 13206 FormatStyle Style = getWebKitStyle(); 13207 13208 // Don't indent in outer namespaces. 13209 verifyFormat("namespace outer {\n" 13210 "int i;\n" 13211 "namespace inner {\n" 13212 " int i;\n" 13213 "} // namespace inner\n" 13214 "} // namespace outer\n" 13215 "namespace other_outer {\n" 13216 "int i;\n" 13217 "}", 13218 Style); 13219 13220 // Don't indent case labels. 13221 verifyFormat("switch (variable) {\n" 13222 "case 1:\n" 13223 "case 2:\n" 13224 " doSomething();\n" 13225 " break;\n" 13226 "default:\n" 13227 " ++variable;\n" 13228 "}", 13229 Style); 13230 13231 // Wrap before binary operators. 13232 EXPECT_EQ("void f()\n" 13233 "{\n" 13234 " if (aaaaaaaaaaaaaaaa\n" 13235 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 13236 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13237 " return;\n" 13238 "}", 13239 format("void f() {\n" 13240 "if (aaaaaaaaaaaaaaaa\n" 13241 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 13242 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13243 "return;\n" 13244 "}", 13245 Style)); 13246 13247 // Allow functions on a single line. 13248 verifyFormat("void f() { return; }", Style); 13249 13250 // Allow empty blocks on a single line and insert a space in empty blocks. 13251 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 13252 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 13253 // However, don't merge non-empty short loops. 13254 EXPECT_EQ("while (true) {\n" 13255 " continue;\n" 13256 "}", 13257 format("while (true) { continue; }", Style)); 13258 13259 // Constructor initializers are formatted one per line with the "," on the 13260 // new line. 13261 verifyFormat("Constructor()\n" 13262 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 13263 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 13264 " aaaaaaaaaaaaaa)\n" 13265 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 13266 "{\n" 13267 "}", 13268 Style); 13269 verifyFormat("SomeClass::Constructor()\n" 13270 " : a(a)\n" 13271 "{\n" 13272 "}", 13273 Style); 13274 EXPECT_EQ("SomeClass::Constructor()\n" 13275 " : a(a)\n" 13276 "{\n" 13277 "}", 13278 format("SomeClass::Constructor():a(a){}", Style)); 13279 verifyFormat("SomeClass::Constructor()\n" 13280 " : a(a)\n" 13281 " , b(b)\n" 13282 " , c(c)\n" 13283 "{\n" 13284 "}", 13285 Style); 13286 verifyFormat("SomeClass::Constructor()\n" 13287 " : a(a)\n" 13288 "{\n" 13289 " foo();\n" 13290 " bar();\n" 13291 "}", 13292 Style); 13293 13294 // Access specifiers should be aligned left. 13295 verifyFormat("class C {\n" 13296 "public:\n" 13297 " int i;\n" 13298 "};", 13299 Style); 13300 13301 // Do not align comments. 13302 verifyFormat("int a; // Do not\n" 13303 "double b; // align comments.", 13304 Style); 13305 13306 // Do not align operands. 13307 EXPECT_EQ("ASSERT(aaaa\n" 13308 " || bbbb);", 13309 format("ASSERT ( aaaa\n||bbbb);", Style)); 13310 13311 // Accept input's line breaks. 13312 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 13313 " || bbbbbbbbbbbbbbb) {\n" 13314 " i++;\n" 13315 "}", 13316 format("if (aaaaaaaaaaaaaaa\n" 13317 "|| bbbbbbbbbbbbbbb) { i++; }", 13318 Style)); 13319 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 13320 " i++;\n" 13321 "}", 13322 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 13323 13324 // Don't automatically break all macro definitions (llvm.org/PR17842). 13325 verifyFormat("#define aNumber 10", Style); 13326 // However, generally keep the line breaks that the user authored. 13327 EXPECT_EQ("#define aNumber \\\n" 13328 " 10", 13329 format("#define aNumber \\\n" 13330 " 10", 13331 Style)); 13332 13333 // Keep empty and one-element array literals on a single line. 13334 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 13335 " copyItems:YES];", 13336 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 13337 "copyItems:YES];", 13338 Style)); 13339 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 13340 " copyItems:YES];", 13341 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 13342 " copyItems:YES];", 13343 Style)); 13344 // FIXME: This does not seem right, there should be more indentation before 13345 // the array literal's entries. Nested blocks have the same problem. 13346 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13347 " @\"a\",\n" 13348 " @\"a\"\n" 13349 "]\n" 13350 " copyItems:YES];", 13351 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13352 " @\"a\",\n" 13353 " @\"a\"\n" 13354 " ]\n" 13355 " copyItems:YES];", 13356 Style)); 13357 EXPECT_EQ( 13358 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13359 " copyItems:YES];", 13360 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13361 " copyItems:YES];", 13362 Style)); 13363 13364 verifyFormat("[self.a b:c c:d];", Style); 13365 EXPECT_EQ("[self.a b:c\n" 13366 " c:d];", 13367 format("[self.a b:c\n" 13368 "c:d];", 13369 Style)); 13370 } 13371 13372 TEST_F(FormatTest, FormatsLambdas) { 13373 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 13374 verifyFormat( 13375 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 13376 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 13377 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 13378 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 13379 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 13380 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 13381 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 13382 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 13383 verifyFormat("int x = f(*+[] {});"); 13384 verifyFormat("void f() {\n" 13385 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 13386 "}\n"); 13387 verifyFormat("void f() {\n" 13388 " other(x.begin(), //\n" 13389 " x.end(), //\n" 13390 " [&](int, int) { return 1; });\n" 13391 "}\n"); 13392 verifyFormat("void f() {\n" 13393 " other.other.other.other.other(\n" 13394 " x.begin(), x.end(),\n" 13395 " [something, rather](int, int, int, int, int, int, int) { " 13396 "return 1; });\n" 13397 "}\n"); 13398 verifyFormat( 13399 "void f() {\n" 13400 " other.other.other.other.other(\n" 13401 " x.begin(), x.end(),\n" 13402 " [something, rather](int, int, int, int, int, int, int) {\n" 13403 " //\n" 13404 " });\n" 13405 "}\n"); 13406 verifyFormat("SomeFunction([]() { // A cool function...\n" 13407 " return 43;\n" 13408 "});"); 13409 EXPECT_EQ("SomeFunction([]() {\n" 13410 "#define A a\n" 13411 " return 43;\n" 13412 "});", 13413 format("SomeFunction([](){\n" 13414 "#define A a\n" 13415 "return 43;\n" 13416 "});")); 13417 verifyFormat("void f() {\n" 13418 " SomeFunction([](decltype(x), A *a) {});\n" 13419 "}"); 13420 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13421 " [](const aaaaaaaaaa &a) { return a; });"); 13422 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 13423 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 13424 "});"); 13425 verifyFormat("Constructor()\n" 13426 " : Field([] { // comment\n" 13427 " int i;\n" 13428 " }) {}"); 13429 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 13430 " return some_parameter.size();\n" 13431 "};"); 13432 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 13433 " [](const string &s) { return s; };"); 13434 verifyFormat("int i = aaaaaa ? 1 //\n" 13435 " : [] {\n" 13436 " return 2; //\n" 13437 " }();"); 13438 verifyFormat("llvm::errs() << \"number of twos is \"\n" 13439 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 13440 " return x == 2; // force break\n" 13441 " });"); 13442 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13443 " [=](int iiiiiiiiiiii) {\n" 13444 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 13445 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 13446 " });", 13447 getLLVMStyleWithColumns(60)); 13448 verifyFormat("SomeFunction({[&] {\n" 13449 " // comment\n" 13450 " },\n" 13451 " [&] {\n" 13452 " // comment\n" 13453 " }});"); 13454 verifyFormat("SomeFunction({[&] {\n" 13455 " // comment\n" 13456 "}});"); 13457 verifyFormat( 13458 "virtual aaaaaaaaaaaaaaaa(\n" 13459 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 13460 " aaaaa aaaaaaaaa);"); 13461 13462 // Lambdas with return types. 13463 verifyFormat("int c = []() -> int { return 2; }();\n"); 13464 verifyFormat("int c = []() -> int * { return 2; }();\n"); 13465 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 13466 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 13467 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 13468 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 13469 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 13470 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 13471 verifyFormat("[a, a]() -> a<1> {};"); 13472 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 13473 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 13474 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 13475 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 13476 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 13477 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 13478 verifyFormat("[]() -> foo<!5> { return {}; };"); 13479 verifyFormat("[]() -> foo<~5> { return {}; };"); 13480 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 13481 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 13482 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 13483 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 13484 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 13485 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 13486 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 13487 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 13488 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 13489 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 13490 verifyFormat("namespace bar {\n" 13491 "// broken:\n" 13492 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 13493 "} // namespace bar"); 13494 verifyFormat("namespace bar {\n" 13495 "// broken:\n" 13496 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 13497 "} // namespace bar"); 13498 verifyFormat("namespace bar {\n" 13499 "// broken:\n" 13500 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 13501 "} // namespace bar"); 13502 verifyFormat("namespace bar {\n" 13503 "// broken:\n" 13504 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 13505 "} // namespace bar"); 13506 verifyFormat("namespace bar {\n" 13507 "// broken:\n" 13508 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 13509 "} // namespace bar"); 13510 verifyFormat("namespace bar {\n" 13511 "// broken:\n" 13512 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 13513 "} // namespace bar"); 13514 verifyFormat("namespace bar {\n" 13515 "// broken:\n" 13516 "auto foo{[]() -> foo<!5> { return {}; }};\n" 13517 "} // namespace bar"); 13518 verifyFormat("namespace bar {\n" 13519 "// broken:\n" 13520 "auto foo{[]() -> foo<~5> { return {}; }};\n" 13521 "} // namespace bar"); 13522 verifyFormat("namespace bar {\n" 13523 "// broken:\n" 13524 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 13525 "} // namespace bar"); 13526 verifyFormat("namespace bar {\n" 13527 "// broken:\n" 13528 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 13529 "} // namespace bar"); 13530 verifyFormat("namespace bar {\n" 13531 "// broken:\n" 13532 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 13533 "} // namespace bar"); 13534 verifyFormat("namespace bar {\n" 13535 "// broken:\n" 13536 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 13537 "} // namespace bar"); 13538 verifyFormat("namespace bar {\n" 13539 "// broken:\n" 13540 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 13541 "} // namespace bar"); 13542 verifyFormat("namespace bar {\n" 13543 "// broken:\n" 13544 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 13545 "} // namespace bar"); 13546 verifyFormat("namespace bar {\n" 13547 "// broken:\n" 13548 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 13549 "} // namespace bar"); 13550 verifyFormat("namespace bar {\n" 13551 "// broken:\n" 13552 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 13553 "} // namespace bar"); 13554 verifyFormat("namespace bar {\n" 13555 "// broken:\n" 13556 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 13557 "} // namespace bar"); 13558 verifyFormat("namespace bar {\n" 13559 "// broken:\n" 13560 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 13561 "} // namespace bar"); 13562 verifyFormat("[]() -> a<1> {};"); 13563 verifyFormat("[]() -> a<1> { ; };"); 13564 verifyFormat("[]() -> a<1> { ; }();"); 13565 verifyFormat("[a, a]() -> a<true> {};"); 13566 verifyFormat("[]() -> a<true> {};"); 13567 verifyFormat("[]() -> a<true> { ; };"); 13568 verifyFormat("[]() -> a<true> { ; }();"); 13569 verifyFormat("[a, a]() -> a<false> {};"); 13570 verifyFormat("[]() -> a<false> {};"); 13571 verifyFormat("[]() -> a<false> { ; };"); 13572 verifyFormat("[]() -> a<false> { ; }();"); 13573 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 13574 verifyFormat("namespace bar {\n" 13575 "auto foo{[]() -> foo<false> { ; }};\n" 13576 "} // namespace bar"); 13577 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 13578 " int j) -> int {\n" 13579 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 13580 "};"); 13581 verifyFormat( 13582 "aaaaaaaaaaaaaaaaaaaaaa(\n" 13583 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 13584 " return aaaaaaaaaaaaaaaaa;\n" 13585 " });", 13586 getLLVMStyleWithColumns(70)); 13587 verifyFormat("[]() //\n" 13588 " -> int {\n" 13589 " return 1; //\n" 13590 "};"); 13591 13592 // Lambdas with explicit template argument lists. 13593 verifyFormat( 13594 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 13595 13596 // Multiple lambdas in the same parentheses change indentation rules. These 13597 // lambdas are forced to start on new lines. 13598 verifyFormat("SomeFunction(\n" 13599 " []() {\n" 13600 " //\n" 13601 " },\n" 13602 " []() {\n" 13603 " //\n" 13604 " });"); 13605 13606 // A lambda passed as arg0 is always pushed to the next line. 13607 verifyFormat("SomeFunction(\n" 13608 " [this] {\n" 13609 " //\n" 13610 " },\n" 13611 " 1);\n"); 13612 13613 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 13614 // the arg0 case above. 13615 auto Style = getGoogleStyle(); 13616 Style.BinPackArguments = false; 13617 verifyFormat("SomeFunction(\n" 13618 " a,\n" 13619 " [this] {\n" 13620 " //\n" 13621 " },\n" 13622 " b);\n", 13623 Style); 13624 verifyFormat("SomeFunction(\n" 13625 " a,\n" 13626 " [this] {\n" 13627 " //\n" 13628 " },\n" 13629 " b);\n"); 13630 13631 // A lambda with a very long line forces arg0 to be pushed out irrespective of 13632 // the BinPackArguments value (as long as the code is wide enough). 13633 verifyFormat( 13634 "something->SomeFunction(\n" 13635 " a,\n" 13636 " [this] {\n" 13637 " " 13638 "D0000000000000000000000000000000000000000000000000000000000001();\n" 13639 " },\n" 13640 " b);\n"); 13641 13642 // A multi-line lambda is pulled up as long as the introducer fits on the 13643 // previous line and there are no further args. 13644 verifyFormat("function(1, [this, that] {\n" 13645 " //\n" 13646 "});\n"); 13647 verifyFormat("function([this, that] {\n" 13648 " //\n" 13649 "});\n"); 13650 // FIXME: this format is not ideal and we should consider forcing the first 13651 // arg onto its own line. 13652 verifyFormat("function(a, b, c, //\n" 13653 " d, [this, that] {\n" 13654 " //\n" 13655 " });\n"); 13656 13657 // Multiple lambdas are treated correctly even when there is a short arg0. 13658 verifyFormat("SomeFunction(\n" 13659 " 1,\n" 13660 " [this] {\n" 13661 " //\n" 13662 " },\n" 13663 " [this] {\n" 13664 " //\n" 13665 " },\n" 13666 " 1);\n"); 13667 13668 // More complex introducers. 13669 verifyFormat("return [i, args...] {};"); 13670 13671 // Not lambdas. 13672 verifyFormat("constexpr char hello[]{\"hello\"};"); 13673 verifyFormat("double &operator[](int i) { return 0; }\n" 13674 "int i;"); 13675 verifyFormat("std::unique_ptr<int[]> foo() {}"); 13676 verifyFormat("int i = a[a][a]->f();"); 13677 verifyFormat("int i = (*b)[a]->f();"); 13678 13679 // Other corner cases. 13680 verifyFormat("void f() {\n" 13681 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 13682 " );\n" 13683 "}"); 13684 13685 // Lambdas created through weird macros. 13686 verifyFormat("void f() {\n" 13687 " MACRO((const AA &a) { return 1; });\n" 13688 " MACRO((AA &a) { return 1; });\n" 13689 "}"); 13690 13691 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 13692 " doo_dah();\n" 13693 " doo_dah();\n" 13694 " })) {\n" 13695 "}"); 13696 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 13697 " doo_dah();\n" 13698 " doo_dah();\n" 13699 " })) {\n" 13700 "}"); 13701 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 13702 " doo_dah();\n" 13703 " doo_dah();\n" 13704 " })) {\n" 13705 "}"); 13706 verifyFormat("auto lambda = []() {\n" 13707 " int a = 2\n" 13708 "#if A\n" 13709 " + 2\n" 13710 "#endif\n" 13711 " ;\n" 13712 "};"); 13713 13714 // Lambdas with complex multiline introducers. 13715 verifyFormat( 13716 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13717 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 13718 " -> ::std::unordered_set<\n" 13719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 13720 " //\n" 13721 " });"); 13722 13723 FormatStyle DoNotMerge = getLLVMStyle(); 13724 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13725 verifyFormat("auto c = []() {\n" 13726 " return b;\n" 13727 "};", 13728 "auto c = []() { return b; };", DoNotMerge); 13729 verifyFormat("auto c = []() {\n" 13730 "};", 13731 " auto c = []() {};", DoNotMerge); 13732 13733 FormatStyle MergeEmptyOnly = getLLVMStyle(); 13734 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 13735 verifyFormat("auto c = []() {\n" 13736 " return b;\n" 13737 "};", 13738 "auto c = []() {\n" 13739 " return b;\n" 13740 " };", 13741 MergeEmptyOnly); 13742 verifyFormat("auto c = []() {};", 13743 "auto c = []() {\n" 13744 "};", 13745 MergeEmptyOnly); 13746 13747 FormatStyle MergeInline = getLLVMStyle(); 13748 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 13749 verifyFormat("auto c = []() {\n" 13750 " return b;\n" 13751 "};", 13752 "auto c = []() { return b; };", MergeInline); 13753 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 13754 MergeInline); 13755 verifyFormat("function([]() { return b; }, a)", 13756 "function([]() { return b; }, a)", MergeInline); 13757 verifyFormat("function(a, []() { return b; })", 13758 "function(a, []() { return b; })", MergeInline); 13759 } 13760 13761 TEST_F(FormatTest, EmptyLinesInLambdas) { 13762 verifyFormat("auto lambda = []() {\n" 13763 " x(); //\n" 13764 "};", 13765 "auto lambda = []() {\n" 13766 "\n" 13767 " x(); //\n" 13768 "\n" 13769 "};"); 13770 } 13771 13772 TEST_F(FormatTest, FormatsBlocks) { 13773 FormatStyle ShortBlocks = getLLVMStyle(); 13774 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13775 verifyFormat("int (^Block)(int, int);", ShortBlocks); 13776 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 13777 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 13778 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 13779 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 13780 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 13781 13782 verifyFormat("foo(^{ bar(); });", ShortBlocks); 13783 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 13784 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 13785 13786 verifyFormat("[operation setCompletionBlock:^{\n" 13787 " [self onOperationDone];\n" 13788 "}];"); 13789 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 13790 " [self onOperationDone];\n" 13791 "}]};"); 13792 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 13793 " f();\n" 13794 "}];"); 13795 verifyFormat("int a = [operation block:^int(int *i) {\n" 13796 " return 1;\n" 13797 "}];"); 13798 verifyFormat("[myObject doSomethingWith:arg1\n" 13799 " aaa:^int(int *a) {\n" 13800 " return 1;\n" 13801 " }\n" 13802 " bbb:f(a * bbbbbbbb)];"); 13803 13804 verifyFormat("[operation setCompletionBlock:^{\n" 13805 " [self.delegate newDataAvailable];\n" 13806 "}];", 13807 getLLVMStyleWithColumns(60)); 13808 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 13809 " NSString *path = [self sessionFilePath];\n" 13810 " if (path) {\n" 13811 " // ...\n" 13812 " }\n" 13813 "});"); 13814 verifyFormat("[[SessionService sharedService]\n" 13815 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13816 " if (window) {\n" 13817 " [self windowDidLoad:window];\n" 13818 " } else {\n" 13819 " [self errorLoadingWindow];\n" 13820 " }\n" 13821 " }];"); 13822 verifyFormat("void (^largeBlock)(void) = ^{\n" 13823 " // ...\n" 13824 "};\n", 13825 getLLVMStyleWithColumns(40)); 13826 verifyFormat("[[SessionService sharedService]\n" 13827 " loadWindowWithCompletionBlock: //\n" 13828 " ^(SessionWindow *window) {\n" 13829 " if (window) {\n" 13830 " [self windowDidLoad:window];\n" 13831 " } else {\n" 13832 " [self errorLoadingWindow];\n" 13833 " }\n" 13834 " }];", 13835 getLLVMStyleWithColumns(60)); 13836 verifyFormat("[myObject doSomethingWith:arg1\n" 13837 " firstBlock:^(Foo *a) {\n" 13838 " // ...\n" 13839 " int i;\n" 13840 " }\n" 13841 " secondBlock:^(Bar *b) {\n" 13842 " // ...\n" 13843 " int i;\n" 13844 " }\n" 13845 " thirdBlock:^Foo(Bar *b) {\n" 13846 " // ...\n" 13847 " int i;\n" 13848 " }];"); 13849 verifyFormat("[myObject doSomethingWith:arg1\n" 13850 " firstBlock:-1\n" 13851 " secondBlock:^(Bar *b) {\n" 13852 " // ...\n" 13853 " int i;\n" 13854 " }];"); 13855 13856 verifyFormat("f(^{\n" 13857 " @autoreleasepool {\n" 13858 " if (a) {\n" 13859 " g();\n" 13860 " }\n" 13861 " }\n" 13862 "});"); 13863 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 13864 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 13865 "};"); 13866 13867 FormatStyle FourIndent = getLLVMStyle(); 13868 FourIndent.ObjCBlockIndentWidth = 4; 13869 verifyFormat("[operation setCompletionBlock:^{\n" 13870 " [self onOperationDone];\n" 13871 "}];", 13872 FourIndent); 13873 } 13874 13875 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 13876 FormatStyle ZeroColumn = getLLVMStyle(); 13877 ZeroColumn.ColumnLimit = 0; 13878 13879 verifyFormat("[[SessionService sharedService] " 13880 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13881 " if (window) {\n" 13882 " [self windowDidLoad:window];\n" 13883 " } else {\n" 13884 " [self errorLoadingWindow];\n" 13885 " }\n" 13886 "}];", 13887 ZeroColumn); 13888 EXPECT_EQ("[[SessionService sharedService]\n" 13889 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13890 " if (window) {\n" 13891 " [self windowDidLoad:window];\n" 13892 " } else {\n" 13893 " [self errorLoadingWindow];\n" 13894 " }\n" 13895 " }];", 13896 format("[[SessionService sharedService]\n" 13897 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13898 " if (window) {\n" 13899 " [self windowDidLoad:window];\n" 13900 " } else {\n" 13901 " [self errorLoadingWindow];\n" 13902 " }\n" 13903 "}];", 13904 ZeroColumn)); 13905 verifyFormat("[myObject doSomethingWith:arg1\n" 13906 " firstBlock:^(Foo *a) {\n" 13907 " // ...\n" 13908 " int i;\n" 13909 " }\n" 13910 " secondBlock:^(Bar *b) {\n" 13911 " // ...\n" 13912 " int i;\n" 13913 " }\n" 13914 " thirdBlock:^Foo(Bar *b) {\n" 13915 " // ...\n" 13916 " int i;\n" 13917 " }];", 13918 ZeroColumn); 13919 verifyFormat("f(^{\n" 13920 " @autoreleasepool {\n" 13921 " if (a) {\n" 13922 " g();\n" 13923 " }\n" 13924 " }\n" 13925 "});", 13926 ZeroColumn); 13927 verifyFormat("void (^largeBlock)(void) = ^{\n" 13928 " // ...\n" 13929 "};", 13930 ZeroColumn); 13931 13932 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13933 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 13934 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13935 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 13936 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 13937 " int i;\n" 13938 "};", 13939 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13940 } 13941 13942 TEST_F(FormatTest, SupportsCRLF) { 13943 EXPECT_EQ("int a;\r\n" 13944 "int b;\r\n" 13945 "int c;\r\n", 13946 format("int a;\r\n" 13947 " int b;\r\n" 13948 " int c;\r\n", 13949 getLLVMStyle())); 13950 EXPECT_EQ("int a;\r\n" 13951 "int b;\r\n" 13952 "int c;\r\n", 13953 format("int a;\r\n" 13954 " int b;\n" 13955 " int c;\r\n", 13956 getLLVMStyle())); 13957 EXPECT_EQ("int a;\n" 13958 "int b;\n" 13959 "int c;\n", 13960 format("int a;\r\n" 13961 " int b;\n" 13962 " int c;\n", 13963 getLLVMStyle())); 13964 EXPECT_EQ("\"aaaaaaa \"\r\n" 13965 "\"bbbbbbb\";\r\n", 13966 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 13967 EXPECT_EQ("#define A \\\r\n" 13968 " b; \\\r\n" 13969 " c; \\\r\n" 13970 " d;\r\n", 13971 format("#define A \\\r\n" 13972 " b; \\\r\n" 13973 " c; d; \r\n", 13974 getGoogleStyle())); 13975 13976 EXPECT_EQ("/*\r\n" 13977 "multi line block comments\r\n" 13978 "should not introduce\r\n" 13979 "an extra carriage return\r\n" 13980 "*/\r\n", 13981 format("/*\r\n" 13982 "multi line block comments\r\n" 13983 "should not introduce\r\n" 13984 "an extra carriage return\r\n" 13985 "*/\r\n")); 13986 EXPECT_EQ("/*\r\n" 13987 "\r\n" 13988 "*/", 13989 format("/*\r\n" 13990 " \r\r\r\n" 13991 "*/")); 13992 } 13993 13994 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 13995 verifyFormat("MY_CLASS(C) {\n" 13996 " int i;\n" 13997 " int j;\n" 13998 "};"); 13999 } 14000 14001 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 14002 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 14003 TwoIndent.ContinuationIndentWidth = 2; 14004 14005 EXPECT_EQ("int i =\n" 14006 " longFunction(\n" 14007 " arg);", 14008 format("int i = longFunction(arg);", TwoIndent)); 14009 14010 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 14011 SixIndent.ContinuationIndentWidth = 6; 14012 14013 EXPECT_EQ("int i =\n" 14014 " longFunction(\n" 14015 " arg);", 14016 format("int i = longFunction(arg);", SixIndent)); 14017 } 14018 14019 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 14020 FormatStyle Style = getLLVMStyle(); 14021 verifyFormat("int Foo::getter(\n" 14022 " //\n" 14023 ") const {\n" 14024 " return foo;\n" 14025 "}", 14026 Style); 14027 verifyFormat("void Foo::setter(\n" 14028 " //\n" 14029 ") {\n" 14030 " foo = 1;\n" 14031 "}", 14032 Style); 14033 } 14034 14035 TEST_F(FormatTest, SpacesInAngles) { 14036 FormatStyle Spaces = getLLVMStyle(); 14037 Spaces.SpacesInAngles = true; 14038 14039 verifyFormat("static_cast< int >(arg);", Spaces); 14040 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 14041 verifyFormat("f< int, float >();", Spaces); 14042 verifyFormat("template <> g() {}", Spaces); 14043 verifyFormat("template < std::vector< int > > f() {}", Spaces); 14044 verifyFormat("std::function< void(int, int) > fct;", Spaces); 14045 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 14046 Spaces); 14047 14048 Spaces.Standard = FormatStyle::LS_Cpp03; 14049 Spaces.SpacesInAngles = true; 14050 verifyFormat("A< A< int > >();", Spaces); 14051 14052 Spaces.SpacesInAngles = false; 14053 verifyFormat("A<A<int> >();", Spaces); 14054 14055 Spaces.Standard = FormatStyle::LS_Cpp11; 14056 Spaces.SpacesInAngles = true; 14057 verifyFormat("A< A< int > >();", Spaces); 14058 14059 Spaces.SpacesInAngles = false; 14060 verifyFormat("A<A<int>>();", Spaces); 14061 } 14062 14063 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 14064 FormatStyle Style = getLLVMStyle(); 14065 Style.SpaceAfterTemplateKeyword = false; 14066 verifyFormat("template<int> void foo();", Style); 14067 } 14068 14069 TEST_F(FormatTest, TripleAngleBrackets) { 14070 verifyFormat("f<<<1, 1>>>();"); 14071 verifyFormat("f<<<1, 1, 1, s>>>();"); 14072 verifyFormat("f<<<a, b, c, d>>>();"); 14073 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 14074 verifyFormat("f<param><<<1, 1>>>();"); 14075 verifyFormat("f<1><<<1, 1>>>();"); 14076 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 14077 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14078 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 14079 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 14080 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 14081 } 14082 14083 TEST_F(FormatTest, MergeLessLessAtEnd) { 14084 verifyFormat("<<"); 14085 EXPECT_EQ("< < <", format("\\\n<<<")); 14086 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14087 "aaallvm::outs() <<"); 14088 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14089 "aaaallvm::outs()\n <<"); 14090 } 14091 14092 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 14093 std::string code = "#if A\n" 14094 "#if B\n" 14095 "a.\n" 14096 "#endif\n" 14097 " a = 1;\n" 14098 "#else\n" 14099 "#endif\n" 14100 "#if C\n" 14101 "#else\n" 14102 "#endif\n"; 14103 EXPECT_EQ(code, format(code)); 14104 } 14105 14106 TEST_F(FormatTest, HandleConflictMarkers) { 14107 // Git/SVN conflict markers. 14108 EXPECT_EQ("int a;\n" 14109 "void f() {\n" 14110 " callme(some(parameter1,\n" 14111 "<<<<<<< text by the vcs\n" 14112 " parameter2),\n" 14113 "||||||| text by the vcs\n" 14114 " parameter2),\n" 14115 " parameter3,\n" 14116 "======= text by the vcs\n" 14117 " parameter2, parameter3),\n" 14118 ">>>>>>> text by the vcs\n" 14119 " otherparameter);\n", 14120 format("int a;\n" 14121 "void f() {\n" 14122 " callme(some(parameter1,\n" 14123 "<<<<<<< text by the vcs\n" 14124 " parameter2),\n" 14125 "||||||| text by the vcs\n" 14126 " parameter2),\n" 14127 " parameter3,\n" 14128 "======= text by the vcs\n" 14129 " parameter2,\n" 14130 " parameter3),\n" 14131 ">>>>>>> text by the vcs\n" 14132 " otherparameter);\n")); 14133 14134 // Perforce markers. 14135 EXPECT_EQ("void f() {\n" 14136 " function(\n" 14137 ">>>> text by the vcs\n" 14138 " parameter,\n" 14139 "==== text by the vcs\n" 14140 " parameter,\n" 14141 "==== text by the vcs\n" 14142 " parameter,\n" 14143 "<<<< text by the vcs\n" 14144 " parameter);\n", 14145 format("void f() {\n" 14146 " function(\n" 14147 ">>>> text by the vcs\n" 14148 " parameter,\n" 14149 "==== text by the vcs\n" 14150 " parameter,\n" 14151 "==== text by the vcs\n" 14152 " parameter,\n" 14153 "<<<< text by the vcs\n" 14154 " parameter);\n")); 14155 14156 EXPECT_EQ("<<<<<<<\n" 14157 "|||||||\n" 14158 "=======\n" 14159 ">>>>>>>", 14160 format("<<<<<<<\n" 14161 "|||||||\n" 14162 "=======\n" 14163 ">>>>>>>")); 14164 14165 EXPECT_EQ("<<<<<<<\n" 14166 "|||||||\n" 14167 "int i;\n" 14168 "=======\n" 14169 ">>>>>>>", 14170 format("<<<<<<<\n" 14171 "|||||||\n" 14172 "int i;\n" 14173 "=======\n" 14174 ">>>>>>>")); 14175 14176 // FIXME: Handle parsing of macros around conflict markers correctly: 14177 EXPECT_EQ("#define Macro \\\n" 14178 "<<<<<<<\n" 14179 "Something \\\n" 14180 "|||||||\n" 14181 "Else \\\n" 14182 "=======\n" 14183 "Other \\\n" 14184 ">>>>>>>\n" 14185 " End int i;\n", 14186 format("#define Macro \\\n" 14187 "<<<<<<<\n" 14188 " Something \\\n" 14189 "|||||||\n" 14190 " Else \\\n" 14191 "=======\n" 14192 " Other \\\n" 14193 ">>>>>>>\n" 14194 " End\n" 14195 "int i;\n")); 14196 } 14197 14198 TEST_F(FormatTest, DisableRegions) { 14199 EXPECT_EQ("int i;\n" 14200 "// clang-format off\n" 14201 " int j;\n" 14202 "// clang-format on\n" 14203 "int k;", 14204 format(" int i;\n" 14205 " // clang-format off\n" 14206 " int j;\n" 14207 " // clang-format on\n" 14208 " int k;")); 14209 EXPECT_EQ("int i;\n" 14210 "/* clang-format off */\n" 14211 " int j;\n" 14212 "/* clang-format on */\n" 14213 "int k;", 14214 format(" int i;\n" 14215 " /* clang-format off */\n" 14216 " int j;\n" 14217 " /* clang-format on */\n" 14218 " int k;")); 14219 14220 // Don't reflow comments within disabled regions. 14221 EXPECT_EQ("// clang-format off\n" 14222 "// long long long long long long line\n" 14223 "/* clang-format on */\n" 14224 "/* long long long\n" 14225 " * long long long\n" 14226 " * line */\n" 14227 "int i;\n" 14228 "/* clang-format off */\n" 14229 "/* long long long long long long line */\n", 14230 format("// clang-format off\n" 14231 "// long long long long long long line\n" 14232 "/* clang-format on */\n" 14233 "/* long long long long long long line */\n" 14234 "int i;\n" 14235 "/* clang-format off */\n" 14236 "/* long long long long long long line */\n", 14237 getLLVMStyleWithColumns(20))); 14238 } 14239 14240 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 14241 format("? ) ="); 14242 verifyNoCrash("#define a\\\n /**/}"); 14243 } 14244 14245 TEST_F(FormatTest, FormatsTableGenCode) { 14246 FormatStyle Style = getLLVMStyle(); 14247 Style.Language = FormatStyle::LK_TableGen; 14248 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 14249 } 14250 14251 TEST_F(FormatTest, ArrayOfTemplates) { 14252 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 14253 format("auto a = new unique_ptr<int > [ 10];")); 14254 14255 FormatStyle Spaces = getLLVMStyle(); 14256 Spaces.SpacesInSquareBrackets = true; 14257 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 14258 format("auto a = new unique_ptr<int > [10];", Spaces)); 14259 } 14260 14261 TEST_F(FormatTest, ArrayAsTemplateType) { 14262 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 14263 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 14264 14265 FormatStyle Spaces = getLLVMStyle(); 14266 Spaces.SpacesInSquareBrackets = true; 14267 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 14268 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 14269 } 14270 14271 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 14272 14273 TEST(FormatStyle, GetStyleWithEmptyFileName) { 14274 llvm::vfs::InMemoryFileSystem FS; 14275 auto Style1 = getStyle("file", "", "Google", "", &FS); 14276 ASSERT_TRUE((bool)Style1); 14277 ASSERT_EQ(*Style1, getGoogleStyle()); 14278 } 14279 14280 TEST(FormatStyle, GetStyleOfFile) { 14281 llvm::vfs::InMemoryFileSystem FS; 14282 // Test 1: format file in the same directory. 14283 ASSERT_TRUE( 14284 FS.addFile("/a/.clang-format", 0, 14285 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 14286 ASSERT_TRUE( 14287 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14288 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 14289 ASSERT_TRUE((bool)Style1); 14290 ASSERT_EQ(*Style1, getLLVMStyle()); 14291 14292 // Test 2.1: fallback to default. 14293 ASSERT_TRUE( 14294 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14295 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 14296 ASSERT_TRUE((bool)Style2); 14297 ASSERT_EQ(*Style2, getMozillaStyle()); 14298 14299 // Test 2.2: no format on 'none' fallback style. 14300 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14301 ASSERT_TRUE((bool)Style2); 14302 ASSERT_EQ(*Style2, getNoStyle()); 14303 14304 // Test 2.3: format if config is found with no based style while fallback is 14305 // 'none'. 14306 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 14307 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 14308 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14309 ASSERT_TRUE((bool)Style2); 14310 ASSERT_EQ(*Style2, getLLVMStyle()); 14311 14312 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 14313 Style2 = getStyle("{}", "a.h", "none", "", &FS); 14314 ASSERT_TRUE((bool)Style2); 14315 ASSERT_EQ(*Style2, getLLVMStyle()); 14316 14317 // Test 3: format file in parent directory. 14318 ASSERT_TRUE( 14319 FS.addFile("/c/.clang-format", 0, 14320 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 14321 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 14322 llvm::MemoryBuffer::getMemBuffer("int i;"))); 14323 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 14324 ASSERT_TRUE((bool)Style3); 14325 ASSERT_EQ(*Style3, getGoogleStyle()); 14326 14327 // Test 4: error on invalid fallback style 14328 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 14329 ASSERT_FALSE((bool)Style4); 14330 llvm::consumeError(Style4.takeError()); 14331 14332 // Test 5: error on invalid yaml on command line 14333 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 14334 ASSERT_FALSE((bool)Style5); 14335 llvm::consumeError(Style5.takeError()); 14336 14337 // Test 6: error on invalid style 14338 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 14339 ASSERT_FALSE((bool)Style6); 14340 llvm::consumeError(Style6.takeError()); 14341 14342 // Test 7: found config file, error on parsing it 14343 ASSERT_TRUE( 14344 FS.addFile("/d/.clang-format", 0, 14345 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 14346 "InvalidKey: InvalidValue"))); 14347 ASSERT_TRUE( 14348 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14349 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 14350 ASSERT_FALSE((bool)Style7); 14351 llvm::consumeError(Style7.takeError()); 14352 14353 // Test 8: inferred per-language defaults apply. 14354 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 14355 ASSERT_TRUE((bool)StyleTd); 14356 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 14357 } 14358 14359 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 14360 // Column limit is 20. 14361 std::string Code = "Type *a =\n" 14362 " new Type();\n" 14363 "g(iiiii, 0, jjjjj,\n" 14364 " 0, kkkkk, 0, mm);\n" 14365 "int bad = format ;"; 14366 std::string Expected = "auto a = new Type();\n" 14367 "g(iiiii, nullptr,\n" 14368 " jjjjj, nullptr,\n" 14369 " kkkkk, nullptr,\n" 14370 " mm);\n" 14371 "int bad = format ;"; 14372 FileID ID = Context.createInMemoryFile("format.cpp", Code); 14373 tooling::Replacements Replaces = toReplacements( 14374 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 14375 "auto "), 14376 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 14377 "nullptr"), 14378 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 14379 "nullptr"), 14380 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 14381 "nullptr")}); 14382 14383 format::FormatStyle Style = format::getLLVMStyle(); 14384 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 14385 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14386 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14387 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14388 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14389 EXPECT_TRUE(static_cast<bool>(Result)); 14390 EXPECT_EQ(Expected, *Result); 14391 } 14392 14393 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 14394 std::string Code = "#include \"a.h\"\n" 14395 "#include \"c.h\"\n" 14396 "\n" 14397 "int main() {\n" 14398 " return 0;\n" 14399 "}"; 14400 std::string Expected = "#include \"a.h\"\n" 14401 "#include \"b.h\"\n" 14402 "#include \"c.h\"\n" 14403 "\n" 14404 "int main() {\n" 14405 " return 0;\n" 14406 "}"; 14407 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 14408 tooling::Replacements Replaces = toReplacements( 14409 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 14410 "#include \"b.h\"\n")}); 14411 14412 format::FormatStyle Style = format::getLLVMStyle(); 14413 Style.SortIncludes = true; 14414 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14415 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14416 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14417 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14418 EXPECT_TRUE(static_cast<bool>(Result)); 14419 EXPECT_EQ(Expected, *Result); 14420 } 14421 14422 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 14423 EXPECT_EQ("using std::cin;\n" 14424 "using std::cout;", 14425 format("using std::cout;\n" 14426 "using std::cin;", 14427 getGoogleStyle())); 14428 } 14429 14430 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 14431 format::FormatStyle Style = format::getLLVMStyle(); 14432 Style.Standard = FormatStyle::LS_Cpp03; 14433 // cpp03 recognize this string as identifier u8 and literal character 'a' 14434 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 14435 } 14436 14437 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 14438 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 14439 // all modes, including C++11, C++14 and C++17 14440 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 14441 } 14442 14443 TEST_F(FormatTest, DoNotFormatLikelyXml) { 14444 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 14445 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 14446 } 14447 14448 TEST_F(FormatTest, StructuredBindings) { 14449 // Structured bindings is a C++17 feature. 14450 // all modes, including C++11, C++14 and C++17 14451 verifyFormat("auto [a, b] = f();"); 14452 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 14453 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 14454 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 14455 EXPECT_EQ("auto const volatile [a, b] = f();", 14456 format("auto const volatile[a, b] = f();")); 14457 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 14458 EXPECT_EQ("auto &[a, b, c] = f();", 14459 format("auto &[ a , b,c ] = f();")); 14460 EXPECT_EQ("auto &&[a, b, c] = f();", 14461 format("auto &&[ a , b,c ] = f();")); 14462 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 14463 EXPECT_EQ("auto const volatile &&[a, b] = f();", 14464 format("auto const volatile &&[a, b] = f();")); 14465 EXPECT_EQ("auto const &&[a, b] = f();", 14466 format("auto const && [a, b] = f();")); 14467 EXPECT_EQ("const auto &[a, b] = f();", 14468 format("const auto & [a, b] = f();")); 14469 EXPECT_EQ("const auto volatile &&[a, b] = f();", 14470 format("const auto volatile &&[a, b] = f();")); 14471 EXPECT_EQ("volatile const auto &&[a, b] = f();", 14472 format("volatile const auto &&[a, b] = f();")); 14473 EXPECT_EQ("const auto &&[a, b] = f();", 14474 format("const auto && [a, b] = f();")); 14475 14476 // Make sure we don't mistake structured bindings for lambdas. 14477 FormatStyle PointerMiddle = getLLVMStyle(); 14478 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 14479 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 14480 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 14481 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 14482 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 14483 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 14484 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 14485 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 14486 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 14487 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 14488 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 14489 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 14490 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 14491 14492 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 14493 format("for (const auto && [a, b] : some_range) {\n}")); 14494 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 14495 format("for (const auto & [a, b] : some_range) {\n}")); 14496 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 14497 format("for (const auto[a, b] : some_range) {\n}")); 14498 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 14499 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 14500 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 14501 EXPECT_EQ("auto const &[x, y](expr);", 14502 format("auto const & [x,y] (expr);")); 14503 EXPECT_EQ("auto const &&[x, y](expr);", 14504 format("auto const && [x,y] (expr);")); 14505 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 14506 EXPECT_EQ("auto const &[x, y]{expr};", 14507 format("auto const & [x,y] {expr};")); 14508 EXPECT_EQ("auto const &&[x, y]{expr};", 14509 format("auto const && [x,y] {expr};")); 14510 14511 format::FormatStyle Spaces = format::getLLVMStyle(); 14512 Spaces.SpacesInSquareBrackets = true; 14513 verifyFormat("auto [ a, b ] = f();", Spaces); 14514 verifyFormat("auto &&[ a, b ] = f();", Spaces); 14515 verifyFormat("auto &[ a, b ] = f();", Spaces); 14516 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 14517 verifyFormat("auto const &[ a, b ] = f();", Spaces); 14518 } 14519 14520 TEST_F(FormatTest, FileAndCode) { 14521 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 14522 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 14523 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 14524 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 14525 EXPECT_EQ(FormatStyle::LK_ObjC, 14526 guessLanguage("foo.h", "@interface Foo\n@end\n")); 14527 EXPECT_EQ( 14528 FormatStyle::LK_ObjC, 14529 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 14530 EXPECT_EQ(FormatStyle::LK_ObjC, 14531 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 14532 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 14533 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 14534 EXPECT_EQ(FormatStyle::LK_ObjC, 14535 guessLanguage("foo", "@interface Foo\n@end\n")); 14536 EXPECT_EQ(FormatStyle::LK_ObjC, 14537 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 14538 EXPECT_EQ( 14539 FormatStyle::LK_ObjC, 14540 guessLanguage("foo.h", 14541 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 14542 EXPECT_EQ( 14543 FormatStyle::LK_Cpp, 14544 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 14545 } 14546 14547 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 14548 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 14549 EXPECT_EQ(FormatStyle::LK_ObjC, 14550 guessLanguage("foo.h", "array[[calculator getIndex]];")); 14551 EXPECT_EQ(FormatStyle::LK_Cpp, 14552 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 14553 EXPECT_EQ( 14554 FormatStyle::LK_Cpp, 14555 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 14556 EXPECT_EQ(FormatStyle::LK_ObjC, 14557 guessLanguage("foo.h", "[[noreturn foo] bar];")); 14558 EXPECT_EQ(FormatStyle::LK_Cpp, 14559 guessLanguage("foo.h", "[[clang::fallthrough]];")); 14560 EXPECT_EQ(FormatStyle::LK_ObjC, 14561 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 14562 EXPECT_EQ(FormatStyle::LK_Cpp, 14563 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 14564 EXPECT_EQ(FormatStyle::LK_Cpp, 14565 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 14566 EXPECT_EQ(FormatStyle::LK_ObjC, 14567 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 14568 EXPECT_EQ(FormatStyle::LK_Cpp, 14569 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 14570 EXPECT_EQ( 14571 FormatStyle::LK_Cpp, 14572 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 14573 EXPECT_EQ( 14574 FormatStyle::LK_Cpp, 14575 guessLanguage("foo.h", 14576 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 14577 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 14578 } 14579 14580 TEST_F(FormatTest, GuessLanguageWithCaret) { 14581 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 14582 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 14583 EXPECT_EQ(FormatStyle::LK_ObjC, 14584 guessLanguage("foo.h", "int(^)(char, float);")); 14585 EXPECT_EQ(FormatStyle::LK_ObjC, 14586 guessLanguage("foo.h", "int(^foo)(char, float);")); 14587 EXPECT_EQ(FormatStyle::LK_ObjC, 14588 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 14589 EXPECT_EQ(FormatStyle::LK_ObjC, 14590 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 14591 EXPECT_EQ( 14592 FormatStyle::LK_ObjC, 14593 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 14594 } 14595 14596 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 14597 EXPECT_EQ(FormatStyle::LK_Cpp, 14598 guessLanguage("foo.h", "void f() {\n" 14599 " asm (\"mov %[e], %[d]\"\n" 14600 " : [d] \"=rm\" (d)\n" 14601 " [e] \"rm\" (*e));\n" 14602 "}")); 14603 EXPECT_EQ(FormatStyle::LK_Cpp, 14604 guessLanguage("foo.h", "void f() {\n" 14605 " _asm (\"mov %[e], %[d]\"\n" 14606 " : [d] \"=rm\" (d)\n" 14607 " [e] \"rm\" (*e));\n" 14608 "}")); 14609 EXPECT_EQ(FormatStyle::LK_Cpp, 14610 guessLanguage("foo.h", "void f() {\n" 14611 " __asm (\"mov %[e], %[d]\"\n" 14612 " : [d] \"=rm\" (d)\n" 14613 " [e] \"rm\" (*e));\n" 14614 "}")); 14615 EXPECT_EQ(FormatStyle::LK_Cpp, 14616 guessLanguage("foo.h", "void f() {\n" 14617 " __asm__ (\"mov %[e], %[d]\"\n" 14618 " : [d] \"=rm\" (d)\n" 14619 " [e] \"rm\" (*e));\n" 14620 "}")); 14621 EXPECT_EQ(FormatStyle::LK_Cpp, 14622 guessLanguage("foo.h", "void f() {\n" 14623 " asm (\"mov %[e], %[d]\"\n" 14624 " : [d] \"=rm\" (d),\n" 14625 " [e] \"rm\" (*e));\n" 14626 "}")); 14627 EXPECT_EQ(FormatStyle::LK_Cpp, 14628 guessLanguage("foo.h", "void f() {\n" 14629 " asm volatile (\"mov %[e], %[d]\"\n" 14630 " : [d] \"=rm\" (d)\n" 14631 " [e] \"rm\" (*e));\n" 14632 "}")); 14633 } 14634 14635 TEST_F(FormatTest, GuessLanguageWithChildLines) { 14636 EXPECT_EQ(FormatStyle::LK_Cpp, 14637 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 14638 EXPECT_EQ(FormatStyle::LK_ObjC, 14639 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 14640 EXPECT_EQ( 14641 FormatStyle::LK_Cpp, 14642 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 14643 EXPECT_EQ( 14644 FormatStyle::LK_ObjC, 14645 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 14646 } 14647 14648 TEST_F(FormatTest, TypenameMacros) { 14649 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 14650 14651 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 14652 FormatStyle Google = getGoogleStyleWithColumns(0); 14653 Google.TypenameMacros = TypenameMacros; 14654 verifyFormat("struct foo {\n" 14655 " int bar;\n" 14656 " TAILQ_ENTRY(a) bleh;\n" 14657 "};", 14658 Google); 14659 14660 FormatStyle Macros = getLLVMStyle(); 14661 Macros.TypenameMacros = TypenameMacros; 14662 14663 verifyFormat("STACK_OF(int) a;", Macros); 14664 verifyFormat("STACK_OF(int) *a;", Macros); 14665 verifyFormat("STACK_OF(int const *) *a;", Macros); 14666 verifyFormat("STACK_OF(int *const) *a;", Macros); 14667 verifyFormat("STACK_OF(int, string) a;", Macros); 14668 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 14669 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 14670 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 14671 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 14672 14673 Macros.PointerAlignment = FormatStyle::PAS_Left; 14674 verifyFormat("STACK_OF(int)* a;", Macros); 14675 verifyFormat("STACK_OF(int*)* a;", Macros); 14676 } 14677 14678 TEST_F(FormatTest, AmbersandInLamda) { 14679 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 14680 FormatStyle AlignStyle = getLLVMStyle(); 14681 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 14682 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14683 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 14684 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14685 } 14686 14687 TEST_F(FormatTest, AlternativeOperators) { 14688 // Test case for ensuring alternate operators are not 14689 // combined with their right most neighbour. 14690 verifyFormat("int a and b;"); 14691 verifyFormat("int a and_eq b;"); 14692 verifyFormat("int a bitand b;"); 14693 verifyFormat("int a bitor b;"); 14694 verifyFormat("int a compl b;"); 14695 verifyFormat("int a not b;"); 14696 verifyFormat("int a not_eq b;"); 14697 verifyFormat("int a or b;"); 14698 verifyFormat("int a xor b;"); 14699 verifyFormat("int a xor_eq b;"); 14700 verifyFormat("return this not_eq bitand other;"); 14701 verifyFormat("bool operator not_eq(const X bitand other)"); 14702 14703 verifyFormat("int a and 5;"); 14704 verifyFormat("int a and_eq 5;"); 14705 verifyFormat("int a bitand 5;"); 14706 verifyFormat("int a bitor 5;"); 14707 verifyFormat("int a compl 5;"); 14708 verifyFormat("int a not 5;"); 14709 verifyFormat("int a not_eq 5;"); 14710 verifyFormat("int a or 5;"); 14711 verifyFormat("int a xor 5;"); 14712 verifyFormat("int a xor_eq 5;"); 14713 14714 verifyFormat("int a compl(5);"); 14715 verifyFormat("int a not(5);"); 14716 14717 /* FIXME handle alternate tokens 14718 * https://en.cppreference.com/w/cpp/language/operator_alternative 14719 // alternative tokens 14720 verifyFormat("compl foo();"); // ~foo(); 14721 verifyFormat("foo() <%%>;"); // foo(); 14722 verifyFormat("void foo() <%%>;"); // void foo(){} 14723 verifyFormat("int a <:1:>;"); // int a[1];[ 14724 verifyFormat("%:define ABC abc"); // #define ABC abc 14725 verifyFormat("%:%:"); // ## 14726 */ 14727 } 14728 14729 TEST_F(FormatTest, STLWhileNotDefineChed) { 14730 verifyFormat("#if defined(while)\n" 14731 "#define while EMIT WARNING C4005\n" 14732 "#endif // while"); 14733 } 14734 14735 } // namespace 14736 } // namespace format 14737 } // namespace clang 14738