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 } 10576 10577 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10578 verifyFormat("int a = 5;"); 10579 verifyFormat("a += 42;"); 10580 verifyFormat("a or_eq 8;"); 10581 10582 FormatStyle Spaces = getLLVMStyle(); 10583 Spaces.SpaceBeforeAssignmentOperators = false; 10584 verifyFormat("int a= 5;", Spaces); 10585 verifyFormat("a+= 42;", Spaces); 10586 verifyFormat("a or_eq 8;", Spaces); 10587 } 10588 10589 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10590 verifyFormat("class Foo : public Bar {};"); 10591 verifyFormat("Foo::Foo() : foo(1) {}"); 10592 verifyFormat("for (auto a : b) {\n}"); 10593 verifyFormat("int x = a ? b : c;"); 10594 verifyFormat("{\n" 10595 "label0:\n" 10596 " int x = 0;\n" 10597 "}"); 10598 verifyFormat("switch (x) {\n" 10599 "case 1:\n" 10600 "default:\n" 10601 "}"); 10602 10603 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10604 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10605 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10606 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10607 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10608 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10609 verifyFormat("{\n" 10610 "label1:\n" 10611 " int x = 0;\n" 10612 "}", 10613 CtorInitializerStyle); 10614 verifyFormat("switch (x) {\n" 10615 "case 1:\n" 10616 "default:\n" 10617 "}", 10618 CtorInitializerStyle); 10619 CtorInitializerStyle.BreakConstructorInitializers = 10620 FormatStyle::BCIS_AfterColon; 10621 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10622 " aaaaaaaaaaaaaaaa(1),\n" 10623 " bbbbbbbbbbbbbbbb(2) {}", 10624 CtorInitializerStyle); 10625 CtorInitializerStyle.BreakConstructorInitializers = 10626 FormatStyle::BCIS_BeforeComma; 10627 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10628 " : aaaaaaaaaaaaaaaa(1)\n" 10629 " , bbbbbbbbbbbbbbbb(2) {}", 10630 CtorInitializerStyle); 10631 CtorInitializerStyle.BreakConstructorInitializers = 10632 FormatStyle::BCIS_BeforeColon; 10633 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10634 " : aaaaaaaaaaaaaaaa(1),\n" 10635 " bbbbbbbbbbbbbbbb(2) {}", 10636 CtorInitializerStyle); 10637 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10638 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10639 ": aaaaaaaaaaaaaaaa(1),\n" 10640 " bbbbbbbbbbbbbbbb(2) {}", 10641 CtorInitializerStyle); 10642 10643 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10644 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10645 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10646 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10647 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10648 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10649 verifyFormat("{\n" 10650 "label2:\n" 10651 " int x = 0;\n" 10652 "}", 10653 InheritanceStyle); 10654 verifyFormat("switch (x) {\n" 10655 "case 1:\n" 10656 "default:\n" 10657 "}", 10658 InheritanceStyle); 10659 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10660 verifyFormat("class Foooooooooooooooooooooo:\n" 10661 " public aaaaaaaaaaaaaaaaaa,\n" 10662 " public bbbbbbbbbbbbbbbbbb {\n" 10663 "}", 10664 InheritanceStyle); 10665 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10666 verifyFormat("class Foooooooooooooooooooooo\n" 10667 " : public aaaaaaaaaaaaaaaaaa\n" 10668 " , public bbbbbbbbbbbbbbbbbb {\n" 10669 "}", 10670 InheritanceStyle); 10671 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10672 verifyFormat("class Foooooooooooooooooooooo\n" 10673 " : public aaaaaaaaaaaaaaaaaa,\n" 10674 " public bbbbbbbbbbbbbbbbbb {\n" 10675 "}", 10676 InheritanceStyle); 10677 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10678 verifyFormat("class Foooooooooooooooooooooo\n" 10679 ": public aaaaaaaaaaaaaaaaaa,\n" 10680 " public bbbbbbbbbbbbbbbbbb {}", 10681 InheritanceStyle); 10682 10683 FormatStyle ForLoopStyle = getLLVMStyle(); 10684 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10685 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10686 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10687 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10688 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10689 verifyFormat("{\n" 10690 "label2:\n" 10691 " int x = 0;\n" 10692 "}", 10693 ForLoopStyle); 10694 verifyFormat("switch (x) {\n" 10695 "case 1:\n" 10696 "default:\n" 10697 "}", 10698 ForLoopStyle); 10699 10700 FormatStyle NoSpaceStyle = getLLVMStyle(); 10701 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10702 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10703 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10704 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10705 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10706 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10707 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10708 verifyFormat("{\n" 10709 "label3:\n" 10710 " int x = 0;\n" 10711 "}", 10712 NoSpaceStyle); 10713 verifyFormat("switch (x) {\n" 10714 "case 1:\n" 10715 "default:\n" 10716 "}", 10717 NoSpaceStyle); 10718 } 10719 10720 TEST_F(FormatTest, AlignConsecutiveMacros) { 10721 FormatStyle Style = getLLVMStyle(); 10722 Style.AlignConsecutiveAssignments = true; 10723 Style.AlignConsecutiveDeclarations = true; 10724 Style.AlignConsecutiveMacros = false; 10725 10726 verifyFormat("#define a 3\n" 10727 "#define bbbb 4\n" 10728 "#define ccc (5)", 10729 Style); 10730 10731 verifyFormat("#define f(x) (x * x)\n" 10732 "#define fff(x, y, z) (x * y + z)\n" 10733 "#define ffff(x, y) (x - y)", 10734 Style); 10735 10736 verifyFormat("#define foo(x, y) (x + y)\n" 10737 "#define bar (5, 6)(2 + 2)", 10738 Style); 10739 10740 verifyFormat("#define a 3\n" 10741 "#define bbbb 4\n" 10742 "#define ccc (5)\n" 10743 "#define f(x) (x * x)\n" 10744 "#define fff(x, y, z) (x * y + z)\n" 10745 "#define ffff(x, y) (x - y)", 10746 Style); 10747 10748 Style.AlignConsecutiveMacros = true; 10749 verifyFormat("#define a 3\n" 10750 "#define bbbb 4\n" 10751 "#define ccc (5)", 10752 Style); 10753 10754 verifyFormat("#define f(x) (x * x)\n" 10755 "#define fff(x, y, z) (x * y + z)\n" 10756 "#define ffff(x, y) (x - y)", 10757 Style); 10758 10759 verifyFormat("#define foo(x, y) (x + y)\n" 10760 "#define bar (5, 6)(2 + 2)", 10761 Style); 10762 10763 verifyFormat("#define a 3\n" 10764 "#define bbbb 4\n" 10765 "#define ccc (5)\n" 10766 "#define f(x) (x * x)\n" 10767 "#define fff(x, y, z) (x * y + z)\n" 10768 "#define ffff(x, y) (x - y)", 10769 Style); 10770 10771 verifyFormat("#define a 5\n" 10772 "#define foo(x, y) (x + y)\n" 10773 "#define CCC (6)\n" 10774 "auto lambda = []() {\n" 10775 " auto ii = 0;\n" 10776 " float j = 0;\n" 10777 " return 0;\n" 10778 "};\n" 10779 "int i = 0;\n" 10780 "float i2 = 0;\n" 10781 "auto v = type{\n" 10782 " i = 1, //\n" 10783 " (i = 2), //\n" 10784 " i = 3 //\n" 10785 "};", 10786 Style); 10787 10788 Style.AlignConsecutiveMacros = false; 10789 Style.ColumnLimit = 20; 10790 10791 verifyFormat("#define a \\\n" 10792 " \"aabbbbbbbbbbbb\"\n" 10793 "#define D \\\n" 10794 " \"aabbbbbbbbbbbb\" \\\n" 10795 " \"ccddeeeeeeeee\"\n" 10796 "#define B \\\n" 10797 " \"QQQQQQQQQQQQQ\" \\\n" 10798 " \"FFFFFFFFFFFFF\" \\\n" 10799 " \"LLLLLLLL\"\n", 10800 Style); 10801 10802 Style.AlignConsecutiveMacros = true; 10803 verifyFormat("#define a \\\n" 10804 " \"aabbbbbbbbbbbb\"\n" 10805 "#define D \\\n" 10806 " \"aabbbbbbbbbbbb\" \\\n" 10807 " \"ccddeeeeeeeee\"\n" 10808 "#define B \\\n" 10809 " \"QQQQQQQQQQQQQ\" \\\n" 10810 " \"FFFFFFFFFFFFF\" \\\n" 10811 " \"LLLLLLLL\"\n", 10812 Style); 10813 } 10814 10815 TEST_F(FormatTest, AlignConsecutiveAssignments) { 10816 FormatStyle Alignment = getLLVMStyle(); 10817 Alignment.AlignConsecutiveMacros = true; 10818 Alignment.AlignConsecutiveAssignments = false; 10819 verifyFormat("int a = 5;\n" 10820 "int oneTwoThree = 123;", 10821 Alignment); 10822 verifyFormat("int a = 5;\n" 10823 "int oneTwoThree = 123;", 10824 Alignment); 10825 10826 Alignment.AlignConsecutiveAssignments = true; 10827 verifyFormat("int a = 5;\n" 10828 "int oneTwoThree = 123;", 10829 Alignment); 10830 verifyFormat("int a = method();\n" 10831 "int oneTwoThree = 133;", 10832 Alignment); 10833 verifyFormat("a &= 5;\n" 10834 "bcd *= 5;\n" 10835 "ghtyf += 5;\n" 10836 "dvfvdb -= 5;\n" 10837 "a /= 5;\n" 10838 "vdsvsv %= 5;\n" 10839 "sfdbddfbdfbb ^= 5;\n" 10840 "dvsdsv |= 5;\n" 10841 "int dsvvdvsdvvv = 123;", 10842 Alignment); 10843 verifyFormat("int i = 1, j = 10;\n" 10844 "something = 2000;", 10845 Alignment); 10846 verifyFormat("something = 2000;\n" 10847 "int i = 1, j = 10;\n", 10848 Alignment); 10849 verifyFormat("something = 2000;\n" 10850 "another = 911;\n" 10851 "int i = 1, j = 10;\n" 10852 "oneMore = 1;\n" 10853 "i = 2;", 10854 Alignment); 10855 verifyFormat("int a = 5;\n" 10856 "int one = 1;\n" 10857 "method();\n" 10858 "int oneTwoThree = 123;\n" 10859 "int oneTwo = 12;", 10860 Alignment); 10861 verifyFormat("int oneTwoThree = 123;\n" 10862 "int oneTwo = 12;\n" 10863 "method();\n", 10864 Alignment); 10865 verifyFormat("int oneTwoThree = 123; // comment\n" 10866 "int oneTwo = 12; // comment", 10867 Alignment); 10868 EXPECT_EQ("int a = 5;\n" 10869 "\n" 10870 "int oneTwoThree = 123;", 10871 format("int a = 5;\n" 10872 "\n" 10873 "int oneTwoThree= 123;", 10874 Alignment)); 10875 EXPECT_EQ("int a = 5;\n" 10876 "int one = 1;\n" 10877 "\n" 10878 "int oneTwoThree = 123;", 10879 format("int a = 5;\n" 10880 "int one = 1;\n" 10881 "\n" 10882 "int oneTwoThree = 123;", 10883 Alignment)); 10884 EXPECT_EQ("int a = 5;\n" 10885 "int one = 1;\n" 10886 "\n" 10887 "int oneTwoThree = 123;\n" 10888 "int oneTwo = 12;", 10889 format("int a = 5;\n" 10890 "int one = 1;\n" 10891 "\n" 10892 "int oneTwoThree = 123;\n" 10893 "int oneTwo = 12;", 10894 Alignment)); 10895 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10896 verifyFormat("#define A \\\n" 10897 " int aaaa = 12; \\\n" 10898 " int b = 23; \\\n" 10899 " int ccc = 234; \\\n" 10900 " int dddddddddd = 2345;", 10901 Alignment); 10902 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10903 verifyFormat("#define A \\\n" 10904 " int aaaa = 12; \\\n" 10905 " int b = 23; \\\n" 10906 " int ccc = 234; \\\n" 10907 " int dddddddddd = 2345;", 10908 Alignment); 10909 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10910 verifyFormat("#define A " 10911 " \\\n" 10912 " int aaaa = 12; " 10913 " \\\n" 10914 " int b = 23; " 10915 " \\\n" 10916 " int ccc = 234; " 10917 " \\\n" 10918 " int dddddddddd = 2345;", 10919 Alignment); 10920 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10921 "k = 4, int l = 5,\n" 10922 " int m = 6) {\n" 10923 " int j = 10;\n" 10924 " otherThing = 1;\n" 10925 "}", 10926 Alignment); 10927 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10928 " int i = 1;\n" 10929 " int j = 2;\n" 10930 " int big = 10000;\n" 10931 "}", 10932 Alignment); 10933 verifyFormat("class C {\n" 10934 "public:\n" 10935 " int i = 1;\n" 10936 " virtual void f() = 0;\n" 10937 "};", 10938 Alignment); 10939 verifyFormat("int i = 1;\n" 10940 "if (SomeType t = getSomething()) {\n" 10941 "}\n" 10942 "int j = 2;\n" 10943 "int big = 10000;", 10944 Alignment); 10945 verifyFormat("int j = 7;\n" 10946 "for (int k = 0; k < N; ++k) {\n" 10947 "}\n" 10948 "int j = 2;\n" 10949 "int big = 10000;\n" 10950 "}", 10951 Alignment); 10952 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10953 verifyFormat("int i = 1;\n" 10954 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10955 " = someLooooooooooooooooongFunction();\n" 10956 "int j = 2;", 10957 Alignment); 10958 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10959 verifyFormat("int i = 1;\n" 10960 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10961 " someLooooooooooooooooongFunction();\n" 10962 "int j = 2;", 10963 Alignment); 10964 10965 verifyFormat("auto lambda = []() {\n" 10966 " auto i = 0;\n" 10967 " return 0;\n" 10968 "};\n" 10969 "int i = 0;\n" 10970 "auto v = type{\n" 10971 " i = 1, //\n" 10972 " (i = 2), //\n" 10973 " i = 3 //\n" 10974 "};", 10975 Alignment); 10976 10977 verifyFormat( 10978 "int i = 1;\n" 10979 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10980 " loooooooooooooooooooooongParameterB);\n" 10981 "int j = 2;", 10982 Alignment); 10983 10984 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 10985 " typename B = very_long_type_name_1,\n" 10986 " typename T_2 = very_long_type_name_2>\n" 10987 "auto foo() {}\n", 10988 Alignment); 10989 verifyFormat("int a, b = 1;\n" 10990 "int c = 2;\n" 10991 "int dd = 3;\n", 10992 Alignment); 10993 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10994 "float b[1][] = {{3.f}};\n", 10995 Alignment); 10996 verifyFormat("for (int i = 0; i < 1; i++)\n" 10997 " int x = 1;\n", 10998 Alignment); 10999 verifyFormat("for (i = 0; i < 1; i++)\n" 11000 " x = 1;\n" 11001 "y = 1;\n", 11002 Alignment); 11003 } 11004 11005 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 11006 FormatStyle Alignment = getLLVMStyle(); 11007 Alignment.AlignConsecutiveMacros = true; 11008 Alignment.AlignConsecutiveDeclarations = false; 11009 verifyFormat("float const a = 5;\n" 11010 "int oneTwoThree = 123;", 11011 Alignment); 11012 verifyFormat("int a = 5;\n" 11013 "float const oneTwoThree = 123;", 11014 Alignment); 11015 11016 Alignment.AlignConsecutiveDeclarations = true; 11017 verifyFormat("float const a = 5;\n" 11018 "int oneTwoThree = 123;", 11019 Alignment); 11020 verifyFormat("int a = method();\n" 11021 "float const oneTwoThree = 133;", 11022 Alignment); 11023 verifyFormat("int i = 1, j = 10;\n" 11024 "something = 2000;", 11025 Alignment); 11026 verifyFormat("something = 2000;\n" 11027 "int i = 1, j = 10;\n", 11028 Alignment); 11029 verifyFormat("float something = 2000;\n" 11030 "double another = 911;\n" 11031 "int i = 1, j = 10;\n" 11032 "const int *oneMore = 1;\n" 11033 "unsigned i = 2;", 11034 Alignment); 11035 verifyFormat("float a = 5;\n" 11036 "int one = 1;\n" 11037 "method();\n" 11038 "const double oneTwoThree = 123;\n" 11039 "const unsigned int oneTwo = 12;", 11040 Alignment); 11041 verifyFormat("int oneTwoThree{0}; // comment\n" 11042 "unsigned oneTwo; // comment", 11043 Alignment); 11044 EXPECT_EQ("float const a = 5;\n" 11045 "\n" 11046 "int oneTwoThree = 123;", 11047 format("float const a = 5;\n" 11048 "\n" 11049 "int oneTwoThree= 123;", 11050 Alignment)); 11051 EXPECT_EQ("float a = 5;\n" 11052 "int one = 1;\n" 11053 "\n" 11054 "unsigned oneTwoThree = 123;", 11055 format("float a = 5;\n" 11056 "int one = 1;\n" 11057 "\n" 11058 "unsigned oneTwoThree = 123;", 11059 Alignment)); 11060 EXPECT_EQ("float a = 5;\n" 11061 "int one = 1;\n" 11062 "\n" 11063 "unsigned oneTwoThree = 123;\n" 11064 "int oneTwo = 12;", 11065 format("float a = 5;\n" 11066 "int one = 1;\n" 11067 "\n" 11068 "unsigned oneTwoThree = 123;\n" 11069 "int oneTwo = 12;", 11070 Alignment)); 11071 // Function prototype alignment 11072 verifyFormat("int a();\n" 11073 "double b();", 11074 Alignment); 11075 verifyFormat("int a(int x);\n" 11076 "double b();", 11077 Alignment); 11078 unsigned OldColumnLimit = Alignment.ColumnLimit; 11079 // We need to set ColumnLimit to zero, in order to stress nested alignments, 11080 // otherwise the function parameters will be re-flowed onto a single line. 11081 Alignment.ColumnLimit = 0; 11082 EXPECT_EQ("int a(int x,\n" 11083 " float y);\n" 11084 "double b(int x,\n" 11085 " double y);", 11086 format("int a(int x,\n" 11087 " float y);\n" 11088 "double b(int x,\n" 11089 " double y);", 11090 Alignment)); 11091 // This ensures that function parameters of function declarations are 11092 // correctly indented when their owning functions are indented. 11093 // The failure case here is for 'double y' to not be indented enough. 11094 EXPECT_EQ("double a(int x);\n" 11095 "int b(int y,\n" 11096 " double z);", 11097 format("double a(int x);\n" 11098 "int b(int y,\n" 11099 " double z);", 11100 Alignment)); 11101 // Set ColumnLimit low so that we induce wrapping immediately after 11102 // the function name and opening paren. 11103 Alignment.ColumnLimit = 13; 11104 verifyFormat("int function(\n" 11105 " int x,\n" 11106 " bool y);", 11107 Alignment); 11108 Alignment.ColumnLimit = OldColumnLimit; 11109 // Ensure function pointers don't screw up recursive alignment 11110 verifyFormat("int a(int x, void (*fp)(int y));\n" 11111 "double b();", 11112 Alignment); 11113 Alignment.AlignConsecutiveAssignments = true; 11114 // Ensure recursive alignment is broken by function braces, so that the 11115 // "a = 1" does not align with subsequent assignments inside the function 11116 // body. 11117 verifyFormat("int func(int a = 1) {\n" 11118 " int b = 2;\n" 11119 " int cc = 3;\n" 11120 "}", 11121 Alignment); 11122 verifyFormat("float something = 2000;\n" 11123 "double another = 911;\n" 11124 "int i = 1, j = 10;\n" 11125 "const int *oneMore = 1;\n" 11126 "unsigned i = 2;", 11127 Alignment); 11128 verifyFormat("int oneTwoThree = {0}; // comment\n" 11129 "unsigned oneTwo = 0; // comment", 11130 Alignment); 11131 // Make sure that scope is correctly tracked, in the absence of braces 11132 verifyFormat("for (int i = 0; i < n; i++)\n" 11133 " j = i;\n" 11134 "double x = 1;\n", 11135 Alignment); 11136 verifyFormat("if (int i = 0)\n" 11137 " j = i;\n" 11138 "double x = 1;\n", 11139 Alignment); 11140 // Ensure operator[] and operator() are comprehended 11141 verifyFormat("struct test {\n" 11142 " long long int foo();\n" 11143 " int operator[](int a);\n" 11144 " double bar();\n" 11145 "};\n", 11146 Alignment); 11147 verifyFormat("struct test {\n" 11148 " long long int foo();\n" 11149 " int operator()(int a);\n" 11150 " double bar();\n" 11151 "};\n", 11152 Alignment); 11153 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 11154 " int const i = 1;\n" 11155 " int * j = 2;\n" 11156 " int big = 10000;\n" 11157 "\n" 11158 " unsigned oneTwoThree = 123;\n" 11159 " int oneTwo = 12;\n" 11160 " method();\n" 11161 " float k = 2;\n" 11162 " int ll = 10000;\n" 11163 "}", 11164 format("void SomeFunction(int parameter= 0) {\n" 11165 " int const i= 1;\n" 11166 " int *j=2;\n" 11167 " int big = 10000;\n" 11168 "\n" 11169 "unsigned oneTwoThree =123;\n" 11170 "int oneTwo = 12;\n" 11171 " method();\n" 11172 "float k= 2;\n" 11173 "int ll=10000;\n" 11174 "}", 11175 Alignment)); 11176 Alignment.AlignConsecutiveAssignments = false; 11177 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11178 verifyFormat("#define A \\\n" 11179 " int aaaa = 12; \\\n" 11180 " float b = 23; \\\n" 11181 " const int ccc = 234; \\\n" 11182 " unsigned dddddddddd = 2345;", 11183 Alignment); 11184 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11185 verifyFormat("#define A \\\n" 11186 " int aaaa = 12; \\\n" 11187 " float b = 23; \\\n" 11188 " const int ccc = 234; \\\n" 11189 " unsigned dddddddddd = 2345;", 11190 Alignment); 11191 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11192 Alignment.ColumnLimit = 30; 11193 verifyFormat("#define A \\\n" 11194 " int aaaa = 12; \\\n" 11195 " float b = 23; \\\n" 11196 " const int ccc = 234; \\\n" 11197 " int dddddddddd = 2345;", 11198 Alignment); 11199 Alignment.ColumnLimit = 80; 11200 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11201 "k = 4, int l = 5,\n" 11202 " int m = 6) {\n" 11203 " const int j = 10;\n" 11204 " otherThing = 1;\n" 11205 "}", 11206 Alignment); 11207 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11208 " int const i = 1;\n" 11209 " int * j = 2;\n" 11210 " int big = 10000;\n" 11211 "}", 11212 Alignment); 11213 verifyFormat("class C {\n" 11214 "public:\n" 11215 " int i = 1;\n" 11216 " virtual void f() = 0;\n" 11217 "};", 11218 Alignment); 11219 verifyFormat("float i = 1;\n" 11220 "if (SomeType t = getSomething()) {\n" 11221 "}\n" 11222 "const unsigned j = 2;\n" 11223 "int big = 10000;", 11224 Alignment); 11225 verifyFormat("float j = 7;\n" 11226 "for (int k = 0; k < N; ++k) {\n" 11227 "}\n" 11228 "unsigned j = 2;\n" 11229 "int big = 10000;\n" 11230 "}", 11231 Alignment); 11232 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11233 verifyFormat("float i = 1;\n" 11234 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11235 " = someLooooooooooooooooongFunction();\n" 11236 "int j = 2;", 11237 Alignment); 11238 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11239 verifyFormat("int i = 1;\n" 11240 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11241 " someLooooooooooooooooongFunction();\n" 11242 "int j = 2;", 11243 Alignment); 11244 11245 Alignment.AlignConsecutiveAssignments = true; 11246 verifyFormat("auto lambda = []() {\n" 11247 " auto ii = 0;\n" 11248 " float j = 0;\n" 11249 " return 0;\n" 11250 "};\n" 11251 "int i = 0;\n" 11252 "float i2 = 0;\n" 11253 "auto v = type{\n" 11254 " i = 1, //\n" 11255 " (i = 2), //\n" 11256 " i = 3 //\n" 11257 "};", 11258 Alignment); 11259 Alignment.AlignConsecutiveAssignments = false; 11260 11261 verifyFormat( 11262 "int i = 1;\n" 11263 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11264 " loooooooooooooooooooooongParameterB);\n" 11265 "int j = 2;", 11266 Alignment); 11267 11268 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 11269 // We expect declarations and assignments to align, as long as it doesn't 11270 // exceed the column limit, starting a new alignment sequence whenever it 11271 // happens. 11272 Alignment.AlignConsecutiveAssignments = true; 11273 Alignment.ColumnLimit = 30; 11274 verifyFormat("float ii = 1;\n" 11275 "unsigned j = 2;\n" 11276 "int someVerylongVariable = 1;\n" 11277 "AnotherLongType ll = 123456;\n" 11278 "VeryVeryLongType k = 2;\n" 11279 "int myvar = 1;", 11280 Alignment); 11281 Alignment.ColumnLimit = 80; 11282 Alignment.AlignConsecutiveAssignments = false; 11283 11284 verifyFormat( 11285 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 11286 " typename LongType, typename B>\n" 11287 "auto foo() {}\n", 11288 Alignment); 11289 verifyFormat("float a, b = 1;\n" 11290 "int c = 2;\n" 11291 "int dd = 3;\n", 11292 Alignment); 11293 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11294 "float b[1][] = {{3.f}};\n", 11295 Alignment); 11296 Alignment.AlignConsecutiveAssignments = true; 11297 verifyFormat("float a, b = 1;\n" 11298 "int c = 2;\n" 11299 "int dd = 3;\n", 11300 Alignment); 11301 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11302 "float b[1][] = {{3.f}};\n", 11303 Alignment); 11304 Alignment.AlignConsecutiveAssignments = false; 11305 11306 Alignment.ColumnLimit = 30; 11307 Alignment.BinPackParameters = false; 11308 verifyFormat("void foo(float a,\n" 11309 " float b,\n" 11310 " int c,\n" 11311 " uint32_t *d) {\n" 11312 " int * e = 0;\n" 11313 " float f = 0;\n" 11314 " double g = 0;\n" 11315 "}\n" 11316 "void bar(ino_t a,\n" 11317 " int b,\n" 11318 " uint32_t *c,\n" 11319 " bool d) {}\n", 11320 Alignment); 11321 Alignment.BinPackParameters = true; 11322 Alignment.ColumnLimit = 80; 11323 11324 // Bug 33507 11325 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 11326 verifyFormat( 11327 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 11328 " static const Version verVs2017;\n" 11329 " return true;\n" 11330 "});\n", 11331 Alignment); 11332 Alignment.PointerAlignment = FormatStyle::PAS_Right; 11333 11334 // See llvm.org/PR35641 11335 Alignment.AlignConsecutiveDeclarations = true; 11336 verifyFormat("int func() { //\n" 11337 " int b;\n" 11338 " unsigned c;\n" 11339 "}", 11340 Alignment); 11341 11342 // See PR37175 11343 FormatStyle Style = getMozillaStyle(); 11344 Style.AlignConsecutiveDeclarations = true; 11345 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 11346 "foo(int a);", 11347 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 11348 } 11349 11350 TEST_F(FormatTest, LinuxBraceBreaking) { 11351 FormatStyle LinuxBraceStyle = getLLVMStyle(); 11352 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 11353 verifyFormat("namespace a\n" 11354 "{\n" 11355 "class A\n" 11356 "{\n" 11357 " void f()\n" 11358 " {\n" 11359 " if (true) {\n" 11360 " a();\n" 11361 " b();\n" 11362 " } else {\n" 11363 " a();\n" 11364 " }\n" 11365 " }\n" 11366 " void g() { return; }\n" 11367 "};\n" 11368 "struct B {\n" 11369 " int x;\n" 11370 "};\n" 11371 "} // namespace a\n", 11372 LinuxBraceStyle); 11373 verifyFormat("enum X {\n" 11374 " Y = 0,\n" 11375 "}\n", 11376 LinuxBraceStyle); 11377 verifyFormat("struct S {\n" 11378 " int Type;\n" 11379 " union {\n" 11380 " int x;\n" 11381 " double y;\n" 11382 " } Value;\n" 11383 " class C\n" 11384 " {\n" 11385 " MyFavoriteType Value;\n" 11386 " } Class;\n" 11387 "}\n", 11388 LinuxBraceStyle); 11389 } 11390 11391 TEST_F(FormatTest, MozillaBraceBreaking) { 11392 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11393 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11394 MozillaBraceStyle.FixNamespaceComments = false; 11395 verifyFormat("namespace a {\n" 11396 "class A\n" 11397 "{\n" 11398 " void f()\n" 11399 " {\n" 11400 " if (true) {\n" 11401 " a();\n" 11402 " b();\n" 11403 " }\n" 11404 " }\n" 11405 " void g() { return; }\n" 11406 "};\n" 11407 "enum E\n" 11408 "{\n" 11409 " A,\n" 11410 " // foo\n" 11411 " B,\n" 11412 " C\n" 11413 "};\n" 11414 "struct B\n" 11415 "{\n" 11416 " int x;\n" 11417 "};\n" 11418 "}\n", 11419 MozillaBraceStyle); 11420 verifyFormat("struct S\n" 11421 "{\n" 11422 " int Type;\n" 11423 " union\n" 11424 " {\n" 11425 " int x;\n" 11426 " double y;\n" 11427 " } Value;\n" 11428 " class C\n" 11429 " {\n" 11430 " MyFavoriteType Value;\n" 11431 " } Class;\n" 11432 "}\n", 11433 MozillaBraceStyle); 11434 } 11435 11436 TEST_F(FormatTest, StroustrupBraceBreaking) { 11437 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11438 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11439 verifyFormat("namespace a {\n" 11440 "class A {\n" 11441 " void f()\n" 11442 " {\n" 11443 " if (true) {\n" 11444 " a();\n" 11445 " b();\n" 11446 " }\n" 11447 " }\n" 11448 " void g() { return; }\n" 11449 "};\n" 11450 "struct B {\n" 11451 " int x;\n" 11452 "};\n" 11453 "} // namespace a\n", 11454 StroustrupBraceStyle); 11455 11456 verifyFormat("void foo()\n" 11457 "{\n" 11458 " if (a) {\n" 11459 " a();\n" 11460 " }\n" 11461 " else {\n" 11462 " b();\n" 11463 " }\n" 11464 "}\n", 11465 StroustrupBraceStyle); 11466 11467 verifyFormat("#ifdef _DEBUG\n" 11468 "int foo(int i = 0)\n" 11469 "#else\n" 11470 "int foo(int i = 5)\n" 11471 "#endif\n" 11472 "{\n" 11473 " return i;\n" 11474 "}", 11475 StroustrupBraceStyle); 11476 11477 verifyFormat("void foo() {}\n" 11478 "void bar()\n" 11479 "#ifdef _DEBUG\n" 11480 "{\n" 11481 " foo();\n" 11482 "}\n" 11483 "#else\n" 11484 "{\n" 11485 "}\n" 11486 "#endif", 11487 StroustrupBraceStyle); 11488 11489 verifyFormat("void foobar() { int i = 5; }\n" 11490 "#ifdef _DEBUG\n" 11491 "void bar() {}\n" 11492 "#else\n" 11493 "void bar() { foobar(); }\n" 11494 "#endif", 11495 StroustrupBraceStyle); 11496 } 11497 11498 TEST_F(FormatTest, AllmanBraceBreaking) { 11499 FormatStyle AllmanBraceStyle = getLLVMStyle(); 11500 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 11501 11502 EXPECT_EQ("namespace a\n" 11503 "{\n" 11504 "void f();\n" 11505 "void g();\n" 11506 "} // namespace a\n", 11507 format("namespace a\n" 11508 "{\n" 11509 "void f();\n" 11510 "void g();\n" 11511 "}\n", 11512 AllmanBraceStyle)); 11513 11514 verifyFormat("namespace a\n" 11515 "{\n" 11516 "class A\n" 11517 "{\n" 11518 " void f()\n" 11519 " {\n" 11520 " if (true)\n" 11521 " {\n" 11522 " a();\n" 11523 " b();\n" 11524 " }\n" 11525 " }\n" 11526 " void g() { return; }\n" 11527 "};\n" 11528 "struct B\n" 11529 "{\n" 11530 " int x;\n" 11531 "};\n" 11532 "union C\n" 11533 "{\n" 11534 "};\n" 11535 "} // namespace a", 11536 AllmanBraceStyle); 11537 11538 verifyFormat("void f()\n" 11539 "{\n" 11540 " if (true)\n" 11541 " {\n" 11542 " a();\n" 11543 " }\n" 11544 " else if (false)\n" 11545 " {\n" 11546 " b();\n" 11547 " }\n" 11548 " else\n" 11549 " {\n" 11550 " c();\n" 11551 " }\n" 11552 "}\n", 11553 AllmanBraceStyle); 11554 11555 verifyFormat("void f()\n" 11556 "{\n" 11557 " for (int i = 0; i < 10; ++i)\n" 11558 " {\n" 11559 " a();\n" 11560 " }\n" 11561 " while (false)\n" 11562 " {\n" 11563 " b();\n" 11564 " }\n" 11565 " do\n" 11566 " {\n" 11567 " c();\n" 11568 " } while (false)\n" 11569 "}\n", 11570 AllmanBraceStyle); 11571 11572 verifyFormat("void f(int a)\n" 11573 "{\n" 11574 " switch (a)\n" 11575 " {\n" 11576 " case 0:\n" 11577 " break;\n" 11578 " case 1:\n" 11579 " {\n" 11580 " break;\n" 11581 " }\n" 11582 " case 2:\n" 11583 " {\n" 11584 " }\n" 11585 " break;\n" 11586 " default:\n" 11587 " break;\n" 11588 " }\n" 11589 "}\n", 11590 AllmanBraceStyle); 11591 11592 verifyFormat("enum X\n" 11593 "{\n" 11594 " Y = 0,\n" 11595 "}\n", 11596 AllmanBraceStyle); 11597 verifyFormat("enum X\n" 11598 "{\n" 11599 " Y = 0\n" 11600 "}\n", 11601 AllmanBraceStyle); 11602 11603 verifyFormat("@interface BSApplicationController ()\n" 11604 "{\n" 11605 "@private\n" 11606 " id _extraIvar;\n" 11607 "}\n" 11608 "@end\n", 11609 AllmanBraceStyle); 11610 11611 verifyFormat("#ifdef _DEBUG\n" 11612 "int foo(int i = 0)\n" 11613 "#else\n" 11614 "int foo(int i = 5)\n" 11615 "#endif\n" 11616 "{\n" 11617 " return i;\n" 11618 "}", 11619 AllmanBraceStyle); 11620 11621 verifyFormat("void foo() {}\n" 11622 "void bar()\n" 11623 "#ifdef _DEBUG\n" 11624 "{\n" 11625 " foo();\n" 11626 "}\n" 11627 "#else\n" 11628 "{\n" 11629 "}\n" 11630 "#endif", 11631 AllmanBraceStyle); 11632 11633 verifyFormat("void foobar() { int i = 5; }\n" 11634 "#ifdef _DEBUG\n" 11635 "void bar() {}\n" 11636 "#else\n" 11637 "void bar() { foobar(); }\n" 11638 "#endif", 11639 AllmanBraceStyle); 11640 11641 // This shouldn't affect ObjC blocks.. 11642 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11643 " // ...\n" 11644 " int i;\n" 11645 "}];", 11646 AllmanBraceStyle); 11647 verifyFormat("void (^block)(void) = ^{\n" 11648 " // ...\n" 11649 " int i;\n" 11650 "};", 11651 AllmanBraceStyle); 11652 // .. or dict literals. 11653 verifyFormat("void f()\n" 11654 "{\n" 11655 " // ...\n" 11656 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11657 "}", 11658 AllmanBraceStyle); 11659 verifyFormat("void f()\n" 11660 "{\n" 11661 " // ...\n" 11662 " [object someMethod:@{a : @\"b\"}];\n" 11663 "}", 11664 AllmanBraceStyle); 11665 verifyFormat("int f()\n" 11666 "{ // comment\n" 11667 " return 42;\n" 11668 "}", 11669 AllmanBraceStyle); 11670 11671 AllmanBraceStyle.ColumnLimit = 19; 11672 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11673 AllmanBraceStyle.ColumnLimit = 18; 11674 verifyFormat("void f()\n" 11675 "{\n" 11676 " int i;\n" 11677 "}", 11678 AllmanBraceStyle); 11679 AllmanBraceStyle.ColumnLimit = 80; 11680 11681 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11682 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11683 FormatStyle::SIS_WithoutElse; 11684 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11685 verifyFormat("void f(bool b)\n" 11686 "{\n" 11687 " if (b)\n" 11688 " {\n" 11689 " return;\n" 11690 " }\n" 11691 "}\n", 11692 BreakBeforeBraceShortIfs); 11693 verifyFormat("void f(bool b)\n" 11694 "{\n" 11695 " if constexpr (b)\n" 11696 " {\n" 11697 " return;\n" 11698 " }\n" 11699 "}\n", 11700 BreakBeforeBraceShortIfs); 11701 verifyFormat("void f(bool b)\n" 11702 "{\n" 11703 " if CONSTEXPR (b)\n" 11704 " {\n" 11705 " return;\n" 11706 " }\n" 11707 "}\n", 11708 BreakBeforeBraceShortIfs); 11709 verifyFormat("void f(bool b)\n" 11710 "{\n" 11711 " if (b) return;\n" 11712 "}\n", 11713 BreakBeforeBraceShortIfs); 11714 verifyFormat("void f(bool b)\n" 11715 "{\n" 11716 " if constexpr (b) return;\n" 11717 "}\n", 11718 BreakBeforeBraceShortIfs); 11719 verifyFormat("void f(bool b)\n" 11720 "{\n" 11721 " if CONSTEXPR (b) return;\n" 11722 "}\n", 11723 BreakBeforeBraceShortIfs); 11724 verifyFormat("void f(bool b)\n" 11725 "{\n" 11726 " while (b)\n" 11727 " {\n" 11728 " return;\n" 11729 " }\n" 11730 "}\n", 11731 BreakBeforeBraceShortIfs); 11732 } 11733 11734 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 11735 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 11736 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 11737 11738 // Make a few changes to the style for testing purposes 11739 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 11740 FormatStyle::SFS_Empty; 11741 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 11742 WhitesmithsBraceStyle.ColumnLimit = 0; 11743 11744 // FIXME: this test case can't decide whether there should be a blank line 11745 // after the ~D() line or not. It adds one if one doesn't exist in the test 11746 // and it removes the line if one exists. 11747 /* 11748 verifyFormat("class A;\n" 11749 "namespace B\n" 11750 " {\n" 11751 "class C;\n" 11752 "// Comment\n" 11753 "class D\n" 11754 " {\n" 11755 "public:\n" 11756 " D();\n" 11757 " ~D() {}\n" 11758 "private:\n" 11759 " enum E\n" 11760 " {\n" 11761 " F\n" 11762 " }\n" 11763 " };\n" 11764 " } // namespace B\n", 11765 WhitesmithsBraceStyle); 11766 */ 11767 11768 verifyFormat("namespace a\n" 11769 " {\n" 11770 "class A\n" 11771 " {\n" 11772 " void f()\n" 11773 " {\n" 11774 " if (true)\n" 11775 " {\n" 11776 " a();\n" 11777 " b();\n" 11778 " }\n" 11779 " }\n" 11780 " void g()\n" 11781 " {\n" 11782 " return;\n" 11783 " }\n" 11784 " };\n" 11785 "struct B\n" 11786 " {\n" 11787 " int x;\n" 11788 " };\n" 11789 " } // namespace a", 11790 WhitesmithsBraceStyle); 11791 11792 verifyFormat("void f()\n" 11793 " {\n" 11794 " if (true)\n" 11795 " {\n" 11796 " a();\n" 11797 " }\n" 11798 " else if (false)\n" 11799 " {\n" 11800 " b();\n" 11801 " }\n" 11802 " else\n" 11803 " {\n" 11804 " c();\n" 11805 " }\n" 11806 " }\n", 11807 WhitesmithsBraceStyle); 11808 11809 verifyFormat("void f()\n" 11810 " {\n" 11811 " for (int i = 0; i < 10; ++i)\n" 11812 " {\n" 11813 " a();\n" 11814 " }\n" 11815 " while (false)\n" 11816 " {\n" 11817 " b();\n" 11818 " }\n" 11819 " do\n" 11820 " {\n" 11821 " c();\n" 11822 " } while (false)\n" 11823 " }\n", 11824 WhitesmithsBraceStyle); 11825 11826 // FIXME: the block and the break under case 2 in this test don't get indented 11827 // correctly 11828 /* 11829 verifyFormat("void switchTest1(int a)\n" 11830 " {\n" 11831 " switch (a)\n" 11832 " {\n" 11833 " case 2:\n" 11834 " {\n" 11835 " }\n" 11836 " break;\n" 11837 " }\n" 11838 " }\n", 11839 WhitesmithsBraceStyle); 11840 */ 11841 11842 // FIXME: the block and the break under case 2 in this test don't get indented 11843 // correctly 11844 /* 11845 verifyFormat("void switchTest2(int a)\n" 11846 " {\n" 11847 " switch (a)\n" 11848 " {\n" 11849 " case 0:\n" 11850 " break;\n" 11851 " case 1:\n" 11852 " {\n" 11853 " break;\n" 11854 " }\n" 11855 " case 2:\n" 11856 " {\n" 11857 " }\n" 11858 " break;\n" 11859 " default:\n" 11860 " break;\n" 11861 " }\n" 11862 " }\n", 11863 WhitesmithsBraceStyle); 11864 */ 11865 11866 verifyFormat("enum X\n" 11867 " {\n" 11868 " Y = 0, // testing\n" 11869 " }\n", 11870 WhitesmithsBraceStyle); 11871 11872 verifyFormat("enum X\n" 11873 " {\n" 11874 " Y = 0\n" 11875 " }\n", 11876 WhitesmithsBraceStyle); 11877 verifyFormat("enum X\n" 11878 " {\n" 11879 " Y = 0,\n" 11880 " Z = 1\n" 11881 " };\n", 11882 WhitesmithsBraceStyle); 11883 11884 verifyFormat("@interface BSApplicationController ()\n" 11885 " {\n" 11886 "@private\n" 11887 " id _extraIvar;\n" 11888 " }\n" 11889 "@end\n", 11890 WhitesmithsBraceStyle); 11891 11892 verifyFormat("#ifdef _DEBUG\n" 11893 "int foo(int i = 0)\n" 11894 "#else\n" 11895 "int foo(int i = 5)\n" 11896 "#endif\n" 11897 " {\n" 11898 " return i;\n" 11899 " }", 11900 WhitesmithsBraceStyle); 11901 11902 verifyFormat("void foo() {}\n" 11903 "void bar()\n" 11904 "#ifdef _DEBUG\n" 11905 " {\n" 11906 " foo();\n" 11907 " }\n" 11908 "#else\n" 11909 " {\n" 11910 " }\n" 11911 "#endif", 11912 WhitesmithsBraceStyle); 11913 11914 verifyFormat("void foobar()\n" 11915 " {\n" 11916 " int i = 5;\n" 11917 " }\n" 11918 "#ifdef _DEBUG\n" 11919 "void bar()\n" 11920 " {\n" 11921 " }\n" 11922 "#else\n" 11923 "void bar()\n" 11924 " {\n" 11925 " foobar();\n" 11926 " }\n" 11927 "#endif", 11928 WhitesmithsBraceStyle); 11929 11930 // This shouldn't affect ObjC blocks.. 11931 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11932 " // ...\n" 11933 " int i;\n" 11934 "}];", 11935 WhitesmithsBraceStyle); 11936 verifyFormat("void (^block)(void) = ^{\n" 11937 " // ...\n" 11938 " int i;\n" 11939 "};", 11940 WhitesmithsBraceStyle); 11941 // .. or dict literals. 11942 verifyFormat("void f()\n" 11943 " {\n" 11944 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11945 " }", 11946 WhitesmithsBraceStyle); 11947 11948 verifyFormat("int f()\n" 11949 " { // comment\n" 11950 " return 42;\n" 11951 " }", 11952 WhitesmithsBraceStyle); 11953 11954 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 11955 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11956 FormatStyle::SIS_Always; 11957 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11958 verifyFormat("void f(bool b)\n" 11959 " {\n" 11960 " if (b)\n" 11961 " {\n" 11962 " return;\n" 11963 " }\n" 11964 " }\n", 11965 BreakBeforeBraceShortIfs); 11966 verifyFormat("void f(bool b)\n" 11967 " {\n" 11968 " if (b) return;\n" 11969 " }\n", 11970 BreakBeforeBraceShortIfs); 11971 verifyFormat("void f(bool b)\n" 11972 " {\n" 11973 " while (b)\n" 11974 " {\n" 11975 " return;\n" 11976 " }\n" 11977 " }\n", 11978 BreakBeforeBraceShortIfs); 11979 } 11980 11981 TEST_F(FormatTest, GNUBraceBreaking) { 11982 FormatStyle GNUBraceStyle = getLLVMStyle(); 11983 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 11984 verifyFormat("namespace a\n" 11985 "{\n" 11986 "class A\n" 11987 "{\n" 11988 " void f()\n" 11989 " {\n" 11990 " int a;\n" 11991 " {\n" 11992 " int b;\n" 11993 " }\n" 11994 " if (true)\n" 11995 " {\n" 11996 " a();\n" 11997 " b();\n" 11998 " }\n" 11999 " }\n" 12000 " void g() { return; }\n" 12001 "}\n" 12002 "} // namespace a", 12003 GNUBraceStyle); 12004 12005 verifyFormat("void f()\n" 12006 "{\n" 12007 " if (true)\n" 12008 " {\n" 12009 " a();\n" 12010 " }\n" 12011 " else if (false)\n" 12012 " {\n" 12013 " b();\n" 12014 " }\n" 12015 " else\n" 12016 " {\n" 12017 " c();\n" 12018 " }\n" 12019 "}\n", 12020 GNUBraceStyle); 12021 12022 verifyFormat("void f()\n" 12023 "{\n" 12024 " for (int i = 0; i < 10; ++i)\n" 12025 " {\n" 12026 " a();\n" 12027 " }\n" 12028 " while (false)\n" 12029 " {\n" 12030 " b();\n" 12031 " }\n" 12032 " do\n" 12033 " {\n" 12034 " c();\n" 12035 " }\n" 12036 " while (false);\n" 12037 "}\n", 12038 GNUBraceStyle); 12039 12040 verifyFormat("void f(int a)\n" 12041 "{\n" 12042 " switch (a)\n" 12043 " {\n" 12044 " case 0:\n" 12045 " break;\n" 12046 " case 1:\n" 12047 " {\n" 12048 " break;\n" 12049 " }\n" 12050 " case 2:\n" 12051 " {\n" 12052 " }\n" 12053 " break;\n" 12054 " default:\n" 12055 " break;\n" 12056 " }\n" 12057 "}\n", 12058 GNUBraceStyle); 12059 12060 verifyFormat("enum X\n" 12061 "{\n" 12062 " Y = 0,\n" 12063 "}\n", 12064 GNUBraceStyle); 12065 12066 verifyFormat("@interface BSApplicationController ()\n" 12067 "{\n" 12068 "@private\n" 12069 " id _extraIvar;\n" 12070 "}\n" 12071 "@end\n", 12072 GNUBraceStyle); 12073 12074 verifyFormat("#ifdef _DEBUG\n" 12075 "int foo(int i = 0)\n" 12076 "#else\n" 12077 "int foo(int i = 5)\n" 12078 "#endif\n" 12079 "{\n" 12080 " return i;\n" 12081 "}", 12082 GNUBraceStyle); 12083 12084 verifyFormat("void foo() {}\n" 12085 "void bar()\n" 12086 "#ifdef _DEBUG\n" 12087 "{\n" 12088 " foo();\n" 12089 "}\n" 12090 "#else\n" 12091 "{\n" 12092 "}\n" 12093 "#endif", 12094 GNUBraceStyle); 12095 12096 verifyFormat("void foobar() { int i = 5; }\n" 12097 "#ifdef _DEBUG\n" 12098 "void bar() {}\n" 12099 "#else\n" 12100 "void bar() { foobar(); }\n" 12101 "#endif", 12102 GNUBraceStyle); 12103 } 12104 12105 TEST_F(FormatTest, WebKitBraceBreaking) { 12106 FormatStyle WebKitBraceStyle = getLLVMStyle(); 12107 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 12108 WebKitBraceStyle.FixNamespaceComments = false; 12109 verifyFormat("namespace a {\n" 12110 "class A {\n" 12111 " void f()\n" 12112 " {\n" 12113 " if (true) {\n" 12114 " a();\n" 12115 " b();\n" 12116 " }\n" 12117 " }\n" 12118 " void g() { return; }\n" 12119 "};\n" 12120 "enum E {\n" 12121 " A,\n" 12122 " // foo\n" 12123 " B,\n" 12124 " C\n" 12125 "};\n" 12126 "struct B {\n" 12127 " int x;\n" 12128 "};\n" 12129 "}\n", 12130 WebKitBraceStyle); 12131 verifyFormat("struct S {\n" 12132 " int Type;\n" 12133 " union {\n" 12134 " int x;\n" 12135 " double y;\n" 12136 " } Value;\n" 12137 " class C {\n" 12138 " MyFavoriteType Value;\n" 12139 " } Class;\n" 12140 "};\n", 12141 WebKitBraceStyle); 12142 } 12143 12144 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 12145 verifyFormat("void f() {\n" 12146 " try {\n" 12147 " } catch (const Exception &e) {\n" 12148 " }\n" 12149 "}\n", 12150 getLLVMStyle()); 12151 } 12152 12153 TEST_F(FormatTest, UnderstandsPragmas) { 12154 verifyFormat("#pragma omp reduction(| : var)"); 12155 verifyFormat("#pragma omp reduction(+ : var)"); 12156 12157 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 12158 "(including parentheses).", 12159 format("#pragma mark Any non-hyphenated or hyphenated string " 12160 "(including parentheses).")); 12161 } 12162 12163 TEST_F(FormatTest, UnderstandPragmaOption) { 12164 verifyFormat("#pragma option -C -A"); 12165 12166 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 12167 } 12168 12169 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 12170 FormatStyle Style = getLLVMStyle(); 12171 Style.ColumnLimit = 20; 12172 12173 // See PR41213 12174 EXPECT_EQ("/*\n" 12175 " *\t9012345\n" 12176 " * /8901\n" 12177 " */", 12178 format("/*\n" 12179 " *\t9012345 /8901\n" 12180 " */", 12181 Style)); 12182 EXPECT_EQ("/*\n" 12183 " *345678\n" 12184 " *\t/8901\n" 12185 " */", 12186 format("/*\n" 12187 " *345678\t/8901\n" 12188 " */", 12189 Style)); 12190 12191 verifyFormat("int a; // the\n" 12192 " // comment", 12193 Style); 12194 EXPECT_EQ("int a; /* first line\n" 12195 " * second\n" 12196 " * line third\n" 12197 " * line\n" 12198 " */", 12199 format("int a; /* first line\n" 12200 " * second\n" 12201 " * line third\n" 12202 " * line\n" 12203 " */", 12204 Style)); 12205 EXPECT_EQ("int a; // first line\n" 12206 " // second\n" 12207 " // line third\n" 12208 " // line", 12209 format("int a; // first line\n" 12210 " // second line\n" 12211 " // third line", 12212 Style)); 12213 12214 Style.PenaltyExcessCharacter = 90; 12215 verifyFormat("int a; // the comment", Style); 12216 EXPECT_EQ("int a; // the comment\n" 12217 " // aaa", 12218 format("int a; // the comment aaa", Style)); 12219 EXPECT_EQ("int a; /* first line\n" 12220 " * second line\n" 12221 " * third line\n" 12222 " */", 12223 format("int a; /* first line\n" 12224 " * second line\n" 12225 " * third line\n" 12226 " */", 12227 Style)); 12228 EXPECT_EQ("int a; // first line\n" 12229 " // second line\n" 12230 " // third line", 12231 format("int a; // first line\n" 12232 " // second line\n" 12233 " // third line", 12234 Style)); 12235 // FIXME: Investigate why this is not getting the same layout as the test 12236 // above. 12237 EXPECT_EQ("int a; /* first line\n" 12238 " * second line\n" 12239 " * third line\n" 12240 " */", 12241 format("int a; /* first line second line third line" 12242 "\n*/", 12243 Style)); 12244 12245 EXPECT_EQ("// foo bar baz bazfoo\n" 12246 "// foo bar foo bar\n", 12247 format("// foo bar baz bazfoo\n" 12248 "// foo bar foo bar\n", 12249 Style)); 12250 EXPECT_EQ("// foo bar baz bazfoo\n" 12251 "// foo bar foo bar\n", 12252 format("// foo bar baz bazfoo\n" 12253 "// foo bar foo bar\n", 12254 Style)); 12255 12256 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 12257 // next one. 12258 EXPECT_EQ("// foo bar baz bazfoo\n" 12259 "// bar foo bar\n", 12260 format("// foo bar baz bazfoo bar\n" 12261 "// foo bar\n", 12262 Style)); 12263 12264 EXPECT_EQ("// foo bar baz bazfoo\n" 12265 "// foo bar baz bazfoo\n" 12266 "// bar foo bar\n", 12267 format("// foo bar baz bazfoo\n" 12268 "// foo bar baz bazfoo bar\n" 12269 "// foo bar\n", 12270 Style)); 12271 12272 EXPECT_EQ("// foo bar baz bazfoo\n" 12273 "// foo bar baz bazfoo\n" 12274 "// bar foo bar\n", 12275 format("// foo bar baz bazfoo\n" 12276 "// foo bar baz bazfoo bar\n" 12277 "// foo bar\n", 12278 Style)); 12279 12280 // Make sure we do not keep protruding characters if strict mode reflow is 12281 // cheaper than keeping protruding characters. 12282 Style.ColumnLimit = 21; 12283 EXPECT_EQ( 12284 "// foo foo foo foo\n" 12285 "// foo foo foo foo\n" 12286 "// foo foo foo foo\n", 12287 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 12288 12289 EXPECT_EQ("int a = /* long block\n" 12290 " comment */\n" 12291 " 42;", 12292 format("int a = /* long block comment */ 42;", Style)); 12293 } 12294 12295 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 12296 for (size_t i = 1; i < Styles.size(); ++i) \ 12297 EXPECT_EQ(Styles[0], Styles[i]) \ 12298 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 12299 12300 TEST_F(FormatTest, GetsPredefinedStyleByName) { 12301 SmallVector<FormatStyle, 3> Styles; 12302 Styles.resize(3); 12303 12304 Styles[0] = getLLVMStyle(); 12305 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 12306 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 12307 EXPECT_ALL_STYLES_EQUAL(Styles); 12308 12309 Styles[0] = getGoogleStyle(); 12310 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 12311 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 12312 EXPECT_ALL_STYLES_EQUAL(Styles); 12313 12314 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12315 EXPECT_TRUE( 12316 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 12317 EXPECT_TRUE( 12318 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 12319 EXPECT_ALL_STYLES_EQUAL(Styles); 12320 12321 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 12322 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 12323 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 12324 EXPECT_ALL_STYLES_EQUAL(Styles); 12325 12326 Styles[0] = getMozillaStyle(); 12327 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 12328 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 12329 EXPECT_ALL_STYLES_EQUAL(Styles); 12330 12331 Styles[0] = getWebKitStyle(); 12332 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 12333 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 12334 EXPECT_ALL_STYLES_EQUAL(Styles); 12335 12336 Styles[0] = getGNUStyle(); 12337 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 12338 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 12339 EXPECT_ALL_STYLES_EQUAL(Styles); 12340 12341 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 12342 } 12343 12344 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 12345 SmallVector<FormatStyle, 8> Styles; 12346 Styles.resize(2); 12347 12348 Styles[0] = getGoogleStyle(); 12349 Styles[1] = getLLVMStyle(); 12350 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12351 EXPECT_ALL_STYLES_EQUAL(Styles); 12352 12353 Styles.resize(5); 12354 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12355 Styles[1] = getLLVMStyle(); 12356 Styles[1].Language = FormatStyle::LK_JavaScript; 12357 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12358 12359 Styles[2] = getLLVMStyle(); 12360 Styles[2].Language = FormatStyle::LK_JavaScript; 12361 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 12362 "BasedOnStyle: Google", 12363 &Styles[2]) 12364 .value()); 12365 12366 Styles[3] = getLLVMStyle(); 12367 Styles[3].Language = FormatStyle::LK_JavaScript; 12368 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 12369 "Language: JavaScript", 12370 &Styles[3]) 12371 .value()); 12372 12373 Styles[4] = getLLVMStyle(); 12374 Styles[4].Language = FormatStyle::LK_JavaScript; 12375 EXPECT_EQ(0, parseConfiguration("---\n" 12376 "BasedOnStyle: LLVM\n" 12377 "IndentWidth: 123\n" 12378 "---\n" 12379 "BasedOnStyle: Google\n" 12380 "Language: JavaScript", 12381 &Styles[4]) 12382 .value()); 12383 EXPECT_ALL_STYLES_EQUAL(Styles); 12384 } 12385 12386 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 12387 Style.FIELD = false; \ 12388 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 12389 EXPECT_TRUE(Style.FIELD); \ 12390 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 12391 EXPECT_FALSE(Style.FIELD); 12392 12393 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 12394 12395 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 12396 Style.STRUCT.FIELD = false; \ 12397 EXPECT_EQ(0, \ 12398 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 12399 .value()); \ 12400 EXPECT_TRUE(Style.STRUCT.FIELD); \ 12401 EXPECT_EQ(0, \ 12402 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 12403 .value()); \ 12404 EXPECT_FALSE(Style.STRUCT.FIELD); 12405 12406 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 12407 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 12408 12409 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 12410 EXPECT_NE(VALUE, Style.FIELD); \ 12411 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 12412 EXPECT_EQ(VALUE, Style.FIELD) 12413 12414 TEST_F(FormatTest, ParsesConfigurationBools) { 12415 FormatStyle Style = {}; 12416 Style.Language = FormatStyle::LK_Cpp; 12417 CHECK_PARSE_BOOL(AlignOperands); 12418 CHECK_PARSE_BOOL(AlignTrailingComments); 12419 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 12420 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 12421 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 12422 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 12423 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 12424 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 12425 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 12426 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 12427 CHECK_PARSE_BOOL(BinPackArguments); 12428 CHECK_PARSE_BOOL(BinPackParameters); 12429 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 12430 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 12431 CHECK_PARSE_BOOL(BreakStringLiterals); 12432 CHECK_PARSE_BOOL(CompactNamespaces); 12433 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 12434 CHECK_PARSE_BOOL(DerivePointerAlignment); 12435 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 12436 CHECK_PARSE_BOOL(DisableFormat); 12437 CHECK_PARSE_BOOL(IndentCaseLabels); 12438 CHECK_PARSE_BOOL(IndentGotoLabels); 12439 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 12440 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 12441 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 12442 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 12443 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 12444 CHECK_PARSE_BOOL(ReflowComments); 12445 CHECK_PARSE_BOOL(SortIncludes); 12446 CHECK_PARSE_BOOL(SortUsingDeclarations); 12447 CHECK_PARSE_BOOL(SpacesInParentheses); 12448 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 12449 CHECK_PARSE_BOOL(SpacesInAngles); 12450 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 12451 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 12452 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 12453 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 12454 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 12455 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 12456 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 12457 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 12458 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 12459 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 12460 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 12461 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 12462 12463 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 12464 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 12465 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 12466 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 12467 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 12468 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 12469 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 12470 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 12471 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 12472 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 12473 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 12474 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 12475 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 12476 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 12477 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 12478 } 12479 12480 #undef CHECK_PARSE_BOOL 12481 12482 TEST_F(FormatTest, ParsesConfiguration) { 12483 FormatStyle Style = {}; 12484 Style.Language = FormatStyle::LK_Cpp; 12485 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 12486 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 12487 ConstructorInitializerIndentWidth, 1234u); 12488 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 12489 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 12490 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 12491 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 12492 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 12493 PenaltyBreakBeforeFirstCallParameter, 1234u); 12494 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 12495 PenaltyBreakTemplateDeclaration, 1234u); 12496 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 12497 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 12498 PenaltyReturnTypeOnItsOwnLine, 1234u); 12499 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 12500 SpacesBeforeTrailingComments, 1234u); 12501 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 12502 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 12503 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 12504 12505 Style.PointerAlignment = FormatStyle::PAS_Middle; 12506 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 12507 FormatStyle::PAS_Left); 12508 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 12509 FormatStyle::PAS_Right); 12510 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 12511 FormatStyle::PAS_Middle); 12512 // For backward compatibility: 12513 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 12514 FormatStyle::PAS_Left); 12515 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 12516 FormatStyle::PAS_Right); 12517 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 12518 FormatStyle::PAS_Middle); 12519 12520 Style.Standard = FormatStyle::LS_Auto; 12521 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 12522 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 12523 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 12524 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 12525 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 12526 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 12527 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 12528 // Legacy aliases: 12529 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 12530 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 12531 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 12532 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 12533 12534 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12535 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 12536 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 12537 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 12538 FormatStyle::BOS_None); 12539 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 12540 FormatStyle::BOS_All); 12541 // For backward compatibility: 12542 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 12543 FormatStyle::BOS_None); 12544 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 12545 FormatStyle::BOS_All); 12546 12547 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 12548 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 12549 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12550 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 12551 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 12552 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 12553 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 12554 // For backward compatibility: 12555 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 12556 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12557 12558 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12559 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 12560 FormatStyle::BILS_BeforeComma); 12561 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 12562 FormatStyle::BILS_AfterColon); 12563 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 12564 FormatStyle::BILS_BeforeColon); 12565 // For backward compatibility: 12566 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 12567 FormatStyle::BILS_BeforeComma); 12568 12569 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12570 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 12571 FormatStyle::BAS_Align); 12572 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 12573 FormatStyle::BAS_DontAlign); 12574 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 12575 FormatStyle::BAS_AlwaysBreak); 12576 // For backward compatibility: 12577 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 12578 FormatStyle::BAS_DontAlign); 12579 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 12580 FormatStyle::BAS_Align); 12581 12582 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12583 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 12584 FormatStyle::ENAS_DontAlign); 12585 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 12586 FormatStyle::ENAS_Left); 12587 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 12588 FormatStyle::ENAS_Right); 12589 // For backward compatibility: 12590 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 12591 FormatStyle::ENAS_Left); 12592 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 12593 FormatStyle::ENAS_Right); 12594 12595 Style.UseTab = FormatStyle::UT_ForIndentation; 12596 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 12597 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 12598 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 12599 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 12600 FormatStyle::UT_ForContinuationAndIndentation); 12601 // For backward compatibility: 12602 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 12603 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 12604 12605 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 12606 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 12607 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12608 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 12609 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 12610 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 12611 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12612 // For backward compatibility: 12613 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 12614 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12615 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 12616 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12617 12618 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 12619 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 12620 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12621 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 12622 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 12623 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 12624 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 12625 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 12626 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12627 // For backward compatibility: 12628 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 12629 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12630 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 12631 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12632 12633 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 12634 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 12635 FormatStyle::SBPO_Never); 12636 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 12637 FormatStyle::SBPO_Always); 12638 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 12639 FormatStyle::SBPO_ControlStatements); 12640 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 12641 FormatStyle::SBPO_NonEmptyParentheses); 12642 // For backward compatibility: 12643 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 12644 FormatStyle::SBPO_Never); 12645 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 12646 FormatStyle::SBPO_ControlStatements); 12647 12648 Style.ColumnLimit = 123; 12649 FormatStyle BaseStyle = getLLVMStyle(); 12650 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 12651 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 12652 12653 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12654 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 12655 FormatStyle::BS_Attach); 12656 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 12657 FormatStyle::BS_Linux); 12658 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 12659 FormatStyle::BS_Mozilla); 12660 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 12661 FormatStyle::BS_Stroustrup); 12662 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 12663 FormatStyle::BS_Allman); 12664 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 12665 FormatStyle::BS_Whitesmiths); 12666 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 12667 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 12668 FormatStyle::BS_WebKit); 12669 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 12670 FormatStyle::BS_Custom); 12671 12672 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 12673 CHECK_PARSE("BraceWrapping:\n" 12674 " AfterControlStatement: MultiLine", 12675 BraceWrapping.AfterControlStatement, 12676 FormatStyle::BWACS_MultiLine); 12677 CHECK_PARSE("BraceWrapping:\n" 12678 " AfterControlStatement: Always", 12679 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12680 CHECK_PARSE("BraceWrapping:\n" 12681 " AfterControlStatement: Never", 12682 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12683 // For backward compatibility: 12684 CHECK_PARSE("BraceWrapping:\n" 12685 " AfterControlStatement: true", 12686 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12687 CHECK_PARSE("BraceWrapping:\n" 12688 " AfterControlStatement: false", 12689 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12690 12691 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 12692 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 12693 FormatStyle::RTBS_None); 12694 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 12695 FormatStyle::RTBS_All); 12696 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 12697 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 12698 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 12699 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 12700 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 12701 AlwaysBreakAfterReturnType, 12702 FormatStyle::RTBS_TopLevelDefinitions); 12703 12704 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 12705 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 12706 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 12707 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 12708 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12709 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 12710 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12711 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 12712 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12713 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 12714 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12715 12716 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 12717 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 12718 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 12719 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 12720 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 12721 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 12722 AlwaysBreakAfterDefinitionReturnType, 12723 FormatStyle::DRTBS_TopLevel); 12724 12725 Style.NamespaceIndentation = FormatStyle::NI_All; 12726 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 12727 FormatStyle::NI_None); 12728 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 12729 FormatStyle::NI_Inner); 12730 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 12731 FormatStyle::NI_All); 12732 12733 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 12734 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 12735 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12736 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 12737 AllowShortIfStatementsOnASingleLine, 12738 FormatStyle::SIS_WithoutElse); 12739 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 12740 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 12741 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 12742 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12743 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 12744 AllowShortIfStatementsOnASingleLine, 12745 FormatStyle::SIS_WithoutElse); 12746 12747 // FIXME: This is required because parsing a configuration simply overwrites 12748 // the first N elements of the list instead of resetting it. 12749 Style.ForEachMacros.clear(); 12750 std::vector<std::string> BoostForeach; 12751 BoostForeach.push_back("BOOST_FOREACH"); 12752 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 12753 std::vector<std::string> BoostAndQForeach; 12754 BoostAndQForeach.push_back("BOOST_FOREACH"); 12755 BoostAndQForeach.push_back("Q_FOREACH"); 12756 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 12757 BoostAndQForeach); 12758 12759 Style.StatementMacros.clear(); 12760 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 12761 std::vector<std::string>{"QUNUSED"}); 12762 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 12763 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 12764 12765 Style.NamespaceMacros.clear(); 12766 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 12767 std::vector<std::string>{"TESTSUITE"}); 12768 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 12769 std::vector<std::string>({"TESTSUITE", "SUITE"})); 12770 12771 Style.IncludeStyle.IncludeCategories.clear(); 12772 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 12773 {"abc/.*", 2, 0}, {".*", 1, 0}}; 12774 CHECK_PARSE("IncludeCategories:\n" 12775 " - Regex: abc/.*\n" 12776 " Priority: 2\n" 12777 " - Regex: .*\n" 12778 " Priority: 1", 12779 IncludeStyle.IncludeCategories, ExpectedCategories); 12780 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 12781 "abc$"); 12782 12783 Style.RawStringFormats.clear(); 12784 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 12785 { 12786 FormatStyle::LK_TextProto, 12787 {"pb", "proto"}, 12788 {"PARSE_TEXT_PROTO"}, 12789 /*CanonicalDelimiter=*/"", 12790 "llvm", 12791 }, 12792 { 12793 FormatStyle::LK_Cpp, 12794 {"cc", "cpp"}, 12795 {"C_CODEBLOCK", "CPPEVAL"}, 12796 /*CanonicalDelimiter=*/"cc", 12797 /*BasedOnStyle=*/"", 12798 }, 12799 }; 12800 12801 CHECK_PARSE("RawStringFormats:\n" 12802 " - Language: TextProto\n" 12803 " Delimiters:\n" 12804 " - 'pb'\n" 12805 " - 'proto'\n" 12806 " EnclosingFunctions:\n" 12807 " - 'PARSE_TEXT_PROTO'\n" 12808 " BasedOnStyle: llvm\n" 12809 " - Language: Cpp\n" 12810 " Delimiters:\n" 12811 " - 'cc'\n" 12812 " - 'cpp'\n" 12813 " EnclosingFunctions:\n" 12814 " - 'C_CODEBLOCK'\n" 12815 " - 'CPPEVAL'\n" 12816 " CanonicalDelimiter: 'cc'", 12817 RawStringFormats, ExpectedRawStringFormats); 12818 } 12819 12820 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 12821 FormatStyle Style = {}; 12822 Style.Language = FormatStyle::LK_Cpp; 12823 CHECK_PARSE("Language: Cpp\n" 12824 "IndentWidth: 12", 12825 IndentWidth, 12u); 12826 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 12827 "IndentWidth: 34", 12828 &Style), 12829 ParseError::Unsuitable); 12830 EXPECT_EQ(12u, Style.IndentWidth); 12831 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12832 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12833 12834 Style.Language = FormatStyle::LK_JavaScript; 12835 CHECK_PARSE("Language: JavaScript\n" 12836 "IndentWidth: 12", 12837 IndentWidth, 12u); 12838 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 12839 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 12840 "IndentWidth: 34", 12841 &Style), 12842 ParseError::Unsuitable); 12843 EXPECT_EQ(23u, Style.IndentWidth); 12844 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12845 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12846 12847 CHECK_PARSE("BasedOnStyle: LLVM\n" 12848 "IndentWidth: 67", 12849 IndentWidth, 67u); 12850 12851 CHECK_PARSE("---\n" 12852 "Language: JavaScript\n" 12853 "IndentWidth: 12\n" 12854 "---\n" 12855 "Language: Cpp\n" 12856 "IndentWidth: 34\n" 12857 "...\n", 12858 IndentWidth, 12u); 12859 12860 Style.Language = FormatStyle::LK_Cpp; 12861 CHECK_PARSE("---\n" 12862 "Language: JavaScript\n" 12863 "IndentWidth: 12\n" 12864 "---\n" 12865 "Language: Cpp\n" 12866 "IndentWidth: 34\n" 12867 "...\n", 12868 IndentWidth, 34u); 12869 CHECK_PARSE("---\n" 12870 "IndentWidth: 78\n" 12871 "---\n" 12872 "Language: JavaScript\n" 12873 "IndentWidth: 56\n" 12874 "...\n", 12875 IndentWidth, 78u); 12876 12877 Style.ColumnLimit = 123; 12878 Style.IndentWidth = 234; 12879 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 12880 Style.TabWidth = 345; 12881 EXPECT_FALSE(parseConfiguration("---\n" 12882 "IndentWidth: 456\n" 12883 "BreakBeforeBraces: Allman\n" 12884 "---\n" 12885 "Language: JavaScript\n" 12886 "IndentWidth: 111\n" 12887 "TabWidth: 111\n" 12888 "---\n" 12889 "Language: Cpp\n" 12890 "BreakBeforeBraces: Stroustrup\n" 12891 "TabWidth: 789\n" 12892 "...\n", 12893 &Style)); 12894 EXPECT_EQ(123u, Style.ColumnLimit); 12895 EXPECT_EQ(456u, Style.IndentWidth); 12896 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 12897 EXPECT_EQ(789u, Style.TabWidth); 12898 12899 EXPECT_EQ(parseConfiguration("---\n" 12900 "Language: JavaScript\n" 12901 "IndentWidth: 56\n" 12902 "---\n" 12903 "IndentWidth: 78\n" 12904 "...\n", 12905 &Style), 12906 ParseError::Error); 12907 EXPECT_EQ(parseConfiguration("---\n" 12908 "Language: JavaScript\n" 12909 "IndentWidth: 56\n" 12910 "---\n" 12911 "Language: JavaScript\n" 12912 "IndentWidth: 78\n" 12913 "...\n", 12914 &Style), 12915 ParseError::Error); 12916 12917 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12918 } 12919 12920 #undef CHECK_PARSE 12921 12922 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 12923 FormatStyle Style = {}; 12924 Style.Language = FormatStyle::LK_JavaScript; 12925 Style.BreakBeforeTernaryOperators = true; 12926 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 12927 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12928 12929 Style.BreakBeforeTernaryOperators = true; 12930 EXPECT_EQ(0, parseConfiguration("---\n" 12931 "BasedOnStyle: Google\n" 12932 "---\n" 12933 "Language: JavaScript\n" 12934 "IndentWidth: 76\n" 12935 "...\n", 12936 &Style) 12937 .value()); 12938 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12939 EXPECT_EQ(76u, Style.IndentWidth); 12940 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12941 } 12942 12943 TEST_F(FormatTest, ConfigurationRoundTripTest) { 12944 FormatStyle Style = getLLVMStyle(); 12945 std::string YAML = configurationAsText(Style); 12946 FormatStyle ParsedStyle = {}; 12947 ParsedStyle.Language = FormatStyle::LK_Cpp; 12948 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 12949 EXPECT_EQ(Style, ParsedStyle); 12950 } 12951 12952 TEST_F(FormatTest, WorksFor8bitEncodings) { 12953 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 12954 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 12955 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 12956 "\"\xef\xee\xf0\xf3...\"", 12957 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 12958 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 12959 "\xef\xee\xf0\xf3...\"", 12960 getLLVMStyleWithColumns(12))); 12961 } 12962 12963 TEST_F(FormatTest, HandlesUTF8BOM) { 12964 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 12965 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 12966 format("\xef\xbb\xbf#include <iostream>")); 12967 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 12968 format("\xef\xbb\xbf\n#include <iostream>")); 12969 } 12970 12971 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 12972 #if !defined(_MSC_VER) 12973 12974 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 12975 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 12976 getLLVMStyleWithColumns(35)); 12977 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 12978 getLLVMStyleWithColumns(31)); 12979 verifyFormat("// Однажды в студёную зимнюю пору...", 12980 getLLVMStyleWithColumns(36)); 12981 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 12982 verifyFormat("/* Однажды в студёную зимнюю пору... */", 12983 getLLVMStyleWithColumns(39)); 12984 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 12985 getLLVMStyleWithColumns(35)); 12986 } 12987 12988 TEST_F(FormatTest, SplitsUTF8Strings) { 12989 // Non-printable characters' width is currently considered to be the length in 12990 // bytes in UTF8. The characters can be displayed in very different manner 12991 // (zero-width, single width with a substitution glyph, expanded to their code 12992 // (e.g. "<8d>"), so there's no single correct way to handle them. 12993 EXPECT_EQ("\"aaaaÄ\"\n" 12994 "\"\xc2\x8d\";", 12995 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12996 EXPECT_EQ("\"aaaaaaaÄ\"\n" 12997 "\"\xc2\x8d\";", 12998 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12999 EXPECT_EQ("\"Однажды, в \"\n" 13000 "\"студёную \"\n" 13001 "\"зимнюю \"\n" 13002 "\"пору,\"", 13003 format("\"Однажды, в студёную зимнюю пору,\"", 13004 getLLVMStyleWithColumns(13))); 13005 EXPECT_EQ( 13006 "\"一 二 三 \"\n" 13007 "\"四 五六 \"\n" 13008 "\"七 八 九 \"\n" 13009 "\"十\"", 13010 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 13011 EXPECT_EQ("\"一\t\"\n" 13012 "\"二 \t\"\n" 13013 "\"三 四 \"\n" 13014 "\"五\t\"\n" 13015 "\"六 \t\"\n" 13016 "\"七 \"\n" 13017 "\"八九十\tqq\"", 13018 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 13019 getLLVMStyleWithColumns(11))); 13020 13021 // UTF8 character in an escape sequence. 13022 EXPECT_EQ("\"aaaaaa\"\n" 13023 "\"\\\xC2\x8D\"", 13024 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 13025 } 13026 13027 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 13028 EXPECT_EQ("const char *sssss =\n" 13029 " \"一二三四五六七八\\\n" 13030 " 九 十\";", 13031 format("const char *sssss = \"一二三四五六七八\\\n" 13032 " 九 十\";", 13033 getLLVMStyleWithColumns(30))); 13034 } 13035 13036 TEST_F(FormatTest, SplitsUTF8LineComments) { 13037 EXPECT_EQ("// aaaaÄ\xc2\x8d", 13038 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 13039 EXPECT_EQ("// Я из лесу\n" 13040 "// вышел; был\n" 13041 "// сильный\n" 13042 "// мороз.", 13043 format("// Я из лесу вышел; был сильный мороз.", 13044 getLLVMStyleWithColumns(13))); 13045 EXPECT_EQ("// 一二三\n" 13046 "// 四五六七\n" 13047 "// 八 九\n" 13048 "// 十", 13049 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 13050 } 13051 13052 TEST_F(FormatTest, SplitsUTF8BlockComments) { 13053 EXPECT_EQ("/* Гляжу,\n" 13054 " * поднимается\n" 13055 " * медленно в\n" 13056 " * гору\n" 13057 " * Лошадка,\n" 13058 " * везущая\n" 13059 " * хворосту\n" 13060 " * воз. */", 13061 format("/* Гляжу, поднимается медленно в гору\n" 13062 " * Лошадка, везущая хворосту воз. */", 13063 getLLVMStyleWithColumns(13))); 13064 EXPECT_EQ( 13065 "/* 一二三\n" 13066 " * 四五六七\n" 13067 " * 八 九\n" 13068 " * 十 */", 13069 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 13070 EXPECT_EQ("/* \n" 13071 " * \n" 13072 " * - */", 13073 format("/* - */", getLLVMStyleWithColumns(12))); 13074 } 13075 13076 #endif // _MSC_VER 13077 13078 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 13079 FormatStyle Style = getLLVMStyle(); 13080 13081 Style.ConstructorInitializerIndentWidth = 4; 13082 verifyFormat( 13083 "SomeClass::Constructor()\n" 13084 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13085 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13086 Style); 13087 13088 Style.ConstructorInitializerIndentWidth = 2; 13089 verifyFormat( 13090 "SomeClass::Constructor()\n" 13091 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13092 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13093 Style); 13094 13095 Style.ConstructorInitializerIndentWidth = 0; 13096 verifyFormat( 13097 "SomeClass::Constructor()\n" 13098 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13099 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13100 Style); 13101 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13102 verifyFormat( 13103 "SomeLongTemplateVariableName<\n" 13104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 13105 Style); 13106 verifyFormat("bool smaller = 1 < " 13107 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 13108 " " 13109 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 13110 Style); 13111 13112 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 13113 verifyFormat("SomeClass::Constructor() :\n" 13114 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 13115 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 13116 Style); 13117 } 13118 13119 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 13120 FormatStyle Style = getLLVMStyle(); 13121 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 13122 Style.ConstructorInitializerIndentWidth = 4; 13123 verifyFormat("SomeClass::Constructor()\n" 13124 " : a(a)\n" 13125 " , b(b)\n" 13126 " , c(c) {}", 13127 Style); 13128 verifyFormat("SomeClass::Constructor()\n" 13129 " : a(a) {}", 13130 Style); 13131 13132 Style.ColumnLimit = 0; 13133 verifyFormat("SomeClass::Constructor()\n" 13134 " : a(a) {}", 13135 Style); 13136 verifyFormat("SomeClass::Constructor() noexcept\n" 13137 " : a(a) {}", 13138 Style); 13139 verifyFormat("SomeClass::Constructor()\n" 13140 " : a(a)\n" 13141 " , b(b)\n" 13142 " , c(c) {}", 13143 Style); 13144 verifyFormat("SomeClass::Constructor()\n" 13145 " : a(a) {\n" 13146 " foo();\n" 13147 " bar();\n" 13148 "}", 13149 Style); 13150 13151 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 13152 verifyFormat("SomeClass::Constructor()\n" 13153 " : a(a)\n" 13154 " , b(b)\n" 13155 " , c(c) {\n}", 13156 Style); 13157 verifyFormat("SomeClass::Constructor()\n" 13158 " : a(a) {\n}", 13159 Style); 13160 13161 Style.ColumnLimit = 80; 13162 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 13163 Style.ConstructorInitializerIndentWidth = 2; 13164 verifyFormat("SomeClass::Constructor()\n" 13165 " : a(a)\n" 13166 " , b(b)\n" 13167 " , c(c) {}", 13168 Style); 13169 13170 Style.ConstructorInitializerIndentWidth = 0; 13171 verifyFormat("SomeClass::Constructor()\n" 13172 ": a(a)\n" 13173 ", b(b)\n" 13174 ", c(c) {}", 13175 Style); 13176 13177 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 13178 Style.ConstructorInitializerIndentWidth = 4; 13179 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 13180 verifyFormat( 13181 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 13182 Style); 13183 verifyFormat( 13184 "SomeClass::Constructor()\n" 13185 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 13186 Style); 13187 Style.ConstructorInitializerIndentWidth = 4; 13188 Style.ColumnLimit = 60; 13189 verifyFormat("SomeClass::Constructor()\n" 13190 " : aaaaaaaa(aaaaaaaa)\n" 13191 " , aaaaaaaa(aaaaaaaa)\n" 13192 " , aaaaaaaa(aaaaaaaa) {}", 13193 Style); 13194 } 13195 13196 TEST_F(FormatTest, Destructors) { 13197 verifyFormat("void F(int &i) { i.~int(); }"); 13198 verifyFormat("void F(int &i) { i->~int(); }"); 13199 } 13200 13201 TEST_F(FormatTest, FormatsWithWebKitStyle) { 13202 FormatStyle Style = getWebKitStyle(); 13203 13204 // Don't indent in outer namespaces. 13205 verifyFormat("namespace outer {\n" 13206 "int i;\n" 13207 "namespace inner {\n" 13208 " int i;\n" 13209 "} // namespace inner\n" 13210 "} // namespace outer\n" 13211 "namespace other_outer {\n" 13212 "int i;\n" 13213 "}", 13214 Style); 13215 13216 // Don't indent case labels. 13217 verifyFormat("switch (variable) {\n" 13218 "case 1:\n" 13219 "case 2:\n" 13220 " doSomething();\n" 13221 " break;\n" 13222 "default:\n" 13223 " ++variable;\n" 13224 "}", 13225 Style); 13226 13227 // Wrap before binary operators. 13228 EXPECT_EQ("void f()\n" 13229 "{\n" 13230 " if (aaaaaaaaaaaaaaaa\n" 13231 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 13232 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13233 " return;\n" 13234 "}", 13235 format("void f() {\n" 13236 "if (aaaaaaaaaaaaaaaa\n" 13237 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 13238 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13239 "return;\n" 13240 "}", 13241 Style)); 13242 13243 // Allow functions on a single line. 13244 verifyFormat("void f() { return; }", Style); 13245 13246 // Allow empty blocks on a single line and insert a space in empty blocks. 13247 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 13248 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 13249 // However, don't merge non-empty short loops. 13250 EXPECT_EQ("while (true) {\n" 13251 " continue;\n" 13252 "}", 13253 format("while (true) { continue; }", Style)); 13254 13255 // Constructor initializers are formatted one per line with the "," on the 13256 // new line. 13257 verifyFormat("Constructor()\n" 13258 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 13259 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 13260 " aaaaaaaaaaaaaa)\n" 13261 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 13262 "{\n" 13263 "}", 13264 Style); 13265 verifyFormat("SomeClass::Constructor()\n" 13266 " : a(a)\n" 13267 "{\n" 13268 "}", 13269 Style); 13270 EXPECT_EQ("SomeClass::Constructor()\n" 13271 " : a(a)\n" 13272 "{\n" 13273 "}", 13274 format("SomeClass::Constructor():a(a){}", Style)); 13275 verifyFormat("SomeClass::Constructor()\n" 13276 " : a(a)\n" 13277 " , b(b)\n" 13278 " , c(c)\n" 13279 "{\n" 13280 "}", 13281 Style); 13282 verifyFormat("SomeClass::Constructor()\n" 13283 " : a(a)\n" 13284 "{\n" 13285 " foo();\n" 13286 " bar();\n" 13287 "}", 13288 Style); 13289 13290 // Access specifiers should be aligned left. 13291 verifyFormat("class C {\n" 13292 "public:\n" 13293 " int i;\n" 13294 "};", 13295 Style); 13296 13297 // Do not align comments. 13298 verifyFormat("int a; // Do not\n" 13299 "double b; // align comments.", 13300 Style); 13301 13302 // Do not align operands. 13303 EXPECT_EQ("ASSERT(aaaa\n" 13304 " || bbbb);", 13305 format("ASSERT ( aaaa\n||bbbb);", Style)); 13306 13307 // Accept input's line breaks. 13308 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 13309 " || bbbbbbbbbbbbbbb) {\n" 13310 " i++;\n" 13311 "}", 13312 format("if (aaaaaaaaaaaaaaa\n" 13313 "|| bbbbbbbbbbbbbbb) { i++; }", 13314 Style)); 13315 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 13316 " i++;\n" 13317 "}", 13318 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 13319 13320 // Don't automatically break all macro definitions (llvm.org/PR17842). 13321 verifyFormat("#define aNumber 10", Style); 13322 // However, generally keep the line breaks that the user authored. 13323 EXPECT_EQ("#define aNumber \\\n" 13324 " 10", 13325 format("#define aNumber \\\n" 13326 " 10", 13327 Style)); 13328 13329 // Keep empty and one-element array literals on a single line. 13330 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 13331 " copyItems:YES];", 13332 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 13333 "copyItems:YES];", 13334 Style)); 13335 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 13336 " copyItems:YES];", 13337 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 13338 " copyItems:YES];", 13339 Style)); 13340 // FIXME: This does not seem right, there should be more indentation before 13341 // the array literal's entries. Nested blocks have the same problem. 13342 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13343 " @\"a\",\n" 13344 " @\"a\"\n" 13345 "]\n" 13346 " copyItems:YES];", 13347 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13348 " @\"a\",\n" 13349 " @\"a\"\n" 13350 " ]\n" 13351 " copyItems:YES];", 13352 Style)); 13353 EXPECT_EQ( 13354 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13355 " copyItems:YES];", 13356 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13357 " copyItems:YES];", 13358 Style)); 13359 13360 verifyFormat("[self.a b:c c:d];", Style); 13361 EXPECT_EQ("[self.a b:c\n" 13362 " c:d];", 13363 format("[self.a b:c\n" 13364 "c:d];", 13365 Style)); 13366 } 13367 13368 TEST_F(FormatTest, FormatsLambdas) { 13369 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 13370 verifyFormat( 13371 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 13372 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 13373 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 13374 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 13375 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 13376 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 13377 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 13378 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 13379 verifyFormat("int x = f(*+[] {});"); 13380 verifyFormat("void f() {\n" 13381 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 13382 "}\n"); 13383 verifyFormat("void f() {\n" 13384 " other(x.begin(), //\n" 13385 " x.end(), //\n" 13386 " [&](int, int) { return 1; });\n" 13387 "}\n"); 13388 verifyFormat("void f() {\n" 13389 " other.other.other.other.other(\n" 13390 " x.begin(), x.end(),\n" 13391 " [something, rather](int, int, int, int, int, int, int) { " 13392 "return 1; });\n" 13393 "}\n"); 13394 verifyFormat( 13395 "void f() {\n" 13396 " other.other.other.other.other(\n" 13397 " x.begin(), x.end(),\n" 13398 " [something, rather](int, int, int, int, int, int, int) {\n" 13399 " //\n" 13400 " });\n" 13401 "}\n"); 13402 verifyFormat("SomeFunction([]() { // A cool function...\n" 13403 " return 43;\n" 13404 "});"); 13405 EXPECT_EQ("SomeFunction([]() {\n" 13406 "#define A a\n" 13407 " return 43;\n" 13408 "});", 13409 format("SomeFunction([](){\n" 13410 "#define A a\n" 13411 "return 43;\n" 13412 "});")); 13413 verifyFormat("void f() {\n" 13414 " SomeFunction([](decltype(x), A *a) {});\n" 13415 "}"); 13416 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13417 " [](const aaaaaaaaaa &a) { return a; });"); 13418 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 13419 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 13420 "});"); 13421 verifyFormat("Constructor()\n" 13422 " : Field([] { // comment\n" 13423 " int i;\n" 13424 " }) {}"); 13425 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 13426 " return some_parameter.size();\n" 13427 "};"); 13428 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 13429 " [](const string &s) { return s; };"); 13430 verifyFormat("int i = aaaaaa ? 1 //\n" 13431 " : [] {\n" 13432 " return 2; //\n" 13433 " }();"); 13434 verifyFormat("llvm::errs() << \"number of twos is \"\n" 13435 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 13436 " return x == 2; // force break\n" 13437 " });"); 13438 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13439 " [=](int iiiiiiiiiiii) {\n" 13440 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 13441 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 13442 " });", 13443 getLLVMStyleWithColumns(60)); 13444 verifyFormat("SomeFunction({[&] {\n" 13445 " // comment\n" 13446 " },\n" 13447 " [&] {\n" 13448 " // comment\n" 13449 " }});"); 13450 verifyFormat("SomeFunction({[&] {\n" 13451 " // comment\n" 13452 "}});"); 13453 verifyFormat( 13454 "virtual aaaaaaaaaaaaaaaa(\n" 13455 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 13456 " aaaaa aaaaaaaaa);"); 13457 13458 // Lambdas with return types. 13459 verifyFormat("int c = []() -> int { return 2; }();\n"); 13460 verifyFormat("int c = []() -> int * { return 2; }();\n"); 13461 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 13462 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 13463 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 13464 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 13465 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 13466 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 13467 verifyFormat("[a, a]() -> a<1> {};"); 13468 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 13469 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 13470 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 13471 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 13472 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 13473 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 13474 verifyFormat("[]() -> foo<!5> { return {}; };"); 13475 verifyFormat("[]() -> foo<~5> { return {}; };"); 13476 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 13477 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 13478 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 13479 verifyFormat("[]() -> foo<5 && 2> { 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<2 ? 1 : 0> { return {}; };"); 13486 verifyFormat("namespace bar {\n" 13487 "// broken:\n" 13488 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 13489 "} // namespace bar"); 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> { 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 | 2> { 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<2 ? 1 : 0> { return {}; }};\n" 13557 "} // namespace bar"); 13558 verifyFormat("[]() -> a<1> {};"); 13559 verifyFormat("[]() -> a<1> { ; };"); 13560 verifyFormat("[]() -> a<1> { ; }();"); 13561 verifyFormat("[a, a]() -> a<true> {};"); 13562 verifyFormat("[]() -> a<true> {};"); 13563 verifyFormat("[]() -> a<true> { ; };"); 13564 verifyFormat("[]() -> a<true> { ; }();"); 13565 verifyFormat("[a, a]() -> a<false> {};"); 13566 verifyFormat("[]() -> a<false> {};"); 13567 verifyFormat("[]() -> a<false> { ; };"); 13568 verifyFormat("[]() -> a<false> { ; }();"); 13569 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 13570 verifyFormat("namespace bar {\n" 13571 "auto foo{[]() -> foo<false> { ; }};\n" 13572 "} // namespace bar"); 13573 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 13574 " int j) -> int {\n" 13575 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 13576 "};"); 13577 verifyFormat( 13578 "aaaaaaaaaaaaaaaaaaaaaa(\n" 13579 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 13580 " return aaaaaaaaaaaaaaaaa;\n" 13581 " });", 13582 getLLVMStyleWithColumns(70)); 13583 verifyFormat("[]() //\n" 13584 " -> int {\n" 13585 " return 1; //\n" 13586 "};"); 13587 13588 // Lambdas with explicit template argument lists. 13589 verifyFormat( 13590 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 13591 13592 // Multiple lambdas in the same parentheses change indentation rules. These 13593 // lambdas are forced to start on new lines. 13594 verifyFormat("SomeFunction(\n" 13595 " []() {\n" 13596 " //\n" 13597 " },\n" 13598 " []() {\n" 13599 " //\n" 13600 " });"); 13601 13602 // A lambda passed as arg0 is always pushed to the next line. 13603 verifyFormat("SomeFunction(\n" 13604 " [this] {\n" 13605 " //\n" 13606 " },\n" 13607 " 1);\n"); 13608 13609 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 13610 // the arg0 case above. 13611 auto Style = getGoogleStyle(); 13612 Style.BinPackArguments = false; 13613 verifyFormat("SomeFunction(\n" 13614 " a,\n" 13615 " [this] {\n" 13616 " //\n" 13617 " },\n" 13618 " b);\n", 13619 Style); 13620 verifyFormat("SomeFunction(\n" 13621 " a,\n" 13622 " [this] {\n" 13623 " //\n" 13624 " },\n" 13625 " b);\n"); 13626 13627 // A lambda with a very long line forces arg0 to be pushed out irrespective of 13628 // the BinPackArguments value (as long as the code is wide enough). 13629 verifyFormat( 13630 "something->SomeFunction(\n" 13631 " a,\n" 13632 " [this] {\n" 13633 " " 13634 "D0000000000000000000000000000000000000000000000000000000000001();\n" 13635 " },\n" 13636 " b);\n"); 13637 13638 // A multi-line lambda is pulled up as long as the introducer fits on the 13639 // previous line and there are no further args. 13640 verifyFormat("function(1, [this, that] {\n" 13641 " //\n" 13642 "});\n"); 13643 verifyFormat("function([this, that] {\n" 13644 " //\n" 13645 "});\n"); 13646 // FIXME: this format is not ideal and we should consider forcing the first 13647 // arg onto its own line. 13648 verifyFormat("function(a, b, c, //\n" 13649 " d, [this, that] {\n" 13650 " //\n" 13651 " });\n"); 13652 13653 // Multiple lambdas are treated correctly even when there is a short arg0. 13654 verifyFormat("SomeFunction(\n" 13655 " 1,\n" 13656 " [this] {\n" 13657 " //\n" 13658 " },\n" 13659 " [this] {\n" 13660 " //\n" 13661 " },\n" 13662 " 1);\n"); 13663 13664 // More complex introducers. 13665 verifyFormat("return [i, args...] {};"); 13666 13667 // Not lambdas. 13668 verifyFormat("constexpr char hello[]{\"hello\"};"); 13669 verifyFormat("double &operator[](int i) { return 0; }\n" 13670 "int i;"); 13671 verifyFormat("std::unique_ptr<int[]> foo() {}"); 13672 verifyFormat("int i = a[a][a]->f();"); 13673 verifyFormat("int i = (*b)[a]->f();"); 13674 13675 // Other corner cases. 13676 verifyFormat("void f() {\n" 13677 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 13678 " );\n" 13679 "}"); 13680 13681 // Lambdas created through weird macros. 13682 verifyFormat("void f() {\n" 13683 " MACRO((const AA &a) { return 1; });\n" 13684 " MACRO((AA &a) { return 1; });\n" 13685 "}"); 13686 13687 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 13688 " doo_dah();\n" 13689 " doo_dah();\n" 13690 " })) {\n" 13691 "}"); 13692 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 13693 " doo_dah();\n" 13694 " doo_dah();\n" 13695 " })) {\n" 13696 "}"); 13697 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 13698 " doo_dah();\n" 13699 " doo_dah();\n" 13700 " })) {\n" 13701 "}"); 13702 verifyFormat("auto lambda = []() {\n" 13703 " int a = 2\n" 13704 "#if A\n" 13705 " + 2\n" 13706 "#endif\n" 13707 " ;\n" 13708 "};"); 13709 13710 // Lambdas with complex multiline introducers. 13711 verifyFormat( 13712 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13713 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 13714 " -> ::std::unordered_set<\n" 13715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 13716 " //\n" 13717 " });"); 13718 13719 FormatStyle DoNotMerge = getLLVMStyle(); 13720 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13721 verifyFormat("auto c = []() {\n" 13722 " return b;\n" 13723 "};", 13724 "auto c = []() { return b; };", DoNotMerge); 13725 verifyFormat("auto c = []() {\n" 13726 "};", 13727 " auto c = []() {};", DoNotMerge); 13728 13729 FormatStyle MergeEmptyOnly = getLLVMStyle(); 13730 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 13731 verifyFormat("auto c = []() {\n" 13732 " return b;\n" 13733 "};", 13734 "auto c = []() {\n" 13735 " return b;\n" 13736 " };", 13737 MergeEmptyOnly); 13738 verifyFormat("auto c = []() {};", 13739 "auto c = []() {\n" 13740 "};", 13741 MergeEmptyOnly); 13742 13743 FormatStyle MergeInline = getLLVMStyle(); 13744 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 13745 verifyFormat("auto c = []() {\n" 13746 " return b;\n" 13747 "};", 13748 "auto c = []() { return b; };", MergeInline); 13749 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 13750 MergeInline); 13751 verifyFormat("function([]() { return b; }, a)", 13752 "function([]() { return b; }, a)", MergeInline); 13753 verifyFormat("function(a, []() { return b; })", 13754 "function(a, []() { return b; })", MergeInline); 13755 } 13756 13757 TEST_F(FormatTest, EmptyLinesInLambdas) { 13758 verifyFormat("auto lambda = []() {\n" 13759 " x(); //\n" 13760 "};", 13761 "auto lambda = []() {\n" 13762 "\n" 13763 " x(); //\n" 13764 "\n" 13765 "};"); 13766 } 13767 13768 TEST_F(FormatTest, FormatsBlocks) { 13769 FormatStyle ShortBlocks = getLLVMStyle(); 13770 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13771 verifyFormat("int (^Block)(int, int);", ShortBlocks); 13772 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 13773 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 13774 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 13775 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 13776 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 13777 13778 verifyFormat("foo(^{ bar(); });", ShortBlocks); 13779 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 13780 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 13781 13782 verifyFormat("[operation setCompletionBlock:^{\n" 13783 " [self onOperationDone];\n" 13784 "}];"); 13785 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 13786 " [self onOperationDone];\n" 13787 "}]};"); 13788 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 13789 " f();\n" 13790 "}];"); 13791 verifyFormat("int a = [operation block:^int(int *i) {\n" 13792 " return 1;\n" 13793 "}];"); 13794 verifyFormat("[myObject doSomethingWith:arg1\n" 13795 " aaa:^int(int *a) {\n" 13796 " return 1;\n" 13797 " }\n" 13798 " bbb:f(a * bbbbbbbb)];"); 13799 13800 verifyFormat("[operation setCompletionBlock:^{\n" 13801 " [self.delegate newDataAvailable];\n" 13802 "}];", 13803 getLLVMStyleWithColumns(60)); 13804 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 13805 " NSString *path = [self sessionFilePath];\n" 13806 " if (path) {\n" 13807 " // ...\n" 13808 " }\n" 13809 "});"); 13810 verifyFormat("[[SessionService sharedService]\n" 13811 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13812 " if (window) {\n" 13813 " [self windowDidLoad:window];\n" 13814 " } else {\n" 13815 " [self errorLoadingWindow];\n" 13816 " }\n" 13817 " }];"); 13818 verifyFormat("void (^largeBlock)(void) = ^{\n" 13819 " // ...\n" 13820 "};\n", 13821 getLLVMStyleWithColumns(40)); 13822 verifyFormat("[[SessionService sharedService]\n" 13823 " loadWindowWithCompletionBlock: //\n" 13824 " ^(SessionWindow *window) {\n" 13825 " if (window) {\n" 13826 " [self windowDidLoad:window];\n" 13827 " } else {\n" 13828 " [self errorLoadingWindow];\n" 13829 " }\n" 13830 " }];", 13831 getLLVMStyleWithColumns(60)); 13832 verifyFormat("[myObject doSomethingWith:arg1\n" 13833 " firstBlock:^(Foo *a) {\n" 13834 " // ...\n" 13835 " int i;\n" 13836 " }\n" 13837 " secondBlock:^(Bar *b) {\n" 13838 " // ...\n" 13839 " int i;\n" 13840 " }\n" 13841 " thirdBlock:^Foo(Bar *b) {\n" 13842 " // ...\n" 13843 " int i;\n" 13844 " }];"); 13845 verifyFormat("[myObject doSomethingWith:arg1\n" 13846 " firstBlock:-1\n" 13847 " secondBlock:^(Bar *b) {\n" 13848 " // ...\n" 13849 " int i;\n" 13850 " }];"); 13851 13852 verifyFormat("f(^{\n" 13853 " @autoreleasepool {\n" 13854 " if (a) {\n" 13855 " g();\n" 13856 " }\n" 13857 " }\n" 13858 "});"); 13859 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 13860 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 13861 "};"); 13862 13863 FormatStyle FourIndent = getLLVMStyle(); 13864 FourIndent.ObjCBlockIndentWidth = 4; 13865 verifyFormat("[operation setCompletionBlock:^{\n" 13866 " [self onOperationDone];\n" 13867 "}];", 13868 FourIndent); 13869 } 13870 13871 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 13872 FormatStyle ZeroColumn = getLLVMStyle(); 13873 ZeroColumn.ColumnLimit = 0; 13874 13875 verifyFormat("[[SessionService sharedService] " 13876 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13877 " if (window) {\n" 13878 " [self windowDidLoad:window];\n" 13879 " } else {\n" 13880 " [self errorLoadingWindow];\n" 13881 " }\n" 13882 "}];", 13883 ZeroColumn); 13884 EXPECT_EQ("[[SessionService sharedService]\n" 13885 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13886 " if (window) {\n" 13887 " [self windowDidLoad:window];\n" 13888 " } else {\n" 13889 " [self errorLoadingWindow];\n" 13890 " }\n" 13891 " }];", 13892 format("[[SessionService sharedService]\n" 13893 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13894 " if (window) {\n" 13895 " [self windowDidLoad:window];\n" 13896 " } else {\n" 13897 " [self errorLoadingWindow];\n" 13898 " }\n" 13899 "}];", 13900 ZeroColumn)); 13901 verifyFormat("[myObject doSomethingWith:arg1\n" 13902 " firstBlock:^(Foo *a) {\n" 13903 " // ...\n" 13904 " int i;\n" 13905 " }\n" 13906 " secondBlock:^(Bar *b) {\n" 13907 " // ...\n" 13908 " int i;\n" 13909 " }\n" 13910 " thirdBlock:^Foo(Bar *b) {\n" 13911 " // ...\n" 13912 " int i;\n" 13913 " }];", 13914 ZeroColumn); 13915 verifyFormat("f(^{\n" 13916 " @autoreleasepool {\n" 13917 " if (a) {\n" 13918 " g();\n" 13919 " }\n" 13920 " }\n" 13921 "});", 13922 ZeroColumn); 13923 verifyFormat("void (^largeBlock)(void) = ^{\n" 13924 " // ...\n" 13925 "};", 13926 ZeroColumn); 13927 13928 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13929 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 13930 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13931 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 13932 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 13933 " int i;\n" 13934 "};", 13935 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13936 } 13937 13938 TEST_F(FormatTest, SupportsCRLF) { 13939 EXPECT_EQ("int a;\r\n" 13940 "int b;\r\n" 13941 "int c;\r\n", 13942 format("int a;\r\n" 13943 " int b;\r\n" 13944 " int c;\r\n", 13945 getLLVMStyle())); 13946 EXPECT_EQ("int a;\r\n" 13947 "int b;\r\n" 13948 "int c;\r\n", 13949 format("int a;\r\n" 13950 " int b;\n" 13951 " int c;\r\n", 13952 getLLVMStyle())); 13953 EXPECT_EQ("int a;\n" 13954 "int b;\n" 13955 "int c;\n", 13956 format("int a;\r\n" 13957 " int b;\n" 13958 " int c;\n", 13959 getLLVMStyle())); 13960 EXPECT_EQ("\"aaaaaaa \"\r\n" 13961 "\"bbbbbbb\";\r\n", 13962 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 13963 EXPECT_EQ("#define A \\\r\n" 13964 " b; \\\r\n" 13965 " c; \\\r\n" 13966 " d;\r\n", 13967 format("#define A \\\r\n" 13968 " b; \\\r\n" 13969 " c; d; \r\n", 13970 getGoogleStyle())); 13971 13972 EXPECT_EQ("/*\r\n" 13973 "multi line block comments\r\n" 13974 "should not introduce\r\n" 13975 "an extra carriage return\r\n" 13976 "*/\r\n", 13977 format("/*\r\n" 13978 "multi line block comments\r\n" 13979 "should not introduce\r\n" 13980 "an extra carriage return\r\n" 13981 "*/\r\n")); 13982 EXPECT_EQ("/*\r\n" 13983 "\r\n" 13984 "*/", 13985 format("/*\r\n" 13986 " \r\r\r\n" 13987 "*/")); 13988 } 13989 13990 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 13991 verifyFormat("MY_CLASS(C) {\n" 13992 " int i;\n" 13993 " int j;\n" 13994 "};"); 13995 } 13996 13997 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 13998 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 13999 TwoIndent.ContinuationIndentWidth = 2; 14000 14001 EXPECT_EQ("int i =\n" 14002 " longFunction(\n" 14003 " arg);", 14004 format("int i = longFunction(arg);", TwoIndent)); 14005 14006 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 14007 SixIndent.ContinuationIndentWidth = 6; 14008 14009 EXPECT_EQ("int i =\n" 14010 " longFunction(\n" 14011 " arg);", 14012 format("int i = longFunction(arg);", SixIndent)); 14013 } 14014 14015 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 14016 FormatStyle Style = getLLVMStyle(); 14017 verifyFormat("int Foo::getter(\n" 14018 " //\n" 14019 ") const {\n" 14020 " return foo;\n" 14021 "}", 14022 Style); 14023 verifyFormat("void Foo::setter(\n" 14024 " //\n" 14025 ") {\n" 14026 " foo = 1;\n" 14027 "}", 14028 Style); 14029 } 14030 14031 TEST_F(FormatTest, SpacesInAngles) { 14032 FormatStyle Spaces = getLLVMStyle(); 14033 Spaces.SpacesInAngles = true; 14034 14035 verifyFormat("static_cast< int >(arg);", Spaces); 14036 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 14037 verifyFormat("f< int, float >();", Spaces); 14038 verifyFormat("template <> g() {}", Spaces); 14039 verifyFormat("template < std::vector< int > > f() {}", Spaces); 14040 verifyFormat("std::function< void(int, int) > fct;", Spaces); 14041 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 14042 Spaces); 14043 14044 Spaces.Standard = FormatStyle::LS_Cpp03; 14045 Spaces.SpacesInAngles = true; 14046 verifyFormat("A< A< int > >();", Spaces); 14047 14048 Spaces.SpacesInAngles = false; 14049 verifyFormat("A<A<int> >();", Spaces); 14050 14051 Spaces.Standard = FormatStyle::LS_Cpp11; 14052 Spaces.SpacesInAngles = true; 14053 verifyFormat("A< A< int > >();", Spaces); 14054 14055 Spaces.SpacesInAngles = false; 14056 verifyFormat("A<A<int>>();", Spaces); 14057 } 14058 14059 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 14060 FormatStyle Style = getLLVMStyle(); 14061 Style.SpaceAfterTemplateKeyword = false; 14062 verifyFormat("template<int> void foo();", Style); 14063 } 14064 14065 TEST_F(FormatTest, TripleAngleBrackets) { 14066 verifyFormat("f<<<1, 1>>>();"); 14067 verifyFormat("f<<<1, 1, 1, s>>>();"); 14068 verifyFormat("f<<<a, b, c, d>>>();"); 14069 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 14070 verifyFormat("f<param><<<1, 1>>>();"); 14071 verifyFormat("f<1><<<1, 1>>>();"); 14072 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 14073 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14074 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 14075 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 14076 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 14077 } 14078 14079 TEST_F(FormatTest, MergeLessLessAtEnd) { 14080 verifyFormat("<<"); 14081 EXPECT_EQ("< < <", format("\\\n<<<")); 14082 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14083 "aaallvm::outs() <<"); 14084 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14085 "aaaallvm::outs()\n <<"); 14086 } 14087 14088 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 14089 std::string code = "#if A\n" 14090 "#if B\n" 14091 "a.\n" 14092 "#endif\n" 14093 " a = 1;\n" 14094 "#else\n" 14095 "#endif\n" 14096 "#if C\n" 14097 "#else\n" 14098 "#endif\n"; 14099 EXPECT_EQ(code, format(code)); 14100 } 14101 14102 TEST_F(FormatTest, HandleConflictMarkers) { 14103 // Git/SVN conflict markers. 14104 EXPECT_EQ("int a;\n" 14105 "void f() {\n" 14106 " callme(some(parameter1,\n" 14107 "<<<<<<< text by the vcs\n" 14108 " parameter2),\n" 14109 "||||||| text by the vcs\n" 14110 " parameter2),\n" 14111 " parameter3,\n" 14112 "======= text by the vcs\n" 14113 " parameter2, parameter3),\n" 14114 ">>>>>>> text by the vcs\n" 14115 " otherparameter);\n", 14116 format("int a;\n" 14117 "void f() {\n" 14118 " callme(some(parameter1,\n" 14119 "<<<<<<< text by the vcs\n" 14120 " parameter2),\n" 14121 "||||||| text by the vcs\n" 14122 " parameter2),\n" 14123 " parameter3,\n" 14124 "======= text by the vcs\n" 14125 " parameter2,\n" 14126 " parameter3),\n" 14127 ">>>>>>> text by the vcs\n" 14128 " otherparameter);\n")); 14129 14130 // Perforce markers. 14131 EXPECT_EQ("void f() {\n" 14132 " function(\n" 14133 ">>>> text by the vcs\n" 14134 " parameter,\n" 14135 "==== text by the vcs\n" 14136 " parameter,\n" 14137 "==== text by the vcs\n" 14138 " parameter,\n" 14139 "<<<< text by the vcs\n" 14140 " parameter);\n", 14141 format("void f() {\n" 14142 " function(\n" 14143 ">>>> text by the vcs\n" 14144 " parameter,\n" 14145 "==== text by the vcs\n" 14146 " parameter,\n" 14147 "==== text by the vcs\n" 14148 " parameter,\n" 14149 "<<<< text by the vcs\n" 14150 " parameter);\n")); 14151 14152 EXPECT_EQ("<<<<<<<\n" 14153 "|||||||\n" 14154 "=======\n" 14155 ">>>>>>>", 14156 format("<<<<<<<\n" 14157 "|||||||\n" 14158 "=======\n" 14159 ">>>>>>>")); 14160 14161 EXPECT_EQ("<<<<<<<\n" 14162 "|||||||\n" 14163 "int i;\n" 14164 "=======\n" 14165 ">>>>>>>", 14166 format("<<<<<<<\n" 14167 "|||||||\n" 14168 "int i;\n" 14169 "=======\n" 14170 ">>>>>>>")); 14171 14172 // FIXME: Handle parsing of macros around conflict markers correctly: 14173 EXPECT_EQ("#define Macro \\\n" 14174 "<<<<<<<\n" 14175 "Something \\\n" 14176 "|||||||\n" 14177 "Else \\\n" 14178 "=======\n" 14179 "Other \\\n" 14180 ">>>>>>>\n" 14181 " End int i;\n", 14182 format("#define Macro \\\n" 14183 "<<<<<<<\n" 14184 " Something \\\n" 14185 "|||||||\n" 14186 " Else \\\n" 14187 "=======\n" 14188 " Other \\\n" 14189 ">>>>>>>\n" 14190 " End\n" 14191 "int i;\n")); 14192 } 14193 14194 TEST_F(FormatTest, DisableRegions) { 14195 EXPECT_EQ("int i;\n" 14196 "// clang-format off\n" 14197 " int j;\n" 14198 "// clang-format on\n" 14199 "int k;", 14200 format(" int i;\n" 14201 " // clang-format off\n" 14202 " int j;\n" 14203 " // clang-format on\n" 14204 " int k;")); 14205 EXPECT_EQ("int i;\n" 14206 "/* clang-format off */\n" 14207 " int j;\n" 14208 "/* clang-format on */\n" 14209 "int k;", 14210 format(" int i;\n" 14211 " /* clang-format off */\n" 14212 " int j;\n" 14213 " /* clang-format on */\n" 14214 " int k;")); 14215 14216 // Don't reflow comments within disabled regions. 14217 EXPECT_EQ("// clang-format off\n" 14218 "// long long long long long long line\n" 14219 "/* clang-format on */\n" 14220 "/* long long long\n" 14221 " * long long long\n" 14222 " * line */\n" 14223 "int i;\n" 14224 "/* clang-format off */\n" 14225 "/* long long long long long long line */\n", 14226 format("// clang-format off\n" 14227 "// long long long long long long line\n" 14228 "/* clang-format on */\n" 14229 "/* long long long long long long line */\n" 14230 "int i;\n" 14231 "/* clang-format off */\n" 14232 "/* long long long long long long line */\n", 14233 getLLVMStyleWithColumns(20))); 14234 } 14235 14236 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 14237 format("? ) ="); 14238 verifyNoCrash("#define a\\\n /**/}"); 14239 } 14240 14241 TEST_F(FormatTest, FormatsTableGenCode) { 14242 FormatStyle Style = getLLVMStyle(); 14243 Style.Language = FormatStyle::LK_TableGen; 14244 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 14245 } 14246 14247 TEST_F(FormatTest, ArrayOfTemplates) { 14248 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 14249 format("auto a = new unique_ptr<int > [ 10];")); 14250 14251 FormatStyle Spaces = getLLVMStyle(); 14252 Spaces.SpacesInSquareBrackets = true; 14253 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 14254 format("auto a = new unique_ptr<int > [10];", Spaces)); 14255 } 14256 14257 TEST_F(FormatTest, ArrayAsTemplateType) { 14258 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 14259 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 14260 14261 FormatStyle Spaces = getLLVMStyle(); 14262 Spaces.SpacesInSquareBrackets = true; 14263 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 14264 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 14265 } 14266 14267 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 14268 14269 TEST(FormatStyle, GetStyleWithEmptyFileName) { 14270 llvm::vfs::InMemoryFileSystem FS; 14271 auto Style1 = getStyle("file", "", "Google", "", &FS); 14272 ASSERT_TRUE((bool)Style1); 14273 ASSERT_EQ(*Style1, getGoogleStyle()); 14274 } 14275 14276 TEST(FormatStyle, GetStyleOfFile) { 14277 llvm::vfs::InMemoryFileSystem FS; 14278 // Test 1: format file in the same directory. 14279 ASSERT_TRUE( 14280 FS.addFile("/a/.clang-format", 0, 14281 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 14282 ASSERT_TRUE( 14283 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14284 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 14285 ASSERT_TRUE((bool)Style1); 14286 ASSERT_EQ(*Style1, getLLVMStyle()); 14287 14288 // Test 2.1: fallback to default. 14289 ASSERT_TRUE( 14290 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14291 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 14292 ASSERT_TRUE((bool)Style2); 14293 ASSERT_EQ(*Style2, getMozillaStyle()); 14294 14295 // Test 2.2: no format on 'none' fallback style. 14296 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14297 ASSERT_TRUE((bool)Style2); 14298 ASSERT_EQ(*Style2, getNoStyle()); 14299 14300 // Test 2.3: format if config is found with no based style while fallback is 14301 // 'none'. 14302 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 14303 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 14304 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14305 ASSERT_TRUE((bool)Style2); 14306 ASSERT_EQ(*Style2, getLLVMStyle()); 14307 14308 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 14309 Style2 = getStyle("{}", "a.h", "none", "", &FS); 14310 ASSERT_TRUE((bool)Style2); 14311 ASSERT_EQ(*Style2, getLLVMStyle()); 14312 14313 // Test 3: format file in parent directory. 14314 ASSERT_TRUE( 14315 FS.addFile("/c/.clang-format", 0, 14316 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 14317 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 14318 llvm::MemoryBuffer::getMemBuffer("int i;"))); 14319 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 14320 ASSERT_TRUE((bool)Style3); 14321 ASSERT_EQ(*Style3, getGoogleStyle()); 14322 14323 // Test 4: error on invalid fallback style 14324 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 14325 ASSERT_FALSE((bool)Style4); 14326 llvm::consumeError(Style4.takeError()); 14327 14328 // Test 5: error on invalid yaml on command line 14329 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 14330 ASSERT_FALSE((bool)Style5); 14331 llvm::consumeError(Style5.takeError()); 14332 14333 // Test 6: error on invalid style 14334 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 14335 ASSERT_FALSE((bool)Style6); 14336 llvm::consumeError(Style6.takeError()); 14337 14338 // Test 7: found config file, error on parsing it 14339 ASSERT_TRUE( 14340 FS.addFile("/d/.clang-format", 0, 14341 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 14342 "InvalidKey: InvalidValue"))); 14343 ASSERT_TRUE( 14344 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14345 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 14346 ASSERT_FALSE((bool)Style7); 14347 llvm::consumeError(Style7.takeError()); 14348 14349 // Test 8: inferred per-language defaults apply. 14350 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 14351 ASSERT_TRUE((bool)StyleTd); 14352 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 14353 } 14354 14355 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 14356 // Column limit is 20. 14357 std::string Code = "Type *a =\n" 14358 " new Type();\n" 14359 "g(iiiii, 0, jjjjj,\n" 14360 " 0, kkkkk, 0, mm);\n" 14361 "int bad = format ;"; 14362 std::string Expected = "auto a = new Type();\n" 14363 "g(iiiii, nullptr,\n" 14364 " jjjjj, nullptr,\n" 14365 " kkkkk, nullptr,\n" 14366 " mm);\n" 14367 "int bad = format ;"; 14368 FileID ID = Context.createInMemoryFile("format.cpp", Code); 14369 tooling::Replacements Replaces = toReplacements( 14370 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 14371 "auto "), 14372 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 14373 "nullptr"), 14374 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 14375 "nullptr"), 14376 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 14377 "nullptr")}); 14378 14379 format::FormatStyle Style = format::getLLVMStyle(); 14380 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 14381 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14382 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14383 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14384 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14385 EXPECT_TRUE(static_cast<bool>(Result)); 14386 EXPECT_EQ(Expected, *Result); 14387 } 14388 14389 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 14390 std::string Code = "#include \"a.h\"\n" 14391 "#include \"c.h\"\n" 14392 "\n" 14393 "int main() {\n" 14394 " return 0;\n" 14395 "}"; 14396 std::string Expected = "#include \"a.h\"\n" 14397 "#include \"b.h\"\n" 14398 "#include \"c.h\"\n" 14399 "\n" 14400 "int main() {\n" 14401 " return 0;\n" 14402 "}"; 14403 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 14404 tooling::Replacements Replaces = toReplacements( 14405 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 14406 "#include \"b.h\"\n")}); 14407 14408 format::FormatStyle Style = format::getLLVMStyle(); 14409 Style.SortIncludes = true; 14410 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14411 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14412 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14413 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14414 EXPECT_TRUE(static_cast<bool>(Result)); 14415 EXPECT_EQ(Expected, *Result); 14416 } 14417 14418 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 14419 EXPECT_EQ("using std::cin;\n" 14420 "using std::cout;", 14421 format("using std::cout;\n" 14422 "using std::cin;", 14423 getGoogleStyle())); 14424 } 14425 14426 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 14427 format::FormatStyle Style = format::getLLVMStyle(); 14428 Style.Standard = FormatStyle::LS_Cpp03; 14429 // cpp03 recognize this string as identifier u8 and literal character 'a' 14430 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 14431 } 14432 14433 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 14434 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 14435 // all modes, including C++11, C++14 and C++17 14436 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 14437 } 14438 14439 TEST_F(FormatTest, DoNotFormatLikelyXml) { 14440 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 14441 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 14442 } 14443 14444 TEST_F(FormatTest, StructuredBindings) { 14445 // Structured bindings is a C++17 feature. 14446 // all modes, including C++11, C++14 and C++17 14447 verifyFormat("auto [a, b] = f();"); 14448 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 14449 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 14450 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 14451 EXPECT_EQ("auto const volatile [a, b] = f();", 14452 format("auto const volatile[a, b] = f();")); 14453 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 14454 EXPECT_EQ("auto &[a, b, c] = f();", 14455 format("auto &[ a , b,c ] = f();")); 14456 EXPECT_EQ("auto &&[a, b, c] = f();", 14457 format("auto &&[ a , b,c ] = f();")); 14458 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 14459 EXPECT_EQ("auto const volatile &&[a, b] = f();", 14460 format("auto const volatile &&[a, b] = f();")); 14461 EXPECT_EQ("auto const &&[a, b] = f();", 14462 format("auto const && [a, b] = f();")); 14463 EXPECT_EQ("const auto &[a, b] = f();", 14464 format("const auto & [a, b] = f();")); 14465 EXPECT_EQ("const auto volatile &&[a, b] = f();", 14466 format("const auto volatile &&[a, b] = f();")); 14467 EXPECT_EQ("volatile const auto &&[a, b] = f();", 14468 format("volatile const auto &&[a, b] = f();")); 14469 EXPECT_EQ("const auto &&[a, b] = f();", 14470 format("const auto && [a, b] = f();")); 14471 14472 // Make sure we don't mistake structured bindings for lambdas. 14473 FormatStyle PointerMiddle = getLLVMStyle(); 14474 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 14475 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 14476 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 14477 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 14478 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 14479 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 14480 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 14481 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 14482 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 14483 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 14484 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 14485 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 14486 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 14487 14488 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 14489 format("for (const auto && [a, b] : some_range) {\n}")); 14490 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 14491 format("for (const auto & [a, b] : some_range) {\n}")); 14492 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 14493 format("for (const auto[a, b] : some_range) {\n}")); 14494 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 14495 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 14496 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 14497 EXPECT_EQ("auto const &[x, y](expr);", 14498 format("auto const & [x,y] (expr);")); 14499 EXPECT_EQ("auto const &&[x, y](expr);", 14500 format("auto const && [x,y] (expr);")); 14501 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 14502 EXPECT_EQ("auto const &[x, y]{expr};", 14503 format("auto const & [x,y] {expr};")); 14504 EXPECT_EQ("auto const &&[x, y]{expr};", 14505 format("auto const && [x,y] {expr};")); 14506 14507 format::FormatStyle Spaces = format::getLLVMStyle(); 14508 Spaces.SpacesInSquareBrackets = true; 14509 verifyFormat("auto [ a, b ] = f();", Spaces); 14510 verifyFormat("auto &&[ a, b ] = f();", Spaces); 14511 verifyFormat("auto &[ a, b ] = f();", Spaces); 14512 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 14513 verifyFormat("auto const &[ a, b ] = f();", Spaces); 14514 } 14515 14516 TEST_F(FormatTest, FileAndCode) { 14517 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 14518 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 14519 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 14520 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 14521 EXPECT_EQ(FormatStyle::LK_ObjC, 14522 guessLanguage("foo.h", "@interface Foo\n@end\n")); 14523 EXPECT_EQ( 14524 FormatStyle::LK_ObjC, 14525 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 14526 EXPECT_EQ(FormatStyle::LK_ObjC, 14527 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 14528 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 14529 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 14530 EXPECT_EQ(FormatStyle::LK_ObjC, 14531 guessLanguage("foo", "@interface Foo\n@end\n")); 14532 EXPECT_EQ(FormatStyle::LK_ObjC, 14533 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 14534 EXPECT_EQ( 14535 FormatStyle::LK_ObjC, 14536 guessLanguage("foo.h", 14537 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 14538 EXPECT_EQ( 14539 FormatStyle::LK_Cpp, 14540 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 14541 } 14542 14543 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 14544 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 14545 EXPECT_EQ(FormatStyle::LK_ObjC, 14546 guessLanguage("foo.h", "array[[calculator getIndex]];")); 14547 EXPECT_EQ(FormatStyle::LK_Cpp, 14548 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 14549 EXPECT_EQ( 14550 FormatStyle::LK_Cpp, 14551 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 14552 EXPECT_EQ(FormatStyle::LK_ObjC, 14553 guessLanguage("foo.h", "[[noreturn foo] bar];")); 14554 EXPECT_EQ(FormatStyle::LK_Cpp, 14555 guessLanguage("foo.h", "[[clang::fallthrough]];")); 14556 EXPECT_EQ(FormatStyle::LK_ObjC, 14557 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 14558 EXPECT_EQ(FormatStyle::LK_Cpp, 14559 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 14560 EXPECT_EQ(FormatStyle::LK_Cpp, 14561 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 14562 EXPECT_EQ(FormatStyle::LK_ObjC, 14563 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 14564 EXPECT_EQ(FormatStyle::LK_Cpp, 14565 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 14566 EXPECT_EQ( 14567 FormatStyle::LK_Cpp, 14568 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 14569 EXPECT_EQ( 14570 FormatStyle::LK_Cpp, 14571 guessLanguage("foo.h", 14572 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 14573 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 14574 } 14575 14576 TEST_F(FormatTest, GuessLanguageWithCaret) { 14577 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 14578 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 14579 EXPECT_EQ(FormatStyle::LK_ObjC, 14580 guessLanguage("foo.h", "int(^)(char, float);")); 14581 EXPECT_EQ(FormatStyle::LK_ObjC, 14582 guessLanguage("foo.h", "int(^foo)(char, float);")); 14583 EXPECT_EQ(FormatStyle::LK_ObjC, 14584 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 14585 EXPECT_EQ(FormatStyle::LK_ObjC, 14586 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 14587 EXPECT_EQ( 14588 FormatStyle::LK_ObjC, 14589 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 14590 } 14591 14592 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 14593 EXPECT_EQ(FormatStyle::LK_Cpp, 14594 guessLanguage("foo.h", "void f() {\n" 14595 " asm (\"mov %[e], %[d]\"\n" 14596 " : [d] \"=rm\" (d)\n" 14597 " [e] \"rm\" (*e));\n" 14598 "}")); 14599 EXPECT_EQ(FormatStyle::LK_Cpp, 14600 guessLanguage("foo.h", "void f() {\n" 14601 " _asm (\"mov %[e], %[d]\"\n" 14602 " : [d] \"=rm\" (d)\n" 14603 " [e] \"rm\" (*e));\n" 14604 "}")); 14605 EXPECT_EQ(FormatStyle::LK_Cpp, 14606 guessLanguage("foo.h", "void f() {\n" 14607 " __asm (\"mov %[e], %[d]\"\n" 14608 " : [d] \"=rm\" (d)\n" 14609 " [e] \"rm\" (*e));\n" 14610 "}")); 14611 EXPECT_EQ(FormatStyle::LK_Cpp, 14612 guessLanguage("foo.h", "void f() {\n" 14613 " __asm__ (\"mov %[e], %[d]\"\n" 14614 " : [d] \"=rm\" (d)\n" 14615 " [e] \"rm\" (*e));\n" 14616 "}")); 14617 EXPECT_EQ(FormatStyle::LK_Cpp, 14618 guessLanguage("foo.h", "void f() {\n" 14619 " asm (\"mov %[e], %[d]\"\n" 14620 " : [d] \"=rm\" (d),\n" 14621 " [e] \"rm\" (*e));\n" 14622 "}")); 14623 EXPECT_EQ(FormatStyle::LK_Cpp, 14624 guessLanguage("foo.h", "void f() {\n" 14625 " asm volatile (\"mov %[e], %[d]\"\n" 14626 " : [d] \"=rm\" (d)\n" 14627 " [e] \"rm\" (*e));\n" 14628 "}")); 14629 } 14630 14631 TEST_F(FormatTest, GuessLanguageWithChildLines) { 14632 EXPECT_EQ(FormatStyle::LK_Cpp, 14633 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 14634 EXPECT_EQ(FormatStyle::LK_ObjC, 14635 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 14636 EXPECT_EQ( 14637 FormatStyle::LK_Cpp, 14638 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 14639 EXPECT_EQ( 14640 FormatStyle::LK_ObjC, 14641 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 14642 } 14643 14644 TEST_F(FormatTest, TypenameMacros) { 14645 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 14646 14647 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 14648 FormatStyle Google = getGoogleStyleWithColumns(0); 14649 Google.TypenameMacros = TypenameMacros; 14650 verifyFormat("struct foo {\n" 14651 " int bar;\n" 14652 " TAILQ_ENTRY(a) bleh;\n" 14653 "};", 14654 Google); 14655 14656 FormatStyle Macros = getLLVMStyle(); 14657 Macros.TypenameMacros = TypenameMacros; 14658 14659 verifyFormat("STACK_OF(int) a;", Macros); 14660 verifyFormat("STACK_OF(int) *a;", Macros); 14661 verifyFormat("STACK_OF(int const *) *a;", Macros); 14662 verifyFormat("STACK_OF(int *const) *a;", Macros); 14663 verifyFormat("STACK_OF(int, string) a;", Macros); 14664 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 14665 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 14666 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 14667 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 14668 14669 Macros.PointerAlignment = FormatStyle::PAS_Left; 14670 verifyFormat("STACK_OF(int)* a;", Macros); 14671 verifyFormat("STACK_OF(int*)* a;", Macros); 14672 } 14673 14674 TEST_F(FormatTest, AmbersandInLamda) { 14675 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 14676 FormatStyle AlignStyle = getLLVMStyle(); 14677 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 14678 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14679 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 14680 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14681 } 14682 14683 TEST_F(FormatTest, AlternativeOperators) { 14684 // Test case for ensuring alternate operators are not 14685 // combined with their right most neighbour. 14686 verifyFormat("int a and b;"); 14687 verifyFormat("int a and_eq b;"); 14688 verifyFormat("int a bitand b;"); 14689 verifyFormat("int a bitor b;"); 14690 verifyFormat("int a compl b;"); 14691 verifyFormat("int a not b;"); 14692 verifyFormat("int a not_eq b;"); 14693 verifyFormat("int a or b;"); 14694 verifyFormat("int a xor b;"); 14695 verifyFormat("int a xor_eq b;"); 14696 verifyFormat("return this not_eq bitand other;"); 14697 verifyFormat("bool operator not_eq(const X bitand other)"); 14698 14699 verifyFormat("int a and 5;"); 14700 verifyFormat("int a and_eq 5;"); 14701 verifyFormat("int a bitand 5;"); 14702 verifyFormat("int a bitor 5;"); 14703 verifyFormat("int a compl 5;"); 14704 verifyFormat("int a not 5;"); 14705 verifyFormat("int a not_eq 5;"); 14706 verifyFormat("int a or 5;"); 14707 verifyFormat("int a xor 5;"); 14708 verifyFormat("int a xor_eq 5;"); 14709 14710 verifyFormat("int a compl(5);"); 14711 verifyFormat("int a not(5);"); 14712 14713 /* FIXME handle alternate tokens 14714 * https://en.cppreference.com/w/cpp/language/operator_alternative 14715 // alternative tokens 14716 verifyFormat("compl foo();"); // ~foo(); 14717 verifyFormat("foo() <%%>;"); // foo(); 14718 verifyFormat("void foo() <%%>;"); // void foo(){} 14719 verifyFormat("int a <:1:>;"); // int a[1];[ 14720 verifyFormat("%:define ABC abc"); // #define ABC abc 14721 verifyFormat("%:%:"); // ## 14722 */ 14723 } 14724 14725 TEST_F(FormatTest, STLWhileNotDefineChed) { 14726 verifyFormat("#if defined(while)\n" 14727 "#define while EMIT WARNING C4005\n" 14728 "#endif // while"); 14729 } 14730 14731 } // namespace 14732 } // namespace format 14733 } // namespace clang 14734