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("switch (a) {\n" 6916 "case -1:\n" 6917 " break;\n" 6918 "}"); 6919 verifyFormat("#define X -1"); 6920 verifyFormat("#define X -kConstant"); 6921 6922 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 6923 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 6924 6925 verifyFormat("int a = /* confusing comment */ -1;"); 6926 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 6927 verifyFormat("int a = i /* confusing comment */++;"); 6928 } 6929 6930 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 6931 verifyFormat("if (!aaaaaaaaaa( // break\n" 6932 " aaaaa)) {\n" 6933 "}"); 6934 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 6935 " aaaaa));"); 6936 verifyFormat("*aaa = aaaaaaa( // break\n" 6937 " bbbbbb);"); 6938 } 6939 6940 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 6941 verifyFormat("bool operator<();"); 6942 verifyFormat("bool operator>();"); 6943 verifyFormat("bool operator=();"); 6944 verifyFormat("bool operator==();"); 6945 verifyFormat("bool operator!=();"); 6946 verifyFormat("int operator+();"); 6947 verifyFormat("int operator++();"); 6948 verifyFormat("int operator++(int) volatile noexcept;"); 6949 verifyFormat("bool operator,();"); 6950 verifyFormat("bool operator();"); 6951 verifyFormat("bool operator()();"); 6952 verifyFormat("bool operator[]();"); 6953 verifyFormat("operator bool();"); 6954 verifyFormat("operator int();"); 6955 verifyFormat("operator void *();"); 6956 verifyFormat("operator SomeType<int>();"); 6957 verifyFormat("operator SomeType<int, int>();"); 6958 verifyFormat("operator SomeType<SomeType<int>>();"); 6959 verifyFormat("void *operator new(std::size_t size);"); 6960 verifyFormat("void *operator new[](std::size_t size);"); 6961 verifyFormat("void operator delete(void *ptr);"); 6962 verifyFormat("void operator delete[](void *ptr);"); 6963 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 6964 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 6965 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 6966 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 6967 6968 verifyFormat( 6969 "ostream &operator<<(ostream &OutputStream,\n" 6970 " SomeReallyLongType WithSomeReallyLongValue);"); 6971 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 6972 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 6973 " return left.group < right.group;\n" 6974 "}"); 6975 verifyFormat("SomeType &operator=(const SomeType &S);"); 6976 verifyFormat("f.template operator()<int>();"); 6977 6978 verifyGoogleFormat("operator void*();"); 6979 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 6980 verifyGoogleFormat("operator ::A();"); 6981 6982 verifyFormat("using A::operator+;"); 6983 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 6984 "int i;"); 6985 } 6986 6987 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 6988 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 6989 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 6990 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 6991 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 6992 verifyFormat("Deleted &operator=(const Deleted &) &;"); 6993 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 6994 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 6995 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 6996 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 6997 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 6998 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 6999 verifyFormat("void Fn(T const &) const &;"); 7000 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7001 verifyFormat("template <typename T>\n" 7002 "void F(T) && = delete;", 7003 getGoogleStyle()); 7004 7005 FormatStyle AlignLeft = getLLVMStyle(); 7006 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7007 verifyFormat("void A::b() && {}", AlignLeft); 7008 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7009 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7010 AlignLeft); 7011 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7012 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7013 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7014 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7015 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7016 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7017 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7018 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7019 7020 FormatStyle Spaces = getLLVMStyle(); 7021 Spaces.SpacesInCStyleCastParentheses = true; 7022 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7023 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7024 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7025 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7026 7027 Spaces.SpacesInCStyleCastParentheses = false; 7028 Spaces.SpacesInParentheses = true; 7029 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7030 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7031 Spaces); 7032 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7033 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7034 7035 FormatStyle BreakTemplate = getLLVMStyle(); 7036 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7037 7038 verifyFormat("struct f {\n" 7039 " template <class T>\n" 7040 " int &foo(const std::string &str) &noexcept {}\n" 7041 "};", 7042 BreakTemplate); 7043 7044 verifyFormat("struct f {\n" 7045 " template <class T>\n" 7046 " int &foo(const std::string &str) &&noexcept {}\n" 7047 "};", 7048 BreakTemplate); 7049 7050 verifyFormat("struct f {\n" 7051 " template <class T>\n" 7052 " int &foo(const std::string &str) const &noexcept {}\n" 7053 "};", 7054 BreakTemplate); 7055 7056 verifyFormat("struct f {\n" 7057 " template <class T>\n" 7058 " int &foo(const std::string &str) const &noexcept {}\n" 7059 "};", 7060 BreakTemplate); 7061 7062 verifyFormat("struct f {\n" 7063 " template <class T>\n" 7064 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7065 "};", 7066 BreakTemplate); 7067 7068 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7069 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7070 FormatStyle::BTDS_Yes; 7071 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7072 7073 verifyFormat("struct f {\n" 7074 " template <class T>\n" 7075 " int& foo(const std::string& str) & noexcept {}\n" 7076 "};", 7077 AlignLeftBreakTemplate); 7078 7079 verifyFormat("struct f {\n" 7080 " template <class T>\n" 7081 " int& foo(const std::string& str) && noexcept {}\n" 7082 "};", 7083 AlignLeftBreakTemplate); 7084 7085 verifyFormat("struct f {\n" 7086 " template <class T>\n" 7087 " int& foo(const std::string& str) const& noexcept {}\n" 7088 "};", 7089 AlignLeftBreakTemplate); 7090 7091 verifyFormat("struct f {\n" 7092 " template <class T>\n" 7093 " int& foo(const std::string& str) const&& noexcept {}\n" 7094 "};", 7095 AlignLeftBreakTemplate); 7096 7097 verifyFormat("struct f {\n" 7098 " template <class T>\n" 7099 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7100 "};", 7101 AlignLeftBreakTemplate); 7102 7103 // The `&` in `Type&` should not be confused with a trailing `&` of 7104 // DEPRECATED(reason) member function. 7105 verifyFormat("struct f {\n" 7106 " template <class T>\n" 7107 " DEPRECATED(reason)\n" 7108 " Type &foo(arguments) {}\n" 7109 "};", 7110 BreakTemplate); 7111 7112 verifyFormat("struct f {\n" 7113 " template <class T>\n" 7114 " DEPRECATED(reason)\n" 7115 " Type& foo(arguments) {}\n" 7116 "};", 7117 AlignLeftBreakTemplate); 7118 7119 verifyFormat("void (*foopt)(int) = &func;"); 7120 } 7121 7122 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7123 verifyFormat("void f() {\n" 7124 " A *a = new A;\n" 7125 " A *a = new (placement) A;\n" 7126 " delete a;\n" 7127 " delete (A *)a;\n" 7128 "}"); 7129 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7130 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7131 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7132 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7133 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7134 verifyFormat("delete[] h->p;"); 7135 } 7136 7137 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7138 verifyFormat("int *f(int *a) {}"); 7139 verifyFormat("int main(int argc, char **argv) {}"); 7140 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7141 verifyIndependentOfContext("f(a, *a);"); 7142 verifyFormat("void g() { f(*a); }"); 7143 verifyIndependentOfContext("int a = b * 10;"); 7144 verifyIndependentOfContext("int a = 10 * b;"); 7145 verifyIndependentOfContext("int a = b * c;"); 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;"); 7151 verifyIndependentOfContext("int a = *b * c;"); 7152 verifyIndependentOfContext("int a = b * *c;"); 7153 verifyIndependentOfContext("int a = b * (10);"); 7154 verifyIndependentOfContext("S << b * (10);"); 7155 verifyIndependentOfContext("return 10 * b;"); 7156 verifyIndependentOfContext("return *b * *c;"); 7157 verifyIndependentOfContext("return a & ~b;"); 7158 verifyIndependentOfContext("f(b ? *c : *d);"); 7159 verifyIndependentOfContext("int a = b ? *c : *d;"); 7160 verifyIndependentOfContext("*b = a;"); 7161 verifyIndependentOfContext("a * ~b;"); 7162 verifyIndependentOfContext("a * !b;"); 7163 verifyIndependentOfContext("a * +b;"); 7164 verifyIndependentOfContext("a * -b;"); 7165 verifyIndependentOfContext("a * ++b;"); 7166 verifyIndependentOfContext("a * --b;"); 7167 verifyIndependentOfContext("a[4] * b;"); 7168 verifyIndependentOfContext("a[a * a] = 1;"); 7169 verifyIndependentOfContext("f() * b;"); 7170 verifyIndependentOfContext("a * [self dostuff];"); 7171 verifyIndependentOfContext("int x = a * (a + b);"); 7172 verifyIndependentOfContext("(a *)(a + b);"); 7173 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7174 verifyIndependentOfContext("int *pa = (int *)&a;"); 7175 verifyIndependentOfContext("return sizeof(int **);"); 7176 verifyIndependentOfContext("return sizeof(int ******);"); 7177 verifyIndependentOfContext("return (int **&)a;"); 7178 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7179 verifyFormat("void f(Type (*parameter)[10]) {}"); 7180 verifyFormat("void f(Type (¶meter)[10]) {}"); 7181 verifyGoogleFormat("return sizeof(int**);"); 7182 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7183 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7184 verifyFormat("auto a = [](int **&, int ***) {};"); 7185 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7186 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7187 verifyFormat("[](const decltype(*a) &value) {}"); 7188 verifyFormat("decltype(a * b) F();"); 7189 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7190 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7191 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7192 verifyIndependentOfContext("int i{a * b};"); 7193 verifyIndependentOfContext("aaa && aaa->f();"); 7194 verifyIndependentOfContext("int x = ~*p;"); 7195 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7196 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7197 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7198 verifyFormat("void f() { f(a, c * d); }"); 7199 verifyFormat("void f() { f(new a(), c * d); }"); 7200 verifyFormat("void f(const MyOverride &override);"); 7201 verifyFormat("void f(const MyFinal &final);"); 7202 verifyIndependentOfContext("bool a = f() && override.f();"); 7203 verifyIndependentOfContext("bool a = f() && final.f();"); 7204 7205 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7206 7207 verifyIndependentOfContext("A<int *> a;"); 7208 verifyIndependentOfContext("A<int **> a;"); 7209 verifyIndependentOfContext("A<int *, int *> a;"); 7210 verifyIndependentOfContext("A<int *[]> a;"); 7211 verifyIndependentOfContext( 7212 "const char *const p = reinterpret_cast<const char *const>(q);"); 7213 verifyIndependentOfContext("A<int **, int **> a;"); 7214 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7215 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7216 verifyFormat("for (; a && b;) {\n}"); 7217 verifyFormat("bool foo = true && [] { return false; }();"); 7218 7219 verifyFormat( 7220 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7221 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7222 7223 verifyGoogleFormat("int const* a = &b;"); 7224 verifyGoogleFormat("**outparam = 1;"); 7225 verifyGoogleFormat("*outparam = a * b;"); 7226 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7227 verifyGoogleFormat("A<int*> a;"); 7228 verifyGoogleFormat("A<int**> a;"); 7229 verifyGoogleFormat("A<int*, int*> a;"); 7230 verifyGoogleFormat("A<int**, int**> a;"); 7231 verifyGoogleFormat("f(b ? *c : *d);"); 7232 verifyGoogleFormat("int a = b ? *c : *d;"); 7233 verifyGoogleFormat("Type* t = **x;"); 7234 verifyGoogleFormat("Type* t = *++*x;"); 7235 verifyGoogleFormat("*++*x;"); 7236 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7237 verifyGoogleFormat("Type* t = x++ * y;"); 7238 verifyGoogleFormat( 7239 "const char* const p = reinterpret_cast<const char* const>(q);"); 7240 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7241 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7242 verifyGoogleFormat("template <typename T>\n" 7243 "void f(int i = 0, SomeType** temps = NULL);"); 7244 7245 FormatStyle Left = getLLVMStyle(); 7246 Left.PointerAlignment = FormatStyle::PAS_Left; 7247 verifyFormat("x = *a(x) = *a(y);", Left); 7248 verifyFormat("for (;; *a = b) {\n}", Left); 7249 verifyFormat("return *this += 1;", Left); 7250 verifyFormat("throw *x;", Left); 7251 verifyFormat("delete *x;", Left); 7252 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7253 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7254 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7255 7256 verifyIndependentOfContext("a = *(x + y);"); 7257 verifyIndependentOfContext("a = &(x + y);"); 7258 verifyIndependentOfContext("*(x + y).call();"); 7259 verifyIndependentOfContext("&(x + y)->call();"); 7260 verifyFormat("void f() { &(*I).first; }"); 7261 7262 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7263 verifyFormat( 7264 "int *MyValues = {\n" 7265 " *A, // Operator detection might be confused by the '{'\n" 7266 " *BB // Operator detection might be confused by previous comment\n" 7267 "};"); 7268 7269 verifyIndependentOfContext("if (int *a = &b)"); 7270 verifyIndependentOfContext("if (int &a = *b)"); 7271 verifyIndependentOfContext("if (a & b[i])"); 7272 verifyIndependentOfContext("if constexpr (a & b[i])"); 7273 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7274 verifyIndependentOfContext("if (a * (b * c))"); 7275 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7276 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7277 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7278 verifyIndependentOfContext("if (*b[i])"); 7279 verifyIndependentOfContext("if (int *a = (&b))"); 7280 verifyIndependentOfContext("while (int *a = &b)"); 7281 verifyIndependentOfContext("while (a * (b * c))"); 7282 verifyIndependentOfContext("size = sizeof *a;"); 7283 verifyIndependentOfContext("if (a && (b = c))"); 7284 verifyFormat("void f() {\n" 7285 " for (const int &v : Values) {\n" 7286 " }\n" 7287 "}"); 7288 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7289 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7290 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7291 7292 verifyFormat("#define A (!a * b)"); 7293 verifyFormat("#define MACRO \\\n" 7294 " int *i = a * b; \\\n" 7295 " void f(a *b);", 7296 getLLVMStyleWithColumns(19)); 7297 7298 verifyIndependentOfContext("A = new SomeType *[Length];"); 7299 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7300 verifyIndependentOfContext("T **t = new T *;"); 7301 verifyIndependentOfContext("T **t = new T *();"); 7302 verifyGoogleFormat("A = new SomeType*[Length]();"); 7303 verifyGoogleFormat("A = new SomeType*[Length];"); 7304 verifyGoogleFormat("T** t = new T*;"); 7305 verifyGoogleFormat("T** t = new T*();"); 7306 7307 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7308 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7309 verifyFormat("template <bool a, bool b> " 7310 "typename t::if<x && y>::type f() {}"); 7311 verifyFormat("template <int *y> f() {}"); 7312 verifyFormat("vector<int *> v;"); 7313 verifyFormat("vector<int *const> v;"); 7314 verifyFormat("vector<int *const **const *> v;"); 7315 verifyFormat("vector<int *volatile> v;"); 7316 verifyFormat("vector<a * b> v;"); 7317 verifyFormat("foo<b && false>();"); 7318 verifyFormat("foo<b & 1>();"); 7319 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7320 verifyFormat( 7321 "template <class T, class = typename std::enable_if<\n" 7322 " std::is_integral<T>::value &&\n" 7323 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7324 "void F();", 7325 getLLVMStyleWithColumns(70)); 7326 verifyFormat("template <class T,\n" 7327 " class = typename std::enable_if<\n" 7328 " std::is_integral<T>::value &&\n" 7329 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7330 " class U>\n" 7331 "void F();", 7332 getLLVMStyleWithColumns(70)); 7333 verifyFormat( 7334 "template <class T,\n" 7335 " class = typename ::std::enable_if<\n" 7336 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7337 "void F();", 7338 getGoogleStyleWithColumns(68)); 7339 7340 verifyIndependentOfContext("MACRO(int *i);"); 7341 verifyIndependentOfContext("MACRO(auto *a);"); 7342 verifyIndependentOfContext("MACRO(const A *a);"); 7343 verifyIndependentOfContext("MACRO(A *const a);"); 7344 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7345 verifyFormat("void f() { f(float{1}, a * a); }"); 7346 // FIXME: Is there a way to make this work? 7347 // verifyIndependentOfContext("MACRO(A *a);"); 7348 7349 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7350 verifyFormat("return options != nullptr && operator==(*options);"); 7351 7352 EXPECT_EQ("#define OP(x) \\\n" 7353 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7354 " return s << a.DebugString(); \\\n" 7355 " }", 7356 format("#define OP(x) \\\n" 7357 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7358 " return s << a.DebugString(); \\\n" 7359 " }", 7360 getLLVMStyleWithColumns(50))); 7361 7362 // FIXME: We cannot handle this case yet; we might be able to figure out that 7363 // foo<x> d > v; doesn't make sense. 7364 verifyFormat("foo<a<b && c> d> v;"); 7365 7366 FormatStyle PointerMiddle = getLLVMStyle(); 7367 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7368 verifyFormat("delete *x;", PointerMiddle); 7369 verifyFormat("int * x;", PointerMiddle); 7370 verifyFormat("int *[] x;", PointerMiddle); 7371 verifyFormat("template <int * y> f() {}", PointerMiddle); 7372 verifyFormat("int * f(int * a) {}", PointerMiddle); 7373 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7374 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7375 verifyFormat("A<int *> a;", PointerMiddle); 7376 verifyFormat("A<int **> a;", PointerMiddle); 7377 verifyFormat("A<int *, int *> a;", PointerMiddle); 7378 verifyFormat("A<int *[]> a;", PointerMiddle); 7379 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7380 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7381 verifyFormat("T ** t = new T *;", PointerMiddle); 7382 7383 // Member function reference qualifiers aren't binary operators. 7384 verifyFormat("string // break\n" 7385 "operator()() & {}"); 7386 verifyFormat("string // break\n" 7387 "operator()() && {}"); 7388 verifyGoogleFormat("template <typename T>\n" 7389 "auto x() & -> int {}"); 7390 } 7391 7392 TEST_F(FormatTest, UnderstandsAttributes) { 7393 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7394 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7395 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7396 FormatStyle AfterType = getLLVMStyle(); 7397 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7398 verifyFormat("__attribute__((nodebug)) void\n" 7399 "foo() {}\n", 7400 AfterType); 7401 } 7402 7403 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7404 verifyFormat("SomeType s [[unused]] (InitValue);"); 7405 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7406 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7407 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7408 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7409 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7410 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7411 7412 // Make sure we do not mistake attributes for array subscripts. 7413 verifyFormat("int a() {}\n" 7414 "[[unused]] int b() {}\n"); 7415 verifyFormat("NSArray *arr;\n" 7416 "arr[[Foo() bar]];"); 7417 7418 // On the other hand, we still need to correctly find array subscripts. 7419 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7420 7421 // Make sure that we do not mistake Objective-C method inside array literals 7422 // as attributes, even if those method names are also keywords. 7423 verifyFormat("@[ [foo bar] ];"); 7424 verifyFormat("@[ [NSArray class] ];"); 7425 verifyFormat("@[ [foo enum] ];"); 7426 7427 // Make sure we do not parse attributes as lambda introducers. 7428 FormatStyle MultiLineFunctions = getLLVMStyle(); 7429 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7430 verifyFormat("[[unused]] int b() {\n" 7431 " return 42;\n" 7432 "}\n", 7433 MultiLineFunctions); 7434 } 7435 7436 TEST_F(FormatTest, UnderstandsEllipsis) { 7437 verifyFormat("int printf(const char *fmt, ...);"); 7438 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7439 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7440 7441 FormatStyle PointersLeft = getLLVMStyle(); 7442 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7443 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7444 } 7445 7446 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7447 EXPECT_EQ("int *a;\n" 7448 "int *a;\n" 7449 "int *a;", 7450 format("int *a;\n" 7451 "int* a;\n" 7452 "int *a;", 7453 getGoogleStyle())); 7454 EXPECT_EQ("int* a;\n" 7455 "int* a;\n" 7456 "int* a;", 7457 format("int* a;\n" 7458 "int* a;\n" 7459 "int *a;", 7460 getGoogleStyle())); 7461 EXPECT_EQ("int *a;\n" 7462 "int *a;\n" 7463 "int *a;", 7464 format("int *a;\n" 7465 "int * a;\n" 7466 "int * a;", 7467 getGoogleStyle())); 7468 EXPECT_EQ("auto x = [] {\n" 7469 " int *a;\n" 7470 " int *a;\n" 7471 " int *a;\n" 7472 "};", 7473 format("auto x=[]{int *a;\n" 7474 "int * a;\n" 7475 "int * a;};", 7476 getGoogleStyle())); 7477 } 7478 7479 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7480 verifyFormat("int f(int &&a) {}"); 7481 verifyFormat("int f(int a, char &&b) {}"); 7482 verifyFormat("void f() { int &&a = b; }"); 7483 verifyGoogleFormat("int f(int a, char&& b) {}"); 7484 verifyGoogleFormat("void f() { int&& a = b; }"); 7485 7486 verifyIndependentOfContext("A<int &&> a;"); 7487 verifyIndependentOfContext("A<int &&, int &&> a;"); 7488 verifyGoogleFormat("A<int&&> a;"); 7489 verifyGoogleFormat("A<int&&, int&&> a;"); 7490 7491 // Not rvalue references: 7492 verifyFormat("template <bool B, bool C> class A {\n" 7493 " static_assert(B && C, \"Something is wrong\");\n" 7494 "};"); 7495 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7496 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7497 verifyFormat("#define A(a, b) (a && b)"); 7498 } 7499 7500 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7501 verifyFormat("void f() {\n" 7502 " x[aaaaaaaaa -\n" 7503 " b] = 23;\n" 7504 "}", 7505 getLLVMStyleWithColumns(15)); 7506 } 7507 7508 TEST_F(FormatTest, FormatsCasts) { 7509 verifyFormat("Type *A = static_cast<Type *>(P);"); 7510 verifyFormat("Type *A = (Type *)P;"); 7511 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7512 verifyFormat("int a = (int)(2.0f);"); 7513 verifyFormat("int a = (int)2.0f;"); 7514 verifyFormat("x[(int32)y];"); 7515 verifyFormat("x = (int32)y;"); 7516 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7517 verifyFormat("int a = (int)*b;"); 7518 verifyFormat("int a = (int)2.0f;"); 7519 verifyFormat("int a = (int)~0;"); 7520 verifyFormat("int a = (int)++a;"); 7521 verifyFormat("int a = (int)sizeof(int);"); 7522 verifyFormat("int a = (int)+2;"); 7523 verifyFormat("my_int a = (my_int)2.0f;"); 7524 verifyFormat("my_int a = (my_int)sizeof(int);"); 7525 verifyFormat("return (my_int)aaa;"); 7526 verifyFormat("#define x ((int)-1)"); 7527 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7528 verifyFormat("#define p(q) ((int *)&q)"); 7529 verifyFormat("fn(a)(b) + 1;"); 7530 7531 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7532 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7533 verifyFormat("my_int a = (my_int)~0;"); 7534 verifyFormat("my_int a = (my_int)++a;"); 7535 verifyFormat("my_int a = (my_int)-2;"); 7536 verifyFormat("my_int a = (my_int)1;"); 7537 verifyFormat("my_int a = (my_int *)1;"); 7538 verifyFormat("my_int a = (const my_int)-1;"); 7539 verifyFormat("my_int a = (const my_int *)-1;"); 7540 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7541 verifyFormat("my_int a = (ns::my_int)-2;"); 7542 verifyFormat("case (my_int)ONE:"); 7543 verifyFormat("auto x = (X)this;"); 7544 7545 // FIXME: single value wrapped with paren will be treated as cast. 7546 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7547 7548 verifyFormat("{ (void)F; }"); 7549 7550 // Don't break after a cast's 7551 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7552 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7553 " bbbbbbbbbbbbbbbbbbbbbb);"); 7554 7555 // These are not casts. 7556 verifyFormat("void f(int *) {}"); 7557 verifyFormat("f(foo)->b;"); 7558 verifyFormat("f(foo).b;"); 7559 verifyFormat("f(foo)(b);"); 7560 verifyFormat("f(foo)[b];"); 7561 verifyFormat("[](foo) { return 4; }(bar);"); 7562 verifyFormat("(*funptr)(foo)[4];"); 7563 verifyFormat("funptrs[4](foo)[4];"); 7564 verifyFormat("void f(int *);"); 7565 verifyFormat("void f(int *) = 0;"); 7566 verifyFormat("void f(SmallVector<int>) {}"); 7567 verifyFormat("void f(SmallVector<int>);"); 7568 verifyFormat("void f(SmallVector<int>) = 0;"); 7569 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7570 verifyFormat("int a = sizeof(int) * b;"); 7571 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7572 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7573 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7574 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7575 7576 // These are not casts, but at some point were confused with casts. 7577 verifyFormat("virtual void foo(int *) override;"); 7578 verifyFormat("virtual void foo(char &) const;"); 7579 verifyFormat("virtual void foo(int *a, char *) const;"); 7580 verifyFormat("int a = sizeof(int *) + b;"); 7581 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7582 verifyFormat("bool b = f(g<int>) && c;"); 7583 verifyFormat("typedef void (*f)(int i) func;"); 7584 7585 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7586 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7587 // FIXME: The indentation here is not ideal. 7588 verifyFormat( 7589 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7590 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7591 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7592 } 7593 7594 TEST_F(FormatTest, FormatsFunctionTypes) { 7595 verifyFormat("A<bool()> a;"); 7596 verifyFormat("A<SomeType()> a;"); 7597 verifyFormat("A<void (*)(int, std::string)> a;"); 7598 verifyFormat("A<void *(int)>;"); 7599 verifyFormat("void *(*a)(int *, SomeType *);"); 7600 verifyFormat("int (*func)(void *);"); 7601 verifyFormat("void f() { int (*func)(void *); }"); 7602 verifyFormat("template <class CallbackClass>\n" 7603 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7604 7605 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7606 verifyGoogleFormat("void* (*a)(int);"); 7607 verifyGoogleFormat( 7608 "template <class CallbackClass>\n" 7609 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7610 7611 // Other constructs can look somewhat like function types: 7612 verifyFormat("A<sizeof(*x)> a;"); 7613 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7614 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7615 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7616 verifyFormat("int x = f(&h)();"); 7617 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7618 verifyFormat("std::function<\n" 7619 " LooooooooooongTemplatedType<\n" 7620 " SomeType>*(\n" 7621 " LooooooooooooooooongType type)>\n" 7622 " function;", 7623 getGoogleStyleWithColumns(40)); 7624 } 7625 7626 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7627 verifyFormat("A (*foo_)[6];"); 7628 verifyFormat("vector<int> (*foo_)[6];"); 7629 } 7630 7631 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7632 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7633 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7634 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7635 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7636 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7637 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7638 7639 // Different ways of ()-initializiation. 7640 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7641 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7642 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7643 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7644 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7645 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7646 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7647 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7648 7649 // Lambdas should not confuse the variable declaration heuristic. 7650 verifyFormat("LooooooooooooooooongType\n" 7651 " variable(nullptr, [](A *a) {});", 7652 getLLVMStyleWithColumns(40)); 7653 } 7654 7655 TEST_F(FormatTest, BreaksLongDeclarations) { 7656 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7657 " AnotherNameForTheLongType;"); 7658 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7659 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7660 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7661 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7662 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7663 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7664 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7665 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7666 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7667 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7668 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7669 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7670 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7671 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7672 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7673 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7674 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7675 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7676 FormatStyle Indented = getLLVMStyle(); 7677 Indented.IndentWrappedFunctionNames = true; 7678 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7679 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7680 Indented); 7681 verifyFormat( 7682 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7683 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7684 Indented); 7685 verifyFormat( 7686 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7687 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7688 Indented); 7689 verifyFormat( 7690 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7691 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7692 Indented); 7693 7694 // FIXME: Without the comment, this breaks after "(". 7695 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7696 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7697 getGoogleStyle()); 7698 7699 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7700 " int LoooooooooooooooooooongParam2) {}"); 7701 verifyFormat( 7702 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7703 " SourceLocation L, IdentifierIn *II,\n" 7704 " Type *T) {}"); 7705 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7706 "ReallyReaaallyLongFunctionName(\n" 7707 " const std::string &SomeParameter,\n" 7708 " const SomeType<string, SomeOtherTemplateParameter>\n" 7709 " &ReallyReallyLongParameterName,\n" 7710 " const SomeType<string, SomeOtherTemplateParameter>\n" 7711 " &AnotherLongParameterName) {}"); 7712 verifyFormat("template <typename A>\n" 7713 "SomeLoooooooooooooooooooooongType<\n" 7714 " typename some_namespace::SomeOtherType<A>::Type>\n" 7715 "Function() {}"); 7716 7717 verifyGoogleFormat( 7718 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7719 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7720 verifyGoogleFormat( 7721 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7722 " SourceLocation L) {}"); 7723 verifyGoogleFormat( 7724 "some_namespace::LongReturnType\n" 7725 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7726 " int first_long_parameter, int second_parameter) {}"); 7727 7728 verifyGoogleFormat("template <typename T>\n" 7729 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7730 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7731 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7732 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7733 7734 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7735 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7736 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7737 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7738 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7739 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7740 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7741 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7744 7745 verifyFormat("template <typename T> // Templates on own line.\n" 7746 "static int // Some comment.\n" 7747 "MyFunction(int a);", 7748 getLLVMStyle()); 7749 } 7750 7751 TEST_F(FormatTest, FormatsArrays) { 7752 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7753 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7754 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7755 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7756 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7757 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7758 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7759 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7760 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7761 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7762 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7763 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7764 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7765 verifyFormat( 7766 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7767 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7768 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7769 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7770 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7771 7772 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7773 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7774 verifyFormat( 7775 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 7776 " .aaaaaaa[0]\n" 7777 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7778 verifyFormat("a[::b::c];"); 7779 7780 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 7781 7782 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 7783 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 7784 } 7785 7786 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 7787 verifyFormat("(a)->b();"); 7788 verifyFormat("--a;"); 7789 } 7790 7791 TEST_F(FormatTest, HandlesIncludeDirectives) { 7792 verifyFormat("#include <string>\n" 7793 "#include <a/b/c.h>\n" 7794 "#include \"a/b/string\"\n" 7795 "#include \"string.h\"\n" 7796 "#include \"string.h\"\n" 7797 "#include <a-a>\n" 7798 "#include < path with space >\n" 7799 "#include_next <test.h>" 7800 "#include \"abc.h\" // this is included for ABC\n" 7801 "#include \"some long include\" // with a comment\n" 7802 "#include \"some very long include path\"\n" 7803 "#include <some/very/long/include/path>\n", 7804 getLLVMStyleWithColumns(35)); 7805 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 7806 EXPECT_EQ("#include <a>", format("#include<a>")); 7807 7808 verifyFormat("#import <string>"); 7809 verifyFormat("#import <a/b/c.h>"); 7810 verifyFormat("#import \"a/b/string\""); 7811 verifyFormat("#import \"string.h\""); 7812 verifyFormat("#import \"string.h\""); 7813 verifyFormat("#if __has_include(<strstream>)\n" 7814 "#include <strstream>\n" 7815 "#endif"); 7816 7817 verifyFormat("#define MY_IMPORT <a/b>"); 7818 7819 verifyFormat("#if __has_include(<a/b>)"); 7820 verifyFormat("#if __has_include_next(<a/b>)"); 7821 verifyFormat("#define F __has_include(<a/b>)"); 7822 verifyFormat("#define F __has_include_next(<a/b>)"); 7823 7824 // Protocol buffer definition or missing "#". 7825 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 7826 getLLVMStyleWithColumns(30)); 7827 7828 FormatStyle Style = getLLVMStyle(); 7829 Style.AlwaysBreakBeforeMultilineStrings = true; 7830 Style.ColumnLimit = 0; 7831 verifyFormat("#import \"abc.h\"", Style); 7832 7833 // But 'import' might also be a regular C++ namespace. 7834 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7835 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7836 } 7837 7838 //===----------------------------------------------------------------------===// 7839 // Error recovery tests. 7840 //===----------------------------------------------------------------------===// 7841 7842 TEST_F(FormatTest, IncompleteParameterLists) { 7843 FormatStyle NoBinPacking = getLLVMStyle(); 7844 NoBinPacking.BinPackParameters = false; 7845 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 7846 " double *min_x,\n" 7847 " double *max_x,\n" 7848 " double *min_y,\n" 7849 " double *max_y,\n" 7850 " double *min_z,\n" 7851 " double *max_z, ) {}", 7852 NoBinPacking); 7853 } 7854 7855 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 7856 verifyFormat("void f() { return; }\n42"); 7857 verifyFormat("void f() {\n" 7858 " if (0)\n" 7859 " return;\n" 7860 "}\n" 7861 "42"); 7862 verifyFormat("void f() { return }\n42"); 7863 verifyFormat("void f() {\n" 7864 " if (0)\n" 7865 " return\n" 7866 "}\n" 7867 "42"); 7868 } 7869 7870 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 7871 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 7872 EXPECT_EQ("void f() {\n" 7873 " if (a)\n" 7874 " return\n" 7875 "}", 7876 format("void f ( ) { if ( a ) return }")); 7877 EXPECT_EQ("namespace N {\n" 7878 "void f()\n" 7879 "}", 7880 format("namespace N { void f() }")); 7881 EXPECT_EQ("namespace N {\n" 7882 "void f() {}\n" 7883 "void g()\n" 7884 "} // namespace N", 7885 format("namespace N { void f( ) { } void g( ) }")); 7886 } 7887 7888 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 7889 verifyFormat("int aaaaaaaa =\n" 7890 " // Overlylongcomment\n" 7891 " b;", 7892 getLLVMStyleWithColumns(20)); 7893 verifyFormat("function(\n" 7894 " ShortArgument,\n" 7895 " LoooooooooooongArgument);\n", 7896 getLLVMStyleWithColumns(20)); 7897 } 7898 7899 TEST_F(FormatTest, IncorrectAccessSpecifier) { 7900 verifyFormat("public:"); 7901 verifyFormat("class A {\n" 7902 "public\n" 7903 " void f() {}\n" 7904 "};"); 7905 verifyFormat("public\n" 7906 "int qwerty;"); 7907 verifyFormat("public\n" 7908 "B {}"); 7909 verifyFormat("public\n" 7910 "{}"); 7911 verifyFormat("public\n" 7912 "B { int x; }"); 7913 } 7914 7915 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 7916 verifyFormat("{"); 7917 verifyFormat("#})"); 7918 verifyNoCrash("(/**/[:!] ?[)."); 7919 } 7920 7921 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 7922 // Found by oss-fuzz: 7923 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 7924 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7925 Style.ColumnLimit = 60; 7926 verifyNoCrash( 7927 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 7928 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 7929 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 7930 Style); 7931 } 7932 7933 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 7934 verifyFormat("do {\n}"); 7935 verifyFormat("do {\n}\n" 7936 "f();"); 7937 verifyFormat("do {\n}\n" 7938 "wheeee(fun);"); 7939 verifyFormat("do {\n" 7940 " f();\n" 7941 "}"); 7942 } 7943 7944 TEST_F(FormatTest, IncorrectCodeMissingParens) { 7945 verifyFormat("if {\n foo;\n foo();\n}"); 7946 verifyFormat("switch {\n foo;\n foo();\n}"); 7947 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 7948 verifyFormat("while {\n foo;\n foo();\n}"); 7949 verifyFormat("do {\n foo;\n foo();\n} while;"); 7950 } 7951 7952 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 7953 verifyIncompleteFormat("namespace {\n" 7954 "class Foo { Foo (\n" 7955 "};\n" 7956 "} // namespace"); 7957 } 7958 7959 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 7960 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 7961 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 7962 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 7963 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 7964 7965 EXPECT_EQ("{\n" 7966 " {\n" 7967 " breakme(\n" 7968 " qwe);\n" 7969 " }\n", 7970 format("{\n" 7971 " {\n" 7972 " breakme(qwe);\n" 7973 "}\n", 7974 getLLVMStyleWithColumns(10))); 7975 } 7976 7977 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 7978 verifyFormat("int x = {\n" 7979 " avariable,\n" 7980 " b(alongervariable)};", 7981 getLLVMStyleWithColumns(25)); 7982 } 7983 7984 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 7985 verifyFormat("return (a)(b){1, 2, 3};"); 7986 } 7987 7988 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 7989 verifyFormat("vector<int> x{1, 2, 3, 4};"); 7990 verifyFormat("vector<int> x{\n" 7991 " 1,\n" 7992 " 2,\n" 7993 " 3,\n" 7994 " 4,\n" 7995 "};"); 7996 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 7997 verifyFormat("f({1, 2});"); 7998 verifyFormat("auto v = Foo{-1};"); 7999 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 8000 verifyFormat("Class::Class : member{1, 2, 3} {}"); 8001 verifyFormat("new vector<int>{1, 2, 3};"); 8002 verifyFormat("new int[3]{1, 2, 3};"); 8003 verifyFormat("new int{1};"); 8004 verifyFormat("return {arg1, arg2};"); 8005 verifyFormat("return {arg1, SomeType{parameter}};"); 8006 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 8007 verifyFormat("new T{arg1, arg2};"); 8008 verifyFormat("f(MyMap[{composite, key}]);"); 8009 verifyFormat("class Class {\n" 8010 " T member = {arg1, arg2};\n" 8011 "};"); 8012 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 8013 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 8014 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 8015 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 8016 verifyFormat("int a = std::is_integral<int>{} + 0;"); 8017 8018 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8019 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8020 verifyFormat("auto i = decltype(x){};"); 8021 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 8022 verifyFormat("Node n{1, Node{1000}, //\n" 8023 " 2};"); 8024 verifyFormat("Aaaa aaaaaaa{\n" 8025 " {\n" 8026 " aaaa,\n" 8027 " },\n" 8028 "};"); 8029 verifyFormat("class C : public D {\n" 8030 " SomeClass SC{2};\n" 8031 "};"); 8032 verifyFormat("class C : public A {\n" 8033 " class D : public B {\n" 8034 " void f() { int i{2}; }\n" 8035 " };\n" 8036 "};"); 8037 verifyFormat("#define A {a, a},"); 8038 8039 // Avoid breaking between equal sign and opening brace 8040 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 8041 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 8042 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 8043 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 8044 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 8045 " {\"ccccccccccccccccccccc\", 2}};", 8046 AvoidBreakingFirstArgument); 8047 8048 // Binpacking only if there is no trailing comma 8049 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 8050 " cccccccccc, dddddddddd};", 8051 getLLVMStyleWithColumns(50)); 8052 verifyFormat("const Aaaaaa aaaaa = {\n" 8053 " aaaaaaaaaaa,\n" 8054 " bbbbbbbbbbb,\n" 8055 " ccccccccccc,\n" 8056 " ddddddddddd,\n" 8057 "};", 8058 getLLVMStyleWithColumns(50)); 8059 8060 // Cases where distinguising braced lists and blocks is hard. 8061 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 8062 verifyFormat("void f() {\n" 8063 " return; // comment\n" 8064 "}\n" 8065 "SomeType t;"); 8066 verifyFormat("void f() {\n" 8067 " if (a) {\n" 8068 " f();\n" 8069 " }\n" 8070 "}\n" 8071 "SomeType t;"); 8072 8073 // In combination with BinPackArguments = false. 8074 FormatStyle NoBinPacking = getLLVMStyle(); 8075 NoBinPacking.BinPackArguments = false; 8076 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 8077 " bbbbb,\n" 8078 " ccccc,\n" 8079 " ddddd,\n" 8080 " eeeee,\n" 8081 " ffffff,\n" 8082 " ggggg,\n" 8083 " hhhhhh,\n" 8084 " iiiiii,\n" 8085 " jjjjjj,\n" 8086 " kkkkkk};", 8087 NoBinPacking); 8088 verifyFormat("const Aaaaaa aaaaa = {\n" 8089 " aaaaa,\n" 8090 " bbbbb,\n" 8091 " ccccc,\n" 8092 " ddddd,\n" 8093 " eeeee,\n" 8094 " ffffff,\n" 8095 " ggggg,\n" 8096 " hhhhhh,\n" 8097 " iiiiii,\n" 8098 " jjjjjj,\n" 8099 " kkkkkk,\n" 8100 "};", 8101 NoBinPacking); 8102 verifyFormat( 8103 "const Aaaaaa aaaaa = {\n" 8104 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 8105 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 8106 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 8107 "};", 8108 NoBinPacking); 8109 8110 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8111 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 8112 " CDDDP83848_BMCR_REGISTER,\n" 8113 " CDDDP83848_BMSR_REGISTER,\n" 8114 " CDDDP83848_RBR_REGISTER};", 8115 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 8116 " CDDDP83848_BMSR_REGISTER,\n" 8117 " CDDDP83848_RBR_REGISTER};", 8118 NoBinPacking)); 8119 8120 // FIXME: The alignment of these trailing comments might be bad. Then again, 8121 // this might be utterly useless in real code. 8122 verifyFormat("Constructor::Constructor()\n" 8123 " : some_value{ //\n" 8124 " aaaaaaa, //\n" 8125 " bbbbbbb} {}"); 8126 8127 // In braced lists, the first comment is always assumed to belong to the 8128 // first element. Thus, it can be moved to the next or previous line as 8129 // appropriate. 8130 EXPECT_EQ("function({// First element:\n" 8131 " 1,\n" 8132 " // Second element:\n" 8133 " 2});", 8134 format("function({\n" 8135 " // First element:\n" 8136 " 1,\n" 8137 " // Second element:\n" 8138 " 2});")); 8139 EXPECT_EQ("std::vector<int> MyNumbers{\n" 8140 " // First element:\n" 8141 " 1,\n" 8142 " // Second element:\n" 8143 " 2};", 8144 format("std::vector<int> MyNumbers{// First element:\n" 8145 " 1,\n" 8146 " // Second element:\n" 8147 " 2};", 8148 getLLVMStyleWithColumns(30))); 8149 // A trailing comma should still lead to an enforced line break and no 8150 // binpacking. 8151 EXPECT_EQ("vector<int> SomeVector = {\n" 8152 " // aaa\n" 8153 " 1,\n" 8154 " 2,\n" 8155 "};", 8156 format("vector<int> SomeVector = { // aaa\n" 8157 " 1, 2, };")); 8158 8159 FormatStyle ExtraSpaces = getLLVMStyle(); 8160 ExtraSpaces.Cpp11BracedListStyle = false; 8161 ExtraSpaces.ColumnLimit = 75; 8162 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8163 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8164 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8165 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8166 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8167 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8168 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8169 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8170 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8171 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8172 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8173 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8174 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8175 verifyFormat("class Class {\n" 8176 " T member = { arg1, arg2 };\n" 8177 "};", 8178 ExtraSpaces); 8179 verifyFormat( 8180 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8181 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8182 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8183 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8184 ExtraSpaces); 8185 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 8186 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 8187 ExtraSpaces); 8188 verifyFormat( 8189 "someFunction(OtherParam,\n" 8190 " BracedList{ // comment 1 (Forcing interesting break)\n" 8191 " param1, param2,\n" 8192 " // comment 2\n" 8193 " param3, param4 });", 8194 ExtraSpaces); 8195 verifyFormat( 8196 "std::this_thread::sleep_for(\n" 8197 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 8198 ExtraSpaces); 8199 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 8200 " aaaaaaa,\n" 8201 " aaaaaaaaaa,\n" 8202 " aaaaa,\n" 8203 " aaaaaaaaaaaaaaa,\n" 8204 " aaa,\n" 8205 " aaaaaaaaaa,\n" 8206 " a,\n" 8207 " aaaaaaaaaaaaaaaaaaaaa,\n" 8208 " aaaaaaaaaaaa,\n" 8209 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 8210 " aaaaaaa,\n" 8211 " a};"); 8212 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 8213 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 8214 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 8215 8216 // Avoid breaking between initializer/equal sign and opening brace 8217 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 8218 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 8219 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8220 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8221 " { \"ccccccccccccccccccccc\", 2 }\n" 8222 "};", 8223 ExtraSpaces); 8224 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 8225 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8226 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8227 " { \"ccccccccccccccccccccc\", 2 }\n" 8228 "};", 8229 ExtraSpaces); 8230 8231 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 8232 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 8233 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 8234 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 8235 8236 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 8237 SpaceBetweenBraces.SpacesInAngles = true; 8238 SpaceBetweenBraces.SpacesInParentheses = true; 8239 SpaceBetweenBraces.SpacesInSquareBrackets = true; 8240 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 8241 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 8242 verifyFormat("vector< int > x{ // comment 1\n" 8243 " 1, 2, 3, 4 };", 8244 SpaceBetweenBraces); 8245 SpaceBetweenBraces.ColumnLimit = 20; 8246 EXPECT_EQ("vector< int > x{\n" 8247 " 1, 2, 3, 4 };", 8248 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8249 SpaceBetweenBraces.ColumnLimit = 24; 8250 EXPECT_EQ("vector< int > x{ 1, 2,\n" 8251 " 3, 4 };", 8252 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8253 EXPECT_EQ("vector< int > x{\n" 8254 " 1,\n" 8255 " 2,\n" 8256 " 3,\n" 8257 " 4,\n" 8258 "};", 8259 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 8260 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 8261 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 8262 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 8263 } 8264 8265 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 8266 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8267 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8268 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8269 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8270 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8271 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8272 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 8273 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8274 " 1, 22, 333, 4444, 55555, //\n" 8275 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8276 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8277 verifyFormat( 8278 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8279 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8280 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 8281 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8282 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8283 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8284 " 7777777};"); 8285 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8286 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8287 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8288 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8289 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8290 " // Separating comment.\n" 8291 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8292 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8293 " // Leading comment\n" 8294 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8295 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8296 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8297 " 1, 1, 1, 1};", 8298 getLLVMStyleWithColumns(39)); 8299 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8300 " 1, 1, 1, 1};", 8301 getLLVMStyleWithColumns(38)); 8302 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 8303 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 8304 getLLVMStyleWithColumns(43)); 8305 verifyFormat( 8306 "static unsigned SomeValues[10][3] = {\n" 8307 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 8308 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 8309 verifyFormat("static auto fields = new vector<string>{\n" 8310 " \"aaaaaaaaaaaaa\",\n" 8311 " \"aaaaaaaaaaaaa\",\n" 8312 " \"aaaaaaaaaaaa\",\n" 8313 " \"aaaaaaaaaaaaaa\",\n" 8314 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8315 " \"aaaaaaaaaaaa\",\n" 8316 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8317 "};"); 8318 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8319 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8320 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8321 " 3, cccccccccccccccccccccc};", 8322 getLLVMStyleWithColumns(60)); 8323 8324 // Trailing commas. 8325 verifyFormat("vector<int> x = {\n" 8326 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8327 "};", 8328 getLLVMStyleWithColumns(39)); 8329 verifyFormat("vector<int> x = {\n" 8330 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8331 "};", 8332 getLLVMStyleWithColumns(39)); 8333 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8334 " 1, 1, 1, 1,\n" 8335 " /**/ /**/};", 8336 getLLVMStyleWithColumns(39)); 8337 8338 // Trailing comment in the first line. 8339 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8340 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8341 " 111111111, 222222222, 3333333333, 444444444, //\n" 8342 " 11111111, 22222222, 333333333, 44444444};"); 8343 // Trailing comment in the last line. 8344 verifyFormat("int aaaaa[] = {\n" 8345 " 1, 2, 3, // comment\n" 8346 " 4, 5, 6 // comment\n" 8347 "};"); 8348 8349 // With nested lists, we should either format one item per line or all nested 8350 // lists one on line. 8351 // FIXME: For some nested lists, we can do better. 8352 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8353 " {aaaaaaaaaaaaaaaaaaa},\n" 8354 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8355 " {aaaaaaaaaaaaaaaaa}};", 8356 getLLVMStyleWithColumns(60)); 8357 verifyFormat( 8358 "SomeStruct my_struct_array = {\n" 8359 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8360 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8361 " {aaa, aaa},\n" 8362 " {aaa, aaa},\n" 8363 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8364 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8365 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8366 8367 // No column layout should be used here. 8368 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8369 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8370 8371 verifyNoCrash("a<,"); 8372 8373 // No braced initializer here. 8374 verifyFormat("void f() {\n" 8375 " struct Dummy {};\n" 8376 " f(v);\n" 8377 "}"); 8378 8379 // Long lists should be formatted in columns even if they are nested. 8380 verifyFormat( 8381 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8382 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8383 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8384 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8385 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8386 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8387 8388 // Allow "single-column" layout even if that violates the column limit. There 8389 // isn't going to be a better way. 8390 verifyFormat("std::vector<int> a = {\n" 8391 " aaaaaaaa,\n" 8392 " aaaaaaaa,\n" 8393 " aaaaaaaa,\n" 8394 " aaaaaaaa,\n" 8395 " aaaaaaaaaa,\n" 8396 " aaaaaaaa,\n" 8397 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8398 getLLVMStyleWithColumns(30)); 8399 verifyFormat("vector<int> aaaa = {\n" 8400 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8401 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8402 " aaaaaa.aaaaaaa,\n" 8403 " aaaaaa.aaaaaaa,\n" 8404 " aaaaaa.aaaaaaa,\n" 8405 " aaaaaa.aaaaaaa,\n" 8406 "};"); 8407 8408 // Don't create hanging lists. 8409 verifyFormat("someFunction(Param, {List1, List2,\n" 8410 " List3});", 8411 getLLVMStyleWithColumns(35)); 8412 verifyFormat("someFunction(Param, Param,\n" 8413 " {List1, List2,\n" 8414 " List3});", 8415 getLLVMStyleWithColumns(35)); 8416 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8417 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8418 } 8419 8420 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8421 FormatStyle DoNotMerge = getLLVMStyle(); 8422 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8423 8424 verifyFormat("void f() { return 42; }"); 8425 verifyFormat("void f() {\n" 8426 " return 42;\n" 8427 "}", 8428 DoNotMerge); 8429 verifyFormat("void f() {\n" 8430 " // Comment\n" 8431 "}"); 8432 verifyFormat("{\n" 8433 "#error {\n" 8434 " int a;\n" 8435 "}"); 8436 verifyFormat("{\n" 8437 " int a;\n" 8438 "#error {\n" 8439 "}"); 8440 verifyFormat("void f() {} // comment"); 8441 verifyFormat("void f() { int a; } // comment"); 8442 verifyFormat("void f() {\n" 8443 "} // comment", 8444 DoNotMerge); 8445 verifyFormat("void f() {\n" 8446 " int a;\n" 8447 "} // comment", 8448 DoNotMerge); 8449 verifyFormat("void f() {\n" 8450 "} // comment", 8451 getLLVMStyleWithColumns(15)); 8452 8453 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8454 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8455 8456 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8457 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8458 verifyFormat("class C {\n" 8459 " C()\n" 8460 " : iiiiiiii(nullptr),\n" 8461 " kkkkkkk(nullptr),\n" 8462 " mmmmmmm(nullptr),\n" 8463 " nnnnnnn(nullptr) {}\n" 8464 "};", 8465 getGoogleStyle()); 8466 8467 FormatStyle NoColumnLimit = getLLVMStyle(); 8468 NoColumnLimit.ColumnLimit = 0; 8469 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8470 EXPECT_EQ("class C {\n" 8471 " A() : b(0) {}\n" 8472 "};", 8473 format("class C{A():b(0){}};", NoColumnLimit)); 8474 EXPECT_EQ("A()\n" 8475 " : b(0) {\n" 8476 "}", 8477 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8478 8479 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8480 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8481 FormatStyle::SFS_None; 8482 EXPECT_EQ("A()\n" 8483 " : b(0) {\n" 8484 "}", 8485 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8486 EXPECT_EQ("A()\n" 8487 " : b(0) {\n" 8488 "}", 8489 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8490 8491 verifyFormat("#define A \\\n" 8492 " void f() { \\\n" 8493 " int i; \\\n" 8494 " }", 8495 getLLVMStyleWithColumns(20)); 8496 verifyFormat("#define A \\\n" 8497 " void f() { int i; }", 8498 getLLVMStyleWithColumns(21)); 8499 verifyFormat("#define A \\\n" 8500 " void f() { \\\n" 8501 " int i; \\\n" 8502 " } \\\n" 8503 " int j;", 8504 getLLVMStyleWithColumns(22)); 8505 verifyFormat("#define A \\\n" 8506 " void f() { int i; } \\\n" 8507 " int j;", 8508 getLLVMStyleWithColumns(23)); 8509 } 8510 8511 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8512 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8513 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8514 verifyFormat("class C {\n" 8515 " int f() {}\n" 8516 "};", 8517 MergeEmptyOnly); 8518 verifyFormat("class C {\n" 8519 " int f() {\n" 8520 " return 42;\n" 8521 " }\n" 8522 "};", 8523 MergeEmptyOnly); 8524 verifyFormat("int f() {}", MergeEmptyOnly); 8525 verifyFormat("int f() {\n" 8526 " return 42;\n" 8527 "}", 8528 MergeEmptyOnly); 8529 8530 // Also verify behavior when BraceWrapping.AfterFunction = true 8531 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8532 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8533 verifyFormat("int f() {}", MergeEmptyOnly); 8534 verifyFormat("class C {\n" 8535 " int f() {}\n" 8536 "};", 8537 MergeEmptyOnly); 8538 } 8539 8540 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8541 FormatStyle MergeInlineOnly = getLLVMStyle(); 8542 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8543 verifyFormat("class C {\n" 8544 " int f() { return 42; }\n" 8545 "};", 8546 MergeInlineOnly); 8547 verifyFormat("int f() {\n" 8548 " return 42;\n" 8549 "}", 8550 MergeInlineOnly); 8551 8552 // SFS_Inline implies SFS_Empty 8553 verifyFormat("class C {\n" 8554 " int f() {}\n" 8555 "};", 8556 MergeInlineOnly); 8557 verifyFormat("int f() {}", MergeInlineOnly); 8558 8559 // Also verify behavior when BraceWrapping.AfterFunction = true 8560 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8561 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8562 verifyFormat("class C {\n" 8563 " int f() { return 42; }\n" 8564 "};", 8565 MergeInlineOnly); 8566 verifyFormat("int f()\n" 8567 "{\n" 8568 " return 42;\n" 8569 "}", 8570 MergeInlineOnly); 8571 8572 // SFS_Inline implies SFS_Empty 8573 verifyFormat("int f() {}", MergeInlineOnly); 8574 verifyFormat("class C {\n" 8575 " int f() {}\n" 8576 "};", 8577 MergeInlineOnly); 8578 } 8579 8580 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8581 FormatStyle MergeInlineOnly = getLLVMStyle(); 8582 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8583 FormatStyle::SFS_InlineOnly; 8584 verifyFormat("class C {\n" 8585 " int f() { return 42; }\n" 8586 "};", 8587 MergeInlineOnly); 8588 verifyFormat("int f() {\n" 8589 " return 42;\n" 8590 "}", 8591 MergeInlineOnly); 8592 8593 // SFS_InlineOnly does not imply SFS_Empty 8594 verifyFormat("class C {\n" 8595 " int f() {}\n" 8596 "};", 8597 MergeInlineOnly); 8598 verifyFormat("int f() {\n" 8599 "}", 8600 MergeInlineOnly); 8601 8602 // Also verify behavior when BraceWrapping.AfterFunction = true 8603 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8604 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8605 verifyFormat("class C {\n" 8606 " int f() { return 42; }\n" 8607 "};", 8608 MergeInlineOnly); 8609 verifyFormat("int f()\n" 8610 "{\n" 8611 " return 42;\n" 8612 "}", 8613 MergeInlineOnly); 8614 8615 // SFS_InlineOnly does not imply SFS_Empty 8616 verifyFormat("int f()\n" 8617 "{\n" 8618 "}", 8619 MergeInlineOnly); 8620 verifyFormat("class C {\n" 8621 " int f() {}\n" 8622 "};", 8623 MergeInlineOnly); 8624 } 8625 8626 TEST_F(FormatTest, SplitEmptyFunction) { 8627 FormatStyle Style = getLLVMStyle(); 8628 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8629 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8630 Style.BraceWrapping.AfterFunction = true; 8631 Style.BraceWrapping.SplitEmptyFunction = false; 8632 Style.ColumnLimit = 40; 8633 8634 verifyFormat("int f()\n" 8635 "{}", 8636 Style); 8637 verifyFormat("int f()\n" 8638 "{\n" 8639 " return 42;\n" 8640 "}", 8641 Style); 8642 verifyFormat("int f()\n" 8643 "{\n" 8644 " // some comment\n" 8645 "}", 8646 Style); 8647 8648 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8649 verifyFormat("int f() {}", Style); 8650 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8651 "{}", 8652 Style); 8653 verifyFormat("int f()\n" 8654 "{\n" 8655 " return 0;\n" 8656 "}", 8657 Style); 8658 8659 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8660 verifyFormat("class Foo {\n" 8661 " int f() {}\n" 8662 "};\n", 8663 Style); 8664 verifyFormat("class Foo {\n" 8665 " int f() { return 0; }\n" 8666 "};\n", 8667 Style); 8668 verifyFormat("class Foo {\n" 8669 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8670 " {}\n" 8671 "};\n", 8672 Style); 8673 verifyFormat("class Foo {\n" 8674 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8675 " {\n" 8676 " return 0;\n" 8677 " }\n" 8678 "};\n", 8679 Style); 8680 8681 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8682 verifyFormat("int f() {}", Style); 8683 verifyFormat("int f() { return 0; }", Style); 8684 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8685 "{}", 8686 Style); 8687 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8688 "{\n" 8689 " return 0;\n" 8690 "}", 8691 Style); 8692 } 8693 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8694 FormatStyle Style = getLLVMStyle(); 8695 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8696 verifyFormat("#ifdef A\n" 8697 "int f() {}\n" 8698 "#else\n" 8699 "int g() {}\n" 8700 "#endif", 8701 Style); 8702 } 8703 8704 TEST_F(FormatTest, SplitEmptyClass) { 8705 FormatStyle Style = getLLVMStyle(); 8706 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8707 Style.BraceWrapping.AfterClass = true; 8708 Style.BraceWrapping.SplitEmptyRecord = false; 8709 8710 verifyFormat("class Foo\n" 8711 "{};", 8712 Style); 8713 verifyFormat("/* something */ class Foo\n" 8714 "{};", 8715 Style); 8716 verifyFormat("template <typename X> class Foo\n" 8717 "{};", 8718 Style); 8719 verifyFormat("class Foo\n" 8720 "{\n" 8721 " Foo();\n" 8722 "};", 8723 Style); 8724 verifyFormat("typedef class Foo\n" 8725 "{\n" 8726 "} Foo_t;", 8727 Style); 8728 } 8729 8730 TEST_F(FormatTest, SplitEmptyStruct) { 8731 FormatStyle Style = getLLVMStyle(); 8732 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8733 Style.BraceWrapping.AfterStruct = true; 8734 Style.BraceWrapping.SplitEmptyRecord = false; 8735 8736 verifyFormat("struct Foo\n" 8737 "{};", 8738 Style); 8739 verifyFormat("/* something */ struct Foo\n" 8740 "{};", 8741 Style); 8742 verifyFormat("template <typename X> struct Foo\n" 8743 "{};", 8744 Style); 8745 verifyFormat("struct Foo\n" 8746 "{\n" 8747 " Foo();\n" 8748 "};", 8749 Style); 8750 verifyFormat("typedef struct Foo\n" 8751 "{\n" 8752 "} Foo_t;", 8753 Style); 8754 // typedef struct Bar {} Bar_t; 8755 } 8756 8757 TEST_F(FormatTest, SplitEmptyUnion) { 8758 FormatStyle Style = getLLVMStyle(); 8759 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8760 Style.BraceWrapping.AfterUnion = true; 8761 Style.BraceWrapping.SplitEmptyRecord = false; 8762 8763 verifyFormat("union Foo\n" 8764 "{};", 8765 Style); 8766 verifyFormat("/* something */ union Foo\n" 8767 "{};", 8768 Style); 8769 verifyFormat("union Foo\n" 8770 "{\n" 8771 " A,\n" 8772 "};", 8773 Style); 8774 verifyFormat("typedef union Foo\n" 8775 "{\n" 8776 "} Foo_t;", 8777 Style); 8778 } 8779 8780 TEST_F(FormatTest, SplitEmptyNamespace) { 8781 FormatStyle Style = getLLVMStyle(); 8782 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8783 Style.BraceWrapping.AfterNamespace = true; 8784 Style.BraceWrapping.SplitEmptyNamespace = false; 8785 8786 verifyFormat("namespace Foo\n" 8787 "{};", 8788 Style); 8789 verifyFormat("/* something */ namespace Foo\n" 8790 "{};", 8791 Style); 8792 verifyFormat("inline namespace Foo\n" 8793 "{};", 8794 Style); 8795 verifyFormat("/* something */ inline namespace Foo\n" 8796 "{};", 8797 Style); 8798 verifyFormat("export namespace Foo\n" 8799 "{};", 8800 Style); 8801 verifyFormat("namespace Foo\n" 8802 "{\n" 8803 "void Bar();\n" 8804 "};", 8805 Style); 8806 } 8807 8808 TEST_F(FormatTest, NeverMergeShortRecords) { 8809 FormatStyle Style = getLLVMStyle(); 8810 8811 verifyFormat("class Foo {\n" 8812 " Foo();\n" 8813 "};", 8814 Style); 8815 verifyFormat("typedef class Foo {\n" 8816 " Foo();\n" 8817 "} Foo_t;", 8818 Style); 8819 verifyFormat("struct Foo {\n" 8820 " Foo();\n" 8821 "};", 8822 Style); 8823 verifyFormat("typedef struct Foo {\n" 8824 " Foo();\n" 8825 "} Foo_t;", 8826 Style); 8827 verifyFormat("union Foo {\n" 8828 " A,\n" 8829 "};", 8830 Style); 8831 verifyFormat("typedef union Foo {\n" 8832 " A,\n" 8833 "} Foo_t;", 8834 Style); 8835 verifyFormat("namespace Foo {\n" 8836 "void Bar();\n" 8837 "};", 8838 Style); 8839 8840 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8841 Style.BraceWrapping.AfterClass = true; 8842 Style.BraceWrapping.AfterStruct = true; 8843 Style.BraceWrapping.AfterUnion = true; 8844 Style.BraceWrapping.AfterNamespace = true; 8845 verifyFormat("class Foo\n" 8846 "{\n" 8847 " Foo();\n" 8848 "};", 8849 Style); 8850 verifyFormat("typedef class Foo\n" 8851 "{\n" 8852 " Foo();\n" 8853 "} Foo_t;", 8854 Style); 8855 verifyFormat("struct Foo\n" 8856 "{\n" 8857 " Foo();\n" 8858 "};", 8859 Style); 8860 verifyFormat("typedef struct Foo\n" 8861 "{\n" 8862 " Foo();\n" 8863 "} Foo_t;", 8864 Style); 8865 verifyFormat("union Foo\n" 8866 "{\n" 8867 " A,\n" 8868 "};", 8869 Style); 8870 verifyFormat("typedef union Foo\n" 8871 "{\n" 8872 " A,\n" 8873 "} Foo_t;", 8874 Style); 8875 verifyFormat("namespace Foo\n" 8876 "{\n" 8877 "void Bar();\n" 8878 "};", 8879 Style); 8880 } 8881 8882 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 8883 // Elaborate type variable declarations. 8884 verifyFormat("struct foo a = {bar};\nint n;"); 8885 verifyFormat("class foo a = {bar};\nint n;"); 8886 verifyFormat("union foo a = {bar};\nint n;"); 8887 8888 // Elaborate types inside function definitions. 8889 verifyFormat("struct foo f() {}\nint n;"); 8890 verifyFormat("class foo f() {}\nint n;"); 8891 verifyFormat("union foo f() {}\nint n;"); 8892 8893 // Templates. 8894 verifyFormat("template <class X> void f() {}\nint n;"); 8895 verifyFormat("template <struct X> void f() {}\nint n;"); 8896 verifyFormat("template <union X> void f() {}\nint n;"); 8897 8898 // Actual definitions... 8899 verifyFormat("struct {\n} n;"); 8900 verifyFormat( 8901 "template <template <class T, class Y>, class Z> class X {\n} n;"); 8902 verifyFormat("union Z {\n int n;\n} x;"); 8903 verifyFormat("class MACRO Z {\n} n;"); 8904 verifyFormat("class MACRO(X) Z {\n} n;"); 8905 verifyFormat("class __attribute__(X) Z {\n} n;"); 8906 verifyFormat("class __declspec(X) Z {\n} n;"); 8907 verifyFormat("class A##B##C {\n} n;"); 8908 verifyFormat("class alignas(16) Z {\n} n;"); 8909 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 8910 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 8911 8912 // Redefinition from nested context: 8913 verifyFormat("class A::B::C {\n} n;"); 8914 8915 // Template definitions. 8916 verifyFormat( 8917 "template <typename F>\n" 8918 "Matcher(const Matcher<F> &Other,\n" 8919 " typename enable_if_c<is_base_of<F, T>::value &&\n" 8920 " !is_same<F, T>::value>::type * = 0)\n" 8921 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 8922 8923 // FIXME: This is still incorrectly handled at the formatter side. 8924 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 8925 verifyFormat("int i = SomeFunction(a<b, a> b);"); 8926 8927 // FIXME: 8928 // This now gets parsed incorrectly as class definition. 8929 // verifyFormat("class A<int> f() {\n}\nint n;"); 8930 8931 // Elaborate types where incorrectly parsing the structural element would 8932 // break the indent. 8933 verifyFormat("if (true)\n" 8934 " class X x;\n" 8935 "else\n" 8936 " f();\n"); 8937 8938 // This is simply incomplete. Formatting is not important, but must not crash. 8939 verifyFormat("class A:"); 8940 } 8941 8942 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 8943 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 8944 format("#error Leave all white!!!!! space* alone!\n")); 8945 EXPECT_EQ( 8946 "#warning Leave all white!!!!! space* alone!\n", 8947 format("#warning Leave all white!!!!! space* alone!\n")); 8948 EXPECT_EQ("#error 1", format(" # error 1")); 8949 EXPECT_EQ("#warning 1", format(" # warning 1")); 8950 } 8951 8952 TEST_F(FormatTest, FormatHashIfExpressions) { 8953 verifyFormat("#if AAAA && BBBB"); 8954 verifyFormat("#if (AAAA && BBBB)"); 8955 verifyFormat("#elif (AAAA && BBBB)"); 8956 // FIXME: Come up with a better indentation for #elif. 8957 verifyFormat( 8958 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 8959 " defined(BBBBBBBB)\n" 8960 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 8961 " defined(BBBBBBBB)\n" 8962 "#endif", 8963 getLLVMStyleWithColumns(65)); 8964 } 8965 8966 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 8967 FormatStyle AllowsMergedIf = getGoogleStyle(); 8968 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 8969 FormatStyle::SIS_WithoutElse; 8970 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 8971 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 8972 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 8973 EXPECT_EQ("if (true) return 42;", 8974 format("if (true)\nreturn 42;", AllowsMergedIf)); 8975 FormatStyle ShortMergedIf = AllowsMergedIf; 8976 ShortMergedIf.ColumnLimit = 25; 8977 verifyFormat("#define A \\\n" 8978 " if (true) return 42;", 8979 ShortMergedIf); 8980 verifyFormat("#define A \\\n" 8981 " f(); \\\n" 8982 " if (true)\n" 8983 "#define B", 8984 ShortMergedIf); 8985 verifyFormat("#define A \\\n" 8986 " f(); \\\n" 8987 " if (true)\n" 8988 "g();", 8989 ShortMergedIf); 8990 verifyFormat("{\n" 8991 "#ifdef A\n" 8992 " // Comment\n" 8993 " if (true) continue;\n" 8994 "#endif\n" 8995 " // Comment\n" 8996 " if (true) continue;\n" 8997 "}", 8998 ShortMergedIf); 8999 ShortMergedIf.ColumnLimit = 33; 9000 verifyFormat("#define A \\\n" 9001 " if constexpr (true) return 42;", 9002 ShortMergedIf); 9003 verifyFormat("#define A \\\n" 9004 " if CONSTEXPR (true) return 42;", 9005 ShortMergedIf); 9006 ShortMergedIf.ColumnLimit = 29; 9007 verifyFormat("#define A \\\n" 9008 " if (aaaaaaaaaa) return 1; \\\n" 9009 " return 2;", 9010 ShortMergedIf); 9011 ShortMergedIf.ColumnLimit = 28; 9012 verifyFormat("#define A \\\n" 9013 " if (aaaaaaaaaa) \\\n" 9014 " return 1; \\\n" 9015 " return 2;", 9016 ShortMergedIf); 9017 verifyFormat("#define A \\\n" 9018 " if constexpr (aaaaaaa) \\\n" 9019 " return 1; \\\n" 9020 " return 2;", 9021 ShortMergedIf); 9022 verifyFormat("#define A \\\n" 9023 " if CONSTEXPR (aaaaaaa) \\\n" 9024 " return 1; \\\n" 9025 " return 2;", 9026 ShortMergedIf); 9027 } 9028 9029 TEST_F(FormatTest, FormatStarDependingOnContext) { 9030 verifyFormat("void f(int *a);"); 9031 verifyFormat("void f() { f(fint * b); }"); 9032 verifyFormat("class A {\n void f(int *a);\n};"); 9033 verifyFormat("class A {\n int *a;\n};"); 9034 verifyFormat("namespace a {\n" 9035 "namespace b {\n" 9036 "class A {\n" 9037 " void f() {}\n" 9038 " int *a;\n" 9039 "};\n" 9040 "} // namespace b\n" 9041 "} // namespace a"); 9042 } 9043 9044 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 9045 verifyFormat("while"); 9046 verifyFormat("operator"); 9047 } 9048 9049 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 9050 // This code would be painfully slow to format if we didn't skip it. 9051 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 9052 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9053 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9054 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9055 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9056 "A(1, 1)\n" 9057 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 9058 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9059 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9060 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9061 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9062 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9063 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9064 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9065 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9066 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 9067 // Deeply nested part is untouched, rest is formatted. 9068 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 9069 format(std::string("int i;\n") + Code + "int j;\n", 9070 getLLVMStyle(), SC_ExpectIncomplete)); 9071 } 9072 9073 //===----------------------------------------------------------------------===// 9074 // Objective-C tests. 9075 //===----------------------------------------------------------------------===// 9076 9077 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 9078 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 9079 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 9080 format("-(NSUInteger)indexOfObject:(id)anObject;")); 9081 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 9082 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 9083 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 9084 format("-(NSInteger)Method3:(id)anObject;")); 9085 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 9086 format("-(NSInteger)Method4:(id)anObject;")); 9087 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 9088 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 9089 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 9090 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 9091 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9092 "forAllCells:(BOOL)flag;", 9093 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9094 "forAllCells:(BOOL)flag;")); 9095 9096 // Very long objectiveC method declaration. 9097 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 9098 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 9099 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 9100 " inRange:(NSRange)range\n" 9101 " outRange:(NSRange)out_range\n" 9102 " outRange1:(NSRange)out_range1\n" 9103 " outRange2:(NSRange)out_range2\n" 9104 " outRange3:(NSRange)out_range3\n" 9105 " outRange4:(NSRange)out_range4\n" 9106 " outRange5:(NSRange)out_range5\n" 9107 " outRange6:(NSRange)out_range6\n" 9108 " outRange7:(NSRange)out_range7\n" 9109 " outRange8:(NSRange)out_range8\n" 9110 " outRange9:(NSRange)out_range9;"); 9111 9112 // When the function name has to be wrapped. 9113 FormatStyle Style = getLLVMStyle(); 9114 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 9115 // and always indents instead. 9116 Style.IndentWrappedFunctionNames = false; 9117 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9118 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 9119 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 9120 "}", 9121 Style); 9122 Style.IndentWrappedFunctionNames = true; 9123 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9124 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 9125 " anotherName:(NSString)dddddddddddddd {\n" 9126 "}", 9127 Style); 9128 9129 verifyFormat("- (int)sum:(vector<int>)numbers;"); 9130 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 9131 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 9132 // protocol lists (but not for template classes): 9133 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 9134 9135 verifyFormat("- (int (*)())foo:(int (*)())f;"); 9136 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 9137 9138 // If there's no return type (very rare in practice!), LLVM and Google style 9139 // agree. 9140 verifyFormat("- foo;"); 9141 verifyFormat("- foo:(int)f;"); 9142 verifyGoogleFormat("- foo:(int)foo;"); 9143 } 9144 9145 TEST_F(FormatTest, BreaksStringLiterals) { 9146 EXPECT_EQ("\"some text \"\n" 9147 "\"other\";", 9148 format("\"some text other\";", getLLVMStyleWithColumns(12))); 9149 EXPECT_EQ("\"some text \"\n" 9150 "\"other\";", 9151 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 9152 EXPECT_EQ( 9153 "#define A \\\n" 9154 " \"some \" \\\n" 9155 " \"text \" \\\n" 9156 " \"other\";", 9157 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 9158 EXPECT_EQ( 9159 "#define A \\\n" 9160 " \"so \" \\\n" 9161 " \"text \" \\\n" 9162 " \"other\";", 9163 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 9164 9165 EXPECT_EQ("\"some text\"", 9166 format("\"some text\"", getLLVMStyleWithColumns(1))); 9167 EXPECT_EQ("\"some text\"", 9168 format("\"some text\"", getLLVMStyleWithColumns(11))); 9169 EXPECT_EQ("\"some \"\n" 9170 "\"text\"", 9171 format("\"some text\"", getLLVMStyleWithColumns(10))); 9172 EXPECT_EQ("\"some \"\n" 9173 "\"text\"", 9174 format("\"some text\"", getLLVMStyleWithColumns(7))); 9175 EXPECT_EQ("\"some\"\n" 9176 "\" tex\"\n" 9177 "\"t\"", 9178 format("\"some text\"", getLLVMStyleWithColumns(6))); 9179 EXPECT_EQ("\"some\"\n" 9180 "\" tex\"\n" 9181 "\" and\"", 9182 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 9183 EXPECT_EQ("\"some\"\n" 9184 "\"/tex\"\n" 9185 "\"/and\"", 9186 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 9187 9188 EXPECT_EQ("variable =\n" 9189 " \"long string \"\n" 9190 " \"literal\";", 9191 format("variable = \"long string literal\";", 9192 getLLVMStyleWithColumns(20))); 9193 9194 EXPECT_EQ("variable = f(\n" 9195 " \"long string \"\n" 9196 " \"literal\",\n" 9197 " short,\n" 9198 " loooooooooooooooooooong);", 9199 format("variable = f(\"long string literal\", short, " 9200 "loooooooooooooooooooong);", 9201 getLLVMStyleWithColumns(20))); 9202 9203 EXPECT_EQ( 9204 "f(g(\"long string \"\n" 9205 " \"literal\"),\n" 9206 " b);", 9207 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 9208 EXPECT_EQ("f(g(\"long string \"\n" 9209 " \"literal\",\n" 9210 " a),\n" 9211 " b);", 9212 format("f(g(\"long string literal\", a), b);", 9213 getLLVMStyleWithColumns(20))); 9214 EXPECT_EQ( 9215 "f(\"one two\".split(\n" 9216 " variable));", 9217 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 9218 EXPECT_EQ("f(\"one two three four five six \"\n" 9219 " \"seven\".split(\n" 9220 " really_looooong_variable));", 9221 format("f(\"one two three four five six seven\"." 9222 "split(really_looooong_variable));", 9223 getLLVMStyleWithColumns(33))); 9224 9225 EXPECT_EQ("f(\"some \"\n" 9226 " \"text\",\n" 9227 " other);", 9228 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 9229 9230 // Only break as a last resort. 9231 verifyFormat( 9232 "aaaaaaaaaaaaaaaaaaaa(\n" 9233 " aaaaaaaaaaaaaaaaaaaa,\n" 9234 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 9235 9236 EXPECT_EQ("\"splitmea\"\n" 9237 "\"trandomp\"\n" 9238 "\"oint\"", 9239 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 9240 9241 EXPECT_EQ("\"split/\"\n" 9242 "\"pathat/\"\n" 9243 "\"slashes\"", 9244 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9245 9246 EXPECT_EQ("\"split/\"\n" 9247 "\"pathat/\"\n" 9248 "\"slashes\"", 9249 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9250 EXPECT_EQ("\"split at \"\n" 9251 "\"spaces/at/\"\n" 9252 "\"slashes.at.any$\"\n" 9253 "\"non-alphanumeric%\"\n" 9254 "\"1111111111characte\"\n" 9255 "\"rs\"", 9256 format("\"split at " 9257 "spaces/at/" 9258 "slashes.at." 9259 "any$non-" 9260 "alphanumeric%" 9261 "1111111111characte" 9262 "rs\"", 9263 getLLVMStyleWithColumns(20))); 9264 9265 // Verify that splitting the strings understands 9266 // Style::AlwaysBreakBeforeMultilineStrings. 9267 EXPECT_EQ("aaaaaaaaaaaa(\n" 9268 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 9269 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 9270 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 9271 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9272 "aaaaaaaaaaaaaaaaaaaaaa\");", 9273 getGoogleStyle())); 9274 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9275 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9276 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9277 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9278 "aaaaaaaaaaaaaaaaaaaaaa\";", 9279 getGoogleStyle())); 9280 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9281 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9282 format("llvm::outs() << " 9283 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 9284 "aaaaaaaaaaaaaaaaaaa\";")); 9285 EXPECT_EQ("ffff(\n" 9286 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9287 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9288 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 9289 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9290 getGoogleStyle())); 9291 9292 FormatStyle Style = getLLVMStyleWithColumns(12); 9293 Style.BreakStringLiterals = false; 9294 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 9295 9296 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 9297 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9298 EXPECT_EQ("#define A \\\n" 9299 " \"some \" \\\n" 9300 " \"text \" \\\n" 9301 " \"other\";", 9302 format("#define A \"some text other\";", AlignLeft)); 9303 } 9304 9305 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 9306 EXPECT_EQ("C a = \"some more \"\n" 9307 " \"text\";", 9308 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9309 } 9310 9311 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9312 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9313 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9314 EXPECT_EQ("int i = a(b());", 9315 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9316 } 9317 9318 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9319 EXPECT_EQ( 9320 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9321 "(\n" 9322 " \"x\t\");", 9323 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9324 "aaaaaaa(" 9325 "\"x\t\");")); 9326 } 9327 9328 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9329 EXPECT_EQ( 9330 "u8\"utf8 string \"\n" 9331 "u8\"literal\";", 9332 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9333 EXPECT_EQ( 9334 "u\"utf16 string \"\n" 9335 "u\"literal\";", 9336 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9337 EXPECT_EQ( 9338 "U\"utf32 string \"\n" 9339 "U\"literal\";", 9340 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9341 EXPECT_EQ("L\"wide string \"\n" 9342 "L\"literal\";", 9343 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9344 EXPECT_EQ("@\"NSString \"\n" 9345 "@\"literal\";", 9346 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9347 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9348 9349 // This input makes clang-format try to split the incomplete unicode escape 9350 // sequence, which used to lead to a crasher. 9351 verifyNoCrash( 9352 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9353 getLLVMStyleWithColumns(60)); 9354 } 9355 9356 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9357 FormatStyle Style = getGoogleStyleWithColumns(15); 9358 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9359 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9360 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9361 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9362 EXPECT_EQ("u8R\"x(raw literal)x\";", 9363 format("u8R\"x(raw literal)x\";", Style)); 9364 } 9365 9366 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9367 FormatStyle Style = getLLVMStyleWithColumns(20); 9368 EXPECT_EQ( 9369 "_T(\"aaaaaaaaaaaaaa\")\n" 9370 "_T(\"aaaaaaaaaaaaaa\")\n" 9371 "_T(\"aaaaaaaaaaaa\")", 9372 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9373 EXPECT_EQ("f(x,\n" 9374 " _T(\"aaaaaaaaaaaa\")\n" 9375 " _T(\"aaa\"),\n" 9376 " z);", 9377 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9378 9379 // FIXME: Handle embedded spaces in one iteration. 9380 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9381 // "_T(\"aaaaaaaaaaaaa\")\n" 9382 // "_T(\"aaaaaaaaaaaaa\")\n" 9383 // "_T(\"a\")", 9384 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9385 // getLLVMStyleWithColumns(20))); 9386 EXPECT_EQ( 9387 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9388 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9389 EXPECT_EQ("f(\n" 9390 "#if !TEST\n" 9391 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9392 "#endif\n" 9393 ");", 9394 format("f(\n" 9395 "#if !TEST\n" 9396 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9397 "#endif\n" 9398 ");")); 9399 EXPECT_EQ("f(\n" 9400 "\n" 9401 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9402 format("f(\n" 9403 "\n" 9404 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9405 } 9406 9407 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9408 // In a function call with two operands, the second can be broken with no line 9409 // break before it. 9410 EXPECT_EQ( 9411 "func(a, \"long long \"\n" 9412 " \"long long\");", 9413 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 9414 // In a function call with three operands, the second must be broken with a 9415 // line break before it. 9416 EXPECT_EQ("func(a,\n" 9417 " \"long long long \"\n" 9418 " \"long\",\n" 9419 " c);", 9420 format("func(a, \"long long long long\", c);", 9421 getLLVMStyleWithColumns(24))); 9422 // In a function call with three operands, the third must be broken with a 9423 // line break before it. 9424 EXPECT_EQ("func(a, b,\n" 9425 " \"long long long \"\n" 9426 " \"long\");", 9427 format("func(a, b, \"long long long long\");", 9428 getLLVMStyleWithColumns(24))); 9429 // In a function call with three operands, both the second and the third must 9430 // be broken with a line break before them. 9431 EXPECT_EQ("func(a,\n" 9432 " \"long long long \"\n" 9433 " \"long\",\n" 9434 " \"long long long \"\n" 9435 " \"long\");", 9436 format("func(a, \"long long long long\", \"long long long long\");", 9437 getLLVMStyleWithColumns(24))); 9438 // In a chain of << with two operands, the second can be broken with no line 9439 // break before it. 9440 EXPECT_EQ("a << \"line line \"\n" 9441 " \"line\";", 9442 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 9443 // In a chain of << with three operands, the second can be broken with no line 9444 // break before it. 9445 EXPECT_EQ( 9446 "abcde << \"line \"\n" 9447 " \"line line\"\n" 9448 " << c;", 9449 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 9450 // In a chain of << with three operands, the third must be broken with a line 9451 // break before it. 9452 EXPECT_EQ( 9453 "a << b\n" 9454 " << \"line line \"\n" 9455 " \"line\";", 9456 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 9457 // In a chain of << with three operands, the second can be broken with no line 9458 // break before it and the third must be broken with a line break before it. 9459 EXPECT_EQ("abcd << \"line line \"\n" 9460 " \"line\"\n" 9461 " << \"line line \"\n" 9462 " \"line\";", 9463 format("abcd << \"line line line\" << \"line line line\";", 9464 getLLVMStyleWithColumns(20))); 9465 // In a chain of binary operators with two operands, the second can be broken 9466 // with no line break before it. 9467 EXPECT_EQ( 9468 "abcd + \"line line \"\n" 9469 " \"line line\";", 9470 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 9471 // In a chain of binary operators with three operands, the second must be 9472 // broken with a line break before it. 9473 EXPECT_EQ("abcd +\n" 9474 " \"line line \"\n" 9475 " \"line line\" +\n" 9476 " e;", 9477 format("abcd + \"line line line line\" + e;", 9478 getLLVMStyleWithColumns(20))); 9479 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9480 // the first must be broken with a line break before it. 9481 FormatStyle Style = getLLVMStyleWithColumns(25); 9482 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9483 EXPECT_EQ("someFunction(\n" 9484 " \"long long long \"\n" 9485 " \"long\",\n" 9486 " a);", 9487 format("someFunction(\"long long long long\", a);", Style)); 9488 } 9489 9490 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9491 EXPECT_EQ( 9492 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9493 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9495 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9498 } 9499 9500 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9501 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9502 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9503 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9504 "multiline raw string literal xxxxxxxxxxxxxx\n" 9505 ")x\",\n" 9506 " a),\n" 9507 " b);", 9508 format("fffffffffff(g(R\"x(\n" 9509 "multiline raw string literal xxxxxxxxxxxxxx\n" 9510 ")x\", a), b);", 9511 getGoogleStyleWithColumns(20))); 9512 EXPECT_EQ("fffffffffff(\n" 9513 " g(R\"x(qqq\n" 9514 "multiline raw string literal xxxxxxxxxxxxxx\n" 9515 ")x\",\n" 9516 " a),\n" 9517 " b);", 9518 format("fffffffffff(g(R\"x(qqq\n" 9519 "multiline raw string literal xxxxxxxxxxxxxx\n" 9520 ")x\", a), b);", 9521 getGoogleStyleWithColumns(20))); 9522 9523 EXPECT_EQ("fffffffffff(R\"x(\n" 9524 "multiline raw string literal xxxxxxxxxxxxxx\n" 9525 ")x\");", 9526 format("fffffffffff(R\"x(\n" 9527 "multiline raw string literal xxxxxxxxxxxxxx\n" 9528 ")x\");", 9529 getGoogleStyleWithColumns(20))); 9530 EXPECT_EQ("fffffffffff(R\"x(\n" 9531 "multiline raw string literal xxxxxxxxxxxxxx\n" 9532 ")x\" + bbbbbb);", 9533 format("fffffffffff(R\"x(\n" 9534 "multiline raw string literal xxxxxxxxxxxxxx\n" 9535 ")x\" + bbbbbb);", 9536 getGoogleStyleWithColumns(20))); 9537 EXPECT_EQ("fffffffffff(\n" 9538 " R\"x(\n" 9539 "multiline raw string literal xxxxxxxxxxxxxx\n" 9540 ")x\" +\n" 9541 " bbbbbb);", 9542 format("fffffffffff(\n" 9543 " R\"x(\n" 9544 "multiline raw string literal xxxxxxxxxxxxxx\n" 9545 ")x\" + bbbbbb);", 9546 getGoogleStyleWithColumns(20))); 9547 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9548 format("fffffffffff(\n" 9549 " R\"(single line raw string)\" + bbbbbb);")); 9550 } 9551 9552 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9553 verifyFormat("string a = \"unterminated;"); 9554 EXPECT_EQ("function(\"unterminated,\n" 9555 " OtherParameter);", 9556 format("function( \"unterminated,\n" 9557 " OtherParameter);")); 9558 } 9559 9560 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9561 FormatStyle Style = getLLVMStyle(); 9562 Style.Standard = FormatStyle::LS_Cpp03; 9563 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9564 format("#define x(_a) printf(\"foo\"_a);", Style)); 9565 } 9566 9567 TEST_F(FormatTest, CppLexVersion) { 9568 FormatStyle Style = getLLVMStyle(); 9569 // Formatting of x * y differs if x is a type. 9570 verifyFormat("void foo() { MACRO(a * b); }", Style); 9571 verifyFormat("void foo() { MACRO(int *b); }", Style); 9572 9573 // LLVM style uses latest lexer. 9574 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 9575 Style.Standard = FormatStyle::LS_Cpp17; 9576 // But in c++17, char8_t isn't a keyword. 9577 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 9578 } 9579 9580 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9581 9582 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9583 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9584 " \"ddeeefff\");", 9585 format("someFunction(\"aaabbbcccdddeeefff\");", 9586 getLLVMStyleWithColumns(25))); 9587 EXPECT_EQ("someFunction1234567890(\n" 9588 " \"aaabbbcccdddeeefff\");", 9589 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9590 getLLVMStyleWithColumns(26))); 9591 EXPECT_EQ("someFunction1234567890(\n" 9592 " \"aaabbbcccdddeeeff\"\n" 9593 " \"f\");", 9594 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9595 getLLVMStyleWithColumns(25))); 9596 EXPECT_EQ("someFunction1234567890(\n" 9597 " \"aaabbbcccdddeeeff\"\n" 9598 " \"f\");", 9599 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9600 getLLVMStyleWithColumns(24))); 9601 EXPECT_EQ("someFunction(\n" 9602 " \"aaabbbcc ddde \"\n" 9603 " \"efff\");", 9604 format("someFunction(\"aaabbbcc ddde efff\");", 9605 getLLVMStyleWithColumns(25))); 9606 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9607 " \"ddeeefff\");", 9608 format("someFunction(\"aaabbbccc ddeeefff\");", 9609 getLLVMStyleWithColumns(25))); 9610 EXPECT_EQ("someFunction1234567890(\n" 9611 " \"aaabb \"\n" 9612 " \"cccdddeeefff\");", 9613 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9614 getLLVMStyleWithColumns(25))); 9615 EXPECT_EQ("#define A \\\n" 9616 " string s = \\\n" 9617 " \"123456789\" \\\n" 9618 " \"0\"; \\\n" 9619 " int i;", 9620 format("#define A string s = \"1234567890\"; int i;", 9621 getLLVMStyleWithColumns(20))); 9622 EXPECT_EQ("someFunction(\n" 9623 " \"aaabbbcc \"\n" 9624 " \"dddeeefff\");", 9625 format("someFunction(\"aaabbbcc dddeeefff\");", 9626 getLLVMStyleWithColumns(25))); 9627 } 9628 9629 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9630 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9631 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9632 EXPECT_EQ("\"test\"\n" 9633 "\"\\n\"", 9634 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9635 EXPECT_EQ("\"tes\\\\\"\n" 9636 "\"n\"", 9637 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9638 EXPECT_EQ("\"\\\\\\\\\"\n" 9639 "\"\\n\"", 9640 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9641 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9642 EXPECT_EQ("\"\\uff01\"\n" 9643 "\"test\"", 9644 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9645 EXPECT_EQ("\"\\Uff01ff02\"", 9646 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9647 EXPECT_EQ("\"\\x000000000001\"\n" 9648 "\"next\"", 9649 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9650 EXPECT_EQ("\"\\x000000000001next\"", 9651 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9652 EXPECT_EQ("\"\\x000000000001\"", 9653 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9654 EXPECT_EQ("\"test\"\n" 9655 "\"\\000000\"\n" 9656 "\"000001\"", 9657 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9658 EXPECT_EQ("\"test\\000\"\n" 9659 "\"00000000\"\n" 9660 "\"1\"", 9661 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9662 } 9663 9664 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9665 verifyFormat("void f() {\n" 9666 " return g() {}\n" 9667 " void h() {}"); 9668 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9669 "g();\n" 9670 "}"); 9671 } 9672 9673 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9674 verifyFormat( 9675 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9676 } 9677 9678 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9679 verifyFormat("class X {\n" 9680 " void f() {\n" 9681 " }\n" 9682 "};", 9683 getLLVMStyleWithColumns(12)); 9684 } 9685 9686 TEST_F(FormatTest, ConfigurableIndentWidth) { 9687 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9688 EightIndent.IndentWidth = 8; 9689 EightIndent.ContinuationIndentWidth = 8; 9690 verifyFormat("void f() {\n" 9691 " someFunction();\n" 9692 " if (true) {\n" 9693 " f();\n" 9694 " }\n" 9695 "}", 9696 EightIndent); 9697 verifyFormat("class X {\n" 9698 " void f() {\n" 9699 " }\n" 9700 "};", 9701 EightIndent); 9702 verifyFormat("int x[] = {\n" 9703 " call(),\n" 9704 " call()};", 9705 EightIndent); 9706 } 9707 9708 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9709 verifyFormat("double\n" 9710 "f();", 9711 getLLVMStyleWithColumns(8)); 9712 } 9713 9714 TEST_F(FormatTest, ConfigurableUseOfTab) { 9715 FormatStyle Tab = getLLVMStyleWithColumns(42); 9716 Tab.IndentWidth = 8; 9717 Tab.UseTab = FormatStyle::UT_Always; 9718 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9719 9720 EXPECT_EQ("if (aaaaaaaa && // q\n" 9721 " bb)\t\t// w\n" 9722 "\t;", 9723 format("if (aaaaaaaa &&// q\n" 9724 "bb)// w\n" 9725 ";", 9726 Tab)); 9727 EXPECT_EQ("if (aaa && bbb) // w\n" 9728 "\t;", 9729 format("if(aaa&&bbb)// w\n" 9730 ";", 9731 Tab)); 9732 9733 verifyFormat("class X {\n" 9734 "\tvoid f() {\n" 9735 "\t\tsomeFunction(parameter1,\n" 9736 "\t\t\t parameter2);\n" 9737 "\t}\n" 9738 "};", 9739 Tab); 9740 verifyFormat("#define A \\\n" 9741 "\tvoid f() { \\\n" 9742 "\t\tsomeFunction( \\\n" 9743 "\t\t parameter1, \\\n" 9744 "\t\t parameter2); \\\n" 9745 "\t}", 9746 Tab); 9747 verifyFormat("int a;\t // x\n" 9748 "int bbbbbbbb; // x\n", 9749 Tab); 9750 9751 Tab.TabWidth = 4; 9752 Tab.IndentWidth = 8; 9753 verifyFormat("class TabWidth4Indent8 {\n" 9754 "\t\tvoid f() {\n" 9755 "\t\t\t\tsomeFunction(parameter1,\n" 9756 "\t\t\t\t\t\t\t parameter2);\n" 9757 "\t\t}\n" 9758 "};", 9759 Tab); 9760 9761 Tab.TabWidth = 4; 9762 Tab.IndentWidth = 4; 9763 verifyFormat("class TabWidth4Indent4 {\n" 9764 "\tvoid f() {\n" 9765 "\t\tsomeFunction(parameter1,\n" 9766 "\t\t\t\t\t parameter2);\n" 9767 "\t}\n" 9768 "};", 9769 Tab); 9770 9771 Tab.TabWidth = 8; 9772 Tab.IndentWidth = 4; 9773 verifyFormat("class TabWidth8Indent4 {\n" 9774 " void f() {\n" 9775 "\tsomeFunction(parameter1,\n" 9776 "\t\t parameter2);\n" 9777 " }\n" 9778 "};", 9779 Tab); 9780 9781 Tab.TabWidth = 8; 9782 Tab.IndentWidth = 8; 9783 EXPECT_EQ("/*\n" 9784 "\t a\t\tcomment\n" 9785 "\t in multiple lines\n" 9786 " */", 9787 format(" /*\t \t \n" 9788 " \t \t a\t\tcomment\t \t\n" 9789 " \t \t in multiple lines\t\n" 9790 " \t */", 9791 Tab)); 9792 9793 Tab.UseTab = FormatStyle::UT_ForIndentation; 9794 verifyFormat("{\n" 9795 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9796 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9797 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9798 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9799 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9800 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9801 "};", 9802 Tab); 9803 verifyFormat("enum AA {\n" 9804 "\ta1, // Force multiple lines\n" 9805 "\ta2,\n" 9806 "\ta3\n" 9807 "};", 9808 Tab); 9809 EXPECT_EQ("if (aaaaaaaa && // q\n" 9810 " bb) // w\n" 9811 "\t;", 9812 format("if (aaaaaaaa &&// q\n" 9813 "bb)// w\n" 9814 ";", 9815 Tab)); 9816 verifyFormat("class X {\n" 9817 "\tvoid f() {\n" 9818 "\t\tsomeFunction(parameter1,\n" 9819 "\t\t parameter2);\n" 9820 "\t}\n" 9821 "};", 9822 Tab); 9823 verifyFormat("{\n" 9824 "\tQ(\n" 9825 "\t {\n" 9826 "\t\t int a;\n" 9827 "\t\t someFunction(aaaaaaaa,\n" 9828 "\t\t bbbbbbb);\n" 9829 "\t },\n" 9830 "\t p);\n" 9831 "}", 9832 Tab); 9833 EXPECT_EQ("{\n" 9834 "\t/* aaaa\n" 9835 "\t bbbb */\n" 9836 "}", 9837 format("{\n" 9838 "/* aaaa\n" 9839 " bbbb */\n" 9840 "}", 9841 Tab)); 9842 EXPECT_EQ("{\n" 9843 "\t/*\n" 9844 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9845 "\t bbbbbbbbbbbbb\n" 9846 "\t*/\n" 9847 "}", 9848 format("{\n" 9849 "/*\n" 9850 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9851 "*/\n" 9852 "}", 9853 Tab)); 9854 EXPECT_EQ("{\n" 9855 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9856 "\t// bbbbbbbbbbbbb\n" 9857 "}", 9858 format("{\n" 9859 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9860 "}", 9861 Tab)); 9862 EXPECT_EQ("{\n" 9863 "\t/*\n" 9864 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9865 "\t bbbbbbbbbbbbb\n" 9866 "\t*/\n" 9867 "}", 9868 format("{\n" 9869 "\t/*\n" 9870 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9871 "\t*/\n" 9872 "}", 9873 Tab)); 9874 EXPECT_EQ("{\n" 9875 "\t/*\n" 9876 "\n" 9877 "\t*/\n" 9878 "}", 9879 format("{\n" 9880 "\t/*\n" 9881 "\n" 9882 "\t*/\n" 9883 "}", 9884 Tab)); 9885 EXPECT_EQ("{\n" 9886 "\t/*\n" 9887 " asdf\n" 9888 "\t*/\n" 9889 "}", 9890 format("{\n" 9891 "\t/*\n" 9892 " asdf\n" 9893 "\t*/\n" 9894 "}", 9895 Tab)); 9896 9897 Tab.UseTab = FormatStyle::UT_Never; 9898 EXPECT_EQ("/*\n" 9899 " a\t\tcomment\n" 9900 " in multiple lines\n" 9901 " */", 9902 format(" /*\t \t \n" 9903 " \t \t a\t\tcomment\t \t\n" 9904 " \t \t in multiple lines\t\n" 9905 " \t */", 9906 Tab)); 9907 EXPECT_EQ("/* some\n" 9908 " comment */", 9909 format(" \t \t /* some\n" 9910 " \t \t comment */", 9911 Tab)); 9912 EXPECT_EQ("int a; /* some\n" 9913 " comment */", 9914 format(" \t \t int a; /* some\n" 9915 " \t \t comment */", 9916 Tab)); 9917 9918 EXPECT_EQ("int a; /* some\n" 9919 "comment */", 9920 format(" \t \t int\ta; /* some\n" 9921 " \t \t comment */", 9922 Tab)); 9923 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9924 " comment */", 9925 format(" \t \t f(\"\t\t\"); /* some\n" 9926 " \t \t comment */", 9927 Tab)); 9928 EXPECT_EQ("{\n" 9929 " /*\n" 9930 " * Comment\n" 9931 " */\n" 9932 " int i;\n" 9933 "}", 9934 format("{\n" 9935 "\t/*\n" 9936 "\t * Comment\n" 9937 "\t */\n" 9938 "\t int i;\n" 9939 "}")); 9940 9941 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 9942 Tab.TabWidth = 8; 9943 Tab.IndentWidth = 8; 9944 EXPECT_EQ("if (aaaaaaaa && // q\n" 9945 " bb) // w\n" 9946 "\t;", 9947 format("if (aaaaaaaa &&// q\n" 9948 "bb)// w\n" 9949 ";", 9950 Tab)); 9951 EXPECT_EQ("if (aaa && bbb) // w\n" 9952 "\t;", 9953 format("if(aaa&&bbb)// w\n" 9954 ";", 9955 Tab)); 9956 verifyFormat("class X {\n" 9957 "\tvoid f() {\n" 9958 "\t\tsomeFunction(parameter1,\n" 9959 "\t\t\t parameter2);\n" 9960 "\t}\n" 9961 "};", 9962 Tab); 9963 verifyFormat("#define A \\\n" 9964 "\tvoid f() { \\\n" 9965 "\t\tsomeFunction( \\\n" 9966 "\t\t parameter1, \\\n" 9967 "\t\t parameter2); \\\n" 9968 "\t}", 9969 Tab); 9970 Tab.TabWidth = 4; 9971 Tab.IndentWidth = 8; 9972 verifyFormat("class TabWidth4Indent8 {\n" 9973 "\t\tvoid f() {\n" 9974 "\t\t\t\tsomeFunction(parameter1,\n" 9975 "\t\t\t\t\t\t\t parameter2);\n" 9976 "\t\t}\n" 9977 "};", 9978 Tab); 9979 Tab.TabWidth = 4; 9980 Tab.IndentWidth = 4; 9981 verifyFormat("class TabWidth4Indent4 {\n" 9982 "\tvoid f() {\n" 9983 "\t\tsomeFunction(parameter1,\n" 9984 "\t\t\t\t\t parameter2);\n" 9985 "\t}\n" 9986 "};", 9987 Tab); 9988 Tab.TabWidth = 8; 9989 Tab.IndentWidth = 4; 9990 verifyFormat("class TabWidth8Indent4 {\n" 9991 " void f() {\n" 9992 "\tsomeFunction(parameter1,\n" 9993 "\t\t parameter2);\n" 9994 " }\n" 9995 "};", 9996 Tab); 9997 Tab.TabWidth = 8; 9998 Tab.IndentWidth = 8; 9999 EXPECT_EQ("/*\n" 10000 "\t a\t\tcomment\n" 10001 "\t in multiple lines\n" 10002 " */", 10003 format(" /*\t \t \n" 10004 " \t \t a\t\tcomment\t \t\n" 10005 " \t \t in multiple lines\t\n" 10006 " \t */", 10007 Tab)); 10008 verifyFormat("{\n" 10009 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10010 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10011 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10012 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10013 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10014 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10015 "};", 10016 Tab); 10017 verifyFormat("enum AA {\n" 10018 "\ta1, // Force multiple lines\n" 10019 "\ta2,\n" 10020 "\ta3\n" 10021 "};", 10022 Tab); 10023 EXPECT_EQ("if (aaaaaaaa && // q\n" 10024 " bb) // w\n" 10025 "\t;", 10026 format("if (aaaaaaaa &&// q\n" 10027 "bb)// w\n" 10028 ";", 10029 Tab)); 10030 verifyFormat("class X {\n" 10031 "\tvoid f() {\n" 10032 "\t\tsomeFunction(parameter1,\n" 10033 "\t\t\t parameter2);\n" 10034 "\t}\n" 10035 "};", 10036 Tab); 10037 verifyFormat("{\n" 10038 "\tQ(\n" 10039 "\t {\n" 10040 "\t\t int a;\n" 10041 "\t\t someFunction(aaaaaaaa,\n" 10042 "\t\t\t\t bbbbbbb);\n" 10043 "\t },\n" 10044 "\t p);\n" 10045 "}", 10046 Tab); 10047 EXPECT_EQ("{\n" 10048 "\t/* aaaa\n" 10049 "\t bbbb */\n" 10050 "}", 10051 format("{\n" 10052 "/* aaaa\n" 10053 " bbbb */\n" 10054 "}", 10055 Tab)); 10056 EXPECT_EQ("{\n" 10057 "\t/*\n" 10058 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10059 "\t bbbbbbbbbbbbb\n" 10060 "\t*/\n" 10061 "}", 10062 format("{\n" 10063 "/*\n" 10064 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10065 "*/\n" 10066 "}", 10067 Tab)); 10068 EXPECT_EQ("{\n" 10069 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10070 "\t// bbbbbbbbbbbbb\n" 10071 "}", 10072 format("{\n" 10073 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10074 "}", 10075 Tab)); 10076 EXPECT_EQ("{\n" 10077 "\t/*\n" 10078 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10079 "\t bbbbbbbbbbbbb\n" 10080 "\t*/\n" 10081 "}", 10082 format("{\n" 10083 "\t/*\n" 10084 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10085 "\t*/\n" 10086 "}", 10087 Tab)); 10088 EXPECT_EQ("{\n" 10089 "\t/*\n" 10090 "\n" 10091 "\t*/\n" 10092 "}", 10093 format("{\n" 10094 "\t/*\n" 10095 "\n" 10096 "\t*/\n" 10097 "}", 10098 Tab)); 10099 EXPECT_EQ("{\n" 10100 "\t/*\n" 10101 " asdf\n" 10102 "\t*/\n" 10103 "}", 10104 format("{\n" 10105 "\t/*\n" 10106 " asdf\n" 10107 "\t*/\n" 10108 "}", 10109 Tab)); 10110 EXPECT_EQ("/*\n" 10111 "\t a\t\tcomment\n" 10112 "\t in multiple lines\n" 10113 " */", 10114 format(" /*\t \t \n" 10115 " \t \t a\t\tcomment\t \t\n" 10116 " \t \t in multiple lines\t\n" 10117 " \t */", 10118 Tab)); 10119 EXPECT_EQ("/* some\n" 10120 " comment */", 10121 format(" \t \t /* some\n" 10122 " \t \t comment */", 10123 Tab)); 10124 EXPECT_EQ("int a; /* some\n" 10125 " comment */", 10126 format(" \t \t int a; /* some\n" 10127 " \t \t comment */", 10128 Tab)); 10129 EXPECT_EQ("int a; /* some\n" 10130 "comment */", 10131 format(" \t \t int\ta; /* some\n" 10132 " \t \t comment */", 10133 Tab)); 10134 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10135 " comment */", 10136 format(" \t \t f(\"\t\t\"); /* some\n" 10137 " \t \t comment */", 10138 Tab)); 10139 EXPECT_EQ("{\n" 10140 " /*\n" 10141 " * Comment\n" 10142 " */\n" 10143 " int i;\n" 10144 "}", 10145 format("{\n" 10146 "\t/*\n" 10147 "\t * Comment\n" 10148 "\t */\n" 10149 "\t int i;\n" 10150 "}")); 10151 Tab.AlignConsecutiveAssignments = true; 10152 Tab.AlignConsecutiveDeclarations = true; 10153 Tab.TabWidth = 4; 10154 Tab.IndentWidth = 4; 10155 verifyFormat("class Assign {\n" 10156 "\tvoid f() {\n" 10157 "\t\tint x = 123;\n" 10158 "\t\tint random = 4;\n" 10159 "\t\tstd::string alphabet =\n" 10160 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10161 "\t}\n" 10162 "};", 10163 Tab); 10164 } 10165 10166 TEST_F(FormatTest, ZeroTabWidth) { 10167 FormatStyle Tab = getLLVMStyleWithColumns(42); 10168 Tab.IndentWidth = 8; 10169 Tab.UseTab = FormatStyle::UT_Never; 10170 Tab.TabWidth = 0; 10171 EXPECT_EQ("void a(){\n" 10172 " // line starts with '\t'\n" 10173 "};", 10174 format("void a(){\n" 10175 "\t// line starts with '\t'\n" 10176 "};", 10177 Tab)); 10178 10179 EXPECT_EQ("void a(){\n" 10180 " // line starts with '\t'\n" 10181 "};", 10182 format("void a(){\n" 10183 "\t\t// line starts with '\t'\n" 10184 "};", 10185 Tab)); 10186 10187 Tab.UseTab = FormatStyle::UT_ForIndentation; 10188 EXPECT_EQ("void a(){\n" 10189 " // line starts with '\t'\n" 10190 "};", 10191 format("void a(){\n" 10192 "\t// line starts with '\t'\n" 10193 "};", 10194 Tab)); 10195 10196 EXPECT_EQ("void a(){\n" 10197 " // line starts with '\t'\n" 10198 "};", 10199 format("void a(){\n" 10200 "\t\t// line starts with '\t'\n" 10201 "};", 10202 Tab)); 10203 10204 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10205 EXPECT_EQ("void a(){\n" 10206 " // line starts with '\t'\n" 10207 "};", 10208 format("void a(){\n" 10209 "\t// line starts with '\t'\n" 10210 "};", 10211 Tab)); 10212 10213 EXPECT_EQ("void a(){\n" 10214 " // line starts with '\t'\n" 10215 "};", 10216 format("void a(){\n" 10217 "\t\t// line starts with '\t'\n" 10218 "};", 10219 Tab)); 10220 10221 Tab.UseTab = FormatStyle::UT_Always; 10222 EXPECT_EQ("void a(){\n" 10223 "// line starts with '\t'\n" 10224 "};", 10225 format("void a(){\n" 10226 "\t// line starts with '\t'\n" 10227 "};", 10228 Tab)); 10229 10230 EXPECT_EQ("void a(){\n" 10231 "// line starts with '\t'\n" 10232 "};", 10233 format("void a(){\n" 10234 "\t\t// line starts with '\t'\n" 10235 "};", 10236 Tab)); 10237 } 10238 10239 TEST_F(FormatTest, CalculatesOriginalColumn) { 10240 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10241 "q\"; /* some\n" 10242 " comment */", 10243 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10244 "q\"; /* some\n" 10245 " comment */", 10246 getLLVMStyle())); 10247 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10248 "/* some\n" 10249 " comment */", 10250 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10251 " /* some\n" 10252 " comment */", 10253 getLLVMStyle())); 10254 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10255 "qqq\n" 10256 "/* some\n" 10257 " comment */", 10258 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10259 "qqq\n" 10260 " /* some\n" 10261 " comment */", 10262 getLLVMStyle())); 10263 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10264 "wwww; /* some\n" 10265 " comment */", 10266 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10267 "wwww; /* some\n" 10268 " comment */", 10269 getLLVMStyle())); 10270 } 10271 10272 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 10273 FormatStyle NoSpace = getLLVMStyle(); 10274 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 10275 10276 verifyFormat("while(true)\n" 10277 " continue;", 10278 NoSpace); 10279 verifyFormat("for(;;)\n" 10280 " continue;", 10281 NoSpace); 10282 verifyFormat("if(true)\n" 10283 " f();\n" 10284 "else if(true)\n" 10285 " f();", 10286 NoSpace); 10287 verifyFormat("do {\n" 10288 " do_something();\n" 10289 "} while(something());", 10290 NoSpace); 10291 verifyFormat("switch(x) {\n" 10292 "default:\n" 10293 " break;\n" 10294 "}", 10295 NoSpace); 10296 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 10297 verifyFormat("size_t x = sizeof(x);", NoSpace); 10298 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 10299 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 10300 verifyFormat("alignas(128) char a[128];", NoSpace); 10301 verifyFormat("size_t x = alignof(MyType);", NoSpace); 10302 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 10303 verifyFormat("int f() throw(Deprecated);", NoSpace); 10304 verifyFormat("typedef void (*cb)(int);", NoSpace); 10305 verifyFormat("T A::operator()();", NoSpace); 10306 verifyFormat("X A::operator++(T);", NoSpace); 10307 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 10308 10309 FormatStyle Space = getLLVMStyle(); 10310 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 10311 10312 verifyFormat("int f ();", Space); 10313 verifyFormat("void f (int a, T b) {\n" 10314 " while (true)\n" 10315 " continue;\n" 10316 "}", 10317 Space); 10318 verifyFormat("if (true)\n" 10319 " f ();\n" 10320 "else if (true)\n" 10321 " f ();", 10322 Space); 10323 verifyFormat("do {\n" 10324 " do_something ();\n" 10325 "} while (something ());", 10326 Space); 10327 verifyFormat("switch (x) {\n" 10328 "default:\n" 10329 " break;\n" 10330 "}", 10331 Space); 10332 verifyFormat("A::A () : a (1) {}", Space); 10333 verifyFormat("void f () __attribute__ ((asdf));", Space); 10334 verifyFormat("*(&a + 1);\n" 10335 "&((&a)[1]);\n" 10336 "a[(b + c) * d];\n" 10337 "(((a + 1) * 2) + 3) * 4;", 10338 Space); 10339 verifyFormat("#define A(x) x", Space); 10340 verifyFormat("#define A (x) x", Space); 10341 verifyFormat("#if defined(x)\n" 10342 "#endif", 10343 Space); 10344 verifyFormat("auto i = std::make_unique<int> (5);", Space); 10345 verifyFormat("size_t x = sizeof (x);", Space); 10346 verifyFormat("auto f (int x) -> decltype (x);", Space); 10347 verifyFormat("int f (T x) noexcept (x.create ());", Space); 10348 verifyFormat("alignas (128) char a[128];", Space); 10349 verifyFormat("size_t x = alignof (MyType);", Space); 10350 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 10351 verifyFormat("int f () throw (Deprecated);", Space); 10352 verifyFormat("typedef void (*cb) (int);", Space); 10353 verifyFormat("T A::operator() ();", Space); 10354 verifyFormat("X A::operator++ (T);", Space); 10355 verifyFormat("auto lambda = [] () { return 0; };", Space); 10356 verifyFormat("int x = int (y);", Space); 10357 10358 FormatStyle SomeSpace = getLLVMStyle(); 10359 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 10360 10361 verifyFormat("[]() -> float {}", SomeSpace); 10362 verifyFormat("[] (auto foo) {}", SomeSpace); 10363 verifyFormat("[foo]() -> int {}", SomeSpace); 10364 verifyFormat("int f();", SomeSpace); 10365 verifyFormat("void f (int a, T b) {\n" 10366 " while (true)\n" 10367 " continue;\n" 10368 "}", 10369 SomeSpace); 10370 verifyFormat("if (true)\n" 10371 " f();\n" 10372 "else if (true)\n" 10373 " f();", 10374 SomeSpace); 10375 verifyFormat("do {\n" 10376 " do_something();\n" 10377 "} while (something());", 10378 SomeSpace); 10379 verifyFormat("switch (x) {\n" 10380 "default:\n" 10381 " break;\n" 10382 "}", 10383 SomeSpace); 10384 verifyFormat("A::A() : a (1) {}", SomeSpace); 10385 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 10386 verifyFormat("*(&a + 1);\n" 10387 "&((&a)[1]);\n" 10388 "a[(b + c) * d];\n" 10389 "(((a + 1) * 2) + 3) * 4;", 10390 SomeSpace); 10391 verifyFormat("#define A(x) x", SomeSpace); 10392 verifyFormat("#define A (x) x", SomeSpace); 10393 verifyFormat("#if defined(x)\n" 10394 "#endif", 10395 SomeSpace); 10396 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10397 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10398 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10399 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10400 verifyFormat("alignas (128) char a[128];", SomeSpace); 10401 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10402 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10403 SomeSpace); 10404 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10405 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10406 verifyFormat("T A::operator()();", SomeSpace); 10407 verifyFormat("X A::operator++ (T);", SomeSpace); 10408 verifyFormat("int x = int (y);", SomeSpace); 10409 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10410 } 10411 10412 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10413 FormatStyle Spaces = getLLVMStyle(); 10414 Spaces.SpaceAfterLogicalNot = true; 10415 10416 verifyFormat("bool x = ! y", Spaces); 10417 verifyFormat("if (! isFailure())", Spaces); 10418 verifyFormat("if (! (a && b))", Spaces); 10419 verifyFormat("\"Error!\"", Spaces); 10420 verifyFormat("! ! x", Spaces); 10421 } 10422 10423 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10424 FormatStyle Spaces = getLLVMStyle(); 10425 10426 Spaces.SpacesInParentheses = true; 10427 verifyFormat("do_something( ::globalVar );", Spaces); 10428 verifyFormat("call( x, y, z );", Spaces); 10429 verifyFormat("call();", Spaces); 10430 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10431 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10432 Spaces); 10433 verifyFormat("while ( (bool)1 )\n" 10434 " continue;", 10435 Spaces); 10436 verifyFormat("for ( ;; )\n" 10437 " continue;", 10438 Spaces); 10439 verifyFormat("if ( true )\n" 10440 " f();\n" 10441 "else if ( true )\n" 10442 " f();", 10443 Spaces); 10444 verifyFormat("do {\n" 10445 " do_something( (int)i );\n" 10446 "} while ( something() );", 10447 Spaces); 10448 verifyFormat("switch ( x ) {\n" 10449 "default:\n" 10450 " break;\n" 10451 "}", 10452 Spaces); 10453 10454 Spaces.SpacesInParentheses = false; 10455 Spaces.SpacesInCStyleCastParentheses = true; 10456 verifyFormat("Type *A = ( Type * )P;", Spaces); 10457 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 10458 verifyFormat("x = ( int32 )y;", Spaces); 10459 verifyFormat("int a = ( int )(2.0f);", Spaces); 10460 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 10461 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 10462 verifyFormat("#define x (( int )-1)", Spaces); 10463 10464 // Run the first set of tests again with: 10465 Spaces.SpacesInParentheses = false; 10466 Spaces.SpaceInEmptyParentheses = true; 10467 Spaces.SpacesInCStyleCastParentheses = true; 10468 verifyFormat("call(x, y, z);", Spaces); 10469 verifyFormat("call( );", Spaces); 10470 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10471 verifyFormat("while (( bool )1)\n" 10472 " continue;", 10473 Spaces); 10474 verifyFormat("for (;;)\n" 10475 " continue;", 10476 Spaces); 10477 verifyFormat("if (true)\n" 10478 " f( );\n" 10479 "else if (true)\n" 10480 " f( );", 10481 Spaces); 10482 verifyFormat("do {\n" 10483 " do_something(( int )i);\n" 10484 "} while (something( ));", 10485 Spaces); 10486 verifyFormat("switch (x) {\n" 10487 "default:\n" 10488 " break;\n" 10489 "}", 10490 Spaces); 10491 10492 // Run the first set of tests again with: 10493 Spaces.SpaceAfterCStyleCast = 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 subset of tests again with: 10519 Spaces.SpacesInCStyleCastParentheses = false; 10520 Spaces.SpaceAfterCStyleCast = true; 10521 verifyFormat("while ((bool) 1)\n" 10522 " continue;", 10523 Spaces); 10524 verifyFormat("do {\n" 10525 " do_something((int) i);\n" 10526 "} while (something( ));", 10527 Spaces); 10528 } 10529 10530 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 10531 verifyFormat("int a[5];"); 10532 verifyFormat("a[3] += 42;"); 10533 10534 FormatStyle Spaces = getLLVMStyle(); 10535 Spaces.SpacesInSquareBrackets = true; 10536 // Not lambdas. 10537 verifyFormat("int a[ 5 ];", Spaces); 10538 verifyFormat("a[ 3 ] += 42;", Spaces); 10539 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 10540 verifyFormat("double &operator[](int i) { return 0; }\n" 10541 "int i;", 10542 Spaces); 10543 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 10544 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 10545 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 10546 // Lambdas. 10547 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 10548 verifyFormat("return [ i, args... ] {};", Spaces); 10549 } 10550 10551 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10552 verifyFormat("int a = 5;"); 10553 verifyFormat("a += 42;"); 10554 verifyFormat("a or_eq 8;"); 10555 10556 FormatStyle Spaces = getLLVMStyle(); 10557 Spaces.SpaceBeforeAssignmentOperators = false; 10558 verifyFormat("int a= 5;", Spaces); 10559 verifyFormat("a+= 42;", Spaces); 10560 verifyFormat("a or_eq 8;", Spaces); 10561 } 10562 10563 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10564 verifyFormat("class Foo : public Bar {};"); 10565 verifyFormat("Foo::Foo() : foo(1) {}"); 10566 verifyFormat("for (auto a : b) {\n}"); 10567 verifyFormat("int x = a ? b : c;"); 10568 verifyFormat("{\n" 10569 "label0:\n" 10570 " int x = 0;\n" 10571 "}"); 10572 verifyFormat("switch (x) {\n" 10573 "case 1:\n" 10574 "default:\n" 10575 "}"); 10576 10577 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10578 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10579 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10580 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10581 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10582 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10583 verifyFormat("{\n" 10584 "label1:\n" 10585 " int x = 0;\n" 10586 "}", 10587 CtorInitializerStyle); 10588 verifyFormat("switch (x) {\n" 10589 "case 1:\n" 10590 "default:\n" 10591 "}", 10592 CtorInitializerStyle); 10593 CtorInitializerStyle.BreakConstructorInitializers = 10594 FormatStyle::BCIS_AfterColon; 10595 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10596 " aaaaaaaaaaaaaaaa(1),\n" 10597 " bbbbbbbbbbbbbbbb(2) {}", 10598 CtorInitializerStyle); 10599 CtorInitializerStyle.BreakConstructorInitializers = 10600 FormatStyle::BCIS_BeforeComma; 10601 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10602 " : aaaaaaaaaaaaaaaa(1)\n" 10603 " , bbbbbbbbbbbbbbbb(2) {}", 10604 CtorInitializerStyle); 10605 CtorInitializerStyle.BreakConstructorInitializers = 10606 FormatStyle::BCIS_BeforeColon; 10607 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10608 " : aaaaaaaaaaaaaaaa(1),\n" 10609 " bbbbbbbbbbbbbbbb(2) {}", 10610 CtorInitializerStyle); 10611 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10612 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10613 ": aaaaaaaaaaaaaaaa(1),\n" 10614 " bbbbbbbbbbbbbbbb(2) {}", 10615 CtorInitializerStyle); 10616 10617 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10618 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10619 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10620 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10621 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10622 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10623 verifyFormat("{\n" 10624 "label2:\n" 10625 " int x = 0;\n" 10626 "}", 10627 InheritanceStyle); 10628 verifyFormat("switch (x) {\n" 10629 "case 1:\n" 10630 "default:\n" 10631 "}", 10632 InheritanceStyle); 10633 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10634 verifyFormat("class Foooooooooooooooooooooo:\n" 10635 " public aaaaaaaaaaaaaaaaaa,\n" 10636 " public bbbbbbbbbbbbbbbbbb {\n" 10637 "}", 10638 InheritanceStyle); 10639 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10640 verifyFormat("class Foooooooooooooooooooooo\n" 10641 " : public aaaaaaaaaaaaaaaaaa\n" 10642 " , public bbbbbbbbbbbbbbbbbb {\n" 10643 "}", 10644 InheritanceStyle); 10645 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10646 verifyFormat("class Foooooooooooooooooooooo\n" 10647 " : public aaaaaaaaaaaaaaaaaa,\n" 10648 " public bbbbbbbbbbbbbbbbbb {\n" 10649 "}", 10650 InheritanceStyle); 10651 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10652 verifyFormat("class Foooooooooooooooooooooo\n" 10653 ": public aaaaaaaaaaaaaaaaaa,\n" 10654 " public bbbbbbbbbbbbbbbbbb {}", 10655 InheritanceStyle); 10656 10657 FormatStyle ForLoopStyle = getLLVMStyle(); 10658 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10659 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10660 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10661 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10662 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10663 verifyFormat("{\n" 10664 "label2:\n" 10665 " int x = 0;\n" 10666 "}", 10667 ForLoopStyle); 10668 verifyFormat("switch (x) {\n" 10669 "case 1:\n" 10670 "default:\n" 10671 "}", 10672 ForLoopStyle); 10673 10674 FormatStyle NoSpaceStyle = getLLVMStyle(); 10675 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10676 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10677 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10678 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10679 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10680 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10681 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10682 verifyFormat("{\n" 10683 "label3:\n" 10684 " int x = 0;\n" 10685 "}", 10686 NoSpaceStyle); 10687 verifyFormat("switch (x) {\n" 10688 "case 1:\n" 10689 "default:\n" 10690 "}", 10691 NoSpaceStyle); 10692 } 10693 10694 TEST_F(FormatTest, AlignConsecutiveMacros) { 10695 FormatStyle Style = getLLVMStyle(); 10696 Style.AlignConsecutiveAssignments = true; 10697 Style.AlignConsecutiveDeclarations = true; 10698 Style.AlignConsecutiveMacros = false; 10699 10700 verifyFormat("#define a 3\n" 10701 "#define bbbb 4\n" 10702 "#define ccc (5)", 10703 Style); 10704 10705 verifyFormat("#define f(x) (x * x)\n" 10706 "#define fff(x, y, z) (x * y + z)\n" 10707 "#define ffff(x, y) (x - y)", 10708 Style); 10709 10710 verifyFormat("#define foo(x, y) (x + y)\n" 10711 "#define bar (5, 6)(2 + 2)", 10712 Style); 10713 10714 verifyFormat("#define a 3\n" 10715 "#define bbbb 4\n" 10716 "#define ccc (5)\n" 10717 "#define f(x) (x * x)\n" 10718 "#define fff(x, y, z) (x * y + z)\n" 10719 "#define ffff(x, y) (x - y)", 10720 Style); 10721 10722 Style.AlignConsecutiveMacros = true; 10723 verifyFormat("#define a 3\n" 10724 "#define bbbb 4\n" 10725 "#define ccc (5)", 10726 Style); 10727 10728 verifyFormat("#define f(x) (x * x)\n" 10729 "#define fff(x, y, z) (x * y + z)\n" 10730 "#define ffff(x, y) (x - y)", 10731 Style); 10732 10733 verifyFormat("#define foo(x, y) (x + y)\n" 10734 "#define bar (5, 6)(2 + 2)", 10735 Style); 10736 10737 verifyFormat("#define a 3\n" 10738 "#define bbbb 4\n" 10739 "#define ccc (5)\n" 10740 "#define f(x) (x * x)\n" 10741 "#define fff(x, y, z) (x * y + z)\n" 10742 "#define ffff(x, y) (x - y)", 10743 Style); 10744 10745 verifyFormat("#define a 5\n" 10746 "#define foo(x, y) (x + y)\n" 10747 "#define CCC (6)\n" 10748 "auto lambda = []() {\n" 10749 " auto ii = 0;\n" 10750 " float j = 0;\n" 10751 " return 0;\n" 10752 "};\n" 10753 "int i = 0;\n" 10754 "float i2 = 0;\n" 10755 "auto v = type{\n" 10756 " i = 1, //\n" 10757 " (i = 2), //\n" 10758 " i = 3 //\n" 10759 "};", 10760 Style); 10761 10762 Style.AlignConsecutiveMacros = false; 10763 Style.ColumnLimit = 20; 10764 10765 verifyFormat("#define a \\\n" 10766 " \"aabbbbbbbbbbbb\"\n" 10767 "#define D \\\n" 10768 " \"aabbbbbbbbbbbb\" \\\n" 10769 " \"ccddeeeeeeeee\"\n" 10770 "#define B \\\n" 10771 " \"QQQQQQQQQQQQQ\" \\\n" 10772 " \"FFFFFFFFFFFFF\" \\\n" 10773 " \"LLLLLLLL\"\n", 10774 Style); 10775 10776 Style.AlignConsecutiveMacros = true; 10777 verifyFormat("#define a \\\n" 10778 " \"aabbbbbbbbbbbb\"\n" 10779 "#define D \\\n" 10780 " \"aabbbbbbbbbbbb\" \\\n" 10781 " \"ccddeeeeeeeee\"\n" 10782 "#define B \\\n" 10783 " \"QQQQQQQQQQQQQ\" \\\n" 10784 " \"FFFFFFFFFFFFF\" \\\n" 10785 " \"LLLLLLLL\"\n", 10786 Style); 10787 } 10788 10789 TEST_F(FormatTest, AlignConsecutiveAssignments) { 10790 FormatStyle Alignment = getLLVMStyle(); 10791 Alignment.AlignConsecutiveMacros = true; 10792 Alignment.AlignConsecutiveAssignments = false; 10793 verifyFormat("int a = 5;\n" 10794 "int oneTwoThree = 123;", 10795 Alignment); 10796 verifyFormat("int a = 5;\n" 10797 "int oneTwoThree = 123;", 10798 Alignment); 10799 10800 Alignment.AlignConsecutiveAssignments = true; 10801 verifyFormat("int a = 5;\n" 10802 "int oneTwoThree = 123;", 10803 Alignment); 10804 verifyFormat("int a = method();\n" 10805 "int oneTwoThree = 133;", 10806 Alignment); 10807 verifyFormat("a &= 5;\n" 10808 "bcd *= 5;\n" 10809 "ghtyf += 5;\n" 10810 "dvfvdb -= 5;\n" 10811 "a /= 5;\n" 10812 "vdsvsv %= 5;\n" 10813 "sfdbddfbdfbb ^= 5;\n" 10814 "dvsdsv |= 5;\n" 10815 "int dsvvdvsdvvv = 123;", 10816 Alignment); 10817 verifyFormat("int i = 1, j = 10;\n" 10818 "something = 2000;", 10819 Alignment); 10820 verifyFormat("something = 2000;\n" 10821 "int i = 1, j = 10;\n", 10822 Alignment); 10823 verifyFormat("something = 2000;\n" 10824 "another = 911;\n" 10825 "int i = 1, j = 10;\n" 10826 "oneMore = 1;\n" 10827 "i = 2;", 10828 Alignment); 10829 verifyFormat("int a = 5;\n" 10830 "int one = 1;\n" 10831 "method();\n" 10832 "int oneTwoThree = 123;\n" 10833 "int oneTwo = 12;", 10834 Alignment); 10835 verifyFormat("int oneTwoThree = 123;\n" 10836 "int oneTwo = 12;\n" 10837 "method();\n", 10838 Alignment); 10839 verifyFormat("int oneTwoThree = 123; // comment\n" 10840 "int oneTwo = 12; // comment", 10841 Alignment); 10842 EXPECT_EQ("int a = 5;\n" 10843 "\n" 10844 "int oneTwoThree = 123;", 10845 format("int a = 5;\n" 10846 "\n" 10847 "int oneTwoThree= 123;", 10848 Alignment)); 10849 EXPECT_EQ("int a = 5;\n" 10850 "int one = 1;\n" 10851 "\n" 10852 "int oneTwoThree = 123;", 10853 format("int a = 5;\n" 10854 "int one = 1;\n" 10855 "\n" 10856 "int oneTwoThree = 123;", 10857 Alignment)); 10858 EXPECT_EQ("int a = 5;\n" 10859 "int one = 1;\n" 10860 "\n" 10861 "int oneTwoThree = 123;\n" 10862 "int oneTwo = 12;", 10863 format("int a = 5;\n" 10864 "int one = 1;\n" 10865 "\n" 10866 "int oneTwoThree = 123;\n" 10867 "int oneTwo = 12;", 10868 Alignment)); 10869 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10870 verifyFormat("#define A \\\n" 10871 " int aaaa = 12; \\\n" 10872 " int b = 23; \\\n" 10873 " int ccc = 234; \\\n" 10874 " int dddddddddd = 2345;", 10875 Alignment); 10876 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10877 verifyFormat("#define A \\\n" 10878 " int aaaa = 12; \\\n" 10879 " int b = 23; \\\n" 10880 " int ccc = 234; \\\n" 10881 " int dddddddddd = 2345;", 10882 Alignment); 10883 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10884 verifyFormat("#define A " 10885 " \\\n" 10886 " int aaaa = 12; " 10887 " \\\n" 10888 " int b = 23; " 10889 " \\\n" 10890 " int ccc = 234; " 10891 " \\\n" 10892 " int dddddddddd = 2345;", 10893 Alignment); 10894 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10895 "k = 4, int l = 5,\n" 10896 " int m = 6) {\n" 10897 " int j = 10;\n" 10898 " otherThing = 1;\n" 10899 "}", 10900 Alignment); 10901 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10902 " int i = 1;\n" 10903 " int j = 2;\n" 10904 " int big = 10000;\n" 10905 "}", 10906 Alignment); 10907 verifyFormat("class C {\n" 10908 "public:\n" 10909 " int i = 1;\n" 10910 " virtual void f() = 0;\n" 10911 "};", 10912 Alignment); 10913 verifyFormat("int i = 1;\n" 10914 "if (SomeType t = getSomething()) {\n" 10915 "}\n" 10916 "int j = 2;\n" 10917 "int big = 10000;", 10918 Alignment); 10919 verifyFormat("int j = 7;\n" 10920 "for (int k = 0; k < N; ++k) {\n" 10921 "}\n" 10922 "int j = 2;\n" 10923 "int big = 10000;\n" 10924 "}", 10925 Alignment); 10926 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10927 verifyFormat("int i = 1;\n" 10928 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10929 " = someLooooooooooooooooongFunction();\n" 10930 "int j = 2;", 10931 Alignment); 10932 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10933 verifyFormat("int i = 1;\n" 10934 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10935 " someLooooooooooooooooongFunction();\n" 10936 "int j = 2;", 10937 Alignment); 10938 10939 verifyFormat("auto lambda = []() {\n" 10940 " auto i = 0;\n" 10941 " return 0;\n" 10942 "};\n" 10943 "int i = 0;\n" 10944 "auto v = type{\n" 10945 " i = 1, //\n" 10946 " (i = 2), //\n" 10947 " i = 3 //\n" 10948 "};", 10949 Alignment); 10950 10951 verifyFormat( 10952 "int i = 1;\n" 10953 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10954 " loooooooooooooooooooooongParameterB);\n" 10955 "int j = 2;", 10956 Alignment); 10957 10958 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 10959 " typename B = very_long_type_name_1,\n" 10960 " typename T_2 = very_long_type_name_2>\n" 10961 "auto foo() {}\n", 10962 Alignment); 10963 verifyFormat("int a, b = 1;\n" 10964 "int c = 2;\n" 10965 "int dd = 3;\n", 10966 Alignment); 10967 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10968 "float b[1][] = {{3.f}};\n", 10969 Alignment); 10970 verifyFormat("for (int i = 0; i < 1; i++)\n" 10971 " int x = 1;\n", 10972 Alignment); 10973 verifyFormat("for (i = 0; i < 1; i++)\n" 10974 " x = 1;\n" 10975 "y = 1;\n", 10976 Alignment); 10977 } 10978 10979 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 10980 FormatStyle Alignment = getLLVMStyle(); 10981 Alignment.AlignConsecutiveMacros = true; 10982 Alignment.AlignConsecutiveDeclarations = false; 10983 verifyFormat("float const a = 5;\n" 10984 "int oneTwoThree = 123;", 10985 Alignment); 10986 verifyFormat("int a = 5;\n" 10987 "float const oneTwoThree = 123;", 10988 Alignment); 10989 10990 Alignment.AlignConsecutiveDeclarations = true; 10991 verifyFormat("float const a = 5;\n" 10992 "int oneTwoThree = 123;", 10993 Alignment); 10994 verifyFormat("int a = method();\n" 10995 "float const oneTwoThree = 133;", 10996 Alignment); 10997 verifyFormat("int i = 1, j = 10;\n" 10998 "something = 2000;", 10999 Alignment); 11000 verifyFormat("something = 2000;\n" 11001 "int i = 1, j = 10;\n", 11002 Alignment); 11003 verifyFormat("float something = 2000;\n" 11004 "double another = 911;\n" 11005 "int i = 1, j = 10;\n" 11006 "const int *oneMore = 1;\n" 11007 "unsigned i = 2;", 11008 Alignment); 11009 verifyFormat("float a = 5;\n" 11010 "int one = 1;\n" 11011 "method();\n" 11012 "const double oneTwoThree = 123;\n" 11013 "const unsigned int oneTwo = 12;", 11014 Alignment); 11015 verifyFormat("int oneTwoThree{0}; // comment\n" 11016 "unsigned oneTwo; // comment", 11017 Alignment); 11018 EXPECT_EQ("float const a = 5;\n" 11019 "\n" 11020 "int oneTwoThree = 123;", 11021 format("float const a = 5;\n" 11022 "\n" 11023 "int oneTwoThree= 123;", 11024 Alignment)); 11025 EXPECT_EQ("float a = 5;\n" 11026 "int one = 1;\n" 11027 "\n" 11028 "unsigned oneTwoThree = 123;", 11029 format("float a = 5;\n" 11030 "int one = 1;\n" 11031 "\n" 11032 "unsigned oneTwoThree = 123;", 11033 Alignment)); 11034 EXPECT_EQ("float a = 5;\n" 11035 "int one = 1;\n" 11036 "\n" 11037 "unsigned oneTwoThree = 123;\n" 11038 "int oneTwo = 12;", 11039 format("float a = 5;\n" 11040 "int one = 1;\n" 11041 "\n" 11042 "unsigned oneTwoThree = 123;\n" 11043 "int oneTwo = 12;", 11044 Alignment)); 11045 // Function prototype alignment 11046 verifyFormat("int a();\n" 11047 "double b();", 11048 Alignment); 11049 verifyFormat("int a(int x);\n" 11050 "double b();", 11051 Alignment); 11052 unsigned OldColumnLimit = Alignment.ColumnLimit; 11053 // We need to set ColumnLimit to zero, in order to stress nested alignments, 11054 // otherwise the function parameters will be re-flowed onto a single line. 11055 Alignment.ColumnLimit = 0; 11056 EXPECT_EQ("int a(int x,\n" 11057 " float y);\n" 11058 "double b(int x,\n" 11059 " double y);", 11060 format("int a(int x,\n" 11061 " float y);\n" 11062 "double b(int x,\n" 11063 " double y);", 11064 Alignment)); 11065 // This ensures that function parameters of function declarations are 11066 // correctly indented when their owning functions are indented. 11067 // The failure case here is for 'double y' to not be indented enough. 11068 EXPECT_EQ("double a(int x);\n" 11069 "int b(int y,\n" 11070 " double z);", 11071 format("double a(int x);\n" 11072 "int b(int y,\n" 11073 " double z);", 11074 Alignment)); 11075 // Set ColumnLimit low so that we induce wrapping immediately after 11076 // the function name and opening paren. 11077 Alignment.ColumnLimit = 13; 11078 verifyFormat("int function(\n" 11079 " int x,\n" 11080 " bool y);", 11081 Alignment); 11082 Alignment.ColumnLimit = OldColumnLimit; 11083 // Ensure function pointers don't screw up recursive alignment 11084 verifyFormat("int a(int x, void (*fp)(int y));\n" 11085 "double b();", 11086 Alignment); 11087 Alignment.AlignConsecutiveAssignments = true; 11088 // Ensure recursive alignment is broken by function braces, so that the 11089 // "a = 1" does not align with subsequent assignments inside the function 11090 // body. 11091 verifyFormat("int func(int a = 1) {\n" 11092 " int b = 2;\n" 11093 " int cc = 3;\n" 11094 "}", 11095 Alignment); 11096 verifyFormat("float something = 2000;\n" 11097 "double another = 911;\n" 11098 "int i = 1, j = 10;\n" 11099 "const int *oneMore = 1;\n" 11100 "unsigned i = 2;", 11101 Alignment); 11102 verifyFormat("int oneTwoThree = {0}; // comment\n" 11103 "unsigned oneTwo = 0; // comment", 11104 Alignment); 11105 // Make sure that scope is correctly tracked, in the absence of braces 11106 verifyFormat("for (int i = 0; i < n; i++)\n" 11107 " j = i;\n" 11108 "double x = 1;\n", 11109 Alignment); 11110 verifyFormat("if (int i = 0)\n" 11111 " j = i;\n" 11112 "double x = 1;\n", 11113 Alignment); 11114 // Ensure operator[] and operator() are comprehended 11115 verifyFormat("struct test {\n" 11116 " long long int foo();\n" 11117 " int operator[](int a);\n" 11118 " double bar();\n" 11119 "};\n", 11120 Alignment); 11121 verifyFormat("struct test {\n" 11122 " long long int foo();\n" 11123 " int operator()(int a);\n" 11124 " double bar();\n" 11125 "};\n", 11126 Alignment); 11127 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 11128 " int const i = 1;\n" 11129 " int * j = 2;\n" 11130 " int big = 10000;\n" 11131 "\n" 11132 " unsigned oneTwoThree = 123;\n" 11133 " int oneTwo = 12;\n" 11134 " method();\n" 11135 " float k = 2;\n" 11136 " int ll = 10000;\n" 11137 "}", 11138 format("void SomeFunction(int parameter= 0) {\n" 11139 " int const i= 1;\n" 11140 " int *j=2;\n" 11141 " int big = 10000;\n" 11142 "\n" 11143 "unsigned oneTwoThree =123;\n" 11144 "int oneTwo = 12;\n" 11145 " method();\n" 11146 "float k= 2;\n" 11147 "int ll=10000;\n" 11148 "}", 11149 Alignment)); 11150 Alignment.AlignConsecutiveAssignments = false; 11151 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11152 verifyFormat("#define A \\\n" 11153 " int aaaa = 12; \\\n" 11154 " float b = 23; \\\n" 11155 " const int ccc = 234; \\\n" 11156 " unsigned dddddddddd = 2345;", 11157 Alignment); 11158 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11159 verifyFormat("#define A \\\n" 11160 " int aaaa = 12; \\\n" 11161 " float b = 23; \\\n" 11162 " const int ccc = 234; \\\n" 11163 " unsigned dddddddddd = 2345;", 11164 Alignment); 11165 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11166 Alignment.ColumnLimit = 30; 11167 verifyFormat("#define A \\\n" 11168 " int aaaa = 12; \\\n" 11169 " float b = 23; \\\n" 11170 " const int ccc = 234; \\\n" 11171 " int dddddddddd = 2345;", 11172 Alignment); 11173 Alignment.ColumnLimit = 80; 11174 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11175 "k = 4, int l = 5,\n" 11176 " int m = 6) {\n" 11177 " const int j = 10;\n" 11178 " otherThing = 1;\n" 11179 "}", 11180 Alignment); 11181 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11182 " int const i = 1;\n" 11183 " int * j = 2;\n" 11184 " int big = 10000;\n" 11185 "}", 11186 Alignment); 11187 verifyFormat("class C {\n" 11188 "public:\n" 11189 " int i = 1;\n" 11190 " virtual void f() = 0;\n" 11191 "};", 11192 Alignment); 11193 verifyFormat("float i = 1;\n" 11194 "if (SomeType t = getSomething()) {\n" 11195 "}\n" 11196 "const unsigned j = 2;\n" 11197 "int big = 10000;", 11198 Alignment); 11199 verifyFormat("float j = 7;\n" 11200 "for (int k = 0; k < N; ++k) {\n" 11201 "}\n" 11202 "unsigned j = 2;\n" 11203 "int big = 10000;\n" 11204 "}", 11205 Alignment); 11206 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11207 verifyFormat("float i = 1;\n" 11208 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11209 " = someLooooooooooooooooongFunction();\n" 11210 "int j = 2;", 11211 Alignment); 11212 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11213 verifyFormat("int i = 1;\n" 11214 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11215 " someLooooooooooooooooongFunction();\n" 11216 "int j = 2;", 11217 Alignment); 11218 11219 Alignment.AlignConsecutiveAssignments = true; 11220 verifyFormat("auto lambda = []() {\n" 11221 " auto ii = 0;\n" 11222 " float j = 0;\n" 11223 " return 0;\n" 11224 "};\n" 11225 "int i = 0;\n" 11226 "float i2 = 0;\n" 11227 "auto v = type{\n" 11228 " i = 1, //\n" 11229 " (i = 2), //\n" 11230 " i = 3 //\n" 11231 "};", 11232 Alignment); 11233 Alignment.AlignConsecutiveAssignments = false; 11234 11235 verifyFormat( 11236 "int i = 1;\n" 11237 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11238 " loooooooooooooooooooooongParameterB);\n" 11239 "int j = 2;", 11240 Alignment); 11241 11242 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 11243 // We expect declarations and assignments to align, as long as it doesn't 11244 // exceed the column limit, starting a new alignment sequence whenever it 11245 // happens. 11246 Alignment.AlignConsecutiveAssignments = true; 11247 Alignment.ColumnLimit = 30; 11248 verifyFormat("float ii = 1;\n" 11249 "unsigned j = 2;\n" 11250 "int someVerylongVariable = 1;\n" 11251 "AnotherLongType ll = 123456;\n" 11252 "VeryVeryLongType k = 2;\n" 11253 "int myvar = 1;", 11254 Alignment); 11255 Alignment.ColumnLimit = 80; 11256 Alignment.AlignConsecutiveAssignments = false; 11257 11258 verifyFormat( 11259 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 11260 " typename LongType, typename B>\n" 11261 "auto foo() {}\n", 11262 Alignment); 11263 verifyFormat("float a, b = 1;\n" 11264 "int c = 2;\n" 11265 "int dd = 3;\n", 11266 Alignment); 11267 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11268 "float b[1][] = {{3.f}};\n", 11269 Alignment); 11270 Alignment.AlignConsecutiveAssignments = true; 11271 verifyFormat("float a, b = 1;\n" 11272 "int c = 2;\n" 11273 "int dd = 3;\n", 11274 Alignment); 11275 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11276 "float b[1][] = {{3.f}};\n", 11277 Alignment); 11278 Alignment.AlignConsecutiveAssignments = false; 11279 11280 Alignment.ColumnLimit = 30; 11281 Alignment.BinPackParameters = false; 11282 verifyFormat("void foo(float a,\n" 11283 " float b,\n" 11284 " int c,\n" 11285 " uint32_t *d) {\n" 11286 " int * e = 0;\n" 11287 " float f = 0;\n" 11288 " double g = 0;\n" 11289 "}\n" 11290 "void bar(ino_t a,\n" 11291 " int b,\n" 11292 " uint32_t *c,\n" 11293 " bool d) {}\n", 11294 Alignment); 11295 Alignment.BinPackParameters = true; 11296 Alignment.ColumnLimit = 80; 11297 11298 // Bug 33507 11299 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 11300 verifyFormat( 11301 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 11302 " static const Version verVs2017;\n" 11303 " return true;\n" 11304 "});\n", 11305 Alignment); 11306 Alignment.PointerAlignment = FormatStyle::PAS_Right; 11307 11308 // See llvm.org/PR35641 11309 Alignment.AlignConsecutiveDeclarations = true; 11310 verifyFormat("int func() { //\n" 11311 " int b;\n" 11312 " unsigned c;\n" 11313 "}", 11314 Alignment); 11315 11316 // See PR37175 11317 FormatStyle Style = getMozillaStyle(); 11318 Style.AlignConsecutiveDeclarations = true; 11319 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 11320 "foo(int a);", 11321 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 11322 } 11323 11324 TEST_F(FormatTest, LinuxBraceBreaking) { 11325 FormatStyle LinuxBraceStyle = getLLVMStyle(); 11326 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 11327 verifyFormat("namespace a\n" 11328 "{\n" 11329 "class A\n" 11330 "{\n" 11331 " void f()\n" 11332 " {\n" 11333 " if (true) {\n" 11334 " a();\n" 11335 " b();\n" 11336 " } else {\n" 11337 " a();\n" 11338 " }\n" 11339 " }\n" 11340 " void g() { return; }\n" 11341 "};\n" 11342 "struct B {\n" 11343 " int x;\n" 11344 "};\n" 11345 "} // namespace a\n", 11346 LinuxBraceStyle); 11347 verifyFormat("enum X {\n" 11348 " Y = 0,\n" 11349 "}\n", 11350 LinuxBraceStyle); 11351 verifyFormat("struct S {\n" 11352 " int Type;\n" 11353 " union {\n" 11354 " int x;\n" 11355 " double y;\n" 11356 " } Value;\n" 11357 " class C\n" 11358 " {\n" 11359 " MyFavoriteType Value;\n" 11360 " } Class;\n" 11361 "}\n", 11362 LinuxBraceStyle); 11363 } 11364 11365 TEST_F(FormatTest, MozillaBraceBreaking) { 11366 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11367 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11368 MozillaBraceStyle.FixNamespaceComments = false; 11369 verifyFormat("namespace a {\n" 11370 "class A\n" 11371 "{\n" 11372 " void f()\n" 11373 " {\n" 11374 " if (true) {\n" 11375 " a();\n" 11376 " b();\n" 11377 " }\n" 11378 " }\n" 11379 " void g() { return; }\n" 11380 "};\n" 11381 "enum E\n" 11382 "{\n" 11383 " A,\n" 11384 " // foo\n" 11385 " B,\n" 11386 " C\n" 11387 "};\n" 11388 "struct B\n" 11389 "{\n" 11390 " int x;\n" 11391 "};\n" 11392 "}\n", 11393 MozillaBraceStyle); 11394 verifyFormat("struct S\n" 11395 "{\n" 11396 " int Type;\n" 11397 " union\n" 11398 " {\n" 11399 " int x;\n" 11400 " double y;\n" 11401 " } Value;\n" 11402 " class C\n" 11403 " {\n" 11404 " MyFavoriteType Value;\n" 11405 " } Class;\n" 11406 "}\n", 11407 MozillaBraceStyle); 11408 } 11409 11410 TEST_F(FormatTest, StroustrupBraceBreaking) { 11411 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11412 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11413 verifyFormat("namespace a {\n" 11414 "class A {\n" 11415 " void f()\n" 11416 " {\n" 11417 " if (true) {\n" 11418 " a();\n" 11419 " b();\n" 11420 " }\n" 11421 " }\n" 11422 " void g() { return; }\n" 11423 "};\n" 11424 "struct B {\n" 11425 " int x;\n" 11426 "};\n" 11427 "} // namespace a\n", 11428 StroustrupBraceStyle); 11429 11430 verifyFormat("void foo()\n" 11431 "{\n" 11432 " if (a) {\n" 11433 " a();\n" 11434 " }\n" 11435 " else {\n" 11436 " b();\n" 11437 " }\n" 11438 "}\n", 11439 StroustrupBraceStyle); 11440 11441 verifyFormat("#ifdef _DEBUG\n" 11442 "int foo(int i = 0)\n" 11443 "#else\n" 11444 "int foo(int i = 5)\n" 11445 "#endif\n" 11446 "{\n" 11447 " return i;\n" 11448 "}", 11449 StroustrupBraceStyle); 11450 11451 verifyFormat("void foo() {}\n" 11452 "void bar()\n" 11453 "#ifdef _DEBUG\n" 11454 "{\n" 11455 " foo();\n" 11456 "}\n" 11457 "#else\n" 11458 "{\n" 11459 "}\n" 11460 "#endif", 11461 StroustrupBraceStyle); 11462 11463 verifyFormat("void foobar() { int i = 5; }\n" 11464 "#ifdef _DEBUG\n" 11465 "void bar() {}\n" 11466 "#else\n" 11467 "void bar() { foobar(); }\n" 11468 "#endif", 11469 StroustrupBraceStyle); 11470 } 11471 11472 TEST_F(FormatTest, AllmanBraceBreaking) { 11473 FormatStyle AllmanBraceStyle = getLLVMStyle(); 11474 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 11475 11476 EXPECT_EQ("namespace a\n" 11477 "{\n" 11478 "void f();\n" 11479 "void g();\n" 11480 "} // namespace a\n", 11481 format("namespace a\n" 11482 "{\n" 11483 "void f();\n" 11484 "void g();\n" 11485 "}\n", 11486 AllmanBraceStyle)); 11487 11488 verifyFormat("namespace a\n" 11489 "{\n" 11490 "class A\n" 11491 "{\n" 11492 " void f()\n" 11493 " {\n" 11494 " if (true)\n" 11495 " {\n" 11496 " a();\n" 11497 " b();\n" 11498 " }\n" 11499 " }\n" 11500 " void g() { return; }\n" 11501 "};\n" 11502 "struct B\n" 11503 "{\n" 11504 " int x;\n" 11505 "};\n" 11506 "union C\n" 11507 "{\n" 11508 "};\n" 11509 "} // namespace a", 11510 AllmanBraceStyle); 11511 11512 verifyFormat("void f()\n" 11513 "{\n" 11514 " if (true)\n" 11515 " {\n" 11516 " a();\n" 11517 " }\n" 11518 " else if (false)\n" 11519 " {\n" 11520 " b();\n" 11521 " }\n" 11522 " else\n" 11523 " {\n" 11524 " c();\n" 11525 " }\n" 11526 "}\n", 11527 AllmanBraceStyle); 11528 11529 verifyFormat("void f()\n" 11530 "{\n" 11531 " for (int i = 0; i < 10; ++i)\n" 11532 " {\n" 11533 " a();\n" 11534 " }\n" 11535 " while (false)\n" 11536 " {\n" 11537 " b();\n" 11538 " }\n" 11539 " do\n" 11540 " {\n" 11541 " c();\n" 11542 " } while (false)\n" 11543 "}\n", 11544 AllmanBraceStyle); 11545 11546 verifyFormat("void f(int a)\n" 11547 "{\n" 11548 " switch (a)\n" 11549 " {\n" 11550 " case 0:\n" 11551 " break;\n" 11552 " case 1:\n" 11553 " {\n" 11554 " break;\n" 11555 " }\n" 11556 " case 2:\n" 11557 " {\n" 11558 " }\n" 11559 " break;\n" 11560 " default:\n" 11561 " break;\n" 11562 " }\n" 11563 "}\n", 11564 AllmanBraceStyle); 11565 11566 verifyFormat("enum X\n" 11567 "{\n" 11568 " Y = 0,\n" 11569 "}\n", 11570 AllmanBraceStyle); 11571 verifyFormat("enum X\n" 11572 "{\n" 11573 " Y = 0\n" 11574 "}\n", 11575 AllmanBraceStyle); 11576 11577 verifyFormat("@interface BSApplicationController ()\n" 11578 "{\n" 11579 "@private\n" 11580 " id _extraIvar;\n" 11581 "}\n" 11582 "@end\n", 11583 AllmanBraceStyle); 11584 11585 verifyFormat("#ifdef _DEBUG\n" 11586 "int foo(int i = 0)\n" 11587 "#else\n" 11588 "int foo(int i = 5)\n" 11589 "#endif\n" 11590 "{\n" 11591 " return i;\n" 11592 "}", 11593 AllmanBraceStyle); 11594 11595 verifyFormat("void foo() {}\n" 11596 "void bar()\n" 11597 "#ifdef _DEBUG\n" 11598 "{\n" 11599 " foo();\n" 11600 "}\n" 11601 "#else\n" 11602 "{\n" 11603 "}\n" 11604 "#endif", 11605 AllmanBraceStyle); 11606 11607 verifyFormat("void foobar() { int i = 5; }\n" 11608 "#ifdef _DEBUG\n" 11609 "void bar() {}\n" 11610 "#else\n" 11611 "void bar() { foobar(); }\n" 11612 "#endif", 11613 AllmanBraceStyle); 11614 11615 // This shouldn't affect ObjC blocks.. 11616 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11617 " // ...\n" 11618 " int i;\n" 11619 "}];", 11620 AllmanBraceStyle); 11621 verifyFormat("void (^block)(void) = ^{\n" 11622 " // ...\n" 11623 " int i;\n" 11624 "};", 11625 AllmanBraceStyle); 11626 // .. or dict literals. 11627 verifyFormat("void f()\n" 11628 "{\n" 11629 " // ...\n" 11630 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11631 "}", 11632 AllmanBraceStyle); 11633 verifyFormat("void f()\n" 11634 "{\n" 11635 " // ...\n" 11636 " [object someMethod:@{a : @\"b\"}];\n" 11637 "}", 11638 AllmanBraceStyle); 11639 verifyFormat("int f()\n" 11640 "{ // comment\n" 11641 " return 42;\n" 11642 "}", 11643 AllmanBraceStyle); 11644 11645 AllmanBraceStyle.ColumnLimit = 19; 11646 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11647 AllmanBraceStyle.ColumnLimit = 18; 11648 verifyFormat("void f()\n" 11649 "{\n" 11650 " int i;\n" 11651 "}", 11652 AllmanBraceStyle); 11653 AllmanBraceStyle.ColumnLimit = 80; 11654 11655 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11656 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11657 FormatStyle::SIS_WithoutElse; 11658 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11659 verifyFormat("void f(bool b)\n" 11660 "{\n" 11661 " if (b)\n" 11662 " {\n" 11663 " return;\n" 11664 " }\n" 11665 "}\n", 11666 BreakBeforeBraceShortIfs); 11667 verifyFormat("void f(bool b)\n" 11668 "{\n" 11669 " if constexpr (b)\n" 11670 " {\n" 11671 " return;\n" 11672 " }\n" 11673 "}\n", 11674 BreakBeforeBraceShortIfs); 11675 verifyFormat("void f(bool b)\n" 11676 "{\n" 11677 " if CONSTEXPR (b)\n" 11678 " {\n" 11679 " return;\n" 11680 " }\n" 11681 "}\n", 11682 BreakBeforeBraceShortIfs); 11683 verifyFormat("void f(bool b)\n" 11684 "{\n" 11685 " if (b) return;\n" 11686 "}\n", 11687 BreakBeforeBraceShortIfs); 11688 verifyFormat("void f(bool b)\n" 11689 "{\n" 11690 " if constexpr (b) return;\n" 11691 "}\n", 11692 BreakBeforeBraceShortIfs); 11693 verifyFormat("void f(bool b)\n" 11694 "{\n" 11695 " if CONSTEXPR (b) return;\n" 11696 "}\n", 11697 BreakBeforeBraceShortIfs); 11698 verifyFormat("void f(bool b)\n" 11699 "{\n" 11700 " while (b)\n" 11701 " {\n" 11702 " return;\n" 11703 " }\n" 11704 "}\n", 11705 BreakBeforeBraceShortIfs); 11706 } 11707 11708 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 11709 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 11710 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 11711 11712 // Make a few changes to the style for testing purposes 11713 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 11714 FormatStyle::SFS_Empty; 11715 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 11716 WhitesmithsBraceStyle.ColumnLimit = 0; 11717 11718 // FIXME: this test case can't decide whether there should be a blank line 11719 // after the ~D() line or not. It adds one if one doesn't exist in the test 11720 // and it removes the line if one exists. 11721 /* 11722 verifyFormat("class A;\n" 11723 "namespace B\n" 11724 " {\n" 11725 "class C;\n" 11726 "// Comment\n" 11727 "class D\n" 11728 " {\n" 11729 "public:\n" 11730 " D();\n" 11731 " ~D() {}\n" 11732 "private:\n" 11733 " enum E\n" 11734 " {\n" 11735 " F\n" 11736 " }\n" 11737 " };\n" 11738 " } // namespace B\n", 11739 WhitesmithsBraceStyle); 11740 */ 11741 11742 verifyFormat("namespace a\n" 11743 " {\n" 11744 "class A\n" 11745 " {\n" 11746 " void f()\n" 11747 " {\n" 11748 " if (true)\n" 11749 " {\n" 11750 " a();\n" 11751 " b();\n" 11752 " }\n" 11753 " }\n" 11754 " void g()\n" 11755 " {\n" 11756 " return;\n" 11757 " }\n" 11758 " };\n" 11759 "struct B\n" 11760 " {\n" 11761 " int x;\n" 11762 " };\n" 11763 " } // namespace a", 11764 WhitesmithsBraceStyle); 11765 11766 verifyFormat("void f()\n" 11767 " {\n" 11768 " if (true)\n" 11769 " {\n" 11770 " a();\n" 11771 " }\n" 11772 " else if (false)\n" 11773 " {\n" 11774 " b();\n" 11775 " }\n" 11776 " else\n" 11777 " {\n" 11778 " c();\n" 11779 " }\n" 11780 " }\n", 11781 WhitesmithsBraceStyle); 11782 11783 verifyFormat("void f()\n" 11784 " {\n" 11785 " for (int i = 0; i < 10; ++i)\n" 11786 " {\n" 11787 " a();\n" 11788 " }\n" 11789 " while (false)\n" 11790 " {\n" 11791 " b();\n" 11792 " }\n" 11793 " do\n" 11794 " {\n" 11795 " c();\n" 11796 " } while (false)\n" 11797 " }\n", 11798 WhitesmithsBraceStyle); 11799 11800 // FIXME: the block and the break under case 2 in this test don't get indented 11801 // correctly 11802 /* 11803 verifyFormat("void switchTest1(int a)\n" 11804 " {\n" 11805 " switch (a)\n" 11806 " {\n" 11807 " case 2:\n" 11808 " {\n" 11809 " }\n" 11810 " break;\n" 11811 " }\n" 11812 " }\n", 11813 WhitesmithsBraceStyle); 11814 */ 11815 11816 // FIXME: the block and the break under case 2 in this test don't get indented 11817 // correctly 11818 /* 11819 verifyFormat("void switchTest2(int a)\n" 11820 " {\n" 11821 " switch (a)\n" 11822 " {\n" 11823 " case 0:\n" 11824 " break;\n" 11825 " case 1:\n" 11826 " {\n" 11827 " break;\n" 11828 " }\n" 11829 " case 2:\n" 11830 " {\n" 11831 " }\n" 11832 " break;\n" 11833 " default:\n" 11834 " break;\n" 11835 " }\n" 11836 " }\n", 11837 WhitesmithsBraceStyle); 11838 */ 11839 11840 verifyFormat("enum X\n" 11841 " {\n" 11842 " Y = 0, // testing\n" 11843 " }\n", 11844 WhitesmithsBraceStyle); 11845 11846 verifyFormat("enum X\n" 11847 " {\n" 11848 " Y = 0\n" 11849 " }\n", 11850 WhitesmithsBraceStyle); 11851 verifyFormat("enum X\n" 11852 " {\n" 11853 " Y = 0,\n" 11854 " Z = 1\n" 11855 " };\n", 11856 WhitesmithsBraceStyle); 11857 11858 verifyFormat("@interface BSApplicationController ()\n" 11859 " {\n" 11860 "@private\n" 11861 " id _extraIvar;\n" 11862 " }\n" 11863 "@end\n", 11864 WhitesmithsBraceStyle); 11865 11866 verifyFormat("#ifdef _DEBUG\n" 11867 "int foo(int i = 0)\n" 11868 "#else\n" 11869 "int foo(int i = 5)\n" 11870 "#endif\n" 11871 " {\n" 11872 " return i;\n" 11873 " }", 11874 WhitesmithsBraceStyle); 11875 11876 verifyFormat("void foo() {}\n" 11877 "void bar()\n" 11878 "#ifdef _DEBUG\n" 11879 " {\n" 11880 " foo();\n" 11881 " }\n" 11882 "#else\n" 11883 " {\n" 11884 " }\n" 11885 "#endif", 11886 WhitesmithsBraceStyle); 11887 11888 verifyFormat("void foobar()\n" 11889 " {\n" 11890 " int i = 5;\n" 11891 " }\n" 11892 "#ifdef _DEBUG\n" 11893 "void bar()\n" 11894 " {\n" 11895 " }\n" 11896 "#else\n" 11897 "void bar()\n" 11898 " {\n" 11899 " foobar();\n" 11900 " }\n" 11901 "#endif", 11902 WhitesmithsBraceStyle); 11903 11904 // This shouldn't affect ObjC blocks.. 11905 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11906 " // ...\n" 11907 " int i;\n" 11908 "}];", 11909 WhitesmithsBraceStyle); 11910 verifyFormat("void (^block)(void) = ^{\n" 11911 " // ...\n" 11912 " int i;\n" 11913 "};", 11914 WhitesmithsBraceStyle); 11915 // .. or dict literals. 11916 verifyFormat("void f()\n" 11917 " {\n" 11918 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11919 " }", 11920 WhitesmithsBraceStyle); 11921 11922 verifyFormat("int f()\n" 11923 " { // comment\n" 11924 " return 42;\n" 11925 " }", 11926 WhitesmithsBraceStyle); 11927 11928 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 11929 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11930 FormatStyle::SIS_Always; 11931 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11932 verifyFormat("void f(bool b)\n" 11933 " {\n" 11934 " if (b)\n" 11935 " {\n" 11936 " return;\n" 11937 " }\n" 11938 " }\n", 11939 BreakBeforeBraceShortIfs); 11940 verifyFormat("void f(bool b)\n" 11941 " {\n" 11942 " if (b) return;\n" 11943 " }\n", 11944 BreakBeforeBraceShortIfs); 11945 verifyFormat("void f(bool b)\n" 11946 " {\n" 11947 " while (b)\n" 11948 " {\n" 11949 " return;\n" 11950 " }\n" 11951 " }\n", 11952 BreakBeforeBraceShortIfs); 11953 } 11954 11955 TEST_F(FormatTest, GNUBraceBreaking) { 11956 FormatStyle GNUBraceStyle = getLLVMStyle(); 11957 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 11958 verifyFormat("namespace a\n" 11959 "{\n" 11960 "class A\n" 11961 "{\n" 11962 " void f()\n" 11963 " {\n" 11964 " int a;\n" 11965 " {\n" 11966 " int b;\n" 11967 " }\n" 11968 " if (true)\n" 11969 " {\n" 11970 " a();\n" 11971 " b();\n" 11972 " }\n" 11973 " }\n" 11974 " void g() { return; }\n" 11975 "}\n" 11976 "} // namespace a", 11977 GNUBraceStyle); 11978 11979 verifyFormat("void f()\n" 11980 "{\n" 11981 " if (true)\n" 11982 " {\n" 11983 " a();\n" 11984 " }\n" 11985 " else if (false)\n" 11986 " {\n" 11987 " b();\n" 11988 " }\n" 11989 " else\n" 11990 " {\n" 11991 " c();\n" 11992 " }\n" 11993 "}\n", 11994 GNUBraceStyle); 11995 11996 verifyFormat("void f()\n" 11997 "{\n" 11998 " for (int i = 0; i < 10; ++i)\n" 11999 " {\n" 12000 " a();\n" 12001 " }\n" 12002 " while (false)\n" 12003 " {\n" 12004 " b();\n" 12005 " }\n" 12006 " do\n" 12007 " {\n" 12008 " c();\n" 12009 " }\n" 12010 " while (false);\n" 12011 "}\n", 12012 GNUBraceStyle); 12013 12014 verifyFormat("void f(int a)\n" 12015 "{\n" 12016 " switch (a)\n" 12017 " {\n" 12018 " case 0:\n" 12019 " break;\n" 12020 " case 1:\n" 12021 " {\n" 12022 " break;\n" 12023 " }\n" 12024 " case 2:\n" 12025 " {\n" 12026 " }\n" 12027 " break;\n" 12028 " default:\n" 12029 " break;\n" 12030 " }\n" 12031 "}\n", 12032 GNUBraceStyle); 12033 12034 verifyFormat("enum X\n" 12035 "{\n" 12036 " Y = 0,\n" 12037 "}\n", 12038 GNUBraceStyle); 12039 12040 verifyFormat("@interface BSApplicationController ()\n" 12041 "{\n" 12042 "@private\n" 12043 " id _extraIvar;\n" 12044 "}\n" 12045 "@end\n", 12046 GNUBraceStyle); 12047 12048 verifyFormat("#ifdef _DEBUG\n" 12049 "int foo(int i = 0)\n" 12050 "#else\n" 12051 "int foo(int i = 5)\n" 12052 "#endif\n" 12053 "{\n" 12054 " return i;\n" 12055 "}", 12056 GNUBraceStyle); 12057 12058 verifyFormat("void foo() {}\n" 12059 "void bar()\n" 12060 "#ifdef _DEBUG\n" 12061 "{\n" 12062 " foo();\n" 12063 "}\n" 12064 "#else\n" 12065 "{\n" 12066 "}\n" 12067 "#endif", 12068 GNUBraceStyle); 12069 12070 verifyFormat("void foobar() { int i = 5; }\n" 12071 "#ifdef _DEBUG\n" 12072 "void bar() {}\n" 12073 "#else\n" 12074 "void bar() { foobar(); }\n" 12075 "#endif", 12076 GNUBraceStyle); 12077 } 12078 12079 TEST_F(FormatTest, WebKitBraceBreaking) { 12080 FormatStyle WebKitBraceStyle = getLLVMStyle(); 12081 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 12082 WebKitBraceStyle.FixNamespaceComments = false; 12083 verifyFormat("namespace a {\n" 12084 "class A {\n" 12085 " void f()\n" 12086 " {\n" 12087 " if (true) {\n" 12088 " a();\n" 12089 " b();\n" 12090 " }\n" 12091 " }\n" 12092 " void g() { return; }\n" 12093 "};\n" 12094 "enum E {\n" 12095 " A,\n" 12096 " // foo\n" 12097 " B,\n" 12098 " C\n" 12099 "};\n" 12100 "struct B {\n" 12101 " int x;\n" 12102 "};\n" 12103 "}\n", 12104 WebKitBraceStyle); 12105 verifyFormat("struct S {\n" 12106 " int Type;\n" 12107 " union {\n" 12108 " int x;\n" 12109 " double y;\n" 12110 " } Value;\n" 12111 " class C {\n" 12112 " MyFavoriteType Value;\n" 12113 " } Class;\n" 12114 "};\n", 12115 WebKitBraceStyle); 12116 } 12117 12118 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 12119 verifyFormat("void f() {\n" 12120 " try {\n" 12121 " } catch (const Exception &e) {\n" 12122 " }\n" 12123 "}\n", 12124 getLLVMStyle()); 12125 } 12126 12127 TEST_F(FormatTest, UnderstandsPragmas) { 12128 verifyFormat("#pragma omp reduction(| : var)"); 12129 verifyFormat("#pragma omp reduction(+ : var)"); 12130 12131 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 12132 "(including parentheses).", 12133 format("#pragma mark Any non-hyphenated or hyphenated string " 12134 "(including parentheses).")); 12135 } 12136 12137 TEST_F(FormatTest, UnderstandPragmaOption) { 12138 verifyFormat("#pragma option -C -A"); 12139 12140 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 12141 } 12142 12143 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 12144 FormatStyle Style = getLLVMStyle(); 12145 Style.ColumnLimit = 20; 12146 12147 // See PR41213 12148 EXPECT_EQ("/*\n" 12149 " *\t9012345\n" 12150 " * /8901\n" 12151 " */", 12152 format("/*\n" 12153 " *\t9012345 /8901\n" 12154 " */", 12155 Style)); 12156 EXPECT_EQ("/*\n" 12157 " *345678\n" 12158 " *\t/8901\n" 12159 " */", 12160 format("/*\n" 12161 " *345678\t/8901\n" 12162 " */", 12163 Style)); 12164 12165 verifyFormat("int a; // the\n" 12166 " // comment", 12167 Style); 12168 EXPECT_EQ("int a; /* first line\n" 12169 " * second\n" 12170 " * line third\n" 12171 " * line\n" 12172 " */", 12173 format("int a; /* first line\n" 12174 " * second\n" 12175 " * line third\n" 12176 " * line\n" 12177 " */", 12178 Style)); 12179 EXPECT_EQ("int a; // first line\n" 12180 " // second\n" 12181 " // line third\n" 12182 " // line", 12183 format("int a; // first line\n" 12184 " // second line\n" 12185 " // third line", 12186 Style)); 12187 12188 Style.PenaltyExcessCharacter = 90; 12189 verifyFormat("int a; // the comment", Style); 12190 EXPECT_EQ("int a; // the comment\n" 12191 " // aaa", 12192 format("int a; // the comment aaa", Style)); 12193 EXPECT_EQ("int a; /* first line\n" 12194 " * second line\n" 12195 " * third line\n" 12196 " */", 12197 format("int a; /* first line\n" 12198 " * second line\n" 12199 " * third line\n" 12200 " */", 12201 Style)); 12202 EXPECT_EQ("int a; // first line\n" 12203 " // second line\n" 12204 " // third line", 12205 format("int a; // first line\n" 12206 " // second line\n" 12207 " // third line", 12208 Style)); 12209 // FIXME: Investigate why this is not getting the same layout as the test 12210 // above. 12211 EXPECT_EQ("int a; /* first line\n" 12212 " * second line\n" 12213 " * third line\n" 12214 " */", 12215 format("int a; /* first line second line third line" 12216 "\n*/", 12217 Style)); 12218 12219 EXPECT_EQ("// foo bar baz bazfoo\n" 12220 "// foo bar foo bar\n", 12221 format("// foo bar baz bazfoo\n" 12222 "// foo bar foo bar\n", 12223 Style)); 12224 EXPECT_EQ("// foo bar baz bazfoo\n" 12225 "// foo bar foo bar\n", 12226 format("// foo bar baz bazfoo\n" 12227 "// foo bar foo bar\n", 12228 Style)); 12229 12230 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 12231 // next one. 12232 EXPECT_EQ("// foo bar baz bazfoo\n" 12233 "// bar foo bar\n", 12234 format("// foo bar baz bazfoo bar\n" 12235 "// foo bar\n", 12236 Style)); 12237 12238 EXPECT_EQ("// foo bar baz bazfoo\n" 12239 "// foo bar baz bazfoo\n" 12240 "// bar foo bar\n", 12241 format("// foo bar baz bazfoo\n" 12242 "// foo bar baz bazfoo bar\n" 12243 "// foo bar\n", 12244 Style)); 12245 12246 EXPECT_EQ("// foo bar baz bazfoo\n" 12247 "// foo bar baz bazfoo\n" 12248 "// bar foo bar\n", 12249 format("// foo bar baz bazfoo\n" 12250 "// foo bar baz bazfoo bar\n" 12251 "// foo bar\n", 12252 Style)); 12253 12254 // Make sure we do not keep protruding characters if strict mode reflow is 12255 // cheaper than keeping protruding characters. 12256 Style.ColumnLimit = 21; 12257 EXPECT_EQ( 12258 "// foo foo foo foo\n" 12259 "// foo foo foo foo\n" 12260 "// foo foo foo foo\n", 12261 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 12262 12263 EXPECT_EQ("int a = /* long block\n" 12264 " comment */\n" 12265 " 42;", 12266 format("int a = /* long block comment */ 42;", Style)); 12267 } 12268 12269 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 12270 for (size_t i = 1; i < Styles.size(); ++i) \ 12271 EXPECT_EQ(Styles[0], Styles[i]) \ 12272 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 12273 12274 TEST_F(FormatTest, GetsPredefinedStyleByName) { 12275 SmallVector<FormatStyle, 3> Styles; 12276 Styles.resize(3); 12277 12278 Styles[0] = getLLVMStyle(); 12279 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 12280 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 12281 EXPECT_ALL_STYLES_EQUAL(Styles); 12282 12283 Styles[0] = getGoogleStyle(); 12284 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 12285 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 12286 EXPECT_ALL_STYLES_EQUAL(Styles); 12287 12288 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12289 EXPECT_TRUE( 12290 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 12291 EXPECT_TRUE( 12292 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 12293 EXPECT_ALL_STYLES_EQUAL(Styles); 12294 12295 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 12296 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 12297 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 12298 EXPECT_ALL_STYLES_EQUAL(Styles); 12299 12300 Styles[0] = getMozillaStyle(); 12301 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 12302 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 12303 EXPECT_ALL_STYLES_EQUAL(Styles); 12304 12305 Styles[0] = getWebKitStyle(); 12306 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 12307 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 12308 EXPECT_ALL_STYLES_EQUAL(Styles); 12309 12310 Styles[0] = getGNUStyle(); 12311 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 12312 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 12313 EXPECT_ALL_STYLES_EQUAL(Styles); 12314 12315 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 12316 } 12317 12318 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 12319 SmallVector<FormatStyle, 8> Styles; 12320 Styles.resize(2); 12321 12322 Styles[0] = getGoogleStyle(); 12323 Styles[1] = getLLVMStyle(); 12324 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12325 EXPECT_ALL_STYLES_EQUAL(Styles); 12326 12327 Styles.resize(5); 12328 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12329 Styles[1] = getLLVMStyle(); 12330 Styles[1].Language = FormatStyle::LK_JavaScript; 12331 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12332 12333 Styles[2] = getLLVMStyle(); 12334 Styles[2].Language = FormatStyle::LK_JavaScript; 12335 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 12336 "BasedOnStyle: Google", 12337 &Styles[2]) 12338 .value()); 12339 12340 Styles[3] = getLLVMStyle(); 12341 Styles[3].Language = FormatStyle::LK_JavaScript; 12342 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 12343 "Language: JavaScript", 12344 &Styles[3]) 12345 .value()); 12346 12347 Styles[4] = getLLVMStyle(); 12348 Styles[4].Language = FormatStyle::LK_JavaScript; 12349 EXPECT_EQ(0, parseConfiguration("---\n" 12350 "BasedOnStyle: LLVM\n" 12351 "IndentWidth: 123\n" 12352 "---\n" 12353 "BasedOnStyle: Google\n" 12354 "Language: JavaScript", 12355 &Styles[4]) 12356 .value()); 12357 EXPECT_ALL_STYLES_EQUAL(Styles); 12358 } 12359 12360 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 12361 Style.FIELD = false; \ 12362 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 12363 EXPECT_TRUE(Style.FIELD); \ 12364 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 12365 EXPECT_FALSE(Style.FIELD); 12366 12367 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 12368 12369 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 12370 Style.STRUCT.FIELD = false; \ 12371 EXPECT_EQ(0, \ 12372 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 12373 .value()); \ 12374 EXPECT_TRUE(Style.STRUCT.FIELD); \ 12375 EXPECT_EQ(0, \ 12376 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 12377 .value()); \ 12378 EXPECT_FALSE(Style.STRUCT.FIELD); 12379 12380 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 12381 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 12382 12383 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 12384 EXPECT_NE(VALUE, Style.FIELD); \ 12385 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 12386 EXPECT_EQ(VALUE, Style.FIELD) 12387 12388 TEST_F(FormatTest, ParsesConfigurationBools) { 12389 FormatStyle Style = {}; 12390 Style.Language = FormatStyle::LK_Cpp; 12391 CHECK_PARSE_BOOL(AlignOperands); 12392 CHECK_PARSE_BOOL(AlignTrailingComments); 12393 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 12394 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 12395 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 12396 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 12397 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 12398 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 12399 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 12400 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 12401 CHECK_PARSE_BOOL(BinPackArguments); 12402 CHECK_PARSE_BOOL(BinPackParameters); 12403 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 12404 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 12405 CHECK_PARSE_BOOL(BreakStringLiterals); 12406 CHECK_PARSE_BOOL(CompactNamespaces); 12407 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 12408 CHECK_PARSE_BOOL(DerivePointerAlignment); 12409 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 12410 CHECK_PARSE_BOOL(DisableFormat); 12411 CHECK_PARSE_BOOL(IndentCaseLabels); 12412 CHECK_PARSE_BOOL(IndentGotoLabels); 12413 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 12414 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 12415 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 12416 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 12417 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 12418 CHECK_PARSE_BOOL(ReflowComments); 12419 CHECK_PARSE_BOOL(SortIncludes); 12420 CHECK_PARSE_BOOL(SortUsingDeclarations); 12421 CHECK_PARSE_BOOL(SpacesInParentheses); 12422 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 12423 CHECK_PARSE_BOOL(SpacesInAngles); 12424 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 12425 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 12426 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 12427 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 12428 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 12429 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 12430 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 12431 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 12432 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 12433 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 12434 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 12435 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 12436 12437 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 12438 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 12439 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 12440 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 12441 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 12442 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 12443 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 12444 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 12445 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 12446 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 12447 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 12448 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 12449 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 12450 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 12451 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 12452 } 12453 12454 #undef CHECK_PARSE_BOOL 12455 12456 TEST_F(FormatTest, ParsesConfiguration) { 12457 FormatStyle Style = {}; 12458 Style.Language = FormatStyle::LK_Cpp; 12459 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 12460 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 12461 ConstructorInitializerIndentWidth, 1234u); 12462 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 12463 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 12464 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 12465 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 12466 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 12467 PenaltyBreakBeforeFirstCallParameter, 1234u); 12468 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 12469 PenaltyBreakTemplateDeclaration, 1234u); 12470 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 12471 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 12472 PenaltyReturnTypeOnItsOwnLine, 1234u); 12473 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 12474 SpacesBeforeTrailingComments, 1234u); 12475 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 12476 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 12477 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 12478 12479 Style.PointerAlignment = FormatStyle::PAS_Middle; 12480 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 12481 FormatStyle::PAS_Left); 12482 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 12483 FormatStyle::PAS_Right); 12484 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 12485 FormatStyle::PAS_Middle); 12486 // For backward compatibility: 12487 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 12488 FormatStyle::PAS_Left); 12489 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 12490 FormatStyle::PAS_Right); 12491 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 12492 FormatStyle::PAS_Middle); 12493 12494 Style.Standard = FormatStyle::LS_Auto; 12495 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 12496 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 12497 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 12498 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 12499 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 12500 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 12501 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 12502 // Legacy aliases: 12503 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 12504 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 12505 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 12506 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 12507 12508 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12509 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 12510 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 12511 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 12512 FormatStyle::BOS_None); 12513 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 12514 FormatStyle::BOS_All); 12515 // For backward compatibility: 12516 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 12517 FormatStyle::BOS_None); 12518 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 12519 FormatStyle::BOS_All); 12520 12521 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 12522 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 12523 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12524 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 12525 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 12526 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 12527 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 12528 // For backward compatibility: 12529 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 12530 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12531 12532 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12533 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 12534 FormatStyle::BILS_BeforeComma); 12535 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 12536 FormatStyle::BILS_AfterColon); 12537 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 12538 FormatStyle::BILS_BeforeColon); 12539 // For backward compatibility: 12540 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 12541 FormatStyle::BILS_BeforeComma); 12542 12543 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12544 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 12545 FormatStyle::BAS_Align); 12546 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 12547 FormatStyle::BAS_DontAlign); 12548 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 12549 FormatStyle::BAS_AlwaysBreak); 12550 // For backward compatibility: 12551 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 12552 FormatStyle::BAS_DontAlign); 12553 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 12554 FormatStyle::BAS_Align); 12555 12556 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12557 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 12558 FormatStyle::ENAS_DontAlign); 12559 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 12560 FormatStyle::ENAS_Left); 12561 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 12562 FormatStyle::ENAS_Right); 12563 // For backward compatibility: 12564 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 12565 FormatStyle::ENAS_Left); 12566 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 12567 FormatStyle::ENAS_Right); 12568 12569 Style.UseTab = FormatStyle::UT_ForIndentation; 12570 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 12571 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 12572 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 12573 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 12574 FormatStyle::UT_ForContinuationAndIndentation); 12575 // For backward compatibility: 12576 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 12577 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 12578 12579 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 12580 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 12581 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12582 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 12583 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 12584 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 12585 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12586 // For backward compatibility: 12587 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 12588 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12589 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 12590 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12591 12592 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 12593 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 12594 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12595 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 12596 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 12597 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 12598 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 12599 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 12600 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12601 // For backward compatibility: 12602 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 12603 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12604 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 12605 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12606 12607 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 12608 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 12609 FormatStyle::SBPO_Never); 12610 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 12611 FormatStyle::SBPO_Always); 12612 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 12613 FormatStyle::SBPO_ControlStatements); 12614 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 12615 FormatStyle::SBPO_NonEmptyParentheses); 12616 // For backward compatibility: 12617 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 12618 FormatStyle::SBPO_Never); 12619 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 12620 FormatStyle::SBPO_ControlStatements); 12621 12622 Style.ColumnLimit = 123; 12623 FormatStyle BaseStyle = getLLVMStyle(); 12624 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 12625 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 12626 12627 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12628 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 12629 FormatStyle::BS_Attach); 12630 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 12631 FormatStyle::BS_Linux); 12632 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 12633 FormatStyle::BS_Mozilla); 12634 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 12635 FormatStyle::BS_Stroustrup); 12636 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 12637 FormatStyle::BS_Allman); 12638 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 12639 FormatStyle::BS_Whitesmiths); 12640 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 12641 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 12642 FormatStyle::BS_WebKit); 12643 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 12644 FormatStyle::BS_Custom); 12645 12646 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 12647 CHECK_PARSE("BraceWrapping:\n" 12648 " AfterControlStatement: MultiLine", 12649 BraceWrapping.AfterControlStatement, 12650 FormatStyle::BWACS_MultiLine); 12651 CHECK_PARSE("BraceWrapping:\n" 12652 " AfterControlStatement: Always", 12653 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12654 CHECK_PARSE("BraceWrapping:\n" 12655 " AfterControlStatement: Never", 12656 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12657 // For backward compatibility: 12658 CHECK_PARSE("BraceWrapping:\n" 12659 " AfterControlStatement: true", 12660 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 12661 CHECK_PARSE("BraceWrapping:\n" 12662 " AfterControlStatement: false", 12663 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 12664 12665 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 12666 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 12667 FormatStyle::RTBS_None); 12668 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 12669 FormatStyle::RTBS_All); 12670 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 12671 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 12672 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 12673 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 12674 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 12675 AlwaysBreakAfterReturnType, 12676 FormatStyle::RTBS_TopLevelDefinitions); 12677 12678 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 12679 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 12680 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 12681 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 12682 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12683 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 12684 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12685 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 12686 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12687 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 12688 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12689 12690 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 12691 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 12692 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 12693 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 12694 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 12695 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 12696 AlwaysBreakAfterDefinitionReturnType, 12697 FormatStyle::DRTBS_TopLevel); 12698 12699 Style.NamespaceIndentation = FormatStyle::NI_All; 12700 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 12701 FormatStyle::NI_None); 12702 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 12703 FormatStyle::NI_Inner); 12704 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 12705 FormatStyle::NI_All); 12706 12707 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 12708 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 12709 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12710 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 12711 AllowShortIfStatementsOnASingleLine, 12712 FormatStyle::SIS_WithoutElse); 12713 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 12714 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 12715 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 12716 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12717 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 12718 AllowShortIfStatementsOnASingleLine, 12719 FormatStyle::SIS_WithoutElse); 12720 12721 // FIXME: This is required because parsing a configuration simply overwrites 12722 // the first N elements of the list instead of resetting it. 12723 Style.ForEachMacros.clear(); 12724 std::vector<std::string> BoostForeach; 12725 BoostForeach.push_back("BOOST_FOREACH"); 12726 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 12727 std::vector<std::string> BoostAndQForeach; 12728 BoostAndQForeach.push_back("BOOST_FOREACH"); 12729 BoostAndQForeach.push_back("Q_FOREACH"); 12730 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 12731 BoostAndQForeach); 12732 12733 Style.StatementMacros.clear(); 12734 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 12735 std::vector<std::string>{"QUNUSED"}); 12736 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 12737 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 12738 12739 Style.NamespaceMacros.clear(); 12740 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 12741 std::vector<std::string>{"TESTSUITE"}); 12742 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 12743 std::vector<std::string>({"TESTSUITE", "SUITE"})); 12744 12745 Style.IncludeStyle.IncludeCategories.clear(); 12746 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 12747 {"abc/.*", 2, 0}, {".*", 1, 0}}; 12748 CHECK_PARSE("IncludeCategories:\n" 12749 " - Regex: abc/.*\n" 12750 " Priority: 2\n" 12751 " - Regex: .*\n" 12752 " Priority: 1", 12753 IncludeStyle.IncludeCategories, ExpectedCategories); 12754 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 12755 "abc$"); 12756 12757 Style.RawStringFormats.clear(); 12758 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 12759 { 12760 FormatStyle::LK_TextProto, 12761 {"pb", "proto"}, 12762 {"PARSE_TEXT_PROTO"}, 12763 /*CanonicalDelimiter=*/"", 12764 "llvm", 12765 }, 12766 { 12767 FormatStyle::LK_Cpp, 12768 {"cc", "cpp"}, 12769 {"C_CODEBLOCK", "CPPEVAL"}, 12770 /*CanonicalDelimiter=*/"cc", 12771 /*BasedOnStyle=*/"", 12772 }, 12773 }; 12774 12775 CHECK_PARSE("RawStringFormats:\n" 12776 " - Language: TextProto\n" 12777 " Delimiters:\n" 12778 " - 'pb'\n" 12779 " - 'proto'\n" 12780 " EnclosingFunctions:\n" 12781 " - 'PARSE_TEXT_PROTO'\n" 12782 " BasedOnStyle: llvm\n" 12783 " - Language: Cpp\n" 12784 " Delimiters:\n" 12785 " - 'cc'\n" 12786 " - 'cpp'\n" 12787 " EnclosingFunctions:\n" 12788 " - 'C_CODEBLOCK'\n" 12789 " - 'CPPEVAL'\n" 12790 " CanonicalDelimiter: 'cc'", 12791 RawStringFormats, ExpectedRawStringFormats); 12792 } 12793 12794 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 12795 FormatStyle Style = {}; 12796 Style.Language = FormatStyle::LK_Cpp; 12797 CHECK_PARSE("Language: Cpp\n" 12798 "IndentWidth: 12", 12799 IndentWidth, 12u); 12800 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 12801 "IndentWidth: 34", 12802 &Style), 12803 ParseError::Unsuitable); 12804 EXPECT_EQ(12u, Style.IndentWidth); 12805 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12806 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12807 12808 Style.Language = FormatStyle::LK_JavaScript; 12809 CHECK_PARSE("Language: JavaScript\n" 12810 "IndentWidth: 12", 12811 IndentWidth, 12u); 12812 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 12813 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 12814 "IndentWidth: 34", 12815 &Style), 12816 ParseError::Unsuitable); 12817 EXPECT_EQ(23u, Style.IndentWidth); 12818 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12819 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12820 12821 CHECK_PARSE("BasedOnStyle: LLVM\n" 12822 "IndentWidth: 67", 12823 IndentWidth, 67u); 12824 12825 CHECK_PARSE("---\n" 12826 "Language: JavaScript\n" 12827 "IndentWidth: 12\n" 12828 "---\n" 12829 "Language: Cpp\n" 12830 "IndentWidth: 34\n" 12831 "...\n", 12832 IndentWidth, 12u); 12833 12834 Style.Language = FormatStyle::LK_Cpp; 12835 CHECK_PARSE("---\n" 12836 "Language: JavaScript\n" 12837 "IndentWidth: 12\n" 12838 "---\n" 12839 "Language: Cpp\n" 12840 "IndentWidth: 34\n" 12841 "...\n", 12842 IndentWidth, 34u); 12843 CHECK_PARSE("---\n" 12844 "IndentWidth: 78\n" 12845 "---\n" 12846 "Language: JavaScript\n" 12847 "IndentWidth: 56\n" 12848 "...\n", 12849 IndentWidth, 78u); 12850 12851 Style.ColumnLimit = 123; 12852 Style.IndentWidth = 234; 12853 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 12854 Style.TabWidth = 345; 12855 EXPECT_FALSE(parseConfiguration("---\n" 12856 "IndentWidth: 456\n" 12857 "BreakBeforeBraces: Allman\n" 12858 "---\n" 12859 "Language: JavaScript\n" 12860 "IndentWidth: 111\n" 12861 "TabWidth: 111\n" 12862 "---\n" 12863 "Language: Cpp\n" 12864 "BreakBeforeBraces: Stroustrup\n" 12865 "TabWidth: 789\n" 12866 "...\n", 12867 &Style)); 12868 EXPECT_EQ(123u, Style.ColumnLimit); 12869 EXPECT_EQ(456u, Style.IndentWidth); 12870 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 12871 EXPECT_EQ(789u, Style.TabWidth); 12872 12873 EXPECT_EQ(parseConfiguration("---\n" 12874 "Language: JavaScript\n" 12875 "IndentWidth: 56\n" 12876 "---\n" 12877 "IndentWidth: 78\n" 12878 "...\n", 12879 &Style), 12880 ParseError::Error); 12881 EXPECT_EQ(parseConfiguration("---\n" 12882 "Language: JavaScript\n" 12883 "IndentWidth: 56\n" 12884 "---\n" 12885 "Language: JavaScript\n" 12886 "IndentWidth: 78\n" 12887 "...\n", 12888 &Style), 12889 ParseError::Error); 12890 12891 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12892 } 12893 12894 #undef CHECK_PARSE 12895 12896 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 12897 FormatStyle Style = {}; 12898 Style.Language = FormatStyle::LK_JavaScript; 12899 Style.BreakBeforeTernaryOperators = true; 12900 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 12901 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12902 12903 Style.BreakBeforeTernaryOperators = true; 12904 EXPECT_EQ(0, parseConfiguration("---\n" 12905 "BasedOnStyle: Google\n" 12906 "---\n" 12907 "Language: JavaScript\n" 12908 "IndentWidth: 76\n" 12909 "...\n", 12910 &Style) 12911 .value()); 12912 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12913 EXPECT_EQ(76u, Style.IndentWidth); 12914 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12915 } 12916 12917 TEST_F(FormatTest, ConfigurationRoundTripTest) { 12918 FormatStyle Style = getLLVMStyle(); 12919 std::string YAML = configurationAsText(Style); 12920 FormatStyle ParsedStyle = {}; 12921 ParsedStyle.Language = FormatStyle::LK_Cpp; 12922 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 12923 EXPECT_EQ(Style, ParsedStyle); 12924 } 12925 12926 TEST_F(FormatTest, WorksFor8bitEncodings) { 12927 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 12928 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 12929 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 12930 "\"\xef\xee\xf0\xf3...\"", 12931 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 12932 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 12933 "\xef\xee\xf0\xf3...\"", 12934 getLLVMStyleWithColumns(12))); 12935 } 12936 12937 TEST_F(FormatTest, HandlesUTF8BOM) { 12938 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 12939 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 12940 format("\xef\xbb\xbf#include <iostream>")); 12941 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 12942 format("\xef\xbb\xbf\n#include <iostream>")); 12943 } 12944 12945 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 12946 #if !defined(_MSC_VER) 12947 12948 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 12949 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 12950 getLLVMStyleWithColumns(35)); 12951 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 12952 getLLVMStyleWithColumns(31)); 12953 verifyFormat("// Однажды в студёную зимнюю пору...", 12954 getLLVMStyleWithColumns(36)); 12955 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 12956 verifyFormat("/* Однажды в студёную зимнюю пору... */", 12957 getLLVMStyleWithColumns(39)); 12958 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 12959 getLLVMStyleWithColumns(35)); 12960 } 12961 12962 TEST_F(FormatTest, SplitsUTF8Strings) { 12963 // Non-printable characters' width is currently considered to be the length in 12964 // bytes in UTF8. The characters can be displayed in very different manner 12965 // (zero-width, single width with a substitution glyph, expanded to their code 12966 // (e.g. "<8d>"), so there's no single correct way to handle them. 12967 EXPECT_EQ("\"aaaaÄ\"\n" 12968 "\"\xc2\x8d\";", 12969 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12970 EXPECT_EQ("\"aaaaaaaÄ\"\n" 12971 "\"\xc2\x8d\";", 12972 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12973 EXPECT_EQ("\"Однажды, в \"\n" 12974 "\"студёную \"\n" 12975 "\"зимнюю \"\n" 12976 "\"пору,\"", 12977 format("\"Однажды, в студёную зимнюю пору,\"", 12978 getLLVMStyleWithColumns(13))); 12979 EXPECT_EQ( 12980 "\"一 二 三 \"\n" 12981 "\"四 五六 \"\n" 12982 "\"七 八 九 \"\n" 12983 "\"十\"", 12984 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 12985 EXPECT_EQ("\"一\t\"\n" 12986 "\"二 \t\"\n" 12987 "\"三 四 \"\n" 12988 "\"五\t\"\n" 12989 "\"六 \t\"\n" 12990 "\"七 \"\n" 12991 "\"八九十\tqq\"", 12992 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 12993 getLLVMStyleWithColumns(11))); 12994 12995 // UTF8 character in an escape sequence. 12996 EXPECT_EQ("\"aaaaaa\"\n" 12997 "\"\\\xC2\x8D\"", 12998 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 12999 } 13000 13001 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 13002 EXPECT_EQ("const char *sssss =\n" 13003 " \"一二三四五六七八\\\n" 13004 " 九 十\";", 13005 format("const char *sssss = \"一二三四五六七八\\\n" 13006 " 九 十\";", 13007 getLLVMStyleWithColumns(30))); 13008 } 13009 13010 TEST_F(FormatTest, SplitsUTF8LineComments) { 13011 EXPECT_EQ("// aaaaÄ\xc2\x8d", 13012 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 13013 EXPECT_EQ("// Я из лесу\n" 13014 "// вышел; был\n" 13015 "// сильный\n" 13016 "// мороз.", 13017 format("// Я из лесу вышел; был сильный мороз.", 13018 getLLVMStyleWithColumns(13))); 13019 EXPECT_EQ("// 一二三\n" 13020 "// 四五六七\n" 13021 "// 八 九\n" 13022 "// 十", 13023 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 13024 } 13025 13026 TEST_F(FormatTest, SplitsUTF8BlockComments) { 13027 EXPECT_EQ("/* Гляжу,\n" 13028 " * поднимается\n" 13029 " * медленно в\n" 13030 " * гору\n" 13031 " * Лошадка,\n" 13032 " * везущая\n" 13033 " * хворосту\n" 13034 " * воз. */", 13035 format("/* Гляжу, поднимается медленно в гору\n" 13036 " * Лошадка, везущая хворосту воз. */", 13037 getLLVMStyleWithColumns(13))); 13038 EXPECT_EQ( 13039 "/* 一二三\n" 13040 " * 四五六七\n" 13041 " * 八 九\n" 13042 " * 十 */", 13043 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 13044 EXPECT_EQ("/* \n" 13045 " * \n" 13046 " * - */", 13047 format("/* - */", getLLVMStyleWithColumns(12))); 13048 } 13049 13050 #endif // _MSC_VER 13051 13052 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 13053 FormatStyle Style = getLLVMStyle(); 13054 13055 Style.ConstructorInitializerIndentWidth = 4; 13056 verifyFormat( 13057 "SomeClass::Constructor()\n" 13058 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13059 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13060 Style); 13061 13062 Style.ConstructorInitializerIndentWidth = 2; 13063 verifyFormat( 13064 "SomeClass::Constructor()\n" 13065 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13066 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13067 Style); 13068 13069 Style.ConstructorInitializerIndentWidth = 0; 13070 verifyFormat( 13071 "SomeClass::Constructor()\n" 13072 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13073 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13074 Style); 13075 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13076 verifyFormat( 13077 "SomeLongTemplateVariableName<\n" 13078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 13079 Style); 13080 verifyFormat("bool smaller = 1 < " 13081 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 13082 " " 13083 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 13084 Style); 13085 13086 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 13087 verifyFormat("SomeClass::Constructor() :\n" 13088 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 13089 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 13090 Style); 13091 } 13092 13093 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 13094 FormatStyle Style = getLLVMStyle(); 13095 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 13096 Style.ConstructorInitializerIndentWidth = 4; 13097 verifyFormat("SomeClass::Constructor()\n" 13098 " : a(a)\n" 13099 " , b(b)\n" 13100 " , c(c) {}", 13101 Style); 13102 verifyFormat("SomeClass::Constructor()\n" 13103 " : a(a) {}", 13104 Style); 13105 13106 Style.ColumnLimit = 0; 13107 verifyFormat("SomeClass::Constructor()\n" 13108 " : a(a) {}", 13109 Style); 13110 verifyFormat("SomeClass::Constructor() noexcept\n" 13111 " : a(a) {}", 13112 Style); 13113 verifyFormat("SomeClass::Constructor()\n" 13114 " : a(a)\n" 13115 " , b(b)\n" 13116 " , c(c) {}", 13117 Style); 13118 verifyFormat("SomeClass::Constructor()\n" 13119 " : a(a) {\n" 13120 " foo();\n" 13121 " bar();\n" 13122 "}", 13123 Style); 13124 13125 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 13126 verifyFormat("SomeClass::Constructor()\n" 13127 " : a(a)\n" 13128 " , b(b)\n" 13129 " , c(c) {\n}", 13130 Style); 13131 verifyFormat("SomeClass::Constructor()\n" 13132 " : a(a) {\n}", 13133 Style); 13134 13135 Style.ColumnLimit = 80; 13136 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 13137 Style.ConstructorInitializerIndentWidth = 2; 13138 verifyFormat("SomeClass::Constructor()\n" 13139 " : a(a)\n" 13140 " , b(b)\n" 13141 " , c(c) {}", 13142 Style); 13143 13144 Style.ConstructorInitializerIndentWidth = 0; 13145 verifyFormat("SomeClass::Constructor()\n" 13146 ": a(a)\n" 13147 ", b(b)\n" 13148 ", c(c) {}", 13149 Style); 13150 13151 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 13152 Style.ConstructorInitializerIndentWidth = 4; 13153 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 13154 verifyFormat( 13155 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 13156 Style); 13157 verifyFormat( 13158 "SomeClass::Constructor()\n" 13159 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 13160 Style); 13161 Style.ConstructorInitializerIndentWidth = 4; 13162 Style.ColumnLimit = 60; 13163 verifyFormat("SomeClass::Constructor()\n" 13164 " : aaaaaaaa(aaaaaaaa)\n" 13165 " , aaaaaaaa(aaaaaaaa)\n" 13166 " , aaaaaaaa(aaaaaaaa) {}", 13167 Style); 13168 } 13169 13170 TEST_F(FormatTest, Destructors) { 13171 verifyFormat("void F(int &i) { i.~int(); }"); 13172 verifyFormat("void F(int &i) { i->~int(); }"); 13173 } 13174 13175 TEST_F(FormatTest, FormatsWithWebKitStyle) { 13176 FormatStyle Style = getWebKitStyle(); 13177 13178 // Don't indent in outer namespaces. 13179 verifyFormat("namespace outer {\n" 13180 "int i;\n" 13181 "namespace inner {\n" 13182 " int i;\n" 13183 "} // namespace inner\n" 13184 "} // namespace outer\n" 13185 "namespace other_outer {\n" 13186 "int i;\n" 13187 "}", 13188 Style); 13189 13190 // Don't indent case labels. 13191 verifyFormat("switch (variable) {\n" 13192 "case 1:\n" 13193 "case 2:\n" 13194 " doSomething();\n" 13195 " break;\n" 13196 "default:\n" 13197 " ++variable;\n" 13198 "}", 13199 Style); 13200 13201 // Wrap before binary operators. 13202 EXPECT_EQ("void f()\n" 13203 "{\n" 13204 " if (aaaaaaaaaaaaaaaa\n" 13205 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 13206 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13207 " return;\n" 13208 "}", 13209 format("void f() {\n" 13210 "if (aaaaaaaaaaaaaaaa\n" 13211 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 13212 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13213 "return;\n" 13214 "}", 13215 Style)); 13216 13217 // Allow functions on a single line. 13218 verifyFormat("void f() { return; }", Style); 13219 13220 // Allow empty blocks on a single line and insert a space in empty blocks. 13221 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 13222 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 13223 // However, don't merge non-empty short loops. 13224 EXPECT_EQ("while (true) {\n" 13225 " continue;\n" 13226 "}", 13227 format("while (true) { continue; }", Style)); 13228 13229 // Constructor initializers are formatted one per line with the "," on the 13230 // new line. 13231 verifyFormat("Constructor()\n" 13232 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 13233 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 13234 " aaaaaaaaaaaaaa)\n" 13235 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 13236 "{\n" 13237 "}", 13238 Style); 13239 verifyFormat("SomeClass::Constructor()\n" 13240 " : a(a)\n" 13241 "{\n" 13242 "}", 13243 Style); 13244 EXPECT_EQ("SomeClass::Constructor()\n" 13245 " : a(a)\n" 13246 "{\n" 13247 "}", 13248 format("SomeClass::Constructor():a(a){}", Style)); 13249 verifyFormat("SomeClass::Constructor()\n" 13250 " : a(a)\n" 13251 " , b(b)\n" 13252 " , c(c)\n" 13253 "{\n" 13254 "}", 13255 Style); 13256 verifyFormat("SomeClass::Constructor()\n" 13257 " : a(a)\n" 13258 "{\n" 13259 " foo();\n" 13260 " bar();\n" 13261 "}", 13262 Style); 13263 13264 // Access specifiers should be aligned left. 13265 verifyFormat("class C {\n" 13266 "public:\n" 13267 " int i;\n" 13268 "};", 13269 Style); 13270 13271 // Do not align comments. 13272 verifyFormat("int a; // Do not\n" 13273 "double b; // align comments.", 13274 Style); 13275 13276 // Do not align operands. 13277 EXPECT_EQ("ASSERT(aaaa\n" 13278 " || bbbb);", 13279 format("ASSERT ( aaaa\n||bbbb);", Style)); 13280 13281 // Accept input's line breaks. 13282 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 13283 " || bbbbbbbbbbbbbbb) {\n" 13284 " i++;\n" 13285 "}", 13286 format("if (aaaaaaaaaaaaaaa\n" 13287 "|| bbbbbbbbbbbbbbb) { i++; }", 13288 Style)); 13289 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 13290 " i++;\n" 13291 "}", 13292 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 13293 13294 // Don't automatically break all macro definitions (llvm.org/PR17842). 13295 verifyFormat("#define aNumber 10", Style); 13296 // However, generally keep the line breaks that the user authored. 13297 EXPECT_EQ("#define aNumber \\\n" 13298 " 10", 13299 format("#define aNumber \\\n" 13300 " 10", 13301 Style)); 13302 13303 // Keep empty and one-element array literals on a single line. 13304 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 13305 " copyItems:YES];", 13306 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 13307 "copyItems:YES];", 13308 Style)); 13309 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 13310 " copyItems:YES];", 13311 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 13312 " copyItems:YES];", 13313 Style)); 13314 // FIXME: This does not seem right, there should be more indentation before 13315 // the array literal's entries. Nested blocks have the same problem. 13316 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13317 " @\"a\",\n" 13318 " @\"a\"\n" 13319 "]\n" 13320 " copyItems:YES];", 13321 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13322 " @\"a\",\n" 13323 " @\"a\"\n" 13324 " ]\n" 13325 " copyItems:YES];", 13326 Style)); 13327 EXPECT_EQ( 13328 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13329 " copyItems:YES];", 13330 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13331 " copyItems:YES];", 13332 Style)); 13333 13334 verifyFormat("[self.a b:c c:d];", Style); 13335 EXPECT_EQ("[self.a b:c\n" 13336 " c:d];", 13337 format("[self.a b:c\n" 13338 "c:d];", 13339 Style)); 13340 } 13341 13342 TEST_F(FormatTest, FormatsLambdas) { 13343 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 13344 verifyFormat( 13345 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 13346 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 13347 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 13348 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 13349 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 13350 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 13351 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 13352 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 13353 verifyFormat("int x = f(*+[] {});"); 13354 verifyFormat("void f() {\n" 13355 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 13356 "}\n"); 13357 verifyFormat("void f() {\n" 13358 " other(x.begin(), //\n" 13359 " x.end(), //\n" 13360 " [&](int, int) { return 1; });\n" 13361 "}\n"); 13362 verifyFormat("void f() {\n" 13363 " other.other.other.other.other(\n" 13364 " x.begin(), x.end(),\n" 13365 " [something, rather](int, int, int, int, int, int, int) { " 13366 "return 1; });\n" 13367 "}\n"); 13368 verifyFormat( 13369 "void f() {\n" 13370 " other.other.other.other.other(\n" 13371 " x.begin(), x.end(),\n" 13372 " [something, rather](int, int, int, int, int, int, int) {\n" 13373 " //\n" 13374 " });\n" 13375 "}\n"); 13376 verifyFormat("SomeFunction([]() { // A cool function...\n" 13377 " return 43;\n" 13378 "});"); 13379 EXPECT_EQ("SomeFunction([]() {\n" 13380 "#define A a\n" 13381 " return 43;\n" 13382 "});", 13383 format("SomeFunction([](){\n" 13384 "#define A a\n" 13385 "return 43;\n" 13386 "});")); 13387 verifyFormat("void f() {\n" 13388 " SomeFunction([](decltype(x), A *a) {});\n" 13389 "}"); 13390 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13391 " [](const aaaaaaaaaa &a) { return a; });"); 13392 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 13393 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 13394 "});"); 13395 verifyFormat("Constructor()\n" 13396 " : Field([] { // comment\n" 13397 " int i;\n" 13398 " }) {}"); 13399 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 13400 " return some_parameter.size();\n" 13401 "};"); 13402 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 13403 " [](const string &s) { return s; };"); 13404 verifyFormat("int i = aaaaaa ? 1 //\n" 13405 " : [] {\n" 13406 " return 2; //\n" 13407 " }();"); 13408 verifyFormat("llvm::errs() << \"number of twos is \"\n" 13409 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 13410 " return x == 2; // force break\n" 13411 " });"); 13412 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13413 " [=](int iiiiiiiiiiii) {\n" 13414 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 13415 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 13416 " });", 13417 getLLVMStyleWithColumns(60)); 13418 verifyFormat("SomeFunction({[&] {\n" 13419 " // comment\n" 13420 " },\n" 13421 " [&] {\n" 13422 " // comment\n" 13423 " }});"); 13424 verifyFormat("SomeFunction({[&] {\n" 13425 " // comment\n" 13426 "}});"); 13427 verifyFormat( 13428 "virtual aaaaaaaaaaaaaaaa(\n" 13429 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 13430 " aaaaa aaaaaaaaa);"); 13431 13432 // Lambdas with return types. 13433 verifyFormat("int c = []() -> int { return 2; }();\n"); 13434 verifyFormat("int c = []() -> int * { return 2; }();\n"); 13435 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 13436 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 13437 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 13438 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 13439 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 13440 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 13441 verifyFormat("[a, a]() -> a<1> {};"); 13442 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 13443 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 13444 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 13445 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 13446 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 13447 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 13448 verifyFormat("[]() -> foo<!5> { return {}; };"); 13449 verifyFormat("[]() -> foo<~5> { return {}; };"); 13450 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 13451 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 13452 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 13453 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 13454 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 13455 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 13456 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 13457 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 13458 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 13459 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 13460 verifyFormat("namespace bar {\n" 13461 "// broken:\n" 13462 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 13463 "} // namespace bar"); 13464 verifyFormat("namespace bar {\n" 13465 "// broken:\n" 13466 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 13467 "} // namespace bar"); 13468 verifyFormat("namespace bar {\n" 13469 "// broken:\n" 13470 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 13471 "} // namespace bar"); 13472 verifyFormat("namespace bar {\n" 13473 "// broken:\n" 13474 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 13475 "} // namespace bar"); 13476 verifyFormat("namespace bar {\n" 13477 "// broken:\n" 13478 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 13479 "} // namespace bar"); 13480 verifyFormat("namespace bar {\n" 13481 "// broken:\n" 13482 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 13483 "} // namespace bar"); 13484 verifyFormat("namespace bar {\n" 13485 "// broken:\n" 13486 "auto foo{[]() -> foo<!5> { return {}; }};\n" 13487 "} // namespace bar"); 13488 verifyFormat("namespace bar {\n" 13489 "// broken:\n" 13490 "auto foo{[]() -> foo<~5> { return {}; }};\n" 13491 "} // namespace bar"); 13492 verifyFormat("namespace bar {\n" 13493 "// broken:\n" 13494 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 13495 "} // namespace bar"); 13496 verifyFormat("namespace bar {\n" 13497 "// broken:\n" 13498 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 13499 "} // namespace bar"); 13500 verifyFormat("namespace bar {\n" 13501 "// broken:\n" 13502 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 13503 "} // namespace bar"); 13504 verifyFormat("namespace bar {\n" 13505 "// broken:\n" 13506 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 13507 "} // namespace bar"); 13508 verifyFormat("namespace bar {\n" 13509 "// broken:\n" 13510 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 13511 "} // namespace bar"); 13512 verifyFormat("namespace bar {\n" 13513 "// broken:\n" 13514 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 13515 "} // namespace bar"); 13516 verifyFormat("namespace bar {\n" 13517 "// broken:\n" 13518 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 13519 "} // namespace bar"); 13520 verifyFormat("namespace bar {\n" 13521 "// broken:\n" 13522 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 13523 "} // namespace bar"); 13524 verifyFormat("namespace bar {\n" 13525 "// broken:\n" 13526 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 13527 "} // namespace bar"); 13528 verifyFormat("namespace bar {\n" 13529 "// broken:\n" 13530 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 13531 "} // namespace bar"); 13532 verifyFormat("[]() -> a<1> {};"); 13533 verifyFormat("[]() -> a<1> { ; };"); 13534 verifyFormat("[]() -> a<1> { ; }();"); 13535 verifyFormat("[a, a]() -> a<true> {};"); 13536 verifyFormat("[]() -> a<true> {};"); 13537 verifyFormat("[]() -> a<true> { ; };"); 13538 verifyFormat("[]() -> a<true> { ; }();"); 13539 verifyFormat("[a, a]() -> a<false> {};"); 13540 verifyFormat("[]() -> a<false> {};"); 13541 verifyFormat("[]() -> a<false> { ; };"); 13542 verifyFormat("[]() -> a<false> { ; }();"); 13543 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 13544 verifyFormat("namespace bar {\n" 13545 "auto foo{[]() -> foo<false> { ; }};\n" 13546 "} // namespace bar"); 13547 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 13548 " int j) -> int {\n" 13549 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 13550 "};"); 13551 verifyFormat( 13552 "aaaaaaaaaaaaaaaaaaaaaa(\n" 13553 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 13554 " return aaaaaaaaaaaaaaaaa;\n" 13555 " });", 13556 getLLVMStyleWithColumns(70)); 13557 verifyFormat("[]() //\n" 13558 " -> int {\n" 13559 " return 1; //\n" 13560 "};"); 13561 13562 // Lambdas with explicit template argument lists. 13563 verifyFormat( 13564 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 13565 13566 // Multiple lambdas in the same parentheses change indentation rules. These 13567 // lambdas are forced to start on new lines. 13568 verifyFormat("SomeFunction(\n" 13569 " []() {\n" 13570 " //\n" 13571 " },\n" 13572 " []() {\n" 13573 " //\n" 13574 " });"); 13575 13576 // A lambda passed as arg0 is always pushed to the next line. 13577 verifyFormat("SomeFunction(\n" 13578 " [this] {\n" 13579 " //\n" 13580 " },\n" 13581 " 1);\n"); 13582 13583 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 13584 // the arg0 case above. 13585 auto Style = getGoogleStyle(); 13586 Style.BinPackArguments = false; 13587 verifyFormat("SomeFunction(\n" 13588 " a,\n" 13589 " [this] {\n" 13590 " //\n" 13591 " },\n" 13592 " b);\n", 13593 Style); 13594 verifyFormat("SomeFunction(\n" 13595 " a,\n" 13596 " [this] {\n" 13597 " //\n" 13598 " },\n" 13599 " b);\n"); 13600 13601 // A lambda with a very long line forces arg0 to be pushed out irrespective of 13602 // the BinPackArguments value (as long as the code is wide enough). 13603 verifyFormat( 13604 "something->SomeFunction(\n" 13605 " a,\n" 13606 " [this] {\n" 13607 " " 13608 "D0000000000000000000000000000000000000000000000000000000000001();\n" 13609 " },\n" 13610 " b);\n"); 13611 13612 // A multi-line lambda is pulled up as long as the introducer fits on the 13613 // previous line and there are no further args. 13614 verifyFormat("function(1, [this, that] {\n" 13615 " //\n" 13616 "});\n"); 13617 verifyFormat("function([this, that] {\n" 13618 " //\n" 13619 "});\n"); 13620 // FIXME: this format is not ideal and we should consider forcing the first 13621 // arg onto its own line. 13622 verifyFormat("function(a, b, c, //\n" 13623 " d, [this, that] {\n" 13624 " //\n" 13625 " });\n"); 13626 13627 // Multiple lambdas are treated correctly even when there is a short arg0. 13628 verifyFormat("SomeFunction(\n" 13629 " 1,\n" 13630 " [this] {\n" 13631 " //\n" 13632 " },\n" 13633 " [this] {\n" 13634 " //\n" 13635 " },\n" 13636 " 1);\n"); 13637 13638 // More complex introducers. 13639 verifyFormat("return [i, args...] {};"); 13640 13641 // Not lambdas. 13642 verifyFormat("constexpr char hello[]{\"hello\"};"); 13643 verifyFormat("double &operator[](int i) { return 0; }\n" 13644 "int i;"); 13645 verifyFormat("std::unique_ptr<int[]> foo() {}"); 13646 verifyFormat("int i = a[a][a]->f();"); 13647 verifyFormat("int i = (*b)[a]->f();"); 13648 13649 // Other corner cases. 13650 verifyFormat("void f() {\n" 13651 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 13652 " );\n" 13653 "}"); 13654 13655 // Lambdas created through weird macros. 13656 verifyFormat("void f() {\n" 13657 " MACRO((const AA &a) { return 1; });\n" 13658 " MACRO((AA &a) { return 1; });\n" 13659 "}"); 13660 13661 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 13662 " doo_dah();\n" 13663 " doo_dah();\n" 13664 " })) {\n" 13665 "}"); 13666 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 13667 " doo_dah();\n" 13668 " doo_dah();\n" 13669 " })) {\n" 13670 "}"); 13671 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 13672 " doo_dah();\n" 13673 " doo_dah();\n" 13674 " })) {\n" 13675 "}"); 13676 verifyFormat("auto lambda = []() {\n" 13677 " int a = 2\n" 13678 "#if A\n" 13679 " + 2\n" 13680 "#endif\n" 13681 " ;\n" 13682 "};"); 13683 13684 // Lambdas with complex multiline introducers. 13685 verifyFormat( 13686 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13687 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 13688 " -> ::std::unordered_set<\n" 13689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 13690 " //\n" 13691 " });"); 13692 13693 FormatStyle DoNotMerge = getLLVMStyle(); 13694 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13695 verifyFormat("auto c = []() {\n" 13696 " return b;\n" 13697 "};", 13698 "auto c = []() { return b; };", DoNotMerge); 13699 verifyFormat("auto c = []() {\n" 13700 "};", 13701 " auto c = []() {};", DoNotMerge); 13702 13703 FormatStyle MergeEmptyOnly = getLLVMStyle(); 13704 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 13705 verifyFormat("auto c = []() {\n" 13706 " return b;\n" 13707 "};", 13708 "auto c = []() {\n" 13709 " return b;\n" 13710 " };", 13711 MergeEmptyOnly); 13712 verifyFormat("auto c = []() {};", 13713 "auto c = []() {\n" 13714 "};", 13715 MergeEmptyOnly); 13716 13717 FormatStyle MergeInline = getLLVMStyle(); 13718 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 13719 verifyFormat("auto c = []() {\n" 13720 " return b;\n" 13721 "};", 13722 "auto c = []() { return b; };", MergeInline); 13723 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 13724 MergeInline); 13725 verifyFormat("function([]() { return b; }, a)", 13726 "function([]() { return b; }, a)", MergeInline); 13727 verifyFormat("function(a, []() { return b; })", 13728 "function(a, []() { return b; })", MergeInline); 13729 } 13730 13731 TEST_F(FormatTest, EmptyLinesInLambdas) { 13732 verifyFormat("auto lambda = []() {\n" 13733 " x(); //\n" 13734 "};", 13735 "auto lambda = []() {\n" 13736 "\n" 13737 " x(); //\n" 13738 "\n" 13739 "};"); 13740 } 13741 13742 TEST_F(FormatTest, FormatsBlocks) { 13743 FormatStyle ShortBlocks = getLLVMStyle(); 13744 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13745 verifyFormat("int (^Block)(int, int);", ShortBlocks); 13746 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 13747 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 13748 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 13749 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 13750 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 13751 13752 verifyFormat("foo(^{ bar(); });", ShortBlocks); 13753 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 13754 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 13755 13756 verifyFormat("[operation setCompletionBlock:^{\n" 13757 " [self onOperationDone];\n" 13758 "}];"); 13759 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 13760 " [self onOperationDone];\n" 13761 "}]};"); 13762 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 13763 " f();\n" 13764 "}];"); 13765 verifyFormat("int a = [operation block:^int(int *i) {\n" 13766 " return 1;\n" 13767 "}];"); 13768 verifyFormat("[myObject doSomethingWith:arg1\n" 13769 " aaa:^int(int *a) {\n" 13770 " return 1;\n" 13771 " }\n" 13772 " bbb:f(a * bbbbbbbb)];"); 13773 13774 verifyFormat("[operation setCompletionBlock:^{\n" 13775 " [self.delegate newDataAvailable];\n" 13776 "}];", 13777 getLLVMStyleWithColumns(60)); 13778 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 13779 " NSString *path = [self sessionFilePath];\n" 13780 " if (path) {\n" 13781 " // ...\n" 13782 " }\n" 13783 "});"); 13784 verifyFormat("[[SessionService sharedService]\n" 13785 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13786 " if (window) {\n" 13787 " [self windowDidLoad:window];\n" 13788 " } else {\n" 13789 " [self errorLoadingWindow];\n" 13790 " }\n" 13791 " }];"); 13792 verifyFormat("void (^largeBlock)(void) = ^{\n" 13793 " // ...\n" 13794 "};\n", 13795 getLLVMStyleWithColumns(40)); 13796 verifyFormat("[[SessionService sharedService]\n" 13797 " loadWindowWithCompletionBlock: //\n" 13798 " ^(SessionWindow *window) {\n" 13799 " if (window) {\n" 13800 " [self windowDidLoad:window];\n" 13801 " } else {\n" 13802 " [self errorLoadingWindow];\n" 13803 " }\n" 13804 " }];", 13805 getLLVMStyleWithColumns(60)); 13806 verifyFormat("[myObject doSomethingWith:arg1\n" 13807 " firstBlock:^(Foo *a) {\n" 13808 " // ...\n" 13809 " int i;\n" 13810 " }\n" 13811 " secondBlock:^(Bar *b) {\n" 13812 " // ...\n" 13813 " int i;\n" 13814 " }\n" 13815 " thirdBlock:^Foo(Bar *b) {\n" 13816 " // ...\n" 13817 " int i;\n" 13818 " }];"); 13819 verifyFormat("[myObject doSomethingWith:arg1\n" 13820 " firstBlock:-1\n" 13821 " secondBlock:^(Bar *b) {\n" 13822 " // ...\n" 13823 " int i;\n" 13824 " }];"); 13825 13826 verifyFormat("f(^{\n" 13827 " @autoreleasepool {\n" 13828 " if (a) {\n" 13829 " g();\n" 13830 " }\n" 13831 " }\n" 13832 "});"); 13833 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 13834 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 13835 "};"); 13836 13837 FormatStyle FourIndent = getLLVMStyle(); 13838 FourIndent.ObjCBlockIndentWidth = 4; 13839 verifyFormat("[operation setCompletionBlock:^{\n" 13840 " [self onOperationDone];\n" 13841 "}];", 13842 FourIndent); 13843 } 13844 13845 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 13846 FormatStyle ZeroColumn = getLLVMStyle(); 13847 ZeroColumn.ColumnLimit = 0; 13848 13849 verifyFormat("[[SessionService sharedService] " 13850 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13851 " if (window) {\n" 13852 " [self windowDidLoad:window];\n" 13853 " } else {\n" 13854 " [self errorLoadingWindow];\n" 13855 " }\n" 13856 "}];", 13857 ZeroColumn); 13858 EXPECT_EQ("[[SessionService sharedService]\n" 13859 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13860 " if (window) {\n" 13861 " [self windowDidLoad:window];\n" 13862 " } else {\n" 13863 " [self errorLoadingWindow];\n" 13864 " }\n" 13865 " }];", 13866 format("[[SessionService sharedService]\n" 13867 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13868 " if (window) {\n" 13869 " [self windowDidLoad:window];\n" 13870 " } else {\n" 13871 " [self errorLoadingWindow];\n" 13872 " }\n" 13873 "}];", 13874 ZeroColumn)); 13875 verifyFormat("[myObject doSomethingWith:arg1\n" 13876 " firstBlock:^(Foo *a) {\n" 13877 " // ...\n" 13878 " int i;\n" 13879 " }\n" 13880 " secondBlock:^(Bar *b) {\n" 13881 " // ...\n" 13882 " int i;\n" 13883 " }\n" 13884 " thirdBlock:^Foo(Bar *b) {\n" 13885 " // ...\n" 13886 " int i;\n" 13887 " }];", 13888 ZeroColumn); 13889 verifyFormat("f(^{\n" 13890 " @autoreleasepool {\n" 13891 " if (a) {\n" 13892 " g();\n" 13893 " }\n" 13894 " }\n" 13895 "});", 13896 ZeroColumn); 13897 verifyFormat("void (^largeBlock)(void) = ^{\n" 13898 " // ...\n" 13899 "};", 13900 ZeroColumn); 13901 13902 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13903 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 13904 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13905 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 13906 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 13907 " int i;\n" 13908 "};", 13909 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13910 } 13911 13912 TEST_F(FormatTest, SupportsCRLF) { 13913 EXPECT_EQ("int a;\r\n" 13914 "int b;\r\n" 13915 "int c;\r\n", 13916 format("int a;\r\n" 13917 " int b;\r\n" 13918 " int c;\r\n", 13919 getLLVMStyle())); 13920 EXPECT_EQ("int a;\r\n" 13921 "int b;\r\n" 13922 "int c;\r\n", 13923 format("int a;\r\n" 13924 " int b;\n" 13925 " int c;\r\n", 13926 getLLVMStyle())); 13927 EXPECT_EQ("int a;\n" 13928 "int b;\n" 13929 "int c;\n", 13930 format("int a;\r\n" 13931 " int b;\n" 13932 " int c;\n", 13933 getLLVMStyle())); 13934 EXPECT_EQ("\"aaaaaaa \"\r\n" 13935 "\"bbbbbbb\";\r\n", 13936 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 13937 EXPECT_EQ("#define A \\\r\n" 13938 " b; \\\r\n" 13939 " c; \\\r\n" 13940 " d;\r\n", 13941 format("#define A \\\r\n" 13942 " b; \\\r\n" 13943 " c; d; \r\n", 13944 getGoogleStyle())); 13945 13946 EXPECT_EQ("/*\r\n" 13947 "multi line block comments\r\n" 13948 "should not introduce\r\n" 13949 "an extra carriage return\r\n" 13950 "*/\r\n", 13951 format("/*\r\n" 13952 "multi line block comments\r\n" 13953 "should not introduce\r\n" 13954 "an extra carriage return\r\n" 13955 "*/\r\n")); 13956 EXPECT_EQ("/*\r\n" 13957 "\r\n" 13958 "*/", 13959 format("/*\r\n" 13960 " \r\r\r\n" 13961 "*/")); 13962 } 13963 13964 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 13965 verifyFormat("MY_CLASS(C) {\n" 13966 " int i;\n" 13967 " int j;\n" 13968 "};"); 13969 } 13970 13971 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 13972 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 13973 TwoIndent.ContinuationIndentWidth = 2; 13974 13975 EXPECT_EQ("int i =\n" 13976 " longFunction(\n" 13977 " arg);", 13978 format("int i = longFunction(arg);", TwoIndent)); 13979 13980 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 13981 SixIndent.ContinuationIndentWidth = 6; 13982 13983 EXPECT_EQ("int i =\n" 13984 " longFunction(\n" 13985 " arg);", 13986 format("int i = longFunction(arg);", SixIndent)); 13987 } 13988 13989 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 13990 FormatStyle Style = getLLVMStyle(); 13991 verifyFormat("int Foo::getter(\n" 13992 " //\n" 13993 ") const {\n" 13994 " return foo;\n" 13995 "}", 13996 Style); 13997 verifyFormat("void Foo::setter(\n" 13998 " //\n" 13999 ") {\n" 14000 " foo = 1;\n" 14001 "}", 14002 Style); 14003 } 14004 14005 TEST_F(FormatTest, SpacesInAngles) { 14006 FormatStyle Spaces = getLLVMStyle(); 14007 Spaces.SpacesInAngles = true; 14008 14009 verifyFormat("static_cast< int >(arg);", Spaces); 14010 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 14011 verifyFormat("f< int, float >();", Spaces); 14012 verifyFormat("template <> g() {}", Spaces); 14013 verifyFormat("template < std::vector< int > > f() {}", Spaces); 14014 verifyFormat("std::function< void(int, int) > fct;", Spaces); 14015 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 14016 Spaces); 14017 14018 Spaces.Standard = FormatStyle::LS_Cpp03; 14019 Spaces.SpacesInAngles = true; 14020 verifyFormat("A< A< int > >();", Spaces); 14021 14022 Spaces.SpacesInAngles = false; 14023 verifyFormat("A<A<int> >();", Spaces); 14024 14025 Spaces.Standard = FormatStyle::LS_Cpp11; 14026 Spaces.SpacesInAngles = true; 14027 verifyFormat("A< A< int > >();", Spaces); 14028 14029 Spaces.SpacesInAngles = false; 14030 verifyFormat("A<A<int>>();", Spaces); 14031 } 14032 14033 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 14034 FormatStyle Style = getLLVMStyle(); 14035 Style.SpaceAfterTemplateKeyword = false; 14036 verifyFormat("template<int> void foo();", Style); 14037 } 14038 14039 TEST_F(FormatTest, TripleAngleBrackets) { 14040 verifyFormat("f<<<1, 1>>>();"); 14041 verifyFormat("f<<<1, 1, 1, s>>>();"); 14042 verifyFormat("f<<<a, b, c, d>>>();"); 14043 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 14044 verifyFormat("f<param><<<1, 1>>>();"); 14045 verifyFormat("f<1><<<1, 1>>>();"); 14046 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 14047 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14048 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 14049 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 14050 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 14051 } 14052 14053 TEST_F(FormatTest, MergeLessLessAtEnd) { 14054 verifyFormat("<<"); 14055 EXPECT_EQ("< < <", format("\\\n<<<")); 14056 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14057 "aaallvm::outs() <<"); 14058 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14059 "aaaallvm::outs()\n <<"); 14060 } 14061 14062 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 14063 std::string code = "#if A\n" 14064 "#if B\n" 14065 "a.\n" 14066 "#endif\n" 14067 " a = 1;\n" 14068 "#else\n" 14069 "#endif\n" 14070 "#if C\n" 14071 "#else\n" 14072 "#endif\n"; 14073 EXPECT_EQ(code, format(code)); 14074 } 14075 14076 TEST_F(FormatTest, HandleConflictMarkers) { 14077 // Git/SVN conflict markers. 14078 EXPECT_EQ("int a;\n" 14079 "void f() {\n" 14080 " callme(some(parameter1,\n" 14081 "<<<<<<< text by the vcs\n" 14082 " parameter2),\n" 14083 "||||||| text by the vcs\n" 14084 " parameter2),\n" 14085 " parameter3,\n" 14086 "======= text by the vcs\n" 14087 " parameter2, parameter3),\n" 14088 ">>>>>>> text by the vcs\n" 14089 " otherparameter);\n", 14090 format("int a;\n" 14091 "void f() {\n" 14092 " callme(some(parameter1,\n" 14093 "<<<<<<< text by the vcs\n" 14094 " parameter2),\n" 14095 "||||||| text by the vcs\n" 14096 " parameter2),\n" 14097 " parameter3,\n" 14098 "======= text by the vcs\n" 14099 " parameter2,\n" 14100 " parameter3),\n" 14101 ">>>>>>> text by the vcs\n" 14102 " otherparameter);\n")); 14103 14104 // Perforce markers. 14105 EXPECT_EQ("void f() {\n" 14106 " function(\n" 14107 ">>>> text by the vcs\n" 14108 " parameter,\n" 14109 "==== text by the vcs\n" 14110 " parameter,\n" 14111 "==== text by the vcs\n" 14112 " parameter,\n" 14113 "<<<< text by the vcs\n" 14114 " parameter);\n", 14115 format("void f() {\n" 14116 " function(\n" 14117 ">>>> text by the vcs\n" 14118 " parameter,\n" 14119 "==== text by the vcs\n" 14120 " parameter,\n" 14121 "==== text by the vcs\n" 14122 " parameter,\n" 14123 "<<<< text by the vcs\n" 14124 " parameter);\n")); 14125 14126 EXPECT_EQ("<<<<<<<\n" 14127 "|||||||\n" 14128 "=======\n" 14129 ">>>>>>>", 14130 format("<<<<<<<\n" 14131 "|||||||\n" 14132 "=======\n" 14133 ">>>>>>>")); 14134 14135 EXPECT_EQ("<<<<<<<\n" 14136 "|||||||\n" 14137 "int i;\n" 14138 "=======\n" 14139 ">>>>>>>", 14140 format("<<<<<<<\n" 14141 "|||||||\n" 14142 "int i;\n" 14143 "=======\n" 14144 ">>>>>>>")); 14145 14146 // FIXME: Handle parsing of macros around conflict markers correctly: 14147 EXPECT_EQ("#define Macro \\\n" 14148 "<<<<<<<\n" 14149 "Something \\\n" 14150 "|||||||\n" 14151 "Else \\\n" 14152 "=======\n" 14153 "Other \\\n" 14154 ">>>>>>>\n" 14155 " End int i;\n", 14156 format("#define Macro \\\n" 14157 "<<<<<<<\n" 14158 " Something \\\n" 14159 "|||||||\n" 14160 " Else \\\n" 14161 "=======\n" 14162 " Other \\\n" 14163 ">>>>>>>\n" 14164 " End\n" 14165 "int i;\n")); 14166 } 14167 14168 TEST_F(FormatTest, DisableRegions) { 14169 EXPECT_EQ("int i;\n" 14170 "// clang-format off\n" 14171 " int j;\n" 14172 "// clang-format on\n" 14173 "int k;", 14174 format(" int i;\n" 14175 " // clang-format off\n" 14176 " int j;\n" 14177 " // clang-format on\n" 14178 " int k;")); 14179 EXPECT_EQ("int i;\n" 14180 "/* clang-format off */\n" 14181 " int j;\n" 14182 "/* clang-format on */\n" 14183 "int k;", 14184 format(" int i;\n" 14185 " /* clang-format off */\n" 14186 " int j;\n" 14187 " /* clang-format on */\n" 14188 " int k;")); 14189 14190 // Don't reflow comments within disabled regions. 14191 EXPECT_EQ("// clang-format off\n" 14192 "// long long long long long long line\n" 14193 "/* clang-format on */\n" 14194 "/* long long long\n" 14195 " * long long long\n" 14196 " * line */\n" 14197 "int i;\n" 14198 "/* clang-format off */\n" 14199 "/* long long long long long long line */\n", 14200 format("// clang-format off\n" 14201 "// long long long long long long line\n" 14202 "/* clang-format on */\n" 14203 "/* long long long long long long line */\n" 14204 "int i;\n" 14205 "/* clang-format off */\n" 14206 "/* long long long long long long line */\n", 14207 getLLVMStyleWithColumns(20))); 14208 } 14209 14210 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 14211 format("? ) ="); 14212 verifyNoCrash("#define a\\\n /**/}"); 14213 } 14214 14215 TEST_F(FormatTest, FormatsTableGenCode) { 14216 FormatStyle Style = getLLVMStyle(); 14217 Style.Language = FormatStyle::LK_TableGen; 14218 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 14219 } 14220 14221 TEST_F(FormatTest, ArrayOfTemplates) { 14222 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 14223 format("auto a = new unique_ptr<int > [ 10];")); 14224 14225 FormatStyle Spaces = getLLVMStyle(); 14226 Spaces.SpacesInSquareBrackets = true; 14227 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 14228 format("auto a = new unique_ptr<int > [10];", Spaces)); 14229 } 14230 14231 TEST_F(FormatTest, ArrayAsTemplateType) { 14232 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 14233 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 14234 14235 FormatStyle Spaces = getLLVMStyle(); 14236 Spaces.SpacesInSquareBrackets = true; 14237 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 14238 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 14239 } 14240 14241 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 14242 14243 TEST(FormatStyle, GetStyleWithEmptyFileName) { 14244 llvm::vfs::InMemoryFileSystem FS; 14245 auto Style1 = getStyle("file", "", "Google", "", &FS); 14246 ASSERT_TRUE((bool)Style1); 14247 ASSERT_EQ(*Style1, getGoogleStyle()); 14248 } 14249 14250 TEST(FormatStyle, GetStyleOfFile) { 14251 llvm::vfs::InMemoryFileSystem FS; 14252 // Test 1: format file in the same directory. 14253 ASSERT_TRUE( 14254 FS.addFile("/a/.clang-format", 0, 14255 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 14256 ASSERT_TRUE( 14257 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14258 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 14259 ASSERT_TRUE((bool)Style1); 14260 ASSERT_EQ(*Style1, getLLVMStyle()); 14261 14262 // Test 2.1: fallback to default. 14263 ASSERT_TRUE( 14264 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14265 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 14266 ASSERT_TRUE((bool)Style2); 14267 ASSERT_EQ(*Style2, getMozillaStyle()); 14268 14269 // Test 2.2: no format on 'none' fallback style. 14270 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14271 ASSERT_TRUE((bool)Style2); 14272 ASSERT_EQ(*Style2, getNoStyle()); 14273 14274 // Test 2.3: format if config is found with no based style while fallback is 14275 // 'none'. 14276 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 14277 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 14278 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14279 ASSERT_TRUE((bool)Style2); 14280 ASSERT_EQ(*Style2, getLLVMStyle()); 14281 14282 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 14283 Style2 = getStyle("{}", "a.h", "none", "", &FS); 14284 ASSERT_TRUE((bool)Style2); 14285 ASSERT_EQ(*Style2, getLLVMStyle()); 14286 14287 // Test 3: format file in parent directory. 14288 ASSERT_TRUE( 14289 FS.addFile("/c/.clang-format", 0, 14290 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 14291 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 14292 llvm::MemoryBuffer::getMemBuffer("int i;"))); 14293 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 14294 ASSERT_TRUE((bool)Style3); 14295 ASSERT_EQ(*Style3, getGoogleStyle()); 14296 14297 // Test 4: error on invalid fallback style 14298 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 14299 ASSERT_FALSE((bool)Style4); 14300 llvm::consumeError(Style4.takeError()); 14301 14302 // Test 5: error on invalid yaml on command line 14303 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 14304 ASSERT_FALSE((bool)Style5); 14305 llvm::consumeError(Style5.takeError()); 14306 14307 // Test 6: error on invalid style 14308 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 14309 ASSERT_FALSE((bool)Style6); 14310 llvm::consumeError(Style6.takeError()); 14311 14312 // Test 7: found config file, error on parsing it 14313 ASSERT_TRUE( 14314 FS.addFile("/d/.clang-format", 0, 14315 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 14316 "InvalidKey: InvalidValue"))); 14317 ASSERT_TRUE( 14318 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14319 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 14320 ASSERT_FALSE((bool)Style7); 14321 llvm::consumeError(Style7.takeError()); 14322 14323 // Test 8: inferred per-language defaults apply. 14324 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 14325 ASSERT_TRUE((bool)StyleTd); 14326 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 14327 } 14328 14329 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 14330 // Column limit is 20. 14331 std::string Code = "Type *a =\n" 14332 " new Type();\n" 14333 "g(iiiii, 0, jjjjj,\n" 14334 " 0, kkkkk, 0, mm);\n" 14335 "int bad = format ;"; 14336 std::string Expected = "auto a = new Type();\n" 14337 "g(iiiii, nullptr,\n" 14338 " jjjjj, nullptr,\n" 14339 " kkkkk, nullptr,\n" 14340 " mm);\n" 14341 "int bad = format ;"; 14342 FileID ID = Context.createInMemoryFile("format.cpp", Code); 14343 tooling::Replacements Replaces = toReplacements( 14344 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 14345 "auto "), 14346 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 14347 "nullptr"), 14348 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 14349 "nullptr"), 14350 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 14351 "nullptr")}); 14352 14353 format::FormatStyle Style = format::getLLVMStyle(); 14354 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 14355 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14356 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14357 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14358 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14359 EXPECT_TRUE(static_cast<bool>(Result)); 14360 EXPECT_EQ(Expected, *Result); 14361 } 14362 14363 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 14364 std::string Code = "#include \"a.h\"\n" 14365 "#include \"c.h\"\n" 14366 "\n" 14367 "int main() {\n" 14368 " return 0;\n" 14369 "}"; 14370 std::string Expected = "#include \"a.h\"\n" 14371 "#include \"b.h\"\n" 14372 "#include \"c.h\"\n" 14373 "\n" 14374 "int main() {\n" 14375 " return 0;\n" 14376 "}"; 14377 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 14378 tooling::Replacements Replaces = toReplacements( 14379 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 14380 "#include \"b.h\"\n")}); 14381 14382 format::FormatStyle Style = format::getLLVMStyle(); 14383 Style.SortIncludes = true; 14384 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14385 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14386 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14387 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14388 EXPECT_TRUE(static_cast<bool>(Result)); 14389 EXPECT_EQ(Expected, *Result); 14390 } 14391 14392 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 14393 EXPECT_EQ("using std::cin;\n" 14394 "using std::cout;", 14395 format("using std::cout;\n" 14396 "using std::cin;", 14397 getGoogleStyle())); 14398 } 14399 14400 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 14401 format::FormatStyle Style = format::getLLVMStyle(); 14402 Style.Standard = FormatStyle::LS_Cpp03; 14403 // cpp03 recognize this string as identifier u8 and literal character 'a' 14404 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 14405 } 14406 14407 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 14408 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 14409 // all modes, including C++11, C++14 and C++17 14410 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 14411 } 14412 14413 TEST_F(FormatTest, DoNotFormatLikelyXml) { 14414 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 14415 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 14416 } 14417 14418 TEST_F(FormatTest, StructuredBindings) { 14419 // Structured bindings is a C++17 feature. 14420 // all modes, including C++11, C++14 and C++17 14421 verifyFormat("auto [a, b] = f();"); 14422 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 14423 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 14424 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 14425 EXPECT_EQ("auto const volatile [a, b] = f();", 14426 format("auto const volatile[a, b] = f();")); 14427 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 14428 EXPECT_EQ("auto &[a, b, c] = f();", 14429 format("auto &[ a , b,c ] = f();")); 14430 EXPECT_EQ("auto &&[a, b, c] = f();", 14431 format("auto &&[ a , b,c ] = f();")); 14432 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 14433 EXPECT_EQ("auto const volatile &&[a, b] = f();", 14434 format("auto const volatile &&[a, b] = f();")); 14435 EXPECT_EQ("auto const &&[a, b] = f();", 14436 format("auto const && [a, b] = f();")); 14437 EXPECT_EQ("const auto &[a, b] = f();", 14438 format("const auto & [a, b] = f();")); 14439 EXPECT_EQ("const auto volatile &&[a, b] = f();", 14440 format("const auto volatile &&[a, b] = f();")); 14441 EXPECT_EQ("volatile const auto &&[a, b] = f();", 14442 format("volatile const auto &&[a, b] = f();")); 14443 EXPECT_EQ("const auto &&[a, b] = f();", 14444 format("const auto && [a, b] = f();")); 14445 14446 // Make sure we don't mistake structured bindings for lambdas. 14447 FormatStyle PointerMiddle = getLLVMStyle(); 14448 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 14449 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 14450 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 14451 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 14452 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 14453 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 14454 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 14455 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 14456 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 14457 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 14458 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 14459 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 14460 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 14461 14462 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 14463 format("for (const auto && [a, b] : some_range) {\n}")); 14464 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 14465 format("for (const auto & [a, b] : some_range) {\n}")); 14466 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 14467 format("for (const auto[a, b] : some_range) {\n}")); 14468 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 14469 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 14470 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 14471 EXPECT_EQ("auto const &[x, y](expr);", 14472 format("auto const & [x,y] (expr);")); 14473 EXPECT_EQ("auto const &&[x, y](expr);", 14474 format("auto const && [x,y] (expr);")); 14475 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 14476 EXPECT_EQ("auto const &[x, y]{expr};", 14477 format("auto const & [x,y] {expr};")); 14478 EXPECT_EQ("auto const &&[x, y]{expr};", 14479 format("auto const && [x,y] {expr};")); 14480 14481 format::FormatStyle Spaces = format::getLLVMStyle(); 14482 Spaces.SpacesInSquareBrackets = true; 14483 verifyFormat("auto [ a, b ] = f();", Spaces); 14484 verifyFormat("auto &&[ a, b ] = f();", Spaces); 14485 verifyFormat("auto &[ a, b ] = f();", Spaces); 14486 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 14487 verifyFormat("auto const &[ a, b ] = f();", Spaces); 14488 } 14489 14490 TEST_F(FormatTest, FileAndCode) { 14491 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 14492 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 14493 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 14494 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 14495 EXPECT_EQ(FormatStyle::LK_ObjC, 14496 guessLanguage("foo.h", "@interface Foo\n@end\n")); 14497 EXPECT_EQ( 14498 FormatStyle::LK_ObjC, 14499 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 14500 EXPECT_EQ(FormatStyle::LK_ObjC, 14501 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 14502 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 14503 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 14504 EXPECT_EQ(FormatStyle::LK_ObjC, 14505 guessLanguage("foo", "@interface Foo\n@end\n")); 14506 EXPECT_EQ(FormatStyle::LK_ObjC, 14507 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 14508 EXPECT_EQ( 14509 FormatStyle::LK_ObjC, 14510 guessLanguage("foo.h", 14511 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 14512 EXPECT_EQ( 14513 FormatStyle::LK_Cpp, 14514 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 14515 } 14516 14517 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 14518 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 14519 EXPECT_EQ(FormatStyle::LK_ObjC, 14520 guessLanguage("foo.h", "array[[calculator getIndex]];")); 14521 EXPECT_EQ(FormatStyle::LK_Cpp, 14522 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 14523 EXPECT_EQ( 14524 FormatStyle::LK_Cpp, 14525 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 14526 EXPECT_EQ(FormatStyle::LK_ObjC, 14527 guessLanguage("foo.h", "[[noreturn foo] bar];")); 14528 EXPECT_EQ(FormatStyle::LK_Cpp, 14529 guessLanguage("foo.h", "[[clang::fallthrough]];")); 14530 EXPECT_EQ(FormatStyle::LK_ObjC, 14531 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 14532 EXPECT_EQ(FormatStyle::LK_Cpp, 14533 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 14534 EXPECT_EQ(FormatStyle::LK_Cpp, 14535 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 14536 EXPECT_EQ(FormatStyle::LK_ObjC, 14537 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 14538 EXPECT_EQ(FormatStyle::LK_Cpp, 14539 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 14540 EXPECT_EQ( 14541 FormatStyle::LK_Cpp, 14542 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 14543 EXPECT_EQ( 14544 FormatStyle::LK_Cpp, 14545 guessLanguage("foo.h", 14546 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 14547 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 14548 } 14549 14550 TEST_F(FormatTest, GuessLanguageWithCaret) { 14551 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 14552 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 14553 EXPECT_EQ(FormatStyle::LK_ObjC, 14554 guessLanguage("foo.h", "int(^)(char, float);")); 14555 EXPECT_EQ(FormatStyle::LK_ObjC, 14556 guessLanguage("foo.h", "int(^foo)(char, float);")); 14557 EXPECT_EQ(FormatStyle::LK_ObjC, 14558 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 14559 EXPECT_EQ(FormatStyle::LK_ObjC, 14560 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 14561 EXPECT_EQ( 14562 FormatStyle::LK_ObjC, 14563 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 14564 } 14565 14566 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 14567 EXPECT_EQ(FormatStyle::LK_Cpp, 14568 guessLanguage("foo.h", "void f() {\n" 14569 " asm (\"mov %[e], %[d]\"\n" 14570 " : [d] \"=rm\" (d)\n" 14571 " [e] \"rm\" (*e));\n" 14572 "}")); 14573 EXPECT_EQ(FormatStyle::LK_Cpp, 14574 guessLanguage("foo.h", "void f() {\n" 14575 " _asm (\"mov %[e], %[d]\"\n" 14576 " : [d] \"=rm\" (d)\n" 14577 " [e] \"rm\" (*e));\n" 14578 "}")); 14579 EXPECT_EQ(FormatStyle::LK_Cpp, 14580 guessLanguage("foo.h", "void f() {\n" 14581 " __asm (\"mov %[e], %[d]\"\n" 14582 " : [d] \"=rm\" (d)\n" 14583 " [e] \"rm\" (*e));\n" 14584 "}")); 14585 EXPECT_EQ(FormatStyle::LK_Cpp, 14586 guessLanguage("foo.h", "void f() {\n" 14587 " __asm__ (\"mov %[e], %[d]\"\n" 14588 " : [d] \"=rm\" (d)\n" 14589 " [e] \"rm\" (*e));\n" 14590 "}")); 14591 EXPECT_EQ(FormatStyle::LK_Cpp, 14592 guessLanguage("foo.h", "void f() {\n" 14593 " asm (\"mov %[e], %[d]\"\n" 14594 " : [d] \"=rm\" (d),\n" 14595 " [e] \"rm\" (*e));\n" 14596 "}")); 14597 EXPECT_EQ(FormatStyle::LK_Cpp, 14598 guessLanguage("foo.h", "void f() {\n" 14599 " asm volatile (\"mov %[e], %[d]\"\n" 14600 " : [d] \"=rm\" (d)\n" 14601 " [e] \"rm\" (*e));\n" 14602 "}")); 14603 } 14604 14605 TEST_F(FormatTest, GuessLanguageWithChildLines) { 14606 EXPECT_EQ(FormatStyle::LK_Cpp, 14607 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 14608 EXPECT_EQ(FormatStyle::LK_ObjC, 14609 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 14610 EXPECT_EQ( 14611 FormatStyle::LK_Cpp, 14612 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 14613 EXPECT_EQ( 14614 FormatStyle::LK_ObjC, 14615 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 14616 } 14617 14618 TEST_F(FormatTest, TypenameMacros) { 14619 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 14620 14621 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 14622 FormatStyle Google = getGoogleStyleWithColumns(0); 14623 Google.TypenameMacros = TypenameMacros; 14624 verifyFormat("struct foo {\n" 14625 " int bar;\n" 14626 " TAILQ_ENTRY(a) bleh;\n" 14627 "};", 14628 Google); 14629 14630 FormatStyle Macros = getLLVMStyle(); 14631 Macros.TypenameMacros = TypenameMacros; 14632 14633 verifyFormat("STACK_OF(int) a;", Macros); 14634 verifyFormat("STACK_OF(int) *a;", Macros); 14635 verifyFormat("STACK_OF(int const *) *a;", Macros); 14636 verifyFormat("STACK_OF(int *const) *a;", Macros); 14637 verifyFormat("STACK_OF(int, string) a;", Macros); 14638 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 14639 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 14640 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 14641 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 14642 14643 Macros.PointerAlignment = FormatStyle::PAS_Left; 14644 verifyFormat("STACK_OF(int)* a;", Macros); 14645 verifyFormat("STACK_OF(int*)* a;", Macros); 14646 } 14647 14648 TEST_F(FormatTest, AmbersandInLamda) { 14649 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 14650 FormatStyle AlignStyle = getLLVMStyle(); 14651 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 14652 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14653 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 14654 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14655 } 14656 14657 TEST_F(FormatTest, AlternativeOperators) { 14658 // Test case for ensuring alternate operators are not 14659 // combined with their right most neighbour. 14660 verifyFormat("int a and b;"); 14661 verifyFormat("int a and_eq b;"); 14662 verifyFormat("int a bitand b;"); 14663 verifyFormat("int a bitor b;"); 14664 verifyFormat("int a compl b;"); 14665 verifyFormat("int a not b;"); 14666 verifyFormat("int a not_eq b;"); 14667 verifyFormat("int a or b;"); 14668 verifyFormat("int a xor b;"); 14669 verifyFormat("int a xor_eq b;"); 14670 verifyFormat("return this not_eq bitand other;"); 14671 verifyFormat("bool operator not_eq(const X bitand other)"); 14672 14673 verifyFormat("int a and 5;"); 14674 verifyFormat("int a and_eq 5;"); 14675 verifyFormat("int a bitand 5;"); 14676 verifyFormat("int a bitor 5;"); 14677 verifyFormat("int a compl 5;"); 14678 verifyFormat("int a not 5;"); 14679 verifyFormat("int a not_eq 5;"); 14680 verifyFormat("int a or 5;"); 14681 verifyFormat("int a xor 5;"); 14682 verifyFormat("int a xor_eq 5;"); 14683 14684 verifyFormat("int a compl(5);"); 14685 verifyFormat("int a not(5);"); 14686 14687 /* FIXME handle alternate tokens 14688 * https://en.cppreference.com/w/cpp/language/operator_alternative 14689 // alternative tokens 14690 verifyFormat("compl foo();"); // ~foo(); 14691 verifyFormat("foo() <%%>;"); // foo(); 14692 verifyFormat("void foo() <%%>;"); // void foo(){} 14693 verifyFormat("int a <:1:>;"); // int a[1];[ 14694 verifyFormat("%:define ABC abc"); // #define ABC abc 14695 verifyFormat("%:%:"); // ## 14696 */ 14697 } 14698 14699 TEST_F(FormatTest, NotCastRPaen) { 14700 14701 verifyFormat("void operator++(int) noexcept;"); 14702 verifyFormat("void operator++(int &) noexcept;"); 14703 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 14704 "&) noexcept;"); 14705 verifyFormat( 14706 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 14707 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 14708 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 14709 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 14710 verifyFormat("void operator delete(foo &) noexcept;"); 14711 verifyFormat("void operator delete(foo) noexcept;"); 14712 verifyFormat("void operator delete(int) noexcept;"); 14713 verifyFormat("void operator delete(int &) noexcept;"); 14714 verifyFormat("void operator delete(int &) volatile noexcept;"); 14715 verifyFormat("void operator delete(int &) const"); 14716 verifyFormat("void operator delete(int &) = default"); 14717 verifyFormat("void operator delete(int &) = delete"); 14718 verifyFormat("void operator delete(int &) [[noreturn]]"); 14719 verifyFormat("void operator delete(int &) throw();"); 14720 verifyFormat("void operator delete(int &) throw(int);"); 14721 verifyFormat("auto operator delete(int &) -> int;"); 14722 verifyFormat("auto operator delete(int &) override"); 14723 verifyFormat("auto operator delete(int &) final"); 14724 } 14725 14726 TEST_F(FormatTest, STLWhileNotDefineChed) { 14727 verifyFormat("#if defined(while)\n" 14728 "#define while EMIT WARNING C4005\n" 14729 "#endif // while"); 14730 } 14731 14732 } // namespace 14733 } // namespace format 14734 } // namespace clang 14735