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 { 33 SC_ExpectComplete, 34 SC_ExpectIncomplete, 35 SC_DoNotCheck 36 }; 37 38 std::string format(llvm::StringRef Code, 39 const FormatStyle &Style = getLLVMStyle(), 40 StatusCheck CheckComplete = SC_ExpectComplete) { 41 LLVM_DEBUG(llvm::errs() << "---\n"); 42 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 43 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 44 FormattingAttemptStatus Status; 45 tooling::Replacements Replaces = 46 reformat(Style, Code, Ranges, "<stdin>", &Status); 47 if (CheckComplete != SC_DoNotCheck) { 48 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete; 49 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete) 50 << Code << "\n\n"; 51 } 52 ReplacementCount = Replaces.size(); 53 auto Result = applyAllReplacements(Code, Replaces); 54 EXPECT_TRUE(static_cast<bool>(Result)); 55 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 56 return *Result; 57 } 58 59 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) { 60 Style.ColumnLimit = ColumnLimit; 61 return Style; 62 } 63 64 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) { 65 return getStyleWithColumns(getLLVMStyle(), ColumnLimit); 66 } 67 68 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) { 69 return getStyleWithColumns(getGoogleStyle(), ColumnLimit); 70 } 71 72 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code, 73 const FormatStyle &Style = getLLVMStyle()) { 74 EXPECT_EQ(Expected.str(), format(Expected, Style)) 75 << "Expected code is not stable"; 76 EXPECT_EQ(Expected.str(), format(Code, Style)); 77 if (Style.Language == FormatStyle::LK_Cpp) { 78 // Objective-C++ is a superset of C++, so everything checked for C++ 79 // needs to be checked for Objective-C++ as well. 80 FormatStyle ObjCStyle = Style; 81 ObjCStyle.Language = FormatStyle::LK_ObjC; 82 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle)); 83 } 84 } 85 86 void verifyFormat(llvm::StringRef Code, 87 const FormatStyle &Style = getLLVMStyle()) { 88 verifyFormat(Code, test::messUp(Code), Style); 89 } 90 91 void verifyIncompleteFormat(llvm::StringRef Code, 92 const FormatStyle &Style = getLLVMStyle()) { 93 EXPECT_EQ(Code.str(), 94 format(test::messUp(Code), Style, SC_ExpectIncomplete)); 95 } 96 97 void verifyGoogleFormat(llvm::StringRef Code) { 98 verifyFormat(Code, getGoogleStyle()); 99 } 100 101 void verifyIndependentOfContext(llvm::StringRef text) { 102 verifyFormat(text); 103 verifyFormat(llvm::Twine("void f() { " + text + " }").str()); 104 } 105 106 /// \brief Verify that clang-format does not crash on the given input. 107 void verifyNoCrash(llvm::StringRef Code, 108 const FormatStyle &Style = getLLVMStyle()) { 109 format(Code, Style, SC_DoNotCheck); 110 } 111 112 int ReplacementCount; 113 }; 114 115 TEST_F(FormatTest, MessUp) { 116 EXPECT_EQ("1 2 3", test::messUp("1 2 3")); 117 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n")); 118 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc")); 119 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc")); 120 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne")); 121 } 122 123 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) { 124 EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language); 125 } 126 127 TEST_F(FormatTest, LLVMStyleOverride) { 128 EXPECT_EQ(FormatStyle::LK_Proto, 129 getLLVMStyle(FormatStyle::LK_Proto).Language); 130 } 131 132 //===----------------------------------------------------------------------===// 133 // Basic function tests. 134 //===----------------------------------------------------------------------===// 135 136 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) { 137 EXPECT_EQ(";", format(";")); 138 } 139 140 TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 141 EXPECT_EQ("int i;", format(" int i;")); 142 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;")); 143 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 144 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 145 } 146 147 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 148 EXPECT_EQ("int i;", format("int\ni;")); 149 } 150 151 TEST_F(FormatTest, FormatsNestedBlockStatements) { 152 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}")); 153 } 154 155 TEST_F(FormatTest, FormatsNestedCall) { 156 verifyFormat("Method(f1, f2(f3));"); 157 verifyFormat("Method(f1(f2, f3()));"); 158 verifyFormat("Method(f1(f2, (f3())));"); 159 } 160 161 TEST_F(FormatTest, NestedNameSpecifiers) { 162 verifyFormat("vector<::Type> v;"); 163 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); 164 verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); 165 verifyFormat("bool a = 2 < ::SomeFunction();"); 166 verifyFormat("ALWAYS_INLINE ::std::string getName();"); 167 verifyFormat("some::string getName();"); 168 } 169 170 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { 171 EXPECT_EQ("if (a) {\n" 172 " f();\n" 173 "}", 174 format("if(a){f();}")); 175 EXPECT_EQ(4, ReplacementCount); 176 EXPECT_EQ("if (a) {\n" 177 " f();\n" 178 "}", 179 format("if (a) {\n" 180 " f();\n" 181 "}")); 182 EXPECT_EQ(0, ReplacementCount); 183 EXPECT_EQ("/*\r\n" 184 "\r\n" 185 "*/\r\n", 186 format("/*\r\n" 187 "\r\n" 188 "*/\r\n")); 189 EXPECT_EQ(0, ReplacementCount); 190 } 191 192 TEST_F(FormatTest, RemovesEmptyLines) { 193 EXPECT_EQ("class C {\n" 194 " int i;\n" 195 "};", 196 format("class C {\n" 197 " int i;\n" 198 "\n" 199 "};")); 200 201 // Don't remove empty lines at the start of namespaces or extern "C" blocks. 202 EXPECT_EQ("namespace N {\n" 203 "\n" 204 "int i;\n" 205 "}", 206 format("namespace N {\n" 207 "\n" 208 "int i;\n" 209 "}", 210 getGoogleStyle())); 211 EXPECT_EQ("/* something */ namespace N {\n" 212 "\n" 213 "int i;\n" 214 "}", 215 format("/* something */ namespace N {\n" 216 "\n" 217 "int i;\n" 218 "}", 219 getGoogleStyle())); 220 EXPECT_EQ("inline namespace N {\n" 221 "\n" 222 "int i;\n" 223 "}", 224 format("inline namespace N {\n" 225 "\n" 226 "int i;\n" 227 "}", 228 getGoogleStyle())); 229 EXPECT_EQ("/* something */ inline namespace N {\n" 230 "\n" 231 "int i;\n" 232 "}", 233 format("/* something */ inline namespace N {\n" 234 "\n" 235 "int i;\n" 236 "}", 237 getGoogleStyle())); 238 EXPECT_EQ("export namespace N {\n" 239 "\n" 240 "int i;\n" 241 "}", 242 format("export namespace N {\n" 243 "\n" 244 "int i;\n" 245 "}", 246 getGoogleStyle())); 247 EXPECT_EQ("extern /**/ \"C\" /**/ {\n" 248 "\n" 249 "int i;\n" 250 "}", 251 format("extern /**/ \"C\" /**/ {\n" 252 "\n" 253 "int i;\n" 254 "}", 255 getGoogleStyle())); 256 257 // ...but do keep inlining and removing empty lines for non-block extern "C" 258 // functions. 259 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); 260 EXPECT_EQ("extern \"C\" int f() {\n" 261 " int i = 42;\n" 262 " return i;\n" 263 "}", 264 format("extern \"C\" int f() {\n" 265 "\n" 266 " int i = 42;\n" 267 " return i;\n" 268 "}", 269 getGoogleStyle())); 270 271 // Remove empty lines at the beginning and end of blocks. 272 EXPECT_EQ("void f() {\n" 273 "\n" 274 " if (a) {\n" 275 "\n" 276 " f();\n" 277 " }\n" 278 "}", 279 format("void f() {\n" 280 "\n" 281 " if (a) {\n" 282 "\n" 283 " f();\n" 284 "\n" 285 " }\n" 286 "\n" 287 "}", 288 getLLVMStyle())); 289 EXPECT_EQ("void f() {\n" 290 " if (a) {\n" 291 " f();\n" 292 " }\n" 293 "}", 294 format("void f() {\n" 295 "\n" 296 " if (a) {\n" 297 "\n" 298 " f();\n" 299 "\n" 300 " }\n" 301 "\n" 302 "}", 303 getGoogleStyle())); 304 305 // Don't remove empty lines in more complex control statements. 306 EXPECT_EQ("void f() {\n" 307 " if (a) {\n" 308 " f();\n" 309 "\n" 310 " } else if (b) {\n" 311 " f();\n" 312 " }\n" 313 "}", 314 format("void f() {\n" 315 " if (a) {\n" 316 " f();\n" 317 "\n" 318 " } else if (b) {\n" 319 " f();\n" 320 "\n" 321 " }\n" 322 "\n" 323 "}")); 324 325 // Don't remove empty lines before namespace endings. 326 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 327 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 328 EXPECT_EQ("namespace {\n" 329 "int i;\n" 330 "\n" 331 "}", 332 format("namespace {\n" 333 "int i;\n" 334 "\n" 335 "}", LLVMWithNoNamespaceFix)); 336 EXPECT_EQ("namespace {\n" 337 "int i;\n" 338 "}", 339 format("namespace {\n" 340 "int i;\n" 341 "}", LLVMWithNoNamespaceFix)); 342 EXPECT_EQ("namespace {\n" 343 "int i;\n" 344 "\n" 345 "};", 346 format("namespace {\n" 347 "int i;\n" 348 "\n" 349 "};", LLVMWithNoNamespaceFix)); 350 EXPECT_EQ("namespace {\n" 351 "int i;\n" 352 "};", 353 format("namespace {\n" 354 "int i;\n" 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 = true; 648 649 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 650 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 651 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 652 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 653 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 654 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 655 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 656 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 657 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 658 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 659 verifyFormat("if (true)\n" 660 "{\n" 661 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 662 "}", 663 AllowSimpleBracedStatements); 664 verifyFormat("if (true)\n" 665 "{ //\n" 666 " f();\n" 667 "}", 668 AllowSimpleBracedStatements); 669 verifyFormat("if (true)\n" 670 "{\n" 671 " f();\n" 672 " f();\n" 673 "}", 674 AllowSimpleBracedStatements); 675 verifyFormat("if (true)\n" 676 "{\n" 677 " f();\n" 678 "} else\n" 679 "{\n" 680 " f();\n" 681 "}", 682 AllowSimpleBracedStatements); 683 684 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 685 FormatStyle::SIS_Never; 686 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 687 verifyFormat("if (true)\n" 688 "{\n" 689 " f();\n" 690 "}", 691 AllowSimpleBracedStatements); 692 verifyFormat("if (true)\n" 693 "{\n" 694 " f();\n" 695 "} else\n" 696 "{\n" 697 " f();\n" 698 "}", 699 AllowSimpleBracedStatements); 700 701 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 702 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 703 verifyFormat("while (true)\n" 704 "{\n" 705 " f();\n" 706 "}", 707 AllowSimpleBracedStatements); 708 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 709 verifyFormat("for (;;)\n" 710 "{\n" 711 " f();\n" 712 "}", 713 AllowSimpleBracedStatements); 714 } 715 716 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 717 FormatStyle Style = getLLVMStyleWithColumns(60); 718 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 719 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 720 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 721 EXPECT_EQ("#define A \\\n" 722 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 723 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 724 "X;", 725 format("#define A \\\n" 726 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 727 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 728 " }\n" 729 "X;", 730 Style)); 731 } 732 733 TEST_F(FormatTest, ParseIfElse) { 734 verifyFormat("if (true)\n" 735 " if (true)\n" 736 " if (true)\n" 737 " f();\n" 738 " else\n" 739 " g();\n" 740 " else\n" 741 " h();\n" 742 "else\n" 743 " i();"); 744 verifyFormat("if (true)\n" 745 " if (true)\n" 746 " if (true) {\n" 747 " if (true)\n" 748 " f();\n" 749 " } else {\n" 750 " g();\n" 751 " }\n" 752 " else\n" 753 " h();\n" 754 "else {\n" 755 " i();\n" 756 "}"); 757 verifyFormat("if (true)\n" 758 " if constexpr (true)\n" 759 " if (true) {\n" 760 " if constexpr (true)\n" 761 " f();\n" 762 " } else {\n" 763 " g();\n" 764 " }\n" 765 " else\n" 766 " h();\n" 767 "else {\n" 768 " i();\n" 769 "}"); 770 verifyFormat("if (true)\n" 771 " if CONSTEXPR (true)\n" 772 " if (true) {\n" 773 " if CONSTEXPR (true)\n" 774 " f();\n" 775 " } else {\n" 776 " g();\n" 777 " }\n" 778 " else\n" 779 " h();\n" 780 "else {\n" 781 " i();\n" 782 "}"); 783 verifyFormat("void f() {\n" 784 " if (a) {\n" 785 " } else {\n" 786 " }\n" 787 "}"); 788 } 789 790 TEST_F(FormatTest, ElseIf) { 791 verifyFormat("if (a) {\n} else if (b) {\n}"); 792 verifyFormat("if (a)\n" 793 " f();\n" 794 "else if (b)\n" 795 " g();\n" 796 "else\n" 797 " h();"); 798 verifyFormat("if constexpr (a)\n" 799 " f();\n" 800 "else if constexpr (b)\n" 801 " g();\n" 802 "else\n" 803 " h();"); 804 verifyFormat("if CONSTEXPR (a)\n" 805 " f();\n" 806 "else if CONSTEXPR (b)\n" 807 " g();\n" 808 "else\n" 809 " h();"); 810 verifyFormat("if (a) {\n" 811 " f();\n" 812 "}\n" 813 "// or else ..\n" 814 "else {\n" 815 " g()\n" 816 "}"); 817 818 verifyFormat("if (a) {\n" 819 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 821 "}"); 822 verifyFormat("if (a) {\n" 823 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 824 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 825 "}"); 826 verifyFormat("if (a) {\n" 827 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 829 "}"); 830 verifyFormat("if (a) {\n" 831 "} else if (\n" 832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 833 "}", 834 getLLVMStyleWithColumns(62)); 835 verifyFormat("if (a) {\n" 836 "} else if constexpr (\n" 837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 838 "}", 839 getLLVMStyleWithColumns(62)); 840 verifyFormat("if (a) {\n" 841 "} else if CONSTEXPR (\n" 842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 843 "}", 844 getLLVMStyleWithColumns(62)); 845 } 846 847 TEST_F(FormatTest, FormatsForLoop) { 848 verifyFormat( 849 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 850 " ++VeryVeryLongLoopVariable)\n" 851 " ;"); 852 verifyFormat("for (;;)\n" 853 " f();"); 854 verifyFormat("for (;;) {\n}"); 855 verifyFormat("for (;;) {\n" 856 " f();\n" 857 "}"); 858 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 859 860 verifyFormat( 861 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 862 " E = UnwrappedLines.end();\n" 863 " I != E; ++I) {\n}"); 864 865 verifyFormat( 866 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 867 " ++IIIII) {\n}"); 868 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 869 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 870 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 871 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 872 " I = FD->getDeclsInPrototypeScope().begin(),\n" 873 " E = FD->getDeclsInPrototypeScope().end();\n" 874 " I != E; ++I) {\n}"); 875 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 876 " I = Container.begin(),\n" 877 " E = Container.end();\n" 878 " I != E; ++I) {\n}", 879 getLLVMStyleWithColumns(76)); 880 881 verifyFormat( 882 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 883 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 886 " ++aaaaaaaaaaa) {\n}"); 887 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 888 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 889 " ++i) {\n}"); 890 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 891 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 892 "}"); 893 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 894 " aaaaaaaaaa);\n" 895 " iter; ++iter) {\n" 896 "}"); 897 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 899 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 900 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 901 902 // These should not be formatted as Objective-C for-in loops. 903 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 904 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 905 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 906 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 907 908 FormatStyle NoBinPacking = getLLVMStyle(); 909 NoBinPacking.BinPackParameters = false; 910 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 911 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 912 " aaaaaaaaaaaaaaaa,\n" 913 " aaaaaaaaaaaaaaaa,\n" 914 " aaaaaaaaaaaaaaaa);\n" 915 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 916 "}", 917 NoBinPacking); 918 verifyFormat( 919 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 920 " E = UnwrappedLines.end();\n" 921 " I != E;\n" 922 " ++I) {\n}", 923 NoBinPacking); 924 925 FormatStyle AlignLeft = getLLVMStyle(); 926 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 927 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 928 } 929 930 TEST_F(FormatTest, RangeBasedForLoops) { 931 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 933 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 934 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 935 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 936 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 937 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 938 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 939 } 940 941 TEST_F(FormatTest, ForEachLoops) { 942 verifyFormat("void f() {\n" 943 " foreach (Item *item, itemlist) {}\n" 944 " Q_FOREACH (Item *item, itemlist) {}\n" 945 " BOOST_FOREACH (Item *item, itemlist) {}\n" 946 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 947 "}"); 948 949 // As function-like macros. 950 verifyFormat("#define foreach(x, y)\n" 951 "#define Q_FOREACH(x, y)\n" 952 "#define BOOST_FOREACH(x, y)\n" 953 "#define UNKNOWN_FOREACH(x, y)\n"); 954 955 // Not as function-like macros. 956 verifyFormat("#define foreach (x, y)\n" 957 "#define Q_FOREACH (x, y)\n" 958 "#define BOOST_FOREACH (x, y)\n" 959 "#define UNKNOWN_FOREACH (x, y)\n"); 960 } 961 962 TEST_F(FormatTest, FormatsWhileLoop) { 963 verifyFormat("while (true) {\n}"); 964 verifyFormat("while (true)\n" 965 " f();"); 966 verifyFormat("while () {\n}"); 967 verifyFormat("while () {\n" 968 " f();\n" 969 "}"); 970 } 971 972 TEST_F(FormatTest, FormatsDoWhile) { 973 verifyFormat("do {\n" 974 " do_something();\n" 975 "} while (something());"); 976 verifyFormat("do\n" 977 " do_something();\n" 978 "while (something());"); 979 } 980 981 TEST_F(FormatTest, FormatsSwitchStatement) { 982 verifyFormat("switch (x) {\n" 983 "case 1:\n" 984 " f();\n" 985 " break;\n" 986 "case kFoo:\n" 987 "case ns::kBar:\n" 988 "case kBaz:\n" 989 " break;\n" 990 "default:\n" 991 " g();\n" 992 " break;\n" 993 "}"); 994 verifyFormat("switch (x) {\n" 995 "case 1: {\n" 996 " f();\n" 997 " break;\n" 998 "}\n" 999 "case 2: {\n" 1000 " break;\n" 1001 "}\n" 1002 "}"); 1003 verifyFormat("switch (x) {\n" 1004 "case 1: {\n" 1005 " f();\n" 1006 " {\n" 1007 " g();\n" 1008 " h();\n" 1009 " }\n" 1010 " break;\n" 1011 "}\n" 1012 "}"); 1013 verifyFormat("switch (x) {\n" 1014 "case 1: {\n" 1015 " f();\n" 1016 " if (foo) {\n" 1017 " g();\n" 1018 " h();\n" 1019 " }\n" 1020 " break;\n" 1021 "}\n" 1022 "}"); 1023 verifyFormat("switch (x) {\n" 1024 "case 1: {\n" 1025 " f();\n" 1026 " g();\n" 1027 "} break;\n" 1028 "}"); 1029 verifyFormat("switch (test)\n" 1030 " ;"); 1031 verifyFormat("switch (x) {\n" 1032 "default: {\n" 1033 " // Do nothing.\n" 1034 "}\n" 1035 "}"); 1036 verifyFormat("switch (x) {\n" 1037 "// comment\n" 1038 "// if 1, do f()\n" 1039 "case 1:\n" 1040 " f();\n" 1041 "}"); 1042 verifyFormat("switch (x) {\n" 1043 "case 1:\n" 1044 " // Do amazing stuff\n" 1045 " {\n" 1046 " f();\n" 1047 " g();\n" 1048 " }\n" 1049 " break;\n" 1050 "}"); 1051 verifyFormat("#define A \\\n" 1052 " switch (x) { \\\n" 1053 " case a: \\\n" 1054 " foo = b; \\\n" 1055 " }", 1056 getLLVMStyleWithColumns(20)); 1057 verifyFormat("#define OPERATION_CASE(name) \\\n" 1058 " case OP_name: \\\n" 1059 " return operations::Operation##name\n", 1060 getLLVMStyleWithColumns(40)); 1061 verifyFormat("switch (x) {\n" 1062 "case 1:;\n" 1063 "default:;\n" 1064 " int i;\n" 1065 "}"); 1066 1067 verifyGoogleFormat("switch (x) {\n" 1068 " case 1:\n" 1069 " f();\n" 1070 " break;\n" 1071 " case kFoo:\n" 1072 " case ns::kBar:\n" 1073 " case kBaz:\n" 1074 " break;\n" 1075 " default:\n" 1076 " g();\n" 1077 " break;\n" 1078 "}"); 1079 verifyGoogleFormat("switch (x) {\n" 1080 " case 1: {\n" 1081 " f();\n" 1082 " break;\n" 1083 " }\n" 1084 "}"); 1085 verifyGoogleFormat("switch (test)\n" 1086 " ;"); 1087 1088 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1089 " case OP_name: \\\n" 1090 " return operations::Operation##name\n"); 1091 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1092 " // Get the correction operation class.\n" 1093 " switch (OpCode) {\n" 1094 " CASE(Add);\n" 1095 " CASE(Subtract);\n" 1096 " default:\n" 1097 " return operations::Unknown;\n" 1098 " }\n" 1099 "#undef OPERATION_CASE\n" 1100 "}"); 1101 verifyFormat("DEBUG({\n" 1102 " switch (x) {\n" 1103 " case A:\n" 1104 " f();\n" 1105 " break;\n" 1106 " // fallthrough\n" 1107 " case B:\n" 1108 " g();\n" 1109 " break;\n" 1110 " }\n" 1111 "});"); 1112 EXPECT_EQ("DEBUG({\n" 1113 " switch (x) {\n" 1114 " case A:\n" 1115 " f();\n" 1116 " break;\n" 1117 " // On B:\n" 1118 " case B:\n" 1119 " g();\n" 1120 " break;\n" 1121 " }\n" 1122 "});", 1123 format("DEBUG({\n" 1124 " switch (x) {\n" 1125 " case A:\n" 1126 " f();\n" 1127 " break;\n" 1128 " // On B:\n" 1129 " case B:\n" 1130 " g();\n" 1131 " break;\n" 1132 " }\n" 1133 "});", 1134 getLLVMStyle())); 1135 EXPECT_EQ("switch (n) {\n" 1136 "case 0: {\n" 1137 " return false;\n" 1138 "}\n" 1139 "default: {\n" 1140 " return true;\n" 1141 "}\n" 1142 "}", 1143 format("switch (n)\n" 1144 "{\n" 1145 "case 0: {\n" 1146 " return false;\n" 1147 "}\n" 1148 "default: {\n" 1149 " return true;\n" 1150 "}\n" 1151 "}", 1152 getLLVMStyle())); 1153 verifyFormat("switch (a) {\n" 1154 "case (b):\n" 1155 " return;\n" 1156 "}"); 1157 1158 verifyFormat("switch (a) {\n" 1159 "case some_namespace::\n" 1160 " some_constant:\n" 1161 " return;\n" 1162 "}", 1163 getLLVMStyleWithColumns(34)); 1164 1165 FormatStyle Style = getLLVMStyle(); 1166 Style.IndentCaseLabels = true; 1167 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1168 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1169 Style.BraceWrapping.AfterCaseLabel = true; 1170 Style.BraceWrapping.AfterControlStatement = true; 1171 EXPECT_EQ("switch (n)\n" 1172 "{\n" 1173 " case 0:\n" 1174 " {\n" 1175 " return false;\n" 1176 " }\n" 1177 " default:\n" 1178 " {\n" 1179 " return true;\n" 1180 " }\n" 1181 "}", 1182 format("switch (n) {\n" 1183 " case 0: {\n" 1184 " return false;\n" 1185 " }\n" 1186 " default: {\n" 1187 " return true;\n" 1188 " }\n" 1189 "}", 1190 Style)); 1191 Style.BraceWrapping.AfterCaseLabel = false; 1192 EXPECT_EQ("switch (n)\n" 1193 "{\n" 1194 " case 0: {\n" 1195 " return false;\n" 1196 " }\n" 1197 " default: {\n" 1198 " return true;\n" 1199 " }\n" 1200 "}", 1201 format("switch (n) {\n" 1202 " case 0:\n" 1203 " {\n" 1204 " return false;\n" 1205 " }\n" 1206 " default:\n" 1207 " {\n" 1208 " return true;\n" 1209 " }\n" 1210 "}", 1211 Style)); 1212 } 1213 1214 TEST_F(FormatTest, CaseRanges) { 1215 verifyFormat("switch (x) {\n" 1216 "case 'A' ... 'Z':\n" 1217 "case 1 ... 5:\n" 1218 "case a ... b:\n" 1219 " break;\n" 1220 "}"); 1221 } 1222 1223 TEST_F(FormatTest, ShortCaseLabels) { 1224 FormatStyle Style = getLLVMStyle(); 1225 Style.AllowShortCaseLabelsOnASingleLine = true; 1226 verifyFormat("switch (a) {\n" 1227 "case 1: x = 1; break;\n" 1228 "case 2: return;\n" 1229 "case 3:\n" 1230 "case 4:\n" 1231 "case 5: return;\n" 1232 "case 6: // comment\n" 1233 " return;\n" 1234 "case 7:\n" 1235 " // comment\n" 1236 " return;\n" 1237 "case 8:\n" 1238 " x = 8; // comment\n" 1239 " break;\n" 1240 "default: y = 1; break;\n" 1241 "}", 1242 Style); 1243 verifyFormat("switch (a) {\n" 1244 "case 0: return; // comment\n" 1245 "case 1: break; // comment\n" 1246 "case 2: return;\n" 1247 "// comment\n" 1248 "case 3: return;\n" 1249 "// comment 1\n" 1250 "// comment 2\n" 1251 "// comment 3\n" 1252 "case 4: break; /* comment */\n" 1253 "case 5:\n" 1254 " // comment\n" 1255 " break;\n" 1256 "case 6: /* comment */ x = 1; break;\n" 1257 "case 7: x = /* comment */ 1; break;\n" 1258 "case 8:\n" 1259 " x = 1; /* comment */\n" 1260 " break;\n" 1261 "case 9:\n" 1262 " break; // comment line 1\n" 1263 " // comment line 2\n" 1264 "}", 1265 Style); 1266 EXPECT_EQ("switch (a) {\n" 1267 "case 1:\n" 1268 " x = 8;\n" 1269 " // fall through\n" 1270 "case 2: x = 8;\n" 1271 "// comment\n" 1272 "case 3:\n" 1273 " return; /* comment line 1\n" 1274 " * comment line 2 */\n" 1275 "case 4: i = 8;\n" 1276 "// something else\n" 1277 "#if FOO\n" 1278 "case 5: break;\n" 1279 "#endif\n" 1280 "}", 1281 format("switch (a) {\n" 1282 "case 1: x = 8;\n" 1283 " // fall through\n" 1284 "case 2:\n" 1285 " x = 8;\n" 1286 "// comment\n" 1287 "case 3:\n" 1288 " return; /* comment line 1\n" 1289 " * comment line 2 */\n" 1290 "case 4:\n" 1291 " i = 8;\n" 1292 "// something else\n" 1293 "#if FOO\n" 1294 "case 5: break;\n" 1295 "#endif\n" 1296 "}", 1297 Style)); 1298 EXPECT_EQ("switch (a) {\n" "case 0:\n" 1299 " return; // long long long long long long long long long long long long comment\n" 1300 " // line\n" "}", 1301 format("switch (a) {\n" 1302 "case 0: return; // long long long long long long long long long long long long comment line\n" 1303 "}", 1304 Style)); 1305 EXPECT_EQ("switch (a) {\n" 1306 "case 0:\n" 1307 " return; /* long long long long long long long long long long long long comment\n" 1308 " line */\n" 1309 "}", 1310 format("switch (a) {\n" 1311 "case 0: return; /* long long long long long long long long long long long long comment line */\n" 1312 "}", 1313 Style)); 1314 verifyFormat("switch (a) {\n" 1315 "#if FOO\n" 1316 "case 0: return 0;\n" 1317 "#endif\n" 1318 "}", 1319 Style); 1320 verifyFormat("switch (a) {\n" 1321 "case 1: {\n" 1322 "}\n" 1323 "case 2: {\n" 1324 " return;\n" 1325 "}\n" 1326 "case 3: {\n" 1327 " x = 1;\n" 1328 " return;\n" 1329 "}\n" 1330 "case 4:\n" 1331 " if (x)\n" 1332 " return;\n" 1333 "}", 1334 Style); 1335 Style.ColumnLimit = 21; 1336 verifyFormat("switch (a) {\n" 1337 "case 1: x = 1; break;\n" 1338 "case 2: return;\n" 1339 "case 3:\n" 1340 "case 4:\n" 1341 "case 5: return;\n" 1342 "default:\n" 1343 " y = 1;\n" 1344 " break;\n" 1345 "}", 1346 Style); 1347 Style.ColumnLimit = 80; 1348 Style.AllowShortCaseLabelsOnASingleLine = false; 1349 Style.IndentCaseLabels = true; 1350 EXPECT_EQ("switch (n) {\n" 1351 " default /*comments*/:\n" 1352 " return true;\n" 1353 " case 0:\n" 1354 " return false;\n" 1355 "}", 1356 format("switch (n) {\n" 1357 "default/*comments*/:\n" 1358 " return true;\n" 1359 "case 0:\n" 1360 " return false;\n" 1361 "}", 1362 Style)); 1363 Style.AllowShortCaseLabelsOnASingleLine = true; 1364 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1365 Style.BraceWrapping.AfterCaseLabel = true; 1366 Style.BraceWrapping.AfterControlStatement = true; 1367 EXPECT_EQ("switch (n)\n" 1368 "{\n" 1369 " case 0:\n" 1370 " {\n" 1371 " return false;\n" 1372 " }\n" 1373 " default:\n" 1374 " {\n" 1375 " return true;\n" 1376 " }\n" 1377 "}", 1378 format("switch (n) {\n" 1379 " case 0: {\n" 1380 " return false;\n" 1381 " }\n" 1382 " default:\n" 1383 " {\n" 1384 " return true;\n" 1385 " }\n" 1386 "}", 1387 Style)); 1388 } 1389 1390 TEST_F(FormatTest, FormatsLabels) { 1391 verifyFormat("void f() {\n" 1392 " some_code();\n" 1393 "test_label:\n" 1394 " some_other_code();\n" 1395 " {\n" 1396 " some_more_code();\n" 1397 " another_label:\n" 1398 " some_more_code();\n" 1399 " }\n" 1400 "}"); 1401 verifyFormat("{\n" 1402 " some_code();\n" 1403 "test_label:\n" 1404 " some_other_code();\n" 1405 "}"); 1406 verifyFormat("{\n" 1407 " some_code();\n" 1408 "test_label:;\n" 1409 " int i = 0;\n" 1410 "}"); 1411 } 1412 1413 //===----------------------------------------------------------------------===// 1414 // Tests for classes, namespaces, etc. 1415 //===----------------------------------------------------------------------===// 1416 1417 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1418 verifyFormat("class A {};"); 1419 } 1420 1421 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1422 verifyFormat("class A {\n" 1423 "public:\n" 1424 "public: // comment\n" 1425 "protected:\n" 1426 "private:\n" 1427 " void f() {}\n" 1428 "};"); 1429 verifyFormat("export class A {\n" 1430 "public:\n" 1431 "public: // comment\n" 1432 "protected:\n" 1433 "private:\n" 1434 " void f() {}\n" 1435 "};"); 1436 verifyGoogleFormat("class A {\n" 1437 " public:\n" 1438 " protected:\n" 1439 " private:\n" 1440 " void f() {}\n" 1441 "};"); 1442 verifyGoogleFormat("export class A {\n" 1443 " public:\n" 1444 " protected:\n" 1445 " private:\n" 1446 " void f() {}\n" 1447 "};"); 1448 verifyFormat("class A {\n" 1449 "public slots:\n" 1450 " void f1() {}\n" 1451 "public Q_SLOTS:\n" 1452 " void f2() {}\n" 1453 "protected slots:\n" 1454 " void f3() {}\n" 1455 "protected Q_SLOTS:\n" 1456 " void f4() {}\n" 1457 "private slots:\n" 1458 " void f5() {}\n" 1459 "private Q_SLOTS:\n" 1460 " void f6() {}\n" 1461 "signals:\n" 1462 " void g1();\n" 1463 "Q_SIGNALS:\n" 1464 " void g2();\n" 1465 "};"); 1466 1467 // Don't interpret 'signals' the wrong way. 1468 verifyFormat("signals.set();"); 1469 verifyFormat("for (Signals signals : f()) {\n}"); 1470 verifyFormat("{\n" 1471 " signals.set(); // This needs indentation.\n" 1472 "}"); 1473 verifyFormat("void f() {\n" 1474 "label:\n" 1475 " signals.baz();\n" 1476 "}"); 1477 } 1478 1479 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1480 EXPECT_EQ("class A {\n" 1481 "public:\n" 1482 " void f();\n" 1483 "\n" 1484 "private:\n" 1485 " void g() {}\n" 1486 " // test\n" 1487 "protected:\n" 1488 " int h;\n" 1489 "};", 1490 format("class A {\n" 1491 "public:\n" 1492 "void f();\n" 1493 "private:\n" 1494 "void g() {}\n" 1495 "// test\n" 1496 "protected:\n" 1497 "int h;\n" 1498 "};")); 1499 EXPECT_EQ("class A {\n" 1500 "protected:\n" 1501 "public:\n" 1502 " void f();\n" 1503 "};", 1504 format("class A {\n" 1505 "protected:\n" 1506 "\n" 1507 "public:\n" 1508 "\n" 1509 " void f();\n" 1510 "};")); 1511 1512 // Even ensure proper spacing inside macros. 1513 EXPECT_EQ("#define B \\\n" 1514 " class A { \\\n" 1515 " protected: \\\n" 1516 " public: \\\n" 1517 " void f(); \\\n" 1518 " };", 1519 format("#define B \\\n" 1520 " class A { \\\n" 1521 " protected: \\\n" 1522 " \\\n" 1523 " public: \\\n" 1524 " \\\n" 1525 " void f(); \\\n" 1526 " };", 1527 getGoogleStyle())); 1528 // But don't remove empty lines after macros ending in access specifiers. 1529 EXPECT_EQ("#define A private:\n" 1530 "\n" 1531 "int i;", 1532 format("#define A private:\n" 1533 "\n" 1534 "int i;")); 1535 } 1536 1537 TEST_F(FormatTest, FormatsClasses) { 1538 verifyFormat("class A : public B {};"); 1539 verifyFormat("class A : public ::B {};"); 1540 1541 verifyFormat( 1542 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1543 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1544 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1545 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1546 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1547 verifyFormat( 1548 "class A : public B, public C, public D, public E, public F {};"); 1549 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1550 " public C,\n" 1551 " public D,\n" 1552 " public E,\n" 1553 " public F,\n" 1554 " public G {};"); 1555 1556 verifyFormat("class\n" 1557 " ReallyReallyLongClassName {\n" 1558 " int i;\n" 1559 "};", 1560 getLLVMStyleWithColumns(32)); 1561 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1562 " aaaaaaaaaaaaaaaa> {};"); 1563 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1564 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1565 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1566 verifyFormat("template <class R, class C>\n" 1567 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1568 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1569 verifyFormat("class ::A::B {};"); 1570 } 1571 1572 TEST_F(FormatTest, BreakInheritanceStyle) { 1573 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1574 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1575 FormatStyle::BILS_BeforeComma; 1576 verifyFormat("class MyClass : public X {};", 1577 StyleWithInheritanceBreakBeforeComma); 1578 verifyFormat("class MyClass\n" 1579 " : public X\n" 1580 " , public Y {};", 1581 StyleWithInheritanceBreakBeforeComma); 1582 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1583 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1584 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1585 StyleWithInheritanceBreakBeforeComma); 1586 verifyFormat("struct aaaaaaaaaaaaa\n" 1587 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1588 " aaaaaaaaaaaaaaaa> {};", 1589 StyleWithInheritanceBreakBeforeComma); 1590 1591 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1592 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1593 FormatStyle::BILS_AfterColon; 1594 verifyFormat("class MyClass : public X {};", 1595 StyleWithInheritanceBreakAfterColon); 1596 verifyFormat("class MyClass : public X, public Y {};", 1597 StyleWithInheritanceBreakAfterColon); 1598 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1599 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1600 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1601 StyleWithInheritanceBreakAfterColon); 1602 verifyFormat("struct aaaaaaaaaaaaa :\n" 1603 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1604 " aaaaaaaaaaaaaaaa> {};", 1605 StyleWithInheritanceBreakAfterColon); 1606 } 1607 1608 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1609 verifyFormat("class A {\n} a, b;"); 1610 verifyFormat("struct A {\n} a, b;"); 1611 verifyFormat("union A {\n} a;"); 1612 } 1613 1614 TEST_F(FormatTest, FormatsEnum) { 1615 verifyFormat("enum {\n" 1616 " Zero,\n" 1617 " One = 1,\n" 1618 " Two = One + 1,\n" 1619 " Three = (One + Two),\n" 1620 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1621 " Five = (One, Two, Three, Four, 5)\n" 1622 "};"); 1623 verifyGoogleFormat("enum {\n" 1624 " Zero,\n" 1625 " One = 1,\n" 1626 " Two = One + 1,\n" 1627 " Three = (One + Two),\n" 1628 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1629 " Five = (One, Two, Three, Four, 5)\n" 1630 "};"); 1631 verifyFormat("enum Enum {};"); 1632 verifyFormat("enum {};"); 1633 verifyFormat("enum X E {} d;"); 1634 verifyFormat("enum __attribute__((...)) E {} d;"); 1635 verifyFormat("enum __declspec__((...)) E {} d;"); 1636 verifyFormat("enum {\n" 1637 " Bar = Foo<int, int>::value\n" 1638 "};", 1639 getLLVMStyleWithColumns(30)); 1640 1641 verifyFormat("enum ShortEnum { A, B, C };"); 1642 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1643 1644 EXPECT_EQ("enum KeepEmptyLines {\n" 1645 " ONE,\n" 1646 "\n" 1647 " TWO,\n" 1648 "\n" 1649 " THREE\n" 1650 "}", 1651 format("enum KeepEmptyLines {\n" 1652 " ONE,\n" 1653 "\n" 1654 " TWO,\n" 1655 "\n" 1656 "\n" 1657 " THREE\n" 1658 "}")); 1659 verifyFormat("enum E { // comment\n" 1660 " ONE,\n" 1661 " TWO\n" 1662 "};\n" 1663 "int i;"); 1664 // Not enums. 1665 verifyFormat("enum X f() {\n" 1666 " a();\n" 1667 " return 42;\n" 1668 "}"); 1669 verifyFormat("enum X Type::f() {\n" 1670 " a();\n" 1671 " return 42;\n" 1672 "}"); 1673 verifyFormat("enum ::X f() {\n" 1674 " a();\n" 1675 " return 42;\n" 1676 "}"); 1677 verifyFormat("enum ns::X f() {\n" 1678 " a();\n" 1679 " return 42;\n" 1680 "}"); 1681 } 1682 1683 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1684 verifyFormat("enum Type {\n" 1685 " One = 0; // These semicolons should be commas.\n" 1686 " Two = 1;\n" 1687 "};"); 1688 verifyFormat("namespace n {\n" 1689 "enum Type {\n" 1690 " One,\n" 1691 " Two, // missing };\n" 1692 " int i;\n" 1693 "}\n" 1694 "void g() {}"); 1695 } 1696 1697 TEST_F(FormatTest, FormatsEnumStruct) { 1698 verifyFormat("enum struct {\n" 1699 " Zero,\n" 1700 " One = 1,\n" 1701 " Two = One + 1,\n" 1702 " Three = (One + Two),\n" 1703 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1704 " Five = (One, Two, Three, Four, 5)\n" 1705 "};"); 1706 verifyFormat("enum struct Enum {};"); 1707 verifyFormat("enum struct {};"); 1708 verifyFormat("enum struct X E {} d;"); 1709 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1710 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1711 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1712 } 1713 1714 TEST_F(FormatTest, FormatsEnumClass) { 1715 verifyFormat("enum class {\n" 1716 " Zero,\n" 1717 " One = 1,\n" 1718 " Two = One + 1,\n" 1719 " Three = (One + Two),\n" 1720 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1721 " Five = (One, Two, Three, Four, 5)\n" 1722 "};"); 1723 verifyFormat("enum class Enum {};"); 1724 verifyFormat("enum class {};"); 1725 verifyFormat("enum class X E {} d;"); 1726 verifyFormat("enum class __attribute__((...)) E {} d;"); 1727 verifyFormat("enum class __declspec__((...)) E {} d;"); 1728 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1729 } 1730 1731 TEST_F(FormatTest, FormatsEnumTypes) { 1732 verifyFormat("enum X : int {\n" 1733 " A, // Force multiple lines.\n" 1734 " B\n" 1735 "};"); 1736 verifyFormat("enum X : int { A, B };"); 1737 verifyFormat("enum X : std::uint32_t { A, B };"); 1738 } 1739 1740 TEST_F(FormatTest, FormatsTypedefEnum) { 1741 FormatStyle Style = getLLVMStyle(); 1742 Style.ColumnLimit = 40; 1743 verifyFormat("typedef enum {} EmptyEnum;"); 1744 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1745 verifyFormat("typedef enum {\n" 1746 " ZERO = 0,\n" 1747 " ONE = 1,\n" 1748 " TWO = 2,\n" 1749 " THREE = 3\n" 1750 "} LongEnum;", 1751 Style); 1752 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1753 Style.BraceWrapping.AfterEnum = true; 1754 verifyFormat("typedef enum {} EmptyEnum;"); 1755 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1756 verifyFormat("typedef enum\n" 1757 "{\n" 1758 " ZERO = 0,\n" 1759 " ONE = 1,\n" 1760 " TWO = 2,\n" 1761 " THREE = 3\n" 1762 "} LongEnum;", 1763 Style); 1764 } 1765 1766 TEST_F(FormatTest, FormatsNSEnums) { 1767 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1768 verifyGoogleFormat( 1769 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1770 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 1771 " // Information about someDecentlyLongValue.\n" 1772 " someDecentlyLongValue,\n" 1773 " // Information about anotherDecentlyLongValue.\n" 1774 " anotherDecentlyLongValue,\n" 1775 " // Information about aThirdDecentlyLongValue.\n" 1776 " aThirdDecentlyLongValue\n" 1777 "};"); 1778 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 1779 " // Information about someDecentlyLongValue.\n" 1780 " someDecentlyLongValue,\n" 1781 " // Information about anotherDecentlyLongValue.\n" 1782 " anotherDecentlyLongValue,\n" 1783 " // Information about aThirdDecentlyLongValue.\n" 1784 " aThirdDecentlyLongValue\n" 1785 "};"); 1786 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 1787 " a = 1,\n" 1788 " b = 2,\n" 1789 " c = 3,\n" 1790 "};"); 1791 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 1792 " a = 1,\n" 1793 " b = 2,\n" 1794 " c = 3,\n" 1795 "};"); 1796 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 1797 " a = 1,\n" 1798 " b = 2,\n" 1799 " c = 3,\n" 1800 "};"); 1801 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 1802 " a = 1,\n" 1803 " b = 2,\n" 1804 " c = 3,\n" 1805 "};"); 1806 } 1807 1808 TEST_F(FormatTest, FormatsBitfields) { 1809 verifyFormat("struct Bitfields {\n" 1810 " unsigned sClass : 8;\n" 1811 " unsigned ValueKind : 2;\n" 1812 "};"); 1813 verifyFormat("struct A {\n" 1814 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 1815 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 1816 "};"); 1817 verifyFormat("struct MyStruct {\n" 1818 " uchar data;\n" 1819 " uchar : 8;\n" 1820 " uchar : 8;\n" 1821 " uchar other;\n" 1822 "};"); 1823 } 1824 1825 TEST_F(FormatTest, FormatsNamespaces) { 1826 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 1827 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 1828 1829 verifyFormat("namespace some_namespace {\n" 1830 "class A {};\n" 1831 "void f() { f(); }\n" 1832 "}", 1833 LLVMWithNoNamespaceFix); 1834 verifyFormat("namespace N::inline D {\n" 1835 "class A {};\n" 1836 "void f() { f(); }\n" 1837 "}", 1838 LLVMWithNoNamespaceFix); 1839 verifyFormat("namespace N::inline D::E {\n" 1840 "class A {};\n" 1841 "void f() { f(); }\n" 1842 "}", 1843 LLVMWithNoNamespaceFix); 1844 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 1845 "class A {};\n" 1846 "void f() { f(); }\n" 1847 "}", 1848 LLVMWithNoNamespaceFix); 1849 verifyFormat("/* something */ namespace some_namespace {\n" 1850 "class A {};\n" 1851 "void f() { f(); }\n" 1852 "}", 1853 LLVMWithNoNamespaceFix); 1854 verifyFormat("namespace {\n" 1855 "class A {};\n" 1856 "void f() { f(); }\n" 1857 "}", 1858 LLVMWithNoNamespaceFix); 1859 verifyFormat("/* something */ namespace {\n" 1860 "class A {};\n" 1861 "void f() { f(); }\n" 1862 "}", 1863 LLVMWithNoNamespaceFix); 1864 verifyFormat("inline namespace X {\n" 1865 "class A {};\n" 1866 "void f() { f(); }\n" 1867 "}", 1868 LLVMWithNoNamespaceFix); 1869 verifyFormat("/* something */ inline namespace X {\n" 1870 "class A {};\n" 1871 "void f() { f(); }\n" 1872 "}", 1873 LLVMWithNoNamespaceFix); 1874 verifyFormat("export namespace X {\n" 1875 "class A {};\n" 1876 "void f() { f(); }\n" 1877 "}", 1878 LLVMWithNoNamespaceFix); 1879 verifyFormat("using namespace some_namespace;\n" 1880 "class A {};\n" 1881 "void f() { f(); }", 1882 LLVMWithNoNamespaceFix); 1883 1884 // This code is more common than we thought; if we 1885 // layout this correctly the semicolon will go into 1886 // its own line, which is undesirable. 1887 verifyFormat("namespace {};", 1888 LLVMWithNoNamespaceFix); 1889 verifyFormat("namespace {\n" 1890 "class A {};\n" 1891 "};", 1892 LLVMWithNoNamespaceFix); 1893 1894 verifyFormat("namespace {\n" 1895 "int SomeVariable = 0; // comment\n" 1896 "} // namespace", 1897 LLVMWithNoNamespaceFix); 1898 EXPECT_EQ("#ifndef HEADER_GUARD\n" 1899 "#define HEADER_GUARD\n" 1900 "namespace my_namespace {\n" 1901 "int i;\n" 1902 "} // my_namespace\n" 1903 "#endif // HEADER_GUARD", 1904 format("#ifndef HEADER_GUARD\n" 1905 " #define HEADER_GUARD\n" 1906 " namespace my_namespace {\n" 1907 "int i;\n" 1908 "} // my_namespace\n" 1909 "#endif // HEADER_GUARD", 1910 LLVMWithNoNamespaceFix)); 1911 1912 EXPECT_EQ("namespace A::B {\n" 1913 "class C {};\n" 1914 "}", 1915 format("namespace A::B {\n" 1916 "class C {};\n" 1917 "}", 1918 LLVMWithNoNamespaceFix)); 1919 1920 FormatStyle Style = getLLVMStyle(); 1921 Style.NamespaceIndentation = FormatStyle::NI_All; 1922 EXPECT_EQ("namespace out {\n" 1923 " int i;\n" 1924 " namespace in {\n" 1925 " int i;\n" 1926 " } // namespace in\n" 1927 "} // namespace out", 1928 format("namespace out {\n" 1929 "int i;\n" 1930 "namespace in {\n" 1931 "int i;\n" 1932 "} // namespace in\n" 1933 "} // namespace out", 1934 Style)); 1935 1936 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1937 EXPECT_EQ("namespace out {\n" 1938 "int i;\n" 1939 "namespace in {\n" 1940 " int i;\n" 1941 "} // namespace in\n" 1942 "} // namespace out", 1943 format("namespace out {\n" 1944 "int i;\n" 1945 "namespace in {\n" 1946 "int i;\n" 1947 "} // namespace in\n" 1948 "} // namespace out", 1949 Style)); 1950 } 1951 1952 TEST_F(FormatTest, NamespaceMacros) { 1953 FormatStyle Style = getLLVMStyle(); 1954 Style.NamespaceMacros.push_back("TESTSUITE"); 1955 1956 verifyFormat("TESTSUITE(A) {\n" 1957 "int foo();\n" 1958 "} // TESTSUITE(A)", 1959 Style); 1960 1961 verifyFormat("TESTSUITE(A, B) {\n" 1962 "int foo();\n" 1963 "} // TESTSUITE(A)", 1964 Style); 1965 1966 // Properly indent according to NamespaceIndentation style 1967 Style.NamespaceIndentation = FormatStyle::NI_All; 1968 verifyFormat("TESTSUITE(A) {\n" 1969 " int foo();\n" 1970 "} // TESTSUITE(A)", 1971 Style); 1972 verifyFormat("TESTSUITE(A) {\n" 1973 " namespace B {\n" 1974 " int foo();\n" 1975 " } // namespace B\n" 1976 "} // TESTSUITE(A)", 1977 Style); 1978 verifyFormat("namespace A {\n" 1979 " TESTSUITE(B) {\n" 1980 " int foo();\n" 1981 " } // TESTSUITE(B)\n" 1982 "} // namespace A", 1983 Style); 1984 1985 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1986 verifyFormat("TESTSUITE(A) {\n" 1987 "TESTSUITE(B) {\n" 1988 " int foo();\n" 1989 "} // TESTSUITE(B)\n" 1990 "} // TESTSUITE(A)", 1991 Style); 1992 verifyFormat("TESTSUITE(A) {\n" 1993 "namespace B {\n" 1994 " int foo();\n" 1995 "} // namespace B\n" 1996 "} // TESTSUITE(A)", 1997 Style); 1998 verifyFormat("namespace A {\n" 1999 "TESTSUITE(B) {\n" 2000 " int foo();\n" 2001 "} // TESTSUITE(B)\n" 2002 "} // namespace A", 2003 Style); 2004 2005 // Properly merge namespace-macros blocks in CompactNamespaces mode 2006 Style.NamespaceIndentation = FormatStyle::NI_None; 2007 Style.CompactNamespaces = true; 2008 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2009 "}} // TESTSUITE(A::B)", 2010 Style); 2011 2012 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2013 "}} // TESTSUITE(out::in)", 2014 format("TESTSUITE(out) {\n" 2015 "TESTSUITE(in) {\n" 2016 "} // TESTSUITE(in)\n" 2017 "} // TESTSUITE(out)", 2018 Style)); 2019 2020 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2021 "}} // TESTSUITE(out::in)", 2022 format("TESTSUITE(out) {\n" 2023 "TESTSUITE(in) {\n" 2024 "} // TESTSUITE(in)\n" 2025 "} // TESTSUITE(out)", 2026 Style)); 2027 2028 // Do not merge different namespaces/macros 2029 EXPECT_EQ("namespace out {\n" 2030 "TESTSUITE(in) {\n" 2031 "} // TESTSUITE(in)\n" 2032 "} // namespace out", 2033 format("namespace out {\n" 2034 "TESTSUITE(in) {\n" 2035 "} // TESTSUITE(in)\n" 2036 "} // namespace out", 2037 Style)); 2038 EXPECT_EQ("TESTSUITE(out) {\n" 2039 "namespace in {\n" 2040 "} // namespace in\n" 2041 "} // TESTSUITE(out)", 2042 format("TESTSUITE(out) {\n" 2043 "namespace in {\n" 2044 "} // namespace in\n" 2045 "} // TESTSUITE(out)", 2046 Style)); 2047 Style.NamespaceMacros.push_back("FOOBAR"); 2048 EXPECT_EQ("TESTSUITE(out) {\n" 2049 "FOOBAR(in) {\n" 2050 "} // FOOBAR(in)\n" 2051 "} // TESTSUITE(out)", 2052 format("TESTSUITE(out) {\n" 2053 "FOOBAR(in) {\n" 2054 "} // FOOBAR(in)\n" 2055 "} // TESTSUITE(out)", 2056 Style)); 2057 } 2058 2059 TEST_F(FormatTest, FormatsCompactNamespaces) { 2060 FormatStyle Style = getLLVMStyle(); 2061 Style.CompactNamespaces = true; 2062 Style.NamespaceMacros.push_back("TESTSUITE"); 2063 2064 verifyFormat("namespace A { namespace B {\n" 2065 "}} // namespace A::B", 2066 Style); 2067 2068 EXPECT_EQ("namespace out { namespace in {\n" 2069 "}} // namespace out::in", 2070 format("namespace out {\n" 2071 "namespace in {\n" 2072 "} // namespace in\n" 2073 "} // namespace out", 2074 Style)); 2075 2076 // Only namespaces which have both consecutive opening and end get compacted 2077 EXPECT_EQ("namespace out {\n" 2078 "namespace in1 {\n" 2079 "} // namespace in1\n" 2080 "namespace in2 {\n" 2081 "} // namespace in2\n" 2082 "} // namespace out", 2083 format("namespace out {\n" 2084 "namespace in1 {\n" 2085 "} // namespace in1\n" 2086 "namespace in2 {\n" 2087 "} // namespace in2\n" 2088 "} // namespace out", 2089 Style)); 2090 2091 EXPECT_EQ("namespace out {\n" 2092 "int i;\n" 2093 "namespace in {\n" 2094 "int j;\n" 2095 "} // namespace in\n" 2096 "int k;\n" 2097 "} // namespace out", 2098 format("namespace out { int i;\n" 2099 "namespace in { int j; } // namespace in\n" 2100 "int k; } // namespace out", 2101 Style)); 2102 2103 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2104 "}}} // namespace A::B::C\n", 2105 format("namespace A { namespace B {\n" 2106 "namespace C {\n" 2107 "}} // namespace B::C\n" 2108 "} // namespace A\n", 2109 Style)); 2110 2111 Style.ColumnLimit = 40; 2112 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2113 "namespace bbbbbbbbbb {\n" 2114 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2115 format("namespace aaaaaaaaaa {\n" 2116 "namespace bbbbbbbbbb {\n" 2117 "} // namespace bbbbbbbbbb\n" 2118 "} // namespace aaaaaaaaaa", 2119 Style)); 2120 2121 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2122 "namespace cccccc {\n" 2123 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2124 format("namespace aaaaaa {\n" 2125 "namespace bbbbbb {\n" 2126 "namespace cccccc {\n" 2127 "} // namespace cccccc\n" 2128 "} // namespace bbbbbb\n" 2129 "} // namespace aaaaaa", 2130 Style)); 2131 Style.ColumnLimit = 80; 2132 2133 // Extra semicolon after 'inner' closing brace prevents merging 2134 EXPECT_EQ("namespace out { namespace in {\n" 2135 "}; } // namespace out::in", 2136 format("namespace out {\n" 2137 "namespace in {\n" 2138 "}; // namespace in\n" 2139 "} // namespace out", 2140 Style)); 2141 2142 // Extra semicolon after 'outer' closing brace is conserved 2143 EXPECT_EQ("namespace out { namespace in {\n" 2144 "}}; // namespace out::in", 2145 format("namespace out {\n" 2146 "namespace in {\n" 2147 "} // namespace in\n" 2148 "}; // namespace out", 2149 Style)); 2150 2151 Style.NamespaceIndentation = FormatStyle::NI_All; 2152 EXPECT_EQ("namespace out { namespace in {\n" 2153 " int i;\n" 2154 "}} // namespace out::in", 2155 format("namespace out {\n" 2156 "namespace in {\n" 2157 "int i;\n" 2158 "} // namespace in\n" 2159 "} // namespace out", 2160 Style)); 2161 EXPECT_EQ("namespace out { namespace mid {\n" 2162 " namespace in {\n" 2163 " int j;\n" 2164 " } // namespace in\n" 2165 " int k;\n" 2166 "}} // namespace out::mid", 2167 format("namespace out { namespace mid {\n" 2168 "namespace in { int j; } // namespace in\n" 2169 "int k; }} // namespace out::mid", 2170 Style)); 2171 2172 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2173 EXPECT_EQ("namespace out { namespace in {\n" 2174 " int i;\n" 2175 "}} // namespace out::in", 2176 format("namespace out {\n" 2177 "namespace in {\n" 2178 "int i;\n" 2179 "} // namespace in\n" 2180 "} // namespace out", 2181 Style)); 2182 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2183 " int i;\n" 2184 "}}} // namespace out::mid::in", 2185 format("namespace out {\n" 2186 "namespace mid {\n" 2187 "namespace in {\n" 2188 "int i;\n" 2189 "} // namespace in\n" 2190 "} // namespace mid\n" 2191 "} // namespace out", 2192 Style)); 2193 } 2194 2195 TEST_F(FormatTest, FormatsExternC) { 2196 verifyFormat("extern \"C\" {\nint a;"); 2197 verifyFormat("extern \"C\" {}"); 2198 verifyFormat("extern \"C\" {\n" 2199 "int foo();\n" 2200 "}"); 2201 verifyFormat("extern \"C\" int foo() {}"); 2202 verifyFormat("extern \"C\" int foo();"); 2203 verifyFormat("extern \"C\" int foo() {\n" 2204 " int i = 42;\n" 2205 " return i;\n" 2206 "}"); 2207 2208 FormatStyle Style = getLLVMStyle(); 2209 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2210 Style.BraceWrapping.AfterFunction = true; 2211 verifyFormat("extern \"C\" int foo() {}", Style); 2212 verifyFormat("extern \"C\" int foo();", Style); 2213 verifyFormat("extern \"C\" int foo()\n" 2214 "{\n" 2215 " int i = 42;\n" 2216 " return i;\n" 2217 "}", 2218 Style); 2219 2220 Style.BraceWrapping.AfterExternBlock = true; 2221 Style.BraceWrapping.SplitEmptyRecord = false; 2222 verifyFormat("extern \"C\"\n" 2223 "{}", 2224 Style); 2225 verifyFormat("extern \"C\"\n" 2226 "{\n" 2227 " int foo();\n" 2228 "}", 2229 Style); 2230 } 2231 2232 TEST_F(FormatTest, FormatsInlineASM) { 2233 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2234 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2235 verifyFormat( 2236 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2237 " \"cpuid\\n\\t\"\n" 2238 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2239 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2240 " : \"a\"(value));"); 2241 EXPECT_EQ( 2242 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2243 " __asm {\n" 2244 " mov edx,[that] // vtable in edx\n" 2245 " mov eax,methodIndex\n" 2246 " call [edx][eax*4] // stdcall\n" 2247 " }\n" 2248 "}", 2249 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2250 " __asm {\n" 2251 " mov edx,[that] // vtable in edx\n" 2252 " mov eax,methodIndex\n" 2253 " call [edx][eax*4] // stdcall\n" 2254 " }\n" 2255 "}")); 2256 EXPECT_EQ("_asm {\n" 2257 " xor eax, eax;\n" 2258 " cpuid;\n" 2259 "}", 2260 format("_asm {\n" 2261 " xor eax, eax;\n" 2262 " cpuid;\n" 2263 "}")); 2264 verifyFormat("void function() {\n" 2265 " // comment\n" 2266 " asm(\"\");\n" 2267 "}"); 2268 EXPECT_EQ("__asm {\n" 2269 "}\n" 2270 "int i;", 2271 format("__asm {\n" 2272 "}\n" 2273 "int i;")); 2274 } 2275 2276 TEST_F(FormatTest, FormatTryCatch) { 2277 verifyFormat("try {\n" 2278 " throw a * b;\n" 2279 "} catch (int a) {\n" 2280 " // Do nothing.\n" 2281 "} catch (...) {\n" 2282 " exit(42);\n" 2283 "}"); 2284 2285 // Function-level try statements. 2286 verifyFormat("int f() try { return 4; } catch (...) {\n" 2287 " return 5;\n" 2288 "}"); 2289 verifyFormat("class A {\n" 2290 " int a;\n" 2291 " A() try : a(0) {\n" 2292 " } catch (...) {\n" 2293 " throw;\n" 2294 " }\n" 2295 "};\n"); 2296 2297 // Incomplete try-catch blocks. 2298 verifyIncompleteFormat("try {} catch ("); 2299 } 2300 2301 TEST_F(FormatTest, FormatSEHTryCatch) { 2302 verifyFormat("__try {\n" 2303 " int a = b * c;\n" 2304 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2305 " // Do nothing.\n" 2306 "}"); 2307 2308 verifyFormat("__try {\n" 2309 " int a = b * c;\n" 2310 "} __finally {\n" 2311 " // Do nothing.\n" 2312 "}"); 2313 2314 verifyFormat("DEBUG({\n" 2315 " __try {\n" 2316 " } __finally {\n" 2317 " }\n" 2318 "});\n"); 2319 } 2320 2321 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2322 verifyFormat("try {\n" 2323 " f();\n" 2324 "} catch {\n" 2325 " g();\n" 2326 "}"); 2327 verifyFormat("try {\n" 2328 " f();\n" 2329 "} catch (A a) MACRO(x) {\n" 2330 " g();\n" 2331 "} catch (B b) MACRO(x) {\n" 2332 " g();\n" 2333 "}"); 2334 } 2335 2336 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2337 FormatStyle Style = getLLVMStyle(); 2338 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2339 FormatStyle::BS_WebKit}) { 2340 Style.BreakBeforeBraces = BraceStyle; 2341 verifyFormat("try {\n" 2342 " // something\n" 2343 "} catch (...) {\n" 2344 " // something\n" 2345 "}", 2346 Style); 2347 } 2348 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2349 verifyFormat("try {\n" 2350 " // something\n" 2351 "}\n" 2352 "catch (...) {\n" 2353 " // something\n" 2354 "}", 2355 Style); 2356 verifyFormat("__try {\n" 2357 " // something\n" 2358 "}\n" 2359 "__finally {\n" 2360 " // something\n" 2361 "}", 2362 Style); 2363 verifyFormat("@try {\n" 2364 " // something\n" 2365 "}\n" 2366 "@finally {\n" 2367 " // something\n" 2368 "}", 2369 Style); 2370 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2371 verifyFormat("try\n" 2372 "{\n" 2373 " // something\n" 2374 "}\n" 2375 "catch (...)\n" 2376 "{\n" 2377 " // something\n" 2378 "}", 2379 Style); 2380 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2381 verifyFormat("try\n" 2382 " {\n" 2383 " // something\n" 2384 " }\n" 2385 "catch (...)\n" 2386 " {\n" 2387 " // something\n" 2388 " }", 2389 Style); 2390 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2391 Style.BraceWrapping.BeforeCatch = true; 2392 verifyFormat("try {\n" 2393 " // something\n" 2394 "}\n" 2395 "catch (...) {\n" 2396 " // something\n" 2397 "}", 2398 Style); 2399 } 2400 2401 TEST_F(FormatTest, StaticInitializers) { 2402 verifyFormat("static SomeClass SC = {1, 'a'};"); 2403 2404 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2405 " 100000000, " 2406 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2407 2408 // Here, everything other than the "}" would fit on a line. 2409 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2410 " 10000000000000000000000000};"); 2411 EXPECT_EQ("S s = {a,\n" 2412 "\n" 2413 " b};", 2414 format("S s = {\n" 2415 " a,\n" 2416 "\n" 2417 " b\n" 2418 "};")); 2419 2420 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2421 // line. However, the formatting looks a bit off and this probably doesn't 2422 // happen often in practice. 2423 verifyFormat("static int Variable[1] = {\n" 2424 " {1000000000000000000000000000000000000}};", 2425 getLLVMStyleWithColumns(40)); 2426 } 2427 2428 TEST_F(FormatTest, DesignatedInitializers) { 2429 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2430 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2431 " .bbbbbbbbbb = 2,\n" 2432 " .cccccccccc = 3,\n" 2433 " .dddddddddd = 4,\n" 2434 " .eeeeeeeeee = 5};"); 2435 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2436 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2437 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2438 " .ccccccccccccccccccccccccccc = 3,\n" 2439 " .ddddddddddddddddddddddddddd = 4,\n" 2440 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2441 2442 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2443 2444 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2445 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2446 " [2] = bbbbbbbbbb,\n" 2447 " [3] = cccccccccc,\n" 2448 " [4] = dddddddddd,\n" 2449 " [5] = eeeeeeeeee};"); 2450 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2451 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2452 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2453 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2454 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2455 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2456 } 2457 2458 TEST_F(FormatTest, NestedStaticInitializers) { 2459 verifyFormat("static A x = {{{}}};\n"); 2460 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2461 " {init1, init2, init3, init4}}};", 2462 getLLVMStyleWithColumns(50)); 2463 2464 verifyFormat("somes Status::global_reps[3] = {\n" 2465 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2466 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2467 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2468 getLLVMStyleWithColumns(60)); 2469 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2470 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2471 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2472 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2473 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2474 " {rect.fRight - rect.fLeft, rect.fBottom - " 2475 "rect.fTop}};"); 2476 2477 verifyFormat( 2478 "SomeArrayOfSomeType a = {\n" 2479 " {{1, 2, 3},\n" 2480 " {1, 2, 3},\n" 2481 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2482 " 333333333333333333333333333333},\n" 2483 " {1, 2, 3},\n" 2484 " {1, 2, 3}}};"); 2485 verifyFormat( 2486 "SomeArrayOfSomeType a = {\n" 2487 " {{1, 2, 3}},\n" 2488 " {{1, 2, 3}},\n" 2489 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2490 " 333333333333333333333333333333}},\n" 2491 " {{1, 2, 3}},\n" 2492 " {{1, 2, 3}}};"); 2493 2494 verifyFormat("struct {\n" 2495 " unsigned bit;\n" 2496 " const char *const name;\n" 2497 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2498 " {kOsWin, \"Windows\"},\n" 2499 " {kOsLinux, \"Linux\"},\n" 2500 " {kOsCrOS, \"Chrome OS\"}};"); 2501 verifyFormat("struct {\n" 2502 " unsigned bit;\n" 2503 " const char *const name;\n" 2504 "} kBitsToOs[] = {\n" 2505 " {kOsMac, \"Mac\"},\n" 2506 " {kOsWin, \"Windows\"},\n" 2507 " {kOsLinux, \"Linux\"},\n" 2508 " {kOsCrOS, \"Chrome OS\"},\n" 2509 "};"); 2510 } 2511 2512 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2513 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2514 " \\\n" 2515 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2516 } 2517 2518 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2519 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2520 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2521 2522 // Do break defaulted and deleted functions. 2523 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2524 " default;", 2525 getLLVMStyleWithColumns(40)); 2526 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2527 " delete;", 2528 getLLVMStyleWithColumns(40)); 2529 } 2530 2531 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2532 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2533 getLLVMStyleWithColumns(40)); 2534 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2535 getLLVMStyleWithColumns(40)); 2536 EXPECT_EQ("#define Q \\\n" 2537 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2538 " \"aaaaaaaa.cpp\"", 2539 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2540 getLLVMStyleWithColumns(40))); 2541 } 2542 2543 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2544 EXPECT_EQ("# 123 \"A string literal\"", 2545 format(" # 123 \"A string literal\"")); 2546 } 2547 2548 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2549 EXPECT_EQ("#;", format("#;")); 2550 verifyFormat("#\n;\n;\n;"); 2551 } 2552 2553 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2554 EXPECT_EQ("#line 42 \"test\"\n", 2555 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2556 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2557 getLLVMStyleWithColumns(12))); 2558 } 2559 2560 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2561 EXPECT_EQ("#line 42 \"test\"", 2562 format("# \\\n line \\\n 42 \\\n \"test\"")); 2563 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2564 } 2565 2566 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2567 verifyFormat("#define A \\x20"); 2568 verifyFormat("#define A \\ x20"); 2569 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2570 verifyFormat("#define A ''"); 2571 verifyFormat("#define A ''qqq"); 2572 verifyFormat("#define A `qqq"); 2573 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2574 EXPECT_EQ("const char *c = STRINGIFY(\n" 2575 "\\na : b);", 2576 format("const char * c = STRINGIFY(\n" 2577 "\\na : b);")); 2578 2579 verifyFormat("a\r\\"); 2580 verifyFormat("a\v\\"); 2581 verifyFormat("a\f\\"); 2582 } 2583 2584 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2585 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2586 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2587 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2588 // FIXME: We never break before the macro name. 2589 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2590 2591 verifyFormat("#define A A\n#define A A"); 2592 verifyFormat("#define A(X) A\n#define A A"); 2593 2594 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2595 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2596 } 2597 2598 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2599 EXPECT_EQ("// somecomment\n" 2600 "#include \"a.h\"\n" 2601 "#define A( \\\n" 2602 " A, B)\n" 2603 "#include \"b.h\"\n" 2604 "// somecomment\n", 2605 format(" // somecomment\n" 2606 " #include \"a.h\"\n" 2607 "#define A(A,\\\n" 2608 " B)\n" 2609 " #include \"b.h\"\n" 2610 " // somecomment\n", 2611 getLLVMStyleWithColumns(13))); 2612 } 2613 2614 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2615 2616 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2617 EXPECT_EQ("#define A \\\n" 2618 " c; \\\n" 2619 " e;\n" 2620 "f;", 2621 format("#define A c; e;\n" 2622 "f;", 2623 getLLVMStyleWithColumns(14))); 2624 } 2625 2626 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2627 2628 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2629 EXPECT_EQ("int x,\n" 2630 "#define A\n" 2631 " y;", 2632 format("int x,\n#define A\ny;")); 2633 } 2634 2635 TEST_F(FormatTest, HashInMacroDefinition) { 2636 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2637 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2638 verifyFormat("#define A \\\n" 2639 " { \\\n" 2640 " f(#c); \\\n" 2641 " }", 2642 getLLVMStyleWithColumns(11)); 2643 2644 verifyFormat("#define A(X) \\\n" 2645 " void function##X()", 2646 getLLVMStyleWithColumns(22)); 2647 2648 verifyFormat("#define A(a, b, c) \\\n" 2649 " void a##b##c()", 2650 getLLVMStyleWithColumns(22)); 2651 2652 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2653 } 2654 2655 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2656 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2657 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2658 2659 FormatStyle Style = getLLVMStyle(); 2660 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2661 verifyFormat("#define true ((foo)1)", Style); 2662 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2663 verifyFormat("#define false((foo)0)", Style); 2664 } 2665 2666 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2667 EXPECT_EQ("#define A b;", format("#define A \\\n" 2668 " \\\n" 2669 " b;", 2670 getLLVMStyleWithColumns(25))); 2671 EXPECT_EQ("#define A \\\n" 2672 " \\\n" 2673 " a; \\\n" 2674 " b;", 2675 format("#define A \\\n" 2676 " \\\n" 2677 " a; \\\n" 2678 " b;", 2679 getLLVMStyleWithColumns(11))); 2680 EXPECT_EQ("#define A \\\n" 2681 " a; \\\n" 2682 " \\\n" 2683 " b;", 2684 format("#define A \\\n" 2685 " a; \\\n" 2686 " \\\n" 2687 " b;", 2688 getLLVMStyleWithColumns(11))); 2689 } 2690 2691 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2692 verifyIncompleteFormat("#define A :"); 2693 verifyFormat("#define SOMECASES \\\n" 2694 " case 1: \\\n" 2695 " case 2\n", 2696 getLLVMStyleWithColumns(20)); 2697 verifyFormat("#define MACRO(a) \\\n" 2698 " if (a) \\\n" 2699 " f(); \\\n" 2700 " else \\\n" 2701 " g()", 2702 getLLVMStyleWithColumns(18)); 2703 verifyFormat("#define A template <typename T>"); 2704 verifyIncompleteFormat("#define STR(x) #x\n" 2705 "f(STR(this_is_a_string_literal{));"); 2706 verifyFormat("#pragma omp threadprivate( \\\n" 2707 " y)), // expected-warning", 2708 getLLVMStyleWithColumns(28)); 2709 verifyFormat("#d, = };"); 2710 verifyFormat("#if \"a"); 2711 verifyIncompleteFormat("({\n" 2712 "#define b \\\n" 2713 " } \\\n" 2714 " a\n" 2715 "a", 2716 getLLVMStyleWithColumns(15)); 2717 verifyFormat("#define A \\\n" 2718 " { \\\n" 2719 " {\n" 2720 "#define B \\\n" 2721 " } \\\n" 2722 " }", 2723 getLLVMStyleWithColumns(15)); 2724 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 2725 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 2726 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 2727 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 2728 } 2729 2730 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 2731 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 2732 EXPECT_EQ("class A : public QObject {\n" 2733 " Q_OBJECT\n" 2734 "\n" 2735 " A() {}\n" 2736 "};", 2737 format("class A : public QObject {\n" 2738 " Q_OBJECT\n" 2739 "\n" 2740 " A() {\n}\n" 2741 "} ;")); 2742 EXPECT_EQ("MACRO\n" 2743 "/*static*/ int i;", 2744 format("MACRO\n" 2745 " /*static*/ int i;")); 2746 EXPECT_EQ("SOME_MACRO\n" 2747 "namespace {\n" 2748 "void f();\n" 2749 "} // namespace", 2750 format("SOME_MACRO\n" 2751 " namespace {\n" 2752 "void f( );\n" 2753 "} // namespace")); 2754 // Only if the identifier contains at least 5 characters. 2755 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 2756 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 2757 // Only if everything is upper case. 2758 EXPECT_EQ("class A : public QObject {\n" 2759 " Q_Object A() {}\n" 2760 "};", 2761 format("class A : public QObject {\n" 2762 " Q_Object\n" 2763 " A() {\n}\n" 2764 "} ;")); 2765 2766 // Only if the next line can actually start an unwrapped line. 2767 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 2768 format("SOME_WEIRD_LOG_MACRO\n" 2769 "<< SomeThing;")); 2770 2771 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 2772 "(n, buffers))\n", 2773 getChromiumStyle(FormatStyle::LK_Cpp)); 2774 2775 // See PR41483 2776 EXPECT_EQ("/**/ FOO(a)\n" 2777 "FOO(b)", 2778 format("/**/ FOO(a)\n" 2779 "FOO(b)")); 2780 } 2781 2782 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 2783 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2784 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2785 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2786 "class X {};\n" 2787 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2788 "int *createScopDetectionPass() { return 0; }", 2789 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2790 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2791 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2792 " class X {};\n" 2793 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2794 " int *createScopDetectionPass() { return 0; }")); 2795 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 2796 // braces, so that inner block is indented one level more. 2797 EXPECT_EQ("int q() {\n" 2798 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2799 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2800 " IPC_END_MESSAGE_MAP()\n" 2801 "}", 2802 format("int q() {\n" 2803 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2804 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2805 " IPC_END_MESSAGE_MAP()\n" 2806 "}")); 2807 2808 // Same inside macros. 2809 EXPECT_EQ("#define LIST(L) \\\n" 2810 " L(A) \\\n" 2811 " L(B) \\\n" 2812 " L(C)", 2813 format("#define LIST(L) \\\n" 2814 " L(A) \\\n" 2815 " L(B) \\\n" 2816 " L(C)", 2817 getGoogleStyle())); 2818 2819 // These must not be recognized as macros. 2820 EXPECT_EQ("int q() {\n" 2821 " f(x);\n" 2822 " f(x) {}\n" 2823 " f(x)->g();\n" 2824 " f(x)->*g();\n" 2825 " f(x).g();\n" 2826 " f(x) = x;\n" 2827 " f(x) += x;\n" 2828 " f(x) -= x;\n" 2829 " f(x) *= x;\n" 2830 " f(x) /= x;\n" 2831 " f(x) %= x;\n" 2832 " f(x) &= x;\n" 2833 " f(x) |= x;\n" 2834 " f(x) ^= x;\n" 2835 " f(x) >>= x;\n" 2836 " f(x) <<= x;\n" 2837 " f(x)[y].z();\n" 2838 " LOG(INFO) << x;\n" 2839 " ifstream(x) >> x;\n" 2840 "}\n", 2841 format("int q() {\n" 2842 " f(x)\n;\n" 2843 " f(x)\n {}\n" 2844 " f(x)\n->g();\n" 2845 " f(x)\n->*g();\n" 2846 " f(x)\n.g();\n" 2847 " f(x)\n = x;\n" 2848 " f(x)\n += x;\n" 2849 " f(x)\n -= x;\n" 2850 " f(x)\n *= x;\n" 2851 " f(x)\n /= x;\n" 2852 " f(x)\n %= x;\n" 2853 " f(x)\n &= x;\n" 2854 " f(x)\n |= x;\n" 2855 " f(x)\n ^= x;\n" 2856 " f(x)\n >>= x;\n" 2857 " f(x)\n <<= x;\n" 2858 " f(x)\n[y].z();\n" 2859 " LOG(INFO)\n << x;\n" 2860 " ifstream(x)\n >> x;\n" 2861 "}\n")); 2862 EXPECT_EQ("int q() {\n" 2863 " F(x)\n" 2864 " if (1) {\n" 2865 " }\n" 2866 " F(x)\n" 2867 " while (1) {\n" 2868 " }\n" 2869 " F(x)\n" 2870 " G(x);\n" 2871 " F(x)\n" 2872 " try {\n" 2873 " Q();\n" 2874 " } catch (...) {\n" 2875 " }\n" 2876 "}\n", 2877 format("int q() {\n" 2878 "F(x)\n" 2879 "if (1) {}\n" 2880 "F(x)\n" 2881 "while (1) {}\n" 2882 "F(x)\n" 2883 "G(x);\n" 2884 "F(x)\n" 2885 "try { Q(); } catch (...) {}\n" 2886 "}\n")); 2887 EXPECT_EQ("class A {\n" 2888 " A() : t(0) {}\n" 2889 " A(int i) noexcept() : {}\n" 2890 " A(X x)\n" // FIXME: function-level try blocks are broken. 2891 " try : t(0) {\n" 2892 " } catch (...) {\n" 2893 " }\n" 2894 "};", 2895 format("class A {\n" 2896 " A()\n : t(0) {}\n" 2897 " A(int i)\n noexcept() : {}\n" 2898 " A(X x)\n" 2899 " try : t(0) {} catch (...) {}\n" 2900 "};")); 2901 FormatStyle Style = getLLVMStyle(); 2902 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2903 Style.BraceWrapping.AfterControlStatement = true; 2904 Style.BraceWrapping.AfterFunction = true; 2905 EXPECT_EQ("void f()\n" 2906 "try\n" 2907 "{\n" 2908 "}", 2909 format("void f() try {\n" 2910 "}", Style)); 2911 EXPECT_EQ("class SomeClass {\n" 2912 "public:\n" 2913 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2914 "};", 2915 format("class SomeClass {\n" 2916 "public:\n" 2917 " SomeClass()\n" 2918 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2919 "};")); 2920 EXPECT_EQ("class SomeClass {\n" 2921 "public:\n" 2922 " SomeClass()\n" 2923 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2924 "};", 2925 format("class SomeClass {\n" 2926 "public:\n" 2927 " SomeClass()\n" 2928 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2929 "};", 2930 getLLVMStyleWithColumns(40))); 2931 2932 verifyFormat("MACRO(>)"); 2933 2934 // Some macros contain an implicit semicolon. 2935 Style = getLLVMStyle(); 2936 Style.StatementMacros.push_back("FOO"); 2937 verifyFormat("FOO(a) int b = 0;"); 2938 verifyFormat("FOO(a)\n" 2939 "int b = 0;", 2940 Style); 2941 verifyFormat("FOO(a);\n" 2942 "int b = 0;", 2943 Style); 2944 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 2945 "int b = 0;", 2946 Style); 2947 verifyFormat("FOO()\n" 2948 "int b = 0;", 2949 Style); 2950 verifyFormat("FOO\n" 2951 "int b = 0;", 2952 Style); 2953 verifyFormat("void f() {\n" 2954 " FOO(a)\n" 2955 " return a;\n" 2956 "}", 2957 Style); 2958 verifyFormat("FOO(a)\n" 2959 "FOO(b)", 2960 Style); 2961 verifyFormat("int a = 0;\n" 2962 "FOO(b)\n" 2963 "int c = 0;", 2964 Style); 2965 verifyFormat("int a = 0;\n" 2966 "int x = FOO(a)\n" 2967 "int b = 0;", 2968 Style); 2969 verifyFormat("void foo(int a) { FOO(a) }\n" 2970 "uint32_t bar() {}", 2971 Style); 2972 } 2973 2974 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 2975 verifyFormat("#define A \\\n" 2976 " f({ \\\n" 2977 " g(); \\\n" 2978 " });", 2979 getLLVMStyleWithColumns(11)); 2980 } 2981 2982 TEST_F(FormatTest, IndentPreprocessorDirectives) { 2983 FormatStyle Style = getLLVMStyle(); 2984 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 2985 Style.ColumnLimit = 40; 2986 verifyFormat("#ifdef _WIN32\n" 2987 "#define A 0\n" 2988 "#ifdef VAR2\n" 2989 "#define B 1\n" 2990 "#include <someheader.h>\n" 2991 "#define MACRO \\\n" 2992 " some_very_long_func_aaaaaaaaaa();\n" 2993 "#endif\n" 2994 "#else\n" 2995 "#define A 1\n" 2996 "#endif", 2997 Style); 2998 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 2999 verifyFormat("#ifdef _WIN32\n" 3000 "# define A 0\n" 3001 "# ifdef VAR2\n" 3002 "# define B 1\n" 3003 "# include <someheader.h>\n" 3004 "# define MACRO \\\n" 3005 " some_very_long_func_aaaaaaaaaa();\n" 3006 "# endif\n" 3007 "#else\n" 3008 "# define A 1\n" 3009 "#endif", 3010 Style); 3011 verifyFormat("#if A\n" 3012 "# define MACRO \\\n" 3013 " void a(int x) { \\\n" 3014 " b(); \\\n" 3015 " c(); \\\n" 3016 " d(); \\\n" 3017 " e(); \\\n" 3018 " f(); \\\n" 3019 " }\n" 3020 "#endif", 3021 Style); 3022 // Comments before include guard. 3023 verifyFormat("// file comment\n" 3024 "// file comment\n" 3025 "#ifndef HEADER_H\n" 3026 "#define HEADER_H\n" 3027 "code();\n" 3028 "#endif", 3029 Style); 3030 // Test with include guards. 3031 verifyFormat("#ifndef HEADER_H\n" 3032 "#define HEADER_H\n" 3033 "code();\n" 3034 "#endif", 3035 Style); 3036 // Include guards must have a #define with the same variable immediately 3037 // after #ifndef. 3038 verifyFormat("#ifndef NOT_GUARD\n" 3039 "# define FOO\n" 3040 "code();\n" 3041 "#endif", 3042 Style); 3043 3044 // Include guards must cover the entire file. 3045 verifyFormat("code();\n" 3046 "code();\n" 3047 "#ifndef NOT_GUARD\n" 3048 "# define NOT_GUARD\n" 3049 "code();\n" 3050 "#endif", 3051 Style); 3052 verifyFormat("#ifndef NOT_GUARD\n" 3053 "# define NOT_GUARD\n" 3054 "code();\n" 3055 "#endif\n" 3056 "code();", 3057 Style); 3058 // Test with trailing blank lines. 3059 verifyFormat("#ifndef HEADER_H\n" 3060 "#define HEADER_H\n" 3061 "code();\n" 3062 "#endif\n", 3063 Style); 3064 // Include guards don't have #else. 3065 verifyFormat("#ifndef NOT_GUARD\n" 3066 "# define NOT_GUARD\n" 3067 "code();\n" 3068 "#else\n" 3069 "#endif", 3070 Style); 3071 verifyFormat("#ifndef NOT_GUARD\n" 3072 "# define NOT_GUARD\n" 3073 "code();\n" 3074 "#elif FOO\n" 3075 "#endif", 3076 Style); 3077 // Non-identifier #define after potential include guard. 3078 verifyFormat("#ifndef FOO\n" 3079 "# define 1\n" 3080 "#endif\n", 3081 Style); 3082 // #if closes past last non-preprocessor line. 3083 verifyFormat("#ifndef FOO\n" 3084 "#define FOO\n" 3085 "#if 1\n" 3086 "int i;\n" 3087 "# define A 0\n" 3088 "#endif\n" 3089 "#endif\n", 3090 Style); 3091 // Don't crash if there is an #elif directive without a condition. 3092 verifyFormat("#if 1\n" 3093 "int x;\n" 3094 "#elif\n" 3095 "int y;\n" 3096 "#else\n" 3097 "int z;\n" 3098 "#endif", 3099 Style); 3100 // FIXME: This doesn't handle the case where there's code between the 3101 // #ifndef and #define but all other conditions hold. This is because when 3102 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3103 // previous code line yet, so we can't detect it. 3104 EXPECT_EQ("#ifndef NOT_GUARD\n" 3105 "code();\n" 3106 "#define NOT_GUARD\n" 3107 "code();\n" 3108 "#endif", 3109 format("#ifndef NOT_GUARD\n" 3110 "code();\n" 3111 "# define NOT_GUARD\n" 3112 "code();\n" 3113 "#endif", 3114 Style)); 3115 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3116 // be outside an include guard. Examples are #pragma once and 3117 // #pragma GCC diagnostic, or anything else that does not change the meaning 3118 // of the file if it's included multiple times. 3119 EXPECT_EQ("#ifdef WIN32\n" 3120 "# pragma once\n" 3121 "#endif\n" 3122 "#ifndef HEADER_H\n" 3123 "# define HEADER_H\n" 3124 "code();\n" 3125 "#endif", 3126 format("#ifdef WIN32\n" 3127 "# pragma once\n" 3128 "#endif\n" 3129 "#ifndef HEADER_H\n" 3130 "#define HEADER_H\n" 3131 "code();\n" 3132 "#endif", 3133 Style)); 3134 // FIXME: This does not detect when there is a single non-preprocessor line 3135 // in front of an include-guard-like structure where other conditions hold 3136 // because ScopedLineState hides the line. 3137 EXPECT_EQ("code();\n" 3138 "#ifndef HEADER_H\n" 3139 "#define HEADER_H\n" 3140 "code();\n" 3141 "#endif", 3142 format("code();\n" 3143 "#ifndef HEADER_H\n" 3144 "# define HEADER_H\n" 3145 "code();\n" 3146 "#endif", 3147 Style)); 3148 // Keep comments aligned with #, otherwise indent comments normally. These 3149 // tests cannot use verifyFormat because messUp manipulates leading 3150 // whitespace. 3151 { 3152 const char *Expected = "" 3153 "void f() {\n" 3154 "#if 1\n" 3155 "// Preprocessor aligned.\n" 3156 "# define A 0\n" 3157 " // Code. Separated by blank line.\n" 3158 "\n" 3159 "# define B 0\n" 3160 " // Code. Not aligned with #\n" 3161 "# define C 0\n" 3162 "#endif"; 3163 const char *ToFormat = "" 3164 "void f() {\n" 3165 "#if 1\n" 3166 "// Preprocessor aligned.\n" 3167 "# define A 0\n" 3168 "// Code. Separated by blank line.\n" 3169 "\n" 3170 "# define B 0\n" 3171 " // Code. Not aligned with #\n" 3172 "# define C 0\n" 3173 "#endif"; 3174 EXPECT_EQ(Expected, format(ToFormat, Style)); 3175 EXPECT_EQ(Expected, format(Expected, Style)); 3176 } 3177 // Keep block quotes aligned. 3178 { 3179 const char *Expected = "" 3180 "void f() {\n" 3181 "#if 1\n" 3182 "/* Preprocessor aligned. */\n" 3183 "# define A 0\n" 3184 " /* Code. Separated by blank line. */\n" 3185 "\n" 3186 "# define B 0\n" 3187 " /* Code. Not aligned with # */\n" 3188 "# define C 0\n" 3189 "#endif"; 3190 const char *ToFormat = "" 3191 "void f() {\n" 3192 "#if 1\n" 3193 "/* Preprocessor aligned. */\n" 3194 "# define A 0\n" 3195 "/* Code. Separated by blank line. */\n" 3196 "\n" 3197 "# define B 0\n" 3198 " /* Code. Not aligned with # */\n" 3199 "# define C 0\n" 3200 "#endif"; 3201 EXPECT_EQ(Expected, format(ToFormat, Style)); 3202 EXPECT_EQ(Expected, format(Expected, Style)); 3203 } 3204 // Keep comments aligned with un-indented directives. 3205 { 3206 const char *Expected = "" 3207 "void f() {\n" 3208 "// Preprocessor aligned.\n" 3209 "#define A 0\n" 3210 " // Code. Separated by blank line.\n" 3211 "\n" 3212 "#define B 0\n" 3213 " // Code. Not aligned with #\n" 3214 "#define C 0\n"; 3215 const char *ToFormat = "" 3216 "void f() {\n" 3217 "// Preprocessor aligned.\n" 3218 "#define A 0\n" 3219 "// Code. Separated by blank line.\n" 3220 "\n" 3221 "#define B 0\n" 3222 " // Code. Not aligned with #\n" 3223 "#define C 0\n"; 3224 EXPECT_EQ(Expected, format(ToFormat, Style)); 3225 EXPECT_EQ(Expected, format(Expected, Style)); 3226 } 3227 // Test AfterHash with tabs. 3228 { 3229 FormatStyle Tabbed = Style; 3230 Tabbed.UseTab = FormatStyle::UT_Always; 3231 Tabbed.IndentWidth = 8; 3232 Tabbed.TabWidth = 8; 3233 verifyFormat("#ifdef _WIN32\n" 3234 "#\tdefine A 0\n" 3235 "#\tifdef VAR2\n" 3236 "#\t\tdefine B 1\n" 3237 "#\t\tinclude <someheader.h>\n" 3238 "#\t\tdefine MACRO \\\n" 3239 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3240 "#\tendif\n" 3241 "#else\n" 3242 "#\tdefine A 1\n" 3243 "#endif", 3244 Tabbed); 3245 } 3246 3247 // Regression test: Multiline-macro inside include guards. 3248 verifyFormat("#ifndef HEADER_H\n" 3249 "#define HEADER_H\n" 3250 "#define A() \\\n" 3251 " int i; \\\n" 3252 " int j;\n" 3253 "#endif // HEADER_H", 3254 getLLVMStyleWithColumns(20)); 3255 3256 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3257 // Basic before hash indent tests 3258 verifyFormat("#ifdef _WIN32\n" 3259 " #define A 0\n" 3260 " #ifdef VAR2\n" 3261 " #define B 1\n" 3262 " #include <someheader.h>\n" 3263 " #define MACRO \\\n" 3264 " some_very_long_func_aaaaaaaaaa();\n" 3265 " #endif\n" 3266 "#else\n" 3267 " #define A 1\n" 3268 "#endif", 3269 Style); 3270 verifyFormat("#if A\n" 3271 " #define MACRO \\\n" 3272 " void a(int x) { \\\n" 3273 " b(); \\\n" 3274 " c(); \\\n" 3275 " d(); \\\n" 3276 " e(); \\\n" 3277 " f(); \\\n" 3278 " }\n" 3279 "#endif", 3280 Style); 3281 // Keep comments aligned with indented directives. These 3282 // tests cannot use verifyFormat because messUp manipulates leading 3283 // whitespace. 3284 { 3285 const char *Expected = "void f() {\n" 3286 "// Aligned to preprocessor.\n" 3287 "#if 1\n" 3288 " // Aligned to code.\n" 3289 " int a;\n" 3290 " #if 1\n" 3291 " // Aligned to preprocessor.\n" 3292 " #define A 0\n" 3293 " // Aligned to code.\n" 3294 " int b;\n" 3295 " #endif\n" 3296 "#endif\n" 3297 "}"; 3298 const char *ToFormat = "void f() {\n" 3299 "// Aligned to preprocessor.\n" 3300 "#if 1\n" 3301 "// Aligned to code.\n" 3302 "int a;\n" 3303 "#if 1\n" 3304 "// Aligned to preprocessor.\n" 3305 "#define A 0\n" 3306 "// Aligned to code.\n" 3307 "int b;\n" 3308 "#endif\n" 3309 "#endif\n" 3310 "}"; 3311 EXPECT_EQ(Expected, format(ToFormat, Style)); 3312 EXPECT_EQ(Expected, format(Expected, Style)); 3313 } 3314 { 3315 const char *Expected = "void f() {\n" 3316 "/* Aligned to preprocessor. */\n" 3317 "#if 1\n" 3318 " /* Aligned to code. */\n" 3319 " int a;\n" 3320 " #if 1\n" 3321 " /* Aligned to preprocessor. */\n" 3322 " #define A 0\n" 3323 " /* Aligned to code. */\n" 3324 " int b;\n" 3325 " #endif\n" 3326 "#endif\n" 3327 "}"; 3328 const char *ToFormat = "void f() {\n" 3329 "/* Aligned to preprocessor. */\n" 3330 "#if 1\n" 3331 "/* Aligned to code. */\n" 3332 "int a;\n" 3333 "#if 1\n" 3334 "/* Aligned to preprocessor. */\n" 3335 "#define A 0\n" 3336 "/* Aligned to code. */\n" 3337 "int b;\n" 3338 "#endif\n" 3339 "#endif\n" 3340 "}"; 3341 EXPECT_EQ(Expected, format(ToFormat, Style)); 3342 EXPECT_EQ(Expected, format(Expected, Style)); 3343 } 3344 3345 // Test single comment before preprocessor 3346 verifyFormat("// Comment\n" 3347 "\n" 3348 "#if 1\n" 3349 "#endif", 3350 Style); 3351 } 3352 3353 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3354 verifyFormat("{\n { a #c; }\n}"); 3355 } 3356 3357 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3358 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3359 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3360 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3361 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3362 } 3363 3364 TEST_F(FormatTest, EscapedNewlines) { 3365 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3366 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3367 format("#define A \\\nint i;\\\n int j;", Narrow)); 3368 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3369 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3370 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3371 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3372 3373 FormatStyle AlignLeft = getLLVMStyle(); 3374 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3375 EXPECT_EQ("#define MACRO(x) \\\n" 3376 "private: \\\n" 3377 " int x(int a);\n", 3378 format("#define MACRO(x) \\\n" 3379 "private: \\\n" 3380 " int x(int a);\n", 3381 AlignLeft)); 3382 3383 // CRLF line endings 3384 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3385 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3386 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3387 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3388 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3389 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3390 EXPECT_EQ("#define MACRO(x) \\\r\n" 3391 "private: \\\r\n" 3392 " int x(int a);\r\n", 3393 format("#define MACRO(x) \\\r\n" 3394 "private: \\\r\n" 3395 " int x(int a);\r\n", 3396 AlignLeft)); 3397 3398 FormatStyle DontAlign = getLLVMStyle(); 3399 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3400 DontAlign.MaxEmptyLinesToKeep = 3; 3401 // FIXME: can't use verifyFormat here because the newline before 3402 // "public:" is not inserted the first time it's reformatted 3403 EXPECT_EQ("#define A \\\n" 3404 " class Foo { \\\n" 3405 " void bar(); \\\n" 3406 "\\\n" 3407 "\\\n" 3408 "\\\n" 3409 " public: \\\n" 3410 " void baz(); \\\n" 3411 " };", 3412 format("#define A \\\n" 3413 " class Foo { \\\n" 3414 " void bar(); \\\n" 3415 "\\\n" 3416 "\\\n" 3417 "\\\n" 3418 " public: \\\n" 3419 " void baz(); \\\n" 3420 " };", 3421 DontAlign)); 3422 } 3423 3424 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3425 verifyFormat("#define A \\\n" 3426 " int v( \\\n" 3427 " a); \\\n" 3428 " int i;", 3429 getLLVMStyleWithColumns(11)); 3430 } 3431 3432 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3433 EXPECT_EQ( 3434 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3435 " \\\n" 3436 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3437 "\n" 3438 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3439 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3440 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3441 "\\\n" 3442 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3443 " \n" 3444 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3445 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3446 } 3447 3448 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3449 EXPECT_EQ("int\n" 3450 "#define A\n" 3451 " a;", 3452 format("int\n#define A\na;")); 3453 verifyFormat("functionCallTo(\n" 3454 " someOtherFunction(\n" 3455 " withSomeParameters, whichInSequence,\n" 3456 " areLongerThanALine(andAnotherCall,\n" 3457 "#define A B\n" 3458 " withMoreParamters,\n" 3459 " whichStronglyInfluenceTheLayout),\n" 3460 " andMoreParameters),\n" 3461 " trailing);", 3462 getLLVMStyleWithColumns(69)); 3463 verifyFormat("Foo::Foo()\n" 3464 "#ifdef BAR\n" 3465 " : baz(0)\n" 3466 "#endif\n" 3467 "{\n" 3468 "}"); 3469 verifyFormat("void f() {\n" 3470 " if (true)\n" 3471 "#ifdef A\n" 3472 " f(42);\n" 3473 " x();\n" 3474 "#else\n" 3475 " g();\n" 3476 " x();\n" 3477 "#endif\n" 3478 "}"); 3479 verifyFormat("void f(param1, param2,\n" 3480 " param3,\n" 3481 "#ifdef A\n" 3482 " param4(param5,\n" 3483 "#ifdef A1\n" 3484 " param6,\n" 3485 "#ifdef A2\n" 3486 " param7),\n" 3487 "#else\n" 3488 " param8),\n" 3489 " param9,\n" 3490 "#endif\n" 3491 " param10,\n" 3492 "#endif\n" 3493 " param11)\n" 3494 "#else\n" 3495 " param12)\n" 3496 "#endif\n" 3497 "{\n" 3498 " x();\n" 3499 "}", 3500 getLLVMStyleWithColumns(28)); 3501 verifyFormat("#if 1\n" 3502 "int i;"); 3503 verifyFormat("#if 1\n" 3504 "#endif\n" 3505 "#if 1\n" 3506 "#else\n" 3507 "#endif\n"); 3508 verifyFormat("DEBUG({\n" 3509 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3510 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3511 "});\n" 3512 "#if a\n" 3513 "#else\n" 3514 "#endif"); 3515 3516 verifyIncompleteFormat("void f(\n" 3517 "#if A\n" 3518 ");\n" 3519 "#else\n" 3520 "#endif"); 3521 } 3522 3523 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3524 verifyFormat("#endif\n" 3525 "#if B"); 3526 } 3527 3528 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3529 FormatStyle SingleLine = getLLVMStyle(); 3530 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3531 verifyFormat("#if 0\n" 3532 "#elif 1\n" 3533 "#endif\n" 3534 "void foo() {\n" 3535 " if (test) foo2();\n" 3536 "}", 3537 SingleLine); 3538 } 3539 3540 TEST_F(FormatTest, LayoutBlockInsideParens) { 3541 verifyFormat("functionCall({ int i; });"); 3542 verifyFormat("functionCall({\n" 3543 " int i;\n" 3544 " int j;\n" 3545 "});"); 3546 verifyFormat("functionCall(\n" 3547 " {\n" 3548 " int i;\n" 3549 " int j;\n" 3550 " },\n" 3551 " aaaa, bbbb, cccc);"); 3552 verifyFormat("functionA(functionB({\n" 3553 " int i;\n" 3554 " int j;\n" 3555 " }),\n" 3556 " aaaa, bbbb, cccc);"); 3557 verifyFormat("functionCall(\n" 3558 " {\n" 3559 " int i;\n" 3560 " int j;\n" 3561 " },\n" 3562 " aaaa, bbbb, // comment\n" 3563 " cccc);"); 3564 verifyFormat("functionA(functionB({\n" 3565 " int i;\n" 3566 " int j;\n" 3567 " }),\n" 3568 " aaaa, bbbb, // comment\n" 3569 " cccc);"); 3570 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3571 verifyFormat("functionCall(aaaa, bbbb, {\n" 3572 " int i;\n" 3573 " int j;\n" 3574 "});"); 3575 verifyFormat( 3576 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3577 " {\n" 3578 " int i; // break\n" 3579 " },\n" 3580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3581 " ccccccccccccccccc));"); 3582 verifyFormat("DEBUG({\n" 3583 " if (a)\n" 3584 " f();\n" 3585 "});"); 3586 } 3587 3588 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3589 EXPECT_EQ("SOME_MACRO { int i; }\n" 3590 "int i;", 3591 format(" SOME_MACRO {int i;} int i;")); 3592 } 3593 3594 TEST_F(FormatTest, LayoutNestedBlocks) { 3595 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3596 " struct s {\n" 3597 " int i;\n" 3598 " };\n" 3599 " s kBitsToOs[] = {{10}};\n" 3600 " for (int i = 0; i < 10; ++i)\n" 3601 " return;\n" 3602 "}"); 3603 verifyFormat("call(parameter, {\n" 3604 " something();\n" 3605 " // Comment using all columns.\n" 3606 " somethingelse();\n" 3607 "});", 3608 getLLVMStyleWithColumns(40)); 3609 verifyFormat("DEBUG( //\n" 3610 " { f(); }, a);"); 3611 verifyFormat("DEBUG( //\n" 3612 " {\n" 3613 " f(); //\n" 3614 " },\n" 3615 " a);"); 3616 3617 EXPECT_EQ("call(parameter, {\n" 3618 " something();\n" 3619 " // Comment too\n" 3620 " // looooooooooong.\n" 3621 " somethingElse();\n" 3622 "});", 3623 format("call(parameter, {\n" 3624 " something();\n" 3625 " // Comment too looooooooooong.\n" 3626 " somethingElse();\n" 3627 "});", 3628 getLLVMStyleWithColumns(29))); 3629 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3630 EXPECT_EQ("DEBUG({ // comment\n" 3631 " int i;\n" 3632 "});", 3633 format("DEBUG({ // comment\n" 3634 "int i;\n" 3635 "});")); 3636 EXPECT_EQ("DEBUG({\n" 3637 " int i;\n" 3638 "\n" 3639 " // comment\n" 3640 " int j;\n" 3641 "});", 3642 format("DEBUG({\n" 3643 " int i;\n" 3644 "\n" 3645 " // comment\n" 3646 " int j;\n" 3647 "});")); 3648 3649 verifyFormat("DEBUG({\n" 3650 " if (a)\n" 3651 " return;\n" 3652 "});"); 3653 verifyGoogleFormat("DEBUG({\n" 3654 " if (a) return;\n" 3655 "});"); 3656 FormatStyle Style = getGoogleStyle(); 3657 Style.ColumnLimit = 45; 3658 verifyFormat("Debug(\n" 3659 " aaaaa,\n" 3660 " {\n" 3661 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3662 " },\n" 3663 " a);", 3664 Style); 3665 3666 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3667 3668 verifyNoCrash("^{v^{a}}"); 3669 } 3670 3671 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3672 EXPECT_EQ("#define MACRO() \\\n" 3673 " Debug(aaa, /* force line break */ \\\n" 3674 " { \\\n" 3675 " int i; \\\n" 3676 " int j; \\\n" 3677 " })", 3678 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3679 " { int i; int j; })", 3680 getGoogleStyle())); 3681 3682 EXPECT_EQ("#define A \\\n" 3683 " [] { \\\n" 3684 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3685 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3686 " }", 3687 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3688 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3689 getGoogleStyle())); 3690 } 3691 3692 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3693 EXPECT_EQ("{}", format("{}")); 3694 verifyFormat("enum E {};"); 3695 verifyFormat("enum E {}"); 3696 FormatStyle Style = getLLVMStyle(); 3697 Style.SpaceInEmptyBlock = true; 3698 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 3699 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 3700 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 3701 } 3702 3703 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 3704 FormatStyle Style = getLLVMStyle(); 3705 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 3706 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 3707 verifyFormat("FOO_BEGIN\n" 3708 " FOO_ENTRY\n" 3709 "FOO_END", Style); 3710 verifyFormat("FOO_BEGIN\n" 3711 " NESTED_FOO_BEGIN\n" 3712 " NESTED_FOO_ENTRY\n" 3713 " NESTED_FOO_END\n" 3714 "FOO_END", Style); 3715 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 3716 " int x;\n" 3717 " x = 1;\n" 3718 "FOO_END(Baz)", Style); 3719 } 3720 3721 //===----------------------------------------------------------------------===// 3722 // Line break tests. 3723 //===----------------------------------------------------------------------===// 3724 3725 TEST_F(FormatTest, PreventConfusingIndents) { 3726 verifyFormat( 3727 "void f() {\n" 3728 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 3729 " parameter, parameter, parameter)),\n" 3730 " SecondLongCall(parameter));\n" 3731 "}"); 3732 verifyFormat( 3733 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3734 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3736 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 3737 verifyFormat( 3738 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3739 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 3740 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 3741 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 3742 verifyFormat( 3743 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 3744 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 3745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 3746 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 3747 verifyFormat("int a = bbbb && ccc &&\n" 3748 " fffff(\n" 3749 "#define A Just forcing a new line\n" 3750 " ddd);"); 3751 } 3752 3753 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 3754 verifyFormat( 3755 "bool aaaaaaa =\n" 3756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 3757 " bbbbbbbb();"); 3758 verifyFormat( 3759 "bool aaaaaaa =\n" 3760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 3761 " bbbbbbbb();"); 3762 3763 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 3765 " ccccccccc == ddddddddddd;"); 3766 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 3768 " ccccccccc == ddddddddddd;"); 3769 verifyFormat( 3770 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 3771 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 3772 " ccccccccc == ddddddddddd;"); 3773 3774 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3775 " aaaaaa) &&\n" 3776 " bbbbbb && cccccc;"); 3777 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3778 " aaaaaa) >>\n" 3779 " bbbbbb;"); 3780 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 3781 " SourceMgr.getSpellingColumnNumber(\n" 3782 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 3783 " 1);"); 3784 3785 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3786 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 3787 " cccccc) {\n}"); 3788 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3789 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3790 " cccccc) {\n}"); 3791 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3792 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3793 " cccccc) {\n}"); 3794 verifyFormat("b = a &&\n" 3795 " // Comment\n" 3796 " b.c && d;"); 3797 3798 // If the LHS of a comparison is not a binary expression itself, the 3799 // additional linebreak confuses many people. 3800 verifyFormat( 3801 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3802 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 3803 "}"); 3804 verifyFormat( 3805 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3806 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3807 "}"); 3808 verifyFormat( 3809 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 3810 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3811 "}"); 3812 verifyFormat( 3813 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3814 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 3815 "}"); 3816 // Even explicit parentheses stress the precedence enough to make the 3817 // additional break unnecessary. 3818 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3819 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3820 "}"); 3821 // This cases is borderline, but with the indentation it is still readable. 3822 verifyFormat( 3823 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3824 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 3826 "}", 3827 getLLVMStyleWithColumns(75)); 3828 3829 // If the LHS is a binary expression, we should still use the additional break 3830 // as otherwise the formatting hides the operator precedence. 3831 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3833 " 5) {\n" 3834 "}"); 3835 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3836 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 3837 " 5) {\n" 3838 "}"); 3839 3840 FormatStyle OnePerLine = getLLVMStyle(); 3841 OnePerLine.BinPackParameters = false; 3842 verifyFormat( 3843 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3844 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3845 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 3846 OnePerLine); 3847 3848 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 3849 " .aaa(aaaaaaaaaaaaa) *\n" 3850 " aaaaaaa +\n" 3851 " aaaaaaa;", 3852 getLLVMStyleWithColumns(40)); 3853 } 3854 3855 TEST_F(FormatTest, ExpressionIndentation) { 3856 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3860 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 3861 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 3862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 3864 " ccccccccccccccccccccccccccccccccccccccccc;"); 3865 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3866 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3868 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3869 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3870 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3872 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3873 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3874 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3876 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3877 verifyFormat("if () {\n" 3878 "} else if (aaaaa && bbbbb > // break\n" 3879 " ccccc) {\n" 3880 "}"); 3881 verifyFormat("if () {\n" 3882 "} else if constexpr (aaaaa && bbbbb > // break\n" 3883 " ccccc) {\n" 3884 "}"); 3885 verifyFormat("if () {\n" 3886 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 3887 " ccccc) {\n" 3888 "}"); 3889 verifyFormat("if () {\n" 3890 "} else if (aaaaa &&\n" 3891 " bbbbb > // break\n" 3892 " ccccc &&\n" 3893 " ddddd) {\n" 3894 "}"); 3895 3896 // Presence of a trailing comment used to change indentation of b. 3897 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 3898 " b;\n" 3899 "return aaaaaaaaaaaaaaaaaaa +\n" 3900 " b; //", 3901 getLLVMStyleWithColumns(30)); 3902 } 3903 3904 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 3905 // Not sure what the best system is here. Like this, the LHS can be found 3906 // immediately above an operator (everything with the same or a higher 3907 // indent). The RHS is aligned right of the operator and so compasses 3908 // everything until something with the same indent as the operator is found. 3909 // FIXME: Is this a good system? 3910 FormatStyle Style = getLLVMStyle(); 3911 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 3912 verifyFormat( 3913 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3914 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3915 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3916 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3917 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3918 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3919 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3920 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3921 " > ccccccccccccccccccccccccccccccccccccccccc;", 3922 Style); 3923 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3924 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3925 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3926 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3927 Style); 3928 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3929 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3930 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3931 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3932 Style); 3933 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3934 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3935 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3936 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3937 Style); 3938 verifyFormat("if () {\n" 3939 "} else if (aaaaa\n" 3940 " && bbbbb // break\n" 3941 " > ccccc) {\n" 3942 "}", 3943 Style); 3944 verifyFormat("return (a)\n" 3945 " // comment\n" 3946 " + b;", 3947 Style); 3948 verifyFormat( 3949 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3950 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3951 " + cc;", 3952 Style); 3953 3954 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3955 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 3956 Style); 3957 3958 // Forced by comments. 3959 verifyFormat( 3960 "unsigned ContentSize =\n" 3961 " sizeof(int16_t) // DWARF ARange version number\n" 3962 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 3963 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 3964 " + sizeof(int8_t); // Segment Size (in bytes)"); 3965 3966 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 3967 " == boost::fusion::at_c<1>(iiii).second;", 3968 Style); 3969 3970 Style.ColumnLimit = 60; 3971 verifyFormat("zzzzzzzzzz\n" 3972 " = bbbbbbbbbbbbbbbbb\n" 3973 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 3974 Style); 3975 3976 Style.ColumnLimit = 80; 3977 Style.IndentWidth = 4; 3978 Style.TabWidth = 4; 3979 Style.UseTab = FormatStyle::UT_Always; 3980 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 3981 Style.AlignOperands = false; 3982 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 3983 "\t&& (someOtherLongishConditionPart1\n" 3984 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 3985 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);", 3986 Style)); 3987 } 3988 3989 TEST_F(FormatTest, EnforcedOperatorWraps) { 3990 // Here we'd like to wrap after the || operators, but a comment is forcing an 3991 // earlier wrap. 3992 verifyFormat("bool x = aaaaa //\n" 3993 " || bbbbb\n" 3994 " //\n" 3995 " || cccc;"); 3996 } 3997 3998 TEST_F(FormatTest, NoOperandAlignment) { 3999 FormatStyle Style = getLLVMStyle(); 4000 Style.AlignOperands = false; 4001 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4004 Style); 4005 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4006 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4007 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4008 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4009 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4010 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4011 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4012 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4013 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4014 " > ccccccccccccccccccccccccccccccccccccccccc;", 4015 Style); 4016 4017 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4018 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4019 " + cc;", 4020 Style); 4021 verifyFormat("int a = aa\n" 4022 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4023 " * cccccccccccccccccccccccccccccccccccc;\n", 4024 Style); 4025 4026 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4027 verifyFormat("return (a > b\n" 4028 " // comment1\n" 4029 " // comment2\n" 4030 " || c);", 4031 Style); 4032 } 4033 4034 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4035 FormatStyle Style = getLLVMStyle(); 4036 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4037 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4039 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4040 Style); 4041 } 4042 4043 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4044 FormatStyle Style = getLLVMStyle(); 4045 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4046 Style.BinPackArguments = false; 4047 Style.ColumnLimit = 40; 4048 verifyFormat("void test() {\n" 4049 " someFunction(\n" 4050 " this + argument + is + quite\n" 4051 " + long + so + it + gets + wrapped\n" 4052 " + but + remains + bin - packed);\n" 4053 "}", 4054 Style); 4055 verifyFormat("void test() {\n" 4056 " someFunction(arg1,\n" 4057 " this + argument + is\n" 4058 " + quite + long + so\n" 4059 " + it + gets + wrapped\n" 4060 " + but + remains + bin\n" 4061 " - packed,\n" 4062 " arg3);\n" 4063 "}", 4064 Style); 4065 verifyFormat("void test() {\n" 4066 " someFunction(\n" 4067 " arg1,\n" 4068 " this + argument + has\n" 4069 " + anotherFunc(nested,\n" 4070 " calls + whose\n" 4071 " + arguments\n" 4072 " + are + also\n" 4073 " + wrapped,\n" 4074 " in + addition)\n" 4075 " + to + being + bin - packed,\n" 4076 " arg3);\n" 4077 "}", 4078 Style); 4079 4080 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4081 verifyFormat("void test() {\n" 4082 " someFunction(\n" 4083 " arg1,\n" 4084 " this + argument + has +\n" 4085 " anotherFunc(nested,\n" 4086 " calls + whose +\n" 4087 " arguments +\n" 4088 " are + also +\n" 4089 " wrapped,\n" 4090 " in + addition) +\n" 4091 " to + being + bin - packed,\n" 4092 " arg3);\n" 4093 "}", 4094 Style); 4095 } 4096 4097 TEST_F(FormatTest, ConstructorInitializers) { 4098 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4099 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4100 getLLVMStyleWithColumns(45)); 4101 verifyFormat("Constructor()\n" 4102 " : Inttializer(FitsOnTheLine) {}", 4103 getLLVMStyleWithColumns(44)); 4104 verifyFormat("Constructor()\n" 4105 " : Inttializer(FitsOnTheLine) {}", 4106 getLLVMStyleWithColumns(43)); 4107 4108 verifyFormat("template <typename T>\n" 4109 "Constructor() : Initializer(FitsOnTheLine) {}", 4110 getLLVMStyleWithColumns(45)); 4111 4112 verifyFormat( 4113 "SomeClass::Constructor()\n" 4114 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4115 4116 verifyFormat( 4117 "SomeClass::Constructor()\n" 4118 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4119 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4120 verifyFormat( 4121 "SomeClass::Constructor()\n" 4122 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4123 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4124 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4125 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4126 " : aaaaaaaaaa(aaaaaa) {}"); 4127 4128 verifyFormat("Constructor()\n" 4129 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4130 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4131 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4132 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4133 4134 verifyFormat("Constructor()\n" 4135 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4137 4138 verifyFormat("Constructor(int Parameter = 0)\n" 4139 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4140 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4141 verifyFormat("Constructor()\n" 4142 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4143 "}", 4144 getLLVMStyleWithColumns(60)); 4145 verifyFormat("Constructor()\n" 4146 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4147 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4148 4149 // Here a line could be saved by splitting the second initializer onto two 4150 // lines, but that is not desirable. 4151 verifyFormat("Constructor()\n" 4152 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4153 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4154 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4155 4156 FormatStyle OnePerLine = getLLVMStyle(); 4157 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4158 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4159 verifyFormat("SomeClass::Constructor()\n" 4160 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4161 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4162 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4163 OnePerLine); 4164 verifyFormat("SomeClass::Constructor()\n" 4165 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4166 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4167 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4168 OnePerLine); 4169 verifyFormat("MyClass::MyClass(int var)\n" 4170 " : some_var_(var), // 4 space indent\n" 4171 " some_other_var_(var + 1) { // lined up\n" 4172 "}", 4173 OnePerLine); 4174 verifyFormat("Constructor()\n" 4175 " : aaaaa(aaaaaa),\n" 4176 " aaaaa(aaaaaa),\n" 4177 " aaaaa(aaaaaa),\n" 4178 " aaaaa(aaaaaa),\n" 4179 " aaaaa(aaaaaa) {}", 4180 OnePerLine); 4181 verifyFormat("Constructor()\n" 4182 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4183 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4184 OnePerLine); 4185 OnePerLine.BinPackParameters = false; 4186 verifyFormat( 4187 "Constructor()\n" 4188 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4189 " aaaaaaaaaaa().aaa(),\n" 4190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4191 OnePerLine); 4192 OnePerLine.ColumnLimit = 60; 4193 verifyFormat("Constructor()\n" 4194 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4195 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4196 OnePerLine); 4197 4198 EXPECT_EQ("Constructor()\n" 4199 " : // Comment forcing unwanted break.\n" 4200 " aaaa(aaaa) {}", 4201 format("Constructor() :\n" 4202 " // Comment forcing unwanted break.\n" 4203 " aaaa(aaaa) {}")); 4204 } 4205 4206 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4207 FormatStyle Style = getLLVMStyle(); 4208 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4209 Style.ColumnLimit = 60; 4210 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4211 Style.AllowAllConstructorInitializersOnNextLine = true; 4212 Style.BinPackParameters = false; 4213 4214 for (int i = 0; i < 4; ++i) { 4215 // Test all combinations of parameters that should not have an effect. 4216 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4217 Style.AllowAllArgumentsOnNextLine = i & 2; 4218 4219 Style.AllowAllConstructorInitializersOnNextLine = true; 4220 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4221 verifyFormat("Constructor()\n" 4222 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4223 Style); 4224 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4225 4226 Style.AllowAllConstructorInitializersOnNextLine = false; 4227 verifyFormat("Constructor()\n" 4228 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4229 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4230 Style); 4231 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4232 4233 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4234 Style.AllowAllConstructorInitializersOnNextLine = true; 4235 verifyFormat("Constructor()\n" 4236 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4237 Style); 4238 4239 Style.AllowAllConstructorInitializersOnNextLine = false; 4240 verifyFormat("Constructor()\n" 4241 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4242 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4243 Style); 4244 4245 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4246 Style.AllowAllConstructorInitializersOnNextLine = true; 4247 verifyFormat("Constructor() :\n" 4248 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4249 Style); 4250 4251 Style.AllowAllConstructorInitializersOnNextLine = false; 4252 verifyFormat("Constructor() :\n" 4253 " aaaaaaaaaaaaaaaaaa(a),\n" 4254 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4255 Style); 4256 } 4257 4258 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4259 // AllowAllConstructorInitializersOnNextLine in all 4260 // BreakConstructorInitializers modes 4261 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4262 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4263 Style.AllowAllConstructorInitializersOnNextLine = false; 4264 verifyFormat("SomeClassWithALongName::Constructor(\n" 4265 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4266 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4267 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4268 Style); 4269 4270 Style.AllowAllConstructorInitializersOnNextLine = true; 4271 verifyFormat("SomeClassWithALongName::Constructor(\n" 4272 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4273 " int bbbbbbbbbbbbb,\n" 4274 " int cccccccccccccccc)\n" 4275 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4276 Style); 4277 4278 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4279 Style.AllowAllConstructorInitializersOnNextLine = false; 4280 verifyFormat("SomeClassWithALongName::Constructor(\n" 4281 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4282 " int bbbbbbbbbbbbb)\n" 4283 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4284 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4285 Style); 4286 4287 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4288 4289 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4290 verifyFormat("SomeClassWithALongName::Constructor(\n" 4291 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4292 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4293 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4294 Style); 4295 4296 Style.AllowAllConstructorInitializersOnNextLine = true; 4297 verifyFormat("SomeClassWithALongName::Constructor(\n" 4298 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4299 " int bbbbbbbbbbbbb,\n" 4300 " int cccccccccccccccc)\n" 4301 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4302 Style); 4303 4304 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4305 Style.AllowAllConstructorInitializersOnNextLine = false; 4306 verifyFormat("SomeClassWithALongName::Constructor(\n" 4307 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4308 " int bbbbbbbbbbbbb)\n" 4309 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4310 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4311 Style); 4312 4313 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4314 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4315 verifyFormat("SomeClassWithALongName::Constructor(\n" 4316 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4317 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4318 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4319 Style); 4320 4321 Style.AllowAllConstructorInitializersOnNextLine = true; 4322 verifyFormat("SomeClassWithALongName::Constructor(\n" 4323 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4324 " int bbbbbbbbbbbbb,\n" 4325 " int cccccccccccccccc) :\n" 4326 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4327 Style); 4328 4329 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4330 Style.AllowAllConstructorInitializersOnNextLine = false; 4331 verifyFormat("SomeClassWithALongName::Constructor(\n" 4332 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4333 " int bbbbbbbbbbbbb) :\n" 4334 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4335 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4336 Style); 4337 } 4338 4339 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4340 FormatStyle Style = getLLVMStyle(); 4341 Style.ColumnLimit = 60; 4342 Style.BinPackArguments = false; 4343 for (int i = 0; i < 4; ++i) { 4344 // Test all combinations of parameters that should not have an effect. 4345 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4346 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4347 4348 Style.AllowAllArgumentsOnNextLine = true; 4349 verifyFormat("void foo() {\n" 4350 " FunctionCallWithReallyLongName(\n" 4351 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4352 "}", 4353 Style); 4354 Style.AllowAllArgumentsOnNextLine = false; 4355 verifyFormat("void foo() {\n" 4356 " FunctionCallWithReallyLongName(\n" 4357 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4358 " bbbbbbbbbbbb);\n" 4359 "}", 4360 Style); 4361 4362 Style.AllowAllArgumentsOnNextLine = true; 4363 verifyFormat("void foo() {\n" 4364 " auto VariableWithReallyLongName = {\n" 4365 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4366 "}", 4367 Style); 4368 Style.AllowAllArgumentsOnNextLine = false; 4369 verifyFormat("void foo() {\n" 4370 " auto VariableWithReallyLongName = {\n" 4371 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4372 " bbbbbbbbbbbb};\n" 4373 "}", 4374 Style); 4375 } 4376 4377 // This parameter should not affect declarations. 4378 Style.BinPackParameters = false; 4379 Style.AllowAllArgumentsOnNextLine = false; 4380 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4381 verifyFormat("void FunctionCallWithReallyLongName(\n" 4382 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4383 Style); 4384 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4385 verifyFormat("void FunctionCallWithReallyLongName(\n" 4386 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4387 " int bbbbbbbbbbbb);", 4388 Style); 4389 } 4390 4391 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4392 FormatStyle Style = getLLVMStyle(); 4393 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4394 4395 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4396 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4397 getStyleWithColumns(Style, 45)); 4398 verifyFormat("Constructor() :\n" 4399 " Initializer(FitsOnTheLine) {}", 4400 getStyleWithColumns(Style, 44)); 4401 verifyFormat("Constructor() :\n" 4402 " Initializer(FitsOnTheLine) {}", 4403 getStyleWithColumns(Style, 43)); 4404 4405 verifyFormat("template <typename T>\n" 4406 "Constructor() : Initializer(FitsOnTheLine) {}", 4407 getStyleWithColumns(Style, 50)); 4408 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4409 verifyFormat( 4410 "SomeClass::Constructor() :\n" 4411 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4412 Style); 4413 4414 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4415 verifyFormat( 4416 "SomeClass::Constructor() :\n" 4417 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4418 Style); 4419 4420 verifyFormat( 4421 "SomeClass::Constructor() :\n" 4422 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4423 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4424 Style); 4425 verifyFormat( 4426 "SomeClass::Constructor() :\n" 4427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4428 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4429 Style); 4430 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4431 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4432 " aaaaaaaaaa(aaaaaa) {}", 4433 Style); 4434 4435 verifyFormat("Constructor() :\n" 4436 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4437 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4438 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4439 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4440 Style); 4441 4442 verifyFormat("Constructor() :\n" 4443 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4445 Style); 4446 4447 verifyFormat("Constructor(int Parameter = 0) :\n" 4448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4449 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4450 Style); 4451 verifyFormat("Constructor() :\n" 4452 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4453 "}", 4454 getStyleWithColumns(Style, 60)); 4455 verifyFormat("Constructor() :\n" 4456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4457 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4458 Style); 4459 4460 // Here a line could be saved by splitting the second initializer onto two 4461 // lines, but that is not desirable. 4462 verifyFormat("Constructor() :\n" 4463 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4464 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4465 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4466 Style); 4467 4468 FormatStyle OnePerLine = Style; 4469 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4470 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4471 verifyFormat("SomeClass::Constructor() :\n" 4472 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4473 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4474 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4475 OnePerLine); 4476 verifyFormat("SomeClass::Constructor() :\n" 4477 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4478 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4479 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4480 OnePerLine); 4481 verifyFormat("MyClass::MyClass(int var) :\n" 4482 " some_var_(var), // 4 space indent\n" 4483 " some_other_var_(var + 1) { // lined up\n" 4484 "}", 4485 OnePerLine); 4486 verifyFormat("Constructor() :\n" 4487 " aaaaa(aaaaaa),\n" 4488 " aaaaa(aaaaaa),\n" 4489 " aaaaa(aaaaaa),\n" 4490 " aaaaa(aaaaaa),\n" 4491 " aaaaa(aaaaaa) {}", 4492 OnePerLine); 4493 verifyFormat("Constructor() :\n" 4494 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4495 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4496 OnePerLine); 4497 OnePerLine.BinPackParameters = false; 4498 verifyFormat( 4499 "Constructor() :\n" 4500 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4501 " aaaaaaaaaaa().aaa(),\n" 4502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4503 OnePerLine); 4504 OnePerLine.ColumnLimit = 60; 4505 verifyFormat("Constructor() :\n" 4506 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4507 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4508 OnePerLine); 4509 4510 EXPECT_EQ("Constructor() :\n" 4511 " // Comment forcing unwanted break.\n" 4512 " aaaa(aaaa) {}", 4513 format("Constructor() :\n" 4514 " // Comment forcing unwanted break.\n" 4515 " aaaa(aaaa) {}", 4516 Style)); 4517 4518 Style.ColumnLimit = 0; 4519 verifyFormat("SomeClass::Constructor() :\n" 4520 " a(a) {}", 4521 Style); 4522 verifyFormat("SomeClass::Constructor() noexcept :\n" 4523 " a(a) {}", 4524 Style); 4525 verifyFormat("SomeClass::Constructor() :\n" 4526 " a(a), b(b), c(c) {}", 4527 Style); 4528 verifyFormat("SomeClass::Constructor() :\n" 4529 " a(a) {\n" 4530 " foo();\n" 4531 " bar();\n" 4532 "}", 4533 Style); 4534 4535 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4536 verifyFormat("SomeClass::Constructor() :\n" 4537 " a(a), b(b), c(c) {\n" 4538 "}", 4539 Style); 4540 verifyFormat("SomeClass::Constructor() :\n" 4541 " a(a) {\n" 4542 "}", 4543 Style); 4544 4545 Style.ColumnLimit = 80; 4546 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4547 Style.ConstructorInitializerIndentWidth = 2; 4548 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", 4549 Style); 4550 verifyFormat("SomeClass::Constructor() :\n" 4551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4552 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4553 Style); 4554 4555 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well 4556 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4557 verifyFormat("class SomeClass\n" 4558 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4559 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4560 Style); 4561 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4562 verifyFormat("class SomeClass\n" 4563 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4564 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4565 Style); 4566 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4567 verifyFormat("class SomeClass :\n" 4568 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4569 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4570 Style); 4571 } 4572 4573 #ifndef EXPENSIVE_CHECKS 4574 // Expensive checks enables libstdc++ checking which includes validating the 4575 // state of ranges used in std::priority_queue - this blows out the 4576 // runtime/scalability of the function and makes this test unacceptably slow. 4577 TEST_F(FormatTest, MemoizationTests) { 4578 // This breaks if the memoization lookup does not take \c Indent and 4579 // \c LastSpace into account. 4580 verifyFormat( 4581 "extern CFRunLoopTimerRef\n" 4582 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4583 " CFTimeInterval interval, CFOptionFlags flags,\n" 4584 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4585 " CFRunLoopTimerContext *context) {}"); 4586 4587 // Deep nesting somewhat works around our memoization. 4588 verifyFormat( 4589 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4590 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4591 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4592 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4593 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4594 getLLVMStyleWithColumns(65)); 4595 verifyFormat( 4596 "aaaaa(\n" 4597 " aaaaa,\n" 4598 " aaaaa(\n" 4599 " aaaaa,\n" 4600 " aaaaa(\n" 4601 " aaaaa,\n" 4602 " aaaaa(\n" 4603 " aaaaa,\n" 4604 " aaaaa(\n" 4605 " aaaaa,\n" 4606 " aaaaa(\n" 4607 " aaaaa,\n" 4608 " aaaaa(\n" 4609 " aaaaa,\n" 4610 " aaaaa(\n" 4611 " aaaaa,\n" 4612 " aaaaa(\n" 4613 " aaaaa,\n" 4614 " aaaaa(\n" 4615 " aaaaa,\n" 4616 " aaaaa(\n" 4617 " aaaaa,\n" 4618 " aaaaa(\n" 4619 " aaaaa,\n" 4620 " aaaaa))))))))))));", 4621 getLLVMStyleWithColumns(65)); 4622 verifyFormat( 4623 "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" 4624 " a),\n" 4625 " a),\n" 4626 " a),\n" 4627 " a),\n" 4628 " a),\n" 4629 " a),\n" 4630 " a),\n" 4631 " a),\n" 4632 " a),\n" 4633 " a),\n" 4634 " a),\n" 4635 " a),\n" 4636 " a),\n" 4637 " a),\n" 4638 " a),\n" 4639 " a),\n" 4640 " a)", 4641 getLLVMStyleWithColumns(65)); 4642 4643 // This test takes VERY long when memoization is broken. 4644 FormatStyle OnePerLine = getLLVMStyle(); 4645 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4646 OnePerLine.BinPackParameters = false; 4647 std::string input = "Constructor()\n" 4648 " : aaaa(a,\n"; 4649 for (unsigned i = 0, e = 80; i != e; ++i) { 4650 input += " a,\n"; 4651 } 4652 input += " a) {}"; 4653 verifyFormat(input, OnePerLine); 4654 } 4655 #endif 4656 4657 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4658 verifyFormat( 4659 "void f() {\n" 4660 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4661 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4662 " f();\n" 4663 "}"); 4664 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4665 " Intervals[i - 1].getRange().getLast()) {\n}"); 4666 } 4667 4668 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4669 // Principially, we break function declarations in a certain order: 4670 // 1) break amongst arguments. 4671 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 4672 " Cccccccccccccc cccccccccccccc);"); 4673 verifyFormat("template <class TemplateIt>\n" 4674 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 4675 " TemplateIt *stop) {}"); 4676 4677 // 2) break after return type. 4678 verifyFormat( 4679 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4680 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 4681 getGoogleStyle()); 4682 4683 // 3) break after (. 4684 verifyFormat( 4685 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 4686 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 4687 getGoogleStyle()); 4688 4689 // 4) break before after nested name specifiers. 4690 verifyFormat( 4691 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4692 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 4693 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 4694 getGoogleStyle()); 4695 4696 // However, there are exceptions, if a sufficient amount of lines can be 4697 // saved. 4698 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 4699 // more adjusting. 4700 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4701 " Cccccccccccccc cccccccccc,\n" 4702 " Cccccccccccccc cccccccccc,\n" 4703 " Cccccccccccccc cccccccccc,\n" 4704 " Cccccccccccccc cccccccccc);"); 4705 verifyFormat( 4706 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4707 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4708 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4709 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 4710 getGoogleStyle()); 4711 verifyFormat( 4712 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4713 " Cccccccccccccc cccccccccc,\n" 4714 " Cccccccccccccc cccccccccc,\n" 4715 " Cccccccccccccc cccccccccc,\n" 4716 " Cccccccccccccc cccccccccc,\n" 4717 " Cccccccccccccc cccccccccc,\n" 4718 " Cccccccccccccc cccccccccc);"); 4719 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4720 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4721 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4722 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4723 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 4724 4725 // Break after multi-line parameters. 4726 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4729 " bbbb bbbb);"); 4730 verifyFormat("void SomeLoooooooooooongFunction(\n" 4731 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 4732 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4733 " int bbbbbbbbbbbbb);"); 4734 4735 // Treat overloaded operators like other functions. 4736 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4737 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 4738 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4739 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 4740 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4741 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 4742 verifyGoogleFormat( 4743 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 4744 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4745 verifyGoogleFormat( 4746 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 4747 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4748 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4749 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4750 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 4751 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4752 verifyGoogleFormat( 4753 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 4754 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4755 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 4756 verifyGoogleFormat( 4757 "template <typename T>\n" 4758 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4759 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 4760 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 4761 4762 FormatStyle Style = getLLVMStyle(); 4763 Style.PointerAlignment = FormatStyle::PAS_Left; 4764 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4765 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 4766 Style); 4767 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 4768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4769 Style); 4770 } 4771 4772 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 4773 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 4774 // Prefer keeping `::` followed by `operator` together. 4775 EXPECT_EQ("const aaaa::bbbbbbb &\n" 4776 "ccccccccc::operator++() {\n" 4777 " stuff();\n" 4778 "}", 4779 format("const aaaa::bbbbbbb\n" 4780 "&ccccccccc::operator++() { stuff(); }", 4781 getLLVMStyleWithColumns(40))); 4782 } 4783 4784 TEST_F(FormatTest, TrailingReturnType) { 4785 verifyFormat("auto foo() -> int;\n"); 4786 verifyFormat("struct S {\n" 4787 " auto bar() const -> int;\n" 4788 "};"); 4789 verifyFormat("template <size_t Order, typename T>\n" 4790 "auto load_img(const std::string &filename)\n" 4791 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 4792 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 4793 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 4794 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 4795 verifyFormat("template <typename T>\n" 4796 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 4797 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 4798 4799 // Not trailing return types. 4800 verifyFormat("void f() { auto a = b->c(); }"); 4801 } 4802 4803 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 4804 // Avoid breaking before trailing 'const' or other trailing annotations, if 4805 // they are not function-like. 4806 FormatStyle Style = getGoogleStyle(); 4807 Style.ColumnLimit = 47; 4808 verifyFormat("void someLongFunction(\n" 4809 " int someLoooooooooooooongParameter) const {\n}", 4810 getLLVMStyleWithColumns(47)); 4811 verifyFormat("LoooooongReturnType\n" 4812 "someLoooooooongFunction() const {}", 4813 getLLVMStyleWithColumns(47)); 4814 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 4815 " const {}", 4816 Style); 4817 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4818 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 4819 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4820 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 4821 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4822 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 4823 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 4824 " aaaaaaaaaaa aaaaa) const override;"); 4825 verifyGoogleFormat( 4826 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4827 " const override;"); 4828 4829 // Even if the first parameter has to be wrapped. 4830 verifyFormat("void someLongFunction(\n" 4831 " int someLongParameter) const {}", 4832 getLLVMStyleWithColumns(46)); 4833 verifyFormat("void someLongFunction(\n" 4834 " int someLongParameter) const {}", 4835 Style); 4836 verifyFormat("void someLongFunction(\n" 4837 " int someLongParameter) override {}", 4838 Style); 4839 verifyFormat("void someLongFunction(\n" 4840 " int someLongParameter) OVERRIDE {}", 4841 Style); 4842 verifyFormat("void someLongFunction(\n" 4843 " int someLongParameter) final {}", 4844 Style); 4845 verifyFormat("void someLongFunction(\n" 4846 " int someLongParameter) FINAL {}", 4847 Style); 4848 verifyFormat("void someLongFunction(\n" 4849 " int parameter) const override {}", 4850 Style); 4851 4852 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 4853 verifyFormat("void someLongFunction(\n" 4854 " int someLongParameter) const\n" 4855 "{\n" 4856 "}", 4857 Style); 4858 4859 // Unless these are unknown annotations. 4860 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 4861 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4862 " LONG_AND_UGLY_ANNOTATION;"); 4863 4864 // Breaking before function-like trailing annotations is fine to keep them 4865 // close to their arguments. 4866 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4867 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4868 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4869 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4870 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4871 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 4872 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 4873 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 4874 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 4875 4876 verifyFormat( 4877 "void aaaaaaaaaaaaaaaaaa()\n" 4878 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 4879 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 4880 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4881 " __attribute__((unused));"); 4882 verifyGoogleFormat( 4883 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4884 " GUARDED_BY(aaaaaaaaaaaa);"); 4885 verifyGoogleFormat( 4886 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4887 " GUARDED_BY(aaaaaaaaaaaa);"); 4888 verifyGoogleFormat( 4889 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4890 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4891 verifyGoogleFormat( 4892 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4893 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4894 } 4895 4896 TEST_F(FormatTest, FunctionAnnotations) { 4897 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4898 "int OldFunction(const string ¶meter) {}"); 4899 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4900 "string OldFunction(const string ¶meter) {}"); 4901 verifyFormat("template <typename T>\n" 4902 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4903 "string OldFunction(const string ¶meter) {}"); 4904 4905 // Not function annotations. 4906 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4907 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 4908 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 4909 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 4910 verifyFormat("MACRO(abc).function() // wrap\n" 4911 " << abc;"); 4912 verifyFormat("MACRO(abc)->function() // wrap\n" 4913 " << abc;"); 4914 verifyFormat("MACRO(abc)::function() // wrap\n" 4915 " << abc;"); 4916 } 4917 4918 TEST_F(FormatTest, BreaksDesireably) { 4919 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4920 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4921 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 4922 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 4924 "}"); 4925 4926 verifyFormat( 4927 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4929 4930 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4931 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4933 4934 verifyFormat( 4935 "aaaaaaaa(aaaaaaaaaaaaa,\n" 4936 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4937 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 4938 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 4940 4941 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4942 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4943 4944 verifyFormat( 4945 "void f() {\n" 4946 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 4947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 4948 "}"); 4949 verifyFormat( 4950 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4952 verifyFormat( 4953 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4954 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4955 verifyFormat( 4956 "aaaaaa(aaa,\n" 4957 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4958 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4959 " aaaa);"); 4960 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4963 4964 // Indent consistently independent of call expression and unary operator. 4965 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4966 " dddddddddddddddddddddddddddddd));"); 4967 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4968 " dddddddddddddddddddddddddddddd));"); 4969 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 4970 " dddddddddddddddddddddddddddddd));"); 4971 4972 // This test case breaks on an incorrect memoization, i.e. an optimization not 4973 // taking into account the StopAt value. 4974 verifyFormat( 4975 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4976 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4977 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4978 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4979 4980 verifyFormat("{\n {\n {\n" 4981 " Annotation.SpaceRequiredBefore =\n" 4982 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 4983 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 4984 " }\n }\n}"); 4985 4986 // Break on an outer level if there was a break on an inner level. 4987 EXPECT_EQ("f(g(h(a, // comment\n" 4988 " b, c),\n" 4989 " d, e),\n" 4990 " x, y);", 4991 format("f(g(h(a, // comment\n" 4992 " b, c), d, e), x, y);")); 4993 4994 // Prefer breaking similar line breaks. 4995 verifyFormat( 4996 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 4997 " NSTrackingMouseEnteredAndExited |\n" 4998 " NSTrackingActiveAlways;"); 4999 } 5000 5001 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5002 FormatStyle NoBinPacking = getGoogleStyle(); 5003 NoBinPacking.BinPackParameters = false; 5004 NoBinPacking.BinPackArguments = true; 5005 verifyFormat("void f() {\n" 5006 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5008 "}", 5009 NoBinPacking); 5010 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5011 " int aaaaaaaaaaaaaaaaaaaa,\n" 5012 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5013 NoBinPacking); 5014 5015 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5016 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5017 " vector<int> bbbbbbbbbbbbbbb);", 5018 NoBinPacking); 5019 // FIXME: This behavior difference is probably not wanted. However, currently 5020 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5021 // template arguments from BreakBeforeParameter being set because of the 5022 // one-per-line formatting. 5023 verifyFormat( 5024 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5025 " aaaaaaaaaa> aaaaaaaaaa);", 5026 NoBinPacking); 5027 verifyFormat( 5028 "void fffffffffff(\n" 5029 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5030 " aaaaaaaaaa);"); 5031 } 5032 5033 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5034 FormatStyle NoBinPacking = getGoogleStyle(); 5035 NoBinPacking.BinPackParameters = false; 5036 NoBinPacking.BinPackArguments = false; 5037 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5038 " aaaaaaaaaaaaaaaaaaaa,\n" 5039 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5040 NoBinPacking); 5041 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5042 " aaaaaaaaaaaaa,\n" 5043 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5044 NoBinPacking); 5045 verifyFormat( 5046 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5047 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5049 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5051 NoBinPacking); 5052 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5053 " .aaaaaaaaaaaaaaaaaa();", 5054 NoBinPacking); 5055 verifyFormat("void f() {\n" 5056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5057 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5058 "}", 5059 NoBinPacking); 5060 5061 verifyFormat( 5062 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5063 " aaaaaaaaaaaa,\n" 5064 " aaaaaaaaaaaa);", 5065 NoBinPacking); 5066 verifyFormat( 5067 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5068 " ddddddddddddddddddddddddddddd),\n" 5069 " test);", 5070 NoBinPacking); 5071 5072 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5073 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5074 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5075 " aaaaaaaaaaaaaaaaaa;", 5076 NoBinPacking); 5077 verifyFormat("a(\"a\"\n" 5078 " \"a\",\n" 5079 " a);"); 5080 5081 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5082 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5083 " aaaaaaaaa,\n" 5084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5085 NoBinPacking); 5086 verifyFormat( 5087 "void f() {\n" 5088 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5089 " .aaaaaaa();\n" 5090 "}", 5091 NoBinPacking); 5092 verifyFormat( 5093 "template <class SomeType, class SomeOtherType>\n" 5094 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5095 NoBinPacking); 5096 } 5097 5098 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5099 FormatStyle Style = getLLVMStyleWithColumns(15); 5100 Style.ExperimentalAutoDetectBinPacking = true; 5101 EXPECT_EQ("aaa(aaaa,\n" 5102 " aaaa,\n" 5103 " aaaa);\n" 5104 "aaa(aaaa,\n" 5105 " aaaa,\n" 5106 " aaaa);", 5107 format("aaa(aaaa,\n" // one-per-line 5108 " aaaa,\n" 5109 " aaaa );\n" 5110 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5111 Style)); 5112 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5113 " aaaa);\n" 5114 "aaa(aaaa, aaaa,\n" 5115 " aaaa);", 5116 format("aaa(aaaa, aaaa,\n" // bin-packed 5117 " aaaa );\n" 5118 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5119 Style)); 5120 } 5121 5122 TEST_F(FormatTest, FormatsBuilderPattern) { 5123 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5124 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5125 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5126 " .StartsWith(\".init\", ORDER_INIT)\n" 5127 " .StartsWith(\".fini\", ORDER_FINI)\n" 5128 " .StartsWith(\".hash\", ORDER_HASH)\n" 5129 " .Default(ORDER_TEXT);\n"); 5130 5131 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5132 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5133 verifyFormat( 5134 "aaaaaaa->aaaaaaa\n" 5135 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5137 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5138 verifyFormat( 5139 "aaaaaaa->aaaaaaa\n" 5140 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5141 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5142 verifyFormat( 5143 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5144 " aaaaaaaaaaaaaa);"); 5145 verifyFormat( 5146 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5147 " aaaaaa->aaaaaaaaaaaa()\n" 5148 " ->aaaaaaaaaaaaaaaa(\n" 5149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5150 " ->aaaaaaaaaaaaaaaaa();"); 5151 verifyGoogleFormat( 5152 "void f() {\n" 5153 " someo->Add((new util::filetools::Handler(dir))\n" 5154 " ->OnEvent1(NewPermanentCallback(\n" 5155 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5156 " ->OnEvent2(NewPermanentCallback(\n" 5157 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5158 " ->OnEvent3(NewPermanentCallback(\n" 5159 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5160 " ->OnEvent5(NewPermanentCallback(\n" 5161 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5162 " ->OnEvent6(NewPermanentCallback(\n" 5163 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5164 "}"); 5165 5166 verifyFormat( 5167 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5168 verifyFormat("aaaaaaaaaaaaaaa()\n" 5169 " .aaaaaaaaaaaaaaa()\n" 5170 " .aaaaaaaaaaaaaaa()\n" 5171 " .aaaaaaaaaaaaaaa()\n" 5172 " .aaaaaaaaaaaaaaa();"); 5173 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5174 " .aaaaaaaaaaaaaaa()\n" 5175 " .aaaaaaaaaaaaaaa()\n" 5176 " .aaaaaaaaaaaaaaa();"); 5177 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5178 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5179 " .aaaaaaaaaaaaaaa();"); 5180 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5181 " ->aaaaaaaaaaaaaae(0)\n" 5182 " ->aaaaaaaaaaaaaaa();"); 5183 5184 // Don't linewrap after very short segments. 5185 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5186 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5187 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5188 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5189 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5190 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5191 verifyFormat("aaa()\n" 5192 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5193 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5194 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5195 5196 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5197 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5198 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5199 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5200 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5201 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5202 5203 // Prefer not to break after empty parentheses. 5204 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5205 " First->LastNewlineOffset);"); 5206 5207 // Prefer not to create "hanging" indents. 5208 verifyFormat( 5209 "return !soooooooooooooome_map\n" 5210 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5211 " .second;"); 5212 verifyFormat( 5213 "return aaaaaaaaaaaaaaaa\n" 5214 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5215 " .aaaa(aaaaaaaaaaaaaa);"); 5216 // No hanging indent here. 5217 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5219 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5221 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5222 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5223 getLLVMStyleWithColumns(60)); 5224 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5225 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5226 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5227 getLLVMStyleWithColumns(59)); 5228 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5229 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5230 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5231 5232 // Dont break if only closing statements before member call 5233 verifyFormat("test() {\n" 5234 " ([]() -> {\n" 5235 " int b = 32;\n" 5236 " return 3;\n" 5237 " }).foo();\n" 5238 "}"); 5239 verifyFormat("test() {\n" 5240 " (\n" 5241 " []() -> {\n" 5242 " int b = 32;\n" 5243 " return 3;\n" 5244 " },\n" 5245 " foo, bar)\n" 5246 " .foo();\n" 5247 "}"); 5248 verifyFormat("test() {\n" 5249 " ([]() -> {\n" 5250 " int b = 32;\n" 5251 " return 3;\n" 5252 " })\n" 5253 " .foo()\n" 5254 " .bar();\n" 5255 "}"); 5256 verifyFormat("test() {\n" 5257 " ([]() -> {\n" 5258 " int b = 32;\n" 5259 " return 3;\n" 5260 " })\n" 5261 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5262 " \"bbbb\");\n" 5263 "}", 5264 getLLVMStyleWithColumns(30)); 5265 } 5266 5267 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5268 verifyFormat( 5269 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5270 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5271 verifyFormat( 5272 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5273 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5274 5275 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5276 " ccccccccccccccccccccccccc) {\n}"); 5277 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5278 " ccccccccccccccccccccccccc) {\n}"); 5279 5280 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5281 " ccccccccccccccccccccccccc) {\n}"); 5282 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5283 " ccccccccccccccccccccccccc) {\n}"); 5284 5285 verifyFormat( 5286 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5287 " ccccccccccccccccccccccccc) {\n}"); 5288 verifyFormat( 5289 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5290 " ccccccccccccccccccccccccc) {\n}"); 5291 5292 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5293 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5294 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5295 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5296 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5297 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5298 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5299 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5300 5301 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5302 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5303 " aaaaaaaaaaaaaaa != aa) {\n}"); 5304 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5305 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5306 " aaaaaaaaaaaaaaa != aa) {\n}"); 5307 } 5308 5309 TEST_F(FormatTest, BreaksAfterAssignments) { 5310 verifyFormat( 5311 "unsigned Cost =\n" 5312 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5313 " SI->getPointerAddressSpaceee());\n"); 5314 verifyFormat( 5315 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5316 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5317 5318 verifyFormat( 5319 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5320 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5321 verifyFormat("unsigned OriginalStartColumn =\n" 5322 " SourceMgr.getSpellingColumnNumber(\n" 5323 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5324 " 1;"); 5325 } 5326 5327 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5328 FormatStyle Style = getLLVMStyle(); 5329 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5330 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5331 Style); 5332 5333 Style.PenaltyBreakAssignment = 20; 5334 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5335 " cccccccccccccccccccccccccc;", 5336 Style); 5337 } 5338 5339 TEST_F(FormatTest, AlignsAfterAssignments) { 5340 verifyFormat( 5341 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5342 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5343 verifyFormat( 5344 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5345 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5346 verifyFormat( 5347 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5348 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5349 verifyFormat( 5350 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5351 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5352 verifyFormat( 5353 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5354 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5355 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5356 } 5357 5358 TEST_F(FormatTest, AlignsAfterReturn) { 5359 verifyFormat( 5360 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5361 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5362 verifyFormat( 5363 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5364 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5365 verifyFormat( 5366 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5367 " aaaaaaaaaaaaaaaaaaaaaa();"); 5368 verifyFormat( 5369 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5370 " aaaaaaaaaaaaaaaaaaaaaa());"); 5371 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5373 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5375 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5376 verifyFormat("return\n" 5377 " // true if code is one of a or b.\n" 5378 " code == a || code == b;"); 5379 } 5380 5381 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5382 verifyFormat( 5383 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5384 " aaaaaaaaa aaaaaaa) {}"); 5385 verifyFormat( 5386 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5387 " aaaaaaaaaaa aaaaaaaaa);"); 5388 verifyFormat( 5389 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5390 " aaaaaaaaaaaaaaaaaaaaa));"); 5391 FormatStyle Style = getLLVMStyle(); 5392 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5393 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5394 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5395 Style); 5396 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5397 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5398 Style); 5399 verifyFormat("SomeLongVariableName->someFunction(\n" 5400 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5401 Style); 5402 verifyFormat( 5403 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5404 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5405 Style); 5406 verifyFormat( 5407 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5408 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5409 Style); 5410 verifyFormat( 5411 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5412 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5413 Style); 5414 5415 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5416 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5417 " b));", 5418 Style); 5419 5420 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5421 Style.BinPackArguments = false; 5422 Style.BinPackParameters = false; 5423 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5424 " aaaaaaaaaaa aaaaaaaa,\n" 5425 " aaaaaaaaa aaaaaaa,\n" 5426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5427 Style); 5428 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5429 " aaaaaaaaaaa aaaaaaaaa,\n" 5430 " aaaaaaaaaaa aaaaaaaaa,\n" 5431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5432 Style); 5433 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5434 " aaaaaaaaaaaaaaa,\n" 5435 " aaaaaaaaaaaaaaaaaaaaa,\n" 5436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5437 Style); 5438 verifyFormat( 5439 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5440 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5441 Style); 5442 verifyFormat( 5443 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5444 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5445 Style); 5446 verifyFormat( 5447 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5448 " aaaaaaaaaaaaaaaaaaaaa(\n" 5449 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5450 " aaaaaaaaaaaaaaaa);", 5451 Style); 5452 verifyFormat( 5453 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5454 " aaaaaaaaaaaaaaaaaaaaa(\n" 5455 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5456 " aaaaaaaaaaaaaaaa);", 5457 Style); 5458 } 5459 5460 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5461 FormatStyle Style = getLLVMStyleWithColumns(40); 5462 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5463 " bbbbbbbbbbbbbbbbbbbbbb);", 5464 Style); 5465 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5466 Style.AlignOperands = false; 5467 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5468 " bbbbbbbbbbbbbbbbbbbbbb);", 5469 Style); 5470 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5471 Style.AlignOperands = true; 5472 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5473 " bbbbbbbbbbbbbbbbbbbbbb);", 5474 Style); 5475 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5476 Style.AlignOperands = false; 5477 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5478 " bbbbbbbbbbbbbbbbbbbbbb);", 5479 Style); 5480 } 5481 5482 TEST_F(FormatTest, BreaksConditionalExpressions) { 5483 verifyFormat( 5484 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5485 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5486 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5487 verifyFormat( 5488 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5489 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5490 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5491 verifyFormat( 5492 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5493 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5494 verifyFormat( 5495 "aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5496 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5497 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5498 verifyFormat( 5499 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5500 " : aaaaaaaaaaaaa);"); 5501 verifyFormat( 5502 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5503 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5504 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5505 " aaaaaaaaaaaaa);"); 5506 verifyFormat( 5507 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5508 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5509 " aaaaaaaaaaaaa);"); 5510 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5511 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5513 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5514 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5515 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5516 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5517 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5519 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5520 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5521 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5522 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5524 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5525 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5526 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5527 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5528 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5529 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5530 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5532 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5533 " : aaaaaaaaaaaaaaaa;"); 5534 verifyFormat( 5535 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5536 " ? aaaaaaaaaaaaaaa\n" 5537 " : aaaaaaaaaaaaaaa;"); 5538 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5539 " aaaaaaaaa\n" 5540 " ? b\n" 5541 " : c);"); 5542 verifyFormat("return aaaa == bbbb\n" 5543 " // comment\n" 5544 " ? aaaa\n" 5545 " : bbbb;"); 5546 verifyFormat("unsigned Indent =\n" 5547 " format(TheLine.First,\n" 5548 " IndentForLevel[TheLine.Level] >= 0\n" 5549 " ? IndentForLevel[TheLine.Level]\n" 5550 " : TheLine * 2,\n" 5551 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5552 getLLVMStyleWithColumns(60)); 5553 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5554 " ? aaaaaaaaaaaaaaa\n" 5555 " : bbbbbbbbbbbbbbb //\n" 5556 " ? ccccccccccccccc\n" 5557 " : ddddddddddddddd;"); 5558 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5559 " ? aaaaaaaaaaaaaaa\n" 5560 " : (bbbbbbbbbbbbbbb //\n" 5561 " ? ccccccccccccccc\n" 5562 " : ddddddddddddddd);"); 5563 verifyFormat( 5564 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5565 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5566 " aaaaaaaaaaaaaaaaaaaaa +\n" 5567 " aaaaaaaaaaaaaaaaaaaaa\n" 5568 " : aaaaaaaaaa;"); 5569 verifyFormat( 5570 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5571 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5572 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5573 5574 FormatStyle NoBinPacking = getLLVMStyle(); 5575 NoBinPacking.BinPackArguments = false; 5576 verifyFormat( 5577 "void f() {\n" 5578 " g(aaa,\n" 5579 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5581 " ? aaaaaaaaaaaaaaa\n" 5582 " : aaaaaaaaaaaaaaa);\n" 5583 "}", 5584 NoBinPacking); 5585 verifyFormat( 5586 "void f() {\n" 5587 " g(aaa,\n" 5588 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5590 " ?: aaaaaaaaaaaaaaa);\n" 5591 "}", 5592 NoBinPacking); 5593 5594 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5595 " // comment.\n" 5596 " ccccccccccccccccccccccccccccccccccccccc\n" 5597 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5598 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5599 5600 // Assignments in conditional expressions. Apparently not uncommon :-(. 5601 verifyFormat("return a != b\n" 5602 " // comment\n" 5603 " ? a = b\n" 5604 " : a = b;"); 5605 verifyFormat("return a != b\n" 5606 " // comment\n" 5607 " ? a = a != b\n" 5608 " // comment\n" 5609 " ? a = b\n" 5610 " : a\n" 5611 " : a;\n"); 5612 verifyFormat("return a != b\n" 5613 " // comment\n" 5614 " ? a\n" 5615 " : a = a != b\n" 5616 " // comment\n" 5617 " ? a = b\n" 5618 " : a;"); 5619 } 5620 5621 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5622 FormatStyle Style = getLLVMStyle(); 5623 Style.BreakBeforeTernaryOperators = false; 5624 Style.ColumnLimit = 70; 5625 verifyFormat( 5626 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5628 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5629 Style); 5630 verifyFormat( 5631 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5632 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5633 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5634 Style); 5635 verifyFormat( 5636 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5638 Style); 5639 verifyFormat( 5640 "aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5641 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5642 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5643 Style); 5644 verifyFormat( 5645 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 5646 " aaaaaaaaaaaaa);", 5647 Style); 5648 verifyFormat( 5649 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5650 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5651 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5652 " aaaaaaaaaaaaa);", 5653 Style); 5654 verifyFormat( 5655 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5656 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5657 " aaaaaaaaaaaaa);", 5658 Style); 5659 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5661 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5663 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5664 Style); 5665 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5666 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5669 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5671 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5672 Style); 5673 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5674 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 5675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5677 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5678 Style); 5679 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5680 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5681 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5682 Style); 5683 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5687 Style); 5688 verifyFormat( 5689 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5690 " aaaaaaaaaaaaaaa :\n" 5691 " aaaaaaaaaaaaaaa;", 5692 Style); 5693 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5694 " aaaaaaaaa ?\n" 5695 " b :\n" 5696 " c);", 5697 Style); 5698 verifyFormat("unsigned Indent =\n" 5699 " format(TheLine.First,\n" 5700 " IndentForLevel[TheLine.Level] >= 0 ?\n" 5701 " IndentForLevel[TheLine.Level] :\n" 5702 " TheLine * 2,\n" 5703 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5704 Style); 5705 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5706 " aaaaaaaaaaaaaaa :\n" 5707 " bbbbbbbbbbbbbbb ? //\n" 5708 " ccccccccccccccc :\n" 5709 " ddddddddddddddd;", 5710 Style); 5711 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5712 " aaaaaaaaaaaaaaa :\n" 5713 " (bbbbbbbbbbbbbbb ? //\n" 5714 " ccccccccccccccc :\n" 5715 " ddddddddddddddd);", 5716 Style); 5717 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5718 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 5719 " ccccccccccccccccccccccccccc;", 5720 Style); 5721 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5722 " aaaaa :\n" 5723 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 5724 Style); 5725 } 5726 5727 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 5728 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 5729 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 5730 verifyFormat("bool a = true, b = false;"); 5731 5732 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 5734 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 5735 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 5736 verifyFormat( 5737 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 5738 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 5739 " d = e && f;"); 5740 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 5741 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 5742 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5743 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 5744 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 5745 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 5746 5747 FormatStyle Style = getGoogleStyle(); 5748 Style.PointerAlignment = FormatStyle::PAS_Left; 5749 Style.DerivePointerAlignment = false; 5750 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5751 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 5752 " *b = bbbbbbbbbbbbbbbbbbb;", 5753 Style); 5754 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5755 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 5756 Style); 5757 verifyFormat("vector<int*> a, b;", Style); 5758 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 5759 } 5760 5761 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 5762 verifyFormat("arr[foo ? bar : baz];"); 5763 verifyFormat("f()[foo ? bar : baz];"); 5764 verifyFormat("(a + b)[foo ? bar : baz];"); 5765 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 5766 } 5767 5768 TEST_F(FormatTest, AlignsStringLiterals) { 5769 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 5770 " \"short literal\");"); 5771 verifyFormat( 5772 "looooooooooooooooooooooooongFunction(\n" 5773 " \"short literal\"\n" 5774 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 5775 verifyFormat("someFunction(\"Always break between multi-line\"\n" 5776 " \" string literals\",\n" 5777 " and, other, parameters);"); 5778 EXPECT_EQ("fun + \"1243\" /* comment */\n" 5779 " \"5678\";", 5780 format("fun + \"1243\" /* comment */\n" 5781 " \"5678\";", 5782 getLLVMStyleWithColumns(28))); 5783 EXPECT_EQ( 5784 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 5785 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 5786 " \"aaaaaaaaaaaaaaaa\";", 5787 format("aaaaaa =" 5788 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 5789 "aaaaaaaaaaaaaaaaaaaaa\" " 5790 "\"aaaaaaaaaaaaaaaa\";")); 5791 verifyFormat("a = a + \"a\"\n" 5792 " \"a\"\n" 5793 " \"a\";"); 5794 verifyFormat("f(\"a\", \"b\"\n" 5795 " \"c\");"); 5796 5797 verifyFormat( 5798 "#define LL_FORMAT \"ll\"\n" 5799 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 5800 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 5801 5802 verifyFormat("#define A(X) \\\n" 5803 " \"aaaaa\" #X \"bbbbbb\" \\\n" 5804 " \"ccccc\"", 5805 getLLVMStyleWithColumns(23)); 5806 verifyFormat("#define A \"def\"\n" 5807 "f(\"abc\" A \"ghi\"\n" 5808 " \"jkl\");"); 5809 5810 verifyFormat("f(L\"a\"\n" 5811 " L\"b\");"); 5812 verifyFormat("#define A(X) \\\n" 5813 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 5814 " L\"ccccc\"", 5815 getLLVMStyleWithColumns(25)); 5816 5817 verifyFormat("f(@\"a\"\n" 5818 " @\"b\");"); 5819 verifyFormat("NSString s = @\"a\"\n" 5820 " @\"b\"\n" 5821 " @\"c\";"); 5822 verifyFormat("NSString s = @\"a\"\n" 5823 " \"b\"\n" 5824 " \"c\";"); 5825 } 5826 5827 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 5828 FormatStyle Style = getLLVMStyle(); 5829 // No declarations or definitions should be moved to own line. 5830 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 5831 verifyFormat("class A {\n" 5832 " int f() { return 1; }\n" 5833 " int g();\n" 5834 "};\n" 5835 "int f() { return 1; }\n" 5836 "int g();\n", 5837 Style); 5838 5839 // All declarations and definitions should have the return type moved to its 5840 // own 5841 // line. 5842 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 5843 verifyFormat("class E {\n" 5844 " int\n" 5845 " f() {\n" 5846 " return 1;\n" 5847 " }\n" 5848 " int\n" 5849 " g();\n" 5850 "};\n" 5851 "int\n" 5852 "f() {\n" 5853 " return 1;\n" 5854 "}\n" 5855 "int\n" 5856 "g();\n", 5857 Style); 5858 5859 // Top-level definitions, and no kinds of declarations should have the 5860 // return type moved to its own line. 5861 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 5862 verifyFormat("class B {\n" 5863 " int f() { return 1; }\n" 5864 " int g();\n" 5865 "};\n" 5866 "int\n" 5867 "f() {\n" 5868 " return 1;\n" 5869 "}\n" 5870 "int g();\n", 5871 Style); 5872 5873 // Top-level definitions and declarations should have the return type moved 5874 // to its own line. 5875 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 5876 verifyFormat("class C {\n" 5877 " int f() { return 1; }\n" 5878 " int g();\n" 5879 "};\n" 5880 "int\n" 5881 "f() {\n" 5882 " return 1;\n" 5883 "}\n" 5884 "int\n" 5885 "g();\n", 5886 Style); 5887 5888 // All definitions should have the return type moved to its own line, but no 5889 // kinds of declarations. 5890 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 5891 verifyFormat("class D {\n" 5892 " int\n" 5893 " f() {\n" 5894 " return 1;\n" 5895 " }\n" 5896 " int g();\n" 5897 "};\n" 5898 "int\n" 5899 "f() {\n" 5900 " return 1;\n" 5901 "}\n" 5902 "int g();\n", 5903 Style); 5904 verifyFormat("const char *\n" 5905 "f(void) {\n" // Break here. 5906 " return \"\";\n" 5907 "}\n" 5908 "const char *bar(void);\n", // No break here. 5909 Style); 5910 verifyFormat("template <class T>\n" 5911 "T *\n" 5912 "f(T &c) {\n" // Break here. 5913 " return NULL;\n" 5914 "}\n" 5915 "template <class T> T *f(T &c);\n", // No break here. 5916 Style); 5917 verifyFormat("class C {\n" 5918 " int\n" 5919 " operator+() {\n" 5920 " return 1;\n" 5921 " }\n" 5922 " int\n" 5923 " operator()() {\n" 5924 " return 1;\n" 5925 " }\n" 5926 "};\n", 5927 Style); 5928 verifyFormat("void\n" 5929 "A::operator()() {}\n" 5930 "void\n" 5931 "A::operator>>() {}\n" 5932 "void\n" 5933 "A::operator+() {}\n", 5934 Style); 5935 verifyFormat("void *operator new(std::size_t s);", // No break here. 5936 Style); 5937 verifyFormat("void *\n" 5938 "operator new(std::size_t s) {}", 5939 Style); 5940 verifyFormat("void *\n" 5941 "operator delete[](void *ptr) {}", 5942 Style); 5943 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 5944 verifyFormat("const char *\n" 5945 "f(void)\n" // Break here. 5946 "{\n" 5947 " return \"\";\n" 5948 "}\n" 5949 "const char *bar(void);\n", // No break here. 5950 Style); 5951 verifyFormat("template <class T>\n" 5952 "T *\n" // Problem here: no line break 5953 "f(T &c)\n" // Break here. 5954 "{\n" 5955 " return NULL;\n" 5956 "}\n" 5957 "template <class T> T *f(T &c);\n", // No break here. 5958 Style); 5959 verifyFormat("int\n" 5960 "foo(A<bool> a)\n" 5961 "{\n" 5962 " return a;\n" 5963 "}\n", 5964 Style); 5965 verifyFormat("int\n" 5966 "foo(A<8> a)\n" 5967 "{\n" 5968 " return a;\n" 5969 "}\n", 5970 Style); 5971 verifyFormat("int\n" 5972 "foo(A<B<bool>, 8> a)\n" 5973 "{\n" 5974 " return a;\n" 5975 "}\n", 5976 Style); 5977 verifyFormat("int\n" 5978 "foo(A<B<8>, bool> a)\n" 5979 "{\n" 5980 " return a;\n" 5981 "}\n", 5982 Style); 5983 verifyFormat("int\n" 5984 "foo(A<B<bool>, bool> a)\n" 5985 "{\n" 5986 " return a;\n" 5987 "}\n", 5988 Style); 5989 verifyFormat("int\n" 5990 "foo(A<B<8>, 8> a)\n" 5991 "{\n" 5992 " return a;\n" 5993 "}\n", 5994 Style); 5995 5996 Style = getGNUStyle(); 5997 5998 // Test for comments at the end of function declarations. 5999 verifyFormat("void\n" 6000 "foo (int a, /*abc*/ int b) // def\n" 6001 "{\n" 6002 "}\n", 6003 Style); 6004 6005 verifyFormat("void\n" 6006 "foo (int a, /* abc */ int b) /* def */\n" 6007 "{\n" 6008 "}\n", 6009 Style); 6010 6011 // Definitions that should not break after return type 6012 verifyFormat("void foo (int a, int b); // def\n", Style); 6013 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6014 verifyFormat("void foo (int a, int b);\n", Style); 6015 } 6016 6017 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6018 FormatStyle NoBreak = getLLVMStyle(); 6019 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6020 FormatStyle Break = getLLVMStyle(); 6021 Break.AlwaysBreakBeforeMultilineStrings = true; 6022 verifyFormat("aaaa = \"bbbb\"\n" 6023 " \"cccc\";", 6024 NoBreak); 6025 verifyFormat("aaaa =\n" 6026 " \"bbbb\"\n" 6027 " \"cccc\";", 6028 Break); 6029 verifyFormat("aaaa(\"bbbb\"\n" 6030 " \"cccc\");", 6031 NoBreak); 6032 verifyFormat("aaaa(\n" 6033 " \"bbbb\"\n" 6034 " \"cccc\");", 6035 Break); 6036 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6037 " \"cccc\");", 6038 NoBreak); 6039 verifyFormat("aaaa(qqq,\n" 6040 " \"bbbb\"\n" 6041 " \"cccc\");", 6042 Break); 6043 verifyFormat("aaaa(qqq,\n" 6044 " L\"bbbb\"\n" 6045 " L\"cccc\");", 6046 Break); 6047 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6048 " \"bbbb\"));", 6049 Break); 6050 verifyFormat("string s = someFunction(\n" 6051 " \"abc\"\n" 6052 " \"abc\");", 6053 Break); 6054 6055 // As we break before unary operators, breaking right after them is bad. 6056 verifyFormat("string foo = abc ? \"x\"\n" 6057 " \"blah blah blah blah blah blah\"\n" 6058 " : \"y\";", 6059 Break); 6060 6061 // Don't break if there is no column gain. 6062 verifyFormat("f(\"aaaa\"\n" 6063 " \"bbbb\");", 6064 Break); 6065 6066 // Treat literals with escaped newlines like multi-line string literals. 6067 EXPECT_EQ("x = \"a\\\n" 6068 "b\\\n" 6069 "c\";", 6070 format("x = \"a\\\n" 6071 "b\\\n" 6072 "c\";", 6073 NoBreak)); 6074 EXPECT_EQ("xxxx =\n" 6075 " \"a\\\n" 6076 "b\\\n" 6077 "c\";", 6078 format("xxxx = \"a\\\n" 6079 "b\\\n" 6080 "c\";", 6081 Break)); 6082 6083 EXPECT_EQ("NSString *const kString =\n" 6084 " @\"aaaa\"\n" 6085 " @\"bbbb\";", 6086 format("NSString *const kString = @\"aaaa\"\n" 6087 "@\"bbbb\";", 6088 Break)); 6089 6090 Break.ColumnLimit = 0; 6091 verifyFormat("const char *hello = \"hello llvm\";", Break); 6092 } 6093 6094 TEST_F(FormatTest, AlignsPipes) { 6095 verifyFormat( 6096 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6097 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6098 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6099 verifyFormat( 6100 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6101 " << aaaaaaaaaaaaaaaaaaaa;"); 6102 verifyFormat( 6103 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6104 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6105 verifyFormat( 6106 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6107 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6108 verifyFormat( 6109 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6110 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6111 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6112 verifyFormat( 6113 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6114 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6115 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6116 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6117 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6119 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6120 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6121 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6122 verifyFormat( 6123 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6125 verifyFormat( 6126 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6127 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6128 6129 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6130 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6131 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6133 " aaaaaaaaaaaaaaaaaaaaa)\n" 6134 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6135 verifyFormat("LOG_IF(aaa == //\n" 6136 " bbb)\n" 6137 " << a << b;"); 6138 6139 // But sometimes, breaking before the first "<<" is desirable. 6140 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6141 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6142 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6143 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6144 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6145 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6146 " << BEF << IsTemplate << Description << E->getType();"); 6147 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6148 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6150 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6151 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6153 " << aaa;"); 6154 6155 verifyFormat( 6156 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6157 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6158 6159 // Incomplete string literal. 6160 EXPECT_EQ("llvm::errs() << \"\n" 6161 " << a;", 6162 format("llvm::errs() << \"\n<<a;")); 6163 6164 verifyFormat("void f() {\n" 6165 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6166 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6167 "}"); 6168 6169 // Handle 'endl'. 6170 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6171 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6172 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6173 6174 // Handle '\n'. 6175 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6176 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6177 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6178 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6179 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6180 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6181 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6182 } 6183 6184 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6185 verifyFormat("return out << \"somepacket = {\\n\"\n" 6186 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6187 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6188 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6189 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6190 " << \"}\";"); 6191 6192 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6193 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6194 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6195 verifyFormat( 6196 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6197 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6198 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6199 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6200 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6201 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6202 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6203 verifyFormat( 6204 "void f() {\n" 6205 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6206 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6207 "}"); 6208 6209 // Breaking before the first "<<" is generally not desirable. 6210 verifyFormat( 6211 "llvm::errs()\n" 6212 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6213 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6214 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6215 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6216 getLLVMStyleWithColumns(70)); 6217 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6218 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6219 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6220 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6221 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6222 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6223 getLLVMStyleWithColumns(70)); 6224 6225 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6226 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6227 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6228 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6229 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6230 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6231 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6232 " (aaaa + aaaa);", 6233 getLLVMStyleWithColumns(40)); 6234 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6235 " (aaaaaaa + aaaaa));", 6236 getLLVMStyleWithColumns(40)); 6237 verifyFormat( 6238 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6239 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6240 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6241 } 6242 6243 TEST_F(FormatTest, UnderstandsEquals) { 6244 verifyFormat( 6245 "aaaaaaaaaaaaaaaaa =\n" 6246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6247 verifyFormat( 6248 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6250 verifyFormat( 6251 "if (a) {\n" 6252 " f();\n" 6253 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6254 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6255 "}"); 6256 6257 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6258 " 100000000 + 10000000) {\n}"); 6259 } 6260 6261 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6262 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6263 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6264 6265 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6266 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6267 6268 verifyFormat( 6269 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6270 " Parameter2);"); 6271 6272 verifyFormat( 6273 "ShortObject->shortFunction(\n" 6274 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6275 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6276 6277 verifyFormat("loooooooooooooongFunction(\n" 6278 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6279 6280 verifyFormat( 6281 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6282 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6283 6284 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6285 " .WillRepeatedly(Return(SomeValue));"); 6286 verifyFormat("void f() {\n" 6287 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6288 " .Times(2)\n" 6289 " .WillRepeatedly(Return(SomeValue));\n" 6290 "}"); 6291 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6292 " ccccccccccccccccccccccc);"); 6293 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6295 " .aaaaa(aaaaa),\n" 6296 " aaaaaaaaaaaaaaaaaaaaa);"); 6297 verifyFormat("void f() {\n" 6298 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6299 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6300 "}"); 6301 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6303 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6304 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6305 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6306 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6307 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6308 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6309 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6310 "}"); 6311 6312 // Here, it is not necessary to wrap at "." or "->". 6313 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6314 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6315 verifyFormat( 6316 "aaaaaaaaaaa->aaaaaaaaa(\n" 6317 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6318 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6319 6320 verifyFormat( 6321 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6323 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6324 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6325 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6326 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6327 6328 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6329 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6330 " .a();"); 6331 6332 FormatStyle NoBinPacking = getLLVMStyle(); 6333 NoBinPacking.BinPackParameters = false; 6334 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6335 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6336 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6337 " aaaaaaaaaaaaaaaaaaa,\n" 6338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6339 NoBinPacking); 6340 6341 // If there is a subsequent call, change to hanging indentation. 6342 verifyFormat( 6343 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6344 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6345 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6346 verifyFormat( 6347 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6348 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6349 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6351 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6352 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6354 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6355 } 6356 6357 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6358 verifyFormat("template <typename T>\n" 6359 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6360 verifyFormat("template <typename T>\n" 6361 "// T should be one of {A, B}.\n" 6362 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6363 verifyFormat( 6364 "template <typename T>\n" 6365 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6366 verifyFormat("template <typename T>\n" 6367 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6368 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6369 verifyFormat( 6370 "template <typename T>\n" 6371 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6372 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6373 verifyFormat( 6374 "template <typename T>\n" 6375 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6376 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6378 verifyFormat("template <typename T>\n" 6379 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6380 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6381 verifyFormat( 6382 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6383 " typename T4 = char>\n" 6384 "void f();"); 6385 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6386 " template <typename> class cccccccccccccccccccccc,\n" 6387 " typename ddddddddddddd>\n" 6388 "class C {};"); 6389 verifyFormat( 6390 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6391 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6392 6393 verifyFormat("void f() {\n" 6394 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6395 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6396 "}"); 6397 6398 verifyFormat("template <typename T> class C {};"); 6399 verifyFormat("template <typename T> void f();"); 6400 verifyFormat("template <typename T> void f() {}"); 6401 verifyFormat( 6402 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6405 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6407 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6408 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6409 getLLVMStyleWithColumns(72)); 6410 EXPECT_EQ("static_cast<A< //\n" 6411 " B> *>(\n" 6412 "\n" 6413 ");", 6414 format("static_cast<A<//\n" 6415 " B>*>(\n" 6416 "\n" 6417 " );")); 6418 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6419 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6420 6421 FormatStyle AlwaysBreak = getLLVMStyle(); 6422 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6423 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6424 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6425 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6426 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6427 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6428 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6429 verifyFormat("template <template <typename> class Fooooooo,\n" 6430 " template <typename> class Baaaaaaar>\n" 6431 "struct C {};", 6432 AlwaysBreak); 6433 verifyFormat("template <typename T> // T can be A, B or C.\n" 6434 "struct C {};", 6435 AlwaysBreak); 6436 verifyFormat("template <enum E> class A {\n" 6437 "public:\n" 6438 " E *f();\n" 6439 "};"); 6440 6441 FormatStyle NeverBreak = getLLVMStyle(); 6442 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6443 verifyFormat("template <typename T> class C {};", NeverBreak); 6444 verifyFormat("template <typename T> void f();", NeverBreak); 6445 verifyFormat("template <typename T> void f() {}", NeverBreak); 6446 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}", 6447 NeverBreak); 6448 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6449 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6450 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6451 NeverBreak); 6452 verifyFormat("template <template <typename> class Fooooooo,\n" 6453 " template <typename> class Baaaaaaar>\n" 6454 "struct C {};", 6455 NeverBreak); 6456 verifyFormat("template <typename T> // T can be A, B or C.\n" 6457 "struct C {};", 6458 NeverBreak); 6459 verifyFormat("template <enum E> class A {\n" 6460 "public:\n" 6461 " E *f();\n" 6462 "};", NeverBreak); 6463 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6464 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}", 6465 NeverBreak); 6466 } 6467 6468 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6469 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6470 Style.ColumnLimit = 60; 6471 EXPECT_EQ("// Baseline - no comments.\n" 6472 "template <\n" 6473 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6474 "void f() {}", 6475 format("// Baseline - no comments.\n" 6476 "template <\n" 6477 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6478 "void f() {}", 6479 Style)); 6480 6481 EXPECT_EQ("template <\n" 6482 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6483 "void f() {}", 6484 format("template <\n" 6485 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6486 "void f() {}", 6487 Style)); 6488 6489 EXPECT_EQ( 6490 "template <\n" 6491 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6492 "void f() {}", 6493 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6494 "void f() {}", 6495 Style)); 6496 6497 EXPECT_EQ( 6498 "template <\n" 6499 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6500 " // multiline\n" 6501 "void f() {}", 6502 format("template <\n" 6503 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6504 " // multiline\n" 6505 "void f() {}", 6506 Style)); 6507 6508 EXPECT_EQ( 6509 "template <typename aaaaaaaaaa<\n" 6510 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6511 "void f() {}", 6512 format( 6513 "template <\n" 6514 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6515 "void f() {}", 6516 Style)); 6517 } 6518 6519 TEST_F(FormatTest, WrapsTemplateParameters) { 6520 FormatStyle Style = getLLVMStyle(); 6521 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6522 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6523 verifyFormat( 6524 "template <typename... a> struct q {};\n" 6525 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6526 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6527 " y;", 6528 Style); 6529 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6530 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6531 verifyFormat( 6532 "template <typename... a> struct r {};\n" 6533 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6534 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6535 " y;", 6536 Style); 6537 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6538 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6539 verifyFormat( 6540 "template <typename... a> struct s {};\n" 6541 "extern s<\n" 6542 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 6543 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 6544 " y;", 6545 Style); 6546 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6547 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6548 verifyFormat( 6549 "template <typename... a> struct t {};\n" 6550 "extern t<\n" 6551 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 6552 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 6553 " y;", 6554 Style); 6555 } 6556 6557 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6558 verifyFormat( 6559 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6560 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6561 verifyFormat( 6562 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6563 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6565 6566 // FIXME: Should we have the extra indent after the second break? 6567 verifyFormat( 6568 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6571 6572 verifyFormat( 6573 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6574 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6575 6576 // Breaking at nested name specifiers is generally not desirable. 6577 verifyFormat( 6578 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6579 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6580 6581 verifyFormat( 6582 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 6583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6585 " aaaaaaaaaaaaaaaaaaaaa);", 6586 getLLVMStyleWithColumns(74)); 6587 6588 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6590 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6591 } 6592 6593 TEST_F(FormatTest, UnderstandsTemplateParameters) { 6594 verifyFormat("A<int> a;"); 6595 verifyFormat("A<A<A<int>>> a;"); 6596 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 6597 verifyFormat("bool x = a < 1 || 2 > a;"); 6598 verifyFormat("bool x = 5 < f<int>();"); 6599 verifyFormat("bool x = f<int>() > 5;"); 6600 verifyFormat("bool x = 5 < a<int>::x;"); 6601 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 6602 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 6603 6604 verifyGoogleFormat("A<A<int>> a;"); 6605 verifyGoogleFormat("A<A<A<int>>> a;"); 6606 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 6607 verifyGoogleFormat("A<A<int> > a;"); 6608 verifyGoogleFormat("A<A<A<int> > > a;"); 6609 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 6610 verifyGoogleFormat("A<::A<int>> a;"); 6611 verifyGoogleFormat("A<::A> a;"); 6612 verifyGoogleFormat("A< ::A> a;"); 6613 verifyGoogleFormat("A< ::A<int> > a;"); 6614 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 6615 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 6616 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 6617 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 6618 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 6619 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 6620 6621 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 6622 6623 // template closer followed by a token that starts with > or = 6624 verifyFormat("bool b = a<1> > 1;"); 6625 verifyFormat("bool b = a<1> >= 1;"); 6626 verifyFormat("int i = a<1> >> 1;"); 6627 FormatStyle Style = getLLVMStyle(); 6628 Style.SpaceBeforeAssignmentOperators = false; 6629 verifyFormat("bool b= a<1> == 1;", Style); 6630 verifyFormat("a<int> = 1;", Style); 6631 verifyFormat("a<int> >>= 1;", Style); 6632 6633 verifyFormat("test >> a >> b;"); 6634 verifyFormat("test << a >> b;"); 6635 6636 verifyFormat("f<int>();"); 6637 verifyFormat("template <typename T> void f() {}"); 6638 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 6639 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 6640 "sizeof(char)>::type>;"); 6641 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 6642 verifyFormat("f(a.operator()<A>());"); 6643 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6644 " .template operator()<A>());", 6645 getLLVMStyleWithColumns(35)); 6646 6647 // Not template parameters. 6648 verifyFormat("return a < b && c > d;"); 6649 verifyFormat("void f() {\n" 6650 " while (a < b && c > d) {\n" 6651 " }\n" 6652 "}"); 6653 verifyFormat("template <typename... Types>\n" 6654 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 6655 6656 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6657 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 6658 getLLVMStyleWithColumns(60)); 6659 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 6660 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 6661 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 6662 } 6663 6664 TEST_F(FormatTest, BitshiftOperatorWidth) { 6665 EXPECT_EQ("int a = 1 << 2; /* foo\n" 6666 " bar */", 6667 format("int a=1<<2; /* foo\n" 6668 " bar */")); 6669 6670 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 6671 " bar */", 6672 format("int b =256>>1 ; /* foo\n" 6673 " bar */")); 6674 } 6675 6676 TEST_F(FormatTest, UnderstandsBinaryOperators) { 6677 verifyFormat("COMPARE(a, ==, b);"); 6678 verifyFormat("auto s = sizeof...(Ts) - 1;"); 6679 } 6680 6681 TEST_F(FormatTest, UnderstandsPointersToMembers) { 6682 verifyFormat("int A::*x;"); 6683 verifyFormat("int (S::*func)(void *);"); 6684 verifyFormat("void f() { int (S::*func)(void *); }"); 6685 verifyFormat("typedef bool *(Class::*Member)() const;"); 6686 verifyFormat("void f() {\n" 6687 " (a->*f)();\n" 6688 " a->*x;\n" 6689 " (a.*f)();\n" 6690 " ((*a).*f)();\n" 6691 " a.*x;\n" 6692 "}"); 6693 verifyFormat("void f() {\n" 6694 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 6695 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 6696 "}"); 6697 verifyFormat( 6698 "(aaaaaaaaaa->*bbbbbbb)(\n" 6699 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6700 FormatStyle Style = getLLVMStyle(); 6701 Style.PointerAlignment = FormatStyle::PAS_Left; 6702 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 6703 } 6704 6705 TEST_F(FormatTest, UnderstandsUnaryOperators) { 6706 verifyFormat("int a = -2;"); 6707 verifyFormat("f(-1, -2, -3);"); 6708 verifyFormat("a[-1] = 5;"); 6709 verifyFormat("int a = 5 + -2;"); 6710 verifyFormat("if (i == -1) {\n}"); 6711 verifyFormat("if (i != -1) {\n}"); 6712 verifyFormat("if (i > -1) {\n}"); 6713 verifyFormat("if (i < -1) {\n}"); 6714 verifyFormat("++(a->f());"); 6715 verifyFormat("--(a->f());"); 6716 verifyFormat("(a->f())++;"); 6717 verifyFormat("a[42]++;"); 6718 verifyFormat("if (!(a->f())) {\n}"); 6719 verifyFormat("if (!+i) {\n}"); 6720 verifyFormat("~&a;"); 6721 6722 verifyFormat("a-- > b;"); 6723 verifyFormat("b ? -a : c;"); 6724 verifyFormat("n * sizeof char16;"); 6725 verifyFormat("n * alignof char16;", getGoogleStyle()); 6726 verifyFormat("sizeof(char);"); 6727 verifyFormat("alignof(char);", getGoogleStyle()); 6728 6729 verifyFormat("return -1;"); 6730 verifyFormat("switch (a) {\n" 6731 "case -1:\n" 6732 " break;\n" 6733 "}"); 6734 verifyFormat("#define X -1"); 6735 verifyFormat("#define X -kConstant"); 6736 6737 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 6738 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 6739 6740 verifyFormat("int a = /* confusing comment */ -1;"); 6741 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 6742 verifyFormat("int a = i /* confusing comment */++;"); 6743 } 6744 6745 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 6746 verifyFormat("if (!aaaaaaaaaa( // break\n" 6747 " aaaaa)) {\n" 6748 "}"); 6749 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 6750 " aaaaa));"); 6751 verifyFormat("*aaa = aaaaaaa( // break\n" 6752 " bbbbbb);"); 6753 } 6754 6755 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 6756 verifyFormat("bool operator<();"); 6757 verifyFormat("bool operator>();"); 6758 verifyFormat("bool operator=();"); 6759 verifyFormat("bool operator==();"); 6760 verifyFormat("bool operator!=();"); 6761 verifyFormat("int operator+();"); 6762 verifyFormat("int operator++();"); 6763 verifyFormat("int operator++(int) volatile noexcept;"); 6764 verifyFormat("bool operator,();"); 6765 verifyFormat("bool operator();"); 6766 verifyFormat("bool operator()();"); 6767 verifyFormat("bool operator[]();"); 6768 verifyFormat("operator bool();"); 6769 verifyFormat("operator int();"); 6770 verifyFormat("operator void *();"); 6771 verifyFormat("operator SomeType<int>();"); 6772 verifyFormat("operator SomeType<int, int>();"); 6773 verifyFormat("operator SomeType<SomeType<int>>();"); 6774 verifyFormat("void *operator new(std::size_t size);"); 6775 verifyFormat("void *operator new[](std::size_t size);"); 6776 verifyFormat("void operator delete(void *ptr);"); 6777 verifyFormat("void operator delete[](void *ptr);"); 6778 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 6779 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 6780 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 6781 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 6782 6783 verifyFormat( 6784 "ostream &operator<<(ostream &OutputStream,\n" 6785 " SomeReallyLongType WithSomeReallyLongValue);"); 6786 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 6787 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 6788 " return left.group < right.group;\n" 6789 "}"); 6790 verifyFormat("SomeType &operator=(const SomeType &S);"); 6791 verifyFormat("f.template operator()<int>();"); 6792 6793 verifyGoogleFormat("operator void*();"); 6794 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 6795 verifyGoogleFormat("operator ::A();"); 6796 6797 verifyFormat("using A::operator+;"); 6798 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 6799 "int i;"); 6800 } 6801 6802 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 6803 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 6804 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 6805 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 6806 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 6807 verifyFormat("Deleted &operator=(const Deleted &) &;"); 6808 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 6809 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 6810 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 6811 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 6812 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 6813 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 6814 verifyFormat("void Fn(T const &) const &;"); 6815 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 6816 verifyFormat("template <typename T>\n" 6817 "void F(T) && = delete;", 6818 getGoogleStyle()); 6819 6820 FormatStyle AlignLeft = getLLVMStyle(); 6821 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 6822 verifyFormat("void A::b() && {}", AlignLeft); 6823 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 6824 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 6825 AlignLeft); 6826 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 6827 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 6828 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 6829 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 6830 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 6831 verifyFormat("auto Function(T) & -> void;", AlignLeft); 6832 verifyFormat("void Fn(T const&) const&;", AlignLeft); 6833 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 6834 6835 FormatStyle Spaces = getLLVMStyle(); 6836 Spaces.SpacesInCStyleCastParentheses = true; 6837 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 6838 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 6839 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 6840 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 6841 6842 Spaces.SpacesInCStyleCastParentheses = false; 6843 Spaces.SpacesInParentheses = true; 6844 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 6845 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces); 6846 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 6847 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 6848 } 6849 6850 TEST_F(FormatTest, UnderstandsNewAndDelete) { 6851 verifyFormat("void f() {\n" 6852 " A *a = new A;\n" 6853 " A *a = new (placement) A;\n" 6854 " delete a;\n" 6855 " delete (A *)a;\n" 6856 "}"); 6857 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 6858 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 6859 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6860 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 6861 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 6862 verifyFormat("delete[] h->p;"); 6863 } 6864 6865 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 6866 verifyFormat("int *f(int *a) {}"); 6867 verifyFormat("int main(int argc, char **argv) {}"); 6868 verifyFormat("Test::Test(int b) : a(b * b) {}"); 6869 verifyIndependentOfContext("f(a, *a);"); 6870 verifyFormat("void g() { f(*a); }"); 6871 verifyIndependentOfContext("int a = b * 10;"); 6872 verifyIndependentOfContext("int a = 10 * b;"); 6873 verifyIndependentOfContext("int a = b * c;"); 6874 verifyIndependentOfContext("int a += b * c;"); 6875 verifyIndependentOfContext("int a -= b * c;"); 6876 verifyIndependentOfContext("int a *= b * c;"); 6877 verifyIndependentOfContext("int a /= b * c;"); 6878 verifyIndependentOfContext("int a = *b;"); 6879 verifyIndependentOfContext("int a = *b * c;"); 6880 verifyIndependentOfContext("int a = b * *c;"); 6881 verifyIndependentOfContext("int a = b * (10);"); 6882 verifyIndependentOfContext("S << b * (10);"); 6883 verifyIndependentOfContext("return 10 * b;"); 6884 verifyIndependentOfContext("return *b * *c;"); 6885 verifyIndependentOfContext("return a & ~b;"); 6886 verifyIndependentOfContext("f(b ? *c : *d);"); 6887 verifyIndependentOfContext("int a = b ? *c : *d;"); 6888 verifyIndependentOfContext("*b = a;"); 6889 verifyIndependentOfContext("a * ~b;"); 6890 verifyIndependentOfContext("a * !b;"); 6891 verifyIndependentOfContext("a * +b;"); 6892 verifyIndependentOfContext("a * -b;"); 6893 verifyIndependentOfContext("a * ++b;"); 6894 verifyIndependentOfContext("a * --b;"); 6895 verifyIndependentOfContext("a[4] * b;"); 6896 verifyIndependentOfContext("a[a * a] = 1;"); 6897 verifyIndependentOfContext("f() * b;"); 6898 verifyIndependentOfContext("a * [self dostuff];"); 6899 verifyIndependentOfContext("int x = a * (a + b);"); 6900 verifyIndependentOfContext("(a *)(a + b);"); 6901 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 6902 verifyIndependentOfContext("int *pa = (int *)&a;"); 6903 verifyIndependentOfContext("return sizeof(int **);"); 6904 verifyIndependentOfContext("return sizeof(int ******);"); 6905 verifyIndependentOfContext("return (int **&)a;"); 6906 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 6907 verifyFormat("void f(Type (*parameter)[10]) {}"); 6908 verifyFormat("void f(Type (¶meter)[10]) {}"); 6909 verifyGoogleFormat("return sizeof(int**);"); 6910 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 6911 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 6912 verifyFormat("auto a = [](int **&, int ***) {};"); 6913 verifyFormat("auto PointerBinding = [](const char *S) {};"); 6914 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 6915 verifyFormat("[](const decltype(*a) &value) {}"); 6916 verifyFormat("decltype(a * b) F();"); 6917 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 6918 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 6919 verifyIndependentOfContext("typedef void (*f)(int *a);"); 6920 verifyIndependentOfContext("int i{a * b};"); 6921 verifyIndependentOfContext("aaa && aaa->f();"); 6922 verifyIndependentOfContext("int x = ~*p;"); 6923 verifyFormat("Constructor() : a(a), area(width * height) {}"); 6924 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 6925 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 6926 verifyFormat("void f() { f(a, c * d); }"); 6927 verifyFormat("void f() { f(new a(), c * d); }"); 6928 verifyFormat("void f(const MyOverride &override);"); 6929 verifyFormat("void f(const MyFinal &final);"); 6930 verifyIndependentOfContext("bool a = f() && override.f();"); 6931 verifyIndependentOfContext("bool a = f() && final.f();"); 6932 6933 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 6934 6935 verifyIndependentOfContext("A<int *> a;"); 6936 verifyIndependentOfContext("A<int **> a;"); 6937 verifyIndependentOfContext("A<int *, int *> a;"); 6938 verifyIndependentOfContext("A<int *[]> a;"); 6939 verifyIndependentOfContext( 6940 "const char *const p = reinterpret_cast<const char *const>(q);"); 6941 verifyIndependentOfContext("A<int **, int **> a;"); 6942 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 6943 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 6944 verifyFormat("for (; a && b;) {\n}"); 6945 verifyFormat("bool foo = true && [] { return false; }();"); 6946 6947 verifyFormat( 6948 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6950 6951 verifyGoogleFormat("int const* a = &b;"); 6952 verifyGoogleFormat("**outparam = 1;"); 6953 verifyGoogleFormat("*outparam = a * b;"); 6954 verifyGoogleFormat("int main(int argc, char** argv) {}"); 6955 verifyGoogleFormat("A<int*> a;"); 6956 verifyGoogleFormat("A<int**> a;"); 6957 verifyGoogleFormat("A<int*, int*> a;"); 6958 verifyGoogleFormat("A<int**, int**> a;"); 6959 verifyGoogleFormat("f(b ? *c : *d);"); 6960 verifyGoogleFormat("int a = b ? *c : *d;"); 6961 verifyGoogleFormat("Type* t = **x;"); 6962 verifyGoogleFormat("Type* t = *++*x;"); 6963 verifyGoogleFormat("*++*x;"); 6964 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 6965 verifyGoogleFormat("Type* t = x++ * y;"); 6966 verifyGoogleFormat( 6967 "const char* const p = reinterpret_cast<const char* const>(q);"); 6968 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 6969 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 6970 verifyGoogleFormat("template <typename T>\n" 6971 "void f(int i = 0, SomeType** temps = NULL);"); 6972 6973 FormatStyle Left = getLLVMStyle(); 6974 Left.PointerAlignment = FormatStyle::PAS_Left; 6975 verifyFormat("x = *a(x) = *a(y);", Left); 6976 verifyFormat("for (;; *a = b) {\n}", Left); 6977 verifyFormat("return *this += 1;", Left); 6978 verifyFormat("throw *x;", Left); 6979 verifyFormat("delete *x;", Left); 6980 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 6981 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 6982 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 6983 6984 verifyIndependentOfContext("a = *(x + y);"); 6985 verifyIndependentOfContext("a = &(x + y);"); 6986 verifyIndependentOfContext("*(x + y).call();"); 6987 verifyIndependentOfContext("&(x + y)->call();"); 6988 verifyFormat("void f() { &(*I).first; }"); 6989 6990 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 6991 verifyFormat( 6992 "int *MyValues = {\n" 6993 " *A, // Operator detection might be confused by the '{'\n" 6994 " *BB // Operator detection might be confused by previous comment\n" 6995 "};"); 6996 6997 verifyIndependentOfContext("if (int *a = &b)"); 6998 verifyIndependentOfContext("if (int &a = *b)"); 6999 verifyIndependentOfContext("if (a & b[i])"); 7000 verifyIndependentOfContext("if constexpr (a & b[i])"); 7001 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7002 verifyIndependentOfContext("if (a * (b * c))"); 7003 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7004 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7005 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7006 verifyIndependentOfContext("if (*b[i])"); 7007 verifyIndependentOfContext("if (int *a = (&b))"); 7008 verifyIndependentOfContext("while (int *a = &b)"); 7009 verifyIndependentOfContext("while (a * (b * c))"); 7010 verifyIndependentOfContext("size = sizeof *a;"); 7011 verifyIndependentOfContext("if (a && (b = c))"); 7012 verifyFormat("void f() {\n" 7013 " for (const int &v : Values) {\n" 7014 " }\n" 7015 "}"); 7016 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7017 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7018 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7019 7020 verifyFormat("#define A (!a * b)"); 7021 verifyFormat("#define MACRO \\\n" 7022 " int *i = a * b; \\\n" 7023 " void f(a *b);", 7024 getLLVMStyleWithColumns(19)); 7025 7026 verifyIndependentOfContext("A = new SomeType *[Length];"); 7027 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7028 verifyIndependentOfContext("T **t = new T *;"); 7029 verifyIndependentOfContext("T **t = new T *();"); 7030 verifyGoogleFormat("A = new SomeType*[Length]();"); 7031 verifyGoogleFormat("A = new SomeType*[Length];"); 7032 verifyGoogleFormat("T** t = new T*;"); 7033 verifyGoogleFormat("T** t = new T*();"); 7034 7035 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7036 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7037 verifyFormat("template <bool a, bool b> " 7038 "typename t::if<x && y>::type f() {}"); 7039 verifyFormat("template <int *y> f() {}"); 7040 verifyFormat("vector<int *> v;"); 7041 verifyFormat("vector<int *const> v;"); 7042 verifyFormat("vector<int *const **const *> v;"); 7043 verifyFormat("vector<int *volatile> v;"); 7044 verifyFormat("vector<a * b> v;"); 7045 verifyFormat("foo<b && false>();"); 7046 verifyFormat("foo<b & 1>();"); 7047 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7048 verifyFormat( 7049 "template <class T, class = typename std::enable_if<\n" 7050 " std::is_integral<T>::value &&\n" 7051 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7052 "void F();", 7053 getLLVMStyleWithColumns(70)); 7054 verifyFormat( 7055 "template <class T,\n" 7056 " class = typename std::enable_if<\n" 7057 " std::is_integral<T>::value &&\n" 7058 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7059 " class U>\n" 7060 "void F();", 7061 getLLVMStyleWithColumns(70)); 7062 verifyFormat( 7063 "template <class T,\n" 7064 " class = typename ::std::enable_if<\n" 7065 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7066 "void F();", 7067 getGoogleStyleWithColumns(68)); 7068 7069 verifyIndependentOfContext("MACRO(int *i);"); 7070 verifyIndependentOfContext("MACRO(auto *a);"); 7071 verifyIndependentOfContext("MACRO(const A *a);"); 7072 verifyIndependentOfContext("MACRO(A *const a);"); 7073 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7074 verifyFormat("void f() { f(float{1}, a * a); }"); 7075 // FIXME: Is there a way to make this work? 7076 // verifyIndependentOfContext("MACRO(A *a);"); 7077 7078 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7079 verifyFormat("return options != nullptr && operator==(*options);"); 7080 7081 EXPECT_EQ("#define OP(x) \\\n" 7082 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7083 " return s << a.DebugString(); \\\n" 7084 " }", 7085 format("#define OP(x) \\\n" 7086 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7087 " return s << a.DebugString(); \\\n" 7088 " }", 7089 getLLVMStyleWithColumns(50))); 7090 7091 // FIXME: We cannot handle this case yet; we might be able to figure out that 7092 // foo<x> d > v; doesn't make sense. 7093 verifyFormat("foo<a<b && c> d> v;"); 7094 7095 FormatStyle PointerMiddle = getLLVMStyle(); 7096 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7097 verifyFormat("delete *x;", PointerMiddle); 7098 verifyFormat("int * x;", PointerMiddle); 7099 verifyFormat("int *[] x;", PointerMiddle); 7100 verifyFormat("template <int * y> f() {}", PointerMiddle); 7101 verifyFormat("int * f(int * a) {}", PointerMiddle); 7102 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7103 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7104 verifyFormat("A<int *> a;", PointerMiddle); 7105 verifyFormat("A<int **> a;", PointerMiddle); 7106 verifyFormat("A<int *, int *> a;", PointerMiddle); 7107 verifyFormat("A<int *[]> a;", PointerMiddle); 7108 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7109 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7110 verifyFormat("T ** t = new T *;", PointerMiddle); 7111 7112 // Member function reference qualifiers aren't binary operators. 7113 verifyFormat("string // break\n" 7114 "operator()() & {}"); 7115 verifyFormat("string // break\n" 7116 "operator()() && {}"); 7117 verifyGoogleFormat("template <typename T>\n" 7118 "auto x() & -> int {}"); 7119 } 7120 7121 TEST_F(FormatTest, UnderstandsAttributes) { 7122 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7123 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7124 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7125 FormatStyle AfterType = getLLVMStyle(); 7126 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7127 verifyFormat("__attribute__((nodebug)) void\n" 7128 "foo() {}\n", 7129 AfterType); 7130 } 7131 7132 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7133 verifyFormat("SomeType s [[unused]] (InitValue);"); 7134 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7135 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7136 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7137 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7138 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7139 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7140 7141 // Make sure we do not mistake attributes for array subscripts. 7142 verifyFormat("int a() {}\n" 7143 "[[unused]] int b() {}\n"); 7144 verifyFormat("NSArray *arr;\n" 7145 "arr[[Foo() bar]];"); 7146 7147 // On the other hand, we still need to correctly find array subscripts. 7148 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7149 7150 // Make sure that we do not mistake Objective-C method inside array literals 7151 // as attributes, even if those method names are also keywords. 7152 verifyFormat("@[ [foo bar] ];"); 7153 verifyFormat("@[ [NSArray class] ];"); 7154 verifyFormat("@[ [foo enum] ];"); 7155 7156 // Make sure we do not parse attributes as lambda introducers. 7157 FormatStyle MultiLineFunctions = getLLVMStyle(); 7158 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7159 verifyFormat("[[unused]] int b() {\n" 7160 " return 42;\n" 7161 "}\n", 7162 MultiLineFunctions); 7163 } 7164 7165 TEST_F(FormatTest, UnderstandsEllipsis) { 7166 verifyFormat("int printf(const char *fmt, ...);"); 7167 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7168 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7169 7170 FormatStyle PointersLeft = getLLVMStyle(); 7171 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7172 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7173 } 7174 7175 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7176 EXPECT_EQ("int *a;\n" 7177 "int *a;\n" 7178 "int *a;", 7179 format("int *a;\n" 7180 "int* a;\n" 7181 "int *a;", 7182 getGoogleStyle())); 7183 EXPECT_EQ("int* a;\n" 7184 "int* a;\n" 7185 "int* a;", 7186 format("int* a;\n" 7187 "int* a;\n" 7188 "int *a;", 7189 getGoogleStyle())); 7190 EXPECT_EQ("int *a;\n" 7191 "int *a;\n" 7192 "int *a;", 7193 format("int *a;\n" 7194 "int * a;\n" 7195 "int * a;", 7196 getGoogleStyle())); 7197 EXPECT_EQ("auto x = [] {\n" 7198 " int *a;\n" 7199 " int *a;\n" 7200 " int *a;\n" 7201 "};", 7202 format("auto x=[]{int *a;\n" 7203 "int * a;\n" 7204 "int * a;};", 7205 getGoogleStyle())); 7206 } 7207 7208 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7209 verifyFormat("int f(int &&a) {}"); 7210 verifyFormat("int f(int a, char &&b) {}"); 7211 verifyFormat("void f() { int &&a = b; }"); 7212 verifyGoogleFormat("int f(int a, char&& b) {}"); 7213 verifyGoogleFormat("void f() { int&& a = b; }"); 7214 7215 verifyIndependentOfContext("A<int &&> a;"); 7216 verifyIndependentOfContext("A<int &&, int &&> a;"); 7217 verifyGoogleFormat("A<int&&> a;"); 7218 verifyGoogleFormat("A<int&&, int&&> a;"); 7219 7220 // Not rvalue references: 7221 verifyFormat("template <bool B, bool C> class A {\n" 7222 " static_assert(B && C, \"Something is wrong\");\n" 7223 "};"); 7224 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7225 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7226 verifyFormat("#define A(a, b) (a && b)"); 7227 } 7228 7229 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7230 verifyFormat("void f() {\n" 7231 " x[aaaaaaaaa -\n" 7232 " b] = 23;\n" 7233 "}", 7234 getLLVMStyleWithColumns(15)); 7235 } 7236 7237 TEST_F(FormatTest, FormatsCasts) { 7238 verifyFormat("Type *A = static_cast<Type *>(P);"); 7239 verifyFormat("Type *A = (Type *)P;"); 7240 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7241 verifyFormat("int a = (int)(2.0f);"); 7242 verifyFormat("int a = (int)2.0f;"); 7243 verifyFormat("x[(int32)y];"); 7244 verifyFormat("x = (int32)y;"); 7245 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7246 verifyFormat("int a = (int)*b;"); 7247 verifyFormat("int a = (int)2.0f;"); 7248 verifyFormat("int a = (int)~0;"); 7249 verifyFormat("int a = (int)++a;"); 7250 verifyFormat("int a = (int)sizeof(int);"); 7251 verifyFormat("int a = (int)+2;"); 7252 verifyFormat("my_int a = (my_int)2.0f;"); 7253 verifyFormat("my_int a = (my_int)sizeof(int);"); 7254 verifyFormat("return (my_int)aaa;"); 7255 verifyFormat("#define x ((int)-1)"); 7256 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7257 verifyFormat("#define p(q) ((int *)&q)"); 7258 verifyFormat("fn(a)(b) + 1;"); 7259 7260 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7261 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7262 verifyFormat("my_int a = (my_int)~0;"); 7263 verifyFormat("my_int a = (my_int)++a;"); 7264 verifyFormat("my_int a = (my_int)-2;"); 7265 verifyFormat("my_int a = (my_int)1;"); 7266 verifyFormat("my_int a = (my_int *)1;"); 7267 verifyFormat("my_int a = (const my_int)-1;"); 7268 verifyFormat("my_int a = (const my_int *)-1;"); 7269 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7270 verifyFormat("my_int a = (ns::my_int)-2;"); 7271 verifyFormat("case (my_int)ONE:"); 7272 verifyFormat("auto x = (X)this;"); 7273 7274 // FIXME: single value wrapped with paren will be treated as cast. 7275 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7276 7277 verifyFormat("{ (void)F; }"); 7278 7279 // Don't break after a cast's 7280 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7281 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7282 " bbbbbbbbbbbbbbbbbbbbbb);"); 7283 7284 // These are not casts. 7285 verifyFormat("void f(int *) {}"); 7286 verifyFormat("f(foo)->b;"); 7287 verifyFormat("f(foo).b;"); 7288 verifyFormat("f(foo)(b);"); 7289 verifyFormat("f(foo)[b];"); 7290 verifyFormat("[](foo) { return 4; }(bar);"); 7291 verifyFormat("(*funptr)(foo)[4];"); 7292 verifyFormat("funptrs[4](foo)[4];"); 7293 verifyFormat("void f(int *);"); 7294 verifyFormat("void f(int *) = 0;"); 7295 verifyFormat("void f(SmallVector<int>) {}"); 7296 verifyFormat("void f(SmallVector<int>);"); 7297 verifyFormat("void f(SmallVector<int>) = 0;"); 7298 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7299 verifyFormat("int a = sizeof(int) * b;"); 7300 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7301 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7302 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7303 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7304 7305 // These are not casts, but at some point were confused with casts. 7306 verifyFormat("virtual void foo(int *) override;"); 7307 verifyFormat("virtual void foo(char &) const;"); 7308 verifyFormat("virtual void foo(int *a, char *) const;"); 7309 verifyFormat("int a = sizeof(int *) + b;"); 7310 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7311 verifyFormat("bool b = f(g<int>) && c;"); 7312 verifyFormat("typedef void (*f)(int i) func;"); 7313 7314 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7315 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7316 // FIXME: The indentation here is not ideal. 7317 verifyFormat( 7318 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7319 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7320 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7321 } 7322 7323 TEST_F(FormatTest, FormatsFunctionTypes) { 7324 verifyFormat("A<bool()> a;"); 7325 verifyFormat("A<SomeType()> a;"); 7326 verifyFormat("A<void (*)(int, std::string)> a;"); 7327 verifyFormat("A<void *(int)>;"); 7328 verifyFormat("void *(*a)(int *, SomeType *);"); 7329 verifyFormat("int (*func)(void *);"); 7330 verifyFormat("void f() { int (*func)(void *); }"); 7331 verifyFormat("template <class CallbackClass>\n" 7332 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7333 7334 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7335 verifyGoogleFormat("void* (*a)(int);"); 7336 verifyGoogleFormat( 7337 "template <class CallbackClass>\n" 7338 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7339 7340 // Other constructs can look somewhat like function types: 7341 verifyFormat("A<sizeof(*x)> a;"); 7342 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7343 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7344 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7345 verifyFormat("int x = f(&h)();"); 7346 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7347 verifyFormat("std::function<\n" 7348 " LooooooooooongTemplatedType<\n" 7349 " SomeType>*(\n" 7350 " LooooooooooooooooongType type)>\n" 7351 " function;", 7352 getGoogleStyleWithColumns(40)); 7353 } 7354 7355 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7356 verifyFormat("A (*foo_)[6];"); 7357 verifyFormat("vector<int> (*foo_)[6];"); 7358 } 7359 7360 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7361 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7362 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7363 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7364 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7365 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7366 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7367 7368 // Different ways of ()-initializiation. 7369 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7370 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7371 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7372 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7373 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7374 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7375 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7376 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7377 7378 // Lambdas should not confuse the variable declaration heuristic. 7379 verifyFormat("LooooooooooooooooongType\n" 7380 " variable(nullptr, [](A *a) {});", 7381 getLLVMStyleWithColumns(40)); 7382 } 7383 7384 TEST_F(FormatTest, BreaksLongDeclarations) { 7385 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7386 " AnotherNameForTheLongType;"); 7387 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7389 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7390 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7391 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7392 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7393 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7394 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7395 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7396 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7397 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7398 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7399 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7400 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7401 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7402 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7403 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7404 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7405 FormatStyle Indented = getLLVMStyle(); 7406 Indented.IndentWrappedFunctionNames = true; 7407 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7408 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7409 Indented); 7410 verifyFormat( 7411 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7412 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7413 Indented); 7414 verifyFormat( 7415 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7416 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7417 Indented); 7418 verifyFormat( 7419 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7420 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7421 Indented); 7422 7423 // FIXME: Without the comment, this breaks after "(". 7424 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7425 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7426 getGoogleStyle()); 7427 7428 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7429 " int LoooooooooooooooooooongParam2) {}"); 7430 verifyFormat( 7431 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7432 " SourceLocation L, IdentifierIn *II,\n" 7433 " Type *T) {}"); 7434 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7435 "ReallyReaaallyLongFunctionName(\n" 7436 " const std::string &SomeParameter,\n" 7437 " const SomeType<string, SomeOtherTemplateParameter>\n" 7438 " &ReallyReallyLongParameterName,\n" 7439 " const SomeType<string, SomeOtherTemplateParameter>\n" 7440 " &AnotherLongParameterName) {}"); 7441 verifyFormat("template <typename A>\n" 7442 "SomeLoooooooooooooooooooooongType<\n" 7443 " typename some_namespace::SomeOtherType<A>::Type>\n" 7444 "Function() {}"); 7445 7446 verifyGoogleFormat( 7447 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7448 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7449 verifyGoogleFormat( 7450 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7451 " SourceLocation L) {}"); 7452 verifyGoogleFormat( 7453 "some_namespace::LongReturnType\n" 7454 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7455 " int first_long_parameter, int second_parameter) {}"); 7456 7457 verifyGoogleFormat("template <typename T>\n" 7458 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7459 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7460 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7461 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7462 7463 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7464 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7465 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7466 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7467 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7468 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7469 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7470 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7473 7474 verifyFormat("template <typename T> // Templates on own line.\n" 7475 "static int // Some comment.\n" 7476 "MyFunction(int a);", 7477 getLLVMStyle()); 7478 } 7479 7480 TEST_F(FormatTest, FormatsArrays) { 7481 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7482 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7483 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7484 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7485 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7486 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7487 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7488 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7489 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7490 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7491 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7492 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7493 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7494 verifyFormat( 7495 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7496 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7497 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7498 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7499 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7500 7501 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7503 verifyFormat( 7504 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 7505 " .aaaaaaa[0]\n" 7506 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7507 verifyFormat("a[::b::c];"); 7508 7509 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 7510 7511 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 7512 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 7513 } 7514 7515 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 7516 verifyFormat("(a)->b();"); 7517 verifyFormat("--a;"); 7518 } 7519 7520 TEST_F(FormatTest, HandlesIncludeDirectives) { 7521 verifyFormat("#include <string>\n" 7522 "#include <a/b/c.h>\n" 7523 "#include \"a/b/string\"\n" 7524 "#include \"string.h\"\n" 7525 "#include \"string.h\"\n" 7526 "#include <a-a>\n" 7527 "#include < path with space >\n" 7528 "#include_next <test.h>" 7529 "#include \"abc.h\" // this is included for ABC\n" 7530 "#include \"some long include\" // with a comment\n" 7531 "#include \"some very long include path\"\n" 7532 "#include <some/very/long/include/path>\n", 7533 getLLVMStyleWithColumns(35)); 7534 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 7535 EXPECT_EQ("#include <a>", format("#include<a>")); 7536 7537 verifyFormat("#import <string>"); 7538 verifyFormat("#import <a/b/c.h>"); 7539 verifyFormat("#import \"a/b/string\""); 7540 verifyFormat("#import \"string.h\""); 7541 verifyFormat("#import \"string.h\""); 7542 verifyFormat("#if __has_include(<strstream>)\n" 7543 "#include <strstream>\n" 7544 "#endif"); 7545 7546 verifyFormat("#define MY_IMPORT <a/b>"); 7547 7548 verifyFormat("#if __has_include(<a/b>)"); 7549 verifyFormat("#if __has_include_next(<a/b>)"); 7550 verifyFormat("#define F __has_include(<a/b>)"); 7551 verifyFormat("#define F __has_include_next(<a/b>)"); 7552 7553 // Protocol buffer definition or missing "#". 7554 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 7555 getLLVMStyleWithColumns(30)); 7556 7557 FormatStyle Style = getLLVMStyle(); 7558 Style.AlwaysBreakBeforeMultilineStrings = true; 7559 Style.ColumnLimit = 0; 7560 verifyFormat("#import \"abc.h\"", Style); 7561 7562 // But 'import' might also be a regular C++ namespace. 7563 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7565 } 7566 7567 //===----------------------------------------------------------------------===// 7568 // Error recovery tests. 7569 //===----------------------------------------------------------------------===// 7570 7571 TEST_F(FormatTest, IncompleteParameterLists) { 7572 FormatStyle NoBinPacking = getLLVMStyle(); 7573 NoBinPacking.BinPackParameters = false; 7574 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 7575 " double *min_x,\n" 7576 " double *max_x,\n" 7577 " double *min_y,\n" 7578 " double *max_y,\n" 7579 " double *min_z,\n" 7580 " double *max_z, ) {}", 7581 NoBinPacking); 7582 } 7583 7584 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 7585 verifyFormat("void f() { return; }\n42"); 7586 verifyFormat("void f() {\n" 7587 " if (0)\n" 7588 " return;\n" 7589 "}\n" 7590 "42"); 7591 verifyFormat("void f() { return }\n42"); 7592 verifyFormat("void f() {\n" 7593 " if (0)\n" 7594 " return\n" 7595 "}\n" 7596 "42"); 7597 } 7598 7599 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 7600 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 7601 EXPECT_EQ("void f() {\n" 7602 " if (a)\n" 7603 " return\n" 7604 "}", 7605 format("void f ( ) { if ( a ) return }")); 7606 EXPECT_EQ("namespace N {\n" 7607 "void f()\n" 7608 "}", 7609 format("namespace N { void f() }")); 7610 EXPECT_EQ("namespace N {\n" 7611 "void f() {}\n" 7612 "void g()\n" 7613 "} // namespace N", 7614 format("namespace N { void f( ) { } void g( ) }")); 7615 } 7616 7617 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 7618 verifyFormat("int aaaaaaaa =\n" 7619 " // Overlylongcomment\n" 7620 " b;", 7621 getLLVMStyleWithColumns(20)); 7622 verifyFormat("function(\n" 7623 " ShortArgument,\n" 7624 " LoooooooooooongArgument);\n", 7625 getLLVMStyleWithColumns(20)); 7626 } 7627 7628 TEST_F(FormatTest, IncorrectAccessSpecifier) { 7629 verifyFormat("public:"); 7630 verifyFormat("class A {\n" 7631 "public\n" 7632 " void f() {}\n" 7633 "};"); 7634 verifyFormat("public\n" 7635 "int qwerty;"); 7636 verifyFormat("public\n" 7637 "B {}"); 7638 verifyFormat("public\n" 7639 "{}"); 7640 verifyFormat("public\n" 7641 "B { int x; }"); 7642 } 7643 7644 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 7645 verifyFormat("{"); 7646 verifyFormat("#})"); 7647 verifyNoCrash("(/**/[:!] ?[)."); 7648 } 7649 7650 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 7651 // Found by oss-fuzz: 7652 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 7653 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7654 Style.ColumnLimit = 60; 7655 verifyNoCrash( 7656 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 7657 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 7658 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 7659 Style); 7660 } 7661 7662 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 7663 verifyFormat("do {\n}"); 7664 verifyFormat("do {\n}\n" 7665 "f();"); 7666 verifyFormat("do {\n}\n" 7667 "wheeee(fun);"); 7668 verifyFormat("do {\n" 7669 " f();\n" 7670 "}"); 7671 } 7672 7673 TEST_F(FormatTest, IncorrectCodeMissingParens) { 7674 verifyFormat("if {\n foo;\n foo();\n}"); 7675 verifyFormat("switch {\n foo;\n foo();\n}"); 7676 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 7677 verifyFormat("while {\n foo;\n foo();\n}"); 7678 verifyFormat("do {\n foo;\n foo();\n} while;"); 7679 } 7680 7681 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 7682 verifyIncompleteFormat("namespace {\n" 7683 "class Foo { Foo (\n" 7684 "};\n" 7685 "} // namespace"); 7686 } 7687 7688 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 7689 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 7690 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 7691 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 7692 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 7693 7694 EXPECT_EQ("{\n" 7695 " {\n" 7696 " breakme(\n" 7697 " qwe);\n" 7698 " }\n", 7699 format("{\n" 7700 " {\n" 7701 " breakme(qwe);\n" 7702 "}\n", 7703 getLLVMStyleWithColumns(10))); 7704 } 7705 7706 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 7707 verifyFormat("int x = {\n" 7708 " avariable,\n" 7709 " b(alongervariable)};", 7710 getLLVMStyleWithColumns(25)); 7711 } 7712 7713 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 7714 verifyFormat("return (a)(b){1, 2, 3};"); 7715 } 7716 7717 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 7718 verifyFormat("vector<int> x{1, 2, 3, 4};"); 7719 verifyFormat("vector<int> x{\n" 7720 " 1,\n" 7721 " 2,\n" 7722 " 3,\n" 7723 " 4,\n" 7724 "};"); 7725 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 7726 verifyFormat("f({1, 2});"); 7727 verifyFormat("auto v = Foo{-1};"); 7728 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 7729 verifyFormat("Class::Class : member{1, 2, 3} {}"); 7730 verifyFormat("new vector<int>{1, 2, 3};"); 7731 verifyFormat("new int[3]{1, 2, 3};"); 7732 verifyFormat("new int{1};"); 7733 verifyFormat("return {arg1, arg2};"); 7734 verifyFormat("return {arg1, SomeType{parameter}};"); 7735 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 7736 verifyFormat("new T{arg1, arg2};"); 7737 verifyFormat("f(MyMap[{composite, key}]);"); 7738 verifyFormat("class Class {\n" 7739 " T member = {arg1, arg2};\n" 7740 "};"); 7741 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 7742 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 7743 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 7744 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 7745 verifyFormat("int a = std::is_integral<int>{} + 0;"); 7746 7747 verifyFormat("int foo(int i) { return fo1{}(i); }"); 7748 verifyFormat("int foo(int i) { return fo1{}(i); }"); 7749 verifyFormat("auto i = decltype(x){};"); 7750 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 7751 verifyFormat("Node n{1, Node{1000}, //\n" 7752 " 2};"); 7753 verifyFormat("Aaaa aaaaaaa{\n" 7754 " {\n" 7755 " aaaa,\n" 7756 " },\n" 7757 "};"); 7758 verifyFormat("class C : public D {\n" 7759 " SomeClass SC{2};\n" 7760 "};"); 7761 verifyFormat("class C : public A {\n" 7762 " class D : public B {\n" 7763 " void f() { int i{2}; }\n" 7764 " };\n" 7765 "};"); 7766 verifyFormat("#define A {a, a},"); 7767 7768 // Avoid breaking between equal sign and opening brace 7769 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 7770 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 7771 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 7772 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 7773 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 7774 " {\"ccccccccccccccccccccc\", 2}};", 7775 AvoidBreakingFirstArgument); 7776 7777 // Binpacking only if there is no trailing comma 7778 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 7779 " cccccccccc, dddddddddd};", 7780 getLLVMStyleWithColumns(50)); 7781 verifyFormat("const Aaaaaa aaaaa = {\n" 7782 " aaaaaaaaaaa,\n" 7783 " bbbbbbbbbbb,\n" 7784 " ccccccccccc,\n" 7785 " ddddddddddd,\n" 7786 "};", getLLVMStyleWithColumns(50)); 7787 7788 // Cases where distinguising braced lists and blocks is hard. 7789 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 7790 verifyFormat("void f() {\n" 7791 " return; // comment\n" 7792 "}\n" 7793 "SomeType t;"); 7794 verifyFormat("void f() {\n" 7795 " if (a) {\n" 7796 " f();\n" 7797 " }\n" 7798 "}\n" 7799 "SomeType t;"); 7800 7801 // In combination with BinPackArguments = false. 7802 FormatStyle NoBinPacking = getLLVMStyle(); 7803 NoBinPacking.BinPackArguments = false; 7804 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 7805 " bbbbb,\n" 7806 " ccccc,\n" 7807 " ddddd,\n" 7808 " eeeee,\n" 7809 " ffffff,\n" 7810 " ggggg,\n" 7811 " hhhhhh,\n" 7812 " iiiiii,\n" 7813 " jjjjjj,\n" 7814 " kkkkkk};", 7815 NoBinPacking); 7816 verifyFormat("const Aaaaaa aaaaa = {\n" 7817 " aaaaa,\n" 7818 " bbbbb,\n" 7819 " ccccc,\n" 7820 " ddddd,\n" 7821 " eeeee,\n" 7822 " ffffff,\n" 7823 " ggggg,\n" 7824 " hhhhhh,\n" 7825 " iiiiii,\n" 7826 " jjjjjj,\n" 7827 " kkkkkk,\n" 7828 "};", 7829 NoBinPacking); 7830 verifyFormat( 7831 "const Aaaaaa aaaaa = {\n" 7832 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 7833 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 7834 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 7835 "};", 7836 NoBinPacking); 7837 7838 // FIXME: The alignment of these trailing comments might be bad. Then again, 7839 // this might be utterly useless in real code. 7840 verifyFormat("Constructor::Constructor()\n" 7841 " : some_value{ //\n" 7842 " aaaaaaa, //\n" 7843 " bbbbbbb} {}"); 7844 7845 // In braced lists, the first comment is always assumed to belong to the 7846 // first element. Thus, it can be moved to the next or previous line as 7847 // appropriate. 7848 EXPECT_EQ("function({// First element:\n" 7849 " 1,\n" 7850 " // Second element:\n" 7851 " 2});", 7852 format("function({\n" 7853 " // First element:\n" 7854 " 1,\n" 7855 " // Second element:\n" 7856 " 2});")); 7857 EXPECT_EQ("std::vector<int> MyNumbers{\n" 7858 " // First element:\n" 7859 " 1,\n" 7860 " // Second element:\n" 7861 " 2};", 7862 format("std::vector<int> MyNumbers{// First element:\n" 7863 " 1,\n" 7864 " // Second element:\n" 7865 " 2};", 7866 getLLVMStyleWithColumns(30))); 7867 // A trailing comma should still lead to an enforced line break and no 7868 // binpacking. 7869 EXPECT_EQ("vector<int> SomeVector = {\n" 7870 " // aaa\n" 7871 " 1,\n" 7872 " 2,\n" 7873 "};", 7874 format("vector<int> SomeVector = { // aaa\n" 7875 " 1, 2, };")); 7876 7877 FormatStyle ExtraSpaces = getLLVMStyle(); 7878 ExtraSpaces.Cpp11BracedListStyle = false; 7879 ExtraSpaces.ColumnLimit = 75; 7880 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 7881 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 7882 verifyFormat("f({ 1, 2 });", ExtraSpaces); 7883 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 7884 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 7885 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 7886 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 7887 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 7888 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 7889 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 7890 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 7891 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 7892 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 7893 verifyFormat("class Class {\n" 7894 " T member = { arg1, arg2 };\n" 7895 "};", 7896 ExtraSpaces); 7897 verifyFormat( 7898 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7899 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 7900 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 7901 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 7902 ExtraSpaces); 7903 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 7904 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 7905 ExtraSpaces); 7906 verifyFormat( 7907 "someFunction(OtherParam,\n" 7908 " BracedList{ // comment 1 (Forcing interesting break)\n" 7909 " param1, param2,\n" 7910 " // comment 2\n" 7911 " param3, param4 });", 7912 ExtraSpaces); 7913 verifyFormat( 7914 "std::this_thread::sleep_for(\n" 7915 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 7916 ExtraSpaces); 7917 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 7918 " aaaaaaa,\n" 7919 " aaaaaaaaaa,\n" 7920 " aaaaa,\n" 7921 " aaaaaaaaaaaaaaa,\n" 7922 " aaa,\n" 7923 " aaaaaaaaaa,\n" 7924 " a,\n" 7925 " aaaaaaaaaaaaaaaaaaaaa,\n" 7926 " aaaaaaaaaaaa,\n" 7927 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 7928 " aaaaaaa,\n" 7929 " a};"); 7930 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 7931 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 7932 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 7933 7934 // Avoid breaking between initializer/equal sign and opening brace 7935 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 7936 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 7937 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 7938 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 7939 " { \"ccccccccccccccccccccc\", 2 }\n" 7940 "};", 7941 ExtraSpaces); 7942 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 7943 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 7944 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 7945 " { \"ccccccccccccccccccccc\", 2 }\n" 7946 "};", 7947 ExtraSpaces); 7948 7949 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 7950 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 7951 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 7952 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 7953 } 7954 7955 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 7956 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7957 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7958 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7959 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7960 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7961 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 7962 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 7963 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7964 " 1, 22, 333, 4444, 55555, //\n" 7965 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7966 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 7967 verifyFormat( 7968 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7969 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7970 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 7971 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7972 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7973 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7974 " 7777777};"); 7975 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7976 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7977 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7978 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7979 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7980 " // Separating comment.\n" 7981 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7982 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7983 " // Leading comment\n" 7984 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7985 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7986 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 7987 " 1, 1, 1, 1};", 7988 getLLVMStyleWithColumns(39)); 7989 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 7990 " 1, 1, 1, 1};", 7991 getLLVMStyleWithColumns(38)); 7992 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 7993 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 7994 getLLVMStyleWithColumns(43)); 7995 verifyFormat( 7996 "static unsigned SomeValues[10][3] = {\n" 7997 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 7998 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 7999 verifyFormat("static auto fields = new vector<string>{\n" 8000 " \"aaaaaaaaaaaaa\",\n" 8001 " \"aaaaaaaaaaaaa\",\n" 8002 " \"aaaaaaaaaaaa\",\n" 8003 " \"aaaaaaaaaaaaaa\",\n" 8004 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8005 " \"aaaaaaaaaaaa\",\n" 8006 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8007 "};"); 8008 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8009 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8010 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8011 " 3, cccccccccccccccccccccc};", 8012 getLLVMStyleWithColumns(60)); 8013 8014 // Trailing commas. 8015 verifyFormat("vector<int> x = {\n" 8016 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8017 "};", 8018 getLLVMStyleWithColumns(39)); 8019 verifyFormat("vector<int> x = {\n" 8020 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8021 "};", 8022 getLLVMStyleWithColumns(39)); 8023 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8024 " 1, 1, 1, 1,\n" 8025 " /**/ /**/};", 8026 getLLVMStyleWithColumns(39)); 8027 8028 // Trailing comment in the first line. 8029 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8030 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8031 " 111111111, 222222222, 3333333333, 444444444, //\n" 8032 " 11111111, 22222222, 333333333, 44444444};"); 8033 // Trailing comment in the last line. 8034 verifyFormat("int aaaaa[] = {\n" 8035 " 1, 2, 3, // comment\n" 8036 " 4, 5, 6 // comment\n" 8037 "};"); 8038 8039 // With nested lists, we should either format one item per line or all nested 8040 // lists one on line. 8041 // FIXME: For some nested lists, we can do better. 8042 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8043 " {aaaaaaaaaaaaaaaaaaa},\n" 8044 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8045 " {aaaaaaaaaaaaaaaaa}};", 8046 getLLVMStyleWithColumns(60)); 8047 verifyFormat( 8048 "SomeStruct my_struct_array = {\n" 8049 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8050 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8051 " {aaa, aaa},\n" 8052 " {aaa, aaa},\n" 8053 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8054 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8055 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8056 8057 // No column layout should be used here. 8058 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8059 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8060 8061 verifyNoCrash("a<,"); 8062 8063 // No braced initializer here. 8064 verifyFormat("void f() {\n" 8065 " struct Dummy {};\n" 8066 " f(v);\n" 8067 "}"); 8068 8069 // Long lists should be formatted in columns even if they are nested. 8070 verifyFormat( 8071 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8072 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8073 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8074 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8075 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8076 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8077 8078 // Allow "single-column" layout even if that violates the column limit. There 8079 // isn't going to be a better way. 8080 verifyFormat("std::vector<int> a = {\n" 8081 " aaaaaaaa,\n" 8082 " aaaaaaaa,\n" 8083 " aaaaaaaa,\n" 8084 " aaaaaaaa,\n" 8085 " aaaaaaaaaa,\n" 8086 " aaaaaaaa,\n" 8087 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8088 getLLVMStyleWithColumns(30)); 8089 verifyFormat("vector<int> aaaa = {\n" 8090 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8091 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8092 " aaaaaa.aaaaaaa,\n" 8093 " aaaaaa.aaaaaaa,\n" 8094 " aaaaaa.aaaaaaa,\n" 8095 " aaaaaa.aaaaaaa,\n" 8096 "};"); 8097 8098 // Don't create hanging lists. 8099 verifyFormat("someFunction(Param, {List1, List2,\n" 8100 " List3});", 8101 getLLVMStyleWithColumns(35)); 8102 verifyFormat("someFunction(Param, Param,\n" 8103 " {List1, List2,\n" 8104 " List3});", 8105 getLLVMStyleWithColumns(35)); 8106 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8107 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8108 } 8109 8110 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8111 FormatStyle DoNotMerge = getLLVMStyle(); 8112 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8113 8114 verifyFormat("void f() { return 42; }"); 8115 verifyFormat("void f() {\n" 8116 " return 42;\n" 8117 "}", 8118 DoNotMerge); 8119 verifyFormat("void f() {\n" 8120 " // Comment\n" 8121 "}"); 8122 verifyFormat("{\n" 8123 "#error {\n" 8124 " int a;\n" 8125 "}"); 8126 verifyFormat("{\n" 8127 " int a;\n" 8128 "#error {\n" 8129 "}"); 8130 verifyFormat("void f() {} // comment"); 8131 verifyFormat("void f() { int a; } // comment"); 8132 verifyFormat("void f() {\n" 8133 "} // comment", 8134 DoNotMerge); 8135 verifyFormat("void f() {\n" 8136 " int a;\n" 8137 "} // comment", 8138 DoNotMerge); 8139 verifyFormat("void f() {\n" 8140 "} // comment", 8141 getLLVMStyleWithColumns(15)); 8142 8143 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8144 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8145 8146 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8147 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8148 verifyFormat("class C {\n" 8149 " C()\n" 8150 " : iiiiiiii(nullptr),\n" 8151 " kkkkkkk(nullptr),\n" 8152 " mmmmmmm(nullptr),\n" 8153 " nnnnnnn(nullptr) {}\n" 8154 "};", 8155 getGoogleStyle()); 8156 8157 FormatStyle NoColumnLimit = getLLVMStyle(); 8158 NoColumnLimit.ColumnLimit = 0; 8159 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8160 EXPECT_EQ("class C {\n" 8161 " A() : b(0) {}\n" 8162 "};", 8163 format("class C{A():b(0){}};", NoColumnLimit)); 8164 EXPECT_EQ("A()\n" 8165 " : b(0) {\n" 8166 "}", 8167 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8168 8169 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8170 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8171 FormatStyle::SFS_None; 8172 EXPECT_EQ("A()\n" 8173 " : b(0) {\n" 8174 "}", 8175 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8176 EXPECT_EQ("A()\n" 8177 " : b(0) {\n" 8178 "}", 8179 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8180 8181 verifyFormat("#define A \\\n" 8182 " void f() { \\\n" 8183 " int i; \\\n" 8184 " }", 8185 getLLVMStyleWithColumns(20)); 8186 verifyFormat("#define A \\\n" 8187 " void f() { int i; }", 8188 getLLVMStyleWithColumns(21)); 8189 verifyFormat("#define A \\\n" 8190 " void f() { \\\n" 8191 " int i; \\\n" 8192 " } \\\n" 8193 " int j;", 8194 getLLVMStyleWithColumns(22)); 8195 verifyFormat("#define A \\\n" 8196 " void f() { int i; } \\\n" 8197 " int j;", 8198 getLLVMStyleWithColumns(23)); 8199 } 8200 8201 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8202 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8203 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8204 verifyFormat("class C {\n" 8205 " int f() {}\n" 8206 "};", 8207 MergeEmptyOnly); 8208 verifyFormat("class C {\n" 8209 " int f() {\n" 8210 " return 42;\n" 8211 " }\n" 8212 "};", 8213 MergeEmptyOnly); 8214 verifyFormat("int f() {}", MergeEmptyOnly); 8215 verifyFormat("int f() {\n" 8216 " return 42;\n" 8217 "}", 8218 MergeEmptyOnly); 8219 8220 // Also verify behavior when BraceWrapping.AfterFunction = true 8221 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8222 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8223 verifyFormat("int f() {}", MergeEmptyOnly); 8224 verifyFormat("class C {\n" 8225 " int f() {}\n" 8226 "};", 8227 MergeEmptyOnly); 8228 } 8229 8230 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8231 FormatStyle MergeInlineOnly = getLLVMStyle(); 8232 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8233 verifyFormat("class C {\n" 8234 " int f() { return 42; }\n" 8235 "};", 8236 MergeInlineOnly); 8237 verifyFormat("int f() {\n" 8238 " return 42;\n" 8239 "}", 8240 MergeInlineOnly); 8241 8242 // SFS_Inline implies SFS_Empty 8243 verifyFormat("class C {\n" 8244 " int f() {}\n" 8245 "};", 8246 MergeInlineOnly); 8247 verifyFormat("int f() {}", MergeInlineOnly); 8248 8249 // Also verify behavior when BraceWrapping.AfterFunction = true 8250 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8251 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8252 verifyFormat("class C {\n" 8253 " int f() { return 42; }\n" 8254 "};", 8255 MergeInlineOnly); 8256 verifyFormat("int f()\n" 8257 "{\n" 8258 " return 42;\n" 8259 "}", 8260 MergeInlineOnly); 8261 8262 // SFS_Inline implies SFS_Empty 8263 verifyFormat("int f() {}", MergeInlineOnly); 8264 verifyFormat("class C {\n" 8265 " int f() {}\n" 8266 "};", 8267 MergeInlineOnly); 8268 } 8269 8270 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8271 FormatStyle MergeInlineOnly = getLLVMStyle(); 8272 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8273 FormatStyle::SFS_InlineOnly; 8274 verifyFormat("class C {\n" 8275 " int f() { return 42; }\n" 8276 "};", 8277 MergeInlineOnly); 8278 verifyFormat("int f() {\n" 8279 " return 42;\n" 8280 "}", 8281 MergeInlineOnly); 8282 8283 // SFS_InlineOnly does not imply SFS_Empty 8284 verifyFormat("class C {\n" 8285 " int f() {}\n" 8286 "};", 8287 MergeInlineOnly); 8288 verifyFormat("int f() {\n" 8289 "}", 8290 MergeInlineOnly); 8291 8292 // Also verify behavior when BraceWrapping.AfterFunction = true 8293 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8294 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8295 verifyFormat("class C {\n" 8296 " int f() { return 42; }\n" 8297 "};", 8298 MergeInlineOnly); 8299 verifyFormat("int f()\n" 8300 "{\n" 8301 " return 42;\n" 8302 "}", 8303 MergeInlineOnly); 8304 8305 // SFS_InlineOnly does not imply SFS_Empty 8306 verifyFormat("int f()\n" 8307 "{\n" 8308 "}", 8309 MergeInlineOnly); 8310 verifyFormat("class C {\n" 8311 " int f() {}\n" 8312 "};", 8313 MergeInlineOnly); 8314 } 8315 8316 TEST_F(FormatTest, SplitEmptyFunction) { 8317 FormatStyle Style = getLLVMStyle(); 8318 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8319 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8320 Style.BraceWrapping.AfterFunction = true; 8321 Style.BraceWrapping.SplitEmptyFunction = false; 8322 Style.ColumnLimit = 40; 8323 8324 verifyFormat("int f()\n" 8325 "{}", 8326 Style); 8327 verifyFormat("int f()\n" 8328 "{\n" 8329 " return 42;\n" 8330 "}", 8331 Style); 8332 verifyFormat("int f()\n" 8333 "{\n" 8334 " // some comment\n" 8335 "}", 8336 Style); 8337 8338 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8339 verifyFormat("int f() {}", Style); 8340 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8341 "{}", 8342 Style); 8343 verifyFormat("int f()\n" 8344 "{\n" 8345 " return 0;\n" 8346 "}", 8347 Style); 8348 8349 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8350 verifyFormat("class Foo {\n" 8351 " int f() {}\n" 8352 "};\n", 8353 Style); 8354 verifyFormat("class Foo {\n" 8355 " int f() { return 0; }\n" 8356 "};\n", 8357 Style); 8358 verifyFormat("class Foo {\n" 8359 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8360 " {}\n" 8361 "};\n", 8362 Style); 8363 verifyFormat("class Foo {\n" 8364 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8365 " {\n" 8366 " return 0;\n" 8367 " }\n" 8368 "};\n", 8369 Style); 8370 8371 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8372 verifyFormat("int f() {}", Style); 8373 verifyFormat("int f() { return 0; }", Style); 8374 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8375 "{}", 8376 Style); 8377 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8378 "{\n" 8379 " return 0;\n" 8380 "}", 8381 Style); 8382 } 8383 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8384 FormatStyle Style = getLLVMStyle(); 8385 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8386 verifyFormat("#ifdef A\n" 8387 "int f() {}\n" 8388 "#else\n" 8389 "int g() {}\n" 8390 "#endif", 8391 Style); 8392 } 8393 8394 TEST_F(FormatTest, SplitEmptyClass) { 8395 FormatStyle Style = getLLVMStyle(); 8396 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8397 Style.BraceWrapping.AfterClass = true; 8398 Style.BraceWrapping.SplitEmptyRecord = false; 8399 8400 verifyFormat("class Foo\n" 8401 "{};", 8402 Style); 8403 verifyFormat("/* something */ class Foo\n" 8404 "{};", 8405 Style); 8406 verifyFormat("template <typename X> class Foo\n" 8407 "{};", 8408 Style); 8409 verifyFormat("class Foo\n" 8410 "{\n" 8411 " Foo();\n" 8412 "};", 8413 Style); 8414 verifyFormat("typedef class Foo\n" 8415 "{\n" 8416 "} Foo_t;", 8417 Style); 8418 } 8419 8420 TEST_F(FormatTest, SplitEmptyStruct) { 8421 FormatStyle Style = getLLVMStyle(); 8422 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8423 Style.BraceWrapping.AfterStruct = true; 8424 Style.BraceWrapping.SplitEmptyRecord = false; 8425 8426 verifyFormat("struct Foo\n" 8427 "{};", 8428 Style); 8429 verifyFormat("/* something */ struct Foo\n" 8430 "{};", 8431 Style); 8432 verifyFormat("template <typename X> struct Foo\n" 8433 "{};", 8434 Style); 8435 verifyFormat("struct Foo\n" 8436 "{\n" 8437 " Foo();\n" 8438 "};", 8439 Style); 8440 verifyFormat("typedef struct Foo\n" 8441 "{\n" 8442 "} Foo_t;", 8443 Style); 8444 //typedef struct Bar {} Bar_t; 8445 } 8446 8447 TEST_F(FormatTest, SplitEmptyUnion) { 8448 FormatStyle Style = getLLVMStyle(); 8449 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8450 Style.BraceWrapping.AfterUnion = true; 8451 Style.BraceWrapping.SplitEmptyRecord = false; 8452 8453 verifyFormat("union Foo\n" 8454 "{};", 8455 Style); 8456 verifyFormat("/* something */ union Foo\n" 8457 "{};", 8458 Style); 8459 verifyFormat("union Foo\n" 8460 "{\n" 8461 " A,\n" 8462 "};", 8463 Style); 8464 verifyFormat("typedef union Foo\n" 8465 "{\n" 8466 "} Foo_t;", 8467 Style); 8468 } 8469 8470 TEST_F(FormatTest, SplitEmptyNamespace) { 8471 FormatStyle Style = getLLVMStyle(); 8472 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8473 Style.BraceWrapping.AfterNamespace = true; 8474 Style.BraceWrapping.SplitEmptyNamespace = false; 8475 8476 verifyFormat("namespace Foo\n" 8477 "{};", 8478 Style); 8479 verifyFormat("/* something */ namespace Foo\n" 8480 "{};", 8481 Style); 8482 verifyFormat("inline namespace Foo\n" 8483 "{};", 8484 Style); 8485 verifyFormat("/* something */ inline namespace Foo\n" 8486 "{};", 8487 Style); 8488 verifyFormat("export namespace Foo\n" 8489 "{};", 8490 Style); 8491 verifyFormat("namespace Foo\n" 8492 "{\n" 8493 "void Bar();\n" 8494 "};", 8495 Style); 8496 } 8497 8498 TEST_F(FormatTest, NeverMergeShortRecords) { 8499 FormatStyle Style = getLLVMStyle(); 8500 8501 verifyFormat("class Foo {\n" 8502 " Foo();\n" 8503 "};", 8504 Style); 8505 verifyFormat("typedef class Foo {\n" 8506 " Foo();\n" 8507 "} Foo_t;", 8508 Style); 8509 verifyFormat("struct Foo {\n" 8510 " Foo();\n" 8511 "};", 8512 Style); 8513 verifyFormat("typedef struct Foo {\n" 8514 " Foo();\n" 8515 "} Foo_t;", 8516 Style); 8517 verifyFormat("union Foo {\n" 8518 " A,\n" 8519 "};", 8520 Style); 8521 verifyFormat("typedef union Foo {\n" 8522 " A,\n" 8523 "} Foo_t;", 8524 Style); 8525 verifyFormat("namespace Foo {\n" 8526 "void Bar();\n" 8527 "};", 8528 Style); 8529 8530 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8531 Style.BraceWrapping.AfterClass = true; 8532 Style.BraceWrapping.AfterStruct = true; 8533 Style.BraceWrapping.AfterUnion = true; 8534 Style.BraceWrapping.AfterNamespace = true; 8535 verifyFormat("class Foo\n" 8536 "{\n" 8537 " Foo();\n" 8538 "};", 8539 Style); 8540 verifyFormat("typedef class Foo\n" 8541 "{\n" 8542 " Foo();\n" 8543 "} Foo_t;", 8544 Style); 8545 verifyFormat("struct Foo\n" 8546 "{\n" 8547 " Foo();\n" 8548 "};", 8549 Style); 8550 verifyFormat("typedef struct Foo\n" 8551 "{\n" 8552 " Foo();\n" 8553 "} Foo_t;", 8554 Style); 8555 verifyFormat("union Foo\n" 8556 "{\n" 8557 " A,\n" 8558 "};", 8559 Style); 8560 verifyFormat("typedef union Foo\n" 8561 "{\n" 8562 " A,\n" 8563 "} Foo_t;", 8564 Style); 8565 verifyFormat("namespace Foo\n" 8566 "{\n" 8567 "void Bar();\n" 8568 "};", 8569 Style); 8570 } 8571 8572 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 8573 // Elaborate type variable declarations. 8574 verifyFormat("struct foo a = {bar};\nint n;"); 8575 verifyFormat("class foo a = {bar};\nint n;"); 8576 verifyFormat("union foo a = {bar};\nint n;"); 8577 8578 // Elaborate types inside function definitions. 8579 verifyFormat("struct foo f() {}\nint n;"); 8580 verifyFormat("class foo f() {}\nint n;"); 8581 verifyFormat("union foo f() {}\nint n;"); 8582 8583 // Templates. 8584 verifyFormat("template <class X> void f() {}\nint n;"); 8585 verifyFormat("template <struct X> void f() {}\nint n;"); 8586 verifyFormat("template <union X> void f() {}\nint n;"); 8587 8588 // Actual definitions... 8589 verifyFormat("struct {\n} n;"); 8590 verifyFormat( 8591 "template <template <class T, class Y>, class Z> class X {\n} n;"); 8592 verifyFormat("union Z {\n int n;\n} x;"); 8593 verifyFormat("class MACRO Z {\n} n;"); 8594 verifyFormat("class MACRO(X) Z {\n} n;"); 8595 verifyFormat("class __attribute__(X) Z {\n} n;"); 8596 verifyFormat("class __declspec(X) Z {\n} n;"); 8597 verifyFormat("class A##B##C {\n} n;"); 8598 verifyFormat("class alignas(16) Z {\n} n;"); 8599 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 8600 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 8601 8602 // Redefinition from nested context: 8603 verifyFormat("class A::B::C {\n} n;"); 8604 8605 // Template definitions. 8606 verifyFormat( 8607 "template <typename F>\n" 8608 "Matcher(const Matcher<F> &Other,\n" 8609 " typename enable_if_c<is_base_of<F, T>::value &&\n" 8610 " !is_same<F, T>::value>::type * = 0)\n" 8611 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 8612 8613 // FIXME: This is still incorrectly handled at the formatter side. 8614 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 8615 verifyFormat("int i = SomeFunction(a<b, a> b);"); 8616 8617 // FIXME: 8618 // This now gets parsed incorrectly as class definition. 8619 // verifyFormat("class A<int> f() {\n}\nint n;"); 8620 8621 // Elaborate types where incorrectly parsing the structural element would 8622 // break the indent. 8623 verifyFormat("if (true)\n" 8624 " class X x;\n" 8625 "else\n" 8626 " f();\n"); 8627 8628 // This is simply incomplete. Formatting is not important, but must not crash. 8629 verifyFormat("class A:"); 8630 } 8631 8632 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 8633 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 8634 format("#error Leave all white!!!!! space* alone!\n")); 8635 EXPECT_EQ( 8636 "#warning Leave all white!!!!! space* alone!\n", 8637 format("#warning Leave all white!!!!! space* alone!\n")); 8638 EXPECT_EQ("#error 1", format(" # error 1")); 8639 EXPECT_EQ("#warning 1", format(" # warning 1")); 8640 } 8641 8642 TEST_F(FormatTest, FormatHashIfExpressions) { 8643 verifyFormat("#if AAAA && BBBB"); 8644 verifyFormat("#if (AAAA && BBBB)"); 8645 verifyFormat("#elif (AAAA && BBBB)"); 8646 // FIXME: Come up with a better indentation for #elif. 8647 verifyFormat( 8648 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 8649 " defined(BBBBBBBB)\n" 8650 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 8651 " defined(BBBBBBBB)\n" 8652 "#endif", 8653 getLLVMStyleWithColumns(65)); 8654 } 8655 8656 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 8657 FormatStyle AllowsMergedIf = getGoogleStyle(); 8658 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 8659 FormatStyle::SIS_WithoutElse; 8660 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 8661 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 8662 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 8663 EXPECT_EQ("if (true) return 42;", 8664 format("if (true)\nreturn 42;", AllowsMergedIf)); 8665 FormatStyle ShortMergedIf = AllowsMergedIf; 8666 ShortMergedIf.ColumnLimit = 25; 8667 verifyFormat("#define A \\\n" 8668 " if (true) return 42;", 8669 ShortMergedIf); 8670 verifyFormat("#define A \\\n" 8671 " f(); \\\n" 8672 " if (true)\n" 8673 "#define B", 8674 ShortMergedIf); 8675 verifyFormat("#define A \\\n" 8676 " f(); \\\n" 8677 " if (true)\n" 8678 "g();", 8679 ShortMergedIf); 8680 verifyFormat("{\n" 8681 "#ifdef A\n" 8682 " // Comment\n" 8683 " if (true) continue;\n" 8684 "#endif\n" 8685 " // Comment\n" 8686 " if (true) continue;\n" 8687 "}", 8688 ShortMergedIf); 8689 ShortMergedIf.ColumnLimit = 33; 8690 verifyFormat("#define A \\\n" 8691 " if constexpr (true) return 42;", 8692 ShortMergedIf); 8693 verifyFormat("#define A \\\n" 8694 " if CONSTEXPR (true) return 42;", 8695 ShortMergedIf); 8696 ShortMergedIf.ColumnLimit = 29; 8697 verifyFormat("#define A \\\n" 8698 " if (aaaaaaaaaa) return 1; \\\n" 8699 " return 2;", 8700 ShortMergedIf); 8701 ShortMergedIf.ColumnLimit = 28; 8702 verifyFormat("#define A \\\n" 8703 " if (aaaaaaaaaa) \\\n" 8704 " return 1; \\\n" 8705 " return 2;", 8706 ShortMergedIf); 8707 verifyFormat("#define A \\\n" 8708 " if constexpr (aaaaaaa) \\\n" 8709 " return 1; \\\n" 8710 " return 2;", 8711 ShortMergedIf); 8712 verifyFormat("#define A \\\n" 8713 " if CONSTEXPR (aaaaaaa) \\\n" 8714 " return 1; \\\n" 8715 " return 2;", 8716 ShortMergedIf); 8717 } 8718 8719 TEST_F(FormatTest, FormatStarDependingOnContext) { 8720 verifyFormat("void f(int *a);"); 8721 verifyFormat("void f() { f(fint * b); }"); 8722 verifyFormat("class A {\n void f(int *a);\n};"); 8723 verifyFormat("class A {\n int *a;\n};"); 8724 verifyFormat("namespace a {\n" 8725 "namespace b {\n" 8726 "class A {\n" 8727 " void f() {}\n" 8728 " int *a;\n" 8729 "};\n" 8730 "} // namespace b\n" 8731 "} // namespace a"); 8732 } 8733 8734 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 8735 verifyFormat("while"); 8736 verifyFormat("operator"); 8737 } 8738 8739 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 8740 // This code would be painfully slow to format if we didn't skip it. 8741 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 8742 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8743 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8744 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8745 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8746 "A(1, 1)\n" 8747 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 8748 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8749 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8750 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8751 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8752 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8753 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8754 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8755 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8756 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 8757 // Deeply nested part is untouched, rest is formatted. 8758 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 8759 format(std::string("int i;\n") + Code + "int j;\n", 8760 getLLVMStyle(), SC_ExpectIncomplete)); 8761 } 8762 8763 //===----------------------------------------------------------------------===// 8764 // Objective-C tests. 8765 //===----------------------------------------------------------------------===// 8766 8767 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 8768 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 8769 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 8770 format("-(NSUInteger)indexOfObject:(id)anObject;")); 8771 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 8772 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 8773 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 8774 format("-(NSInteger)Method3:(id)anObject;")); 8775 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 8776 format("-(NSInteger)Method4:(id)anObject;")); 8777 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 8778 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 8779 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 8780 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 8781 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 8782 "forAllCells:(BOOL)flag;", 8783 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 8784 "forAllCells:(BOOL)flag;")); 8785 8786 // Very long objectiveC method declaration. 8787 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 8788 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 8789 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 8790 " inRange:(NSRange)range\n" 8791 " outRange:(NSRange)out_range\n" 8792 " outRange1:(NSRange)out_range1\n" 8793 " outRange2:(NSRange)out_range2\n" 8794 " outRange3:(NSRange)out_range3\n" 8795 " outRange4:(NSRange)out_range4\n" 8796 " outRange5:(NSRange)out_range5\n" 8797 " outRange6:(NSRange)out_range6\n" 8798 " outRange7:(NSRange)out_range7\n" 8799 " outRange8:(NSRange)out_range8\n" 8800 " outRange9:(NSRange)out_range9;"); 8801 8802 // When the function name has to be wrapped. 8803 FormatStyle Style = getLLVMStyle(); 8804 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 8805 // and always indents instead. 8806 Style.IndentWrappedFunctionNames = false; 8807 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 8808 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 8809 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 8810 "}", 8811 Style); 8812 Style.IndentWrappedFunctionNames = true; 8813 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 8814 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 8815 " anotherName:(NSString)dddddddddddddd {\n" 8816 "}", 8817 Style); 8818 8819 verifyFormat("- (int)sum:(vector<int>)numbers;"); 8820 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 8821 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 8822 // protocol lists (but not for template classes): 8823 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 8824 8825 verifyFormat("- (int (*)())foo:(int (*)())f;"); 8826 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 8827 8828 // If there's no return type (very rare in practice!), LLVM and Google style 8829 // agree. 8830 verifyFormat("- foo;"); 8831 verifyFormat("- foo:(int)f;"); 8832 verifyGoogleFormat("- foo:(int)foo;"); 8833 } 8834 8835 8836 TEST_F(FormatTest, BreaksStringLiterals) { 8837 EXPECT_EQ("\"some text \"\n" 8838 "\"other\";", 8839 format("\"some text other\";", getLLVMStyleWithColumns(12))); 8840 EXPECT_EQ("\"some text \"\n" 8841 "\"other\";", 8842 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 8843 EXPECT_EQ( 8844 "#define A \\\n" 8845 " \"some \" \\\n" 8846 " \"text \" \\\n" 8847 " \"other\";", 8848 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 8849 EXPECT_EQ( 8850 "#define A \\\n" 8851 " \"so \" \\\n" 8852 " \"text \" \\\n" 8853 " \"other\";", 8854 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 8855 8856 EXPECT_EQ("\"some text\"", 8857 format("\"some text\"", getLLVMStyleWithColumns(1))); 8858 EXPECT_EQ("\"some text\"", 8859 format("\"some text\"", getLLVMStyleWithColumns(11))); 8860 EXPECT_EQ("\"some \"\n" 8861 "\"text\"", 8862 format("\"some text\"", getLLVMStyleWithColumns(10))); 8863 EXPECT_EQ("\"some \"\n" 8864 "\"text\"", 8865 format("\"some text\"", getLLVMStyleWithColumns(7))); 8866 EXPECT_EQ("\"some\"\n" 8867 "\" tex\"\n" 8868 "\"t\"", 8869 format("\"some text\"", getLLVMStyleWithColumns(6))); 8870 EXPECT_EQ("\"some\"\n" 8871 "\" tex\"\n" 8872 "\" and\"", 8873 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 8874 EXPECT_EQ("\"some\"\n" 8875 "\"/tex\"\n" 8876 "\"/and\"", 8877 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 8878 8879 EXPECT_EQ("variable =\n" 8880 " \"long string \"\n" 8881 " \"literal\";", 8882 format("variable = \"long string literal\";", 8883 getLLVMStyleWithColumns(20))); 8884 8885 EXPECT_EQ("variable = f(\n" 8886 " \"long string \"\n" 8887 " \"literal\",\n" 8888 " short,\n" 8889 " loooooooooooooooooooong);", 8890 format("variable = f(\"long string literal\", short, " 8891 "loooooooooooooooooooong);", 8892 getLLVMStyleWithColumns(20))); 8893 8894 EXPECT_EQ( 8895 "f(g(\"long string \"\n" 8896 " \"literal\"),\n" 8897 " b);", 8898 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 8899 EXPECT_EQ("f(g(\"long string \"\n" 8900 " \"literal\",\n" 8901 " a),\n" 8902 " b);", 8903 format("f(g(\"long string literal\", a), b);", 8904 getLLVMStyleWithColumns(20))); 8905 EXPECT_EQ( 8906 "f(\"one two\".split(\n" 8907 " variable));", 8908 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 8909 EXPECT_EQ("f(\"one two three four five six \"\n" 8910 " \"seven\".split(\n" 8911 " really_looooong_variable));", 8912 format("f(\"one two three four five six seven\"." 8913 "split(really_looooong_variable));", 8914 getLLVMStyleWithColumns(33))); 8915 8916 EXPECT_EQ("f(\"some \"\n" 8917 " \"text\",\n" 8918 " other);", 8919 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 8920 8921 // Only break as a last resort. 8922 verifyFormat( 8923 "aaaaaaaaaaaaaaaaaaaa(\n" 8924 " aaaaaaaaaaaaaaaaaaaa,\n" 8925 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 8926 8927 EXPECT_EQ("\"splitmea\"\n" 8928 "\"trandomp\"\n" 8929 "\"oint\"", 8930 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 8931 8932 EXPECT_EQ("\"split/\"\n" 8933 "\"pathat/\"\n" 8934 "\"slashes\"", 8935 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 8936 8937 EXPECT_EQ("\"split/\"\n" 8938 "\"pathat/\"\n" 8939 "\"slashes\"", 8940 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 8941 EXPECT_EQ("\"split at \"\n" 8942 "\"spaces/at/\"\n" 8943 "\"slashes.at.any$\"\n" 8944 "\"non-alphanumeric%\"\n" 8945 "\"1111111111characte\"\n" 8946 "\"rs\"", 8947 format("\"split at " 8948 "spaces/at/" 8949 "slashes.at." 8950 "any$non-" 8951 "alphanumeric%" 8952 "1111111111characte" 8953 "rs\"", 8954 getLLVMStyleWithColumns(20))); 8955 8956 // Verify that splitting the strings understands 8957 // Style::AlwaysBreakBeforeMultilineStrings. 8958 EXPECT_EQ( 8959 "aaaaaaaaaaaa(\n" 8960 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 8961 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 8962 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 8963 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 8964 "aaaaaaaaaaaaaaaaaaaaaa\");", 8965 getGoogleStyle())); 8966 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8967 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 8968 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 8969 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 8970 "aaaaaaaaaaaaaaaaaaaaaa\";", 8971 getGoogleStyle())); 8972 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8973 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 8974 format("llvm::outs() << " 8975 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 8976 "aaaaaaaaaaaaaaaaaaa\";")); 8977 EXPECT_EQ("ffff(\n" 8978 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8979 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 8980 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 8981 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 8982 getGoogleStyle())); 8983 8984 FormatStyle Style = getLLVMStyleWithColumns(12); 8985 Style.BreakStringLiterals = false; 8986 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 8987 8988 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 8989 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 8990 EXPECT_EQ("#define A \\\n" 8991 " \"some \" \\\n" 8992 " \"text \" \\\n" 8993 " \"other\";", 8994 format("#define A \"some text other\";", AlignLeft)); 8995 } 8996 8997 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 8998 EXPECT_EQ("C a = \"some more \"\n" 8999 " \"text\";", 9000 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9001 } 9002 9003 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9004 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9005 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9006 EXPECT_EQ("int i = a(b());", 9007 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9008 } 9009 9010 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9011 EXPECT_EQ( 9012 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9013 "(\n" 9014 " \"x\t\");", 9015 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9016 "aaaaaaa(" 9017 "\"x\t\");")); 9018 } 9019 9020 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9021 EXPECT_EQ( 9022 "u8\"utf8 string \"\n" 9023 "u8\"literal\";", 9024 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9025 EXPECT_EQ( 9026 "u\"utf16 string \"\n" 9027 "u\"literal\";", 9028 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9029 EXPECT_EQ( 9030 "U\"utf32 string \"\n" 9031 "U\"literal\";", 9032 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9033 EXPECT_EQ("L\"wide string \"\n" 9034 "L\"literal\";", 9035 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9036 EXPECT_EQ("@\"NSString \"\n" 9037 "@\"literal\";", 9038 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9039 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9040 9041 // This input makes clang-format try to split the incomplete unicode escape 9042 // sequence, which used to lead to a crasher. 9043 verifyNoCrash( 9044 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9045 getLLVMStyleWithColumns(60)); 9046 } 9047 9048 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9049 FormatStyle Style = getGoogleStyleWithColumns(15); 9050 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9051 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9052 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9053 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9054 EXPECT_EQ("u8R\"x(raw literal)x\";", 9055 format("u8R\"x(raw literal)x\";", Style)); 9056 } 9057 9058 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9059 FormatStyle Style = getLLVMStyleWithColumns(20); 9060 EXPECT_EQ( 9061 "_T(\"aaaaaaaaaaaaaa\")\n" 9062 "_T(\"aaaaaaaaaaaaaa\")\n" 9063 "_T(\"aaaaaaaaaaaa\")", 9064 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9065 EXPECT_EQ("f(x,\n" 9066 " _T(\"aaaaaaaaaaaa\")\n" 9067 " _T(\"aaa\"),\n" 9068 " z);", 9069 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9070 9071 // FIXME: Handle embedded spaces in one iteration. 9072 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9073 // "_T(\"aaaaaaaaaaaaa\")\n" 9074 // "_T(\"aaaaaaaaaaaaa\")\n" 9075 // "_T(\"a\")", 9076 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9077 // getLLVMStyleWithColumns(20))); 9078 EXPECT_EQ( 9079 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9080 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9081 EXPECT_EQ("f(\n" 9082 "#if !TEST\n" 9083 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9084 "#endif\n" 9085 ");", 9086 format("f(\n" 9087 "#if !TEST\n" 9088 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9089 "#endif\n" 9090 ");")); 9091 EXPECT_EQ("f(\n" 9092 "\n" 9093 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9094 format("f(\n" 9095 "\n" 9096 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9097 } 9098 9099 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9100 // In a function call with two operands, the second can be broken with no line 9101 // break before it. 9102 EXPECT_EQ("func(a, \"long long \"\n" 9103 " \"long long\");", 9104 format("func(a, \"long long long long\");", 9105 getLLVMStyleWithColumns(24))); 9106 // In a function call with three operands, the second must be broken with a 9107 // line break before it. 9108 EXPECT_EQ("func(a,\n" 9109 " \"long long long \"\n" 9110 " \"long\",\n" 9111 " c);", 9112 format("func(a, \"long long long long\", c);", 9113 getLLVMStyleWithColumns(24))); 9114 // In a function call with three operands, the third must be broken with a 9115 // line break before it. 9116 EXPECT_EQ("func(a, b,\n" 9117 " \"long long long \"\n" 9118 " \"long\");", 9119 format("func(a, b, \"long long long long\");", 9120 getLLVMStyleWithColumns(24))); 9121 // In a function call with three operands, both the second and the third must 9122 // be broken with a line break before them. 9123 EXPECT_EQ("func(a,\n" 9124 " \"long long long \"\n" 9125 " \"long\",\n" 9126 " \"long long long \"\n" 9127 " \"long\");", 9128 format("func(a, \"long long long long\", \"long long long long\");", 9129 getLLVMStyleWithColumns(24))); 9130 // In a chain of << with two operands, the second can be broken with no line 9131 // break before it. 9132 EXPECT_EQ("a << \"line line \"\n" 9133 " \"line\";", 9134 format("a << \"line line line\";", 9135 getLLVMStyleWithColumns(20))); 9136 // In a chain of << with three operands, the second can be broken with no line 9137 // break before it. 9138 EXPECT_EQ("abcde << \"line \"\n" 9139 " \"line line\"\n" 9140 " << c;", 9141 format("abcde << \"line line line\" << c;", 9142 getLLVMStyleWithColumns(20))); 9143 // In a chain of << with three operands, the third must be broken with a line 9144 // break before it. 9145 EXPECT_EQ("a << b\n" 9146 " << \"line line \"\n" 9147 " \"line\";", 9148 format("a << b << \"line line line\";", 9149 getLLVMStyleWithColumns(20))); 9150 // In a chain of << with three operands, the second can be broken with no line 9151 // break before it and the third must be broken with a line break before it. 9152 EXPECT_EQ("abcd << \"line line \"\n" 9153 " \"line\"\n" 9154 " << \"line line \"\n" 9155 " \"line\";", 9156 format("abcd << \"line line line\" << \"line line line\";", 9157 getLLVMStyleWithColumns(20))); 9158 // In a chain of binary operators with two operands, the second can be broken 9159 // with no line break before it. 9160 EXPECT_EQ("abcd + \"line line \"\n" 9161 " \"line line\";", 9162 format("abcd + \"line line line line\";", 9163 getLLVMStyleWithColumns(20))); 9164 // In a chain of binary operators with three operands, the second must be 9165 // broken with a line break before it. 9166 EXPECT_EQ("abcd +\n" 9167 " \"line line \"\n" 9168 " \"line line\" +\n" 9169 " e;", 9170 format("abcd + \"line line line line\" + e;", 9171 getLLVMStyleWithColumns(20))); 9172 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9173 // the first must be broken with a line break before it. 9174 FormatStyle Style = getLLVMStyleWithColumns(25); 9175 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9176 EXPECT_EQ("someFunction(\n" 9177 " \"long long long \"\n" 9178 " \"long\",\n" 9179 " a);", 9180 format("someFunction(\"long long long long\", a);", Style)); 9181 } 9182 9183 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9184 EXPECT_EQ( 9185 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9188 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9189 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9191 } 9192 9193 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9194 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9195 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9196 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9197 "multiline raw string literal xxxxxxxxxxxxxx\n" 9198 ")x\",\n" 9199 " a),\n" 9200 " b);", 9201 format("fffffffffff(g(R\"x(\n" 9202 "multiline raw string literal xxxxxxxxxxxxxx\n" 9203 ")x\", a), b);", 9204 getGoogleStyleWithColumns(20))); 9205 EXPECT_EQ("fffffffffff(\n" 9206 " g(R\"x(qqq\n" 9207 "multiline raw string literal xxxxxxxxxxxxxx\n" 9208 ")x\",\n" 9209 " a),\n" 9210 " b);", 9211 format("fffffffffff(g(R\"x(qqq\n" 9212 "multiline raw string literal xxxxxxxxxxxxxx\n" 9213 ")x\", a), b);", 9214 getGoogleStyleWithColumns(20))); 9215 9216 EXPECT_EQ("fffffffffff(R\"x(\n" 9217 "multiline raw string literal xxxxxxxxxxxxxx\n" 9218 ")x\");", 9219 format("fffffffffff(R\"x(\n" 9220 "multiline raw string literal xxxxxxxxxxxxxx\n" 9221 ")x\");", 9222 getGoogleStyleWithColumns(20))); 9223 EXPECT_EQ("fffffffffff(R\"x(\n" 9224 "multiline raw string literal xxxxxxxxxxxxxx\n" 9225 ")x\" + bbbbbb);", 9226 format("fffffffffff(R\"x(\n" 9227 "multiline raw string literal xxxxxxxxxxxxxx\n" 9228 ")x\" + bbbbbb);", 9229 getGoogleStyleWithColumns(20))); 9230 EXPECT_EQ("fffffffffff(\n" 9231 " R\"x(\n" 9232 "multiline raw string literal xxxxxxxxxxxxxx\n" 9233 ")x\" +\n" 9234 " bbbbbb);", 9235 format("fffffffffff(\n" 9236 " R\"x(\n" 9237 "multiline raw string literal xxxxxxxxxxxxxx\n" 9238 ")x\" + bbbbbb);", 9239 getGoogleStyleWithColumns(20))); 9240 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9241 format("fffffffffff(\n" 9242 " R\"(single line raw string)\" + bbbbbb);")); 9243 } 9244 9245 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9246 verifyFormat("string a = \"unterminated;"); 9247 EXPECT_EQ("function(\"unterminated,\n" 9248 " OtherParameter);", 9249 format("function( \"unterminated,\n" 9250 " OtherParameter);")); 9251 } 9252 9253 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9254 FormatStyle Style = getLLVMStyle(); 9255 Style.Standard = FormatStyle::LS_Cpp03; 9256 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9257 format("#define x(_a) printf(\"foo\"_a);", Style)); 9258 } 9259 9260 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9261 9262 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9263 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9264 " \"ddeeefff\");", 9265 format("someFunction(\"aaabbbcccdddeeefff\");", 9266 getLLVMStyleWithColumns(25))); 9267 EXPECT_EQ("someFunction1234567890(\n" 9268 " \"aaabbbcccdddeeefff\");", 9269 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9270 getLLVMStyleWithColumns(26))); 9271 EXPECT_EQ("someFunction1234567890(\n" 9272 " \"aaabbbcccdddeeeff\"\n" 9273 " \"f\");", 9274 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9275 getLLVMStyleWithColumns(25))); 9276 EXPECT_EQ("someFunction1234567890(\n" 9277 " \"aaabbbcccdddeeeff\"\n" 9278 " \"f\");", 9279 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9280 getLLVMStyleWithColumns(24))); 9281 EXPECT_EQ("someFunction(\n" 9282 " \"aaabbbcc ddde \"\n" 9283 " \"efff\");", 9284 format("someFunction(\"aaabbbcc ddde efff\");", 9285 getLLVMStyleWithColumns(25))); 9286 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9287 " \"ddeeefff\");", 9288 format("someFunction(\"aaabbbccc ddeeefff\");", 9289 getLLVMStyleWithColumns(25))); 9290 EXPECT_EQ("someFunction1234567890(\n" 9291 " \"aaabb \"\n" 9292 " \"cccdddeeefff\");", 9293 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9294 getLLVMStyleWithColumns(25))); 9295 EXPECT_EQ("#define A \\\n" 9296 " string s = \\\n" 9297 " \"123456789\" \\\n" 9298 " \"0\"; \\\n" 9299 " int i;", 9300 format("#define A string s = \"1234567890\"; int i;", 9301 getLLVMStyleWithColumns(20))); 9302 EXPECT_EQ("someFunction(\n" 9303 " \"aaabbbcc \"\n" 9304 " \"dddeeefff\");", 9305 format("someFunction(\"aaabbbcc dddeeefff\");", 9306 getLLVMStyleWithColumns(25))); 9307 } 9308 9309 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9310 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9311 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9312 EXPECT_EQ("\"test\"\n" 9313 "\"\\n\"", 9314 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9315 EXPECT_EQ("\"tes\\\\\"\n" 9316 "\"n\"", 9317 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9318 EXPECT_EQ("\"\\\\\\\\\"\n" 9319 "\"\\n\"", 9320 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9321 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9322 EXPECT_EQ("\"\\uff01\"\n" 9323 "\"test\"", 9324 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9325 EXPECT_EQ("\"\\Uff01ff02\"", 9326 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9327 EXPECT_EQ("\"\\x000000000001\"\n" 9328 "\"next\"", 9329 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9330 EXPECT_EQ("\"\\x000000000001next\"", 9331 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9332 EXPECT_EQ("\"\\x000000000001\"", 9333 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9334 EXPECT_EQ("\"test\"\n" 9335 "\"\\000000\"\n" 9336 "\"000001\"", 9337 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9338 EXPECT_EQ("\"test\\000\"\n" 9339 "\"00000000\"\n" 9340 "\"1\"", 9341 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9342 } 9343 9344 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9345 verifyFormat("void f() {\n" 9346 " return g() {}\n" 9347 " void h() {}"); 9348 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9349 "g();\n" 9350 "}"); 9351 } 9352 9353 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9354 verifyFormat( 9355 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9356 } 9357 9358 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9359 verifyFormat("class X {\n" 9360 " void f() {\n" 9361 " }\n" 9362 "};", 9363 getLLVMStyleWithColumns(12)); 9364 } 9365 9366 TEST_F(FormatTest, ConfigurableIndentWidth) { 9367 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9368 EightIndent.IndentWidth = 8; 9369 EightIndent.ContinuationIndentWidth = 8; 9370 verifyFormat("void f() {\n" 9371 " someFunction();\n" 9372 " if (true) {\n" 9373 " f();\n" 9374 " }\n" 9375 "}", 9376 EightIndent); 9377 verifyFormat("class X {\n" 9378 " void f() {\n" 9379 " }\n" 9380 "};", 9381 EightIndent); 9382 verifyFormat("int x[] = {\n" 9383 " call(),\n" 9384 " call()};", 9385 EightIndent); 9386 } 9387 9388 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9389 verifyFormat("double\n" 9390 "f();", 9391 getLLVMStyleWithColumns(8)); 9392 } 9393 9394 TEST_F(FormatTest, ConfigurableUseOfTab) { 9395 FormatStyle Tab = getLLVMStyleWithColumns(42); 9396 Tab.IndentWidth = 8; 9397 Tab.UseTab = FormatStyle::UT_Always; 9398 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9399 9400 EXPECT_EQ("if (aaaaaaaa && // q\n" 9401 " bb)\t\t// w\n" 9402 "\t;", 9403 format("if (aaaaaaaa &&// q\n" 9404 "bb)// w\n" 9405 ";", 9406 Tab)); 9407 EXPECT_EQ("if (aaa && bbb) // w\n" 9408 "\t;", 9409 format("if(aaa&&bbb)// w\n" 9410 ";", 9411 Tab)); 9412 9413 verifyFormat("class X {\n" 9414 "\tvoid f() {\n" 9415 "\t\tsomeFunction(parameter1,\n" 9416 "\t\t\t parameter2);\n" 9417 "\t}\n" 9418 "};", 9419 Tab); 9420 verifyFormat("#define A \\\n" 9421 "\tvoid f() { \\\n" 9422 "\t\tsomeFunction( \\\n" 9423 "\t\t parameter1, \\\n" 9424 "\t\t parameter2); \\\n" 9425 "\t}", 9426 Tab); 9427 verifyFormat("int a;\t // x\n" 9428 "int bbbbbbbb; // x\n", 9429 Tab); 9430 9431 Tab.TabWidth = 4; 9432 Tab.IndentWidth = 8; 9433 verifyFormat("class TabWidth4Indent8 {\n" 9434 "\t\tvoid f() {\n" 9435 "\t\t\t\tsomeFunction(parameter1,\n" 9436 "\t\t\t\t\t\t\t parameter2);\n" 9437 "\t\t}\n" 9438 "};", 9439 Tab); 9440 9441 Tab.TabWidth = 4; 9442 Tab.IndentWidth = 4; 9443 verifyFormat("class TabWidth4Indent4 {\n" 9444 "\tvoid f() {\n" 9445 "\t\tsomeFunction(parameter1,\n" 9446 "\t\t\t\t\t parameter2);\n" 9447 "\t}\n" 9448 "};", 9449 Tab); 9450 9451 Tab.TabWidth = 8; 9452 Tab.IndentWidth = 4; 9453 verifyFormat("class TabWidth8Indent4 {\n" 9454 " void f() {\n" 9455 "\tsomeFunction(parameter1,\n" 9456 "\t\t parameter2);\n" 9457 " }\n" 9458 "};", 9459 Tab); 9460 9461 Tab.TabWidth = 8; 9462 Tab.IndentWidth = 8; 9463 EXPECT_EQ("/*\n" 9464 "\t a\t\tcomment\n" 9465 "\t in multiple lines\n" 9466 " */", 9467 format(" /*\t \t \n" 9468 " \t \t a\t\tcomment\t \t\n" 9469 " \t \t in multiple lines\t\n" 9470 " \t */", 9471 Tab)); 9472 9473 Tab.UseTab = FormatStyle::UT_ForIndentation; 9474 verifyFormat("{\n" 9475 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9476 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9477 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9478 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9479 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9480 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9481 "};", 9482 Tab); 9483 verifyFormat("enum AA {\n" 9484 "\ta1, // Force multiple lines\n" 9485 "\ta2,\n" 9486 "\ta3\n" 9487 "};", 9488 Tab); 9489 EXPECT_EQ("if (aaaaaaaa && // q\n" 9490 " bb) // w\n" 9491 "\t;", 9492 format("if (aaaaaaaa &&// q\n" 9493 "bb)// w\n" 9494 ";", 9495 Tab)); 9496 verifyFormat("class X {\n" 9497 "\tvoid f() {\n" 9498 "\t\tsomeFunction(parameter1,\n" 9499 "\t\t parameter2);\n" 9500 "\t}\n" 9501 "};", 9502 Tab); 9503 verifyFormat("{\n" 9504 "\tQ(\n" 9505 "\t {\n" 9506 "\t\t int a;\n" 9507 "\t\t someFunction(aaaaaaaa,\n" 9508 "\t\t bbbbbbb);\n" 9509 "\t },\n" 9510 "\t p);\n" 9511 "}", 9512 Tab); 9513 EXPECT_EQ("{\n" 9514 "\t/* aaaa\n" 9515 "\t bbbb */\n" 9516 "}", 9517 format("{\n" 9518 "/* aaaa\n" 9519 " bbbb */\n" 9520 "}", 9521 Tab)); 9522 EXPECT_EQ("{\n" 9523 "\t/*\n" 9524 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9525 "\t bbbbbbbbbbbbb\n" 9526 "\t*/\n" 9527 "}", 9528 format("{\n" 9529 "/*\n" 9530 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9531 "*/\n" 9532 "}", 9533 Tab)); 9534 EXPECT_EQ("{\n" 9535 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9536 "\t// bbbbbbbbbbbbb\n" 9537 "}", 9538 format("{\n" 9539 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9540 "}", 9541 Tab)); 9542 EXPECT_EQ("{\n" 9543 "\t/*\n" 9544 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9545 "\t bbbbbbbbbbbbb\n" 9546 "\t*/\n" 9547 "}", 9548 format("{\n" 9549 "\t/*\n" 9550 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9551 "\t*/\n" 9552 "}", 9553 Tab)); 9554 EXPECT_EQ("{\n" 9555 "\t/*\n" 9556 "\n" 9557 "\t*/\n" 9558 "}", 9559 format("{\n" 9560 "\t/*\n" 9561 "\n" 9562 "\t*/\n" 9563 "}", 9564 Tab)); 9565 EXPECT_EQ("{\n" 9566 "\t/*\n" 9567 " asdf\n" 9568 "\t*/\n" 9569 "}", 9570 format("{\n" 9571 "\t/*\n" 9572 " asdf\n" 9573 "\t*/\n" 9574 "}", 9575 Tab)); 9576 9577 Tab.UseTab = FormatStyle::UT_Never; 9578 EXPECT_EQ("/*\n" 9579 " a\t\tcomment\n" 9580 " in multiple lines\n" 9581 " */", 9582 format(" /*\t \t \n" 9583 " \t \t a\t\tcomment\t \t\n" 9584 " \t \t in multiple lines\t\n" 9585 " \t */", 9586 Tab)); 9587 EXPECT_EQ("/* some\n" 9588 " comment */", 9589 format(" \t \t /* some\n" 9590 " \t \t comment */", 9591 Tab)); 9592 EXPECT_EQ("int a; /* some\n" 9593 " comment */", 9594 format(" \t \t int a; /* some\n" 9595 " \t \t comment */", 9596 Tab)); 9597 9598 EXPECT_EQ("int a; /* some\n" 9599 "comment */", 9600 format(" \t \t int\ta; /* some\n" 9601 " \t \t comment */", 9602 Tab)); 9603 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9604 " comment */", 9605 format(" \t \t f(\"\t\t\"); /* some\n" 9606 " \t \t comment */", 9607 Tab)); 9608 EXPECT_EQ("{\n" 9609 " /*\n" 9610 " * Comment\n" 9611 " */\n" 9612 " int i;\n" 9613 "}", 9614 format("{\n" 9615 "\t/*\n" 9616 "\t * Comment\n" 9617 "\t */\n" 9618 "\t int i;\n" 9619 "}")); 9620 9621 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 9622 Tab.TabWidth = 8; 9623 Tab.IndentWidth = 8; 9624 EXPECT_EQ("if (aaaaaaaa && // q\n" 9625 " bb) // w\n" 9626 "\t;", 9627 format("if (aaaaaaaa &&// q\n" 9628 "bb)// w\n" 9629 ";", 9630 Tab)); 9631 EXPECT_EQ("if (aaa && bbb) // w\n" 9632 "\t;", 9633 format("if(aaa&&bbb)// w\n" 9634 ";", 9635 Tab)); 9636 verifyFormat("class X {\n" 9637 "\tvoid f() {\n" 9638 "\t\tsomeFunction(parameter1,\n" 9639 "\t\t\t parameter2);\n" 9640 "\t}\n" 9641 "};", 9642 Tab); 9643 verifyFormat("#define A \\\n" 9644 "\tvoid f() { \\\n" 9645 "\t\tsomeFunction( \\\n" 9646 "\t\t parameter1, \\\n" 9647 "\t\t parameter2); \\\n" 9648 "\t}", 9649 Tab); 9650 Tab.TabWidth = 4; 9651 Tab.IndentWidth = 8; 9652 verifyFormat("class TabWidth4Indent8 {\n" 9653 "\t\tvoid f() {\n" 9654 "\t\t\t\tsomeFunction(parameter1,\n" 9655 "\t\t\t\t\t\t\t parameter2);\n" 9656 "\t\t}\n" 9657 "};", 9658 Tab); 9659 Tab.TabWidth = 4; 9660 Tab.IndentWidth = 4; 9661 verifyFormat("class TabWidth4Indent4 {\n" 9662 "\tvoid f() {\n" 9663 "\t\tsomeFunction(parameter1,\n" 9664 "\t\t\t\t\t parameter2);\n" 9665 "\t}\n" 9666 "};", 9667 Tab); 9668 Tab.TabWidth = 8; 9669 Tab.IndentWidth = 4; 9670 verifyFormat("class TabWidth8Indent4 {\n" 9671 " void f() {\n" 9672 "\tsomeFunction(parameter1,\n" 9673 "\t\t parameter2);\n" 9674 " }\n" 9675 "};", 9676 Tab); 9677 Tab.TabWidth = 8; 9678 Tab.IndentWidth = 8; 9679 EXPECT_EQ("/*\n" 9680 "\t a\t\tcomment\n" 9681 "\t in multiple lines\n" 9682 " */", 9683 format(" /*\t \t \n" 9684 " \t \t a\t\tcomment\t \t\n" 9685 " \t \t in multiple lines\t\n" 9686 " \t */", 9687 Tab)); 9688 verifyFormat("{\n" 9689 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9690 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9691 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9692 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9693 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9694 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9695 "};", 9696 Tab); 9697 verifyFormat("enum AA {\n" 9698 "\ta1, // Force multiple lines\n" 9699 "\ta2,\n" 9700 "\ta3\n" 9701 "};", 9702 Tab); 9703 EXPECT_EQ("if (aaaaaaaa && // q\n" 9704 " bb) // w\n" 9705 "\t;", 9706 format("if (aaaaaaaa &&// q\n" 9707 "bb)// w\n" 9708 ";", 9709 Tab)); 9710 verifyFormat("class X {\n" 9711 "\tvoid f() {\n" 9712 "\t\tsomeFunction(parameter1,\n" 9713 "\t\t\t parameter2);\n" 9714 "\t}\n" 9715 "};", 9716 Tab); 9717 verifyFormat("{\n" 9718 "\tQ(\n" 9719 "\t {\n" 9720 "\t\t int a;\n" 9721 "\t\t someFunction(aaaaaaaa,\n" 9722 "\t\t\t\t bbbbbbb);\n" 9723 "\t },\n" 9724 "\t p);\n" 9725 "}", 9726 Tab); 9727 EXPECT_EQ("{\n" 9728 "\t/* aaaa\n" 9729 "\t bbbb */\n" 9730 "}", 9731 format("{\n" 9732 "/* aaaa\n" 9733 " bbbb */\n" 9734 "}", 9735 Tab)); 9736 EXPECT_EQ("{\n" 9737 "\t/*\n" 9738 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9739 "\t bbbbbbbbbbbbb\n" 9740 "\t*/\n" 9741 "}", 9742 format("{\n" 9743 "/*\n" 9744 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9745 "*/\n" 9746 "}", 9747 Tab)); 9748 EXPECT_EQ("{\n" 9749 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9750 "\t// bbbbbbbbbbbbb\n" 9751 "}", 9752 format("{\n" 9753 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9754 "}", 9755 Tab)); 9756 EXPECT_EQ("{\n" 9757 "\t/*\n" 9758 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9759 "\t bbbbbbbbbbbbb\n" 9760 "\t*/\n" 9761 "}", 9762 format("{\n" 9763 "\t/*\n" 9764 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9765 "\t*/\n" 9766 "}", 9767 Tab)); 9768 EXPECT_EQ("{\n" 9769 "\t/*\n" 9770 "\n" 9771 "\t*/\n" 9772 "}", 9773 format("{\n" 9774 "\t/*\n" 9775 "\n" 9776 "\t*/\n" 9777 "}", 9778 Tab)); 9779 EXPECT_EQ("{\n" 9780 "\t/*\n" 9781 " asdf\n" 9782 "\t*/\n" 9783 "}", 9784 format("{\n" 9785 "\t/*\n" 9786 " asdf\n" 9787 "\t*/\n" 9788 "}", 9789 Tab)); 9790 EXPECT_EQ("/*\n" 9791 "\t a\t\tcomment\n" 9792 "\t in multiple lines\n" 9793 " */", 9794 format(" /*\t \t \n" 9795 " \t \t a\t\tcomment\t \t\n" 9796 " \t \t in multiple lines\t\n" 9797 " \t */", 9798 Tab)); 9799 EXPECT_EQ("/* some\n" 9800 " comment */", 9801 format(" \t \t /* some\n" 9802 " \t \t comment */", 9803 Tab)); 9804 EXPECT_EQ("int a; /* some\n" 9805 " comment */", 9806 format(" \t \t int a; /* some\n" 9807 " \t \t comment */", 9808 Tab)); 9809 EXPECT_EQ("int a; /* some\n" 9810 "comment */", 9811 format(" \t \t int\ta; /* some\n" 9812 " \t \t comment */", 9813 Tab)); 9814 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9815 " comment */", 9816 format(" \t \t f(\"\t\t\"); /* some\n" 9817 " \t \t comment */", 9818 Tab)); 9819 EXPECT_EQ("{\n" 9820 " /*\n" 9821 " * Comment\n" 9822 " */\n" 9823 " int i;\n" 9824 "}", 9825 format("{\n" 9826 "\t/*\n" 9827 "\t * Comment\n" 9828 "\t */\n" 9829 "\t int i;\n" 9830 "}")); 9831 Tab.AlignConsecutiveAssignments = true; 9832 Tab.AlignConsecutiveDeclarations = true; 9833 Tab.TabWidth = 4; 9834 Tab.IndentWidth = 4; 9835 verifyFormat("class Assign {\n" 9836 "\tvoid f() {\n" 9837 "\t\tint x = 123;\n" 9838 "\t\tint random = 4;\n" 9839 "\t\tstd::string alphabet =\n" 9840 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 9841 "\t}\n" 9842 "};", 9843 Tab); 9844 } 9845 9846 TEST_F(FormatTest, CalculatesOriginalColumn) { 9847 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9848 "q\"; /* some\n" 9849 " comment */", 9850 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9851 "q\"; /* some\n" 9852 " comment */", 9853 getLLVMStyle())); 9854 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 9855 "/* some\n" 9856 " comment */", 9857 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 9858 " /* some\n" 9859 " comment */", 9860 getLLVMStyle())); 9861 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9862 "qqq\n" 9863 "/* some\n" 9864 " comment */", 9865 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9866 "qqq\n" 9867 " /* some\n" 9868 " comment */", 9869 getLLVMStyle())); 9870 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9871 "wwww; /* some\n" 9872 " comment */", 9873 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9874 "wwww; /* some\n" 9875 " comment */", 9876 getLLVMStyle())); 9877 } 9878 9879 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 9880 FormatStyle NoSpace = getLLVMStyle(); 9881 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 9882 9883 verifyFormat("while(true)\n" 9884 " continue;", 9885 NoSpace); 9886 verifyFormat("for(;;)\n" 9887 " continue;", 9888 NoSpace); 9889 verifyFormat("if(true)\n" 9890 " f();\n" 9891 "else if(true)\n" 9892 " f();", 9893 NoSpace); 9894 verifyFormat("do {\n" 9895 " do_something();\n" 9896 "} while(something());", 9897 NoSpace); 9898 verifyFormat("switch(x) {\n" 9899 "default:\n" 9900 " break;\n" 9901 "}", 9902 NoSpace); 9903 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 9904 verifyFormat("size_t x = sizeof(x);", NoSpace); 9905 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 9906 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 9907 verifyFormat("alignas(128) char a[128];", NoSpace); 9908 verifyFormat("size_t x = alignof(MyType);", NoSpace); 9909 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 9910 verifyFormat("int f() throw(Deprecated);", NoSpace); 9911 verifyFormat("typedef void (*cb)(int);", NoSpace); 9912 verifyFormat("T A::operator()();", NoSpace); 9913 verifyFormat("X A::operator++(T);", NoSpace); 9914 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 9915 9916 FormatStyle Space = getLLVMStyle(); 9917 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 9918 9919 verifyFormat("int f ();", Space); 9920 verifyFormat("void f (int a, T b) {\n" 9921 " while (true)\n" 9922 " continue;\n" 9923 "}", 9924 Space); 9925 verifyFormat("if (true)\n" 9926 " f ();\n" 9927 "else if (true)\n" 9928 " f ();", 9929 Space); 9930 verifyFormat("do {\n" 9931 " do_something ();\n" 9932 "} while (something ());", 9933 Space); 9934 verifyFormat("switch (x) {\n" 9935 "default:\n" 9936 " break;\n" 9937 "}", 9938 Space); 9939 verifyFormat("A::A () : a (1) {}", Space); 9940 verifyFormat("void f () __attribute__ ((asdf));", Space); 9941 verifyFormat("*(&a + 1);\n" 9942 "&((&a)[1]);\n" 9943 "a[(b + c) * d];\n" 9944 "(((a + 1) * 2) + 3) * 4;", 9945 Space); 9946 verifyFormat("#define A(x) x", Space); 9947 verifyFormat("#define A (x) x", Space); 9948 verifyFormat("#if defined(x)\n" 9949 "#endif", 9950 Space); 9951 verifyFormat("auto i = std::make_unique<int> (5);", Space); 9952 verifyFormat("size_t x = sizeof (x);", Space); 9953 verifyFormat("auto f (int x) -> decltype (x);", Space); 9954 verifyFormat("int f (T x) noexcept (x.create ());", Space); 9955 verifyFormat("alignas (128) char a[128];", Space); 9956 verifyFormat("size_t x = alignof (MyType);", Space); 9957 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 9958 verifyFormat("int f () throw (Deprecated);", Space); 9959 verifyFormat("typedef void (*cb) (int);", Space); 9960 verifyFormat("T A::operator() ();", Space); 9961 verifyFormat("X A::operator++ (T);", Space); 9962 verifyFormat("auto lambda = [] () { return 0; };", Space); 9963 verifyFormat("int x = int (y);", Space); 9964 9965 FormatStyle SomeSpace = getLLVMStyle(); 9966 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 9967 9968 verifyFormat("[]() -> float {}", SomeSpace); 9969 verifyFormat("[] (auto foo) {}", SomeSpace); 9970 verifyFormat("[foo]() -> int {}", SomeSpace); 9971 verifyFormat("int f();", SomeSpace); 9972 verifyFormat("void f (int a, T b) {\n" 9973 " while (true)\n" 9974 " continue;\n" 9975 "}", 9976 SomeSpace); 9977 verifyFormat("if (true)\n" 9978 " f();\n" 9979 "else if (true)\n" 9980 " f();", 9981 SomeSpace); 9982 verifyFormat("do {\n" 9983 " do_something();\n" 9984 "} while (something());", 9985 SomeSpace); 9986 verifyFormat("switch (x) {\n" 9987 "default:\n" 9988 " break;\n" 9989 "}", 9990 SomeSpace); 9991 verifyFormat("A::A() : a (1) {}", SomeSpace); 9992 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 9993 verifyFormat("*(&a + 1);\n" 9994 "&((&a)[1]);\n" 9995 "a[(b + c) * d];\n" 9996 "(((a + 1) * 2) + 3) * 4;", 9997 SomeSpace); 9998 verifyFormat("#define A(x) x", SomeSpace); 9999 verifyFormat("#define A (x) x", SomeSpace); 10000 verifyFormat("#if defined(x)\n" 10001 "#endif", 10002 SomeSpace); 10003 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10004 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10005 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10006 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10007 verifyFormat("alignas (128) char a[128];", SomeSpace); 10008 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10009 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10010 SomeSpace); 10011 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10012 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10013 verifyFormat("T A::operator()();", SomeSpace); 10014 verifyFormat("X A::operator++ (T);", SomeSpace); 10015 verifyFormat("int x = int (y);", SomeSpace); 10016 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10017 } 10018 10019 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10020 FormatStyle Spaces = getLLVMStyle(); 10021 Spaces.SpaceAfterLogicalNot = true; 10022 10023 verifyFormat("bool x = ! y", Spaces); 10024 verifyFormat("if (! isFailure())", Spaces); 10025 verifyFormat("if (! (a && b))", Spaces); 10026 verifyFormat("\"Error!\"", Spaces); 10027 verifyFormat("! ! x", Spaces); 10028 } 10029 10030 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10031 FormatStyle Spaces = getLLVMStyle(); 10032 10033 Spaces.SpacesInParentheses = true; 10034 verifyFormat("do_something( ::globalVar );", Spaces); 10035 verifyFormat("call( x, y, z );", Spaces); 10036 verifyFormat("call();", Spaces); 10037 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10038 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10039 Spaces); 10040 verifyFormat("while ( (bool)1 )\n" 10041 " continue;", 10042 Spaces); 10043 verifyFormat("for ( ;; )\n" 10044 " continue;", 10045 Spaces); 10046 verifyFormat("if ( true )\n" 10047 " f();\n" 10048 "else if ( true )\n" 10049 " f();", 10050 Spaces); 10051 verifyFormat("do {\n" 10052 " do_something( (int)i );\n" 10053 "} while ( something() );", 10054 Spaces); 10055 verifyFormat("switch ( x ) {\n" 10056 "default:\n" 10057 " break;\n" 10058 "}", 10059 Spaces); 10060 10061 Spaces.SpacesInParentheses = false; 10062 Spaces.SpacesInCStyleCastParentheses = true; 10063 verifyFormat("Type *A = ( Type * )P;", Spaces); 10064 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 10065 verifyFormat("x = ( int32 )y;", Spaces); 10066 verifyFormat("int a = ( int )(2.0f);", Spaces); 10067 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 10068 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 10069 verifyFormat("#define x (( int )-1)", Spaces); 10070 10071 // Run the first set of tests again with: 10072 Spaces.SpacesInParentheses = false; 10073 Spaces.SpaceInEmptyParentheses = true; 10074 Spaces.SpacesInCStyleCastParentheses = true; 10075 verifyFormat("call(x, y, z);", Spaces); 10076 verifyFormat("call( );", Spaces); 10077 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10078 verifyFormat("while (( bool )1)\n" 10079 " continue;", 10080 Spaces); 10081 verifyFormat("for (;;)\n" 10082 " continue;", 10083 Spaces); 10084 verifyFormat("if (true)\n" 10085 " f( );\n" 10086 "else if (true)\n" 10087 " f( );", 10088 Spaces); 10089 verifyFormat("do {\n" 10090 " do_something(( int )i);\n" 10091 "} while (something( ));", 10092 Spaces); 10093 verifyFormat("switch (x) {\n" 10094 "default:\n" 10095 " break;\n" 10096 "}", 10097 Spaces); 10098 10099 // Run the first set of tests again with: 10100 Spaces.SpaceAfterCStyleCast = true; 10101 verifyFormat("call(x, y, z);", Spaces); 10102 verifyFormat("call( );", Spaces); 10103 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10104 verifyFormat("while (( bool ) 1)\n" 10105 " continue;", 10106 Spaces); 10107 verifyFormat("for (;;)\n" 10108 " continue;", 10109 Spaces); 10110 verifyFormat("if (true)\n" 10111 " f( );\n" 10112 "else if (true)\n" 10113 " f( );", 10114 Spaces); 10115 verifyFormat("do {\n" 10116 " do_something(( int ) i);\n" 10117 "} while (something( ));", 10118 Spaces); 10119 verifyFormat("switch (x) {\n" 10120 "default:\n" 10121 " break;\n" 10122 "}", 10123 Spaces); 10124 10125 // Run subset of tests again with: 10126 Spaces.SpacesInCStyleCastParentheses = false; 10127 Spaces.SpaceAfterCStyleCast = true; 10128 verifyFormat("while ((bool) 1)\n" 10129 " continue;", 10130 Spaces); 10131 verifyFormat("do {\n" 10132 " do_something((int) i);\n" 10133 "} while (something( ));", 10134 Spaces); 10135 } 10136 10137 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 10138 verifyFormat("int a[5];"); 10139 verifyFormat("a[3] += 42;"); 10140 10141 FormatStyle Spaces = getLLVMStyle(); 10142 Spaces.SpacesInSquareBrackets = true; 10143 // Lambdas unchanged. 10144 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 10145 verifyFormat("return [i, args...] {};", Spaces); 10146 10147 // Not lambdas. 10148 verifyFormat("int a[ 5 ];", Spaces); 10149 verifyFormat("a[ 3 ] += 42;", Spaces); 10150 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 10151 verifyFormat("double &operator[](int i) { return 0; }\n" 10152 "int i;", 10153 Spaces); 10154 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 10155 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 10156 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 10157 } 10158 10159 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10160 verifyFormat("int a = 5;"); 10161 verifyFormat("a += 42;"); 10162 verifyFormat("a or_eq 8;"); 10163 10164 FormatStyle Spaces = getLLVMStyle(); 10165 Spaces.SpaceBeforeAssignmentOperators = false; 10166 verifyFormat("int a= 5;", Spaces); 10167 verifyFormat("a+= 42;", Spaces); 10168 verifyFormat("a or_eq 8;", Spaces); 10169 } 10170 10171 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10172 verifyFormat("class Foo : public Bar {};"); 10173 verifyFormat("Foo::Foo() : foo(1) {}"); 10174 verifyFormat("for (auto a : b) {\n}"); 10175 verifyFormat("int x = a ? b : c;"); 10176 verifyFormat("{\n" 10177 "label0:\n" 10178 " int x = 0;\n" 10179 "}"); 10180 verifyFormat("switch (x) {\n" 10181 "case 1:\n" 10182 "default:\n" 10183 "}"); 10184 10185 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10186 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10187 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10188 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10189 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10190 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10191 verifyFormat("{\n" 10192 "label1:\n" 10193 " int x = 0;\n" 10194 "}", 10195 CtorInitializerStyle); 10196 verifyFormat("switch (x) {\n" 10197 "case 1:\n" 10198 "default:\n" 10199 "}", 10200 CtorInitializerStyle); 10201 CtorInitializerStyle.BreakConstructorInitializers = 10202 FormatStyle::BCIS_AfterColon; 10203 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10204 " aaaaaaaaaaaaaaaa(1),\n" 10205 " bbbbbbbbbbbbbbbb(2) {}", 10206 CtorInitializerStyle); 10207 CtorInitializerStyle.BreakConstructorInitializers = 10208 FormatStyle::BCIS_BeforeComma; 10209 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10210 " : aaaaaaaaaaaaaaaa(1)\n" 10211 " , bbbbbbbbbbbbbbbb(2) {}", 10212 CtorInitializerStyle); 10213 CtorInitializerStyle.BreakConstructorInitializers = 10214 FormatStyle::BCIS_BeforeColon; 10215 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10216 " : aaaaaaaaaaaaaaaa(1),\n" 10217 " bbbbbbbbbbbbbbbb(2) {}", 10218 CtorInitializerStyle); 10219 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10220 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10221 ": aaaaaaaaaaaaaaaa(1),\n" 10222 " bbbbbbbbbbbbbbbb(2) {}", 10223 CtorInitializerStyle); 10224 10225 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10226 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10227 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10228 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10229 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10230 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10231 verifyFormat("{\n" 10232 "label2:\n" 10233 " int x = 0;\n" 10234 "}", 10235 InheritanceStyle); 10236 verifyFormat("switch (x) {\n" 10237 "case 1:\n" 10238 "default:\n" 10239 "}", 10240 InheritanceStyle); 10241 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10242 verifyFormat("class Foooooooooooooooooooooo:\n" 10243 " public aaaaaaaaaaaaaaaaaa,\n" 10244 " public bbbbbbbbbbbbbbbbbb {\n" 10245 "}", 10246 InheritanceStyle); 10247 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10248 verifyFormat("class Foooooooooooooooooooooo\n" 10249 " : public aaaaaaaaaaaaaaaaaa\n" 10250 " , public bbbbbbbbbbbbbbbbbb {\n" 10251 "}", 10252 InheritanceStyle); 10253 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10254 verifyFormat("class Foooooooooooooooooooooo\n" 10255 " : public aaaaaaaaaaaaaaaaaa,\n" 10256 " public bbbbbbbbbbbbbbbbbb {\n" 10257 "}", 10258 InheritanceStyle); 10259 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10260 verifyFormat("class Foooooooooooooooooooooo\n" 10261 ": public aaaaaaaaaaaaaaaaaa,\n" 10262 " public bbbbbbbbbbbbbbbbbb {}", 10263 InheritanceStyle); 10264 10265 FormatStyle ForLoopStyle = getLLVMStyle(); 10266 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10267 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10268 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10269 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10270 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10271 verifyFormat("{\n" 10272 "label2:\n" 10273 " int x = 0;\n" 10274 "}", 10275 ForLoopStyle); 10276 verifyFormat("switch (x) {\n" 10277 "case 1:\n" 10278 "default:\n" 10279 "}", 10280 ForLoopStyle); 10281 10282 FormatStyle NoSpaceStyle = getLLVMStyle(); 10283 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10284 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10285 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10286 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10287 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10288 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10289 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10290 verifyFormat("{\n" 10291 "label3:\n" 10292 " int x = 0;\n" 10293 "}", 10294 NoSpaceStyle); 10295 verifyFormat("switch (x) {\n" 10296 "case 1:\n" 10297 "default:\n" 10298 "}", 10299 NoSpaceStyle); 10300 } 10301 10302 TEST_F(FormatTest, AlignConsecutiveMacros) { 10303 FormatStyle Style = getLLVMStyle(); 10304 Style.AlignConsecutiveAssignments = true; 10305 Style.AlignConsecutiveDeclarations = true; 10306 Style.AlignConsecutiveMacros = false; 10307 10308 verifyFormat("#define a 3\n" 10309 "#define bbbb 4\n" 10310 "#define ccc (5)", 10311 Style); 10312 10313 verifyFormat("#define f(x) (x * x)\n" 10314 "#define fff(x, y, z) (x * y + z)\n" 10315 "#define ffff(x, y) (x - y)", 10316 Style); 10317 10318 verifyFormat("#define foo(x, y) (x + y)\n" 10319 "#define bar (5, 6)(2 + 2)", 10320 Style); 10321 10322 verifyFormat("#define a 3\n" 10323 "#define bbbb 4\n" 10324 "#define ccc (5)\n" 10325 "#define f(x) (x * x)\n" 10326 "#define fff(x, y, z) (x * y + z)\n" 10327 "#define ffff(x, y) (x - y)", 10328 Style); 10329 10330 Style.AlignConsecutiveMacros = true; 10331 verifyFormat("#define a 3\n" 10332 "#define bbbb 4\n" 10333 "#define ccc (5)", 10334 Style); 10335 10336 verifyFormat("#define f(x) (x * x)\n" 10337 "#define fff(x, y, z) (x * y + z)\n" 10338 "#define ffff(x, y) (x - y)", 10339 Style); 10340 10341 verifyFormat("#define foo(x, y) (x + y)\n" 10342 "#define bar (5, 6)(2 + 2)", 10343 Style); 10344 10345 verifyFormat("#define a 3\n" 10346 "#define bbbb 4\n" 10347 "#define ccc (5)\n" 10348 "#define f(x) (x * x)\n" 10349 "#define fff(x, y, z) (x * y + z)\n" 10350 "#define ffff(x, y) (x - y)", 10351 Style); 10352 10353 verifyFormat("#define a 5\n" 10354 "#define foo(x, y) (x + y)\n" 10355 "#define CCC (6)\n" 10356 "auto lambda = []() {\n" 10357 " auto ii = 0;\n" 10358 " float j = 0;\n" 10359 " return 0;\n" 10360 "};\n" 10361 "int i = 0;\n" 10362 "float i2 = 0;\n" 10363 "auto v = type{\n" 10364 " i = 1, //\n" 10365 " (i = 2), //\n" 10366 " i = 3 //\n" 10367 "};", 10368 Style); 10369 10370 Style.AlignConsecutiveMacros = false; 10371 Style.ColumnLimit = 20; 10372 10373 verifyFormat("#define a \\\n" 10374 " \"aabbbbbbbbbbbb\"\n" 10375 "#define D \\\n" 10376 " \"aabbbbbbbbbbbb\" \\\n" 10377 " \"ccddeeeeeeeee\"\n" 10378 "#define B \\\n" 10379 " \"QQQQQQQQQQQQQ\" \\\n" 10380 " \"FFFFFFFFFFFFF\" \\\n" 10381 " \"LLLLLLLL\"\n", 10382 Style); 10383 10384 Style.AlignConsecutiveMacros = true; 10385 verifyFormat("#define a \\\n" 10386 " \"aabbbbbbbbbbbb\"\n" 10387 "#define D \\\n" 10388 " \"aabbbbbbbbbbbb\" \\\n" 10389 " \"ccddeeeeeeeee\"\n" 10390 "#define B \\\n" 10391 " \"QQQQQQQQQQQQQ\" \\\n" 10392 " \"FFFFFFFFFFFFF\" \\\n" 10393 " \"LLLLLLLL\"\n", 10394 Style); 10395 } 10396 10397 TEST_F(FormatTest, AlignConsecutiveAssignments) { 10398 FormatStyle Alignment = getLLVMStyle(); 10399 Alignment.AlignConsecutiveMacros = true; 10400 Alignment.AlignConsecutiveAssignments = false; 10401 verifyFormat("int a = 5;\n" 10402 "int oneTwoThree = 123;", 10403 Alignment); 10404 verifyFormat("int a = 5;\n" 10405 "int oneTwoThree = 123;", 10406 Alignment); 10407 10408 Alignment.AlignConsecutiveAssignments = true; 10409 verifyFormat("int a = 5;\n" 10410 "int oneTwoThree = 123;", 10411 Alignment); 10412 verifyFormat("int a = method();\n" 10413 "int oneTwoThree = 133;", 10414 Alignment); 10415 verifyFormat("a &= 5;\n" 10416 "bcd *= 5;\n" 10417 "ghtyf += 5;\n" 10418 "dvfvdb -= 5;\n" 10419 "a /= 5;\n" 10420 "vdsvsv %= 5;\n" 10421 "sfdbddfbdfbb ^= 5;\n" 10422 "dvsdsv |= 5;\n" 10423 "int dsvvdvsdvvv = 123;", 10424 Alignment); 10425 verifyFormat("int i = 1, j = 10;\n" 10426 "something = 2000;", 10427 Alignment); 10428 verifyFormat("something = 2000;\n" 10429 "int i = 1, j = 10;\n", 10430 Alignment); 10431 verifyFormat("something = 2000;\n" 10432 "another = 911;\n" 10433 "int i = 1, j = 10;\n" 10434 "oneMore = 1;\n" 10435 "i = 2;", 10436 Alignment); 10437 verifyFormat("int a = 5;\n" 10438 "int one = 1;\n" 10439 "method();\n" 10440 "int oneTwoThree = 123;\n" 10441 "int oneTwo = 12;", 10442 Alignment); 10443 verifyFormat("int oneTwoThree = 123;\n" 10444 "int oneTwo = 12;\n" 10445 "method();\n", 10446 Alignment); 10447 verifyFormat("int oneTwoThree = 123; // comment\n" 10448 "int oneTwo = 12; // comment", 10449 Alignment); 10450 EXPECT_EQ("int a = 5;\n" 10451 "\n" 10452 "int oneTwoThree = 123;", 10453 format("int a = 5;\n" 10454 "\n" 10455 "int oneTwoThree= 123;", 10456 Alignment)); 10457 EXPECT_EQ("int a = 5;\n" 10458 "int one = 1;\n" 10459 "\n" 10460 "int oneTwoThree = 123;", 10461 format("int a = 5;\n" 10462 "int one = 1;\n" 10463 "\n" 10464 "int oneTwoThree = 123;", 10465 Alignment)); 10466 EXPECT_EQ("int a = 5;\n" 10467 "int one = 1;\n" 10468 "\n" 10469 "int oneTwoThree = 123;\n" 10470 "int oneTwo = 12;", 10471 format("int a = 5;\n" 10472 "int one = 1;\n" 10473 "\n" 10474 "int oneTwoThree = 123;\n" 10475 "int oneTwo = 12;", 10476 Alignment)); 10477 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10478 verifyFormat("#define A \\\n" 10479 " int aaaa = 12; \\\n" 10480 " int b = 23; \\\n" 10481 " int ccc = 234; \\\n" 10482 " int dddddddddd = 2345;", 10483 Alignment); 10484 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10485 verifyFormat("#define A \\\n" 10486 " int aaaa = 12; \\\n" 10487 " int b = 23; \\\n" 10488 " int ccc = 234; \\\n" 10489 " int dddddddddd = 2345;", 10490 Alignment); 10491 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10492 verifyFormat("#define A " 10493 " \\\n" 10494 " int aaaa = 12; " 10495 " \\\n" 10496 " int b = 23; " 10497 " \\\n" 10498 " int ccc = 234; " 10499 " \\\n" 10500 " int dddddddddd = 2345;", 10501 Alignment); 10502 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10503 "k = 4, int l = 5,\n" 10504 " int m = 6) {\n" 10505 " int j = 10;\n" 10506 " otherThing = 1;\n" 10507 "}", 10508 Alignment); 10509 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10510 " int i = 1;\n" 10511 " int j = 2;\n" 10512 " int big = 10000;\n" 10513 "}", 10514 Alignment); 10515 verifyFormat("class C {\n" 10516 "public:\n" 10517 " int i = 1;\n" 10518 " virtual void f() = 0;\n" 10519 "};", 10520 Alignment); 10521 verifyFormat("int i = 1;\n" 10522 "if (SomeType t = getSomething()) {\n" 10523 "}\n" 10524 "int j = 2;\n" 10525 "int big = 10000;", 10526 Alignment); 10527 verifyFormat("int j = 7;\n" 10528 "for (int k = 0; k < N; ++k) {\n" 10529 "}\n" 10530 "int j = 2;\n" 10531 "int big = 10000;\n" 10532 "}", 10533 Alignment); 10534 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10535 verifyFormat("int i = 1;\n" 10536 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10537 " = someLooooooooooooooooongFunction();\n" 10538 "int j = 2;", 10539 Alignment); 10540 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10541 verifyFormat("int i = 1;\n" 10542 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10543 " someLooooooooooooooooongFunction();\n" 10544 "int j = 2;", 10545 Alignment); 10546 10547 verifyFormat("auto lambda = []() {\n" 10548 " auto i = 0;\n" 10549 " return 0;\n" 10550 "};\n" 10551 "int i = 0;\n" 10552 "auto v = type{\n" 10553 " i = 1, //\n" 10554 " (i = 2), //\n" 10555 " i = 3 //\n" 10556 "};", 10557 Alignment); 10558 10559 verifyFormat( 10560 "int i = 1;\n" 10561 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10562 " loooooooooooooooooooooongParameterB);\n" 10563 "int j = 2;", 10564 Alignment); 10565 10566 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 10567 " typename B = very_long_type_name_1,\n" 10568 " typename T_2 = very_long_type_name_2>\n" 10569 "auto foo() {}\n", 10570 Alignment); 10571 verifyFormat("int a, b = 1;\n" 10572 "int c = 2;\n" 10573 "int dd = 3;\n", 10574 Alignment); 10575 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10576 "float b[1][] = {{3.f}};\n", 10577 Alignment); 10578 verifyFormat("for (int i = 0; i < 1; i++)\n" 10579 " int x = 1;\n", 10580 Alignment); 10581 verifyFormat("for (i = 0; i < 1; i++)\n" 10582 " x = 1;\n" 10583 "y = 1;\n", 10584 Alignment); 10585 } 10586 10587 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 10588 FormatStyle Alignment = getLLVMStyle(); 10589 Alignment.AlignConsecutiveMacros = true; 10590 Alignment.AlignConsecutiveDeclarations = false; 10591 verifyFormat("float const a = 5;\n" 10592 "int oneTwoThree = 123;", 10593 Alignment); 10594 verifyFormat("int a = 5;\n" 10595 "float const oneTwoThree = 123;", 10596 Alignment); 10597 10598 Alignment.AlignConsecutiveDeclarations = true; 10599 verifyFormat("float const a = 5;\n" 10600 "int oneTwoThree = 123;", 10601 Alignment); 10602 verifyFormat("int a = method();\n" 10603 "float const oneTwoThree = 133;", 10604 Alignment); 10605 verifyFormat("int i = 1, j = 10;\n" 10606 "something = 2000;", 10607 Alignment); 10608 verifyFormat("something = 2000;\n" 10609 "int i = 1, j = 10;\n", 10610 Alignment); 10611 verifyFormat("float something = 2000;\n" 10612 "double another = 911;\n" 10613 "int i = 1, j = 10;\n" 10614 "const int *oneMore = 1;\n" 10615 "unsigned i = 2;", 10616 Alignment); 10617 verifyFormat("float a = 5;\n" 10618 "int one = 1;\n" 10619 "method();\n" 10620 "const double oneTwoThree = 123;\n" 10621 "const unsigned int oneTwo = 12;", 10622 Alignment); 10623 verifyFormat("int oneTwoThree{0}; // comment\n" 10624 "unsigned oneTwo; // comment", 10625 Alignment); 10626 EXPECT_EQ("float const a = 5;\n" 10627 "\n" 10628 "int oneTwoThree = 123;", 10629 format("float const a = 5;\n" 10630 "\n" 10631 "int oneTwoThree= 123;", 10632 Alignment)); 10633 EXPECT_EQ("float a = 5;\n" 10634 "int one = 1;\n" 10635 "\n" 10636 "unsigned oneTwoThree = 123;", 10637 format("float a = 5;\n" 10638 "int one = 1;\n" 10639 "\n" 10640 "unsigned oneTwoThree = 123;", 10641 Alignment)); 10642 EXPECT_EQ("float a = 5;\n" 10643 "int one = 1;\n" 10644 "\n" 10645 "unsigned oneTwoThree = 123;\n" 10646 "int oneTwo = 12;", 10647 format("float a = 5;\n" 10648 "int one = 1;\n" 10649 "\n" 10650 "unsigned oneTwoThree = 123;\n" 10651 "int oneTwo = 12;", 10652 Alignment)); 10653 // Function prototype alignment 10654 verifyFormat("int a();\n" 10655 "double b();", 10656 Alignment); 10657 verifyFormat("int a(int x);\n" 10658 "double b();", 10659 Alignment); 10660 unsigned OldColumnLimit = Alignment.ColumnLimit; 10661 // We need to set ColumnLimit to zero, in order to stress nested alignments, 10662 // otherwise the function parameters will be re-flowed onto a single line. 10663 Alignment.ColumnLimit = 0; 10664 EXPECT_EQ("int a(int x,\n" 10665 " float y);\n" 10666 "double b(int x,\n" 10667 " double y);", 10668 format("int a(int x,\n" 10669 " float y);\n" 10670 "double b(int x,\n" 10671 " double y);", 10672 Alignment)); 10673 // This ensures that function parameters of function declarations are 10674 // correctly indented when their owning functions are indented. 10675 // The failure case here is for 'double y' to not be indented enough. 10676 EXPECT_EQ("double a(int x);\n" 10677 "int b(int y,\n" 10678 " double z);", 10679 format("double a(int x);\n" 10680 "int b(int y,\n" 10681 " double z);", 10682 Alignment)); 10683 // Set ColumnLimit low so that we induce wrapping immediately after 10684 // the function name and opening paren. 10685 Alignment.ColumnLimit = 13; 10686 verifyFormat("int function(\n" 10687 " int x,\n" 10688 " bool y);", 10689 Alignment); 10690 Alignment.ColumnLimit = OldColumnLimit; 10691 // Ensure function pointers don't screw up recursive alignment 10692 verifyFormat("int a(int x, void (*fp)(int y));\n" 10693 "double b();", 10694 Alignment); 10695 Alignment.AlignConsecutiveAssignments = true; 10696 // Ensure recursive alignment is broken by function braces, so that the 10697 // "a = 1" does not align with subsequent assignments inside the function 10698 // body. 10699 verifyFormat("int func(int a = 1) {\n" 10700 " int b = 2;\n" 10701 " int cc = 3;\n" 10702 "}", 10703 Alignment); 10704 verifyFormat("float something = 2000;\n" 10705 "double another = 911;\n" 10706 "int i = 1, j = 10;\n" 10707 "const int *oneMore = 1;\n" 10708 "unsigned i = 2;", 10709 Alignment); 10710 verifyFormat("int oneTwoThree = {0}; // comment\n" 10711 "unsigned oneTwo = 0; // comment", 10712 Alignment); 10713 // Make sure that scope is correctly tracked, in the absence of braces 10714 verifyFormat("for (int i = 0; i < n; i++)\n" 10715 " j = i;\n" 10716 "double x = 1;\n", 10717 Alignment); 10718 verifyFormat("if (int i = 0)\n" 10719 " j = i;\n" 10720 "double x = 1;\n", 10721 Alignment); 10722 // Ensure operator[] and operator() are comprehended 10723 verifyFormat("struct test {\n" 10724 " long long int foo();\n" 10725 " int operator[](int a);\n" 10726 " double bar();\n" 10727 "};\n", 10728 Alignment); 10729 verifyFormat("struct test {\n" 10730 " long long int foo();\n" 10731 " int operator()(int a);\n" 10732 " double bar();\n" 10733 "};\n", 10734 Alignment); 10735 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 10736 " int const i = 1;\n" 10737 " int * j = 2;\n" 10738 " int big = 10000;\n" 10739 "\n" 10740 " unsigned oneTwoThree = 123;\n" 10741 " int oneTwo = 12;\n" 10742 " method();\n" 10743 " float k = 2;\n" 10744 " int ll = 10000;\n" 10745 "}", 10746 format("void SomeFunction(int parameter= 0) {\n" 10747 " int const i= 1;\n" 10748 " int *j=2;\n" 10749 " int big = 10000;\n" 10750 "\n" 10751 "unsigned oneTwoThree =123;\n" 10752 "int oneTwo = 12;\n" 10753 " method();\n" 10754 "float k= 2;\n" 10755 "int ll=10000;\n" 10756 "}", 10757 Alignment)); 10758 Alignment.AlignConsecutiveAssignments = false; 10759 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10760 verifyFormat("#define A \\\n" 10761 " int aaaa = 12; \\\n" 10762 " float b = 23; \\\n" 10763 " const int ccc = 234; \\\n" 10764 " unsigned dddddddddd = 2345;", 10765 Alignment); 10766 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10767 verifyFormat("#define A \\\n" 10768 " int aaaa = 12; \\\n" 10769 " float b = 23; \\\n" 10770 " const int ccc = 234; \\\n" 10771 " unsigned dddddddddd = 2345;", 10772 Alignment); 10773 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10774 Alignment.ColumnLimit = 30; 10775 verifyFormat("#define A \\\n" 10776 " int aaaa = 12; \\\n" 10777 " float b = 23; \\\n" 10778 " const int ccc = 234; \\\n" 10779 " int dddddddddd = 2345;", 10780 Alignment); 10781 Alignment.ColumnLimit = 80; 10782 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10783 "k = 4, int l = 5,\n" 10784 " int m = 6) {\n" 10785 " const int j = 10;\n" 10786 " otherThing = 1;\n" 10787 "}", 10788 Alignment); 10789 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10790 " int const i = 1;\n" 10791 " int * j = 2;\n" 10792 " int big = 10000;\n" 10793 "}", 10794 Alignment); 10795 verifyFormat("class C {\n" 10796 "public:\n" 10797 " int i = 1;\n" 10798 " virtual void f() = 0;\n" 10799 "};", 10800 Alignment); 10801 verifyFormat("float i = 1;\n" 10802 "if (SomeType t = getSomething()) {\n" 10803 "}\n" 10804 "const unsigned j = 2;\n" 10805 "int big = 10000;", 10806 Alignment); 10807 verifyFormat("float j = 7;\n" 10808 "for (int k = 0; k < N; ++k) {\n" 10809 "}\n" 10810 "unsigned j = 2;\n" 10811 "int big = 10000;\n" 10812 "}", 10813 Alignment); 10814 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10815 verifyFormat("float i = 1;\n" 10816 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10817 " = someLooooooooooooooooongFunction();\n" 10818 "int j = 2;", 10819 Alignment); 10820 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10821 verifyFormat("int i = 1;\n" 10822 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10823 " someLooooooooooooooooongFunction();\n" 10824 "int j = 2;", 10825 Alignment); 10826 10827 Alignment.AlignConsecutiveAssignments = true; 10828 verifyFormat("auto lambda = []() {\n" 10829 " auto ii = 0;\n" 10830 " float j = 0;\n" 10831 " return 0;\n" 10832 "};\n" 10833 "int i = 0;\n" 10834 "float i2 = 0;\n" 10835 "auto v = type{\n" 10836 " i = 1, //\n" 10837 " (i = 2), //\n" 10838 " i = 3 //\n" 10839 "};", 10840 Alignment); 10841 Alignment.AlignConsecutiveAssignments = false; 10842 10843 verifyFormat( 10844 "int i = 1;\n" 10845 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10846 " loooooooooooooooooooooongParameterB);\n" 10847 "int j = 2;", 10848 Alignment); 10849 10850 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 10851 // We expect declarations and assignments to align, as long as it doesn't 10852 // exceed the column limit, starting a new alignment sequence whenever it 10853 // happens. 10854 Alignment.AlignConsecutiveAssignments = true; 10855 Alignment.ColumnLimit = 30; 10856 verifyFormat("float ii = 1;\n" 10857 "unsigned j = 2;\n" 10858 "int someVerylongVariable = 1;\n" 10859 "AnotherLongType ll = 123456;\n" 10860 "VeryVeryLongType k = 2;\n" 10861 "int myvar = 1;", 10862 Alignment); 10863 Alignment.ColumnLimit = 80; 10864 Alignment.AlignConsecutiveAssignments = false; 10865 10866 verifyFormat( 10867 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 10868 " typename LongType, typename B>\n" 10869 "auto foo() {}\n", 10870 Alignment); 10871 verifyFormat("float a, b = 1;\n" 10872 "int c = 2;\n" 10873 "int dd = 3;\n", 10874 Alignment); 10875 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10876 "float b[1][] = {{3.f}};\n", 10877 Alignment); 10878 Alignment.AlignConsecutiveAssignments = true; 10879 verifyFormat("float a, b = 1;\n" 10880 "int c = 2;\n" 10881 "int dd = 3;\n", 10882 Alignment); 10883 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10884 "float b[1][] = {{3.f}};\n", 10885 Alignment); 10886 Alignment.AlignConsecutiveAssignments = false; 10887 10888 Alignment.ColumnLimit = 30; 10889 Alignment.BinPackParameters = false; 10890 verifyFormat("void foo(float a,\n" 10891 " float b,\n" 10892 " int c,\n" 10893 " uint32_t *d) {\n" 10894 " int * e = 0;\n" 10895 " float f = 0;\n" 10896 " double g = 0;\n" 10897 "}\n" 10898 "void bar(ino_t a,\n" 10899 " int b,\n" 10900 " uint32_t *c,\n" 10901 " bool d) {}\n", 10902 Alignment); 10903 Alignment.BinPackParameters = true; 10904 Alignment.ColumnLimit = 80; 10905 10906 // Bug 33507 10907 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 10908 verifyFormat( 10909 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 10910 " static const Version verVs2017;\n" 10911 " return true;\n" 10912 "});\n", 10913 Alignment); 10914 Alignment.PointerAlignment = FormatStyle::PAS_Right; 10915 10916 // See llvm.org/PR35641 10917 Alignment.AlignConsecutiveDeclarations = true; 10918 verifyFormat("int func() { //\n" 10919 " int b;\n" 10920 " unsigned c;\n" 10921 "}", 10922 Alignment); 10923 10924 // See PR37175 10925 FormatStyle Style = getMozillaStyle(); 10926 Style.AlignConsecutiveDeclarations = true; 10927 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 10928 "foo(int a);", 10929 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 10930 } 10931 10932 TEST_F(FormatTest, LinuxBraceBreaking) { 10933 FormatStyle LinuxBraceStyle = getLLVMStyle(); 10934 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 10935 verifyFormat("namespace a\n" 10936 "{\n" 10937 "class A\n" 10938 "{\n" 10939 " void f()\n" 10940 " {\n" 10941 " if (true) {\n" 10942 " a();\n" 10943 " b();\n" 10944 " } else {\n" 10945 " a();\n" 10946 " }\n" 10947 " }\n" 10948 " void g() { return; }\n" 10949 "};\n" 10950 "struct B {\n" 10951 " int x;\n" 10952 "};\n" 10953 "} // namespace a\n", 10954 LinuxBraceStyle); 10955 verifyFormat("enum X {\n" 10956 " Y = 0,\n" 10957 "}\n", 10958 LinuxBraceStyle); 10959 verifyFormat("struct S {\n" 10960 " int Type;\n" 10961 " union {\n" 10962 " int x;\n" 10963 " double y;\n" 10964 " } Value;\n" 10965 " class C\n" 10966 " {\n" 10967 " MyFavoriteType Value;\n" 10968 " } Class;\n" 10969 "}\n", 10970 LinuxBraceStyle); 10971 } 10972 10973 TEST_F(FormatTest, MozillaBraceBreaking) { 10974 FormatStyle MozillaBraceStyle = getLLVMStyle(); 10975 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 10976 MozillaBraceStyle.FixNamespaceComments = false; 10977 verifyFormat("namespace a {\n" 10978 "class A\n" 10979 "{\n" 10980 " void f()\n" 10981 " {\n" 10982 " if (true) {\n" 10983 " a();\n" 10984 " b();\n" 10985 " }\n" 10986 " }\n" 10987 " void g() { return; }\n" 10988 "};\n" 10989 "enum E\n" 10990 "{\n" 10991 " A,\n" 10992 " // foo\n" 10993 " B,\n" 10994 " C\n" 10995 "};\n" 10996 "struct B\n" 10997 "{\n" 10998 " int x;\n" 10999 "};\n" 11000 "}\n", 11001 MozillaBraceStyle); 11002 verifyFormat("struct S\n" 11003 "{\n" 11004 " int Type;\n" 11005 " union\n" 11006 " {\n" 11007 " int x;\n" 11008 " double y;\n" 11009 " } Value;\n" 11010 " class C\n" 11011 " {\n" 11012 " MyFavoriteType Value;\n" 11013 " } Class;\n" 11014 "}\n", 11015 MozillaBraceStyle); 11016 } 11017 11018 TEST_F(FormatTest, StroustrupBraceBreaking) { 11019 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11020 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11021 verifyFormat("namespace a {\n" 11022 "class A {\n" 11023 " void f()\n" 11024 " {\n" 11025 " if (true) {\n" 11026 " a();\n" 11027 " b();\n" 11028 " }\n" 11029 " }\n" 11030 " void g() { return; }\n" 11031 "};\n" 11032 "struct B {\n" 11033 " int x;\n" 11034 "};\n" 11035 "} // namespace a\n", 11036 StroustrupBraceStyle); 11037 11038 verifyFormat("void foo()\n" 11039 "{\n" 11040 " if (a) {\n" 11041 " a();\n" 11042 " }\n" 11043 " else {\n" 11044 " b();\n" 11045 " }\n" 11046 "}\n", 11047 StroustrupBraceStyle); 11048 11049 verifyFormat("#ifdef _DEBUG\n" 11050 "int foo(int i = 0)\n" 11051 "#else\n" 11052 "int foo(int i = 5)\n" 11053 "#endif\n" 11054 "{\n" 11055 " return i;\n" 11056 "}", 11057 StroustrupBraceStyle); 11058 11059 verifyFormat("void foo() {}\n" 11060 "void bar()\n" 11061 "#ifdef _DEBUG\n" 11062 "{\n" 11063 " foo();\n" 11064 "}\n" 11065 "#else\n" 11066 "{\n" 11067 "}\n" 11068 "#endif", 11069 StroustrupBraceStyle); 11070 11071 verifyFormat("void foobar() { int i = 5; }\n" 11072 "#ifdef _DEBUG\n" 11073 "void bar() {}\n" 11074 "#else\n" 11075 "void bar() { foobar(); }\n" 11076 "#endif", 11077 StroustrupBraceStyle); 11078 } 11079 11080 TEST_F(FormatTest, AllmanBraceBreaking) { 11081 FormatStyle AllmanBraceStyle = getLLVMStyle(); 11082 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 11083 11084 EXPECT_EQ("namespace a\n" 11085 "{\n" 11086 "void f();\n" 11087 "void g();\n" 11088 "} // namespace a\n", 11089 format("namespace a\n" 11090 "{\n" 11091 "void f();\n" 11092 "void g();\n" 11093 "}\n", 11094 AllmanBraceStyle)); 11095 11096 verifyFormat("namespace a\n" 11097 "{\n" 11098 "class A\n" 11099 "{\n" 11100 " void f()\n" 11101 " {\n" 11102 " if (true)\n" 11103 " {\n" 11104 " a();\n" 11105 " b();\n" 11106 " }\n" 11107 " }\n" 11108 " void g() { return; }\n" 11109 "};\n" 11110 "struct B\n" 11111 "{\n" 11112 " int x;\n" 11113 "};\n" 11114 "union C\n" 11115 "{\n" 11116 "};\n" 11117 "} // namespace a", 11118 AllmanBraceStyle); 11119 11120 verifyFormat("void f()\n" 11121 "{\n" 11122 " if (true)\n" 11123 " {\n" 11124 " a();\n" 11125 " }\n" 11126 " else if (false)\n" 11127 " {\n" 11128 " b();\n" 11129 " }\n" 11130 " else\n" 11131 " {\n" 11132 " c();\n" 11133 " }\n" 11134 "}\n", 11135 AllmanBraceStyle); 11136 11137 verifyFormat("void f()\n" 11138 "{\n" 11139 " for (int i = 0; i < 10; ++i)\n" 11140 " {\n" 11141 " a();\n" 11142 " }\n" 11143 " while (false)\n" 11144 " {\n" 11145 " b();\n" 11146 " }\n" 11147 " do\n" 11148 " {\n" 11149 " c();\n" 11150 " } while (false)\n" 11151 "}\n", 11152 AllmanBraceStyle); 11153 11154 verifyFormat("void f(int a)\n" 11155 "{\n" 11156 " switch (a)\n" 11157 " {\n" 11158 " case 0:\n" 11159 " break;\n" 11160 " case 1:\n" 11161 " {\n" 11162 " break;\n" 11163 " }\n" 11164 " case 2:\n" 11165 " {\n" 11166 " }\n" 11167 " break;\n" 11168 " default:\n" 11169 " break;\n" 11170 " }\n" 11171 "}\n", 11172 AllmanBraceStyle); 11173 11174 verifyFormat("enum X\n" 11175 "{\n" 11176 " Y = 0,\n" 11177 "}\n", 11178 AllmanBraceStyle); 11179 verifyFormat("enum X\n" 11180 "{\n" 11181 " Y = 0\n" 11182 "}\n", 11183 AllmanBraceStyle); 11184 11185 verifyFormat("@interface BSApplicationController ()\n" 11186 "{\n" 11187 "@private\n" 11188 " id _extraIvar;\n" 11189 "}\n" 11190 "@end\n", 11191 AllmanBraceStyle); 11192 11193 verifyFormat("#ifdef _DEBUG\n" 11194 "int foo(int i = 0)\n" 11195 "#else\n" 11196 "int foo(int i = 5)\n" 11197 "#endif\n" 11198 "{\n" 11199 " return i;\n" 11200 "}", 11201 AllmanBraceStyle); 11202 11203 verifyFormat("void foo() {}\n" 11204 "void bar()\n" 11205 "#ifdef _DEBUG\n" 11206 "{\n" 11207 " foo();\n" 11208 "}\n" 11209 "#else\n" 11210 "{\n" 11211 "}\n" 11212 "#endif", 11213 AllmanBraceStyle); 11214 11215 verifyFormat("void foobar() { int i = 5; }\n" 11216 "#ifdef _DEBUG\n" 11217 "void bar() {}\n" 11218 "#else\n" 11219 "void bar() { foobar(); }\n" 11220 "#endif", 11221 AllmanBraceStyle); 11222 11223 // This shouldn't affect ObjC blocks.. 11224 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11225 " // ...\n" 11226 " int i;\n" 11227 "}];", 11228 AllmanBraceStyle); 11229 verifyFormat("void (^block)(void) = ^{\n" 11230 " // ...\n" 11231 " int i;\n" 11232 "};", 11233 AllmanBraceStyle); 11234 // .. or dict literals. 11235 verifyFormat("void f()\n" 11236 "{\n" 11237 " // ...\n" 11238 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11239 "}", 11240 AllmanBraceStyle); 11241 verifyFormat("void f()\n" 11242 "{\n" 11243 " // ...\n" 11244 " [object someMethod:@{a : @\"b\"}];\n" 11245 "}", 11246 AllmanBraceStyle); 11247 verifyFormat("int f()\n" 11248 "{ // comment\n" 11249 " return 42;\n" 11250 "}", 11251 AllmanBraceStyle); 11252 11253 AllmanBraceStyle.ColumnLimit = 19; 11254 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11255 AllmanBraceStyle.ColumnLimit = 18; 11256 verifyFormat("void f()\n" 11257 "{\n" 11258 " int i;\n" 11259 "}", 11260 AllmanBraceStyle); 11261 AllmanBraceStyle.ColumnLimit = 80; 11262 11263 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11264 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11265 FormatStyle::SIS_WithoutElse; 11266 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11267 verifyFormat("void f(bool b)\n" 11268 "{\n" 11269 " if (b)\n" 11270 " {\n" 11271 " return;\n" 11272 " }\n" 11273 "}\n", 11274 BreakBeforeBraceShortIfs); 11275 verifyFormat("void f(bool b)\n" 11276 "{\n" 11277 " if constexpr (b)\n" 11278 " {\n" 11279 " return;\n" 11280 " }\n" 11281 "}\n", 11282 BreakBeforeBraceShortIfs); 11283 verifyFormat("void f(bool b)\n" 11284 "{\n" 11285 " if CONSTEXPR (b)\n" 11286 " {\n" 11287 " return;\n" 11288 " }\n" 11289 "}\n", 11290 BreakBeforeBraceShortIfs); 11291 verifyFormat("void f(bool b)\n" 11292 "{\n" 11293 " if (b) return;\n" 11294 "}\n", 11295 BreakBeforeBraceShortIfs); 11296 verifyFormat("void f(bool b)\n" 11297 "{\n" 11298 " if constexpr (b) return;\n" 11299 "}\n", 11300 BreakBeforeBraceShortIfs); 11301 verifyFormat("void f(bool b)\n" 11302 "{\n" 11303 " if CONSTEXPR (b) return;\n" 11304 "}\n", 11305 BreakBeforeBraceShortIfs); 11306 verifyFormat("void f(bool b)\n" 11307 "{\n" 11308 " while (b)\n" 11309 " {\n" 11310 " return;\n" 11311 " }\n" 11312 "}\n", 11313 BreakBeforeBraceShortIfs); 11314 } 11315 11316 TEST_F(FormatTest, GNUBraceBreaking) { 11317 FormatStyle GNUBraceStyle = getLLVMStyle(); 11318 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 11319 verifyFormat("namespace a\n" 11320 "{\n" 11321 "class A\n" 11322 "{\n" 11323 " void f()\n" 11324 " {\n" 11325 " int a;\n" 11326 " {\n" 11327 " int b;\n" 11328 " }\n" 11329 " if (true)\n" 11330 " {\n" 11331 " a();\n" 11332 " b();\n" 11333 " }\n" 11334 " }\n" 11335 " void g() { return; }\n" 11336 "}\n" 11337 "} // namespace a", 11338 GNUBraceStyle); 11339 11340 verifyFormat("void f()\n" 11341 "{\n" 11342 " if (true)\n" 11343 " {\n" 11344 " a();\n" 11345 " }\n" 11346 " else if (false)\n" 11347 " {\n" 11348 " b();\n" 11349 " }\n" 11350 " else\n" 11351 " {\n" 11352 " c();\n" 11353 " }\n" 11354 "}\n", 11355 GNUBraceStyle); 11356 11357 verifyFormat("void f()\n" 11358 "{\n" 11359 " for (int i = 0; i < 10; ++i)\n" 11360 " {\n" 11361 " a();\n" 11362 " }\n" 11363 " while (false)\n" 11364 " {\n" 11365 " b();\n" 11366 " }\n" 11367 " do\n" 11368 " {\n" 11369 " c();\n" 11370 " }\n" 11371 " while (false);\n" 11372 "}\n", 11373 GNUBraceStyle); 11374 11375 verifyFormat("void f(int a)\n" 11376 "{\n" 11377 " switch (a)\n" 11378 " {\n" 11379 " case 0:\n" 11380 " break;\n" 11381 " case 1:\n" 11382 " {\n" 11383 " break;\n" 11384 " }\n" 11385 " case 2:\n" 11386 " {\n" 11387 " }\n" 11388 " break;\n" 11389 " default:\n" 11390 " break;\n" 11391 " }\n" 11392 "}\n", 11393 GNUBraceStyle); 11394 11395 verifyFormat("enum X\n" 11396 "{\n" 11397 " Y = 0,\n" 11398 "}\n", 11399 GNUBraceStyle); 11400 11401 verifyFormat("@interface BSApplicationController ()\n" 11402 "{\n" 11403 "@private\n" 11404 " id _extraIvar;\n" 11405 "}\n" 11406 "@end\n", 11407 GNUBraceStyle); 11408 11409 verifyFormat("#ifdef _DEBUG\n" 11410 "int foo(int i = 0)\n" 11411 "#else\n" 11412 "int foo(int i = 5)\n" 11413 "#endif\n" 11414 "{\n" 11415 " return i;\n" 11416 "}", 11417 GNUBraceStyle); 11418 11419 verifyFormat("void foo() {}\n" 11420 "void bar()\n" 11421 "#ifdef _DEBUG\n" 11422 "{\n" 11423 " foo();\n" 11424 "}\n" 11425 "#else\n" 11426 "{\n" 11427 "}\n" 11428 "#endif", 11429 GNUBraceStyle); 11430 11431 verifyFormat("void foobar() { int i = 5; }\n" 11432 "#ifdef _DEBUG\n" 11433 "void bar() {}\n" 11434 "#else\n" 11435 "void bar() { foobar(); }\n" 11436 "#endif", 11437 GNUBraceStyle); 11438 } 11439 11440 TEST_F(FormatTest, WebKitBraceBreaking) { 11441 FormatStyle WebKitBraceStyle = getLLVMStyle(); 11442 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 11443 WebKitBraceStyle.FixNamespaceComments = false; 11444 verifyFormat("namespace a {\n" 11445 "class A {\n" 11446 " void f()\n" 11447 " {\n" 11448 " if (true) {\n" 11449 " a();\n" 11450 " b();\n" 11451 " }\n" 11452 " }\n" 11453 " void g() { return; }\n" 11454 "};\n" 11455 "enum E {\n" 11456 " A,\n" 11457 " // foo\n" 11458 " B,\n" 11459 " C\n" 11460 "};\n" 11461 "struct B {\n" 11462 " int x;\n" 11463 "};\n" 11464 "}\n", 11465 WebKitBraceStyle); 11466 verifyFormat("struct S {\n" 11467 " int Type;\n" 11468 " union {\n" 11469 " int x;\n" 11470 " double y;\n" 11471 " } Value;\n" 11472 " class C {\n" 11473 " MyFavoriteType Value;\n" 11474 " } Class;\n" 11475 "};\n", 11476 WebKitBraceStyle); 11477 } 11478 11479 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 11480 verifyFormat("void f() {\n" 11481 " try {\n" 11482 " } catch (const Exception &e) {\n" 11483 " }\n" 11484 "}\n", 11485 getLLVMStyle()); 11486 } 11487 11488 TEST_F(FormatTest, UnderstandsPragmas) { 11489 verifyFormat("#pragma omp reduction(| : var)"); 11490 verifyFormat("#pragma omp reduction(+ : var)"); 11491 11492 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 11493 "(including parentheses).", 11494 format("#pragma mark Any non-hyphenated or hyphenated string " 11495 "(including parentheses).")); 11496 } 11497 11498 TEST_F(FormatTest, UnderstandPragmaOption) { 11499 verifyFormat("#pragma option -C -A"); 11500 11501 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 11502 } 11503 11504 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 11505 FormatStyle Style = getLLVMStyle(); 11506 Style.ColumnLimit = 20; 11507 11508 // See PR41213 11509 EXPECT_EQ("/*\n" 11510 " *\t9012345\n" 11511 " * /8901\n" 11512 " */", 11513 format("/*\n" 11514 " *\t9012345 /8901\n" 11515 " */", 11516 Style)); 11517 EXPECT_EQ("/*\n" 11518 " *345678\n" 11519 " *\t/8901\n" 11520 " */", 11521 format("/*\n" 11522 " *345678\t/8901\n" 11523 " */", 11524 Style)); 11525 11526 verifyFormat("int a; // the\n" 11527 " // comment", Style); 11528 EXPECT_EQ("int a; /* first line\n" 11529 " * second\n" 11530 " * line third\n" 11531 " * line\n" 11532 " */", 11533 format("int a; /* first line\n" 11534 " * second\n" 11535 " * line third\n" 11536 " * line\n" 11537 " */", 11538 Style)); 11539 EXPECT_EQ("int a; // first line\n" 11540 " // second\n" 11541 " // line third\n" 11542 " // line", 11543 format("int a; // first line\n" 11544 " // second line\n" 11545 " // third line", 11546 Style)); 11547 11548 Style.PenaltyExcessCharacter = 90; 11549 verifyFormat("int a; // the comment", Style); 11550 EXPECT_EQ("int a; // the comment\n" 11551 " // aaa", 11552 format("int a; // the comment aaa", Style)); 11553 EXPECT_EQ("int a; /* first line\n" 11554 " * second line\n" 11555 " * third line\n" 11556 " */", 11557 format("int a; /* first line\n" 11558 " * second line\n" 11559 " * third line\n" 11560 " */", 11561 Style)); 11562 EXPECT_EQ("int a; // first line\n" 11563 " // second line\n" 11564 " // third line", 11565 format("int a; // first line\n" 11566 " // second line\n" 11567 " // third line", 11568 Style)); 11569 // FIXME: Investigate why this is not getting the same layout as the test 11570 // above. 11571 EXPECT_EQ("int a; /* first line\n" 11572 " * second line\n" 11573 " * third line\n" 11574 " */", 11575 format("int a; /* first line second line third line" 11576 "\n*/", 11577 Style)); 11578 11579 EXPECT_EQ("// foo bar baz bazfoo\n" 11580 "// foo bar foo bar\n", 11581 format("// foo bar baz bazfoo\n" 11582 "// foo bar foo bar\n", 11583 Style)); 11584 EXPECT_EQ("// foo bar baz bazfoo\n" 11585 "// foo bar foo bar\n", 11586 format("// foo bar baz bazfoo\n" 11587 "// foo bar foo bar\n", 11588 Style)); 11589 11590 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 11591 // next one. 11592 EXPECT_EQ("// foo bar baz bazfoo\n" 11593 "// bar foo bar\n", 11594 format("// foo bar baz bazfoo bar\n" 11595 "// foo bar\n", 11596 Style)); 11597 11598 EXPECT_EQ("// foo bar baz bazfoo\n" 11599 "// foo bar baz bazfoo\n" 11600 "// bar foo bar\n", 11601 format("// foo bar baz bazfoo\n" 11602 "// foo bar baz bazfoo bar\n" 11603 "// foo bar\n", 11604 Style)); 11605 11606 EXPECT_EQ("// foo bar baz bazfoo\n" 11607 "// foo bar baz bazfoo\n" 11608 "// bar foo bar\n", 11609 format("// foo bar baz bazfoo\n" 11610 "// foo bar baz bazfoo bar\n" 11611 "// foo bar\n", 11612 Style)); 11613 11614 // Make sure we do not keep protruding characters if strict mode reflow is 11615 // cheaper than keeping protruding characters. 11616 Style.ColumnLimit = 21; 11617 EXPECT_EQ("// foo foo foo foo\n" 11618 "// foo foo foo foo\n" 11619 "// foo foo foo foo\n", 11620 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", 11621 Style)); 11622 11623 EXPECT_EQ("int a = /* long block\n" 11624 " comment */\n" 11625 " 42;", 11626 format("int a = /* long block comment */ 42;", Style)); 11627 } 11628 11629 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 11630 for (size_t i = 1; i < Styles.size(); ++i) \ 11631 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \ 11632 << " differs from Style #0" 11633 11634 TEST_F(FormatTest, GetsPredefinedStyleByName) { 11635 SmallVector<FormatStyle, 3> Styles; 11636 Styles.resize(3); 11637 11638 Styles[0] = getLLVMStyle(); 11639 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 11640 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 11641 EXPECT_ALL_STYLES_EQUAL(Styles); 11642 11643 Styles[0] = getGoogleStyle(); 11644 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 11645 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 11646 EXPECT_ALL_STYLES_EQUAL(Styles); 11647 11648 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 11649 EXPECT_TRUE( 11650 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 11651 EXPECT_TRUE( 11652 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 11653 EXPECT_ALL_STYLES_EQUAL(Styles); 11654 11655 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 11656 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 11657 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 11658 EXPECT_ALL_STYLES_EQUAL(Styles); 11659 11660 Styles[0] = getMozillaStyle(); 11661 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 11662 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 11663 EXPECT_ALL_STYLES_EQUAL(Styles); 11664 11665 Styles[0] = getWebKitStyle(); 11666 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 11667 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 11668 EXPECT_ALL_STYLES_EQUAL(Styles); 11669 11670 Styles[0] = getGNUStyle(); 11671 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 11672 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 11673 EXPECT_ALL_STYLES_EQUAL(Styles); 11674 11675 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 11676 } 11677 11678 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 11679 SmallVector<FormatStyle, 8> Styles; 11680 Styles.resize(2); 11681 11682 Styles[0] = getGoogleStyle(); 11683 Styles[1] = getLLVMStyle(); 11684 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 11685 EXPECT_ALL_STYLES_EQUAL(Styles); 11686 11687 Styles.resize(5); 11688 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 11689 Styles[1] = getLLVMStyle(); 11690 Styles[1].Language = FormatStyle::LK_JavaScript; 11691 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 11692 11693 Styles[2] = getLLVMStyle(); 11694 Styles[2].Language = FormatStyle::LK_JavaScript; 11695 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 11696 "BasedOnStyle: Google", 11697 &Styles[2]) 11698 .value()); 11699 11700 Styles[3] = getLLVMStyle(); 11701 Styles[3].Language = FormatStyle::LK_JavaScript; 11702 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 11703 "Language: JavaScript", 11704 &Styles[3]) 11705 .value()); 11706 11707 Styles[4] = getLLVMStyle(); 11708 Styles[4].Language = FormatStyle::LK_JavaScript; 11709 EXPECT_EQ(0, parseConfiguration("---\n" 11710 "BasedOnStyle: LLVM\n" 11711 "IndentWidth: 123\n" 11712 "---\n" 11713 "BasedOnStyle: Google\n" 11714 "Language: JavaScript", 11715 &Styles[4]) 11716 .value()); 11717 EXPECT_ALL_STYLES_EQUAL(Styles); 11718 } 11719 11720 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 11721 Style.FIELD = false; \ 11722 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 11723 EXPECT_TRUE(Style.FIELD); \ 11724 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 11725 EXPECT_FALSE(Style.FIELD); 11726 11727 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 11728 11729 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 11730 Style.STRUCT.FIELD = false; \ 11731 EXPECT_EQ(0, \ 11732 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 11733 .value()); \ 11734 EXPECT_TRUE(Style.STRUCT.FIELD); \ 11735 EXPECT_EQ(0, \ 11736 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 11737 .value()); \ 11738 EXPECT_FALSE(Style.STRUCT.FIELD); 11739 11740 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 11741 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 11742 11743 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 11744 EXPECT_NE(VALUE, Style.FIELD); \ 11745 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 11746 EXPECT_EQ(VALUE, Style.FIELD) 11747 11748 TEST_F(FormatTest, ParsesConfigurationBools) { 11749 FormatStyle Style = {}; 11750 Style.Language = FormatStyle::LK_Cpp; 11751 CHECK_PARSE_BOOL(AlignOperands); 11752 CHECK_PARSE_BOOL(AlignTrailingComments); 11753 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 11754 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 11755 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 11756 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 11757 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 11758 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 11759 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 11760 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 11761 CHECK_PARSE_BOOL(BinPackArguments); 11762 CHECK_PARSE_BOOL(BinPackParameters); 11763 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 11764 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 11765 CHECK_PARSE_BOOL(BreakStringLiterals); 11766 CHECK_PARSE_BOOL(CompactNamespaces); 11767 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 11768 CHECK_PARSE_BOOL(DerivePointerAlignment); 11769 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 11770 CHECK_PARSE_BOOL(DisableFormat); 11771 CHECK_PARSE_BOOL(IndentCaseLabels); 11772 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 11773 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 11774 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 11775 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 11776 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 11777 CHECK_PARSE_BOOL(ReflowComments); 11778 CHECK_PARSE_BOOL(SortIncludes); 11779 CHECK_PARSE_BOOL(SortUsingDeclarations); 11780 CHECK_PARSE_BOOL(SpacesInParentheses); 11781 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 11782 CHECK_PARSE_BOOL(SpacesInAngles); 11783 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 11784 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 11785 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 11786 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 11787 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 11788 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 11789 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 11790 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 11791 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 11792 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 11793 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 11794 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 11795 11796 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 11797 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 11798 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement); 11799 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 11800 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 11801 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 11802 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 11803 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 11804 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 11805 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 11806 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 11807 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 11808 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 11809 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 11810 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 11811 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 11812 } 11813 11814 #undef CHECK_PARSE_BOOL 11815 11816 TEST_F(FormatTest, ParsesConfiguration) { 11817 FormatStyle Style = {}; 11818 Style.Language = FormatStyle::LK_Cpp; 11819 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 11820 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 11821 ConstructorInitializerIndentWidth, 1234u); 11822 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 11823 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 11824 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 11825 CHECK_PARSE("PenaltyBreakAssignment: 1234", 11826 PenaltyBreakAssignment, 1234u); 11827 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 11828 PenaltyBreakBeforeFirstCallParameter, 1234u); 11829 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 11830 PenaltyBreakTemplateDeclaration, 1234u); 11831 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 11832 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 11833 PenaltyReturnTypeOnItsOwnLine, 1234u); 11834 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 11835 SpacesBeforeTrailingComments, 1234u); 11836 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 11837 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 11838 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 11839 11840 Style.PointerAlignment = FormatStyle::PAS_Middle; 11841 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 11842 FormatStyle::PAS_Left); 11843 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 11844 FormatStyle::PAS_Right); 11845 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 11846 FormatStyle::PAS_Middle); 11847 // For backward compatibility: 11848 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 11849 FormatStyle::PAS_Left); 11850 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 11851 FormatStyle::PAS_Right); 11852 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 11853 FormatStyle::PAS_Middle); 11854 11855 Style.Standard = FormatStyle::LS_Auto; 11856 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 11857 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11); 11858 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 11859 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 11860 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 11861 11862 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11863 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 11864 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 11865 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 11866 FormatStyle::BOS_None); 11867 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 11868 FormatStyle::BOS_All); 11869 // For backward compatibility: 11870 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 11871 FormatStyle::BOS_None); 11872 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 11873 FormatStyle::BOS_All); 11874 11875 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 11876 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 11877 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 11878 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 11879 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 11880 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 11881 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 11882 // For backward compatibility: 11883 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 11884 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 11885 11886 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 11887 CHECK_PARSE("BreakInheritanceList: BeforeComma", 11888 BreakInheritanceList, FormatStyle::BILS_BeforeComma); 11889 CHECK_PARSE("BreakInheritanceList: AfterColon", 11890 BreakInheritanceList, FormatStyle::BILS_AfterColon); 11891 CHECK_PARSE("BreakInheritanceList: BeforeColon", 11892 BreakInheritanceList, FormatStyle::BILS_BeforeColon); 11893 // For backward compatibility: 11894 CHECK_PARSE("BreakBeforeInheritanceComma: true", 11895 BreakInheritanceList, FormatStyle::BILS_BeforeComma); 11896 11897 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 11898 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 11899 FormatStyle::BAS_Align); 11900 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 11901 FormatStyle::BAS_DontAlign); 11902 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 11903 FormatStyle::BAS_AlwaysBreak); 11904 // For backward compatibility: 11905 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 11906 FormatStyle::BAS_DontAlign); 11907 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 11908 FormatStyle::BAS_Align); 11909 11910 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11911 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 11912 FormatStyle::ENAS_DontAlign); 11913 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 11914 FormatStyle::ENAS_Left); 11915 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 11916 FormatStyle::ENAS_Right); 11917 // For backward compatibility: 11918 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 11919 FormatStyle::ENAS_Left); 11920 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 11921 FormatStyle::ENAS_Right); 11922 11923 Style.UseTab = FormatStyle::UT_ForIndentation; 11924 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 11925 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 11926 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 11927 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 11928 FormatStyle::UT_ForContinuationAndIndentation); 11929 // For backward compatibility: 11930 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 11931 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 11932 11933 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 11934 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 11935 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 11936 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 11937 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 11938 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 11939 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 11940 // For backward compatibility: 11941 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 11942 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 11943 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 11944 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 11945 11946 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 11947 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 11948 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 11949 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 11950 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 11951 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 11952 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 11953 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 11954 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 11955 // For backward compatibility: 11956 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 11957 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 11958 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 11959 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 11960 11961 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 11962 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 11963 FormatStyle::SBPO_Never); 11964 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 11965 FormatStyle::SBPO_Always); 11966 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 11967 FormatStyle::SBPO_ControlStatements); 11968 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 11969 FormatStyle::SBPO_NonEmptyParentheses); 11970 // For backward compatibility: 11971 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 11972 FormatStyle::SBPO_Never); 11973 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 11974 FormatStyle::SBPO_ControlStatements); 11975 11976 Style.ColumnLimit = 123; 11977 FormatStyle BaseStyle = getLLVMStyle(); 11978 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 11979 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 11980 11981 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11982 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 11983 FormatStyle::BS_Attach); 11984 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 11985 FormatStyle::BS_Linux); 11986 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 11987 FormatStyle::BS_Mozilla); 11988 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 11989 FormatStyle::BS_Stroustrup); 11990 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 11991 FormatStyle::BS_Allman); 11992 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 11993 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 11994 FormatStyle::BS_WebKit); 11995 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 11996 FormatStyle::BS_Custom); 11997 11998 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 11999 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 12000 FormatStyle::RTBS_None); 12001 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 12002 FormatStyle::RTBS_All); 12003 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 12004 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 12005 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 12006 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 12007 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 12008 AlwaysBreakAfterReturnType, 12009 FormatStyle::RTBS_TopLevelDefinitions); 12010 12011 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 12012 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations, 12013 FormatStyle::BTDS_No); 12014 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations, 12015 FormatStyle::BTDS_MultiLine); 12016 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations, 12017 FormatStyle::BTDS_Yes); 12018 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations, 12019 FormatStyle::BTDS_MultiLine); 12020 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations, 12021 FormatStyle::BTDS_Yes); 12022 12023 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 12024 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 12025 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 12026 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 12027 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 12028 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 12029 AlwaysBreakAfterDefinitionReturnType, 12030 FormatStyle::DRTBS_TopLevel); 12031 12032 Style.NamespaceIndentation = FormatStyle::NI_All; 12033 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 12034 FormatStyle::NI_None); 12035 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 12036 FormatStyle::NI_Inner); 12037 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 12038 FormatStyle::NI_All); 12039 12040 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 12041 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 12042 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12043 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 12044 AllowShortIfStatementsOnASingleLine, 12045 FormatStyle::SIS_WithoutElse); 12046 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 12047 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 12048 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 12049 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12050 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 12051 AllowShortIfStatementsOnASingleLine, 12052 FormatStyle::SIS_WithoutElse); 12053 12054 // FIXME: This is required because parsing a configuration simply overwrites 12055 // the first N elements of the list instead of resetting it. 12056 Style.ForEachMacros.clear(); 12057 std::vector<std::string> BoostForeach; 12058 BoostForeach.push_back("BOOST_FOREACH"); 12059 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 12060 std::vector<std::string> BoostAndQForeach; 12061 BoostAndQForeach.push_back("BOOST_FOREACH"); 12062 BoostAndQForeach.push_back("Q_FOREACH"); 12063 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 12064 BoostAndQForeach); 12065 12066 Style.StatementMacros.clear(); 12067 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 12068 std::vector<std::string>{"QUNUSED"}); 12069 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 12070 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 12071 12072 Style.NamespaceMacros.clear(); 12073 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 12074 std::vector<std::string>{"TESTSUITE"}); 12075 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 12076 std::vector<std::string>({"TESTSUITE", "SUITE"})); 12077 12078 Style.IncludeStyle.IncludeCategories.clear(); 12079 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 12080 {"abc/.*", 2}, {".*", 1}}; 12081 CHECK_PARSE("IncludeCategories:\n" 12082 " - Regex: abc/.*\n" 12083 " Priority: 2\n" 12084 " - Regex: .*\n" 12085 " Priority: 1", 12086 IncludeStyle.IncludeCategories, ExpectedCategories); 12087 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 12088 "abc$"); 12089 12090 Style.RawStringFormats.clear(); 12091 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 12092 { 12093 FormatStyle::LK_TextProto, 12094 {"pb", "proto"}, 12095 {"PARSE_TEXT_PROTO"}, 12096 /*CanonicalDelimiter=*/"", 12097 "llvm", 12098 }, 12099 { 12100 FormatStyle::LK_Cpp, 12101 {"cc", "cpp"}, 12102 {"C_CODEBLOCK", "CPPEVAL"}, 12103 /*CanonicalDelimiter=*/"cc", 12104 /*BasedOnStyle=*/"", 12105 }, 12106 }; 12107 12108 CHECK_PARSE("RawStringFormats:\n" 12109 " - Language: TextProto\n" 12110 " Delimiters:\n" 12111 " - 'pb'\n" 12112 " - 'proto'\n" 12113 " EnclosingFunctions:\n" 12114 " - 'PARSE_TEXT_PROTO'\n" 12115 " BasedOnStyle: llvm\n" 12116 " - Language: Cpp\n" 12117 " Delimiters:\n" 12118 " - 'cc'\n" 12119 " - 'cpp'\n" 12120 " EnclosingFunctions:\n" 12121 " - 'C_CODEBLOCK'\n" 12122 " - 'CPPEVAL'\n" 12123 " CanonicalDelimiter: 'cc'", 12124 RawStringFormats, ExpectedRawStringFormats); 12125 } 12126 12127 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 12128 FormatStyle Style = {}; 12129 Style.Language = FormatStyle::LK_Cpp; 12130 CHECK_PARSE("Language: Cpp\n" 12131 "IndentWidth: 12", 12132 IndentWidth, 12u); 12133 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 12134 "IndentWidth: 34", 12135 &Style), 12136 ParseError::Unsuitable); 12137 EXPECT_EQ(12u, Style.IndentWidth); 12138 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12139 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12140 12141 Style.Language = FormatStyle::LK_JavaScript; 12142 CHECK_PARSE("Language: JavaScript\n" 12143 "IndentWidth: 12", 12144 IndentWidth, 12u); 12145 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 12146 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 12147 "IndentWidth: 34", 12148 &Style), 12149 ParseError::Unsuitable); 12150 EXPECT_EQ(23u, Style.IndentWidth); 12151 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12152 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12153 12154 CHECK_PARSE("BasedOnStyle: LLVM\n" 12155 "IndentWidth: 67", 12156 IndentWidth, 67u); 12157 12158 CHECK_PARSE("---\n" 12159 "Language: JavaScript\n" 12160 "IndentWidth: 12\n" 12161 "---\n" 12162 "Language: Cpp\n" 12163 "IndentWidth: 34\n" 12164 "...\n", 12165 IndentWidth, 12u); 12166 12167 Style.Language = FormatStyle::LK_Cpp; 12168 CHECK_PARSE("---\n" 12169 "Language: JavaScript\n" 12170 "IndentWidth: 12\n" 12171 "---\n" 12172 "Language: Cpp\n" 12173 "IndentWidth: 34\n" 12174 "...\n", 12175 IndentWidth, 34u); 12176 CHECK_PARSE("---\n" 12177 "IndentWidth: 78\n" 12178 "---\n" 12179 "Language: JavaScript\n" 12180 "IndentWidth: 56\n" 12181 "...\n", 12182 IndentWidth, 78u); 12183 12184 Style.ColumnLimit = 123; 12185 Style.IndentWidth = 234; 12186 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 12187 Style.TabWidth = 345; 12188 EXPECT_FALSE(parseConfiguration("---\n" 12189 "IndentWidth: 456\n" 12190 "BreakBeforeBraces: Allman\n" 12191 "---\n" 12192 "Language: JavaScript\n" 12193 "IndentWidth: 111\n" 12194 "TabWidth: 111\n" 12195 "---\n" 12196 "Language: Cpp\n" 12197 "BreakBeforeBraces: Stroustrup\n" 12198 "TabWidth: 789\n" 12199 "...\n", 12200 &Style)); 12201 EXPECT_EQ(123u, Style.ColumnLimit); 12202 EXPECT_EQ(456u, Style.IndentWidth); 12203 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 12204 EXPECT_EQ(789u, Style.TabWidth); 12205 12206 EXPECT_EQ(parseConfiguration("---\n" 12207 "Language: JavaScript\n" 12208 "IndentWidth: 56\n" 12209 "---\n" 12210 "IndentWidth: 78\n" 12211 "...\n", 12212 &Style), 12213 ParseError::Error); 12214 EXPECT_EQ(parseConfiguration("---\n" 12215 "Language: JavaScript\n" 12216 "IndentWidth: 56\n" 12217 "---\n" 12218 "Language: JavaScript\n" 12219 "IndentWidth: 78\n" 12220 "...\n", 12221 &Style), 12222 ParseError::Error); 12223 12224 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12225 } 12226 12227 #undef CHECK_PARSE 12228 12229 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 12230 FormatStyle Style = {}; 12231 Style.Language = FormatStyle::LK_JavaScript; 12232 Style.BreakBeforeTernaryOperators = true; 12233 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 12234 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12235 12236 Style.BreakBeforeTernaryOperators = true; 12237 EXPECT_EQ(0, parseConfiguration("---\n" 12238 "BasedOnStyle: Google\n" 12239 "---\n" 12240 "Language: JavaScript\n" 12241 "IndentWidth: 76\n" 12242 "...\n", 12243 &Style) 12244 .value()); 12245 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12246 EXPECT_EQ(76u, Style.IndentWidth); 12247 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12248 } 12249 12250 TEST_F(FormatTest, ConfigurationRoundTripTest) { 12251 FormatStyle Style = getLLVMStyle(); 12252 std::string YAML = configurationAsText(Style); 12253 FormatStyle ParsedStyle = {}; 12254 ParsedStyle.Language = FormatStyle::LK_Cpp; 12255 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 12256 EXPECT_EQ(Style, ParsedStyle); 12257 } 12258 12259 TEST_F(FormatTest, WorksFor8bitEncodings) { 12260 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 12261 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 12262 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 12263 "\"\xef\xee\xf0\xf3...\"", 12264 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 12265 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 12266 "\xef\xee\xf0\xf3...\"", 12267 getLLVMStyleWithColumns(12))); 12268 } 12269 12270 TEST_F(FormatTest, HandlesUTF8BOM) { 12271 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 12272 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 12273 format("\xef\xbb\xbf#include <iostream>")); 12274 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 12275 format("\xef\xbb\xbf\n#include <iostream>")); 12276 } 12277 12278 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 12279 #if !defined(_MSC_VER) 12280 12281 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 12282 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 12283 getLLVMStyleWithColumns(35)); 12284 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 12285 getLLVMStyleWithColumns(31)); 12286 verifyFormat("// Однажды в студёную зимнюю пору...", 12287 getLLVMStyleWithColumns(36)); 12288 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 12289 verifyFormat("/* Однажды в студёную зимнюю пору... */", 12290 getLLVMStyleWithColumns(39)); 12291 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 12292 getLLVMStyleWithColumns(35)); 12293 } 12294 12295 TEST_F(FormatTest, SplitsUTF8Strings) { 12296 // Non-printable characters' width is currently considered to be the length in 12297 // bytes in UTF8. The characters can be displayed in very different manner 12298 // (zero-width, single width with a substitution glyph, expanded to their code 12299 // (e.g. "<8d>"), so there's no single correct way to handle them. 12300 EXPECT_EQ("\"aaaaÄ\"\n" 12301 "\"\xc2\x8d\";", 12302 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12303 EXPECT_EQ("\"aaaaaaaÄ\"\n" 12304 "\"\xc2\x8d\";", 12305 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12306 EXPECT_EQ("\"Однажды, в \"\n" 12307 "\"студёную \"\n" 12308 "\"зимнюю \"\n" 12309 "\"пору,\"", 12310 format("\"Однажды, в студёную зимнюю пору,\"", 12311 getLLVMStyleWithColumns(13))); 12312 EXPECT_EQ( 12313 "\"一 二 三 \"\n" 12314 "\"四 五六 \"\n" 12315 "\"七 八 九 \"\n" 12316 "\"十\"", 12317 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 12318 EXPECT_EQ("\"一\t\"\n" 12319 "\"二 \t\"\n" 12320 "\"三 四 \"\n" 12321 "\"五\t\"\n" 12322 "\"六 \t\"\n" 12323 "\"七 \"\n" 12324 "\"八九十\tqq\"", 12325 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 12326 getLLVMStyleWithColumns(11))); 12327 12328 // UTF8 character in an escape sequence. 12329 EXPECT_EQ("\"aaaaaa\"\n" 12330 "\"\\\xC2\x8D\"", 12331 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 12332 } 12333 12334 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 12335 EXPECT_EQ("const char *sssss =\n" 12336 " \"一二三四五六七八\\\n" 12337 " 九 十\";", 12338 format("const char *sssss = \"一二三四五六七八\\\n" 12339 " 九 十\";", 12340 getLLVMStyleWithColumns(30))); 12341 } 12342 12343 TEST_F(FormatTest, SplitsUTF8LineComments) { 12344 EXPECT_EQ("// aaaaÄ\xc2\x8d", 12345 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 12346 EXPECT_EQ("// Я из лесу\n" 12347 "// вышел; был\n" 12348 "// сильный\n" 12349 "// мороз.", 12350 format("// Я из лесу вышел; был сильный мороз.", 12351 getLLVMStyleWithColumns(13))); 12352 EXPECT_EQ("// 一二三\n" 12353 "// 四五六七\n" 12354 "// 八 九\n" 12355 "// 十", 12356 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 12357 } 12358 12359 TEST_F(FormatTest, SplitsUTF8BlockComments) { 12360 EXPECT_EQ("/* Гляжу,\n" 12361 " * поднимается\n" 12362 " * медленно в\n" 12363 " * гору\n" 12364 " * Лошадка,\n" 12365 " * везущая\n" 12366 " * хворосту\n" 12367 " * воз. */", 12368 format("/* Гляжу, поднимается медленно в гору\n" 12369 " * Лошадка, везущая хворосту воз. */", 12370 getLLVMStyleWithColumns(13))); 12371 EXPECT_EQ( 12372 "/* 一二三\n" 12373 " * 四五六七\n" 12374 " * 八 九\n" 12375 " * 十 */", 12376 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 12377 EXPECT_EQ("/* \n" 12378 " * \n" 12379 " * - */", 12380 format("/* - */", getLLVMStyleWithColumns(12))); 12381 } 12382 12383 #endif // _MSC_VER 12384 12385 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 12386 FormatStyle Style = getLLVMStyle(); 12387 12388 Style.ConstructorInitializerIndentWidth = 4; 12389 verifyFormat( 12390 "SomeClass::Constructor()\n" 12391 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12392 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12393 Style); 12394 12395 Style.ConstructorInitializerIndentWidth = 2; 12396 verifyFormat( 12397 "SomeClass::Constructor()\n" 12398 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12399 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12400 Style); 12401 12402 Style.ConstructorInitializerIndentWidth = 0; 12403 verifyFormat( 12404 "SomeClass::Constructor()\n" 12405 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12406 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12407 Style); 12408 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12409 verifyFormat( 12410 "SomeLongTemplateVariableName<\n" 12411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 12412 Style); 12413 verifyFormat( 12414 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 12415 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 12416 Style); 12417 12418 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 12419 verifyFormat( 12420 "SomeClass::Constructor() :\n" 12421 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 12422 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 12423 Style); 12424 } 12425 12426 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 12427 FormatStyle Style = getLLVMStyle(); 12428 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 12429 Style.ConstructorInitializerIndentWidth = 4; 12430 verifyFormat("SomeClass::Constructor()\n" 12431 " : a(a)\n" 12432 " , b(b)\n" 12433 " , c(c) {}", 12434 Style); 12435 verifyFormat("SomeClass::Constructor()\n" 12436 " : a(a) {}", 12437 Style); 12438 12439 Style.ColumnLimit = 0; 12440 verifyFormat("SomeClass::Constructor()\n" 12441 " : a(a) {}", 12442 Style); 12443 verifyFormat("SomeClass::Constructor() noexcept\n" 12444 " : a(a) {}", 12445 Style); 12446 verifyFormat("SomeClass::Constructor()\n" 12447 " : a(a)\n" 12448 " , b(b)\n" 12449 " , c(c) {}", 12450 Style); 12451 verifyFormat("SomeClass::Constructor()\n" 12452 " : a(a) {\n" 12453 " foo();\n" 12454 " bar();\n" 12455 "}", 12456 Style); 12457 12458 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 12459 verifyFormat("SomeClass::Constructor()\n" 12460 " : a(a)\n" 12461 " , b(b)\n" 12462 " , c(c) {\n}", 12463 Style); 12464 verifyFormat("SomeClass::Constructor()\n" 12465 " : a(a) {\n}", 12466 Style); 12467 12468 Style.ColumnLimit = 80; 12469 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 12470 Style.ConstructorInitializerIndentWidth = 2; 12471 verifyFormat("SomeClass::Constructor()\n" 12472 " : a(a)\n" 12473 " , b(b)\n" 12474 " , c(c) {}", 12475 Style); 12476 12477 Style.ConstructorInitializerIndentWidth = 0; 12478 verifyFormat("SomeClass::Constructor()\n" 12479 ": a(a)\n" 12480 ", b(b)\n" 12481 ", c(c) {}", 12482 Style); 12483 12484 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 12485 Style.ConstructorInitializerIndentWidth = 4; 12486 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 12487 verifyFormat( 12488 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 12489 Style); 12490 verifyFormat( 12491 "SomeClass::Constructor()\n" 12492 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 12493 Style); 12494 Style.ConstructorInitializerIndentWidth = 4; 12495 Style.ColumnLimit = 60; 12496 verifyFormat("SomeClass::Constructor()\n" 12497 " : aaaaaaaa(aaaaaaaa)\n" 12498 " , aaaaaaaa(aaaaaaaa)\n" 12499 " , aaaaaaaa(aaaaaaaa) {}", 12500 Style); 12501 } 12502 12503 TEST_F(FormatTest, Destructors) { 12504 verifyFormat("void F(int &i) { i.~int(); }"); 12505 verifyFormat("void F(int &i) { i->~int(); }"); 12506 } 12507 12508 TEST_F(FormatTest, FormatsWithWebKitStyle) { 12509 FormatStyle Style = getWebKitStyle(); 12510 12511 // Don't indent in outer namespaces. 12512 verifyFormat("namespace outer {\n" 12513 "int i;\n" 12514 "namespace inner {\n" 12515 " int i;\n" 12516 "} // namespace inner\n" 12517 "} // namespace outer\n" 12518 "namespace other_outer {\n" 12519 "int i;\n" 12520 "}", 12521 Style); 12522 12523 // Don't indent case labels. 12524 verifyFormat("switch (variable) {\n" 12525 "case 1:\n" 12526 "case 2:\n" 12527 " doSomething();\n" 12528 " break;\n" 12529 "default:\n" 12530 " ++variable;\n" 12531 "}", 12532 Style); 12533 12534 // Wrap before binary operators. 12535 EXPECT_EQ("void f()\n" 12536 "{\n" 12537 " if (aaaaaaaaaaaaaaaa\n" 12538 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 12539 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 12540 " return;\n" 12541 "}", 12542 format("void f() {\n" 12543 "if (aaaaaaaaaaaaaaaa\n" 12544 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 12545 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 12546 "return;\n" 12547 "}", 12548 Style)); 12549 12550 // Allow functions on a single line. 12551 verifyFormat("void f() { return; }", Style); 12552 12553 // Allow empty blocks on a single line and insert a space in empty blocks. 12554 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 12555 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 12556 // However, don't merge non-empty short loops. 12557 EXPECT_EQ("while (true) {\n" 12558 " continue;\n" 12559 "}", format("while (true) { continue; }", Style)); 12560 12561 // Constructor initializers are formatted one per line with the "," on the 12562 // new line. 12563 verifyFormat("Constructor()\n" 12564 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 12565 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 12566 " aaaaaaaaaaaaaa)\n" 12567 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 12568 "{\n" 12569 "}", 12570 Style); 12571 verifyFormat("SomeClass::Constructor()\n" 12572 " : a(a)\n" 12573 "{\n" 12574 "}", 12575 Style); 12576 EXPECT_EQ("SomeClass::Constructor()\n" 12577 " : a(a)\n" 12578 "{\n" 12579 "}", 12580 format("SomeClass::Constructor():a(a){}", Style)); 12581 verifyFormat("SomeClass::Constructor()\n" 12582 " : a(a)\n" 12583 " , b(b)\n" 12584 " , c(c)\n" 12585 "{\n" 12586 "}", 12587 Style); 12588 verifyFormat("SomeClass::Constructor()\n" 12589 " : a(a)\n" 12590 "{\n" 12591 " foo();\n" 12592 " bar();\n" 12593 "}", 12594 Style); 12595 12596 // Access specifiers should be aligned left. 12597 verifyFormat("class C {\n" 12598 "public:\n" 12599 " int i;\n" 12600 "};", 12601 Style); 12602 12603 // Do not align comments. 12604 verifyFormat("int a; // Do not\n" 12605 "double b; // align comments.", 12606 Style); 12607 12608 // Do not align operands. 12609 EXPECT_EQ("ASSERT(aaaa\n" 12610 " || bbbb);", 12611 format("ASSERT ( aaaa\n||bbbb);", Style)); 12612 12613 // Accept input's line breaks. 12614 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 12615 " || bbbbbbbbbbbbbbb) {\n" 12616 " i++;\n" 12617 "}", 12618 format("if (aaaaaaaaaaaaaaa\n" 12619 "|| bbbbbbbbbbbbbbb) { i++; }", 12620 Style)); 12621 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 12622 " i++;\n" 12623 "}", 12624 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 12625 12626 // Don't automatically break all macro definitions (llvm.org/PR17842). 12627 verifyFormat("#define aNumber 10", Style); 12628 // However, generally keep the line breaks that the user authored. 12629 EXPECT_EQ("#define aNumber \\\n" 12630 " 10", 12631 format("#define aNumber \\\n" 12632 " 10", 12633 Style)); 12634 12635 // Keep empty and one-element array literals on a single line. 12636 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 12637 " copyItems:YES];", 12638 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 12639 "copyItems:YES];", 12640 Style)); 12641 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 12642 " copyItems:YES];", 12643 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 12644 " copyItems:YES];", 12645 Style)); 12646 // FIXME: This does not seem right, there should be more indentation before 12647 // the array literal's entries. Nested blocks have the same problem. 12648 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 12649 " @\"a\",\n" 12650 " @\"a\"\n" 12651 "]\n" 12652 " copyItems:YES];", 12653 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 12654 " @\"a\",\n" 12655 " @\"a\"\n" 12656 " ]\n" 12657 " copyItems:YES];", 12658 Style)); 12659 EXPECT_EQ( 12660 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 12661 " copyItems:YES];", 12662 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 12663 " copyItems:YES];", 12664 Style)); 12665 12666 verifyFormat("[self.a b:c c:d];", Style); 12667 EXPECT_EQ("[self.a b:c\n" 12668 " c:d];", 12669 format("[self.a b:c\n" 12670 "c:d];", 12671 Style)); 12672 } 12673 12674 TEST_F(FormatTest, FormatsLambdas) { 12675 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 12676 verifyFormat( 12677 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 12678 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 12679 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 12680 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 12681 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 12682 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 12683 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 12684 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 12685 verifyFormat("int x = f(*+[] {});"); 12686 verifyFormat("void f() {\n" 12687 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 12688 "}\n"); 12689 verifyFormat("void f() {\n" 12690 " other(x.begin(), //\n" 12691 " x.end(), //\n" 12692 " [&](int, int) { return 1; });\n" 12693 "}\n"); 12694 verifyFormat("void f() {\n" 12695 " other.other.other.other.other(\n" 12696 " x.begin(), x.end(),\n" 12697 " [something, rather](int, int, int, int, int, int, int) { return 1; });\n" 12698 "}\n"); 12699 verifyFormat("void f() {\n" 12700 " other.other.other.other.other(\n" 12701 " x.begin(), x.end(),\n" 12702 " [something, rather](int, int, int, int, int, int, int) {\n" 12703 " //\n" 12704 " });\n" 12705 "}\n"); 12706 verifyFormat("SomeFunction([]() { // A cool function...\n" 12707 " return 43;\n" 12708 "});"); 12709 EXPECT_EQ("SomeFunction([]() {\n" 12710 "#define A a\n" 12711 " return 43;\n" 12712 "});", 12713 format("SomeFunction([](){\n" 12714 "#define A a\n" 12715 "return 43;\n" 12716 "});")); 12717 verifyFormat("void f() {\n" 12718 " SomeFunction([](decltype(x), A *a) {});\n" 12719 "}"); 12720 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 12721 " [](const aaaaaaaaaa &a) { return a; });"); 12722 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 12723 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 12724 "});"); 12725 verifyFormat("Constructor()\n" 12726 " : Field([] { // comment\n" 12727 " int i;\n" 12728 " }) {}"); 12729 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 12730 " return some_parameter.size();\n" 12731 "};"); 12732 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 12733 " [](const string &s) { return s; };"); 12734 verifyFormat("int i = aaaaaa ? 1 //\n" 12735 " : [] {\n" 12736 " return 2; //\n" 12737 " }();"); 12738 verifyFormat("llvm::errs() << \"number of twos is \"\n" 12739 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 12740 " return x == 2; // force break\n" 12741 " });"); 12742 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 12743 " [=](int iiiiiiiiiiii) {\n" 12744 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 12745 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 12746 " });", 12747 getLLVMStyleWithColumns(60)); 12748 verifyFormat("SomeFunction({[&] {\n" 12749 " // comment\n" 12750 " },\n" 12751 " [&] {\n" 12752 " // comment\n" 12753 " }});"); 12754 verifyFormat("SomeFunction({[&] {\n" 12755 " // comment\n" 12756 "}});"); 12757 verifyFormat("virtual aaaaaaaaaaaaaaaa(\n" 12758 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 12759 " aaaaa aaaaaaaaa);"); 12760 12761 // Lambdas with return types. 12762 verifyFormat("int c = []() -> int { return 2; }();\n"); 12763 verifyFormat("int c = []() -> int * { return 2; }();\n"); 12764 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 12765 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 12766 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 12767 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 12768 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 12769 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 12770 verifyFormat("[a, a]() -> a<1> {};"); 12771 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 12772 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 12773 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 12774 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 12775 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 12776 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 12777 verifyFormat("[]() -> foo<!5> { return {}; };"); 12778 verifyFormat("[]() -> foo<~5> { return {}; };"); 12779 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 12780 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 12781 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 12782 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 12783 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 12784 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 12785 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 12786 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 12787 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 12788 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 12789 verifyFormat("namespace bar {\n" 12790 "// broken:\n" 12791 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 12792 "} // namespace bar"); 12793 verifyFormat("namespace bar {\n" 12794 "// broken:\n" 12795 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 12796 "} // namespace bar"); 12797 verifyFormat("namespace bar {\n" 12798 "// broken:\n" 12799 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 12800 "} // namespace bar"); 12801 verifyFormat("namespace bar {\n" 12802 "// broken:\n" 12803 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 12804 "} // namespace bar"); 12805 verifyFormat("namespace bar {\n" 12806 "// broken:\n" 12807 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 12808 "} // namespace bar"); 12809 verifyFormat("namespace bar {\n" 12810 "// broken:\n" 12811 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 12812 "} // namespace bar"); 12813 verifyFormat("namespace bar {\n" 12814 "// broken:\n" 12815 "auto foo{[]() -> foo<!5> { return {}; }};\n" 12816 "} // namespace bar"); 12817 verifyFormat("namespace bar {\n" 12818 "// broken:\n" 12819 "auto foo{[]() -> foo<~5> { return {}; }};\n" 12820 "} // namespace bar"); 12821 verifyFormat("namespace bar {\n" 12822 "// broken:\n" 12823 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 12824 "} // namespace bar"); 12825 verifyFormat("namespace bar {\n" 12826 "// broken:\n" 12827 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 12828 "} // namespace bar"); 12829 verifyFormat("namespace bar {\n" 12830 "// broken:\n" 12831 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 12832 "} // namespace bar"); 12833 verifyFormat("namespace bar {\n" 12834 "// broken:\n" 12835 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 12836 "} // namespace bar"); 12837 verifyFormat("namespace bar {\n" 12838 "// broken:\n" 12839 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 12840 "} // namespace bar"); 12841 verifyFormat("namespace bar {\n" 12842 "// broken:\n" 12843 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 12844 "} // namespace bar"); 12845 verifyFormat("namespace bar {\n" 12846 "// broken:\n" 12847 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 12848 "} // namespace bar"); 12849 verifyFormat("namespace bar {\n" 12850 "// broken:\n" 12851 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 12852 "} // namespace bar"); 12853 verifyFormat("namespace bar {\n" 12854 "// broken:\n" 12855 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 12856 "} // namespace bar"); 12857 verifyFormat("namespace bar {\n" 12858 "// broken:\n" 12859 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 12860 "} // namespace bar"); 12861 verifyFormat("[]() -> a<1> {};"); 12862 verifyFormat("[]() -> a<1> { ; };"); 12863 verifyFormat("[]() -> a<1> { ; }();"); 12864 verifyFormat("[a, a]() -> a<true> {};"); 12865 verifyFormat("[]() -> a<true> {};"); 12866 verifyFormat("[]() -> a<true> { ; };"); 12867 verifyFormat("[]() -> a<true> { ; }();"); 12868 verifyFormat("[a, a]() -> a<false> {};"); 12869 verifyFormat("[]() -> a<false> {};"); 12870 verifyFormat("[]() -> a<false> { ; };"); 12871 verifyFormat("[]() -> a<false> { ; }();"); 12872 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 12873 verifyFormat("namespace bar {\n" 12874 "auto foo{[]() -> foo<false> { ; }};\n" 12875 "} // namespace bar"); 12876 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 12877 " int j) -> int {\n" 12878 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 12879 "};"); 12880 verifyFormat( 12881 "aaaaaaaaaaaaaaaaaaaaaa(\n" 12882 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 12883 " return aaaaaaaaaaaaaaaaa;\n" 12884 " });", 12885 getLLVMStyleWithColumns(70)); 12886 verifyFormat("[]() //\n" 12887 " -> int {\n" 12888 " return 1; //\n" 12889 "};"); 12890 12891 // Multiple lambdas in the same parentheses change indentation rules. These 12892 // lambdas are forced to start on new lines. 12893 verifyFormat("SomeFunction(\n" 12894 " []() {\n" 12895 " //\n" 12896 " },\n" 12897 " []() {\n" 12898 " //\n" 12899 " });"); 12900 12901 // A lambda passed as arg0 is always pushed to the next line. 12902 verifyFormat("SomeFunction(\n" 12903 " [this] {\n" 12904 " //\n" 12905 " },\n" 12906 " 1);\n"); 12907 12908 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like the arg0 12909 // case above. 12910 auto Style = getGoogleStyle(); 12911 Style.BinPackArguments = false; 12912 verifyFormat("SomeFunction(\n" 12913 " a,\n" 12914 " [this] {\n" 12915 " //\n" 12916 " },\n" 12917 " b);\n", 12918 Style); 12919 verifyFormat("SomeFunction(\n" 12920 " a,\n" 12921 " [this] {\n" 12922 " //\n" 12923 " },\n" 12924 " b);\n"); 12925 12926 // A lambda with a very long line forces arg0 to be pushed out irrespective of 12927 // the BinPackArguments value (as long as the code is wide enough). 12928 verifyFormat("something->SomeFunction(\n" 12929 " a,\n" 12930 " [this] {\n" 12931 " D0000000000000000000000000000000000000000000000000000000000001();\n" 12932 " },\n" 12933 " b);\n"); 12934 12935 // A multi-line lambda is pulled up as long as the introducer fits on the previous 12936 // line and there are no further args. 12937 verifyFormat("function(1, [this, that] {\n" 12938 " //\n" 12939 "});\n"); 12940 verifyFormat("function([this, that] {\n" 12941 " //\n" 12942 "});\n"); 12943 // FIXME: this format is not ideal and we should consider forcing the first arg 12944 // onto its own line. 12945 verifyFormat("function(a, b, c, //\n" 12946 " d, [this, that] {\n" 12947 " //\n" 12948 " });\n"); 12949 12950 // Multiple lambdas are treated correctly even when there is a short arg0. 12951 verifyFormat("SomeFunction(\n" 12952 " 1,\n" 12953 " [this] {\n" 12954 " //\n" 12955 " },\n" 12956 " [this] {\n" 12957 " //\n" 12958 " },\n" 12959 " 1);\n"); 12960 12961 // More complex introducers. 12962 verifyFormat("return [i, args...] {};"); 12963 12964 // Not lambdas. 12965 verifyFormat("constexpr char hello[]{\"hello\"};"); 12966 verifyFormat("double &operator[](int i) { return 0; }\n" 12967 "int i;"); 12968 verifyFormat("std::unique_ptr<int[]> foo() {}"); 12969 verifyFormat("int i = a[a][a]->f();"); 12970 verifyFormat("int i = (*b)[a]->f();"); 12971 12972 // Other corner cases. 12973 verifyFormat("void f() {\n" 12974 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 12975 " );\n" 12976 "}"); 12977 12978 // Lambdas created through weird macros. 12979 verifyFormat("void f() {\n" 12980 " MACRO((const AA &a) { return 1; });\n" 12981 " MACRO((AA &a) { return 1; });\n" 12982 "}"); 12983 12984 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 12985 " doo_dah();\n" 12986 " doo_dah();\n" 12987 " })) {\n" 12988 "}"); 12989 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 12990 " doo_dah();\n" 12991 " doo_dah();\n" 12992 " })) {\n" 12993 "}"); 12994 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 12995 " doo_dah();\n" 12996 " doo_dah();\n" 12997 " })) {\n" 12998 "}"); 12999 verifyFormat("auto lambda = []() {\n" 13000 " int a = 2\n" 13001 "#if A\n" 13002 " + 2\n" 13003 "#endif\n" 13004 " ;\n" 13005 "};"); 13006 13007 // Lambdas with complex multiline introducers. 13008 verifyFormat( 13009 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13010 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 13011 " -> ::std::unordered_set<\n" 13012 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 13013 " //\n" 13014 " });"); 13015 13016 FormatStyle DoNotMerge = getLLVMStyle(); 13017 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13018 verifyFormat("auto c = []() {\n" 13019 " return b;\n" 13020 "};", 13021 "auto c = []() { return b; };", DoNotMerge); 13022 verifyFormat("auto c = []() {\n" 13023 "};", 13024 " auto c = []() {};", DoNotMerge); 13025 13026 FormatStyle MergeEmptyOnly = getLLVMStyle(); 13027 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 13028 verifyFormat("auto c = []() {\n" 13029 " return b;\n" 13030 "};", 13031 "auto c = []() {\n" 13032 " return b;\n" 13033 " };", 13034 MergeEmptyOnly); 13035 verifyFormat("auto c = []() {};", 13036 "auto c = []() {\n" 13037 "};", 13038 MergeEmptyOnly); 13039 13040 FormatStyle MergeInline = getLLVMStyle(); 13041 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 13042 verifyFormat("auto c = []() {\n" 13043 " return b;\n" 13044 "};", 13045 "auto c = []() { return b; };", MergeInline); 13046 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 13047 MergeInline); 13048 verifyFormat("function([]() { return b; }, a)", 13049 "function([]() { return b; }, a)", MergeInline); 13050 verifyFormat("function(a, []() { return b; })", 13051 "function(a, []() { return b; })", MergeInline); 13052 } 13053 13054 TEST_F(FormatTest, EmptyLinesInLambdas) { 13055 verifyFormat("auto lambda = []() {\n" 13056 " x(); //\n" 13057 "};", 13058 "auto lambda = []() {\n" 13059 "\n" 13060 " x(); //\n" 13061 "\n" 13062 "};"); 13063 } 13064 13065 TEST_F(FormatTest, FormatsBlocks) { 13066 FormatStyle ShortBlocks = getLLVMStyle(); 13067 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13068 verifyFormat("int (^Block)(int, int);", ShortBlocks); 13069 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 13070 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 13071 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 13072 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 13073 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 13074 13075 verifyFormat("foo(^{ bar(); });", ShortBlocks); 13076 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 13077 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 13078 13079 verifyFormat("[operation setCompletionBlock:^{\n" 13080 " [self onOperationDone];\n" 13081 "}];"); 13082 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 13083 " [self onOperationDone];\n" 13084 "}]};"); 13085 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 13086 " f();\n" 13087 "}];"); 13088 verifyFormat("int a = [operation block:^int(int *i) {\n" 13089 " return 1;\n" 13090 "}];"); 13091 verifyFormat("[myObject doSomethingWith:arg1\n" 13092 " aaa:^int(int *a) {\n" 13093 " return 1;\n" 13094 " }\n" 13095 " bbb:f(a * bbbbbbbb)];"); 13096 13097 verifyFormat("[operation setCompletionBlock:^{\n" 13098 " [self.delegate newDataAvailable];\n" 13099 "}];", 13100 getLLVMStyleWithColumns(60)); 13101 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 13102 " NSString *path = [self sessionFilePath];\n" 13103 " if (path) {\n" 13104 " // ...\n" 13105 " }\n" 13106 "});"); 13107 verifyFormat("[[SessionService sharedService]\n" 13108 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13109 " if (window) {\n" 13110 " [self windowDidLoad:window];\n" 13111 " } else {\n" 13112 " [self errorLoadingWindow];\n" 13113 " }\n" 13114 " }];"); 13115 verifyFormat("void (^largeBlock)(void) = ^{\n" 13116 " // ...\n" 13117 "};\n", 13118 getLLVMStyleWithColumns(40)); 13119 verifyFormat("[[SessionService sharedService]\n" 13120 " loadWindowWithCompletionBlock: //\n" 13121 " ^(SessionWindow *window) {\n" 13122 " if (window) {\n" 13123 " [self windowDidLoad:window];\n" 13124 " } else {\n" 13125 " [self errorLoadingWindow];\n" 13126 " }\n" 13127 " }];", 13128 getLLVMStyleWithColumns(60)); 13129 verifyFormat("[myObject doSomethingWith:arg1\n" 13130 " firstBlock:^(Foo *a) {\n" 13131 " // ...\n" 13132 " int i;\n" 13133 " }\n" 13134 " secondBlock:^(Bar *b) {\n" 13135 " // ...\n" 13136 " int i;\n" 13137 " }\n" 13138 " thirdBlock:^Foo(Bar *b) {\n" 13139 " // ...\n" 13140 " int i;\n" 13141 " }];"); 13142 verifyFormat("[myObject doSomethingWith:arg1\n" 13143 " firstBlock:-1\n" 13144 " secondBlock:^(Bar *b) {\n" 13145 " // ...\n" 13146 " int i;\n" 13147 " }];"); 13148 13149 verifyFormat("f(^{\n" 13150 " @autoreleasepool {\n" 13151 " if (a) {\n" 13152 " g();\n" 13153 " }\n" 13154 " }\n" 13155 "});"); 13156 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 13157 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 13158 "};"); 13159 13160 FormatStyle FourIndent = getLLVMStyle(); 13161 FourIndent.ObjCBlockIndentWidth = 4; 13162 verifyFormat("[operation setCompletionBlock:^{\n" 13163 " [self onOperationDone];\n" 13164 "}];", 13165 FourIndent); 13166 } 13167 13168 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 13169 FormatStyle ZeroColumn = getLLVMStyle(); 13170 ZeroColumn.ColumnLimit = 0; 13171 13172 verifyFormat("[[SessionService sharedService] " 13173 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13174 " if (window) {\n" 13175 " [self windowDidLoad:window];\n" 13176 " } else {\n" 13177 " [self errorLoadingWindow];\n" 13178 " }\n" 13179 "}];", 13180 ZeroColumn); 13181 EXPECT_EQ("[[SessionService sharedService]\n" 13182 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13183 " if (window) {\n" 13184 " [self windowDidLoad:window];\n" 13185 " } else {\n" 13186 " [self errorLoadingWindow];\n" 13187 " }\n" 13188 " }];", 13189 format("[[SessionService sharedService]\n" 13190 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13191 " if (window) {\n" 13192 " [self windowDidLoad:window];\n" 13193 " } else {\n" 13194 " [self errorLoadingWindow];\n" 13195 " }\n" 13196 "}];", 13197 ZeroColumn)); 13198 verifyFormat("[myObject doSomethingWith:arg1\n" 13199 " firstBlock:^(Foo *a) {\n" 13200 " // ...\n" 13201 " int i;\n" 13202 " }\n" 13203 " secondBlock:^(Bar *b) {\n" 13204 " // ...\n" 13205 " int i;\n" 13206 " }\n" 13207 " thirdBlock:^Foo(Bar *b) {\n" 13208 " // ...\n" 13209 " int i;\n" 13210 " }];", 13211 ZeroColumn); 13212 verifyFormat("f(^{\n" 13213 " @autoreleasepool {\n" 13214 " if (a) {\n" 13215 " g();\n" 13216 " }\n" 13217 " }\n" 13218 "});", 13219 ZeroColumn); 13220 verifyFormat("void (^largeBlock)(void) = ^{\n" 13221 " // ...\n" 13222 "};", 13223 ZeroColumn); 13224 13225 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13226 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 13227 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13228 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 13229 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 13230 " int i;\n" 13231 "};", 13232 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13233 } 13234 13235 TEST_F(FormatTest, SupportsCRLF) { 13236 EXPECT_EQ("int a;\r\n" 13237 "int b;\r\n" 13238 "int c;\r\n", 13239 format("int a;\r\n" 13240 " int b;\r\n" 13241 " int c;\r\n", 13242 getLLVMStyle())); 13243 EXPECT_EQ("int a;\r\n" 13244 "int b;\r\n" 13245 "int c;\r\n", 13246 format("int a;\r\n" 13247 " int b;\n" 13248 " int c;\r\n", 13249 getLLVMStyle())); 13250 EXPECT_EQ("int a;\n" 13251 "int b;\n" 13252 "int c;\n", 13253 format("int a;\r\n" 13254 " int b;\n" 13255 " int c;\n", 13256 getLLVMStyle())); 13257 EXPECT_EQ("\"aaaaaaa \"\r\n" 13258 "\"bbbbbbb\";\r\n", 13259 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 13260 EXPECT_EQ("#define A \\\r\n" 13261 " b; \\\r\n" 13262 " c; \\\r\n" 13263 " d;\r\n", 13264 format("#define A \\\r\n" 13265 " b; \\\r\n" 13266 " c; d; \r\n", 13267 getGoogleStyle())); 13268 13269 EXPECT_EQ("/*\r\n" 13270 "multi line block comments\r\n" 13271 "should not introduce\r\n" 13272 "an extra carriage return\r\n" 13273 "*/\r\n", 13274 format("/*\r\n" 13275 "multi line block comments\r\n" 13276 "should not introduce\r\n" 13277 "an extra carriage return\r\n" 13278 "*/\r\n")); 13279 EXPECT_EQ("/*\r\n" 13280 "\r\n" 13281 "*/", 13282 format("/*\r\n" 13283 " \r\r\r\n" 13284 "*/")); 13285 } 13286 13287 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 13288 verifyFormat("MY_CLASS(C) {\n" 13289 " int i;\n" 13290 " int j;\n" 13291 "};"); 13292 } 13293 13294 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 13295 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 13296 TwoIndent.ContinuationIndentWidth = 2; 13297 13298 EXPECT_EQ("int i =\n" 13299 " longFunction(\n" 13300 " arg);", 13301 format("int i = longFunction(arg);", TwoIndent)); 13302 13303 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 13304 SixIndent.ContinuationIndentWidth = 6; 13305 13306 EXPECT_EQ("int i =\n" 13307 " longFunction(\n" 13308 " arg);", 13309 format("int i = longFunction(arg);", SixIndent)); 13310 } 13311 13312 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 13313 FormatStyle Style = getLLVMStyle(); 13314 verifyFormat("int Foo::getter(\n" 13315 " //\n" 13316 ") const {\n" 13317 " return foo;\n" 13318 "}", 13319 Style); 13320 verifyFormat("void Foo::setter(\n" 13321 " //\n" 13322 ") {\n" 13323 " foo = 1;\n" 13324 "}", 13325 Style); 13326 } 13327 13328 TEST_F(FormatTest, SpacesInAngles) { 13329 FormatStyle Spaces = getLLVMStyle(); 13330 Spaces.SpacesInAngles = true; 13331 13332 verifyFormat("static_cast< int >(arg);", Spaces); 13333 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 13334 verifyFormat("f< int, float >();", Spaces); 13335 verifyFormat("template <> g() {}", Spaces); 13336 verifyFormat("template < std::vector< int > > f() {}", Spaces); 13337 verifyFormat("std::function< void(int, int) > fct;", Spaces); 13338 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 13339 Spaces); 13340 13341 Spaces.Standard = FormatStyle::LS_Cpp03; 13342 Spaces.SpacesInAngles = true; 13343 verifyFormat("A< A< int > >();", Spaces); 13344 13345 Spaces.SpacesInAngles = false; 13346 verifyFormat("A<A<int> >();", Spaces); 13347 13348 Spaces.Standard = FormatStyle::LS_Cpp11; 13349 Spaces.SpacesInAngles = true; 13350 verifyFormat("A< A< int > >();", Spaces); 13351 13352 Spaces.SpacesInAngles = false; 13353 verifyFormat("A<A<int>>();", Spaces); 13354 } 13355 13356 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 13357 FormatStyle Style = getLLVMStyle(); 13358 Style.SpaceAfterTemplateKeyword = false; 13359 verifyFormat("template<int> void foo();", Style); 13360 } 13361 13362 TEST_F(FormatTest, TripleAngleBrackets) { 13363 verifyFormat("f<<<1, 1>>>();"); 13364 verifyFormat("f<<<1, 1, 1, s>>>();"); 13365 verifyFormat("f<<<a, b, c, d>>>();"); 13366 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 13367 verifyFormat("f<param><<<1, 1>>>();"); 13368 verifyFormat("f<1><<<1, 1>>>();"); 13369 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 13370 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13371 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 13372 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 13373 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 13374 } 13375 13376 TEST_F(FormatTest, MergeLessLessAtEnd) { 13377 verifyFormat("<<"); 13378 EXPECT_EQ("< < <", format("\\\n<<<")); 13379 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13380 "aaallvm::outs() <<"); 13381 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13382 "aaaallvm::outs()\n <<"); 13383 } 13384 13385 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 13386 std::string code = "#if A\n" 13387 "#if B\n" 13388 "a.\n" 13389 "#endif\n" 13390 " a = 1;\n" 13391 "#else\n" 13392 "#endif\n" 13393 "#if C\n" 13394 "#else\n" 13395 "#endif\n"; 13396 EXPECT_EQ(code, format(code)); 13397 } 13398 13399 TEST_F(FormatTest, HandleConflictMarkers) { 13400 // Git/SVN conflict markers. 13401 EXPECT_EQ("int a;\n" 13402 "void f() {\n" 13403 " callme(some(parameter1,\n" 13404 "<<<<<<< text by the vcs\n" 13405 " parameter2),\n" 13406 "||||||| text by the vcs\n" 13407 " parameter2),\n" 13408 " parameter3,\n" 13409 "======= text by the vcs\n" 13410 " parameter2, parameter3),\n" 13411 ">>>>>>> text by the vcs\n" 13412 " otherparameter);\n", 13413 format("int a;\n" 13414 "void f() {\n" 13415 " callme(some(parameter1,\n" 13416 "<<<<<<< text by the vcs\n" 13417 " parameter2),\n" 13418 "||||||| text by the vcs\n" 13419 " parameter2),\n" 13420 " parameter3,\n" 13421 "======= text by the vcs\n" 13422 " parameter2,\n" 13423 " parameter3),\n" 13424 ">>>>>>> text by the vcs\n" 13425 " otherparameter);\n")); 13426 13427 // Perforce markers. 13428 EXPECT_EQ("void f() {\n" 13429 " function(\n" 13430 ">>>> text by the vcs\n" 13431 " parameter,\n" 13432 "==== text by the vcs\n" 13433 " parameter,\n" 13434 "==== text by the vcs\n" 13435 " parameter,\n" 13436 "<<<< text by the vcs\n" 13437 " parameter);\n", 13438 format("void f() {\n" 13439 " function(\n" 13440 ">>>> text by the vcs\n" 13441 " parameter,\n" 13442 "==== text by the vcs\n" 13443 " parameter,\n" 13444 "==== text by the vcs\n" 13445 " parameter,\n" 13446 "<<<< text by the vcs\n" 13447 " parameter);\n")); 13448 13449 EXPECT_EQ("<<<<<<<\n" 13450 "|||||||\n" 13451 "=======\n" 13452 ">>>>>>>", 13453 format("<<<<<<<\n" 13454 "|||||||\n" 13455 "=======\n" 13456 ">>>>>>>")); 13457 13458 EXPECT_EQ("<<<<<<<\n" 13459 "|||||||\n" 13460 "int i;\n" 13461 "=======\n" 13462 ">>>>>>>", 13463 format("<<<<<<<\n" 13464 "|||||||\n" 13465 "int i;\n" 13466 "=======\n" 13467 ">>>>>>>")); 13468 13469 // FIXME: Handle parsing of macros around conflict markers correctly: 13470 EXPECT_EQ("#define Macro \\\n" 13471 "<<<<<<<\n" 13472 "Something \\\n" 13473 "|||||||\n" 13474 "Else \\\n" 13475 "=======\n" 13476 "Other \\\n" 13477 ">>>>>>>\n" 13478 " End int i;\n", 13479 format("#define Macro \\\n" 13480 "<<<<<<<\n" 13481 " Something \\\n" 13482 "|||||||\n" 13483 " Else \\\n" 13484 "=======\n" 13485 " Other \\\n" 13486 ">>>>>>>\n" 13487 " End\n" 13488 "int i;\n")); 13489 } 13490 13491 TEST_F(FormatTest, DisableRegions) { 13492 EXPECT_EQ("int i;\n" 13493 "// clang-format off\n" 13494 " int j;\n" 13495 "// clang-format on\n" 13496 "int k;", 13497 format(" int i;\n" 13498 " // clang-format off\n" 13499 " int j;\n" 13500 " // clang-format on\n" 13501 " int k;")); 13502 EXPECT_EQ("int i;\n" 13503 "/* clang-format off */\n" 13504 " int j;\n" 13505 "/* clang-format on */\n" 13506 "int k;", 13507 format(" int i;\n" 13508 " /* clang-format off */\n" 13509 " int j;\n" 13510 " /* clang-format on */\n" 13511 " int k;")); 13512 13513 // Don't reflow comments within disabled regions. 13514 EXPECT_EQ( 13515 "// clang-format off\n" 13516 "// long long long long long long line\n" 13517 "/* clang-format on */\n" 13518 "/* long long long\n" 13519 " * long long long\n" 13520 " * line */\n" 13521 "int i;\n" 13522 "/* clang-format off */\n" 13523 "/* long long long long long long line */\n", 13524 format("// clang-format off\n" 13525 "// long long long long long long line\n" 13526 "/* clang-format on */\n" 13527 "/* long long long long long long line */\n" 13528 "int i;\n" 13529 "/* clang-format off */\n" 13530 "/* long long long long long long line */\n", 13531 getLLVMStyleWithColumns(20))); 13532 } 13533 13534 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 13535 format("? ) ="); 13536 verifyNoCrash("#define a\\\n /**/}"); 13537 } 13538 13539 TEST_F(FormatTest, FormatsTableGenCode) { 13540 FormatStyle Style = getLLVMStyle(); 13541 Style.Language = FormatStyle::LK_TableGen; 13542 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 13543 } 13544 13545 TEST_F(FormatTest, ArrayOfTemplates) { 13546 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 13547 format("auto a = new unique_ptr<int > [ 10];")); 13548 13549 FormatStyle Spaces = getLLVMStyle(); 13550 Spaces.SpacesInSquareBrackets = true; 13551 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 13552 format("auto a = new unique_ptr<int > [10];", Spaces)); 13553 } 13554 13555 TEST_F(FormatTest, ArrayAsTemplateType) { 13556 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 13557 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 13558 13559 FormatStyle Spaces = getLLVMStyle(); 13560 Spaces.SpacesInSquareBrackets = true; 13561 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 13562 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 13563 } 13564 13565 TEST_F(FormatTest, NoSpaceAfterSuper) { 13566 verifyFormat("__super::FooBar();"); 13567 } 13568 13569 TEST(FormatStyle, GetStyleWithEmptyFileName) { 13570 llvm::vfs::InMemoryFileSystem FS; 13571 auto Style1 = getStyle("file", "", "Google", "", &FS); 13572 ASSERT_TRUE((bool)Style1); 13573 ASSERT_EQ(*Style1, getGoogleStyle()); 13574 } 13575 13576 TEST(FormatStyle, GetStyleOfFile) { 13577 llvm::vfs::InMemoryFileSystem FS; 13578 // Test 1: format file in the same directory. 13579 ASSERT_TRUE( 13580 FS.addFile("/a/.clang-format", 0, 13581 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 13582 ASSERT_TRUE( 13583 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13584 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 13585 ASSERT_TRUE((bool)Style1); 13586 ASSERT_EQ(*Style1, getLLVMStyle()); 13587 13588 // Test 2.1: fallback to default. 13589 ASSERT_TRUE( 13590 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13591 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 13592 ASSERT_TRUE((bool)Style2); 13593 ASSERT_EQ(*Style2, getMozillaStyle()); 13594 13595 // Test 2.2: no format on 'none' fallback style. 13596 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 13597 ASSERT_TRUE((bool)Style2); 13598 ASSERT_EQ(*Style2, getNoStyle()); 13599 13600 // Test 2.3: format if config is found with no based style while fallback is 13601 // 'none'. 13602 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 13603 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 13604 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 13605 ASSERT_TRUE((bool)Style2); 13606 ASSERT_EQ(*Style2, getLLVMStyle()); 13607 13608 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 13609 Style2 = getStyle("{}", "a.h", "none", "", &FS); 13610 ASSERT_TRUE((bool)Style2); 13611 ASSERT_EQ(*Style2, getLLVMStyle()); 13612 13613 // Test 3: format file in parent directory. 13614 ASSERT_TRUE( 13615 FS.addFile("/c/.clang-format", 0, 13616 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 13617 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 13618 llvm::MemoryBuffer::getMemBuffer("int i;"))); 13619 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 13620 ASSERT_TRUE((bool)Style3); 13621 ASSERT_EQ(*Style3, getGoogleStyle()); 13622 13623 // Test 4: error on invalid fallback style 13624 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 13625 ASSERT_FALSE((bool)Style4); 13626 llvm::consumeError(Style4.takeError()); 13627 13628 // Test 5: error on invalid yaml on command line 13629 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 13630 ASSERT_FALSE((bool)Style5); 13631 llvm::consumeError(Style5.takeError()); 13632 13633 // Test 6: error on invalid style 13634 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 13635 ASSERT_FALSE((bool)Style6); 13636 llvm::consumeError(Style6.takeError()); 13637 13638 // Test 7: found config file, error on parsing it 13639 ASSERT_TRUE( 13640 FS.addFile("/d/.clang-format", 0, 13641 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 13642 "InvalidKey: InvalidValue"))); 13643 ASSERT_TRUE( 13644 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13645 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 13646 ASSERT_FALSE((bool)Style7); 13647 llvm::consumeError(Style7.takeError()); 13648 13649 // Test 8: inferred per-language defaults apply. 13650 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 13651 ASSERT_TRUE((bool)StyleTd); 13652 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 13653 } 13654 13655 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 13656 // Column limit is 20. 13657 std::string Code = "Type *a =\n" 13658 " new Type();\n" 13659 "g(iiiii, 0, jjjjj,\n" 13660 " 0, kkkkk, 0, mm);\n" 13661 "int bad = format ;"; 13662 std::string Expected = "auto a = new Type();\n" 13663 "g(iiiii, nullptr,\n" 13664 " jjjjj, nullptr,\n" 13665 " kkkkk, nullptr,\n" 13666 " mm);\n" 13667 "int bad = format ;"; 13668 FileID ID = Context.createInMemoryFile("format.cpp", Code); 13669 tooling::Replacements Replaces = toReplacements( 13670 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 13671 "auto "), 13672 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 13673 "nullptr"), 13674 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 13675 "nullptr"), 13676 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 13677 "nullptr")}); 13678 13679 format::FormatStyle Style = format::getLLVMStyle(); 13680 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 13681 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 13682 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 13683 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 13684 auto Result = applyAllReplacements(Code, *FormattedReplaces); 13685 EXPECT_TRUE(static_cast<bool>(Result)); 13686 EXPECT_EQ(Expected, *Result); 13687 } 13688 13689 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 13690 std::string Code = "#include \"a.h\"\n" 13691 "#include \"c.h\"\n" 13692 "\n" 13693 "int main() {\n" 13694 " return 0;\n" 13695 "}"; 13696 std::string Expected = "#include \"a.h\"\n" 13697 "#include \"b.h\"\n" 13698 "#include \"c.h\"\n" 13699 "\n" 13700 "int main() {\n" 13701 " return 0;\n" 13702 "}"; 13703 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 13704 tooling::Replacements Replaces = toReplacements( 13705 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 13706 "#include \"b.h\"\n")}); 13707 13708 format::FormatStyle Style = format::getLLVMStyle(); 13709 Style.SortIncludes = true; 13710 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 13711 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 13712 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 13713 auto Result = applyAllReplacements(Code, *FormattedReplaces); 13714 EXPECT_TRUE(static_cast<bool>(Result)); 13715 EXPECT_EQ(Expected, *Result); 13716 } 13717 13718 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 13719 EXPECT_EQ("using std::cin;\n" 13720 "using std::cout;", 13721 format("using std::cout;\n" 13722 "using std::cin;", getGoogleStyle())); 13723 } 13724 13725 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 13726 format::FormatStyle Style = format::getLLVMStyle(); 13727 Style.Standard = FormatStyle::LS_Cpp03; 13728 // cpp03 recognize this string as identifier u8 and literal character 'a' 13729 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 13730 } 13731 13732 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 13733 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 13734 // all modes, including C++11, C++14 and C++17 13735 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 13736 } 13737 13738 TEST_F(FormatTest, DoNotFormatLikelyXml) { 13739 EXPECT_EQ("<!-- ;> -->", 13740 format("<!-- ;> -->", getGoogleStyle())); 13741 EXPECT_EQ(" <!-- >; -->", 13742 format(" <!-- >; -->", getGoogleStyle())); 13743 } 13744 13745 TEST_F(FormatTest, StructuredBindings) { 13746 // Structured bindings is a C++17 feature. 13747 // all modes, including C++11, C++14 and C++17 13748 verifyFormat("auto [a, b] = f();"); 13749 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 13750 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 13751 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 13752 EXPECT_EQ("auto const volatile [a, b] = f();", 13753 format("auto const volatile[a, b] = f();")); 13754 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 13755 EXPECT_EQ("auto &[a, b, c] = f();", 13756 format("auto &[ a , b,c ] = f();")); 13757 EXPECT_EQ("auto &&[a, b, c] = f();", 13758 format("auto &&[ a , b,c ] = f();")); 13759 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 13760 EXPECT_EQ("auto const volatile &&[a, b] = f();", 13761 format("auto const volatile &&[a, b] = f();")); 13762 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();")); 13763 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();")); 13764 EXPECT_EQ("const auto volatile &&[a, b] = f();", 13765 format("const auto volatile &&[a, b] = f();")); 13766 EXPECT_EQ("volatile const auto &&[a, b] = f();", 13767 format("volatile const auto &&[a, b] = f();")); 13768 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();")); 13769 13770 // Make sure we don't mistake structured bindings for lambdas. 13771 FormatStyle PointerMiddle = getLLVMStyle(); 13772 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 13773 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 13774 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 13775 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 13776 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 13777 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 13778 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 13779 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 13780 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 13781 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 13782 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 13783 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 13784 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 13785 13786 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 13787 format("for (const auto && [a, b] : some_range) {\n}")); 13788 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 13789 format("for (const auto & [a, b] : some_range) {\n}")); 13790 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 13791 format("for (const auto[a, b] : some_range) {\n}")); 13792 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 13793 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 13794 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 13795 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);")); 13796 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);")); 13797 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 13798 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};")); 13799 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};")); 13800 13801 format::FormatStyle Spaces = format::getLLVMStyle(); 13802 Spaces.SpacesInSquareBrackets = true; 13803 verifyFormat("auto [ a, b ] = f();", Spaces); 13804 verifyFormat("auto &&[ a, b ] = f();", Spaces); 13805 verifyFormat("auto &[ a, b ] = f();", Spaces); 13806 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 13807 verifyFormat("auto const &[ a, b ] = f();", Spaces); 13808 } 13809 13810 TEST_F(FormatTest, FileAndCode) { 13811 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 13812 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 13813 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 13814 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 13815 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n")); 13816 EXPECT_EQ( 13817 FormatStyle::LK_ObjC, 13818 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 13819 EXPECT_EQ(FormatStyle::LK_ObjC, 13820 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 13821 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 13822 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 13823 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n")); 13824 EXPECT_EQ(FormatStyle::LK_ObjC, 13825 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 13826 EXPECT_EQ( 13827 FormatStyle::LK_ObjC, 13828 guessLanguage("foo.h", 13829 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 13830 EXPECT_EQ( 13831 FormatStyle::LK_Cpp, 13832 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 13833 } 13834 13835 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 13836 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 13837 EXPECT_EQ(FormatStyle::LK_ObjC, 13838 guessLanguage("foo.h", "array[[calculator getIndex]];")); 13839 EXPECT_EQ(FormatStyle::LK_Cpp, 13840 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 13841 EXPECT_EQ( 13842 FormatStyle::LK_Cpp, 13843 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 13844 EXPECT_EQ(FormatStyle::LK_ObjC, 13845 guessLanguage("foo.h", "[[noreturn foo] bar];")); 13846 EXPECT_EQ(FormatStyle::LK_Cpp, 13847 guessLanguage("foo.h", "[[clang::fallthrough]];")); 13848 EXPECT_EQ(FormatStyle::LK_ObjC, 13849 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 13850 EXPECT_EQ(FormatStyle::LK_Cpp, 13851 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 13852 EXPECT_EQ(FormatStyle::LK_Cpp, 13853 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 13854 EXPECT_EQ(FormatStyle::LK_ObjC, 13855 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 13856 EXPECT_EQ(FormatStyle::LK_Cpp, 13857 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 13858 EXPECT_EQ( 13859 FormatStyle::LK_Cpp, 13860 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 13861 EXPECT_EQ( 13862 FormatStyle::LK_Cpp, 13863 guessLanguage("foo.h", 13864 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 13865 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 13866 } 13867 13868 TEST_F(FormatTest, GuessLanguageWithCaret) { 13869 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 13870 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 13871 EXPECT_EQ(FormatStyle::LK_ObjC, 13872 guessLanguage("foo.h", "int(^)(char, float);")); 13873 EXPECT_EQ(FormatStyle::LK_ObjC, 13874 guessLanguage("foo.h", "int(^foo)(char, float);")); 13875 EXPECT_EQ(FormatStyle::LK_ObjC, 13876 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 13877 EXPECT_EQ(FormatStyle::LK_ObjC, 13878 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 13879 EXPECT_EQ( 13880 FormatStyle::LK_ObjC, 13881 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 13882 } 13883 13884 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 13885 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13886 "void f() {\n" 13887 " asm (\"mov %[e], %[d]\"\n" 13888 " : [d] \"=rm\" (d)\n" 13889 " [e] \"rm\" (*e));\n" 13890 "}")); 13891 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13892 "void f() {\n" 13893 " _asm (\"mov %[e], %[d]\"\n" 13894 " : [d] \"=rm\" (d)\n" 13895 " [e] \"rm\" (*e));\n" 13896 "}")); 13897 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13898 "void f() {\n" 13899 " __asm (\"mov %[e], %[d]\"\n" 13900 " : [d] \"=rm\" (d)\n" 13901 " [e] \"rm\" (*e));\n" 13902 "}")); 13903 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13904 "void f() {\n" 13905 " __asm__ (\"mov %[e], %[d]\"\n" 13906 " : [d] \"=rm\" (d)\n" 13907 " [e] \"rm\" (*e));\n" 13908 "}")); 13909 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13910 "void f() {\n" 13911 " asm (\"mov %[e], %[d]\"\n" 13912 " : [d] \"=rm\" (d),\n" 13913 " [e] \"rm\" (*e));\n" 13914 "}")); 13915 EXPECT_EQ(FormatStyle::LK_Cpp, 13916 guessLanguage("foo.h", "void f() {\n" 13917 " asm volatile (\"mov %[e], %[d]\"\n" 13918 " : [d] \"=rm\" (d)\n" 13919 " [e] \"rm\" (*e));\n" 13920 "}")); 13921 } 13922 13923 TEST_F(FormatTest, GuessLanguageWithChildLines) { 13924 EXPECT_EQ(FormatStyle::LK_Cpp, 13925 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 13926 EXPECT_EQ(FormatStyle::LK_ObjC, 13927 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 13928 EXPECT_EQ( 13929 FormatStyle::LK_Cpp, 13930 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 13931 EXPECT_EQ( 13932 FormatStyle::LK_ObjC, 13933 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 13934 } 13935 13936 TEST_F(FormatTest, TypenameMacros) { 13937 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 13938 13939 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 13940 FormatStyle Google = getGoogleStyleWithColumns(0); 13941 Google.TypenameMacros = TypenameMacros; 13942 verifyFormat("struct foo {\n" 13943 " int bar;\n" 13944 " TAILQ_ENTRY(a) bleh;\n" 13945 "};", Google); 13946 13947 FormatStyle Macros = getLLVMStyle(); 13948 Macros.TypenameMacros = TypenameMacros; 13949 13950 verifyFormat("STACK_OF(int) a;", Macros); 13951 verifyFormat("STACK_OF(int) *a;", Macros); 13952 verifyFormat("STACK_OF(int const *) *a;", Macros); 13953 verifyFormat("STACK_OF(int *const) *a;", Macros); 13954 verifyFormat("STACK_OF(int, string) a;", Macros); 13955 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 13956 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 13957 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 13958 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 13959 13960 Macros.PointerAlignment = FormatStyle::PAS_Left; 13961 verifyFormat("STACK_OF(int)* a;", Macros); 13962 verifyFormat("STACK_OF(int*)* a;", Macros); 13963 } 13964 13965 } // end namespace 13966 } // end namespace format 13967 } // end namespace clang 13968