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 (a)\n" 430 " if constexpr (b)\n" 431 " if constexpr (c)\n" 432 " g();\n" 433 "h();"); 434 verifyFormat("if constexpr (a)\n" 435 " if constexpr (b) {\n" 436 " f();\n" 437 " }\n" 438 "g();"); 439 440 FormatStyle AllowsMergedIf = getLLVMStyle(); 441 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 442 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 443 FormatStyle::SIS_WithoutElse; 444 verifyFormat("if (a)\n" 445 " // comment\n" 446 " f();", 447 AllowsMergedIf); 448 verifyFormat("{\n" 449 " if (a)\n" 450 " label:\n" 451 " f();\n" 452 "}", 453 AllowsMergedIf); 454 verifyFormat("#define A \\\n" 455 " if (a) \\\n" 456 " label: \\\n" 457 " f()", 458 AllowsMergedIf); 459 verifyFormat("if (a)\n" 460 " ;", 461 AllowsMergedIf); 462 verifyFormat("if (a)\n" 463 " if (b) return;", 464 AllowsMergedIf); 465 466 verifyFormat("if (a) // Can't merge this\n" 467 " f();\n", 468 AllowsMergedIf); 469 verifyFormat("if (a) /* still don't merge */\n" 470 " f();", 471 AllowsMergedIf); 472 verifyFormat("if (a) { // Never merge this\n" 473 " f();\n" 474 "}", 475 AllowsMergedIf); 476 verifyFormat("if (a) { /* Never merge this */\n" 477 " f();\n" 478 "}", 479 AllowsMergedIf); 480 481 AllowsMergedIf.ColumnLimit = 14; 482 verifyFormat("if (a) return;", AllowsMergedIf); 483 verifyFormat("if (aaaaaaaaa)\n" 484 " return;", 485 AllowsMergedIf); 486 487 AllowsMergedIf.ColumnLimit = 13; 488 verifyFormat("if (a)\n return;", AllowsMergedIf); 489 } 490 491 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) { 492 FormatStyle AllowsMergedIf = getLLVMStyle(); 493 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 494 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 495 FormatStyle::SIS_WithoutElse; 496 verifyFormat("if (a)\n" 497 " f();\n" 498 "else {\n" 499 " g();\n" 500 "}", 501 AllowsMergedIf); 502 verifyFormat("if (a)\n" 503 " f();\n" 504 "else\n" 505 " g();\n", 506 AllowsMergedIf); 507 508 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 509 510 verifyFormat("if (a) f();\n" 511 "else {\n" 512 " g();\n" 513 "}", 514 AllowsMergedIf); 515 verifyFormat("if (a) f();\n" 516 "else {\n" 517 " if (a) f();\n" 518 " else {\n" 519 " g();\n" 520 " }\n" 521 " g();\n" 522 "}", 523 AllowsMergedIf); 524 } 525 526 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) { 527 FormatStyle AllowsMergedLoops = getLLVMStyle(); 528 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true; 529 verifyFormat("while (true) continue;", AllowsMergedLoops); 530 verifyFormat("for (;;) continue;", AllowsMergedLoops); 531 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops); 532 verifyFormat("while (true)\n" 533 " ;", 534 AllowsMergedLoops); 535 verifyFormat("for (;;)\n" 536 " ;", 537 AllowsMergedLoops); 538 verifyFormat("for (;;)\n" 539 " for (;;) continue;", 540 AllowsMergedLoops); 541 verifyFormat("for (;;) // Can't merge this\n" 542 " continue;", 543 AllowsMergedLoops); 544 verifyFormat("for (;;) /* still don't merge */\n" 545 " continue;", 546 AllowsMergedLoops); 547 } 548 549 TEST_F(FormatTest, FormatShortBracedStatements) { 550 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 551 AllowSimpleBracedStatements.ColumnLimit = 40; 552 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true; 553 554 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 555 FormatStyle::SIS_WithoutElse; 556 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 557 558 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom; 559 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true; 560 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false; 561 562 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 563 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 564 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 565 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 566 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 567 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 568 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 569 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 570 verifyFormat("if (true) {\n" 571 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 572 "}", 573 AllowSimpleBracedStatements); 574 verifyFormat("if (true) { //\n" 575 " f();\n" 576 "}", 577 AllowSimpleBracedStatements); 578 verifyFormat("if (true) {\n" 579 " f();\n" 580 " f();\n" 581 "}", 582 AllowSimpleBracedStatements); 583 verifyFormat("if (true) {\n" 584 " f();\n" 585 "} else {\n" 586 " f();\n" 587 "}", 588 AllowSimpleBracedStatements); 589 590 verifyFormat("struct A2 {\n" 591 " int X;\n" 592 "};", 593 AllowSimpleBracedStatements); 594 verifyFormat("typedef struct A2 {\n" 595 " int X;\n" 596 "} A2_t;", 597 AllowSimpleBracedStatements); 598 verifyFormat("template <int> struct A2 {\n" 599 " struct B {};\n" 600 "};", 601 AllowSimpleBracedStatements); 602 603 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 604 FormatStyle::SIS_Never; 605 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 606 verifyFormat("if (true) {\n" 607 " f();\n" 608 "}", 609 AllowSimpleBracedStatements); 610 verifyFormat("if (true) {\n" 611 " f();\n" 612 "} else {\n" 613 " f();\n" 614 "}", 615 AllowSimpleBracedStatements); 616 617 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 618 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 619 verifyFormat("while (true) {\n" 620 " f();\n" 621 "}", 622 AllowSimpleBracedStatements); 623 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 624 verifyFormat("for (;;) {\n" 625 " f();\n" 626 "}", 627 AllowSimpleBracedStatements); 628 629 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 630 FormatStyle::SIS_WithoutElse; 631 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 632 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true; 633 634 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 635 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 636 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 637 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 638 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 639 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 640 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 641 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 642 verifyFormat("if (true)\n" 643 "{\n" 644 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 645 "}", 646 AllowSimpleBracedStatements); 647 verifyFormat("if (true)\n" 648 "{ //\n" 649 " f();\n" 650 "}", 651 AllowSimpleBracedStatements); 652 verifyFormat("if (true)\n" 653 "{\n" 654 " f();\n" 655 " f();\n" 656 "}", 657 AllowSimpleBracedStatements); 658 verifyFormat("if (true)\n" 659 "{\n" 660 " f();\n" 661 "} else\n" 662 "{\n" 663 " f();\n" 664 "}", 665 AllowSimpleBracedStatements); 666 667 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 668 FormatStyle::SIS_Never; 669 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 670 verifyFormat("if (true)\n" 671 "{\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.AllowShortLoopsOnASingleLine = false; 685 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 686 verifyFormat("while (true)\n" 687 "{\n" 688 " f();\n" 689 "}", 690 AllowSimpleBracedStatements); 691 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 692 verifyFormat("for (;;)\n" 693 "{\n" 694 " f();\n" 695 "}", 696 AllowSimpleBracedStatements); 697 } 698 699 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 700 FormatStyle Style = getLLVMStyleWithColumns(60); 701 Style.AllowShortBlocksOnASingleLine = true; 702 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 703 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 704 EXPECT_EQ("#define A \\\n" 705 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 706 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 707 "X;", 708 format("#define A \\\n" 709 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 710 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 711 " }\n" 712 "X;", 713 Style)); 714 } 715 716 TEST_F(FormatTest, ParseIfElse) { 717 verifyFormat("if (true)\n" 718 " if (true)\n" 719 " if (true)\n" 720 " f();\n" 721 " else\n" 722 " g();\n" 723 " else\n" 724 " h();\n" 725 "else\n" 726 " i();"); 727 verifyFormat("if (true)\n" 728 " if (true)\n" 729 " if (true) {\n" 730 " if (true)\n" 731 " f();\n" 732 " } else {\n" 733 " g();\n" 734 " }\n" 735 " else\n" 736 " h();\n" 737 "else {\n" 738 " i();\n" 739 "}"); 740 verifyFormat("if (true)\n" 741 " if constexpr (true)\n" 742 " if (true) {\n" 743 " if constexpr (true)\n" 744 " f();\n" 745 " } else {\n" 746 " g();\n" 747 " }\n" 748 " else\n" 749 " h();\n" 750 "else {\n" 751 " i();\n" 752 "}"); 753 verifyFormat("void f() {\n" 754 " if (a) {\n" 755 " } else {\n" 756 " }\n" 757 "}"); 758 } 759 760 TEST_F(FormatTest, ElseIf) { 761 verifyFormat("if (a) {\n} else if (b) {\n}"); 762 verifyFormat("if (a)\n" 763 " f();\n" 764 "else if (b)\n" 765 " g();\n" 766 "else\n" 767 " h();"); 768 verifyFormat("if constexpr (a)\n" 769 " f();\n" 770 "else if constexpr (b)\n" 771 " g();\n" 772 "else\n" 773 " h();"); 774 verifyFormat("if (a) {\n" 775 " f();\n" 776 "}\n" 777 "// or else ..\n" 778 "else {\n" 779 " g()\n" 780 "}"); 781 782 verifyFormat("if (a) {\n" 783 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 785 "}"); 786 verifyFormat("if (a) {\n" 787 "} else if (\n" 788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 789 "}", 790 getLLVMStyleWithColumns(62)); 791 verifyFormat("if (a) {\n" 792 "} else if constexpr (\n" 793 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 794 "}", 795 getLLVMStyleWithColumns(62)); 796 } 797 798 TEST_F(FormatTest, FormatsForLoop) { 799 verifyFormat( 800 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 801 " ++VeryVeryLongLoopVariable)\n" 802 " ;"); 803 verifyFormat("for (;;)\n" 804 " f();"); 805 verifyFormat("for (;;) {\n}"); 806 verifyFormat("for (;;) {\n" 807 " f();\n" 808 "}"); 809 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 810 811 verifyFormat( 812 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 813 " E = UnwrappedLines.end();\n" 814 " I != E; ++I) {\n}"); 815 816 verifyFormat( 817 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 818 " ++IIIII) {\n}"); 819 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 820 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 821 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 822 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 823 " I = FD->getDeclsInPrototypeScope().begin(),\n" 824 " E = FD->getDeclsInPrototypeScope().end();\n" 825 " I != E; ++I) {\n}"); 826 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 827 " I = Container.begin(),\n" 828 " E = Container.end();\n" 829 " I != E; ++I) {\n}", 830 getLLVMStyleWithColumns(76)); 831 832 verifyFormat( 833 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 835 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 836 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 837 " ++aaaaaaaaaaa) {\n}"); 838 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 839 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 840 " ++i) {\n}"); 841 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 842 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 843 "}"); 844 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 845 " aaaaaaaaaa);\n" 846 " iter; ++iter) {\n" 847 "}"); 848 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 849 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 850 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 851 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 852 853 // These should not be formatted as Objective-C for-in loops. 854 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 855 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 856 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 857 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 858 859 FormatStyle NoBinPacking = getLLVMStyle(); 860 NoBinPacking.BinPackParameters = false; 861 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 862 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 863 " aaaaaaaaaaaaaaaa,\n" 864 " aaaaaaaaaaaaaaaa,\n" 865 " aaaaaaaaaaaaaaaa);\n" 866 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 867 "}", 868 NoBinPacking); 869 verifyFormat( 870 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 871 " E = UnwrappedLines.end();\n" 872 " I != E;\n" 873 " ++I) {\n}", 874 NoBinPacking); 875 876 FormatStyle AlignLeft = getLLVMStyle(); 877 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 878 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 879 } 880 881 TEST_F(FormatTest, RangeBasedForLoops) { 882 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 883 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 884 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 885 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 886 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 888 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 889 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 890 } 891 892 TEST_F(FormatTest, ForEachLoops) { 893 verifyFormat("void f() {\n" 894 " foreach (Item *item, itemlist) {}\n" 895 " Q_FOREACH (Item *item, itemlist) {}\n" 896 " BOOST_FOREACH (Item *item, itemlist) {}\n" 897 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 898 "}"); 899 900 // As function-like macros. 901 verifyFormat("#define foreach(x, y)\n" 902 "#define Q_FOREACH(x, y)\n" 903 "#define BOOST_FOREACH(x, y)\n" 904 "#define UNKNOWN_FOREACH(x, y)\n"); 905 906 // Not as function-like macros. 907 verifyFormat("#define foreach (x, y)\n" 908 "#define Q_FOREACH (x, y)\n" 909 "#define BOOST_FOREACH (x, y)\n" 910 "#define UNKNOWN_FOREACH (x, y)\n"); 911 } 912 913 TEST_F(FormatTest, FormatsWhileLoop) { 914 verifyFormat("while (true) {\n}"); 915 verifyFormat("while (true)\n" 916 " f();"); 917 verifyFormat("while () {\n}"); 918 verifyFormat("while () {\n" 919 " f();\n" 920 "}"); 921 } 922 923 TEST_F(FormatTest, FormatsDoWhile) { 924 verifyFormat("do {\n" 925 " do_something();\n" 926 "} while (something());"); 927 verifyFormat("do\n" 928 " do_something();\n" 929 "while (something());"); 930 } 931 932 TEST_F(FormatTest, FormatsSwitchStatement) { 933 verifyFormat("switch (x) {\n" 934 "case 1:\n" 935 " f();\n" 936 " break;\n" 937 "case kFoo:\n" 938 "case ns::kBar:\n" 939 "case kBaz:\n" 940 " break;\n" 941 "default:\n" 942 " g();\n" 943 " break;\n" 944 "}"); 945 verifyFormat("switch (x) {\n" 946 "case 1: {\n" 947 " f();\n" 948 " break;\n" 949 "}\n" 950 "case 2: {\n" 951 " break;\n" 952 "}\n" 953 "}"); 954 verifyFormat("switch (x) {\n" 955 "case 1: {\n" 956 " f();\n" 957 " {\n" 958 " g();\n" 959 " h();\n" 960 " }\n" 961 " break;\n" 962 "}\n" 963 "}"); 964 verifyFormat("switch (x) {\n" 965 "case 1: {\n" 966 " f();\n" 967 " if (foo) {\n" 968 " g();\n" 969 " h();\n" 970 " }\n" 971 " break;\n" 972 "}\n" 973 "}"); 974 verifyFormat("switch (x) {\n" 975 "case 1: {\n" 976 " f();\n" 977 " g();\n" 978 "} break;\n" 979 "}"); 980 verifyFormat("switch (test)\n" 981 " ;"); 982 verifyFormat("switch (x) {\n" 983 "default: {\n" 984 " // Do nothing.\n" 985 "}\n" 986 "}"); 987 verifyFormat("switch (x) {\n" 988 "// comment\n" 989 "// if 1, do f()\n" 990 "case 1:\n" 991 " f();\n" 992 "}"); 993 verifyFormat("switch (x) {\n" 994 "case 1:\n" 995 " // Do amazing stuff\n" 996 " {\n" 997 " f();\n" 998 " g();\n" 999 " }\n" 1000 " break;\n" 1001 "}"); 1002 verifyFormat("#define A \\\n" 1003 " switch (x) { \\\n" 1004 " case a: \\\n" 1005 " foo = b; \\\n" 1006 " }", 1007 getLLVMStyleWithColumns(20)); 1008 verifyFormat("#define OPERATION_CASE(name) \\\n" 1009 " case OP_name: \\\n" 1010 " return operations::Operation##name\n", 1011 getLLVMStyleWithColumns(40)); 1012 verifyFormat("switch (x) {\n" 1013 "case 1:;\n" 1014 "default:;\n" 1015 " int i;\n" 1016 "}"); 1017 1018 verifyGoogleFormat("switch (x) {\n" 1019 " case 1:\n" 1020 " f();\n" 1021 " break;\n" 1022 " case kFoo:\n" 1023 " case ns::kBar:\n" 1024 " case kBaz:\n" 1025 " break;\n" 1026 " default:\n" 1027 " g();\n" 1028 " break;\n" 1029 "}"); 1030 verifyGoogleFormat("switch (x) {\n" 1031 " case 1: {\n" 1032 " f();\n" 1033 " break;\n" 1034 " }\n" 1035 "}"); 1036 verifyGoogleFormat("switch (test)\n" 1037 " ;"); 1038 1039 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1040 " case OP_name: \\\n" 1041 " return operations::Operation##name\n"); 1042 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1043 " // Get the correction operation class.\n" 1044 " switch (OpCode) {\n" 1045 " CASE(Add);\n" 1046 " CASE(Subtract);\n" 1047 " default:\n" 1048 " return operations::Unknown;\n" 1049 " }\n" 1050 "#undef OPERATION_CASE\n" 1051 "}"); 1052 verifyFormat("DEBUG({\n" 1053 " switch (x) {\n" 1054 " case A:\n" 1055 " f();\n" 1056 " break;\n" 1057 " // fallthrough\n" 1058 " case B:\n" 1059 " g();\n" 1060 " break;\n" 1061 " }\n" 1062 "});"); 1063 EXPECT_EQ("DEBUG({\n" 1064 " switch (x) {\n" 1065 " case A:\n" 1066 " f();\n" 1067 " break;\n" 1068 " // On B:\n" 1069 " case B:\n" 1070 " g();\n" 1071 " break;\n" 1072 " }\n" 1073 "});", 1074 format("DEBUG({\n" 1075 " switch (x) {\n" 1076 " case A:\n" 1077 " f();\n" 1078 " break;\n" 1079 " // On B:\n" 1080 " case B:\n" 1081 " g();\n" 1082 " break;\n" 1083 " }\n" 1084 "});", 1085 getLLVMStyle())); 1086 EXPECT_EQ("switch (n) {\n" 1087 "case 0: {\n" 1088 " return false;\n" 1089 "}\n" 1090 "default: {\n" 1091 " return true;\n" 1092 "}\n" 1093 "}", 1094 format("switch (n)\n" 1095 "{\n" 1096 "case 0: {\n" 1097 " return false;\n" 1098 "}\n" 1099 "default: {\n" 1100 " return true;\n" 1101 "}\n" 1102 "}", 1103 getLLVMStyle())); 1104 verifyFormat("switch (a) {\n" 1105 "case (b):\n" 1106 " return;\n" 1107 "}"); 1108 1109 verifyFormat("switch (a) {\n" 1110 "case some_namespace::\n" 1111 " some_constant:\n" 1112 " return;\n" 1113 "}", 1114 getLLVMStyleWithColumns(34)); 1115 1116 FormatStyle Style = getLLVMStyle(); 1117 Style.IndentCaseLabels = true; 1118 Style.AllowShortBlocksOnASingleLine = false; 1119 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1120 Style.BraceWrapping.AfterCaseLabel = true; 1121 Style.BraceWrapping.AfterControlStatement = true; 1122 EXPECT_EQ("switch (n)\n" 1123 "{\n" 1124 " case 0:\n" 1125 " {\n" 1126 " return false;\n" 1127 " }\n" 1128 " default:\n" 1129 " {\n" 1130 " return true;\n" 1131 " }\n" 1132 "}", 1133 format("switch (n) {\n" 1134 " case 0: {\n" 1135 " return false;\n" 1136 " }\n" 1137 " default: {\n" 1138 " return true;\n" 1139 " }\n" 1140 "}", 1141 Style)); 1142 Style.BraceWrapping.AfterCaseLabel = false; 1143 EXPECT_EQ("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 format("switch (n) {\n" 1153 " case 0:\n" 1154 " {\n" 1155 " return false;\n" 1156 " }\n" 1157 " default:\n" 1158 " {\n" 1159 " return true;\n" 1160 " }\n" 1161 "}", 1162 Style)); 1163 } 1164 1165 TEST_F(FormatTest, CaseRanges) { 1166 verifyFormat("switch (x) {\n" 1167 "case 'A' ... 'Z':\n" 1168 "case 1 ... 5:\n" 1169 "case a ... b:\n" 1170 " break;\n" 1171 "}"); 1172 } 1173 1174 TEST_F(FormatTest, ShortCaseLabels) { 1175 FormatStyle Style = getLLVMStyle(); 1176 Style.AllowShortCaseLabelsOnASingleLine = true; 1177 verifyFormat("switch (a) {\n" 1178 "case 1: x = 1; break;\n" 1179 "case 2: return;\n" 1180 "case 3:\n" 1181 "case 4:\n" 1182 "case 5: return;\n" 1183 "case 6: // comment\n" 1184 " return;\n" 1185 "case 7:\n" 1186 " // comment\n" 1187 " return;\n" 1188 "case 8:\n" 1189 " x = 8; // comment\n" 1190 " break;\n" 1191 "default: y = 1; break;\n" 1192 "}", 1193 Style); 1194 verifyFormat("switch (a) {\n" 1195 "case 0: return; // comment\n" 1196 "case 1: break; // comment\n" 1197 "case 2: return;\n" 1198 "// comment\n" 1199 "case 3: return;\n" 1200 "// comment 1\n" 1201 "// comment 2\n" 1202 "// comment 3\n" 1203 "case 4: break; /* comment */\n" 1204 "case 5:\n" 1205 " // comment\n" 1206 " break;\n" 1207 "case 6: /* comment */ x = 1; break;\n" 1208 "case 7: x = /* comment */ 1; break;\n" 1209 "case 8:\n" 1210 " x = 1; /* comment */\n" 1211 " break;\n" 1212 "case 9:\n" 1213 " break; // comment line 1\n" 1214 " // comment line 2\n" 1215 "}", 1216 Style); 1217 EXPECT_EQ("switch (a) {\n" 1218 "case 1:\n" 1219 " x = 8;\n" 1220 " // fall through\n" 1221 "case 2: x = 8;\n" 1222 "// comment\n" 1223 "case 3:\n" 1224 " return; /* comment line 1\n" 1225 " * comment line 2 */\n" 1226 "case 4: i = 8;\n" 1227 "// something else\n" 1228 "#if FOO\n" 1229 "case 5: break;\n" 1230 "#endif\n" 1231 "}", 1232 format("switch (a) {\n" 1233 "case 1: x = 8;\n" 1234 " // fall through\n" 1235 "case 2:\n" 1236 " x = 8;\n" 1237 "// comment\n" 1238 "case 3:\n" 1239 " return; /* comment line 1\n" 1240 " * comment line 2 */\n" 1241 "case 4:\n" 1242 " i = 8;\n" 1243 "// something else\n" 1244 "#if FOO\n" 1245 "case 5: break;\n" 1246 "#endif\n" 1247 "}", 1248 Style)); 1249 EXPECT_EQ("switch (a) {\n" "case 0:\n" 1250 " return; // long long long long long long long long long long long long comment\n" 1251 " // line\n" "}", 1252 format("switch (a) {\n" 1253 "case 0: return; // long long long long long long long long long long long long comment line\n" 1254 "}", 1255 Style)); 1256 EXPECT_EQ("switch (a) {\n" 1257 "case 0:\n" 1258 " return; /* long long long long long long long long long long long long comment\n" 1259 " line */\n" 1260 "}", 1261 format("switch (a) {\n" 1262 "case 0: return; /* long long long long long long long long long long long long comment line */\n" 1263 "}", 1264 Style)); 1265 verifyFormat("switch (a) {\n" 1266 "#if FOO\n" 1267 "case 0: return 0;\n" 1268 "#endif\n" 1269 "}", 1270 Style); 1271 verifyFormat("switch (a) {\n" 1272 "case 1: {\n" 1273 "}\n" 1274 "case 2: {\n" 1275 " return;\n" 1276 "}\n" 1277 "case 3: {\n" 1278 " x = 1;\n" 1279 " return;\n" 1280 "}\n" 1281 "case 4:\n" 1282 " if (x)\n" 1283 " return;\n" 1284 "}", 1285 Style); 1286 Style.ColumnLimit = 21; 1287 verifyFormat("switch (a) {\n" 1288 "case 1: x = 1; break;\n" 1289 "case 2: return;\n" 1290 "case 3:\n" 1291 "case 4:\n" 1292 "case 5: return;\n" 1293 "default:\n" 1294 " y = 1;\n" 1295 " break;\n" 1296 "}", 1297 Style); 1298 Style.ColumnLimit = 80; 1299 Style.AllowShortCaseLabelsOnASingleLine = false; 1300 Style.IndentCaseLabels = true; 1301 EXPECT_EQ("switch (n) {\n" 1302 " default /*comments*/:\n" 1303 " return true;\n" 1304 " case 0:\n" 1305 " return false;\n" 1306 "}", 1307 format("switch (n) {\n" 1308 "default/*comments*/:\n" 1309 " return true;\n" 1310 "case 0:\n" 1311 " return false;\n" 1312 "}", 1313 Style)); 1314 Style.AllowShortCaseLabelsOnASingleLine = true; 1315 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1316 Style.BraceWrapping.AfterCaseLabel = true; 1317 Style.BraceWrapping.AfterControlStatement = true; 1318 EXPECT_EQ("switch (n)\n" 1319 "{\n" 1320 " case 0:\n" 1321 " {\n" 1322 " return false;\n" 1323 " }\n" 1324 " default:\n" 1325 " {\n" 1326 " return true;\n" 1327 " }\n" 1328 "}", 1329 format("switch (n) {\n" 1330 " case 0: {\n" 1331 " return false;\n" 1332 " }\n" 1333 " default:\n" 1334 " {\n" 1335 " return true;\n" 1336 " }\n" 1337 "}", 1338 Style)); 1339 } 1340 1341 TEST_F(FormatTest, FormatsLabels) { 1342 verifyFormat("void f() {\n" 1343 " some_code();\n" 1344 "test_label:\n" 1345 " some_other_code();\n" 1346 " {\n" 1347 " some_more_code();\n" 1348 " another_label:\n" 1349 " some_more_code();\n" 1350 " }\n" 1351 "}"); 1352 verifyFormat("{\n" 1353 " some_code();\n" 1354 "test_label:\n" 1355 " some_other_code();\n" 1356 "}"); 1357 verifyFormat("{\n" 1358 " some_code();\n" 1359 "test_label:;\n" 1360 " int i = 0;\n" 1361 "}"); 1362 } 1363 1364 //===----------------------------------------------------------------------===// 1365 // Tests for classes, namespaces, etc. 1366 //===----------------------------------------------------------------------===// 1367 1368 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1369 verifyFormat("class A {};"); 1370 } 1371 1372 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1373 verifyFormat("class A {\n" 1374 "public:\n" 1375 "public: // comment\n" 1376 "protected:\n" 1377 "private:\n" 1378 " void f() {}\n" 1379 "};"); 1380 verifyFormat("export class A {\n" 1381 "public:\n" 1382 "public: // comment\n" 1383 "protected:\n" 1384 "private:\n" 1385 " void f() {}\n" 1386 "};"); 1387 verifyGoogleFormat("class A {\n" 1388 " public:\n" 1389 " protected:\n" 1390 " private:\n" 1391 " void f() {}\n" 1392 "};"); 1393 verifyGoogleFormat("export class A {\n" 1394 " public:\n" 1395 " protected:\n" 1396 " private:\n" 1397 " void f() {}\n" 1398 "};"); 1399 verifyFormat("class A {\n" 1400 "public slots:\n" 1401 " void f1() {}\n" 1402 "public Q_SLOTS:\n" 1403 " void f2() {}\n" 1404 "protected slots:\n" 1405 " void f3() {}\n" 1406 "protected Q_SLOTS:\n" 1407 " void f4() {}\n" 1408 "private slots:\n" 1409 " void f5() {}\n" 1410 "private Q_SLOTS:\n" 1411 " void f6() {}\n" 1412 "signals:\n" 1413 " void g1();\n" 1414 "Q_SIGNALS:\n" 1415 " void g2();\n" 1416 "};"); 1417 1418 // Don't interpret 'signals' the wrong way. 1419 verifyFormat("signals.set();"); 1420 verifyFormat("for (Signals signals : f()) {\n}"); 1421 verifyFormat("{\n" 1422 " signals.set(); // This needs indentation.\n" 1423 "}"); 1424 verifyFormat("void f() {\n" 1425 "label:\n" 1426 " signals.baz();\n" 1427 "}"); 1428 } 1429 1430 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1431 EXPECT_EQ("class A {\n" 1432 "public:\n" 1433 " void f();\n" 1434 "\n" 1435 "private:\n" 1436 " void g() {}\n" 1437 " // test\n" 1438 "protected:\n" 1439 " int h;\n" 1440 "};", 1441 format("class A {\n" 1442 "public:\n" 1443 "void f();\n" 1444 "private:\n" 1445 "void g() {}\n" 1446 "// test\n" 1447 "protected:\n" 1448 "int h;\n" 1449 "};")); 1450 EXPECT_EQ("class A {\n" 1451 "protected:\n" 1452 "public:\n" 1453 " void f();\n" 1454 "};", 1455 format("class A {\n" 1456 "protected:\n" 1457 "\n" 1458 "public:\n" 1459 "\n" 1460 " void f();\n" 1461 "};")); 1462 1463 // Even ensure proper spacing inside macros. 1464 EXPECT_EQ("#define B \\\n" 1465 " class A { \\\n" 1466 " protected: \\\n" 1467 " public: \\\n" 1468 " void f(); \\\n" 1469 " };", 1470 format("#define B \\\n" 1471 " class A { \\\n" 1472 " protected: \\\n" 1473 " \\\n" 1474 " public: \\\n" 1475 " \\\n" 1476 " void f(); \\\n" 1477 " };", 1478 getGoogleStyle())); 1479 // But don't remove empty lines after macros ending in access specifiers. 1480 EXPECT_EQ("#define A private:\n" 1481 "\n" 1482 "int i;", 1483 format("#define A private:\n" 1484 "\n" 1485 "int i;")); 1486 } 1487 1488 TEST_F(FormatTest, FormatsClasses) { 1489 verifyFormat("class A : public B {};"); 1490 verifyFormat("class A : public ::B {};"); 1491 1492 verifyFormat( 1493 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1494 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1495 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1496 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1497 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1498 verifyFormat( 1499 "class A : public B, public C, public D, public E, public F {};"); 1500 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1501 " public C,\n" 1502 " public D,\n" 1503 " public E,\n" 1504 " public F,\n" 1505 " public G {};"); 1506 1507 verifyFormat("class\n" 1508 " ReallyReallyLongClassName {\n" 1509 " int i;\n" 1510 "};", 1511 getLLVMStyleWithColumns(32)); 1512 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1513 " aaaaaaaaaaaaaaaa> {};"); 1514 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1515 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1516 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1517 verifyFormat("template <class R, class C>\n" 1518 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1519 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1520 verifyFormat("class ::A::B {};"); 1521 } 1522 1523 TEST_F(FormatTest, BreakInheritanceStyle) { 1524 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1525 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1526 FormatStyle::BILS_BeforeComma; 1527 verifyFormat("class MyClass : public X {};", 1528 StyleWithInheritanceBreakBeforeComma); 1529 verifyFormat("class MyClass\n" 1530 " : public X\n" 1531 " , public Y {};", 1532 StyleWithInheritanceBreakBeforeComma); 1533 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1534 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1535 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1536 StyleWithInheritanceBreakBeforeComma); 1537 verifyFormat("struct aaaaaaaaaaaaa\n" 1538 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1539 " aaaaaaaaaaaaaaaa> {};", 1540 StyleWithInheritanceBreakBeforeComma); 1541 1542 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1543 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1544 FormatStyle::BILS_AfterColon; 1545 verifyFormat("class MyClass : public X {};", 1546 StyleWithInheritanceBreakAfterColon); 1547 verifyFormat("class MyClass : public X, public Y {};", 1548 StyleWithInheritanceBreakAfterColon); 1549 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1550 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1551 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1552 StyleWithInheritanceBreakAfterColon); 1553 verifyFormat("struct aaaaaaaaaaaaa :\n" 1554 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1555 " aaaaaaaaaaaaaaaa> {};", 1556 StyleWithInheritanceBreakAfterColon); 1557 } 1558 1559 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1560 verifyFormat("class A {\n} a, b;"); 1561 verifyFormat("struct A {\n} a, b;"); 1562 verifyFormat("union A {\n} a;"); 1563 } 1564 1565 TEST_F(FormatTest, FormatsEnum) { 1566 verifyFormat("enum {\n" 1567 " Zero,\n" 1568 " One = 1,\n" 1569 " Two = One + 1,\n" 1570 " Three = (One + Two),\n" 1571 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1572 " Five = (One, Two, Three, Four, 5)\n" 1573 "};"); 1574 verifyGoogleFormat("enum {\n" 1575 " Zero,\n" 1576 " One = 1,\n" 1577 " Two = One + 1,\n" 1578 " Three = (One + Two),\n" 1579 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1580 " Five = (One, Two, Three, Four, 5)\n" 1581 "};"); 1582 verifyFormat("enum Enum {};"); 1583 verifyFormat("enum {};"); 1584 verifyFormat("enum X E {} d;"); 1585 verifyFormat("enum __attribute__((...)) E {} d;"); 1586 verifyFormat("enum __declspec__((...)) E {} d;"); 1587 verifyFormat("enum {\n" 1588 " Bar = Foo<int, int>::value\n" 1589 "};", 1590 getLLVMStyleWithColumns(30)); 1591 1592 verifyFormat("enum ShortEnum { A, B, C };"); 1593 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1594 1595 EXPECT_EQ("enum KeepEmptyLines {\n" 1596 " ONE,\n" 1597 "\n" 1598 " TWO,\n" 1599 "\n" 1600 " THREE\n" 1601 "}", 1602 format("enum KeepEmptyLines {\n" 1603 " ONE,\n" 1604 "\n" 1605 " TWO,\n" 1606 "\n" 1607 "\n" 1608 " THREE\n" 1609 "}")); 1610 verifyFormat("enum E { // comment\n" 1611 " ONE,\n" 1612 " TWO\n" 1613 "};\n" 1614 "int i;"); 1615 // Not enums. 1616 verifyFormat("enum X f() {\n" 1617 " a();\n" 1618 " return 42;\n" 1619 "}"); 1620 verifyFormat("enum X Type::f() {\n" 1621 " a();\n" 1622 " return 42;\n" 1623 "}"); 1624 verifyFormat("enum ::X f() {\n" 1625 " a();\n" 1626 " return 42;\n" 1627 "}"); 1628 verifyFormat("enum ns::X f() {\n" 1629 " a();\n" 1630 " return 42;\n" 1631 "}"); 1632 } 1633 1634 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1635 verifyFormat("enum Type {\n" 1636 " One = 0; // These semicolons should be commas.\n" 1637 " Two = 1;\n" 1638 "};"); 1639 verifyFormat("namespace n {\n" 1640 "enum Type {\n" 1641 " One,\n" 1642 " Two, // missing };\n" 1643 " int i;\n" 1644 "}\n" 1645 "void g() {}"); 1646 } 1647 1648 TEST_F(FormatTest, FormatsEnumStruct) { 1649 verifyFormat("enum struct {\n" 1650 " Zero,\n" 1651 " One = 1,\n" 1652 " Two = One + 1,\n" 1653 " Three = (One + Two),\n" 1654 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1655 " Five = (One, Two, Three, Four, 5)\n" 1656 "};"); 1657 verifyFormat("enum struct Enum {};"); 1658 verifyFormat("enum struct {};"); 1659 verifyFormat("enum struct X E {} d;"); 1660 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1661 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1662 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1663 } 1664 1665 TEST_F(FormatTest, FormatsEnumClass) { 1666 verifyFormat("enum class {\n" 1667 " Zero,\n" 1668 " One = 1,\n" 1669 " Two = One + 1,\n" 1670 " Three = (One + Two),\n" 1671 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1672 " Five = (One, Two, Three, Four, 5)\n" 1673 "};"); 1674 verifyFormat("enum class Enum {};"); 1675 verifyFormat("enum class {};"); 1676 verifyFormat("enum class X E {} d;"); 1677 verifyFormat("enum class __attribute__((...)) E {} d;"); 1678 verifyFormat("enum class __declspec__((...)) E {} d;"); 1679 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1680 } 1681 1682 TEST_F(FormatTest, FormatsEnumTypes) { 1683 verifyFormat("enum X : int {\n" 1684 " A, // Force multiple lines.\n" 1685 " B\n" 1686 "};"); 1687 verifyFormat("enum X : int { A, B };"); 1688 verifyFormat("enum X : std::uint32_t { A, B };"); 1689 } 1690 1691 TEST_F(FormatTest, FormatsTypedefEnum) { 1692 FormatStyle Style = getLLVMStyle(); 1693 Style.ColumnLimit = 40; 1694 verifyFormat("typedef enum {} EmptyEnum;"); 1695 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1696 verifyFormat("typedef enum {\n" 1697 " ZERO = 0,\n" 1698 " ONE = 1,\n" 1699 " TWO = 2,\n" 1700 " THREE = 3\n" 1701 "} LongEnum;", 1702 Style); 1703 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1704 Style.BraceWrapping.AfterEnum = true; 1705 verifyFormat("typedef enum {} EmptyEnum;"); 1706 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1707 verifyFormat("typedef enum\n" 1708 "{\n" 1709 " ZERO = 0,\n" 1710 " ONE = 1,\n" 1711 " TWO = 2,\n" 1712 " THREE = 3\n" 1713 "} LongEnum;", 1714 Style); 1715 } 1716 1717 TEST_F(FormatTest, FormatsNSEnums) { 1718 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1719 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 1720 " // Information about someDecentlyLongValue.\n" 1721 " someDecentlyLongValue,\n" 1722 " // Information about anotherDecentlyLongValue.\n" 1723 " anotherDecentlyLongValue,\n" 1724 " // Information about aThirdDecentlyLongValue.\n" 1725 " aThirdDecentlyLongValue\n" 1726 "};"); 1727 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 1728 " a = 1,\n" 1729 " b = 2,\n" 1730 " c = 3,\n" 1731 "};"); 1732 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 1733 " a = 1,\n" 1734 " b = 2,\n" 1735 " c = 3,\n" 1736 "};"); 1737 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 1738 " a = 1,\n" 1739 " b = 2,\n" 1740 " c = 3,\n" 1741 "};"); 1742 } 1743 1744 TEST_F(FormatTest, FormatsBitfields) { 1745 verifyFormat("struct Bitfields {\n" 1746 " unsigned sClass : 8;\n" 1747 " unsigned ValueKind : 2;\n" 1748 "};"); 1749 verifyFormat("struct A {\n" 1750 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 1751 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 1752 "};"); 1753 verifyFormat("struct MyStruct {\n" 1754 " uchar data;\n" 1755 " uchar : 8;\n" 1756 " uchar : 8;\n" 1757 " uchar other;\n" 1758 "};"); 1759 } 1760 1761 TEST_F(FormatTest, FormatsNamespaces) { 1762 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 1763 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 1764 1765 verifyFormat("namespace some_namespace {\n" 1766 "class A {};\n" 1767 "void f() { f(); }\n" 1768 "}", 1769 LLVMWithNoNamespaceFix); 1770 verifyFormat("/* something */ namespace some_namespace {\n" 1771 "class A {};\n" 1772 "void f() { f(); }\n" 1773 "}", 1774 LLVMWithNoNamespaceFix); 1775 verifyFormat("namespace {\n" 1776 "class A {};\n" 1777 "void f() { f(); }\n" 1778 "}", 1779 LLVMWithNoNamespaceFix); 1780 verifyFormat("/* something */ namespace {\n" 1781 "class A {};\n" 1782 "void f() { f(); }\n" 1783 "}", 1784 LLVMWithNoNamespaceFix); 1785 verifyFormat("inline namespace X {\n" 1786 "class A {};\n" 1787 "void f() { f(); }\n" 1788 "}", 1789 LLVMWithNoNamespaceFix); 1790 verifyFormat("/* something */ inline namespace X {\n" 1791 "class A {};\n" 1792 "void f() { f(); }\n" 1793 "}", 1794 LLVMWithNoNamespaceFix); 1795 verifyFormat("export namespace X {\n" 1796 "class A {};\n" 1797 "void f() { f(); }\n" 1798 "}", 1799 LLVMWithNoNamespaceFix); 1800 verifyFormat("using namespace some_namespace;\n" 1801 "class A {};\n" 1802 "void f() { f(); }", 1803 LLVMWithNoNamespaceFix); 1804 1805 // This code is more common than we thought; if we 1806 // layout this correctly the semicolon will go into 1807 // its own line, which is undesirable. 1808 verifyFormat("namespace {};", 1809 LLVMWithNoNamespaceFix); 1810 verifyFormat("namespace {\n" 1811 "class A {};\n" 1812 "};", 1813 LLVMWithNoNamespaceFix); 1814 1815 verifyFormat("namespace {\n" 1816 "int SomeVariable = 0; // comment\n" 1817 "} // namespace", 1818 LLVMWithNoNamespaceFix); 1819 EXPECT_EQ("#ifndef HEADER_GUARD\n" 1820 "#define HEADER_GUARD\n" 1821 "namespace my_namespace {\n" 1822 "int i;\n" 1823 "} // my_namespace\n" 1824 "#endif // HEADER_GUARD", 1825 format("#ifndef HEADER_GUARD\n" 1826 " #define HEADER_GUARD\n" 1827 " namespace my_namespace {\n" 1828 "int i;\n" 1829 "} // my_namespace\n" 1830 "#endif // HEADER_GUARD", 1831 LLVMWithNoNamespaceFix)); 1832 1833 EXPECT_EQ("namespace A::B {\n" 1834 "class C {};\n" 1835 "}", 1836 format("namespace A::B {\n" 1837 "class C {};\n" 1838 "}", 1839 LLVMWithNoNamespaceFix)); 1840 1841 FormatStyle Style = getLLVMStyle(); 1842 Style.NamespaceIndentation = FormatStyle::NI_All; 1843 EXPECT_EQ("namespace out {\n" 1844 " int i;\n" 1845 " namespace in {\n" 1846 " int i;\n" 1847 " } // namespace in\n" 1848 "} // namespace out", 1849 format("namespace out {\n" 1850 "int i;\n" 1851 "namespace in {\n" 1852 "int i;\n" 1853 "} // namespace in\n" 1854 "} // namespace out", 1855 Style)); 1856 1857 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1858 EXPECT_EQ("namespace out {\n" 1859 "int i;\n" 1860 "namespace in {\n" 1861 " int i;\n" 1862 "} // namespace in\n" 1863 "} // namespace out", 1864 format("namespace out {\n" 1865 "int i;\n" 1866 "namespace in {\n" 1867 "int i;\n" 1868 "} // namespace in\n" 1869 "} // namespace out", 1870 Style)); 1871 } 1872 1873 TEST_F(FormatTest, NamespaceMacros) { 1874 FormatStyle Style = getLLVMStyle(); 1875 Style.NamespaceMacros.push_back("TESTSUITE"); 1876 1877 verifyFormat("TESTSUITE(A) {\n" 1878 "int foo();\n" 1879 "} // TESTSUITE(A)", 1880 Style); 1881 1882 verifyFormat("TESTSUITE(A, B) {\n" 1883 "int foo();\n" 1884 "} // TESTSUITE(A)", 1885 Style); 1886 1887 // Properly indent according to NamespaceIndentation style 1888 Style.NamespaceIndentation = FormatStyle::NI_All; 1889 verifyFormat("TESTSUITE(A) {\n" 1890 " int foo();\n" 1891 "} // TESTSUITE(A)", 1892 Style); 1893 verifyFormat("TESTSUITE(A) {\n" 1894 " namespace B {\n" 1895 " int foo();\n" 1896 " } // namespace B\n" 1897 "} // TESTSUITE(A)", 1898 Style); 1899 verifyFormat("namespace A {\n" 1900 " TESTSUITE(B) {\n" 1901 " int foo();\n" 1902 " } // TESTSUITE(B)\n" 1903 "} // namespace A", 1904 Style); 1905 1906 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1907 verifyFormat("TESTSUITE(A) {\n" 1908 "TESTSUITE(B) {\n" 1909 " int foo();\n" 1910 "} // TESTSUITE(B)\n" 1911 "} // TESTSUITE(A)", 1912 Style); 1913 verifyFormat("TESTSUITE(A) {\n" 1914 "namespace B {\n" 1915 " int foo();\n" 1916 "} // namespace B\n" 1917 "} // TESTSUITE(A)", 1918 Style); 1919 verifyFormat("namespace A {\n" 1920 "TESTSUITE(B) {\n" 1921 " int foo();\n" 1922 "} // TESTSUITE(B)\n" 1923 "} // namespace A", 1924 Style); 1925 1926 // Properly merge namespace-macros blocks in CompactNamespaces mode 1927 Style.NamespaceIndentation = FormatStyle::NI_None; 1928 Style.CompactNamespaces = true; 1929 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 1930 "}} // TESTSUITE(A::B)", 1931 Style); 1932 1933 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 1934 "}} // TESTSUITE(out::in)", 1935 format("TESTSUITE(out) {\n" 1936 "TESTSUITE(in) {\n" 1937 "} // TESTSUITE(in)\n" 1938 "} // TESTSUITE(out)", 1939 Style)); 1940 1941 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 1942 "}} // TESTSUITE(out::in)", 1943 format("TESTSUITE(out) {\n" 1944 "TESTSUITE(in) {\n" 1945 "} // TESTSUITE(in)\n" 1946 "} // TESTSUITE(out)", 1947 Style)); 1948 1949 // Do not merge different namespaces/macros 1950 EXPECT_EQ("namespace out {\n" 1951 "TESTSUITE(in) {\n" 1952 "} // TESTSUITE(in)\n" 1953 "} // namespace out", 1954 format("namespace out {\n" 1955 "TESTSUITE(in) {\n" 1956 "} // TESTSUITE(in)\n" 1957 "} // namespace out", 1958 Style)); 1959 EXPECT_EQ("TESTSUITE(out) {\n" 1960 "namespace in {\n" 1961 "} // namespace in\n" 1962 "} // TESTSUITE(out)", 1963 format("TESTSUITE(out) {\n" 1964 "namespace in {\n" 1965 "} // namespace in\n" 1966 "} // TESTSUITE(out)", 1967 Style)); 1968 Style.NamespaceMacros.push_back("FOOBAR"); 1969 EXPECT_EQ("TESTSUITE(out) {\n" 1970 "FOOBAR(in) {\n" 1971 "} // FOOBAR(in)\n" 1972 "} // TESTSUITE(out)", 1973 format("TESTSUITE(out) {\n" 1974 "FOOBAR(in) {\n" 1975 "} // FOOBAR(in)\n" 1976 "} // TESTSUITE(out)", 1977 Style)); 1978 } 1979 1980 TEST_F(FormatTest, FormatsCompactNamespaces) { 1981 FormatStyle Style = getLLVMStyle(); 1982 Style.CompactNamespaces = true; 1983 Style.NamespaceMacros.push_back("TESTSUITE"); 1984 1985 verifyFormat("namespace A { namespace B {\n" 1986 "}} // namespace A::B", 1987 Style); 1988 1989 EXPECT_EQ("namespace out { namespace in {\n" 1990 "}} // namespace out::in", 1991 format("namespace out {\n" 1992 "namespace in {\n" 1993 "} // namespace in\n" 1994 "} // namespace out", 1995 Style)); 1996 1997 // Only namespaces which have both consecutive opening and end get compacted 1998 EXPECT_EQ("namespace out {\n" 1999 "namespace in1 {\n" 2000 "} // namespace in1\n" 2001 "namespace in2 {\n" 2002 "} // namespace in2\n" 2003 "} // namespace out", 2004 format("namespace out {\n" 2005 "namespace in1 {\n" 2006 "} // namespace in1\n" 2007 "namespace in2 {\n" 2008 "} // namespace in2\n" 2009 "} // namespace out", 2010 Style)); 2011 2012 EXPECT_EQ("namespace out {\n" 2013 "int i;\n" 2014 "namespace in {\n" 2015 "int j;\n" 2016 "} // namespace in\n" 2017 "int k;\n" 2018 "} // namespace out", 2019 format("namespace out { int i;\n" 2020 "namespace in { int j; } // namespace in\n" 2021 "int k; } // namespace out", 2022 Style)); 2023 2024 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2025 "}}} // namespace A::B::C\n", 2026 format("namespace A { namespace B {\n" 2027 "namespace C {\n" 2028 "}} // namespace B::C\n" 2029 "} // namespace A\n", 2030 Style)); 2031 2032 Style.ColumnLimit = 40; 2033 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2034 "namespace bbbbbbbbbb {\n" 2035 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2036 format("namespace aaaaaaaaaa {\n" 2037 "namespace bbbbbbbbbb {\n" 2038 "} // namespace bbbbbbbbbb\n" 2039 "} // namespace aaaaaaaaaa", 2040 Style)); 2041 2042 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2043 "namespace cccccc {\n" 2044 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2045 format("namespace aaaaaa {\n" 2046 "namespace bbbbbb {\n" 2047 "namespace cccccc {\n" 2048 "} // namespace cccccc\n" 2049 "} // namespace bbbbbb\n" 2050 "} // namespace aaaaaa", 2051 Style)); 2052 Style.ColumnLimit = 80; 2053 2054 // Extra semicolon after 'inner' closing brace prevents merging 2055 EXPECT_EQ("namespace out { namespace in {\n" 2056 "}; } // namespace out::in", 2057 format("namespace out {\n" 2058 "namespace in {\n" 2059 "}; // namespace in\n" 2060 "} // namespace out", 2061 Style)); 2062 2063 // Extra semicolon after 'outer' closing brace is conserved 2064 EXPECT_EQ("namespace out { namespace in {\n" 2065 "}}; // namespace out::in", 2066 format("namespace out {\n" 2067 "namespace in {\n" 2068 "} // namespace in\n" 2069 "}; // namespace out", 2070 Style)); 2071 2072 Style.NamespaceIndentation = FormatStyle::NI_All; 2073 EXPECT_EQ("namespace out { namespace in {\n" 2074 " int i;\n" 2075 "}} // namespace out::in", 2076 format("namespace out {\n" 2077 "namespace in {\n" 2078 "int i;\n" 2079 "} // namespace in\n" 2080 "} // namespace out", 2081 Style)); 2082 EXPECT_EQ("namespace out { namespace mid {\n" 2083 " namespace in {\n" 2084 " int j;\n" 2085 " } // namespace in\n" 2086 " int k;\n" 2087 "}} // namespace out::mid", 2088 format("namespace out { namespace mid {\n" 2089 "namespace in { int j; } // namespace in\n" 2090 "int k; }} // namespace out::mid", 2091 Style)); 2092 2093 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2094 EXPECT_EQ("namespace out { namespace in {\n" 2095 " int i;\n" 2096 "}} // namespace out::in", 2097 format("namespace out {\n" 2098 "namespace in {\n" 2099 "int i;\n" 2100 "} // namespace in\n" 2101 "} // namespace out", 2102 Style)); 2103 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2104 " int i;\n" 2105 "}}} // namespace out::mid::in", 2106 format("namespace out {\n" 2107 "namespace mid {\n" 2108 "namespace in {\n" 2109 "int i;\n" 2110 "} // namespace in\n" 2111 "} // namespace mid\n" 2112 "} // namespace out", 2113 Style)); 2114 } 2115 2116 TEST_F(FormatTest, FormatsExternC) { 2117 verifyFormat("extern \"C\" {\nint a;"); 2118 verifyFormat("extern \"C\" {}"); 2119 verifyFormat("extern \"C\" {\n" 2120 "int foo();\n" 2121 "}"); 2122 verifyFormat("extern \"C\" int foo() {}"); 2123 verifyFormat("extern \"C\" int foo();"); 2124 verifyFormat("extern \"C\" int foo() {\n" 2125 " int i = 42;\n" 2126 " return i;\n" 2127 "}"); 2128 2129 FormatStyle Style = getLLVMStyle(); 2130 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2131 Style.BraceWrapping.AfterFunction = true; 2132 verifyFormat("extern \"C\" int foo() {}", Style); 2133 verifyFormat("extern \"C\" int foo();", Style); 2134 verifyFormat("extern \"C\" int foo()\n" 2135 "{\n" 2136 " int i = 42;\n" 2137 " return i;\n" 2138 "}", 2139 Style); 2140 2141 Style.BraceWrapping.AfterExternBlock = true; 2142 Style.BraceWrapping.SplitEmptyRecord = false; 2143 verifyFormat("extern \"C\"\n" 2144 "{}", 2145 Style); 2146 verifyFormat("extern \"C\"\n" 2147 "{\n" 2148 " int foo();\n" 2149 "}", 2150 Style); 2151 } 2152 2153 TEST_F(FormatTest, FormatsInlineASM) { 2154 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2155 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2156 verifyFormat( 2157 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2158 " \"cpuid\\n\\t\"\n" 2159 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2160 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2161 " : \"a\"(value));"); 2162 EXPECT_EQ( 2163 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2164 " __asm {\n" 2165 " mov edx,[that] // vtable in edx\n" 2166 " mov eax,methodIndex\n" 2167 " call [edx][eax*4] // stdcall\n" 2168 " }\n" 2169 "}", 2170 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2171 " __asm {\n" 2172 " mov edx,[that] // vtable in edx\n" 2173 " mov eax,methodIndex\n" 2174 " call [edx][eax*4] // stdcall\n" 2175 " }\n" 2176 "}")); 2177 EXPECT_EQ("_asm {\n" 2178 " xor eax, eax;\n" 2179 " cpuid;\n" 2180 "}", 2181 format("_asm {\n" 2182 " xor eax, eax;\n" 2183 " cpuid;\n" 2184 "}")); 2185 verifyFormat("void function() {\n" 2186 " // comment\n" 2187 " asm(\"\");\n" 2188 "}"); 2189 EXPECT_EQ("__asm {\n" 2190 "}\n" 2191 "int i;", 2192 format("__asm {\n" 2193 "}\n" 2194 "int i;")); 2195 } 2196 2197 TEST_F(FormatTest, FormatTryCatch) { 2198 verifyFormat("try {\n" 2199 " throw a * b;\n" 2200 "} catch (int a) {\n" 2201 " // Do nothing.\n" 2202 "} catch (...) {\n" 2203 " exit(42);\n" 2204 "}"); 2205 2206 // Function-level try statements. 2207 verifyFormat("int f() try { return 4; } catch (...) {\n" 2208 " return 5;\n" 2209 "}"); 2210 verifyFormat("class A {\n" 2211 " int a;\n" 2212 " A() try : a(0) {\n" 2213 " } catch (...) {\n" 2214 " throw;\n" 2215 " }\n" 2216 "};\n"); 2217 2218 // Incomplete try-catch blocks. 2219 verifyIncompleteFormat("try {} catch ("); 2220 } 2221 2222 TEST_F(FormatTest, FormatSEHTryCatch) { 2223 verifyFormat("__try {\n" 2224 " int a = b * c;\n" 2225 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2226 " // Do nothing.\n" 2227 "}"); 2228 2229 verifyFormat("__try {\n" 2230 " int a = b * c;\n" 2231 "} __finally {\n" 2232 " // Do nothing.\n" 2233 "}"); 2234 2235 verifyFormat("DEBUG({\n" 2236 " __try {\n" 2237 " } __finally {\n" 2238 " }\n" 2239 "});\n"); 2240 } 2241 2242 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2243 verifyFormat("try {\n" 2244 " f();\n" 2245 "} catch {\n" 2246 " g();\n" 2247 "}"); 2248 verifyFormat("try {\n" 2249 " f();\n" 2250 "} catch (A a) MACRO(x) {\n" 2251 " g();\n" 2252 "} catch (B b) MACRO(x) {\n" 2253 " g();\n" 2254 "}"); 2255 } 2256 2257 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2258 FormatStyle Style = getLLVMStyle(); 2259 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2260 FormatStyle::BS_WebKit}) { 2261 Style.BreakBeforeBraces = BraceStyle; 2262 verifyFormat("try {\n" 2263 " // something\n" 2264 "} catch (...) {\n" 2265 " // something\n" 2266 "}", 2267 Style); 2268 } 2269 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2270 verifyFormat("try {\n" 2271 " // something\n" 2272 "}\n" 2273 "catch (...) {\n" 2274 " // something\n" 2275 "}", 2276 Style); 2277 verifyFormat("__try {\n" 2278 " // something\n" 2279 "}\n" 2280 "__finally {\n" 2281 " // something\n" 2282 "}", 2283 Style); 2284 verifyFormat("@try {\n" 2285 " // something\n" 2286 "}\n" 2287 "@finally {\n" 2288 " // something\n" 2289 "}", 2290 Style); 2291 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2292 verifyFormat("try\n" 2293 "{\n" 2294 " // something\n" 2295 "}\n" 2296 "catch (...)\n" 2297 "{\n" 2298 " // something\n" 2299 "}", 2300 Style); 2301 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2302 verifyFormat("try\n" 2303 " {\n" 2304 " // something\n" 2305 " }\n" 2306 "catch (...)\n" 2307 " {\n" 2308 " // something\n" 2309 " }", 2310 Style); 2311 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2312 Style.BraceWrapping.BeforeCatch = true; 2313 verifyFormat("try {\n" 2314 " // something\n" 2315 "}\n" 2316 "catch (...) {\n" 2317 " // something\n" 2318 "}", 2319 Style); 2320 } 2321 2322 TEST_F(FormatTest, StaticInitializers) { 2323 verifyFormat("static SomeClass SC = {1, 'a'};"); 2324 2325 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2326 " 100000000, " 2327 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2328 2329 // Here, everything other than the "}" would fit on a line. 2330 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2331 " 10000000000000000000000000};"); 2332 EXPECT_EQ("S s = {a,\n" 2333 "\n" 2334 " b};", 2335 format("S s = {\n" 2336 " a,\n" 2337 "\n" 2338 " b\n" 2339 "};")); 2340 2341 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2342 // line. However, the formatting looks a bit off and this probably doesn't 2343 // happen often in practice. 2344 verifyFormat("static int Variable[1] = {\n" 2345 " {1000000000000000000000000000000000000}};", 2346 getLLVMStyleWithColumns(40)); 2347 } 2348 2349 TEST_F(FormatTest, DesignatedInitializers) { 2350 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2351 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2352 " .bbbbbbbbbb = 2,\n" 2353 " .cccccccccc = 3,\n" 2354 " .dddddddddd = 4,\n" 2355 " .eeeeeeeeee = 5};"); 2356 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2357 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2358 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2359 " .ccccccccccccccccccccccccccc = 3,\n" 2360 " .ddddddddddddddddddddddddddd = 4,\n" 2361 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2362 2363 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2364 2365 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2366 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2367 " [2] = bbbbbbbbbb,\n" 2368 " [3] = cccccccccc,\n" 2369 " [4] = dddddddddd,\n" 2370 " [5] = eeeeeeeeee};"); 2371 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2372 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2373 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2374 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2375 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2376 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2377 } 2378 2379 TEST_F(FormatTest, NestedStaticInitializers) { 2380 verifyFormat("static A x = {{{}}};\n"); 2381 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2382 " {init1, init2, init3, init4}}};", 2383 getLLVMStyleWithColumns(50)); 2384 2385 verifyFormat("somes Status::global_reps[3] = {\n" 2386 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2387 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2388 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2389 getLLVMStyleWithColumns(60)); 2390 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2391 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2392 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2393 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2394 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2395 " {rect.fRight - rect.fLeft, rect.fBottom - " 2396 "rect.fTop}};"); 2397 2398 verifyFormat( 2399 "SomeArrayOfSomeType a = {\n" 2400 " {{1, 2, 3},\n" 2401 " {1, 2, 3},\n" 2402 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2403 " 333333333333333333333333333333},\n" 2404 " {1, 2, 3},\n" 2405 " {1, 2, 3}}};"); 2406 verifyFormat( 2407 "SomeArrayOfSomeType a = {\n" 2408 " {{1, 2, 3}},\n" 2409 " {{1, 2, 3}},\n" 2410 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2411 " 333333333333333333333333333333}},\n" 2412 " {{1, 2, 3}},\n" 2413 " {{1, 2, 3}}};"); 2414 2415 verifyFormat("struct {\n" 2416 " unsigned bit;\n" 2417 " const char *const name;\n" 2418 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2419 " {kOsWin, \"Windows\"},\n" 2420 " {kOsLinux, \"Linux\"},\n" 2421 " {kOsCrOS, \"Chrome OS\"}};"); 2422 verifyFormat("struct {\n" 2423 " unsigned bit;\n" 2424 " const char *const name;\n" 2425 "} kBitsToOs[] = {\n" 2426 " {kOsMac, \"Mac\"},\n" 2427 " {kOsWin, \"Windows\"},\n" 2428 " {kOsLinux, \"Linux\"},\n" 2429 " {kOsCrOS, \"Chrome OS\"},\n" 2430 "};"); 2431 } 2432 2433 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2434 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2435 " \\\n" 2436 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2437 } 2438 2439 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2440 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2441 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2442 2443 // Do break defaulted and deleted functions. 2444 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2445 " default;", 2446 getLLVMStyleWithColumns(40)); 2447 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2448 " delete;", 2449 getLLVMStyleWithColumns(40)); 2450 } 2451 2452 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2453 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2454 getLLVMStyleWithColumns(40)); 2455 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2456 getLLVMStyleWithColumns(40)); 2457 EXPECT_EQ("#define Q \\\n" 2458 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2459 " \"aaaaaaaa.cpp\"", 2460 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2461 getLLVMStyleWithColumns(40))); 2462 } 2463 2464 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2465 EXPECT_EQ("# 123 \"A string literal\"", 2466 format(" # 123 \"A string literal\"")); 2467 } 2468 2469 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2470 EXPECT_EQ("#;", format("#;")); 2471 verifyFormat("#\n;\n;\n;"); 2472 } 2473 2474 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2475 EXPECT_EQ("#line 42 \"test\"\n", 2476 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2477 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2478 getLLVMStyleWithColumns(12))); 2479 } 2480 2481 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2482 EXPECT_EQ("#line 42 \"test\"", 2483 format("# \\\n line \\\n 42 \\\n \"test\"")); 2484 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2485 } 2486 2487 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2488 verifyFormat("#define A \\x20"); 2489 verifyFormat("#define A \\ x20"); 2490 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2491 verifyFormat("#define A ''"); 2492 verifyFormat("#define A ''qqq"); 2493 verifyFormat("#define A `qqq"); 2494 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2495 EXPECT_EQ("const char *c = STRINGIFY(\n" 2496 "\\na : b);", 2497 format("const char * c = STRINGIFY(\n" 2498 "\\na : b);")); 2499 2500 verifyFormat("a\r\\"); 2501 verifyFormat("a\v\\"); 2502 verifyFormat("a\f\\"); 2503 } 2504 2505 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2506 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2507 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2508 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2509 // FIXME: We never break before the macro name. 2510 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2511 2512 verifyFormat("#define A A\n#define A A"); 2513 verifyFormat("#define A(X) A\n#define A A"); 2514 2515 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2516 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2517 } 2518 2519 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2520 EXPECT_EQ("// somecomment\n" 2521 "#include \"a.h\"\n" 2522 "#define A( \\\n" 2523 " A, B)\n" 2524 "#include \"b.h\"\n" 2525 "// somecomment\n", 2526 format(" // somecomment\n" 2527 " #include \"a.h\"\n" 2528 "#define A(A,\\\n" 2529 " B)\n" 2530 " #include \"b.h\"\n" 2531 " // somecomment\n", 2532 getLLVMStyleWithColumns(13))); 2533 } 2534 2535 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2536 2537 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2538 EXPECT_EQ("#define A \\\n" 2539 " c; \\\n" 2540 " e;\n" 2541 "f;", 2542 format("#define A c; e;\n" 2543 "f;", 2544 getLLVMStyleWithColumns(14))); 2545 } 2546 2547 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2548 2549 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2550 EXPECT_EQ("int x,\n" 2551 "#define A\n" 2552 " y;", 2553 format("int x,\n#define A\ny;")); 2554 } 2555 2556 TEST_F(FormatTest, HashInMacroDefinition) { 2557 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2558 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2559 verifyFormat("#define A \\\n" 2560 " { \\\n" 2561 " f(#c); \\\n" 2562 " }", 2563 getLLVMStyleWithColumns(11)); 2564 2565 verifyFormat("#define A(X) \\\n" 2566 " void function##X()", 2567 getLLVMStyleWithColumns(22)); 2568 2569 verifyFormat("#define A(a, b, c) \\\n" 2570 " void a##b##c()", 2571 getLLVMStyleWithColumns(22)); 2572 2573 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2574 } 2575 2576 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2577 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2578 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2579 2580 FormatStyle Style = getLLVMStyle(); 2581 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2582 verifyFormat("#define true ((foo)1)", Style); 2583 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2584 verifyFormat("#define false((foo)0)", Style); 2585 } 2586 2587 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2588 EXPECT_EQ("#define A b;", format("#define A \\\n" 2589 " \\\n" 2590 " b;", 2591 getLLVMStyleWithColumns(25))); 2592 EXPECT_EQ("#define A \\\n" 2593 " \\\n" 2594 " a; \\\n" 2595 " b;", 2596 format("#define A \\\n" 2597 " \\\n" 2598 " a; \\\n" 2599 " b;", 2600 getLLVMStyleWithColumns(11))); 2601 EXPECT_EQ("#define A \\\n" 2602 " a; \\\n" 2603 " \\\n" 2604 " b;", 2605 format("#define A \\\n" 2606 " a; \\\n" 2607 " \\\n" 2608 " b;", 2609 getLLVMStyleWithColumns(11))); 2610 } 2611 2612 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2613 verifyIncompleteFormat("#define A :"); 2614 verifyFormat("#define SOMECASES \\\n" 2615 " case 1: \\\n" 2616 " case 2\n", 2617 getLLVMStyleWithColumns(20)); 2618 verifyFormat("#define MACRO(a) \\\n" 2619 " if (a) \\\n" 2620 " f(); \\\n" 2621 " else \\\n" 2622 " g()", 2623 getLLVMStyleWithColumns(18)); 2624 verifyFormat("#define A template <typename T>"); 2625 verifyIncompleteFormat("#define STR(x) #x\n" 2626 "f(STR(this_is_a_string_literal{));"); 2627 verifyFormat("#pragma omp threadprivate( \\\n" 2628 " y)), // expected-warning", 2629 getLLVMStyleWithColumns(28)); 2630 verifyFormat("#d, = };"); 2631 verifyFormat("#if \"a"); 2632 verifyIncompleteFormat("({\n" 2633 "#define b \\\n" 2634 " } \\\n" 2635 " a\n" 2636 "a", 2637 getLLVMStyleWithColumns(15)); 2638 verifyFormat("#define A \\\n" 2639 " { \\\n" 2640 " {\n" 2641 "#define B \\\n" 2642 " } \\\n" 2643 " }", 2644 getLLVMStyleWithColumns(15)); 2645 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 2646 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 2647 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 2648 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 2649 } 2650 2651 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 2652 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 2653 EXPECT_EQ("class A : public QObject {\n" 2654 " Q_OBJECT\n" 2655 "\n" 2656 " A() {}\n" 2657 "};", 2658 format("class A : public QObject {\n" 2659 " Q_OBJECT\n" 2660 "\n" 2661 " A() {\n}\n" 2662 "} ;")); 2663 EXPECT_EQ("MACRO\n" 2664 "/*static*/ int i;", 2665 format("MACRO\n" 2666 " /*static*/ int i;")); 2667 EXPECT_EQ("SOME_MACRO\n" 2668 "namespace {\n" 2669 "void f();\n" 2670 "} // namespace", 2671 format("SOME_MACRO\n" 2672 " namespace {\n" 2673 "void f( );\n" 2674 "} // namespace")); 2675 // Only if the identifier contains at least 5 characters. 2676 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 2677 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 2678 // Only if everything is upper case. 2679 EXPECT_EQ("class A : public QObject {\n" 2680 " Q_Object A() {}\n" 2681 "};", 2682 format("class A : public QObject {\n" 2683 " Q_Object\n" 2684 " A() {\n}\n" 2685 "} ;")); 2686 2687 // Only if the next line can actually start an unwrapped line. 2688 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 2689 format("SOME_WEIRD_LOG_MACRO\n" 2690 "<< SomeThing;")); 2691 2692 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 2693 "(n, buffers))\n", 2694 getChromiumStyle(FormatStyle::LK_Cpp)); 2695 2696 // See PR41483 2697 EXPECT_EQ("/**/ FOO(a)\n" 2698 "FOO(b)", 2699 format("/**/ FOO(a)\n" 2700 "FOO(b)")); 2701 } 2702 2703 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 2704 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2705 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2706 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2707 "class X {};\n" 2708 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2709 "int *createScopDetectionPass() { return 0; }", 2710 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2711 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2712 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2713 " class X {};\n" 2714 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2715 " int *createScopDetectionPass() { return 0; }")); 2716 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 2717 // braces, so that inner block is indented one level more. 2718 EXPECT_EQ("int q() {\n" 2719 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2720 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2721 " IPC_END_MESSAGE_MAP()\n" 2722 "}", 2723 format("int q() {\n" 2724 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2725 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2726 " IPC_END_MESSAGE_MAP()\n" 2727 "}")); 2728 2729 // Same inside macros. 2730 EXPECT_EQ("#define LIST(L) \\\n" 2731 " L(A) \\\n" 2732 " L(B) \\\n" 2733 " L(C)", 2734 format("#define LIST(L) \\\n" 2735 " L(A) \\\n" 2736 " L(B) \\\n" 2737 " L(C)", 2738 getGoogleStyle())); 2739 2740 // These must not be recognized as macros. 2741 EXPECT_EQ("int q() {\n" 2742 " f(x);\n" 2743 " f(x) {}\n" 2744 " f(x)->g();\n" 2745 " f(x)->*g();\n" 2746 " f(x).g();\n" 2747 " f(x) = x;\n" 2748 " f(x) += x;\n" 2749 " f(x) -= x;\n" 2750 " f(x) *= x;\n" 2751 " f(x) /= x;\n" 2752 " f(x) %= x;\n" 2753 " f(x) &= x;\n" 2754 " f(x) |= x;\n" 2755 " f(x) ^= x;\n" 2756 " f(x) >>= x;\n" 2757 " f(x) <<= x;\n" 2758 " f(x)[y].z();\n" 2759 " LOG(INFO) << x;\n" 2760 " ifstream(x) >> x;\n" 2761 "}\n", 2762 format("int q() {\n" 2763 " f(x)\n;\n" 2764 " f(x)\n {}\n" 2765 " f(x)\n->g();\n" 2766 " f(x)\n->*g();\n" 2767 " f(x)\n.g();\n" 2768 " f(x)\n = x;\n" 2769 " f(x)\n += x;\n" 2770 " f(x)\n -= x;\n" 2771 " f(x)\n *= x;\n" 2772 " f(x)\n /= x;\n" 2773 " f(x)\n %= x;\n" 2774 " f(x)\n &= x;\n" 2775 " f(x)\n |= x;\n" 2776 " f(x)\n ^= x;\n" 2777 " f(x)\n >>= x;\n" 2778 " f(x)\n <<= x;\n" 2779 " f(x)\n[y].z();\n" 2780 " LOG(INFO)\n << x;\n" 2781 " ifstream(x)\n >> x;\n" 2782 "}\n")); 2783 EXPECT_EQ("int q() {\n" 2784 " F(x)\n" 2785 " if (1) {\n" 2786 " }\n" 2787 " F(x)\n" 2788 " while (1) {\n" 2789 " }\n" 2790 " F(x)\n" 2791 " G(x);\n" 2792 " F(x)\n" 2793 " try {\n" 2794 " Q();\n" 2795 " } catch (...) {\n" 2796 " }\n" 2797 "}\n", 2798 format("int q() {\n" 2799 "F(x)\n" 2800 "if (1) {}\n" 2801 "F(x)\n" 2802 "while (1) {}\n" 2803 "F(x)\n" 2804 "G(x);\n" 2805 "F(x)\n" 2806 "try { Q(); } catch (...) {}\n" 2807 "}\n")); 2808 EXPECT_EQ("class A {\n" 2809 " A() : t(0) {}\n" 2810 " A(int i) noexcept() : {}\n" 2811 " A(X x)\n" // FIXME: function-level try blocks are broken. 2812 " try : t(0) {\n" 2813 " } catch (...) {\n" 2814 " }\n" 2815 "};", 2816 format("class A {\n" 2817 " A()\n : t(0) {}\n" 2818 " A(int i)\n noexcept() : {}\n" 2819 " A(X x)\n" 2820 " try : t(0) {} catch (...) {}\n" 2821 "};")); 2822 FormatStyle Style = getLLVMStyle(); 2823 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2824 Style.BraceWrapping.AfterControlStatement = true; 2825 Style.BraceWrapping.AfterFunction = true; 2826 EXPECT_EQ("void f()\n" 2827 "try\n" 2828 "{\n" 2829 "}", 2830 format("void f() try {\n" 2831 "}", Style)); 2832 EXPECT_EQ("class SomeClass {\n" 2833 "public:\n" 2834 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2835 "};", 2836 format("class SomeClass {\n" 2837 "public:\n" 2838 " SomeClass()\n" 2839 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2840 "};")); 2841 EXPECT_EQ("class SomeClass {\n" 2842 "public:\n" 2843 " SomeClass()\n" 2844 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2845 "};", 2846 format("class SomeClass {\n" 2847 "public:\n" 2848 " SomeClass()\n" 2849 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2850 "};", 2851 getLLVMStyleWithColumns(40))); 2852 2853 verifyFormat("MACRO(>)"); 2854 2855 // Some macros contain an implicit semicolon. 2856 Style = getLLVMStyle(); 2857 Style.StatementMacros.push_back("FOO"); 2858 verifyFormat("FOO(a) int b = 0;"); 2859 verifyFormat("FOO(a)\n" 2860 "int b = 0;", 2861 Style); 2862 verifyFormat("FOO(a);\n" 2863 "int b = 0;", 2864 Style); 2865 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 2866 "int b = 0;", 2867 Style); 2868 verifyFormat("FOO()\n" 2869 "int b = 0;", 2870 Style); 2871 verifyFormat("FOO\n" 2872 "int b = 0;", 2873 Style); 2874 verifyFormat("void f() {\n" 2875 " FOO(a)\n" 2876 " return a;\n" 2877 "}", 2878 Style); 2879 verifyFormat("FOO(a)\n" 2880 "FOO(b)", 2881 Style); 2882 verifyFormat("int a = 0;\n" 2883 "FOO(b)\n" 2884 "int c = 0;", 2885 Style); 2886 verifyFormat("int a = 0;\n" 2887 "int x = FOO(a)\n" 2888 "int b = 0;", 2889 Style); 2890 verifyFormat("void foo(int a) { FOO(a) }\n" 2891 "uint32_t bar() {}", 2892 Style); 2893 } 2894 2895 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 2896 verifyFormat("#define A \\\n" 2897 " f({ \\\n" 2898 " g(); \\\n" 2899 " });", 2900 getLLVMStyleWithColumns(11)); 2901 } 2902 2903 TEST_F(FormatTest, IndentPreprocessorDirectives) { 2904 FormatStyle Style = getLLVMStyle(); 2905 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 2906 Style.ColumnLimit = 40; 2907 verifyFormat("#ifdef _WIN32\n" 2908 "#define A 0\n" 2909 "#ifdef VAR2\n" 2910 "#define B 1\n" 2911 "#include <someheader.h>\n" 2912 "#define MACRO \\\n" 2913 " some_very_long_func_aaaaaaaaaa();\n" 2914 "#endif\n" 2915 "#else\n" 2916 "#define A 1\n" 2917 "#endif", 2918 Style); 2919 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 2920 verifyFormat("#ifdef _WIN32\n" 2921 "# define A 0\n" 2922 "# ifdef VAR2\n" 2923 "# define B 1\n" 2924 "# include <someheader.h>\n" 2925 "# define MACRO \\\n" 2926 " some_very_long_func_aaaaaaaaaa();\n" 2927 "# endif\n" 2928 "#else\n" 2929 "# define A 1\n" 2930 "#endif", 2931 Style); 2932 verifyFormat("#if A\n" 2933 "# define MACRO \\\n" 2934 " void a(int x) { \\\n" 2935 " b(); \\\n" 2936 " c(); \\\n" 2937 " d(); \\\n" 2938 " e(); \\\n" 2939 " f(); \\\n" 2940 " }\n" 2941 "#endif", 2942 Style); 2943 // Comments before include guard. 2944 verifyFormat("// file comment\n" 2945 "// file comment\n" 2946 "#ifndef HEADER_H\n" 2947 "#define HEADER_H\n" 2948 "code();\n" 2949 "#endif", 2950 Style); 2951 // Test with include guards. 2952 verifyFormat("#ifndef HEADER_H\n" 2953 "#define HEADER_H\n" 2954 "code();\n" 2955 "#endif", 2956 Style); 2957 // Include guards must have a #define with the same variable immediately 2958 // after #ifndef. 2959 verifyFormat("#ifndef NOT_GUARD\n" 2960 "# define FOO\n" 2961 "code();\n" 2962 "#endif", 2963 Style); 2964 2965 // Include guards must cover the entire file. 2966 verifyFormat("code();\n" 2967 "code();\n" 2968 "#ifndef NOT_GUARD\n" 2969 "# define NOT_GUARD\n" 2970 "code();\n" 2971 "#endif", 2972 Style); 2973 verifyFormat("#ifndef NOT_GUARD\n" 2974 "# define NOT_GUARD\n" 2975 "code();\n" 2976 "#endif\n" 2977 "code();", 2978 Style); 2979 // Test with trailing blank lines. 2980 verifyFormat("#ifndef HEADER_H\n" 2981 "#define HEADER_H\n" 2982 "code();\n" 2983 "#endif\n", 2984 Style); 2985 // Include guards don't have #else. 2986 verifyFormat("#ifndef NOT_GUARD\n" 2987 "# define NOT_GUARD\n" 2988 "code();\n" 2989 "#else\n" 2990 "#endif", 2991 Style); 2992 verifyFormat("#ifndef NOT_GUARD\n" 2993 "# define NOT_GUARD\n" 2994 "code();\n" 2995 "#elif FOO\n" 2996 "#endif", 2997 Style); 2998 // Non-identifier #define after potential include guard. 2999 verifyFormat("#ifndef FOO\n" 3000 "# define 1\n" 3001 "#endif\n", 3002 Style); 3003 // #if closes past last non-preprocessor line. 3004 verifyFormat("#ifndef FOO\n" 3005 "#define FOO\n" 3006 "#if 1\n" 3007 "int i;\n" 3008 "# define A 0\n" 3009 "#endif\n" 3010 "#endif\n", 3011 Style); 3012 // FIXME: This doesn't handle the case where there's code between the 3013 // #ifndef and #define but all other conditions hold. This is because when 3014 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3015 // previous code line yet, so we can't detect it. 3016 EXPECT_EQ("#ifndef NOT_GUARD\n" 3017 "code();\n" 3018 "#define NOT_GUARD\n" 3019 "code();\n" 3020 "#endif", 3021 format("#ifndef NOT_GUARD\n" 3022 "code();\n" 3023 "# define NOT_GUARD\n" 3024 "code();\n" 3025 "#endif", 3026 Style)); 3027 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3028 // be outside an include guard. Examples are #pragma once and 3029 // #pragma GCC diagnostic, or anything else that does not change the meaning 3030 // of the file if it's included multiple times. 3031 EXPECT_EQ("#ifdef WIN32\n" 3032 "# pragma once\n" 3033 "#endif\n" 3034 "#ifndef HEADER_H\n" 3035 "# define HEADER_H\n" 3036 "code();\n" 3037 "#endif", 3038 format("#ifdef WIN32\n" 3039 "# pragma once\n" 3040 "#endif\n" 3041 "#ifndef HEADER_H\n" 3042 "#define HEADER_H\n" 3043 "code();\n" 3044 "#endif", 3045 Style)); 3046 // FIXME: This does not detect when there is a single non-preprocessor line 3047 // in front of an include-guard-like structure where other conditions hold 3048 // because ScopedLineState hides the line. 3049 EXPECT_EQ("code();\n" 3050 "#ifndef HEADER_H\n" 3051 "#define HEADER_H\n" 3052 "code();\n" 3053 "#endif", 3054 format("code();\n" 3055 "#ifndef HEADER_H\n" 3056 "# define HEADER_H\n" 3057 "code();\n" 3058 "#endif", 3059 Style)); 3060 // Keep comments aligned with #, otherwise indent comments normally. These 3061 // tests cannot use verifyFormat because messUp manipulates leading 3062 // whitespace. 3063 { 3064 const char *Expected = "" 3065 "void f() {\n" 3066 "#if 1\n" 3067 "// Preprocessor aligned.\n" 3068 "# define A 0\n" 3069 " // Code. Separated by blank line.\n" 3070 "\n" 3071 "# define B 0\n" 3072 " // Code. Not aligned with #\n" 3073 "# define C 0\n" 3074 "#endif"; 3075 const char *ToFormat = "" 3076 "void f() {\n" 3077 "#if 1\n" 3078 "// Preprocessor aligned.\n" 3079 "# define A 0\n" 3080 "// Code. Separated by blank line.\n" 3081 "\n" 3082 "# define B 0\n" 3083 " // Code. Not aligned with #\n" 3084 "# define C 0\n" 3085 "#endif"; 3086 EXPECT_EQ(Expected, format(ToFormat, Style)); 3087 EXPECT_EQ(Expected, format(Expected, Style)); 3088 } 3089 // Keep block quotes aligned. 3090 { 3091 const char *Expected = "" 3092 "void f() {\n" 3093 "#if 1\n" 3094 "/* Preprocessor aligned. */\n" 3095 "# define A 0\n" 3096 " /* Code. Separated by blank line. */\n" 3097 "\n" 3098 "# define B 0\n" 3099 " /* Code. Not aligned with # */\n" 3100 "# define C 0\n" 3101 "#endif"; 3102 const char *ToFormat = "" 3103 "void f() {\n" 3104 "#if 1\n" 3105 "/* Preprocessor aligned. */\n" 3106 "# define A 0\n" 3107 "/* Code. Separated by blank line. */\n" 3108 "\n" 3109 "# define B 0\n" 3110 " /* Code. Not aligned with # */\n" 3111 "# define C 0\n" 3112 "#endif"; 3113 EXPECT_EQ(Expected, format(ToFormat, Style)); 3114 EXPECT_EQ(Expected, format(Expected, Style)); 3115 } 3116 // Keep comments aligned with un-indented directives. 3117 { 3118 const char *Expected = "" 3119 "void f() {\n" 3120 "// Preprocessor aligned.\n" 3121 "#define A 0\n" 3122 " // Code. Separated by blank line.\n" 3123 "\n" 3124 "#define B 0\n" 3125 " // Code. Not aligned with #\n" 3126 "#define C 0\n"; 3127 const char *ToFormat = "" 3128 "void f() {\n" 3129 "// Preprocessor aligned.\n" 3130 "#define A 0\n" 3131 "// Code. Separated by blank line.\n" 3132 "\n" 3133 "#define B 0\n" 3134 " // Code. Not aligned with #\n" 3135 "#define C 0\n"; 3136 EXPECT_EQ(Expected, format(ToFormat, Style)); 3137 EXPECT_EQ(Expected, format(Expected, Style)); 3138 } 3139 // Test AfterHash with tabs. 3140 { 3141 FormatStyle Tabbed = Style; 3142 Tabbed.UseTab = FormatStyle::UT_Always; 3143 Tabbed.IndentWidth = 8; 3144 Tabbed.TabWidth = 8; 3145 verifyFormat("#ifdef _WIN32\n" 3146 "#\tdefine A 0\n" 3147 "#\tifdef VAR2\n" 3148 "#\t\tdefine B 1\n" 3149 "#\t\tinclude <someheader.h>\n" 3150 "#\t\tdefine MACRO \\\n" 3151 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3152 "#\tendif\n" 3153 "#else\n" 3154 "#\tdefine A 1\n" 3155 "#endif", 3156 Tabbed); 3157 } 3158 3159 // Regression test: Multiline-macro inside include guards. 3160 verifyFormat("#ifndef HEADER_H\n" 3161 "#define HEADER_H\n" 3162 "#define A() \\\n" 3163 " int i; \\\n" 3164 " int j;\n" 3165 "#endif // HEADER_H", 3166 getLLVMStyleWithColumns(20)); 3167 3168 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3169 // Basic before hash indent tests 3170 verifyFormat("#ifdef _WIN32\n" 3171 " #define A 0\n" 3172 " #ifdef VAR2\n" 3173 " #define B 1\n" 3174 " #include <someheader.h>\n" 3175 " #define MACRO \\\n" 3176 " some_very_long_func_aaaaaaaaaa();\n" 3177 " #endif\n" 3178 "#else\n" 3179 " #define A 1\n" 3180 "#endif", 3181 Style); 3182 verifyFormat("#if A\n" 3183 " #define MACRO \\\n" 3184 " void a(int x) { \\\n" 3185 " b(); \\\n" 3186 " c(); \\\n" 3187 " d(); \\\n" 3188 " e(); \\\n" 3189 " f(); \\\n" 3190 " }\n" 3191 "#endif", 3192 Style); 3193 // Keep comments aligned with indented directives. These 3194 // tests cannot use verifyFormat because messUp manipulates leading 3195 // whitespace. 3196 { 3197 const char *Expected = "void f() {\n" 3198 "// Aligned to preprocessor.\n" 3199 "#if 1\n" 3200 " // Aligned to code.\n" 3201 " int a;\n" 3202 " #if 1\n" 3203 " // Aligned to preprocessor.\n" 3204 " #define A 0\n" 3205 " // Aligned to code.\n" 3206 " int b;\n" 3207 " #endif\n" 3208 "#endif\n" 3209 "}"; 3210 const char *ToFormat = "void f() {\n" 3211 "// Aligned to preprocessor.\n" 3212 "#if 1\n" 3213 "// Aligned to code.\n" 3214 "int a;\n" 3215 "#if 1\n" 3216 "// Aligned to preprocessor.\n" 3217 "#define A 0\n" 3218 "// Aligned to code.\n" 3219 "int b;\n" 3220 "#endif\n" 3221 "#endif\n" 3222 "}"; 3223 EXPECT_EQ(Expected, format(ToFormat, Style)); 3224 EXPECT_EQ(Expected, format(Expected, Style)); 3225 } 3226 { 3227 const char *Expected = "void f() {\n" 3228 "/* Aligned to preprocessor. */\n" 3229 "#if 1\n" 3230 " /* Aligned to code. */\n" 3231 " int a;\n" 3232 " #if 1\n" 3233 " /* Aligned to preprocessor. */\n" 3234 " #define A 0\n" 3235 " /* Aligned to code. */\n" 3236 " int b;\n" 3237 " #endif\n" 3238 "#endif\n" 3239 "}"; 3240 const char *ToFormat = "void f() {\n" 3241 "/* Aligned to preprocessor. */\n" 3242 "#if 1\n" 3243 "/* Aligned to code. */\n" 3244 "int a;\n" 3245 "#if 1\n" 3246 "/* Aligned to preprocessor. */\n" 3247 "#define A 0\n" 3248 "/* Aligned to code. */\n" 3249 "int b;\n" 3250 "#endif\n" 3251 "#endif\n" 3252 "}"; 3253 EXPECT_EQ(Expected, format(ToFormat, Style)); 3254 EXPECT_EQ(Expected, format(Expected, Style)); 3255 } 3256 3257 // Test single comment before preprocessor 3258 verifyFormat("// Comment\n" 3259 "\n" 3260 "#if 1\n" 3261 "#endif", 3262 Style); 3263 } 3264 3265 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3266 verifyFormat("{\n { a #c; }\n}"); 3267 } 3268 3269 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3270 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3271 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3272 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3273 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3274 } 3275 3276 TEST_F(FormatTest, EscapedNewlines) { 3277 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3278 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3279 format("#define A \\\nint i;\\\n int j;", Narrow)); 3280 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3281 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3282 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3283 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3284 3285 FormatStyle AlignLeft = getLLVMStyle(); 3286 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3287 EXPECT_EQ("#define MACRO(x) \\\n" 3288 "private: \\\n" 3289 " int x(int a);\n", 3290 format("#define MACRO(x) \\\n" 3291 "private: \\\n" 3292 " int x(int a);\n", 3293 AlignLeft)); 3294 3295 // CRLF line endings 3296 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3297 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3298 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3299 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3300 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3301 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3302 EXPECT_EQ("#define MACRO(x) \\\r\n" 3303 "private: \\\r\n" 3304 " int x(int a);\r\n", 3305 format("#define MACRO(x) \\\r\n" 3306 "private: \\\r\n" 3307 " int x(int a);\r\n", 3308 AlignLeft)); 3309 3310 FormatStyle DontAlign = getLLVMStyle(); 3311 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3312 DontAlign.MaxEmptyLinesToKeep = 3; 3313 // FIXME: can't use verifyFormat here because the newline before 3314 // "public:" is not inserted the first time it's reformatted 3315 EXPECT_EQ("#define A \\\n" 3316 " class Foo { \\\n" 3317 " void bar(); \\\n" 3318 "\\\n" 3319 "\\\n" 3320 "\\\n" 3321 " public: \\\n" 3322 " void baz(); \\\n" 3323 " };", 3324 format("#define A \\\n" 3325 " class Foo { \\\n" 3326 " void bar(); \\\n" 3327 "\\\n" 3328 "\\\n" 3329 "\\\n" 3330 " public: \\\n" 3331 " void baz(); \\\n" 3332 " };", 3333 DontAlign)); 3334 } 3335 3336 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3337 verifyFormat("#define A \\\n" 3338 " int v( \\\n" 3339 " a); \\\n" 3340 " int i;", 3341 getLLVMStyleWithColumns(11)); 3342 } 3343 3344 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3345 EXPECT_EQ( 3346 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3347 " \\\n" 3348 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3349 "\n" 3350 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3351 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3352 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3353 "\\\n" 3354 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3355 " \n" 3356 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3357 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3358 } 3359 3360 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3361 EXPECT_EQ("int\n" 3362 "#define A\n" 3363 " a;", 3364 format("int\n#define A\na;")); 3365 verifyFormat("functionCallTo(\n" 3366 " someOtherFunction(\n" 3367 " withSomeParameters, whichInSequence,\n" 3368 " areLongerThanALine(andAnotherCall,\n" 3369 "#define A B\n" 3370 " withMoreParamters,\n" 3371 " whichStronglyInfluenceTheLayout),\n" 3372 " andMoreParameters),\n" 3373 " trailing);", 3374 getLLVMStyleWithColumns(69)); 3375 verifyFormat("Foo::Foo()\n" 3376 "#ifdef BAR\n" 3377 " : baz(0)\n" 3378 "#endif\n" 3379 "{\n" 3380 "}"); 3381 verifyFormat("void f() {\n" 3382 " if (true)\n" 3383 "#ifdef A\n" 3384 " f(42);\n" 3385 " x();\n" 3386 "#else\n" 3387 " g();\n" 3388 " x();\n" 3389 "#endif\n" 3390 "}"); 3391 verifyFormat("void f(param1, param2,\n" 3392 " param3,\n" 3393 "#ifdef A\n" 3394 " param4(param5,\n" 3395 "#ifdef A1\n" 3396 " param6,\n" 3397 "#ifdef A2\n" 3398 " param7),\n" 3399 "#else\n" 3400 " param8),\n" 3401 " param9,\n" 3402 "#endif\n" 3403 " param10,\n" 3404 "#endif\n" 3405 " param11)\n" 3406 "#else\n" 3407 " param12)\n" 3408 "#endif\n" 3409 "{\n" 3410 " x();\n" 3411 "}", 3412 getLLVMStyleWithColumns(28)); 3413 verifyFormat("#if 1\n" 3414 "int i;"); 3415 verifyFormat("#if 1\n" 3416 "#endif\n" 3417 "#if 1\n" 3418 "#else\n" 3419 "#endif\n"); 3420 verifyFormat("DEBUG({\n" 3421 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3422 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3423 "});\n" 3424 "#if a\n" 3425 "#else\n" 3426 "#endif"); 3427 3428 verifyIncompleteFormat("void f(\n" 3429 "#if A\n" 3430 ");\n" 3431 "#else\n" 3432 "#endif"); 3433 } 3434 3435 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3436 verifyFormat("#endif\n" 3437 "#if B"); 3438 } 3439 3440 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3441 FormatStyle SingleLine = getLLVMStyle(); 3442 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3443 verifyFormat("#if 0\n" 3444 "#elif 1\n" 3445 "#endif\n" 3446 "void foo() {\n" 3447 " if (test) foo2();\n" 3448 "}", 3449 SingleLine); 3450 } 3451 3452 TEST_F(FormatTest, LayoutBlockInsideParens) { 3453 verifyFormat("functionCall({ int i; });"); 3454 verifyFormat("functionCall({\n" 3455 " int i;\n" 3456 " int j;\n" 3457 "});"); 3458 verifyFormat("functionCall(\n" 3459 " {\n" 3460 " int i;\n" 3461 " int j;\n" 3462 " },\n" 3463 " aaaa, bbbb, cccc);"); 3464 verifyFormat("functionA(functionB({\n" 3465 " int i;\n" 3466 " int j;\n" 3467 " }),\n" 3468 " aaaa, bbbb, cccc);"); 3469 verifyFormat("functionCall(\n" 3470 " {\n" 3471 " int i;\n" 3472 " int j;\n" 3473 " },\n" 3474 " aaaa, bbbb, // comment\n" 3475 " cccc);"); 3476 verifyFormat("functionA(functionB({\n" 3477 " int i;\n" 3478 " int j;\n" 3479 " }),\n" 3480 " aaaa, bbbb, // comment\n" 3481 " cccc);"); 3482 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3483 verifyFormat("functionCall(aaaa, bbbb, {\n" 3484 " int i;\n" 3485 " int j;\n" 3486 "});"); 3487 verifyFormat( 3488 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3489 " {\n" 3490 " int i; // break\n" 3491 " },\n" 3492 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3493 " ccccccccccccccccc));"); 3494 verifyFormat("DEBUG({\n" 3495 " if (a)\n" 3496 " f();\n" 3497 "});"); 3498 } 3499 3500 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3501 EXPECT_EQ("SOME_MACRO { int i; }\n" 3502 "int i;", 3503 format(" SOME_MACRO {int i;} int i;")); 3504 } 3505 3506 TEST_F(FormatTest, LayoutNestedBlocks) { 3507 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3508 " struct s {\n" 3509 " int i;\n" 3510 " };\n" 3511 " s kBitsToOs[] = {{10}};\n" 3512 " for (int i = 0; i < 10; ++i)\n" 3513 " return;\n" 3514 "}"); 3515 verifyFormat("call(parameter, {\n" 3516 " something();\n" 3517 " // Comment using all columns.\n" 3518 " somethingelse();\n" 3519 "});", 3520 getLLVMStyleWithColumns(40)); 3521 verifyFormat("DEBUG( //\n" 3522 " { f(); }, a);"); 3523 verifyFormat("DEBUG( //\n" 3524 " {\n" 3525 " f(); //\n" 3526 " },\n" 3527 " a);"); 3528 3529 EXPECT_EQ("call(parameter, {\n" 3530 " something();\n" 3531 " // Comment too\n" 3532 " // looooooooooong.\n" 3533 " somethingElse();\n" 3534 "});", 3535 format("call(parameter, {\n" 3536 " something();\n" 3537 " // Comment too looooooooooong.\n" 3538 " somethingElse();\n" 3539 "});", 3540 getLLVMStyleWithColumns(29))); 3541 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3542 EXPECT_EQ("DEBUG({ // comment\n" 3543 " int i;\n" 3544 "});", 3545 format("DEBUG({ // comment\n" 3546 "int i;\n" 3547 "});")); 3548 EXPECT_EQ("DEBUG({\n" 3549 " int i;\n" 3550 "\n" 3551 " // comment\n" 3552 " int j;\n" 3553 "});", 3554 format("DEBUG({\n" 3555 " int i;\n" 3556 "\n" 3557 " // comment\n" 3558 " int j;\n" 3559 "});")); 3560 3561 verifyFormat("DEBUG({\n" 3562 " if (a)\n" 3563 " return;\n" 3564 "});"); 3565 verifyGoogleFormat("DEBUG({\n" 3566 " if (a) return;\n" 3567 "});"); 3568 FormatStyle Style = getGoogleStyle(); 3569 Style.ColumnLimit = 45; 3570 verifyFormat("Debug(\n" 3571 " aaaaa,\n" 3572 " {\n" 3573 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3574 " },\n" 3575 " a);", 3576 Style); 3577 3578 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3579 3580 verifyNoCrash("^{v^{a}}"); 3581 } 3582 3583 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3584 EXPECT_EQ("#define MACRO() \\\n" 3585 " Debug(aaa, /* force line break */ \\\n" 3586 " { \\\n" 3587 " int i; \\\n" 3588 " int j; \\\n" 3589 " })", 3590 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3591 " { int i; int j; })", 3592 getGoogleStyle())); 3593 3594 EXPECT_EQ("#define A \\\n" 3595 " [] { \\\n" 3596 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3597 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3598 " }", 3599 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3600 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3601 getGoogleStyle())); 3602 } 3603 3604 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3605 EXPECT_EQ("{}", format("{}")); 3606 verifyFormat("enum E {};"); 3607 verifyFormat("enum E {}"); 3608 } 3609 3610 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 3611 FormatStyle Style = getLLVMStyle(); 3612 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 3613 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 3614 verifyFormat("FOO_BEGIN\n" 3615 " FOO_ENTRY\n" 3616 "FOO_END", Style); 3617 verifyFormat("FOO_BEGIN\n" 3618 " NESTED_FOO_BEGIN\n" 3619 " NESTED_FOO_ENTRY\n" 3620 " NESTED_FOO_END\n" 3621 "FOO_END", Style); 3622 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 3623 " int x;\n" 3624 " x = 1;\n" 3625 "FOO_END(Baz)", Style); 3626 } 3627 3628 //===----------------------------------------------------------------------===// 3629 // Line break tests. 3630 //===----------------------------------------------------------------------===// 3631 3632 TEST_F(FormatTest, PreventConfusingIndents) { 3633 verifyFormat( 3634 "void f() {\n" 3635 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 3636 " parameter, parameter, parameter)),\n" 3637 " SecondLongCall(parameter));\n" 3638 "}"); 3639 verifyFormat( 3640 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3641 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3642 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3643 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 3644 verifyFormat( 3645 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3646 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 3647 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 3648 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 3649 verifyFormat( 3650 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 3651 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 3652 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 3653 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 3654 verifyFormat("int a = bbbb && ccc &&\n" 3655 " fffff(\n" 3656 "#define A Just forcing a new line\n" 3657 " ddd);"); 3658 } 3659 3660 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 3661 verifyFormat( 3662 "bool aaaaaaa =\n" 3663 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 3664 " bbbbbbbb();"); 3665 verifyFormat( 3666 "bool aaaaaaa =\n" 3667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 3668 " bbbbbbbb();"); 3669 3670 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3671 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 3672 " ccccccccc == ddddddddddd;"); 3673 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3674 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 3675 " ccccccccc == ddddddddddd;"); 3676 verifyFormat( 3677 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 3678 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 3679 " ccccccccc == ddddddddddd;"); 3680 3681 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3682 " aaaaaa) &&\n" 3683 " bbbbbb && cccccc;"); 3684 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3685 " aaaaaa) >>\n" 3686 " bbbbbb;"); 3687 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 3688 " SourceMgr.getSpellingColumnNumber(\n" 3689 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 3690 " 1);"); 3691 3692 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3693 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 3694 " cccccc) {\n}"); 3695 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3696 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3697 " cccccc) {\n}"); 3698 verifyFormat("b = a &&\n" 3699 " // Comment\n" 3700 " b.c && d;"); 3701 3702 // If the LHS of a comparison is not a binary expression itself, the 3703 // additional linebreak confuses many people. 3704 verifyFormat( 3705 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3706 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 3707 "}"); 3708 verifyFormat( 3709 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3711 "}"); 3712 verifyFormat( 3713 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 3714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3715 "}"); 3716 verifyFormat( 3717 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 3719 "}"); 3720 // Even explicit parentheses stress the precedence enough to make the 3721 // additional break unnecessary. 3722 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3724 "}"); 3725 // This cases is borderline, but with the indentation it is still readable. 3726 verifyFormat( 3727 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3728 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 3730 "}", 3731 getLLVMStyleWithColumns(75)); 3732 3733 // If the LHS is a binary expression, we should still use the additional break 3734 // as otherwise the formatting hides the operator precedence. 3735 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3737 " 5) {\n" 3738 "}"); 3739 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 3741 " 5) {\n" 3742 "}"); 3743 3744 FormatStyle OnePerLine = getLLVMStyle(); 3745 OnePerLine.BinPackParameters = false; 3746 verifyFormat( 3747 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 3750 OnePerLine); 3751 3752 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 3753 " .aaa(aaaaaaaaaaaaa) *\n" 3754 " aaaaaaa +\n" 3755 " aaaaaaa;", 3756 getLLVMStyleWithColumns(40)); 3757 } 3758 3759 TEST_F(FormatTest, ExpressionIndentation) { 3760 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3761 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3762 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3764 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 3765 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 3766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 3768 " ccccccccccccccccccccccccccccccccccccccccc;"); 3769 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3770 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3771 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3772 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3773 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3776 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3777 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3779 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3780 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3781 verifyFormat("if () {\n" 3782 "} else if (aaaaa && bbbbb > // break\n" 3783 " ccccc) {\n" 3784 "}"); 3785 verifyFormat("if () {\n" 3786 "} else if (aaaaa &&\n" 3787 " bbbbb > // break\n" 3788 " ccccc &&\n" 3789 " ddddd) {\n" 3790 "}"); 3791 3792 // Presence of a trailing comment used to change indentation of b. 3793 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 3794 " b;\n" 3795 "return aaaaaaaaaaaaaaaaaaa +\n" 3796 " b; //", 3797 getLLVMStyleWithColumns(30)); 3798 } 3799 3800 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 3801 // Not sure what the best system is here. Like this, the LHS can be found 3802 // immediately above an operator (everything with the same or a higher 3803 // indent). The RHS is aligned right of the operator and so compasses 3804 // everything until something with the same indent as the operator is found. 3805 // FIXME: Is this a good system? 3806 FormatStyle Style = getLLVMStyle(); 3807 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 3808 verifyFormat( 3809 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3810 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3811 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3812 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3813 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3814 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3815 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3816 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3817 " > ccccccccccccccccccccccccccccccccccccccccc;", 3818 Style); 3819 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3820 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3821 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3822 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3823 Style); 3824 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3825 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3826 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3827 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3828 Style); 3829 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3830 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3831 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3832 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3833 Style); 3834 verifyFormat("if () {\n" 3835 "} else if (aaaaa\n" 3836 " && bbbbb // break\n" 3837 " > ccccc) {\n" 3838 "}", 3839 Style); 3840 verifyFormat("return (a)\n" 3841 " // comment\n" 3842 " + b;", 3843 Style); 3844 verifyFormat( 3845 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3846 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3847 " + cc;", 3848 Style); 3849 3850 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3851 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 3852 Style); 3853 3854 // Forced by comments. 3855 verifyFormat( 3856 "unsigned ContentSize =\n" 3857 " sizeof(int16_t) // DWARF ARange version number\n" 3858 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 3859 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 3860 " + sizeof(int8_t); // Segment Size (in bytes)"); 3861 3862 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 3863 " == boost::fusion::at_c<1>(iiii).second;", 3864 Style); 3865 3866 Style.ColumnLimit = 60; 3867 verifyFormat("zzzzzzzzzz\n" 3868 " = bbbbbbbbbbbbbbbbb\n" 3869 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 3870 Style); 3871 3872 Style.ColumnLimit = 80; 3873 Style.IndentWidth = 4; 3874 Style.TabWidth = 4; 3875 Style.UseTab = FormatStyle::UT_Always; 3876 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 3877 Style.AlignOperands = false; 3878 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 3879 "\t&& (someOtherLongishConditionPart1\n" 3880 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 3881 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);", 3882 Style)); 3883 } 3884 3885 TEST_F(FormatTest, EnforcedOperatorWraps) { 3886 // Here we'd like to wrap after the || operators, but a comment is forcing an 3887 // earlier wrap. 3888 verifyFormat("bool x = aaaaa //\n" 3889 " || bbbbb\n" 3890 " //\n" 3891 " || cccc;"); 3892 } 3893 3894 TEST_F(FormatTest, NoOperandAlignment) { 3895 FormatStyle Style = getLLVMStyle(); 3896 Style.AlignOperands = false; 3897 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 3898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3899 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 3900 Style); 3901 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 3902 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3903 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3904 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3905 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3906 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3907 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3908 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3909 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3910 " > ccccccccccccccccccccccccccccccccccccccccc;", 3911 Style); 3912 3913 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3914 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3915 " + cc;", 3916 Style); 3917 verifyFormat("int a = aa\n" 3918 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3919 " * cccccccccccccccccccccccccccccccccccc;\n", 3920 Style); 3921 3922 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 3923 verifyFormat("return (a > b\n" 3924 " // comment1\n" 3925 " // comment2\n" 3926 " || c);", 3927 Style); 3928 } 3929 3930 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 3931 FormatStyle Style = getLLVMStyle(); 3932 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 3933 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 3934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3935 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 3936 Style); 3937 } 3938 3939 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 3940 FormatStyle Style = getLLVMStyle(); 3941 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 3942 Style.BinPackArguments = false; 3943 Style.ColumnLimit = 40; 3944 verifyFormat("void test() {\n" 3945 " someFunction(\n" 3946 " this + argument + is + quite\n" 3947 " + long + so + it + gets + wrapped\n" 3948 " + but + remains + bin - packed);\n" 3949 "}", 3950 Style); 3951 verifyFormat("void test() {\n" 3952 " someFunction(arg1,\n" 3953 " this + argument + is\n" 3954 " + quite + long + so\n" 3955 " + it + gets + wrapped\n" 3956 " + but + remains + bin\n" 3957 " - packed,\n" 3958 " arg3);\n" 3959 "}", 3960 Style); 3961 verifyFormat("void test() {\n" 3962 " someFunction(\n" 3963 " arg1,\n" 3964 " this + argument + has\n" 3965 " + anotherFunc(nested,\n" 3966 " calls + whose\n" 3967 " + arguments\n" 3968 " + are + also\n" 3969 " + wrapped,\n" 3970 " in + addition)\n" 3971 " + to + being + bin - packed,\n" 3972 " arg3);\n" 3973 "}", 3974 Style); 3975 3976 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 3977 verifyFormat("void test() {\n" 3978 " someFunction(\n" 3979 " arg1,\n" 3980 " this + argument + has +\n" 3981 " anotherFunc(nested,\n" 3982 " calls + whose +\n" 3983 " arguments +\n" 3984 " are + also +\n" 3985 " wrapped,\n" 3986 " in + addition) +\n" 3987 " to + being + bin - packed,\n" 3988 " arg3);\n" 3989 "}", 3990 Style); 3991 } 3992 3993 TEST_F(FormatTest, ConstructorInitializers) { 3994 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 3995 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 3996 getLLVMStyleWithColumns(45)); 3997 verifyFormat("Constructor()\n" 3998 " : Inttializer(FitsOnTheLine) {}", 3999 getLLVMStyleWithColumns(44)); 4000 verifyFormat("Constructor()\n" 4001 " : Inttializer(FitsOnTheLine) {}", 4002 getLLVMStyleWithColumns(43)); 4003 4004 verifyFormat("template <typename T>\n" 4005 "Constructor() : Initializer(FitsOnTheLine) {}", 4006 getLLVMStyleWithColumns(45)); 4007 4008 verifyFormat( 4009 "SomeClass::Constructor()\n" 4010 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4011 4012 verifyFormat( 4013 "SomeClass::Constructor()\n" 4014 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4015 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4016 verifyFormat( 4017 "SomeClass::Constructor()\n" 4018 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4019 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4020 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4021 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4022 " : aaaaaaaaaa(aaaaaa) {}"); 4023 4024 verifyFormat("Constructor()\n" 4025 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4026 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4027 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4028 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4029 4030 verifyFormat("Constructor()\n" 4031 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4033 4034 verifyFormat("Constructor(int Parameter = 0)\n" 4035 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4036 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4037 verifyFormat("Constructor()\n" 4038 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4039 "}", 4040 getLLVMStyleWithColumns(60)); 4041 verifyFormat("Constructor()\n" 4042 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4043 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4044 4045 // Here a line could be saved by splitting the second initializer onto two 4046 // lines, but that is not desirable. 4047 verifyFormat("Constructor()\n" 4048 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4049 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4050 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4051 4052 FormatStyle OnePerLine = getLLVMStyle(); 4053 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4054 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4055 verifyFormat("SomeClass::Constructor()\n" 4056 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4057 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4058 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4059 OnePerLine); 4060 verifyFormat("SomeClass::Constructor()\n" 4061 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4062 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4063 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4064 OnePerLine); 4065 verifyFormat("MyClass::MyClass(int var)\n" 4066 " : some_var_(var), // 4 space indent\n" 4067 " some_other_var_(var + 1) { // lined up\n" 4068 "}", 4069 OnePerLine); 4070 verifyFormat("Constructor()\n" 4071 " : aaaaa(aaaaaa),\n" 4072 " aaaaa(aaaaaa),\n" 4073 " aaaaa(aaaaaa),\n" 4074 " aaaaa(aaaaaa),\n" 4075 " aaaaa(aaaaaa) {}", 4076 OnePerLine); 4077 verifyFormat("Constructor()\n" 4078 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4079 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4080 OnePerLine); 4081 OnePerLine.BinPackParameters = false; 4082 verifyFormat( 4083 "Constructor()\n" 4084 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4085 " aaaaaaaaaaa().aaa(),\n" 4086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4087 OnePerLine); 4088 OnePerLine.ColumnLimit = 60; 4089 verifyFormat("Constructor()\n" 4090 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4091 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4092 OnePerLine); 4093 4094 EXPECT_EQ("Constructor()\n" 4095 " : // Comment forcing unwanted break.\n" 4096 " aaaa(aaaa) {}", 4097 format("Constructor() :\n" 4098 " // Comment forcing unwanted break.\n" 4099 " aaaa(aaaa) {}")); 4100 } 4101 4102 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4103 FormatStyle Style = getLLVMStyle(); 4104 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4105 Style.ColumnLimit = 60; 4106 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4107 Style.AllowAllConstructorInitializersOnNextLine = true; 4108 Style.BinPackParameters = false; 4109 4110 for (int i = 0; i < 4; ++i) { 4111 // Test all combinations of parameters that should not have an effect. 4112 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4113 Style.AllowAllArgumentsOnNextLine = i & 2; 4114 4115 Style.AllowAllConstructorInitializersOnNextLine = true; 4116 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4117 verifyFormat("Constructor()\n" 4118 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4119 Style); 4120 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4121 4122 Style.AllowAllConstructorInitializersOnNextLine = false; 4123 verifyFormat("Constructor()\n" 4124 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4125 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4126 Style); 4127 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4128 4129 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4130 Style.AllowAllConstructorInitializersOnNextLine = true; 4131 verifyFormat("Constructor()\n" 4132 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4133 Style); 4134 4135 Style.AllowAllConstructorInitializersOnNextLine = false; 4136 verifyFormat("Constructor()\n" 4137 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4138 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4139 Style); 4140 4141 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4142 Style.AllowAllConstructorInitializersOnNextLine = true; 4143 verifyFormat("Constructor() :\n" 4144 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4145 Style); 4146 4147 Style.AllowAllConstructorInitializersOnNextLine = false; 4148 verifyFormat("Constructor() :\n" 4149 " aaaaaaaaaaaaaaaaaa(a),\n" 4150 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4151 Style); 4152 } 4153 4154 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4155 // AllowAllConstructorInitializersOnNextLine in all 4156 // BreakConstructorInitializers modes 4157 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4158 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4159 Style.AllowAllConstructorInitializersOnNextLine = false; 4160 verifyFormat("SomeClassWithALongName::Constructor(\n" 4161 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4162 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4163 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4164 Style); 4165 4166 Style.AllowAllConstructorInitializersOnNextLine = true; 4167 verifyFormat("SomeClassWithALongName::Constructor(\n" 4168 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4169 " int bbbbbbbbbbbbb,\n" 4170 " int cccccccccccccccc)\n" 4171 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4172 Style); 4173 4174 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4175 Style.AllowAllConstructorInitializersOnNextLine = false; 4176 verifyFormat("SomeClassWithALongName::Constructor(\n" 4177 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4178 " int bbbbbbbbbbbbb)\n" 4179 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4180 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4181 Style); 4182 4183 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4184 4185 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4186 verifyFormat("SomeClassWithALongName::Constructor(\n" 4187 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4188 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4189 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4190 Style); 4191 4192 Style.AllowAllConstructorInitializersOnNextLine = true; 4193 verifyFormat("SomeClassWithALongName::Constructor(\n" 4194 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4195 " int bbbbbbbbbbbbb,\n" 4196 " int cccccccccccccccc)\n" 4197 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4198 Style); 4199 4200 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4201 Style.AllowAllConstructorInitializersOnNextLine = false; 4202 verifyFormat("SomeClassWithALongName::Constructor(\n" 4203 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4204 " int bbbbbbbbbbbbb)\n" 4205 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4206 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4207 Style); 4208 4209 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4210 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4211 verifyFormat("SomeClassWithALongName::Constructor(\n" 4212 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4213 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4214 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4215 Style); 4216 4217 Style.AllowAllConstructorInitializersOnNextLine = true; 4218 verifyFormat("SomeClassWithALongName::Constructor(\n" 4219 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4220 " int bbbbbbbbbbbbb,\n" 4221 " int cccccccccccccccc) :\n" 4222 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4223 Style); 4224 4225 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4226 Style.AllowAllConstructorInitializersOnNextLine = false; 4227 verifyFormat("SomeClassWithALongName::Constructor(\n" 4228 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4229 " int bbbbbbbbbbbbb) :\n" 4230 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4231 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4232 Style); 4233 } 4234 4235 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4236 FormatStyle Style = getLLVMStyle(); 4237 Style.ColumnLimit = 60; 4238 Style.BinPackArguments = false; 4239 for (int i = 0; i < 4; ++i) { 4240 // Test all combinations of parameters that should not have an effect. 4241 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4242 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4243 4244 Style.AllowAllArgumentsOnNextLine = true; 4245 verifyFormat("void foo() {\n" 4246 " FunctionCallWithReallyLongName(\n" 4247 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4248 "}", 4249 Style); 4250 Style.AllowAllArgumentsOnNextLine = false; 4251 verifyFormat("void foo() {\n" 4252 " FunctionCallWithReallyLongName(\n" 4253 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4254 " bbbbbbbbbbbb);\n" 4255 "}", 4256 Style); 4257 4258 Style.AllowAllArgumentsOnNextLine = true; 4259 verifyFormat("void foo() {\n" 4260 " auto VariableWithReallyLongName = {\n" 4261 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4262 "}", 4263 Style); 4264 Style.AllowAllArgumentsOnNextLine = false; 4265 verifyFormat("void foo() {\n" 4266 " auto VariableWithReallyLongName = {\n" 4267 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4268 " bbbbbbbbbbbb};\n" 4269 "}", 4270 Style); 4271 } 4272 4273 // This parameter should not affect declarations. 4274 Style.BinPackParameters = false; 4275 Style.AllowAllArgumentsOnNextLine = false; 4276 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4277 verifyFormat("void FunctionCallWithReallyLongName(\n" 4278 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4279 Style); 4280 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4281 verifyFormat("void FunctionCallWithReallyLongName(\n" 4282 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4283 " int bbbbbbbbbbbb);", 4284 Style); 4285 } 4286 4287 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4288 FormatStyle Style = getLLVMStyle(); 4289 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4290 4291 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4292 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4293 getStyleWithColumns(Style, 45)); 4294 verifyFormat("Constructor() :\n" 4295 " Initializer(FitsOnTheLine) {}", 4296 getStyleWithColumns(Style, 44)); 4297 verifyFormat("Constructor() :\n" 4298 " Initializer(FitsOnTheLine) {}", 4299 getStyleWithColumns(Style, 43)); 4300 4301 verifyFormat("template <typename T>\n" 4302 "Constructor() : Initializer(FitsOnTheLine) {}", 4303 getStyleWithColumns(Style, 50)); 4304 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4305 verifyFormat( 4306 "SomeClass::Constructor() :\n" 4307 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4308 Style); 4309 4310 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4311 verifyFormat( 4312 "SomeClass::Constructor() :\n" 4313 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4314 Style); 4315 4316 verifyFormat( 4317 "SomeClass::Constructor() :\n" 4318 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4319 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4320 Style); 4321 verifyFormat( 4322 "SomeClass::Constructor() :\n" 4323 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4324 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4325 Style); 4326 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4327 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4328 " aaaaaaaaaa(aaaaaa) {}", 4329 Style); 4330 4331 verifyFormat("Constructor() :\n" 4332 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4333 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4334 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4335 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4336 Style); 4337 4338 verifyFormat("Constructor() :\n" 4339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4341 Style); 4342 4343 verifyFormat("Constructor(int Parameter = 0) :\n" 4344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4345 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4346 Style); 4347 verifyFormat("Constructor() :\n" 4348 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4349 "}", 4350 getStyleWithColumns(Style, 60)); 4351 verifyFormat("Constructor() :\n" 4352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4353 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4354 Style); 4355 4356 // Here a line could be saved by splitting the second initializer onto two 4357 // lines, but that is not desirable. 4358 verifyFormat("Constructor() :\n" 4359 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4360 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4361 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4362 Style); 4363 4364 FormatStyle OnePerLine = Style; 4365 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4366 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4367 verifyFormat("SomeClass::Constructor() :\n" 4368 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4369 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4370 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4371 OnePerLine); 4372 verifyFormat("SomeClass::Constructor() :\n" 4373 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4374 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4375 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4376 OnePerLine); 4377 verifyFormat("MyClass::MyClass(int var) :\n" 4378 " some_var_(var), // 4 space indent\n" 4379 " some_other_var_(var + 1) { // lined up\n" 4380 "}", 4381 OnePerLine); 4382 verifyFormat("Constructor() :\n" 4383 " aaaaa(aaaaaa),\n" 4384 " aaaaa(aaaaaa),\n" 4385 " aaaaa(aaaaaa),\n" 4386 " aaaaa(aaaaaa),\n" 4387 " aaaaa(aaaaaa) {}", 4388 OnePerLine); 4389 verifyFormat("Constructor() :\n" 4390 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4391 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4392 OnePerLine); 4393 OnePerLine.BinPackParameters = false; 4394 verifyFormat( 4395 "Constructor() :\n" 4396 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4397 " aaaaaaaaaaa().aaa(),\n" 4398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4399 OnePerLine); 4400 OnePerLine.ColumnLimit = 60; 4401 verifyFormat("Constructor() :\n" 4402 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4403 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4404 OnePerLine); 4405 4406 EXPECT_EQ("Constructor() :\n" 4407 " // Comment forcing unwanted break.\n" 4408 " aaaa(aaaa) {}", 4409 format("Constructor() :\n" 4410 " // Comment forcing unwanted break.\n" 4411 " aaaa(aaaa) {}", 4412 Style)); 4413 4414 Style.ColumnLimit = 0; 4415 verifyFormat("SomeClass::Constructor() :\n" 4416 " a(a) {}", 4417 Style); 4418 verifyFormat("SomeClass::Constructor() noexcept :\n" 4419 " a(a) {}", 4420 Style); 4421 verifyFormat("SomeClass::Constructor() :\n" 4422 " a(a), b(b), c(c) {}", 4423 Style); 4424 verifyFormat("SomeClass::Constructor() :\n" 4425 " a(a) {\n" 4426 " foo();\n" 4427 " bar();\n" 4428 "}", 4429 Style); 4430 4431 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4432 verifyFormat("SomeClass::Constructor() :\n" 4433 " a(a), b(b), c(c) {\n" 4434 "}", 4435 Style); 4436 verifyFormat("SomeClass::Constructor() :\n" 4437 " a(a) {\n" 4438 "}", 4439 Style); 4440 4441 Style.ColumnLimit = 80; 4442 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4443 Style.ConstructorInitializerIndentWidth = 2; 4444 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", 4445 Style); 4446 verifyFormat("SomeClass::Constructor() :\n" 4447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4448 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4449 Style); 4450 4451 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well 4452 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4453 verifyFormat("class SomeClass\n" 4454 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4455 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4456 Style); 4457 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4458 verifyFormat("class SomeClass\n" 4459 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4460 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4461 Style); 4462 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4463 verifyFormat("class SomeClass :\n" 4464 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4465 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4466 Style); 4467 } 4468 4469 #ifndef EXPENSIVE_CHECKS 4470 // Expensive checks enables libstdc++ checking which includes validating the 4471 // state of ranges used in std::priority_queue - this blows out the 4472 // runtime/scalability of the function and makes this test unacceptably slow. 4473 TEST_F(FormatTest, MemoizationTests) { 4474 // This breaks if the memoization lookup does not take \c Indent and 4475 // \c LastSpace into account. 4476 verifyFormat( 4477 "extern CFRunLoopTimerRef\n" 4478 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4479 " CFTimeInterval interval, CFOptionFlags flags,\n" 4480 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4481 " CFRunLoopTimerContext *context) {}"); 4482 4483 // Deep nesting somewhat works around our memoization. 4484 verifyFormat( 4485 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4486 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4487 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4488 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4489 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4490 getLLVMStyleWithColumns(65)); 4491 verifyFormat( 4492 "aaaaa(\n" 4493 " aaaaa,\n" 4494 " aaaaa(\n" 4495 " aaaaa,\n" 4496 " aaaaa(\n" 4497 " aaaaa,\n" 4498 " aaaaa(\n" 4499 " aaaaa,\n" 4500 " aaaaa(\n" 4501 " aaaaa,\n" 4502 " aaaaa(\n" 4503 " aaaaa,\n" 4504 " aaaaa(\n" 4505 " aaaaa,\n" 4506 " aaaaa(\n" 4507 " aaaaa,\n" 4508 " aaaaa(\n" 4509 " aaaaa,\n" 4510 " aaaaa(\n" 4511 " aaaaa,\n" 4512 " aaaaa(\n" 4513 " aaaaa,\n" 4514 " aaaaa(\n" 4515 " aaaaa,\n" 4516 " aaaaa))))))))))));", 4517 getLLVMStyleWithColumns(65)); 4518 verifyFormat( 4519 "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" 4520 " a),\n" 4521 " a),\n" 4522 " a),\n" 4523 " a),\n" 4524 " a),\n" 4525 " a),\n" 4526 " a),\n" 4527 " a),\n" 4528 " a),\n" 4529 " a),\n" 4530 " a),\n" 4531 " a),\n" 4532 " a),\n" 4533 " a),\n" 4534 " a),\n" 4535 " a),\n" 4536 " a)", 4537 getLLVMStyleWithColumns(65)); 4538 4539 // This test takes VERY long when memoization is broken. 4540 FormatStyle OnePerLine = getLLVMStyle(); 4541 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4542 OnePerLine.BinPackParameters = false; 4543 std::string input = "Constructor()\n" 4544 " : aaaa(a,\n"; 4545 for (unsigned i = 0, e = 80; i != e; ++i) { 4546 input += " a,\n"; 4547 } 4548 input += " a) {}"; 4549 verifyFormat(input, OnePerLine); 4550 } 4551 #endif 4552 4553 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4554 verifyFormat( 4555 "void f() {\n" 4556 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4557 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4558 " f();\n" 4559 "}"); 4560 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4561 " Intervals[i - 1].getRange().getLast()) {\n}"); 4562 } 4563 4564 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4565 // Principially, we break function declarations in a certain order: 4566 // 1) break amongst arguments. 4567 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 4568 " Cccccccccccccc cccccccccccccc);"); 4569 verifyFormat("template <class TemplateIt>\n" 4570 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 4571 " TemplateIt *stop) {}"); 4572 4573 // 2) break after return type. 4574 verifyFormat( 4575 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4576 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 4577 getGoogleStyle()); 4578 4579 // 3) break after (. 4580 verifyFormat( 4581 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 4582 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 4583 getGoogleStyle()); 4584 4585 // 4) break before after nested name specifiers. 4586 verifyFormat( 4587 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4588 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 4589 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 4590 getGoogleStyle()); 4591 4592 // However, there are exceptions, if a sufficient amount of lines can be 4593 // saved. 4594 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 4595 // more adjusting. 4596 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4597 " Cccccccccccccc cccccccccc,\n" 4598 " Cccccccccccccc cccccccccc,\n" 4599 " Cccccccccccccc cccccccccc,\n" 4600 " Cccccccccccccc cccccccccc);"); 4601 verifyFormat( 4602 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4603 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4604 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4605 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 4606 getGoogleStyle()); 4607 verifyFormat( 4608 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4609 " Cccccccccccccc cccccccccc,\n" 4610 " Cccccccccccccc cccccccccc,\n" 4611 " Cccccccccccccc cccccccccc,\n" 4612 " Cccccccccccccc cccccccccc,\n" 4613 " Cccccccccccccc cccccccccc,\n" 4614 " Cccccccccccccc cccccccccc);"); 4615 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4616 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4617 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4618 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4619 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 4620 4621 // Break after multi-line parameters. 4622 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4625 " bbbb bbbb);"); 4626 verifyFormat("void SomeLoooooooooooongFunction(\n" 4627 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 4628 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4629 " int bbbbbbbbbbbbb);"); 4630 4631 // Treat overloaded operators like other functions. 4632 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4633 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 4634 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4635 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 4636 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4637 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 4638 verifyGoogleFormat( 4639 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 4640 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4641 verifyGoogleFormat( 4642 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 4643 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4644 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4645 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4646 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 4647 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4648 verifyGoogleFormat( 4649 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 4650 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4651 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 4652 verifyGoogleFormat( 4653 "template <typename T>\n" 4654 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4655 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 4656 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 4657 4658 FormatStyle Style = getLLVMStyle(); 4659 Style.PointerAlignment = FormatStyle::PAS_Left; 4660 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4661 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 4662 Style); 4663 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 4664 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4665 Style); 4666 } 4667 4668 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 4669 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 4670 // Prefer keeping `::` followed by `operator` together. 4671 EXPECT_EQ("const aaaa::bbbbbbb &\n" 4672 "ccccccccc::operator++() {\n" 4673 " stuff();\n" 4674 "}", 4675 format("const aaaa::bbbbbbb\n" 4676 "&ccccccccc::operator++() { stuff(); }", 4677 getLLVMStyleWithColumns(40))); 4678 } 4679 4680 TEST_F(FormatTest, TrailingReturnType) { 4681 verifyFormat("auto foo() -> int;\n"); 4682 verifyFormat("struct S {\n" 4683 " auto bar() const -> int;\n" 4684 "};"); 4685 verifyFormat("template <size_t Order, typename T>\n" 4686 "auto load_img(const std::string &filename)\n" 4687 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 4688 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 4689 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 4690 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 4691 verifyFormat("template <typename T>\n" 4692 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 4693 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 4694 4695 // Not trailing return types. 4696 verifyFormat("void f() { auto a = b->c(); }"); 4697 } 4698 4699 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 4700 // Avoid breaking before trailing 'const' or other trailing annotations, if 4701 // they are not function-like. 4702 FormatStyle Style = getGoogleStyle(); 4703 Style.ColumnLimit = 47; 4704 verifyFormat("void someLongFunction(\n" 4705 " int someLoooooooooooooongParameter) const {\n}", 4706 getLLVMStyleWithColumns(47)); 4707 verifyFormat("LoooooongReturnType\n" 4708 "someLoooooooongFunction() const {}", 4709 getLLVMStyleWithColumns(47)); 4710 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 4711 " const {}", 4712 Style); 4713 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4714 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 4715 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4716 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 4717 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4718 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 4719 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 4720 " aaaaaaaaaaa aaaaa) const override;"); 4721 verifyGoogleFormat( 4722 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4723 " const override;"); 4724 4725 // Even if the first parameter has to be wrapped. 4726 verifyFormat("void someLongFunction(\n" 4727 " int someLongParameter) const {}", 4728 getLLVMStyleWithColumns(46)); 4729 verifyFormat("void someLongFunction(\n" 4730 " int someLongParameter) const {}", 4731 Style); 4732 verifyFormat("void someLongFunction(\n" 4733 " int someLongParameter) override {}", 4734 Style); 4735 verifyFormat("void someLongFunction(\n" 4736 " int someLongParameter) OVERRIDE {}", 4737 Style); 4738 verifyFormat("void someLongFunction(\n" 4739 " int someLongParameter) final {}", 4740 Style); 4741 verifyFormat("void someLongFunction(\n" 4742 " int someLongParameter) FINAL {}", 4743 Style); 4744 verifyFormat("void someLongFunction(\n" 4745 " int parameter) const override {}", 4746 Style); 4747 4748 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 4749 verifyFormat("void someLongFunction(\n" 4750 " int someLongParameter) const\n" 4751 "{\n" 4752 "}", 4753 Style); 4754 4755 // Unless these are unknown annotations. 4756 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 4757 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4758 " LONG_AND_UGLY_ANNOTATION;"); 4759 4760 // Breaking before function-like trailing annotations is fine to keep them 4761 // close to their arguments. 4762 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4763 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4764 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4765 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4766 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4767 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 4768 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 4769 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 4770 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 4771 4772 verifyFormat( 4773 "void aaaaaaaaaaaaaaaaaa()\n" 4774 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 4775 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 4776 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4777 " __attribute__((unused));"); 4778 verifyGoogleFormat( 4779 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4780 " GUARDED_BY(aaaaaaaaaaaa);"); 4781 verifyGoogleFormat( 4782 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4783 " GUARDED_BY(aaaaaaaaaaaa);"); 4784 verifyGoogleFormat( 4785 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4786 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4787 verifyGoogleFormat( 4788 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4789 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4790 } 4791 4792 TEST_F(FormatTest, FunctionAnnotations) { 4793 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4794 "int OldFunction(const string ¶meter) {}"); 4795 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4796 "string OldFunction(const string ¶meter) {}"); 4797 verifyFormat("template <typename T>\n" 4798 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4799 "string OldFunction(const string ¶meter) {}"); 4800 4801 // Not function annotations. 4802 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4803 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 4804 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 4805 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 4806 verifyFormat("MACRO(abc).function() // wrap\n" 4807 " << abc;"); 4808 verifyFormat("MACRO(abc)->function() // wrap\n" 4809 " << abc;"); 4810 verifyFormat("MACRO(abc)::function() // wrap\n" 4811 " << abc;"); 4812 } 4813 4814 TEST_F(FormatTest, BreaksDesireably) { 4815 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4816 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4817 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 4818 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4819 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 4820 "}"); 4821 4822 verifyFormat( 4823 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4824 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4825 4826 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4827 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4829 4830 verifyFormat( 4831 "aaaaaaaa(aaaaaaaaaaaaa,\n" 4832 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 4834 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4835 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 4836 4837 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4838 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4839 4840 verifyFormat( 4841 "void f() {\n" 4842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 4843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 4844 "}"); 4845 verifyFormat( 4846 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4847 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4848 verifyFormat( 4849 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4851 verifyFormat( 4852 "aaaaaa(aaa,\n" 4853 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4854 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4855 " aaaa);"); 4856 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4859 4860 // Indent consistently independent of call expression and unary operator. 4861 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4862 " dddddddddddddddddddddddddddddd));"); 4863 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4864 " dddddddddddddddddddddddddddddd));"); 4865 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 4866 " dddddddddddddddddddddddddddddd));"); 4867 4868 // This test case breaks on an incorrect memoization, i.e. an optimization not 4869 // taking into account the StopAt value. 4870 verifyFormat( 4871 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4872 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4873 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 4874 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4875 4876 verifyFormat("{\n {\n {\n" 4877 " Annotation.SpaceRequiredBefore =\n" 4878 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 4879 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 4880 " }\n }\n}"); 4881 4882 // Break on an outer level if there was a break on an inner level. 4883 EXPECT_EQ("f(g(h(a, // comment\n" 4884 " b, c),\n" 4885 " d, e),\n" 4886 " x, y);", 4887 format("f(g(h(a, // comment\n" 4888 " b, c), d, e), x, y);")); 4889 4890 // Prefer breaking similar line breaks. 4891 verifyFormat( 4892 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 4893 " NSTrackingMouseEnteredAndExited |\n" 4894 " NSTrackingActiveAlways;"); 4895 } 4896 4897 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 4898 FormatStyle NoBinPacking = getGoogleStyle(); 4899 NoBinPacking.BinPackParameters = false; 4900 NoBinPacking.BinPackArguments = true; 4901 verifyFormat("void f() {\n" 4902 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 4903 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 4904 "}", 4905 NoBinPacking); 4906 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 4907 " int aaaaaaaaaaaaaaaaaaaa,\n" 4908 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4909 NoBinPacking); 4910 4911 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 4912 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4913 " vector<int> bbbbbbbbbbbbbbb);", 4914 NoBinPacking); 4915 // FIXME: This behavior difference is probably not wanted. However, currently 4916 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 4917 // template arguments from BreakBeforeParameter being set because of the 4918 // one-per-line formatting. 4919 verifyFormat( 4920 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 4921 " aaaaaaaaaa> aaaaaaaaaa);", 4922 NoBinPacking); 4923 verifyFormat( 4924 "void fffffffffff(\n" 4925 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 4926 " aaaaaaaaaa);"); 4927 } 4928 4929 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 4930 FormatStyle NoBinPacking = getGoogleStyle(); 4931 NoBinPacking.BinPackParameters = false; 4932 NoBinPacking.BinPackArguments = false; 4933 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 4934 " aaaaaaaaaaaaaaaaaaaa,\n" 4935 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 4936 NoBinPacking); 4937 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 4938 " aaaaaaaaaaaaa,\n" 4939 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 4940 NoBinPacking); 4941 verifyFormat( 4942 "aaaaaaaa(aaaaaaaaaaaaa,\n" 4943 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 4945 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4946 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 4947 NoBinPacking); 4948 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 4949 " .aaaaaaaaaaaaaaaaaa();", 4950 NoBinPacking); 4951 verifyFormat("void f() {\n" 4952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4953 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 4954 "}", 4955 NoBinPacking); 4956 4957 verifyFormat( 4958 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4959 " aaaaaaaaaaaa,\n" 4960 " aaaaaaaaaaaa);", 4961 NoBinPacking); 4962 verifyFormat( 4963 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 4964 " ddddddddddddddddddddddddddddd),\n" 4965 " test);", 4966 NoBinPacking); 4967 4968 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 4969 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 4970 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 4971 " aaaaaaaaaaaaaaaaaa;", 4972 NoBinPacking); 4973 verifyFormat("a(\"a\"\n" 4974 " \"a\",\n" 4975 " a);"); 4976 4977 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 4978 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 4979 " aaaaaaaaa,\n" 4980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4981 NoBinPacking); 4982 verifyFormat( 4983 "void f() {\n" 4984 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 4985 " .aaaaaaa();\n" 4986 "}", 4987 NoBinPacking); 4988 verifyFormat( 4989 "template <class SomeType, class SomeOtherType>\n" 4990 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 4991 NoBinPacking); 4992 } 4993 4994 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 4995 FormatStyle Style = getLLVMStyleWithColumns(15); 4996 Style.ExperimentalAutoDetectBinPacking = true; 4997 EXPECT_EQ("aaa(aaaa,\n" 4998 " aaaa,\n" 4999 " aaaa);\n" 5000 "aaa(aaaa,\n" 5001 " aaaa,\n" 5002 " aaaa);", 5003 format("aaa(aaaa,\n" // one-per-line 5004 " aaaa,\n" 5005 " aaaa );\n" 5006 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5007 Style)); 5008 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5009 " aaaa);\n" 5010 "aaa(aaaa, aaaa,\n" 5011 " aaaa);", 5012 format("aaa(aaaa, aaaa,\n" // bin-packed 5013 " aaaa );\n" 5014 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5015 Style)); 5016 } 5017 5018 TEST_F(FormatTest, FormatsBuilderPattern) { 5019 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5020 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5021 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5022 " .StartsWith(\".init\", ORDER_INIT)\n" 5023 " .StartsWith(\".fini\", ORDER_FINI)\n" 5024 " .StartsWith(\".hash\", ORDER_HASH)\n" 5025 " .Default(ORDER_TEXT);\n"); 5026 5027 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5028 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5029 verifyFormat( 5030 "aaaaaaa->aaaaaaa\n" 5031 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5033 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5034 verifyFormat( 5035 "aaaaaaa->aaaaaaa\n" 5036 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5037 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5038 verifyFormat( 5039 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5040 " aaaaaaaaaaaaaa);"); 5041 verifyFormat( 5042 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5043 " aaaaaa->aaaaaaaaaaaa()\n" 5044 " ->aaaaaaaaaaaaaaaa(\n" 5045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5046 " ->aaaaaaaaaaaaaaaaa();"); 5047 verifyGoogleFormat( 5048 "void f() {\n" 5049 " someo->Add((new util::filetools::Handler(dir))\n" 5050 " ->OnEvent1(NewPermanentCallback(\n" 5051 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5052 " ->OnEvent2(NewPermanentCallback(\n" 5053 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5054 " ->OnEvent3(NewPermanentCallback(\n" 5055 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5056 " ->OnEvent5(NewPermanentCallback(\n" 5057 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5058 " ->OnEvent6(NewPermanentCallback(\n" 5059 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5060 "}"); 5061 5062 verifyFormat( 5063 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5064 verifyFormat("aaaaaaaaaaaaaaa()\n" 5065 " .aaaaaaaaaaaaaaa()\n" 5066 " .aaaaaaaaaaaaaaa()\n" 5067 " .aaaaaaaaaaaaaaa()\n" 5068 " .aaaaaaaaaaaaaaa();"); 5069 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5070 " .aaaaaaaaaaaaaaa()\n" 5071 " .aaaaaaaaaaaaaaa()\n" 5072 " .aaaaaaaaaaaaaaa();"); 5073 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5074 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5075 " .aaaaaaaaaaaaaaa();"); 5076 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5077 " ->aaaaaaaaaaaaaae(0)\n" 5078 " ->aaaaaaaaaaaaaaa();"); 5079 5080 // Don't linewrap after very short segments. 5081 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5082 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5083 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5084 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5085 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5086 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5087 verifyFormat("aaa()\n" 5088 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5089 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5090 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5091 5092 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5093 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5094 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5095 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5096 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5097 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5098 5099 // Prefer not to break after empty parentheses. 5100 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5101 " First->LastNewlineOffset);"); 5102 5103 // Prefer not to create "hanging" indents. 5104 verifyFormat( 5105 "return !soooooooooooooome_map\n" 5106 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5107 " .second;"); 5108 verifyFormat( 5109 "return aaaaaaaaaaaaaaaa\n" 5110 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5111 " .aaaa(aaaaaaaaaaaaaa);"); 5112 // No hanging indent here. 5113 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5115 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5117 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5118 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5119 getLLVMStyleWithColumns(60)); 5120 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5121 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5122 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5123 getLLVMStyleWithColumns(59)); 5124 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5126 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5127 5128 // Dont break if only closing statements before member call 5129 verifyFormat("test() {\n" 5130 " ([]() -> {\n" 5131 " int b = 32;\n" 5132 " return 3;\n" 5133 " }).foo();\n" 5134 "}"); 5135 verifyFormat("test() {\n" 5136 " (\n" 5137 " []() -> {\n" 5138 " int b = 32;\n" 5139 " return 3;\n" 5140 " },\n" 5141 " foo, bar)\n" 5142 " .foo();\n" 5143 "}"); 5144 verifyFormat("test() {\n" 5145 " ([]() -> {\n" 5146 " int b = 32;\n" 5147 " return 3;\n" 5148 " })\n" 5149 " .foo()\n" 5150 " .bar();\n" 5151 "}"); 5152 verifyFormat("test() {\n" 5153 " ([]() -> {\n" 5154 " int b = 32;\n" 5155 " return 3;\n" 5156 " })\n" 5157 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5158 " \"bbbb\");\n" 5159 "}", 5160 getLLVMStyleWithColumns(30)); 5161 } 5162 5163 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5164 verifyFormat( 5165 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5166 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5167 verifyFormat( 5168 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5169 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5170 5171 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5172 " ccccccccccccccccccccccccc) {\n}"); 5173 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5174 " ccccccccccccccccccccccccc) {\n}"); 5175 5176 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5177 " ccccccccccccccccccccccccc) {\n}"); 5178 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5179 " ccccccccccccccccccccccccc) {\n}"); 5180 5181 verifyFormat( 5182 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5183 " ccccccccccccccccccccccccc) {\n}"); 5184 verifyFormat( 5185 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5186 " ccccccccccccccccccccccccc) {\n}"); 5187 5188 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5189 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5190 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5191 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5192 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5193 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5194 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5195 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5196 5197 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5198 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5199 " aaaaaaaaaaaaaaa != aa) {\n}"); 5200 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5201 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5202 " aaaaaaaaaaaaaaa != aa) {\n}"); 5203 } 5204 5205 TEST_F(FormatTest, BreaksAfterAssignments) { 5206 verifyFormat( 5207 "unsigned Cost =\n" 5208 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5209 " SI->getPointerAddressSpaceee());\n"); 5210 verifyFormat( 5211 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5212 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5213 5214 verifyFormat( 5215 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5216 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5217 verifyFormat("unsigned OriginalStartColumn =\n" 5218 " SourceMgr.getSpellingColumnNumber(\n" 5219 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5220 " 1;"); 5221 } 5222 5223 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5224 FormatStyle Style = getLLVMStyle(); 5225 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5226 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5227 Style); 5228 5229 Style.PenaltyBreakAssignment = 20; 5230 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5231 " cccccccccccccccccccccccccc;", 5232 Style); 5233 } 5234 5235 TEST_F(FormatTest, AlignsAfterAssignments) { 5236 verifyFormat( 5237 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5238 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5239 verifyFormat( 5240 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5241 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5242 verifyFormat( 5243 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5244 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5245 verifyFormat( 5246 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5247 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5248 verifyFormat( 5249 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5250 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5251 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5252 } 5253 5254 TEST_F(FormatTest, AlignsAfterReturn) { 5255 verifyFormat( 5256 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5257 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5258 verifyFormat( 5259 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5260 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5261 verifyFormat( 5262 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5263 " aaaaaaaaaaaaaaaaaaaaaa();"); 5264 verifyFormat( 5265 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5266 " aaaaaaaaaaaaaaaaaaaaaa());"); 5267 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5269 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5271 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5272 verifyFormat("return\n" 5273 " // true if code is one of a or b.\n" 5274 " code == a || code == b;"); 5275 } 5276 5277 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5278 verifyFormat( 5279 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5280 " aaaaaaaaa aaaaaaa) {}"); 5281 verifyFormat( 5282 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5283 " aaaaaaaaaaa aaaaaaaaa);"); 5284 verifyFormat( 5285 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5286 " aaaaaaaaaaaaaaaaaaaaa));"); 5287 FormatStyle Style = getLLVMStyle(); 5288 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5289 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5290 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5291 Style); 5292 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5293 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5294 Style); 5295 verifyFormat("SomeLongVariableName->someFunction(\n" 5296 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5297 Style); 5298 verifyFormat( 5299 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5300 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5301 Style); 5302 verifyFormat( 5303 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5304 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5305 Style); 5306 verifyFormat( 5307 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5308 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5309 Style); 5310 5311 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5312 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5313 " b));", 5314 Style); 5315 5316 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5317 Style.BinPackArguments = false; 5318 Style.BinPackParameters = false; 5319 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5320 " aaaaaaaaaaa aaaaaaaa,\n" 5321 " aaaaaaaaa aaaaaaa,\n" 5322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5323 Style); 5324 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5325 " aaaaaaaaaaa aaaaaaaaa,\n" 5326 " aaaaaaaaaaa aaaaaaaaa,\n" 5327 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5328 Style); 5329 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5330 " aaaaaaaaaaaaaaa,\n" 5331 " aaaaaaaaaaaaaaaaaaaaa,\n" 5332 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5333 Style); 5334 verifyFormat( 5335 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5336 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5337 Style); 5338 verifyFormat( 5339 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5340 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5341 Style); 5342 verifyFormat( 5343 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5344 " aaaaaaaaaaaaaaaaaaaaa(\n" 5345 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5346 " aaaaaaaaaaaaaaaa);", 5347 Style); 5348 verifyFormat( 5349 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5350 " aaaaaaaaaaaaaaaaaaaaa(\n" 5351 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5352 " aaaaaaaaaaaaaaaa);", 5353 Style); 5354 } 5355 5356 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5357 FormatStyle Style = getLLVMStyleWithColumns(40); 5358 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5359 " bbbbbbbbbbbbbbbbbbbbbb);", 5360 Style); 5361 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5362 Style.AlignOperands = false; 5363 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5364 " bbbbbbbbbbbbbbbbbbbbbb);", 5365 Style); 5366 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5367 Style.AlignOperands = true; 5368 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5369 " bbbbbbbbbbbbbbbbbbbbbb);", 5370 Style); 5371 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5372 Style.AlignOperands = false; 5373 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5374 " bbbbbbbbbbbbbbbbbbbbbb);", 5375 Style); 5376 } 5377 5378 TEST_F(FormatTest, BreaksConditionalExpressions) { 5379 verifyFormat( 5380 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5381 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5382 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5383 verifyFormat( 5384 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5385 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5386 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5387 verifyFormat( 5388 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5389 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5390 verifyFormat( 5391 "aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5392 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5393 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5394 verifyFormat( 5395 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5396 " : aaaaaaaaaaaaa);"); 5397 verifyFormat( 5398 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5399 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5400 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5401 " aaaaaaaaaaaaa);"); 5402 verifyFormat( 5403 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5404 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5405 " aaaaaaaaaaaaa);"); 5406 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5407 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5408 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5409 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5411 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5413 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5415 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5417 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5418 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5419 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5420 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5421 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5422 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5423 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5424 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5425 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5426 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5428 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5429 " : aaaaaaaaaaaaaaaa;"); 5430 verifyFormat( 5431 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5432 " ? aaaaaaaaaaaaaaa\n" 5433 " : aaaaaaaaaaaaaaa;"); 5434 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5435 " aaaaaaaaa\n" 5436 " ? b\n" 5437 " : c);"); 5438 verifyFormat("return aaaa == bbbb\n" 5439 " // comment\n" 5440 " ? aaaa\n" 5441 " : bbbb;"); 5442 verifyFormat("unsigned Indent =\n" 5443 " format(TheLine.First,\n" 5444 " IndentForLevel[TheLine.Level] >= 0\n" 5445 " ? IndentForLevel[TheLine.Level]\n" 5446 " : TheLine * 2,\n" 5447 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5448 getLLVMStyleWithColumns(60)); 5449 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5450 " ? aaaaaaaaaaaaaaa\n" 5451 " : bbbbbbbbbbbbbbb //\n" 5452 " ? ccccccccccccccc\n" 5453 " : ddddddddddddddd;"); 5454 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5455 " ? aaaaaaaaaaaaaaa\n" 5456 " : (bbbbbbbbbbbbbbb //\n" 5457 " ? ccccccccccccccc\n" 5458 " : ddddddddddddddd);"); 5459 verifyFormat( 5460 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5461 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5462 " aaaaaaaaaaaaaaaaaaaaa +\n" 5463 " aaaaaaaaaaaaaaaaaaaaa\n" 5464 " : aaaaaaaaaa;"); 5465 verifyFormat( 5466 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5467 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5468 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5469 5470 FormatStyle NoBinPacking = getLLVMStyle(); 5471 NoBinPacking.BinPackArguments = false; 5472 verifyFormat( 5473 "void f() {\n" 5474 " g(aaa,\n" 5475 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5476 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5477 " ? aaaaaaaaaaaaaaa\n" 5478 " : aaaaaaaaaaaaaaa);\n" 5479 "}", 5480 NoBinPacking); 5481 verifyFormat( 5482 "void f() {\n" 5483 " g(aaa,\n" 5484 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5485 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5486 " ?: aaaaaaaaaaaaaaa);\n" 5487 "}", 5488 NoBinPacking); 5489 5490 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5491 " // comment.\n" 5492 " ccccccccccccccccccccccccccccccccccccccc\n" 5493 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5494 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5495 5496 // Assignments in conditional expressions. Apparently not uncommon :-(. 5497 verifyFormat("return a != b\n" 5498 " // comment\n" 5499 " ? a = b\n" 5500 " : a = b;"); 5501 verifyFormat("return a != b\n" 5502 " // comment\n" 5503 " ? a = a != b\n" 5504 " // comment\n" 5505 " ? a = b\n" 5506 " : a\n" 5507 " : a;\n"); 5508 verifyFormat("return a != b\n" 5509 " // comment\n" 5510 " ? a\n" 5511 " : a = a != b\n" 5512 " // comment\n" 5513 " ? a = b\n" 5514 " : a;"); 5515 } 5516 5517 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5518 FormatStyle Style = getLLVMStyle(); 5519 Style.BreakBeforeTernaryOperators = false; 5520 Style.ColumnLimit = 70; 5521 verifyFormat( 5522 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5524 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5525 Style); 5526 verifyFormat( 5527 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5528 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5529 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5530 Style); 5531 verifyFormat( 5532 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5533 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5534 Style); 5535 verifyFormat( 5536 "aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5537 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5539 Style); 5540 verifyFormat( 5541 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 5542 " aaaaaaaaaaaaa);", 5543 Style); 5544 verifyFormat( 5545 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5546 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5548 " aaaaaaaaaaaaa);", 5549 Style); 5550 verifyFormat( 5551 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5552 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5553 " aaaaaaaaaaaaa);", 5554 Style); 5555 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5557 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5558 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5559 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5560 Style); 5561 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5562 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5563 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5565 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5566 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5567 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5568 Style); 5569 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 5571 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5573 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5574 Style); 5575 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5576 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5577 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5578 Style); 5579 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5581 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5582 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5583 Style); 5584 verifyFormat( 5585 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5586 " aaaaaaaaaaaaaaa :\n" 5587 " aaaaaaaaaaaaaaa;", 5588 Style); 5589 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5590 " aaaaaaaaa ?\n" 5591 " b :\n" 5592 " c);", 5593 Style); 5594 verifyFormat("unsigned Indent =\n" 5595 " format(TheLine.First,\n" 5596 " IndentForLevel[TheLine.Level] >= 0 ?\n" 5597 " IndentForLevel[TheLine.Level] :\n" 5598 " TheLine * 2,\n" 5599 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5600 Style); 5601 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5602 " aaaaaaaaaaaaaaa :\n" 5603 " bbbbbbbbbbbbbbb ? //\n" 5604 " ccccccccccccccc :\n" 5605 " ddddddddddddddd;", 5606 Style); 5607 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5608 " aaaaaaaaaaaaaaa :\n" 5609 " (bbbbbbbbbbbbbbb ? //\n" 5610 " ccccccccccccccc :\n" 5611 " ddddddddddddddd);", 5612 Style); 5613 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5614 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 5615 " ccccccccccccccccccccccccccc;", 5616 Style); 5617 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5618 " aaaaa :\n" 5619 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 5620 Style); 5621 } 5622 5623 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 5624 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 5625 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 5626 verifyFormat("bool a = true, b = false;"); 5627 5628 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5629 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 5630 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 5631 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 5632 verifyFormat( 5633 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 5634 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 5635 " d = e && f;"); 5636 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 5637 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 5638 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5639 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 5640 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 5641 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 5642 5643 FormatStyle Style = getGoogleStyle(); 5644 Style.PointerAlignment = FormatStyle::PAS_Left; 5645 Style.DerivePointerAlignment = false; 5646 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5647 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 5648 " *b = bbbbbbbbbbbbbbbbbbb;", 5649 Style); 5650 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5651 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 5652 Style); 5653 verifyFormat("vector<int*> a, b;", Style); 5654 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 5655 } 5656 5657 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 5658 verifyFormat("arr[foo ? bar : baz];"); 5659 verifyFormat("f()[foo ? bar : baz];"); 5660 verifyFormat("(a + b)[foo ? bar : baz];"); 5661 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 5662 } 5663 5664 TEST_F(FormatTest, AlignsStringLiterals) { 5665 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 5666 " \"short literal\");"); 5667 verifyFormat( 5668 "looooooooooooooooooooooooongFunction(\n" 5669 " \"short literal\"\n" 5670 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 5671 verifyFormat("someFunction(\"Always break between multi-line\"\n" 5672 " \" string literals\",\n" 5673 " and, other, parameters);"); 5674 EXPECT_EQ("fun + \"1243\" /* comment */\n" 5675 " \"5678\";", 5676 format("fun + \"1243\" /* comment */\n" 5677 " \"5678\";", 5678 getLLVMStyleWithColumns(28))); 5679 EXPECT_EQ( 5680 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 5681 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 5682 " \"aaaaaaaaaaaaaaaa\";", 5683 format("aaaaaa =" 5684 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 5685 "aaaaaaaaaaaaaaaaaaaaa\" " 5686 "\"aaaaaaaaaaaaaaaa\";")); 5687 verifyFormat("a = a + \"a\"\n" 5688 " \"a\"\n" 5689 " \"a\";"); 5690 verifyFormat("f(\"a\", \"b\"\n" 5691 " \"c\");"); 5692 5693 verifyFormat( 5694 "#define LL_FORMAT \"ll\"\n" 5695 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 5696 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 5697 5698 verifyFormat("#define A(X) \\\n" 5699 " \"aaaaa\" #X \"bbbbbb\" \\\n" 5700 " \"ccccc\"", 5701 getLLVMStyleWithColumns(23)); 5702 verifyFormat("#define A \"def\"\n" 5703 "f(\"abc\" A \"ghi\"\n" 5704 " \"jkl\");"); 5705 5706 verifyFormat("f(L\"a\"\n" 5707 " L\"b\");"); 5708 verifyFormat("#define A(X) \\\n" 5709 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 5710 " L\"ccccc\"", 5711 getLLVMStyleWithColumns(25)); 5712 5713 verifyFormat("f(@\"a\"\n" 5714 " @\"b\");"); 5715 verifyFormat("NSString s = @\"a\"\n" 5716 " @\"b\"\n" 5717 " @\"c\";"); 5718 verifyFormat("NSString s = @\"a\"\n" 5719 " \"b\"\n" 5720 " \"c\";"); 5721 } 5722 5723 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 5724 FormatStyle Style = getLLVMStyle(); 5725 // No declarations or definitions should be moved to own line. 5726 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 5727 verifyFormat("class A {\n" 5728 " int f() { return 1; }\n" 5729 " int g();\n" 5730 "};\n" 5731 "int f() { return 1; }\n" 5732 "int g();\n", 5733 Style); 5734 5735 // All declarations and definitions should have the return type moved to its 5736 // own 5737 // line. 5738 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 5739 verifyFormat("class E {\n" 5740 " int\n" 5741 " f() {\n" 5742 " return 1;\n" 5743 " }\n" 5744 " int\n" 5745 " g();\n" 5746 "};\n" 5747 "int\n" 5748 "f() {\n" 5749 " return 1;\n" 5750 "}\n" 5751 "int\n" 5752 "g();\n", 5753 Style); 5754 5755 // Top-level definitions, and no kinds of declarations should have the 5756 // return type moved to its own line. 5757 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 5758 verifyFormat("class B {\n" 5759 " int f() { return 1; }\n" 5760 " int g();\n" 5761 "};\n" 5762 "int\n" 5763 "f() {\n" 5764 " return 1;\n" 5765 "}\n" 5766 "int g();\n", 5767 Style); 5768 5769 // Top-level definitions and declarations should have the return type moved 5770 // to its own line. 5771 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 5772 verifyFormat("class C {\n" 5773 " int f() { return 1; }\n" 5774 " int g();\n" 5775 "};\n" 5776 "int\n" 5777 "f() {\n" 5778 " return 1;\n" 5779 "}\n" 5780 "int\n" 5781 "g();\n", 5782 Style); 5783 5784 // All definitions should have the return type moved to its own line, but no 5785 // kinds of declarations. 5786 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 5787 verifyFormat("class D {\n" 5788 " int\n" 5789 " f() {\n" 5790 " return 1;\n" 5791 " }\n" 5792 " int g();\n" 5793 "};\n" 5794 "int\n" 5795 "f() {\n" 5796 " return 1;\n" 5797 "}\n" 5798 "int g();\n", 5799 Style); 5800 verifyFormat("const char *\n" 5801 "f(void) {\n" // Break here. 5802 " return \"\";\n" 5803 "}\n" 5804 "const char *bar(void);\n", // No break here. 5805 Style); 5806 verifyFormat("template <class T>\n" 5807 "T *\n" 5808 "f(T &c) {\n" // Break here. 5809 " return NULL;\n" 5810 "}\n" 5811 "template <class T> T *f(T &c);\n", // No break here. 5812 Style); 5813 verifyFormat("class C {\n" 5814 " int\n" 5815 " operator+() {\n" 5816 " return 1;\n" 5817 " }\n" 5818 " int\n" 5819 " operator()() {\n" 5820 " return 1;\n" 5821 " }\n" 5822 "};\n", 5823 Style); 5824 verifyFormat("void\n" 5825 "A::operator()() {}\n" 5826 "void\n" 5827 "A::operator>>() {}\n" 5828 "void\n" 5829 "A::operator+() {}\n", 5830 Style); 5831 verifyFormat("void *operator new(std::size_t s);", // No break here. 5832 Style); 5833 verifyFormat("void *\n" 5834 "operator new(std::size_t s) {}", 5835 Style); 5836 verifyFormat("void *\n" 5837 "operator delete[](void *ptr) {}", 5838 Style); 5839 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 5840 verifyFormat("const char *\n" 5841 "f(void)\n" // Break here. 5842 "{\n" 5843 " return \"\";\n" 5844 "}\n" 5845 "const char *bar(void);\n", // No break here. 5846 Style); 5847 verifyFormat("template <class T>\n" 5848 "T *\n" // Problem here: no line break 5849 "f(T &c)\n" // Break here. 5850 "{\n" 5851 " return NULL;\n" 5852 "}\n" 5853 "template <class T> T *f(T &c);\n", // No break here. 5854 Style); 5855 verifyFormat("int\n" 5856 "foo(A<bool> a)\n" 5857 "{\n" 5858 " return a;\n" 5859 "}\n", 5860 Style); 5861 verifyFormat("int\n" 5862 "foo(A<8> a)\n" 5863 "{\n" 5864 " return a;\n" 5865 "}\n", 5866 Style); 5867 verifyFormat("int\n" 5868 "foo(A<B<bool>, 8> a)\n" 5869 "{\n" 5870 " return a;\n" 5871 "}\n", 5872 Style); 5873 verifyFormat("int\n" 5874 "foo(A<B<8>, bool> a)\n" 5875 "{\n" 5876 " return a;\n" 5877 "}\n", 5878 Style); 5879 verifyFormat("int\n" 5880 "foo(A<B<bool>, bool> a)\n" 5881 "{\n" 5882 " return a;\n" 5883 "}\n", 5884 Style); 5885 verifyFormat("int\n" 5886 "foo(A<B<8>, 8> a)\n" 5887 "{\n" 5888 " return a;\n" 5889 "}\n", 5890 Style); 5891 5892 Style = getGNUStyle(); 5893 5894 // Test for comments at the end of function declarations. 5895 verifyFormat("void\n" 5896 "foo (int a, /*abc*/ int b) // def\n" 5897 "{\n" 5898 "}\n", 5899 Style); 5900 5901 verifyFormat("void\n" 5902 "foo (int a, /* abc */ int b) /* def */\n" 5903 "{\n" 5904 "}\n", 5905 Style); 5906 5907 // Definitions that should not break after return type 5908 verifyFormat("void foo (int a, int b); // def\n", Style); 5909 verifyFormat("void foo (int a, int b); /* def */\n", Style); 5910 verifyFormat("void foo (int a, int b);\n", Style); 5911 } 5912 5913 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 5914 FormatStyle NoBreak = getLLVMStyle(); 5915 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 5916 FormatStyle Break = getLLVMStyle(); 5917 Break.AlwaysBreakBeforeMultilineStrings = true; 5918 verifyFormat("aaaa = \"bbbb\"\n" 5919 " \"cccc\";", 5920 NoBreak); 5921 verifyFormat("aaaa =\n" 5922 " \"bbbb\"\n" 5923 " \"cccc\";", 5924 Break); 5925 verifyFormat("aaaa(\"bbbb\"\n" 5926 " \"cccc\");", 5927 NoBreak); 5928 verifyFormat("aaaa(\n" 5929 " \"bbbb\"\n" 5930 " \"cccc\");", 5931 Break); 5932 verifyFormat("aaaa(qqq, \"bbbb\"\n" 5933 " \"cccc\");", 5934 NoBreak); 5935 verifyFormat("aaaa(qqq,\n" 5936 " \"bbbb\"\n" 5937 " \"cccc\");", 5938 Break); 5939 verifyFormat("aaaa(qqq,\n" 5940 " L\"bbbb\"\n" 5941 " L\"cccc\");", 5942 Break); 5943 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 5944 " \"bbbb\"));", 5945 Break); 5946 verifyFormat("string s = someFunction(\n" 5947 " \"abc\"\n" 5948 " \"abc\");", 5949 Break); 5950 5951 // As we break before unary operators, breaking right after them is bad. 5952 verifyFormat("string foo = abc ? \"x\"\n" 5953 " \"blah blah blah blah blah blah\"\n" 5954 " : \"y\";", 5955 Break); 5956 5957 // Don't break if there is no column gain. 5958 verifyFormat("f(\"aaaa\"\n" 5959 " \"bbbb\");", 5960 Break); 5961 5962 // Treat literals with escaped newlines like multi-line string literals. 5963 EXPECT_EQ("x = \"a\\\n" 5964 "b\\\n" 5965 "c\";", 5966 format("x = \"a\\\n" 5967 "b\\\n" 5968 "c\";", 5969 NoBreak)); 5970 EXPECT_EQ("xxxx =\n" 5971 " \"a\\\n" 5972 "b\\\n" 5973 "c\";", 5974 format("xxxx = \"a\\\n" 5975 "b\\\n" 5976 "c\";", 5977 Break)); 5978 5979 EXPECT_EQ("NSString *const kString =\n" 5980 " @\"aaaa\"\n" 5981 " @\"bbbb\";", 5982 format("NSString *const kString = @\"aaaa\"\n" 5983 "@\"bbbb\";", 5984 Break)); 5985 5986 Break.ColumnLimit = 0; 5987 verifyFormat("const char *hello = \"hello llvm\";", Break); 5988 } 5989 5990 TEST_F(FormatTest, AlignsPipes) { 5991 verifyFormat( 5992 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5993 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5994 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5995 verifyFormat( 5996 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 5997 " << aaaaaaaaaaaaaaaaaaaa;"); 5998 verifyFormat( 5999 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6000 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6001 verifyFormat( 6002 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6003 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6004 verifyFormat( 6005 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6006 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6007 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6008 verifyFormat( 6009 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6010 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6011 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6012 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6013 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6015 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6016 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6017 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6018 verifyFormat( 6019 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6020 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6021 verifyFormat( 6022 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6023 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6024 6025 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6026 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6027 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6029 " aaaaaaaaaaaaaaaaaaaaa)\n" 6030 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6031 verifyFormat("LOG_IF(aaa == //\n" 6032 " bbb)\n" 6033 " << a << b;"); 6034 6035 // But sometimes, breaking before the first "<<" is desirable. 6036 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6037 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6038 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6039 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6040 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6041 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6042 " << BEF << IsTemplate << Description << E->getType();"); 6043 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6044 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6046 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6047 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6049 " << aaa;"); 6050 6051 verifyFormat( 6052 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6053 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6054 6055 // Incomplete string literal. 6056 EXPECT_EQ("llvm::errs() << \"\n" 6057 " << a;", 6058 format("llvm::errs() << \"\n<<a;")); 6059 6060 verifyFormat("void f() {\n" 6061 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6062 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6063 "}"); 6064 6065 // Handle 'endl'. 6066 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6067 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6068 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6069 6070 // Handle '\n'. 6071 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6072 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6073 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6074 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6075 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6076 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6077 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6078 } 6079 6080 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6081 verifyFormat("return out << \"somepacket = {\\n\"\n" 6082 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6083 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6084 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6085 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6086 " << \"}\";"); 6087 6088 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6089 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6090 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6091 verifyFormat( 6092 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6093 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6094 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6095 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6096 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6097 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6098 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6099 verifyFormat( 6100 "void f() {\n" 6101 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6102 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6103 "}"); 6104 6105 // Breaking before the first "<<" is generally not desirable. 6106 verifyFormat( 6107 "llvm::errs()\n" 6108 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6109 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6110 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6111 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6112 getLLVMStyleWithColumns(70)); 6113 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6114 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6115 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6116 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6117 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6118 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6119 getLLVMStyleWithColumns(70)); 6120 6121 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6122 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6123 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6124 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6125 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6126 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6127 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6128 " (aaaa + aaaa);", 6129 getLLVMStyleWithColumns(40)); 6130 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6131 " (aaaaaaa + aaaaa));", 6132 getLLVMStyleWithColumns(40)); 6133 verifyFormat( 6134 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6135 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6136 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6137 } 6138 6139 TEST_F(FormatTest, UnderstandsEquals) { 6140 verifyFormat( 6141 "aaaaaaaaaaaaaaaaa =\n" 6142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6143 verifyFormat( 6144 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6146 verifyFormat( 6147 "if (a) {\n" 6148 " f();\n" 6149 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6151 "}"); 6152 6153 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6154 " 100000000 + 10000000) {\n}"); 6155 } 6156 6157 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6158 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6159 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6160 6161 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6162 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6163 6164 verifyFormat( 6165 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6166 " Parameter2);"); 6167 6168 verifyFormat( 6169 "ShortObject->shortFunction(\n" 6170 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6171 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6172 6173 verifyFormat("loooooooooooooongFunction(\n" 6174 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6175 6176 verifyFormat( 6177 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6178 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6179 6180 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6181 " .WillRepeatedly(Return(SomeValue));"); 6182 verifyFormat("void f() {\n" 6183 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6184 " .Times(2)\n" 6185 " .WillRepeatedly(Return(SomeValue));\n" 6186 "}"); 6187 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6188 " ccccccccccccccccccccccc);"); 6189 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6191 " .aaaaa(aaaaa),\n" 6192 " aaaaaaaaaaaaaaaaaaaaa);"); 6193 verifyFormat("void f() {\n" 6194 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6195 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6196 "}"); 6197 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6199 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6200 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6201 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6202 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6203 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6204 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6205 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6206 "}"); 6207 6208 // Here, it is not necessary to wrap at "." or "->". 6209 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6210 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6211 verifyFormat( 6212 "aaaaaaaaaaa->aaaaaaaaa(\n" 6213 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6214 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6215 6216 verifyFormat( 6217 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6219 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6220 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6221 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6222 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6223 6224 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6226 " .a();"); 6227 6228 FormatStyle NoBinPacking = getLLVMStyle(); 6229 NoBinPacking.BinPackParameters = false; 6230 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6231 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6232 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6233 " aaaaaaaaaaaaaaaaaaa,\n" 6234 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6235 NoBinPacking); 6236 6237 // If there is a subsequent call, change to hanging indentation. 6238 verifyFormat( 6239 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6240 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6241 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6242 verifyFormat( 6243 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6244 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6245 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6247 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6248 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6250 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6251 } 6252 6253 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6254 verifyFormat("template <typename T>\n" 6255 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6256 verifyFormat("template <typename T>\n" 6257 "// T should be one of {A, B}.\n" 6258 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6259 verifyFormat( 6260 "template <typename T>\n" 6261 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6262 verifyFormat("template <typename T>\n" 6263 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6264 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6265 verifyFormat( 6266 "template <typename T>\n" 6267 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6268 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6269 verifyFormat( 6270 "template <typename T>\n" 6271 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6272 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6274 verifyFormat("template <typename T>\n" 6275 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6276 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6277 verifyFormat( 6278 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6279 " typename T4 = char>\n" 6280 "void f();"); 6281 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6282 " template <typename> class cccccccccccccccccccccc,\n" 6283 " typename ddddddddddddd>\n" 6284 "class C {};"); 6285 verifyFormat( 6286 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6288 6289 verifyFormat("void f() {\n" 6290 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6291 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6292 "}"); 6293 6294 verifyFormat("template <typename T> class C {};"); 6295 verifyFormat("template <typename T> void f();"); 6296 verifyFormat("template <typename T> void f() {}"); 6297 verifyFormat( 6298 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6301 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6304 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6305 getLLVMStyleWithColumns(72)); 6306 EXPECT_EQ("static_cast<A< //\n" 6307 " B> *>(\n" 6308 "\n" 6309 ");", 6310 format("static_cast<A<//\n" 6311 " B>*>(\n" 6312 "\n" 6313 " );")); 6314 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6315 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6316 6317 FormatStyle AlwaysBreak = getLLVMStyle(); 6318 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6319 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6320 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6321 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6322 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6323 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6324 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6325 verifyFormat("template <template <typename> class Fooooooo,\n" 6326 " template <typename> class Baaaaaaar>\n" 6327 "struct C {};", 6328 AlwaysBreak); 6329 verifyFormat("template <typename T> // T can be A, B or C.\n" 6330 "struct C {};", 6331 AlwaysBreak); 6332 verifyFormat("template <enum E> class A {\n" 6333 "public:\n" 6334 " E *f();\n" 6335 "};"); 6336 6337 FormatStyle NeverBreak = getLLVMStyle(); 6338 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6339 verifyFormat("template <typename T> class C {};", NeverBreak); 6340 verifyFormat("template <typename T> void f();", NeverBreak); 6341 verifyFormat("template <typename T> void f() {}", NeverBreak); 6342 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}", 6343 NeverBreak); 6344 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6345 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6346 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6347 NeverBreak); 6348 verifyFormat("template <template <typename> class Fooooooo,\n" 6349 " template <typename> class Baaaaaaar>\n" 6350 "struct C {};", 6351 NeverBreak); 6352 verifyFormat("template <typename T> // T can be A, B or C.\n" 6353 "struct C {};", 6354 NeverBreak); 6355 verifyFormat("template <enum E> class A {\n" 6356 "public:\n" 6357 " E *f();\n" 6358 "};", NeverBreak); 6359 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6360 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}", 6361 NeverBreak); 6362 } 6363 6364 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6365 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6366 Style.ColumnLimit = 60; 6367 EXPECT_EQ("// Baseline - no comments.\n" 6368 "template <\n" 6369 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6370 "void f() {}", 6371 format("// Baseline - no comments.\n" 6372 "template <\n" 6373 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6374 "void f() {}", 6375 Style)); 6376 6377 EXPECT_EQ("template <\n" 6378 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6379 "void f() {}", 6380 format("template <\n" 6381 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6382 "void f() {}", 6383 Style)); 6384 6385 EXPECT_EQ( 6386 "template <\n" 6387 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6388 "void f() {}", 6389 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6390 "void f() {}", 6391 Style)); 6392 6393 EXPECT_EQ( 6394 "template <\n" 6395 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6396 " // multiline\n" 6397 "void f() {}", 6398 format("template <\n" 6399 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6400 " // multiline\n" 6401 "void f() {}", 6402 Style)); 6403 6404 EXPECT_EQ( 6405 "template <typename aaaaaaaaaa<\n" 6406 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6407 "void f() {}", 6408 format( 6409 "template <\n" 6410 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6411 "void f() {}", 6412 Style)); 6413 } 6414 6415 TEST_F(FormatTest, WrapsTemplateParameters) { 6416 FormatStyle Style = getLLVMStyle(); 6417 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6418 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6419 verifyFormat( 6420 "template <typename... a> struct q {};\n" 6421 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6422 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6423 " y;", 6424 Style); 6425 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6426 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6427 verifyFormat( 6428 "template <typename... a> struct r {};\n" 6429 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6430 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6431 " y;", 6432 Style); 6433 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6434 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6435 verifyFormat( 6436 "template <typename... a> struct s {};\n" 6437 "extern s<\n" 6438 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 6439 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 6440 " y;", 6441 Style); 6442 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6443 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6444 verifyFormat( 6445 "template <typename... a> struct t {};\n" 6446 "extern t<\n" 6447 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 6448 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n" 6449 " y;", 6450 Style); 6451 } 6452 6453 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6454 verifyFormat( 6455 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6457 verifyFormat( 6458 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6461 6462 // FIXME: Should we have the extra indent after the second break? 6463 verifyFormat( 6464 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6466 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6467 6468 verifyFormat( 6469 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6470 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6471 6472 // Breaking at nested name specifiers is generally not desirable. 6473 verifyFormat( 6474 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6475 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6476 6477 verifyFormat( 6478 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 6479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6481 " aaaaaaaaaaaaaaaaaaaaa);", 6482 getLLVMStyleWithColumns(74)); 6483 6484 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6485 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6486 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6487 } 6488 6489 TEST_F(FormatTest, UnderstandsTemplateParameters) { 6490 verifyFormat("A<int> a;"); 6491 verifyFormat("A<A<A<int>>> a;"); 6492 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 6493 verifyFormat("bool x = a < 1 || 2 > a;"); 6494 verifyFormat("bool x = 5 < f<int>();"); 6495 verifyFormat("bool x = f<int>() > 5;"); 6496 verifyFormat("bool x = 5 < a<int>::x;"); 6497 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 6498 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 6499 6500 verifyGoogleFormat("A<A<int>> a;"); 6501 verifyGoogleFormat("A<A<A<int>>> a;"); 6502 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 6503 verifyGoogleFormat("A<A<int> > a;"); 6504 verifyGoogleFormat("A<A<A<int> > > a;"); 6505 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 6506 verifyGoogleFormat("A<::A<int>> a;"); 6507 verifyGoogleFormat("A<::A> a;"); 6508 verifyGoogleFormat("A< ::A> a;"); 6509 verifyGoogleFormat("A< ::A<int> > a;"); 6510 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 6511 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 6512 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 6513 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 6514 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 6515 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 6516 6517 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 6518 6519 verifyFormat("test >> a >> b;"); 6520 verifyFormat("test << a >> b;"); 6521 6522 verifyFormat("f<int>();"); 6523 verifyFormat("template <typename T> void f() {}"); 6524 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 6525 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 6526 "sizeof(char)>::type>;"); 6527 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 6528 verifyFormat("f(a.operator()<A>());"); 6529 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6530 " .template operator()<A>());", 6531 getLLVMStyleWithColumns(35)); 6532 6533 // Not template parameters. 6534 verifyFormat("return a < b && c > d;"); 6535 verifyFormat("void f() {\n" 6536 " while (a < b && c > d) {\n" 6537 " }\n" 6538 "}"); 6539 verifyFormat("template <typename... Types>\n" 6540 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 6541 6542 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 6544 getLLVMStyleWithColumns(60)); 6545 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 6546 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 6547 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 6548 } 6549 6550 TEST_F(FormatTest, BitshiftOperatorWidth) { 6551 EXPECT_EQ("int a = 1 << 2; /* foo\n" 6552 " bar */", 6553 format("int a=1<<2; /* foo\n" 6554 " bar */")); 6555 6556 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 6557 " bar */", 6558 format("int b =256>>1 ; /* foo\n" 6559 " bar */")); 6560 } 6561 6562 TEST_F(FormatTest, UnderstandsBinaryOperators) { 6563 verifyFormat("COMPARE(a, ==, b);"); 6564 verifyFormat("auto s = sizeof...(Ts) - 1;"); 6565 } 6566 6567 TEST_F(FormatTest, UnderstandsPointersToMembers) { 6568 verifyFormat("int A::*x;"); 6569 verifyFormat("int (S::*func)(void *);"); 6570 verifyFormat("void f() { int (S::*func)(void *); }"); 6571 verifyFormat("typedef bool *(Class::*Member)() const;"); 6572 verifyFormat("void f() {\n" 6573 " (a->*f)();\n" 6574 " a->*x;\n" 6575 " (a.*f)();\n" 6576 " ((*a).*f)();\n" 6577 " a.*x;\n" 6578 "}"); 6579 verifyFormat("void f() {\n" 6580 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 6581 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 6582 "}"); 6583 verifyFormat( 6584 "(aaaaaaaaaa->*bbbbbbb)(\n" 6585 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6586 FormatStyle Style = getLLVMStyle(); 6587 Style.PointerAlignment = FormatStyle::PAS_Left; 6588 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 6589 } 6590 6591 TEST_F(FormatTest, UnderstandsUnaryOperators) { 6592 verifyFormat("int a = -2;"); 6593 verifyFormat("f(-1, -2, -3);"); 6594 verifyFormat("a[-1] = 5;"); 6595 verifyFormat("int a = 5 + -2;"); 6596 verifyFormat("if (i == -1) {\n}"); 6597 verifyFormat("if (i != -1) {\n}"); 6598 verifyFormat("if (i > -1) {\n}"); 6599 verifyFormat("if (i < -1) {\n}"); 6600 verifyFormat("++(a->f());"); 6601 verifyFormat("--(a->f());"); 6602 verifyFormat("(a->f())++;"); 6603 verifyFormat("a[42]++;"); 6604 verifyFormat("if (!(a->f())) {\n}"); 6605 verifyFormat("if (!+i) {\n}"); 6606 verifyFormat("~&a;"); 6607 6608 verifyFormat("a-- > b;"); 6609 verifyFormat("b ? -a : c;"); 6610 verifyFormat("n * sizeof char16;"); 6611 verifyFormat("n * alignof char16;", getGoogleStyle()); 6612 verifyFormat("sizeof(char);"); 6613 verifyFormat("alignof(char);", getGoogleStyle()); 6614 6615 verifyFormat("return -1;"); 6616 verifyFormat("switch (a) {\n" 6617 "case -1:\n" 6618 " break;\n" 6619 "}"); 6620 verifyFormat("#define X -1"); 6621 verifyFormat("#define X -kConstant"); 6622 6623 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 6624 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 6625 6626 verifyFormat("int a = /* confusing comment */ -1;"); 6627 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 6628 verifyFormat("int a = i /* confusing comment */++;"); 6629 } 6630 6631 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 6632 verifyFormat("if (!aaaaaaaaaa( // break\n" 6633 " aaaaa)) {\n" 6634 "}"); 6635 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 6636 " aaaaa));"); 6637 verifyFormat("*aaa = aaaaaaa( // break\n" 6638 " bbbbbb);"); 6639 } 6640 6641 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 6642 verifyFormat("bool operator<();"); 6643 verifyFormat("bool operator>();"); 6644 verifyFormat("bool operator=();"); 6645 verifyFormat("bool operator==();"); 6646 verifyFormat("bool operator!=();"); 6647 verifyFormat("int operator+();"); 6648 verifyFormat("int operator++();"); 6649 verifyFormat("int operator++(int) volatile noexcept;"); 6650 verifyFormat("bool operator,();"); 6651 verifyFormat("bool operator();"); 6652 verifyFormat("bool operator()();"); 6653 verifyFormat("bool operator[]();"); 6654 verifyFormat("operator bool();"); 6655 verifyFormat("operator int();"); 6656 verifyFormat("operator void *();"); 6657 verifyFormat("operator SomeType<int>();"); 6658 verifyFormat("operator SomeType<int, int>();"); 6659 verifyFormat("operator SomeType<SomeType<int>>();"); 6660 verifyFormat("void *operator new(std::size_t size);"); 6661 verifyFormat("void *operator new[](std::size_t size);"); 6662 verifyFormat("void operator delete(void *ptr);"); 6663 verifyFormat("void operator delete[](void *ptr);"); 6664 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 6665 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 6666 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 6667 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 6668 6669 verifyFormat( 6670 "ostream &operator<<(ostream &OutputStream,\n" 6671 " SomeReallyLongType WithSomeReallyLongValue);"); 6672 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 6673 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 6674 " return left.group < right.group;\n" 6675 "}"); 6676 verifyFormat("SomeType &operator=(const SomeType &S);"); 6677 verifyFormat("f.template operator()<int>();"); 6678 6679 verifyGoogleFormat("operator void*();"); 6680 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 6681 verifyGoogleFormat("operator ::A();"); 6682 6683 verifyFormat("using A::operator+;"); 6684 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 6685 "int i;"); 6686 } 6687 6688 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 6689 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 6690 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 6691 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 6692 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 6693 verifyFormat("Deleted &operator=(const Deleted &) &;"); 6694 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 6695 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 6696 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 6697 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 6698 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 6699 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 6700 verifyFormat("void Fn(T const &) const &;"); 6701 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 6702 verifyFormat("template <typename T>\n" 6703 "void F(T) && = delete;", 6704 getGoogleStyle()); 6705 6706 FormatStyle AlignLeft = getLLVMStyle(); 6707 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 6708 verifyFormat("void A::b() && {}", AlignLeft); 6709 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 6710 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 6711 AlignLeft); 6712 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 6713 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 6714 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 6715 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 6716 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 6717 verifyFormat("auto Function(T) & -> void;", AlignLeft); 6718 verifyFormat("void Fn(T const&) const&;", AlignLeft); 6719 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 6720 6721 FormatStyle Spaces = getLLVMStyle(); 6722 Spaces.SpacesInCStyleCastParentheses = true; 6723 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 6724 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 6725 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 6726 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 6727 6728 Spaces.SpacesInCStyleCastParentheses = false; 6729 Spaces.SpacesInParentheses = true; 6730 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 6731 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces); 6732 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 6733 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 6734 } 6735 6736 TEST_F(FormatTest, UnderstandsNewAndDelete) { 6737 verifyFormat("void f() {\n" 6738 " A *a = new A;\n" 6739 " A *a = new (placement) A;\n" 6740 " delete a;\n" 6741 " delete (A *)a;\n" 6742 "}"); 6743 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 6744 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 6745 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6746 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 6747 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 6748 verifyFormat("delete[] h->p;"); 6749 } 6750 6751 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 6752 verifyFormat("int *f(int *a) {}"); 6753 verifyFormat("int main(int argc, char **argv) {}"); 6754 verifyFormat("Test::Test(int b) : a(b * b) {}"); 6755 verifyIndependentOfContext("f(a, *a);"); 6756 verifyFormat("void g() { f(*a); }"); 6757 verifyIndependentOfContext("int a = b * 10;"); 6758 verifyIndependentOfContext("int a = 10 * b;"); 6759 verifyIndependentOfContext("int a = b * c;"); 6760 verifyIndependentOfContext("int a += b * c;"); 6761 verifyIndependentOfContext("int a -= b * c;"); 6762 verifyIndependentOfContext("int a *= b * c;"); 6763 verifyIndependentOfContext("int a /= b * c;"); 6764 verifyIndependentOfContext("int a = *b;"); 6765 verifyIndependentOfContext("int a = *b * c;"); 6766 verifyIndependentOfContext("int a = b * *c;"); 6767 verifyIndependentOfContext("int a = b * (10);"); 6768 verifyIndependentOfContext("S << b * (10);"); 6769 verifyIndependentOfContext("return 10 * b;"); 6770 verifyIndependentOfContext("return *b * *c;"); 6771 verifyIndependentOfContext("return a & ~b;"); 6772 verifyIndependentOfContext("f(b ? *c : *d);"); 6773 verifyIndependentOfContext("int a = b ? *c : *d;"); 6774 verifyIndependentOfContext("*b = a;"); 6775 verifyIndependentOfContext("a * ~b;"); 6776 verifyIndependentOfContext("a * !b;"); 6777 verifyIndependentOfContext("a * +b;"); 6778 verifyIndependentOfContext("a * -b;"); 6779 verifyIndependentOfContext("a * ++b;"); 6780 verifyIndependentOfContext("a * --b;"); 6781 verifyIndependentOfContext("a[4] * b;"); 6782 verifyIndependentOfContext("a[a * a] = 1;"); 6783 verifyIndependentOfContext("f() * b;"); 6784 verifyIndependentOfContext("a * [self dostuff];"); 6785 verifyIndependentOfContext("int x = a * (a + b);"); 6786 verifyIndependentOfContext("(a *)(a + b);"); 6787 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 6788 verifyIndependentOfContext("int *pa = (int *)&a;"); 6789 verifyIndependentOfContext("return sizeof(int **);"); 6790 verifyIndependentOfContext("return sizeof(int ******);"); 6791 verifyIndependentOfContext("return (int **&)a;"); 6792 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 6793 verifyFormat("void f(Type (*parameter)[10]) {}"); 6794 verifyFormat("void f(Type (¶meter)[10]) {}"); 6795 verifyGoogleFormat("return sizeof(int**);"); 6796 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 6797 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 6798 verifyFormat("auto a = [](int **&, int ***) {};"); 6799 verifyFormat("auto PointerBinding = [](const char *S) {};"); 6800 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 6801 verifyFormat("[](const decltype(*a) &value) {}"); 6802 verifyFormat("decltype(a * b) F();"); 6803 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 6804 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 6805 verifyIndependentOfContext("typedef void (*f)(int *a);"); 6806 verifyIndependentOfContext("int i{a * b};"); 6807 verifyIndependentOfContext("aaa && aaa->f();"); 6808 verifyIndependentOfContext("int x = ~*p;"); 6809 verifyFormat("Constructor() : a(a), area(width * height) {}"); 6810 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 6811 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 6812 verifyFormat("void f() { f(a, c * d); }"); 6813 verifyFormat("void f() { f(new a(), c * d); }"); 6814 verifyFormat("void f(const MyOverride &override);"); 6815 verifyFormat("void f(const MyFinal &final);"); 6816 verifyIndependentOfContext("bool a = f() && override.f();"); 6817 verifyIndependentOfContext("bool a = f() && final.f();"); 6818 6819 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 6820 6821 verifyIndependentOfContext("A<int *> a;"); 6822 verifyIndependentOfContext("A<int **> a;"); 6823 verifyIndependentOfContext("A<int *, int *> a;"); 6824 verifyIndependentOfContext("A<int *[]> a;"); 6825 verifyIndependentOfContext( 6826 "const char *const p = reinterpret_cast<const char *const>(q);"); 6827 verifyIndependentOfContext("A<int **, int **> a;"); 6828 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 6829 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 6830 verifyFormat("for (; a && b;) {\n}"); 6831 verifyFormat("bool foo = true && [] { return false; }();"); 6832 6833 verifyFormat( 6834 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6835 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6836 6837 verifyGoogleFormat("int const* a = &b;"); 6838 verifyGoogleFormat("**outparam = 1;"); 6839 verifyGoogleFormat("*outparam = a * b;"); 6840 verifyGoogleFormat("int main(int argc, char** argv) {}"); 6841 verifyGoogleFormat("A<int*> a;"); 6842 verifyGoogleFormat("A<int**> a;"); 6843 verifyGoogleFormat("A<int*, int*> a;"); 6844 verifyGoogleFormat("A<int**, int**> a;"); 6845 verifyGoogleFormat("f(b ? *c : *d);"); 6846 verifyGoogleFormat("int a = b ? *c : *d;"); 6847 verifyGoogleFormat("Type* t = **x;"); 6848 verifyGoogleFormat("Type* t = *++*x;"); 6849 verifyGoogleFormat("*++*x;"); 6850 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 6851 verifyGoogleFormat("Type* t = x++ * y;"); 6852 verifyGoogleFormat( 6853 "const char* const p = reinterpret_cast<const char* const>(q);"); 6854 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 6855 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 6856 verifyGoogleFormat("template <typename T>\n" 6857 "void f(int i = 0, SomeType** temps = NULL);"); 6858 6859 FormatStyle Left = getLLVMStyle(); 6860 Left.PointerAlignment = FormatStyle::PAS_Left; 6861 verifyFormat("x = *a(x) = *a(y);", Left); 6862 verifyFormat("for (;; *a = b) {\n}", Left); 6863 verifyFormat("return *this += 1;", Left); 6864 verifyFormat("throw *x;", Left); 6865 verifyFormat("delete *x;", Left); 6866 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 6867 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 6868 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 6869 6870 verifyIndependentOfContext("a = *(x + y);"); 6871 verifyIndependentOfContext("a = &(x + y);"); 6872 verifyIndependentOfContext("*(x + y).call();"); 6873 verifyIndependentOfContext("&(x + y)->call();"); 6874 verifyFormat("void f() { &(*I).first; }"); 6875 6876 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 6877 verifyFormat( 6878 "int *MyValues = {\n" 6879 " *A, // Operator detection might be confused by the '{'\n" 6880 " *BB // Operator detection might be confused by previous comment\n" 6881 "};"); 6882 6883 verifyIndependentOfContext("if (int *a = &b)"); 6884 verifyIndependentOfContext("if (int &a = *b)"); 6885 verifyIndependentOfContext("if (a & b[i])"); 6886 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 6887 verifyIndependentOfContext("if (*b[i])"); 6888 verifyIndependentOfContext("if (int *a = (&b))"); 6889 verifyIndependentOfContext("while (int *a = &b)"); 6890 verifyIndependentOfContext("size = sizeof *a;"); 6891 verifyIndependentOfContext("if (a && (b = c))"); 6892 verifyFormat("void f() {\n" 6893 " for (const int &v : Values) {\n" 6894 " }\n" 6895 "}"); 6896 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 6897 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 6898 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 6899 6900 verifyFormat("#define A (!a * b)"); 6901 verifyFormat("#define MACRO \\\n" 6902 " int *i = a * b; \\\n" 6903 " void f(a *b);", 6904 getLLVMStyleWithColumns(19)); 6905 6906 verifyIndependentOfContext("A = new SomeType *[Length];"); 6907 verifyIndependentOfContext("A = new SomeType *[Length]();"); 6908 verifyIndependentOfContext("T **t = new T *;"); 6909 verifyIndependentOfContext("T **t = new T *();"); 6910 verifyGoogleFormat("A = new SomeType*[Length]();"); 6911 verifyGoogleFormat("A = new SomeType*[Length];"); 6912 verifyGoogleFormat("T** t = new T*;"); 6913 verifyGoogleFormat("T** t = new T*();"); 6914 6915 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 6916 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 6917 verifyFormat("template <bool a, bool b> " 6918 "typename t::if<x && y>::type f() {}"); 6919 verifyFormat("template <int *y> f() {}"); 6920 verifyFormat("vector<int *> v;"); 6921 verifyFormat("vector<int *const> v;"); 6922 verifyFormat("vector<int *const **const *> v;"); 6923 verifyFormat("vector<int *volatile> v;"); 6924 verifyFormat("vector<a * b> v;"); 6925 verifyFormat("foo<b && false>();"); 6926 verifyFormat("foo<b & 1>();"); 6927 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 6928 verifyFormat( 6929 "template <class T, class = typename std::enable_if<\n" 6930 " std::is_integral<T>::value &&\n" 6931 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 6932 "void F();", 6933 getLLVMStyleWithColumns(70)); 6934 verifyFormat( 6935 "template <class T,\n" 6936 " class = typename std::enable_if<\n" 6937 " std::is_integral<T>::value &&\n" 6938 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 6939 " class U>\n" 6940 "void F();", 6941 getLLVMStyleWithColumns(70)); 6942 verifyFormat( 6943 "template <class T,\n" 6944 " class = typename ::std::enable_if<\n" 6945 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 6946 "void F();", 6947 getGoogleStyleWithColumns(68)); 6948 6949 verifyIndependentOfContext("MACRO(int *i);"); 6950 verifyIndependentOfContext("MACRO(auto *a);"); 6951 verifyIndependentOfContext("MACRO(const A *a);"); 6952 verifyIndependentOfContext("MACRO(A *const a);"); 6953 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 6954 verifyFormat("void f() { f(float{1}, a * a); }"); 6955 // FIXME: Is there a way to make this work? 6956 // verifyIndependentOfContext("MACRO(A *a);"); 6957 6958 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 6959 verifyFormat("return options != nullptr && operator==(*options);"); 6960 6961 EXPECT_EQ("#define OP(x) \\\n" 6962 " ostream &operator<<(ostream &s, const A &a) { \\\n" 6963 " return s << a.DebugString(); \\\n" 6964 " }", 6965 format("#define OP(x) \\\n" 6966 " ostream &operator<<(ostream &s, const A &a) { \\\n" 6967 " return s << a.DebugString(); \\\n" 6968 " }", 6969 getLLVMStyleWithColumns(50))); 6970 6971 // FIXME: We cannot handle this case yet; we might be able to figure out that 6972 // foo<x> d > v; doesn't make sense. 6973 verifyFormat("foo<a<b && c> d> v;"); 6974 6975 FormatStyle PointerMiddle = getLLVMStyle(); 6976 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 6977 verifyFormat("delete *x;", PointerMiddle); 6978 verifyFormat("int * x;", PointerMiddle); 6979 verifyFormat("int *[] x;", PointerMiddle); 6980 verifyFormat("template <int * y> f() {}", PointerMiddle); 6981 verifyFormat("int * f(int * a) {}", PointerMiddle); 6982 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 6983 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 6984 verifyFormat("A<int *> a;", PointerMiddle); 6985 verifyFormat("A<int **> a;", PointerMiddle); 6986 verifyFormat("A<int *, int *> a;", PointerMiddle); 6987 verifyFormat("A<int *[]> a;", PointerMiddle); 6988 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 6989 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 6990 verifyFormat("T ** t = new T *;", PointerMiddle); 6991 6992 // Member function reference qualifiers aren't binary operators. 6993 verifyFormat("string // break\n" 6994 "operator()() & {}"); 6995 verifyFormat("string // break\n" 6996 "operator()() && {}"); 6997 verifyGoogleFormat("template <typename T>\n" 6998 "auto x() & -> int {}"); 6999 } 7000 7001 TEST_F(FormatTest, UnderstandsAttributes) { 7002 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7003 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7004 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7005 FormatStyle AfterType = getLLVMStyle(); 7006 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7007 verifyFormat("__attribute__((nodebug)) void\n" 7008 "foo() {}\n", 7009 AfterType); 7010 } 7011 7012 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7013 verifyFormat("SomeType s [[unused]] (InitValue);"); 7014 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7015 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7016 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7017 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7018 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7019 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7020 7021 // Make sure we do not mistake attributes for array subscripts. 7022 verifyFormat("int a() {}\n" 7023 "[[unused]] int b() {}\n"); 7024 verifyFormat("NSArray *arr;\n" 7025 "arr[[Foo() bar]];"); 7026 7027 // On the other hand, we still need to correctly find array subscripts. 7028 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7029 7030 // Make sure we do not parse attributes as lambda introducers. 7031 FormatStyle MultiLineFunctions = getLLVMStyle(); 7032 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7033 verifyFormat("[[unused]] int b() {\n" 7034 " return 42;\n" 7035 "}\n", 7036 MultiLineFunctions); 7037 } 7038 7039 TEST_F(FormatTest, UnderstandsEllipsis) { 7040 verifyFormat("int printf(const char *fmt, ...);"); 7041 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7042 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7043 7044 FormatStyle PointersLeft = getLLVMStyle(); 7045 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7046 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7047 } 7048 7049 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7050 EXPECT_EQ("int *a;\n" 7051 "int *a;\n" 7052 "int *a;", 7053 format("int *a;\n" 7054 "int* a;\n" 7055 "int *a;", 7056 getGoogleStyle())); 7057 EXPECT_EQ("int* a;\n" 7058 "int* a;\n" 7059 "int* a;", 7060 format("int* a;\n" 7061 "int* a;\n" 7062 "int *a;", 7063 getGoogleStyle())); 7064 EXPECT_EQ("int *a;\n" 7065 "int *a;\n" 7066 "int *a;", 7067 format("int *a;\n" 7068 "int * a;\n" 7069 "int * a;", 7070 getGoogleStyle())); 7071 EXPECT_EQ("auto x = [] {\n" 7072 " int *a;\n" 7073 " int *a;\n" 7074 " int *a;\n" 7075 "};", 7076 format("auto x=[]{int *a;\n" 7077 "int * a;\n" 7078 "int * a;};", 7079 getGoogleStyle())); 7080 } 7081 7082 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7083 verifyFormat("int f(int &&a) {}"); 7084 verifyFormat("int f(int a, char &&b) {}"); 7085 verifyFormat("void f() { int &&a = b; }"); 7086 verifyGoogleFormat("int f(int a, char&& b) {}"); 7087 verifyGoogleFormat("void f() { int&& a = b; }"); 7088 7089 verifyIndependentOfContext("A<int &&> a;"); 7090 verifyIndependentOfContext("A<int &&, int &&> a;"); 7091 verifyGoogleFormat("A<int&&> a;"); 7092 verifyGoogleFormat("A<int&&, int&&> a;"); 7093 7094 // Not rvalue references: 7095 verifyFormat("template <bool B, bool C> class A {\n" 7096 " static_assert(B && C, \"Something is wrong\");\n" 7097 "};"); 7098 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7099 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7100 verifyFormat("#define A(a, b) (a && b)"); 7101 } 7102 7103 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7104 verifyFormat("void f() {\n" 7105 " x[aaaaaaaaa -\n" 7106 " b] = 23;\n" 7107 "}", 7108 getLLVMStyleWithColumns(15)); 7109 } 7110 7111 TEST_F(FormatTest, FormatsCasts) { 7112 verifyFormat("Type *A = static_cast<Type *>(P);"); 7113 verifyFormat("Type *A = (Type *)P;"); 7114 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7115 verifyFormat("int a = (int)(2.0f);"); 7116 verifyFormat("int a = (int)2.0f;"); 7117 verifyFormat("x[(int32)y];"); 7118 verifyFormat("x = (int32)y;"); 7119 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7120 verifyFormat("int a = (int)*b;"); 7121 verifyFormat("int a = (int)2.0f;"); 7122 verifyFormat("int a = (int)~0;"); 7123 verifyFormat("int a = (int)++a;"); 7124 verifyFormat("int a = (int)sizeof(int);"); 7125 verifyFormat("int a = (int)+2;"); 7126 verifyFormat("my_int a = (my_int)2.0f;"); 7127 verifyFormat("my_int a = (my_int)sizeof(int);"); 7128 verifyFormat("return (my_int)aaa;"); 7129 verifyFormat("#define x ((int)-1)"); 7130 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7131 verifyFormat("#define p(q) ((int *)&q)"); 7132 verifyFormat("fn(a)(b) + 1;"); 7133 7134 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7135 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7136 verifyFormat("my_int a = (my_int)~0;"); 7137 verifyFormat("my_int a = (my_int)++a;"); 7138 verifyFormat("my_int a = (my_int)-2;"); 7139 verifyFormat("my_int a = (my_int)1;"); 7140 verifyFormat("my_int a = (my_int *)1;"); 7141 verifyFormat("my_int a = (const my_int)-1;"); 7142 verifyFormat("my_int a = (const my_int *)-1;"); 7143 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7144 verifyFormat("my_int a = (ns::my_int)-2;"); 7145 verifyFormat("case (my_int)ONE:"); 7146 verifyFormat("auto x = (X)this;"); 7147 7148 // FIXME: single value wrapped with paren will be treated as cast. 7149 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7150 7151 verifyFormat("{ (void)F; }"); 7152 7153 // Don't break after a cast's 7154 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7155 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7156 " bbbbbbbbbbbbbbbbbbbbbb);"); 7157 7158 // These are not casts. 7159 verifyFormat("void f(int *) {}"); 7160 verifyFormat("f(foo)->b;"); 7161 verifyFormat("f(foo).b;"); 7162 verifyFormat("f(foo)(b);"); 7163 verifyFormat("f(foo)[b];"); 7164 verifyFormat("[](foo) { return 4; }(bar);"); 7165 verifyFormat("(*funptr)(foo)[4];"); 7166 verifyFormat("funptrs[4](foo)[4];"); 7167 verifyFormat("void f(int *);"); 7168 verifyFormat("void f(int *) = 0;"); 7169 verifyFormat("void f(SmallVector<int>) {}"); 7170 verifyFormat("void f(SmallVector<int>);"); 7171 verifyFormat("void f(SmallVector<int>) = 0;"); 7172 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7173 verifyFormat("int a = sizeof(int) * b;"); 7174 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7175 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7176 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7177 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7178 7179 // These are not casts, but at some point were confused with casts. 7180 verifyFormat("virtual void foo(int *) override;"); 7181 verifyFormat("virtual void foo(char &) const;"); 7182 verifyFormat("virtual void foo(int *a, char *) const;"); 7183 verifyFormat("int a = sizeof(int *) + b;"); 7184 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7185 verifyFormat("bool b = f(g<int>) && c;"); 7186 verifyFormat("typedef void (*f)(int i) func;"); 7187 7188 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7189 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7190 // FIXME: The indentation here is not ideal. 7191 verifyFormat( 7192 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7193 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7194 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7195 } 7196 7197 TEST_F(FormatTest, FormatsFunctionTypes) { 7198 verifyFormat("A<bool()> a;"); 7199 verifyFormat("A<SomeType()> a;"); 7200 verifyFormat("A<void (*)(int, std::string)> a;"); 7201 verifyFormat("A<void *(int)>;"); 7202 verifyFormat("void *(*a)(int *, SomeType *);"); 7203 verifyFormat("int (*func)(void *);"); 7204 verifyFormat("void f() { int (*func)(void *); }"); 7205 verifyFormat("template <class CallbackClass>\n" 7206 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7207 7208 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7209 verifyGoogleFormat("void* (*a)(int);"); 7210 verifyGoogleFormat( 7211 "template <class CallbackClass>\n" 7212 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7213 7214 // Other constructs can look somewhat like function types: 7215 verifyFormat("A<sizeof(*x)> a;"); 7216 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7217 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7218 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7219 verifyFormat("int x = f(&h)();"); 7220 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7221 verifyFormat("std::function<\n" 7222 " LooooooooooongTemplatedType<\n" 7223 " SomeType>*(\n" 7224 " LooooooooooooooooongType type)>\n" 7225 " function;", 7226 getGoogleStyleWithColumns(40)); 7227 } 7228 7229 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7230 verifyFormat("A (*foo_)[6];"); 7231 verifyFormat("vector<int> (*foo_)[6];"); 7232 } 7233 7234 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7235 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7236 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7237 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7238 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7239 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7240 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7241 7242 // Different ways of ()-initializiation. 7243 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7244 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7245 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7246 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7247 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7248 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7249 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7250 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7251 7252 // Lambdas should not confuse the variable declaration heuristic. 7253 verifyFormat("LooooooooooooooooongType\n" 7254 " variable(nullptr, [](A *a) {});", 7255 getLLVMStyleWithColumns(40)); 7256 } 7257 7258 TEST_F(FormatTest, BreaksLongDeclarations) { 7259 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7260 " AnotherNameForTheLongType;"); 7261 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7263 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7264 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7265 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7266 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7267 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7268 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7269 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7270 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7271 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7272 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7273 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7274 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7275 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7276 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7277 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7278 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7279 FormatStyle Indented = getLLVMStyle(); 7280 Indented.IndentWrappedFunctionNames = true; 7281 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7282 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7283 Indented); 7284 verifyFormat( 7285 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7286 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7287 Indented); 7288 verifyFormat( 7289 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7290 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7291 Indented); 7292 verifyFormat( 7293 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7294 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7295 Indented); 7296 7297 // FIXME: Without the comment, this breaks after "(". 7298 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7299 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7300 getGoogleStyle()); 7301 7302 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7303 " int LoooooooooooooooooooongParam2) {}"); 7304 verifyFormat( 7305 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7306 " SourceLocation L, IdentifierIn *II,\n" 7307 " Type *T) {}"); 7308 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7309 "ReallyReaaallyLongFunctionName(\n" 7310 " const std::string &SomeParameter,\n" 7311 " const SomeType<string, SomeOtherTemplateParameter>\n" 7312 " &ReallyReallyLongParameterName,\n" 7313 " const SomeType<string, SomeOtherTemplateParameter>\n" 7314 " &AnotherLongParameterName) {}"); 7315 verifyFormat("template <typename A>\n" 7316 "SomeLoooooooooooooooooooooongType<\n" 7317 " typename some_namespace::SomeOtherType<A>::Type>\n" 7318 "Function() {}"); 7319 7320 verifyGoogleFormat( 7321 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7322 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7323 verifyGoogleFormat( 7324 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7325 " SourceLocation L) {}"); 7326 verifyGoogleFormat( 7327 "some_namespace::LongReturnType\n" 7328 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7329 " int first_long_parameter, int second_parameter) {}"); 7330 7331 verifyGoogleFormat("template <typename T>\n" 7332 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7333 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7334 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7335 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7336 7337 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7338 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7339 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7340 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7341 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7342 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7343 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7344 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7346 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7347 7348 verifyFormat("template <typename T> // Templates on own line.\n" 7349 "static int // Some comment.\n" 7350 "MyFunction(int a);", 7351 getLLVMStyle()); 7352 } 7353 7354 TEST_F(FormatTest, FormatsArrays) { 7355 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7356 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7357 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7358 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7359 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7360 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7361 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7362 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7363 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7364 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7365 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7366 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7367 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7368 verifyFormat( 7369 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7370 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7371 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7372 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7373 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7374 7375 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7377 verifyFormat( 7378 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 7379 " .aaaaaaa[0]\n" 7380 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7381 verifyFormat("a[::b::c];"); 7382 7383 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 7384 7385 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 7386 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 7387 } 7388 7389 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 7390 verifyFormat("(a)->b();"); 7391 verifyFormat("--a;"); 7392 } 7393 7394 TEST_F(FormatTest, HandlesIncludeDirectives) { 7395 verifyFormat("#include <string>\n" 7396 "#include <a/b/c.h>\n" 7397 "#include \"a/b/string\"\n" 7398 "#include \"string.h\"\n" 7399 "#include \"string.h\"\n" 7400 "#include <a-a>\n" 7401 "#include < path with space >\n" 7402 "#include_next <test.h>" 7403 "#include \"abc.h\" // this is included for ABC\n" 7404 "#include \"some long include\" // with a comment\n" 7405 "#include \"some very long include path\"\n" 7406 "#include <some/very/long/include/path>\n", 7407 getLLVMStyleWithColumns(35)); 7408 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 7409 EXPECT_EQ("#include <a>", format("#include<a>")); 7410 7411 verifyFormat("#import <string>"); 7412 verifyFormat("#import <a/b/c.h>"); 7413 verifyFormat("#import \"a/b/string\""); 7414 verifyFormat("#import \"string.h\""); 7415 verifyFormat("#import \"string.h\""); 7416 verifyFormat("#if __has_include(<strstream>)\n" 7417 "#include <strstream>\n" 7418 "#endif"); 7419 7420 verifyFormat("#define MY_IMPORT <a/b>"); 7421 7422 verifyFormat("#if __has_include(<a/b>)"); 7423 verifyFormat("#if __has_include_next(<a/b>)"); 7424 verifyFormat("#define F __has_include(<a/b>)"); 7425 verifyFormat("#define F __has_include_next(<a/b>)"); 7426 7427 // Protocol buffer definition or missing "#". 7428 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 7429 getLLVMStyleWithColumns(30)); 7430 7431 FormatStyle Style = getLLVMStyle(); 7432 Style.AlwaysBreakBeforeMultilineStrings = true; 7433 Style.ColumnLimit = 0; 7434 verifyFormat("#import \"abc.h\"", Style); 7435 7436 // But 'import' might also be a regular C++ namespace. 7437 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7439 } 7440 7441 //===----------------------------------------------------------------------===// 7442 // Error recovery tests. 7443 //===----------------------------------------------------------------------===// 7444 7445 TEST_F(FormatTest, IncompleteParameterLists) { 7446 FormatStyle NoBinPacking = getLLVMStyle(); 7447 NoBinPacking.BinPackParameters = false; 7448 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 7449 " double *min_x,\n" 7450 " double *max_x,\n" 7451 " double *min_y,\n" 7452 " double *max_y,\n" 7453 " double *min_z,\n" 7454 " double *max_z, ) {}", 7455 NoBinPacking); 7456 } 7457 7458 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 7459 verifyFormat("void f() { return; }\n42"); 7460 verifyFormat("void f() {\n" 7461 " if (0)\n" 7462 " return;\n" 7463 "}\n" 7464 "42"); 7465 verifyFormat("void f() { return }\n42"); 7466 verifyFormat("void f() {\n" 7467 " if (0)\n" 7468 " return\n" 7469 "}\n" 7470 "42"); 7471 } 7472 7473 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 7474 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 7475 EXPECT_EQ("void f() {\n" 7476 " if (a)\n" 7477 " return\n" 7478 "}", 7479 format("void f ( ) { if ( a ) return }")); 7480 EXPECT_EQ("namespace N {\n" 7481 "void f()\n" 7482 "}", 7483 format("namespace N { void f() }")); 7484 EXPECT_EQ("namespace N {\n" 7485 "void f() {}\n" 7486 "void g()\n" 7487 "} // namespace N", 7488 format("namespace N { void f( ) { } void g( ) }")); 7489 } 7490 7491 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 7492 verifyFormat("int aaaaaaaa =\n" 7493 " // Overlylongcomment\n" 7494 " b;", 7495 getLLVMStyleWithColumns(20)); 7496 verifyFormat("function(\n" 7497 " ShortArgument,\n" 7498 " LoooooooooooongArgument);\n", 7499 getLLVMStyleWithColumns(20)); 7500 } 7501 7502 TEST_F(FormatTest, IncorrectAccessSpecifier) { 7503 verifyFormat("public:"); 7504 verifyFormat("class A {\n" 7505 "public\n" 7506 " void f() {}\n" 7507 "};"); 7508 verifyFormat("public\n" 7509 "int qwerty;"); 7510 verifyFormat("public\n" 7511 "B {}"); 7512 verifyFormat("public\n" 7513 "{}"); 7514 verifyFormat("public\n" 7515 "B { int x; }"); 7516 } 7517 7518 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 7519 verifyFormat("{"); 7520 verifyFormat("#})"); 7521 verifyNoCrash("(/**/[:!] ?[)."); 7522 } 7523 7524 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 7525 // Found by oss-fuzz: 7526 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 7527 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7528 Style.ColumnLimit = 60; 7529 verifyNoCrash( 7530 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 7531 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 7532 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 7533 Style); 7534 } 7535 7536 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 7537 verifyFormat("do {\n}"); 7538 verifyFormat("do {\n}\n" 7539 "f();"); 7540 verifyFormat("do {\n}\n" 7541 "wheeee(fun);"); 7542 verifyFormat("do {\n" 7543 " f();\n" 7544 "}"); 7545 } 7546 7547 TEST_F(FormatTest, IncorrectCodeMissingParens) { 7548 verifyFormat("if {\n foo;\n foo();\n}"); 7549 verifyFormat("switch {\n foo;\n foo();\n}"); 7550 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 7551 verifyFormat("while {\n foo;\n foo();\n}"); 7552 verifyFormat("do {\n foo;\n foo();\n} while;"); 7553 } 7554 7555 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 7556 verifyIncompleteFormat("namespace {\n" 7557 "class Foo { Foo (\n" 7558 "};\n" 7559 "} // namespace"); 7560 } 7561 7562 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 7563 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 7564 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 7565 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 7566 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 7567 7568 EXPECT_EQ("{\n" 7569 " {\n" 7570 " breakme(\n" 7571 " qwe);\n" 7572 " }\n", 7573 format("{\n" 7574 " {\n" 7575 " breakme(qwe);\n" 7576 "}\n", 7577 getLLVMStyleWithColumns(10))); 7578 } 7579 7580 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 7581 verifyFormat("int x = {\n" 7582 " avariable,\n" 7583 " b(alongervariable)};", 7584 getLLVMStyleWithColumns(25)); 7585 } 7586 7587 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 7588 verifyFormat("return (a)(b){1, 2, 3};"); 7589 } 7590 7591 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 7592 verifyFormat("vector<int> x{1, 2, 3, 4};"); 7593 verifyFormat("vector<int> x{\n" 7594 " 1,\n" 7595 " 2,\n" 7596 " 3,\n" 7597 " 4,\n" 7598 "};"); 7599 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 7600 verifyFormat("f({1, 2});"); 7601 verifyFormat("auto v = Foo{-1};"); 7602 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 7603 verifyFormat("Class::Class : member{1, 2, 3} {}"); 7604 verifyFormat("new vector<int>{1, 2, 3};"); 7605 verifyFormat("new int[3]{1, 2, 3};"); 7606 verifyFormat("new int{1};"); 7607 verifyFormat("return {arg1, arg2};"); 7608 verifyFormat("return {arg1, SomeType{parameter}};"); 7609 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 7610 verifyFormat("new T{arg1, arg2};"); 7611 verifyFormat("f(MyMap[{composite, key}]);"); 7612 verifyFormat("class Class {\n" 7613 " T member = {arg1, arg2};\n" 7614 "};"); 7615 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 7616 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 7617 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 7618 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 7619 verifyFormat("int a = std::is_integral<int>{} + 0;"); 7620 7621 verifyFormat("int foo(int i) { return fo1{}(i); }"); 7622 verifyFormat("int foo(int i) { return fo1{}(i); }"); 7623 verifyFormat("auto i = decltype(x){};"); 7624 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 7625 verifyFormat("Node n{1, Node{1000}, //\n" 7626 " 2};"); 7627 verifyFormat("Aaaa aaaaaaa{\n" 7628 " {\n" 7629 " aaaa,\n" 7630 " },\n" 7631 "};"); 7632 verifyFormat("class C : public D {\n" 7633 " SomeClass SC{2};\n" 7634 "};"); 7635 verifyFormat("class C : public A {\n" 7636 " class D : public B {\n" 7637 " void f() { int i{2}; }\n" 7638 " };\n" 7639 "};"); 7640 verifyFormat("#define A {a, a},"); 7641 7642 // Avoid breaking between equal sign and opening brace 7643 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 7644 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 7645 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 7646 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 7647 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 7648 " {\"ccccccccccccccccccccc\", 2}};", 7649 AvoidBreakingFirstArgument); 7650 7651 // Binpacking only if there is no trailing comma 7652 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 7653 " cccccccccc, dddddddddd};", 7654 getLLVMStyleWithColumns(50)); 7655 verifyFormat("const Aaaaaa aaaaa = {\n" 7656 " aaaaaaaaaaa,\n" 7657 " bbbbbbbbbbb,\n" 7658 " ccccccccccc,\n" 7659 " ddddddddddd,\n" 7660 "};", getLLVMStyleWithColumns(50)); 7661 7662 // Cases where distinguising braced lists and blocks is hard. 7663 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 7664 verifyFormat("void f() {\n" 7665 " return; // comment\n" 7666 "}\n" 7667 "SomeType t;"); 7668 verifyFormat("void f() {\n" 7669 " if (a) {\n" 7670 " f();\n" 7671 " }\n" 7672 "}\n" 7673 "SomeType t;"); 7674 7675 // In combination with BinPackArguments = false. 7676 FormatStyle NoBinPacking = getLLVMStyle(); 7677 NoBinPacking.BinPackArguments = false; 7678 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 7679 " bbbbb,\n" 7680 " ccccc,\n" 7681 " ddddd,\n" 7682 " eeeee,\n" 7683 " ffffff,\n" 7684 " ggggg,\n" 7685 " hhhhhh,\n" 7686 " iiiiii,\n" 7687 " jjjjjj,\n" 7688 " kkkkkk};", 7689 NoBinPacking); 7690 verifyFormat("const Aaaaaa aaaaa = {\n" 7691 " aaaaa,\n" 7692 " bbbbb,\n" 7693 " ccccc,\n" 7694 " ddddd,\n" 7695 " eeeee,\n" 7696 " ffffff,\n" 7697 " ggggg,\n" 7698 " hhhhhh,\n" 7699 " iiiiii,\n" 7700 " jjjjjj,\n" 7701 " kkkkkk,\n" 7702 "};", 7703 NoBinPacking); 7704 verifyFormat( 7705 "const Aaaaaa aaaaa = {\n" 7706 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 7707 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 7708 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 7709 "};", 7710 NoBinPacking); 7711 7712 // FIXME: The alignment of these trailing comments might be bad. Then again, 7713 // this might be utterly useless in real code. 7714 verifyFormat("Constructor::Constructor()\n" 7715 " : some_value{ //\n" 7716 " aaaaaaa, //\n" 7717 " bbbbbbb} {}"); 7718 7719 // In braced lists, the first comment is always assumed to belong to the 7720 // first element. Thus, it can be moved to the next or previous line as 7721 // appropriate. 7722 EXPECT_EQ("function({// First element:\n" 7723 " 1,\n" 7724 " // Second element:\n" 7725 " 2});", 7726 format("function({\n" 7727 " // First element:\n" 7728 " 1,\n" 7729 " // Second element:\n" 7730 " 2});")); 7731 EXPECT_EQ("std::vector<int> MyNumbers{\n" 7732 " // First element:\n" 7733 " 1,\n" 7734 " // Second element:\n" 7735 " 2};", 7736 format("std::vector<int> MyNumbers{// First element:\n" 7737 " 1,\n" 7738 " // Second element:\n" 7739 " 2};", 7740 getLLVMStyleWithColumns(30))); 7741 // A trailing comma should still lead to an enforced line break and no 7742 // binpacking. 7743 EXPECT_EQ("vector<int> SomeVector = {\n" 7744 " // aaa\n" 7745 " 1,\n" 7746 " 2,\n" 7747 "};", 7748 format("vector<int> SomeVector = { // aaa\n" 7749 " 1, 2, };")); 7750 7751 FormatStyle ExtraSpaces = getLLVMStyle(); 7752 ExtraSpaces.Cpp11BracedListStyle = false; 7753 ExtraSpaces.ColumnLimit = 75; 7754 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 7755 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 7756 verifyFormat("f({ 1, 2 });", ExtraSpaces); 7757 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 7758 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 7759 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 7760 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 7761 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 7762 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 7763 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 7764 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 7765 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 7766 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 7767 verifyFormat("class Class {\n" 7768 " T member = { arg1, arg2 };\n" 7769 "};", 7770 ExtraSpaces); 7771 verifyFormat( 7772 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7773 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 7774 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 7775 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 7776 ExtraSpaces); 7777 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 7778 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 7779 ExtraSpaces); 7780 verifyFormat( 7781 "someFunction(OtherParam,\n" 7782 " BracedList{ // comment 1 (Forcing interesting break)\n" 7783 " param1, param2,\n" 7784 " // comment 2\n" 7785 " param3, param4 });", 7786 ExtraSpaces); 7787 verifyFormat( 7788 "std::this_thread::sleep_for(\n" 7789 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 7790 ExtraSpaces); 7791 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 7792 " aaaaaaa,\n" 7793 " aaaaaaaaaa,\n" 7794 " aaaaa,\n" 7795 " aaaaaaaaaaaaaaa,\n" 7796 " aaa,\n" 7797 " aaaaaaaaaa,\n" 7798 " a,\n" 7799 " aaaaaaaaaaaaaaaaaaaaa,\n" 7800 " aaaaaaaaaaaa,\n" 7801 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 7802 " aaaaaaa,\n" 7803 " a};"); 7804 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 7805 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 7806 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 7807 7808 // Avoid breaking between initializer/equal sign and opening brace 7809 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 7810 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 7811 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 7812 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 7813 " { \"ccccccccccccccccccccc\", 2 }\n" 7814 "};", 7815 ExtraSpaces); 7816 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 7817 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 7818 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 7819 " { \"ccccccccccccccccccccc\", 2 }\n" 7820 "};", 7821 ExtraSpaces); 7822 7823 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 7824 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 7825 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 7826 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 7827 } 7828 7829 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 7830 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7831 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7832 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7833 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7834 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7835 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 7836 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 7837 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7838 " 1, 22, 333, 4444, 55555, //\n" 7839 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7840 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 7841 verifyFormat( 7842 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7843 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7844 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 7845 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7846 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7847 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 7848 " 7777777};"); 7849 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7850 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7851 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7852 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7853 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7854 " // Separating comment.\n" 7855 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7856 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 7857 " // Leading comment\n" 7858 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 7859 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 7860 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 7861 " 1, 1, 1, 1};", 7862 getLLVMStyleWithColumns(39)); 7863 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 7864 " 1, 1, 1, 1};", 7865 getLLVMStyleWithColumns(38)); 7866 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 7867 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 7868 getLLVMStyleWithColumns(43)); 7869 verifyFormat( 7870 "static unsigned SomeValues[10][3] = {\n" 7871 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 7872 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 7873 verifyFormat("static auto fields = new vector<string>{\n" 7874 " \"aaaaaaaaaaaaa\",\n" 7875 " \"aaaaaaaaaaaaa\",\n" 7876 " \"aaaaaaaaaaaa\",\n" 7877 " \"aaaaaaaaaaaaaa\",\n" 7878 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 7879 " \"aaaaaaaaaaaa\",\n" 7880 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 7881 "};"); 7882 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 7883 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 7884 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 7885 " 3, cccccccccccccccccccccc};", 7886 getLLVMStyleWithColumns(60)); 7887 7888 // Trailing commas. 7889 verifyFormat("vector<int> x = {\n" 7890 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 7891 "};", 7892 getLLVMStyleWithColumns(39)); 7893 verifyFormat("vector<int> x = {\n" 7894 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 7895 "};", 7896 getLLVMStyleWithColumns(39)); 7897 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 7898 " 1, 1, 1, 1,\n" 7899 " /**/ /**/};", 7900 getLLVMStyleWithColumns(39)); 7901 7902 // Trailing comment in the first line. 7903 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 7904 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 7905 " 111111111, 222222222, 3333333333, 444444444, //\n" 7906 " 11111111, 22222222, 333333333, 44444444};"); 7907 // Trailing comment in the last line. 7908 verifyFormat("int aaaaa[] = {\n" 7909 " 1, 2, 3, // comment\n" 7910 " 4, 5, 6 // comment\n" 7911 "};"); 7912 7913 // With nested lists, we should either format one item per line or all nested 7914 // lists one on line. 7915 // FIXME: For some nested lists, we can do better. 7916 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 7917 " {aaaaaaaaaaaaaaaaaaa},\n" 7918 " {aaaaaaaaaaaaaaaaaaaaa},\n" 7919 " {aaaaaaaaaaaaaaaaa}};", 7920 getLLVMStyleWithColumns(60)); 7921 verifyFormat( 7922 "SomeStruct my_struct_array = {\n" 7923 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 7924 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 7925 " {aaa, aaa},\n" 7926 " {aaa, aaa},\n" 7927 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 7928 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 7929 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 7930 7931 // No column layout should be used here. 7932 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 7933 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 7934 7935 verifyNoCrash("a<,"); 7936 7937 // No braced initializer here. 7938 verifyFormat("void f() {\n" 7939 " struct Dummy {};\n" 7940 " f(v);\n" 7941 "}"); 7942 7943 // Long lists should be formatted in columns even if they are nested. 7944 verifyFormat( 7945 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7946 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7947 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7948 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7949 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 7950 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 7951 7952 // Allow "single-column" layout even if that violates the column limit. There 7953 // isn't going to be a better way. 7954 verifyFormat("std::vector<int> a = {\n" 7955 " aaaaaaaa,\n" 7956 " aaaaaaaa,\n" 7957 " aaaaaaaa,\n" 7958 " aaaaaaaa,\n" 7959 " aaaaaaaaaa,\n" 7960 " aaaaaaaa,\n" 7961 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 7962 getLLVMStyleWithColumns(30)); 7963 verifyFormat("vector<int> aaaa = {\n" 7964 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7965 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7966 " aaaaaa.aaaaaaa,\n" 7967 " aaaaaa.aaaaaaa,\n" 7968 " aaaaaa.aaaaaaa,\n" 7969 " aaaaaa.aaaaaaa,\n" 7970 "};"); 7971 7972 // Don't create hanging lists. 7973 verifyFormat("someFunction(Param, {List1, List2,\n" 7974 " List3});", 7975 getLLVMStyleWithColumns(35)); 7976 verifyFormat("someFunction(Param, Param,\n" 7977 " {List1, List2,\n" 7978 " List3});", 7979 getLLVMStyleWithColumns(35)); 7980 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 7981 " aaaaaaaaaaaaaaaaaaaaaaa);"); 7982 } 7983 7984 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 7985 FormatStyle DoNotMerge = getLLVMStyle(); 7986 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7987 7988 verifyFormat("void f() { return 42; }"); 7989 verifyFormat("void f() {\n" 7990 " return 42;\n" 7991 "}", 7992 DoNotMerge); 7993 verifyFormat("void f() {\n" 7994 " // Comment\n" 7995 "}"); 7996 verifyFormat("{\n" 7997 "#error {\n" 7998 " int a;\n" 7999 "}"); 8000 verifyFormat("{\n" 8001 " int a;\n" 8002 "#error {\n" 8003 "}"); 8004 verifyFormat("void f() {} // comment"); 8005 verifyFormat("void f() { int a; } // comment"); 8006 verifyFormat("void f() {\n" 8007 "} // comment", 8008 DoNotMerge); 8009 verifyFormat("void f() {\n" 8010 " int a;\n" 8011 "} // comment", 8012 DoNotMerge); 8013 verifyFormat("void f() {\n" 8014 "} // comment", 8015 getLLVMStyleWithColumns(15)); 8016 8017 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8018 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8019 8020 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8021 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8022 verifyFormat("class C {\n" 8023 " C()\n" 8024 " : iiiiiiii(nullptr),\n" 8025 " kkkkkkk(nullptr),\n" 8026 " mmmmmmm(nullptr),\n" 8027 " nnnnnnn(nullptr) {}\n" 8028 "};", 8029 getGoogleStyle()); 8030 8031 FormatStyle NoColumnLimit = getLLVMStyle(); 8032 NoColumnLimit.ColumnLimit = 0; 8033 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8034 EXPECT_EQ("class C {\n" 8035 " A() : b(0) {}\n" 8036 "};", 8037 format("class C{A():b(0){}};", NoColumnLimit)); 8038 EXPECT_EQ("A()\n" 8039 " : b(0) {\n" 8040 "}", 8041 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8042 8043 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8044 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8045 FormatStyle::SFS_None; 8046 EXPECT_EQ("A()\n" 8047 " : b(0) {\n" 8048 "}", 8049 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8050 EXPECT_EQ("A()\n" 8051 " : b(0) {\n" 8052 "}", 8053 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8054 8055 verifyFormat("#define A \\\n" 8056 " void f() { \\\n" 8057 " int i; \\\n" 8058 " }", 8059 getLLVMStyleWithColumns(20)); 8060 verifyFormat("#define A \\\n" 8061 " void f() { int i; }", 8062 getLLVMStyleWithColumns(21)); 8063 verifyFormat("#define A \\\n" 8064 " void f() { \\\n" 8065 " int i; \\\n" 8066 " } \\\n" 8067 " int j;", 8068 getLLVMStyleWithColumns(22)); 8069 verifyFormat("#define A \\\n" 8070 " void f() { int i; } \\\n" 8071 " int j;", 8072 getLLVMStyleWithColumns(23)); 8073 } 8074 8075 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8076 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8077 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8078 verifyFormat("class C {\n" 8079 " int f() {}\n" 8080 "};", 8081 MergeEmptyOnly); 8082 verifyFormat("class C {\n" 8083 " int f() {\n" 8084 " return 42;\n" 8085 " }\n" 8086 "};", 8087 MergeEmptyOnly); 8088 verifyFormat("int f() {}", MergeEmptyOnly); 8089 verifyFormat("int f() {\n" 8090 " return 42;\n" 8091 "}", 8092 MergeEmptyOnly); 8093 8094 // Also verify behavior when BraceWrapping.AfterFunction = true 8095 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8096 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8097 verifyFormat("int f() {}", MergeEmptyOnly); 8098 verifyFormat("class C {\n" 8099 " int f() {}\n" 8100 "};", 8101 MergeEmptyOnly); 8102 } 8103 8104 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8105 FormatStyle MergeInlineOnly = getLLVMStyle(); 8106 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8107 verifyFormat("class C {\n" 8108 " int f() { return 42; }\n" 8109 "};", 8110 MergeInlineOnly); 8111 verifyFormat("int f() {\n" 8112 " return 42;\n" 8113 "}", 8114 MergeInlineOnly); 8115 8116 // SFS_Inline implies SFS_Empty 8117 verifyFormat("class C {\n" 8118 " int f() {}\n" 8119 "};", 8120 MergeInlineOnly); 8121 verifyFormat("int f() {}", MergeInlineOnly); 8122 8123 // Also verify behavior when BraceWrapping.AfterFunction = true 8124 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8125 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8126 verifyFormat("class C {\n" 8127 " int f() { return 42; }\n" 8128 "};", 8129 MergeInlineOnly); 8130 verifyFormat("int f()\n" 8131 "{\n" 8132 " return 42;\n" 8133 "}", 8134 MergeInlineOnly); 8135 8136 // SFS_Inline implies SFS_Empty 8137 verifyFormat("int f() {}", MergeInlineOnly); 8138 verifyFormat("class C {\n" 8139 " int f() {}\n" 8140 "};", 8141 MergeInlineOnly); 8142 } 8143 8144 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8145 FormatStyle MergeInlineOnly = getLLVMStyle(); 8146 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8147 FormatStyle::SFS_InlineOnly; 8148 verifyFormat("class C {\n" 8149 " int f() { return 42; }\n" 8150 "};", 8151 MergeInlineOnly); 8152 verifyFormat("int f() {\n" 8153 " return 42;\n" 8154 "}", 8155 MergeInlineOnly); 8156 8157 // SFS_InlineOnly does not imply SFS_Empty 8158 verifyFormat("class C {\n" 8159 " int f() {}\n" 8160 "};", 8161 MergeInlineOnly); 8162 verifyFormat("int f() {\n" 8163 "}", 8164 MergeInlineOnly); 8165 8166 // Also verify behavior when BraceWrapping.AfterFunction = true 8167 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8168 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8169 verifyFormat("class C {\n" 8170 " int f() { return 42; }\n" 8171 "};", 8172 MergeInlineOnly); 8173 verifyFormat("int f()\n" 8174 "{\n" 8175 " return 42;\n" 8176 "}", 8177 MergeInlineOnly); 8178 8179 // SFS_InlineOnly does not imply SFS_Empty 8180 verifyFormat("int f()\n" 8181 "{\n" 8182 "}", 8183 MergeInlineOnly); 8184 verifyFormat("class C {\n" 8185 " int f() {}\n" 8186 "};", 8187 MergeInlineOnly); 8188 } 8189 8190 TEST_F(FormatTest, SplitEmptyFunction) { 8191 FormatStyle Style = getLLVMStyle(); 8192 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8193 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8194 Style.BraceWrapping.AfterFunction = true; 8195 Style.BraceWrapping.SplitEmptyFunction = false; 8196 Style.ColumnLimit = 40; 8197 8198 verifyFormat("int f()\n" 8199 "{}", 8200 Style); 8201 verifyFormat("int f()\n" 8202 "{\n" 8203 " return 42;\n" 8204 "}", 8205 Style); 8206 verifyFormat("int f()\n" 8207 "{\n" 8208 " // some comment\n" 8209 "}", 8210 Style); 8211 8212 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8213 verifyFormat("int f() {}", Style); 8214 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8215 "{}", 8216 Style); 8217 verifyFormat("int f()\n" 8218 "{\n" 8219 " return 0;\n" 8220 "}", 8221 Style); 8222 8223 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8224 verifyFormat("class Foo {\n" 8225 " int f() {}\n" 8226 "};\n", 8227 Style); 8228 verifyFormat("class Foo {\n" 8229 " int f() { return 0; }\n" 8230 "};\n", 8231 Style); 8232 verifyFormat("class Foo {\n" 8233 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8234 " {}\n" 8235 "};\n", 8236 Style); 8237 verifyFormat("class Foo {\n" 8238 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8239 " {\n" 8240 " return 0;\n" 8241 " }\n" 8242 "};\n", 8243 Style); 8244 8245 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8246 verifyFormat("int f() {}", Style); 8247 verifyFormat("int f() { return 0; }", Style); 8248 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8249 "{}", 8250 Style); 8251 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8252 "{\n" 8253 " return 0;\n" 8254 "}", 8255 Style); 8256 } 8257 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8258 FormatStyle Style = getLLVMStyle(); 8259 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8260 verifyFormat("#ifdef A\n" 8261 "int f() {}\n" 8262 "#else\n" 8263 "int g() {}\n" 8264 "#endif", 8265 Style); 8266 } 8267 8268 TEST_F(FormatTest, SplitEmptyClass) { 8269 FormatStyle Style = getLLVMStyle(); 8270 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8271 Style.BraceWrapping.AfterClass = true; 8272 Style.BraceWrapping.SplitEmptyRecord = false; 8273 8274 verifyFormat("class Foo\n" 8275 "{};", 8276 Style); 8277 verifyFormat("/* something */ class Foo\n" 8278 "{};", 8279 Style); 8280 verifyFormat("template <typename X> class Foo\n" 8281 "{};", 8282 Style); 8283 verifyFormat("class Foo\n" 8284 "{\n" 8285 " Foo();\n" 8286 "};", 8287 Style); 8288 verifyFormat("typedef class Foo\n" 8289 "{\n" 8290 "} Foo_t;", 8291 Style); 8292 } 8293 8294 TEST_F(FormatTest, SplitEmptyStruct) { 8295 FormatStyle Style = getLLVMStyle(); 8296 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8297 Style.BraceWrapping.AfterStruct = true; 8298 Style.BraceWrapping.SplitEmptyRecord = false; 8299 8300 verifyFormat("struct Foo\n" 8301 "{};", 8302 Style); 8303 verifyFormat("/* something */ struct Foo\n" 8304 "{};", 8305 Style); 8306 verifyFormat("template <typename X> struct Foo\n" 8307 "{};", 8308 Style); 8309 verifyFormat("struct Foo\n" 8310 "{\n" 8311 " Foo();\n" 8312 "};", 8313 Style); 8314 verifyFormat("typedef struct Foo\n" 8315 "{\n" 8316 "} Foo_t;", 8317 Style); 8318 //typedef struct Bar {} Bar_t; 8319 } 8320 8321 TEST_F(FormatTest, SplitEmptyUnion) { 8322 FormatStyle Style = getLLVMStyle(); 8323 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8324 Style.BraceWrapping.AfterUnion = true; 8325 Style.BraceWrapping.SplitEmptyRecord = false; 8326 8327 verifyFormat("union Foo\n" 8328 "{};", 8329 Style); 8330 verifyFormat("/* something */ union Foo\n" 8331 "{};", 8332 Style); 8333 verifyFormat("union Foo\n" 8334 "{\n" 8335 " A,\n" 8336 "};", 8337 Style); 8338 verifyFormat("typedef union Foo\n" 8339 "{\n" 8340 "} Foo_t;", 8341 Style); 8342 } 8343 8344 TEST_F(FormatTest, SplitEmptyNamespace) { 8345 FormatStyle Style = getLLVMStyle(); 8346 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8347 Style.BraceWrapping.AfterNamespace = true; 8348 Style.BraceWrapping.SplitEmptyNamespace = false; 8349 8350 verifyFormat("namespace Foo\n" 8351 "{};", 8352 Style); 8353 verifyFormat("/* something */ namespace Foo\n" 8354 "{};", 8355 Style); 8356 verifyFormat("inline namespace Foo\n" 8357 "{};", 8358 Style); 8359 verifyFormat("/* something */ inline namespace Foo\n" 8360 "{};", 8361 Style); 8362 verifyFormat("export namespace Foo\n" 8363 "{};", 8364 Style); 8365 verifyFormat("namespace Foo\n" 8366 "{\n" 8367 "void Bar();\n" 8368 "};", 8369 Style); 8370 } 8371 8372 TEST_F(FormatTest, NeverMergeShortRecords) { 8373 FormatStyle Style = getLLVMStyle(); 8374 8375 verifyFormat("class Foo {\n" 8376 " Foo();\n" 8377 "};", 8378 Style); 8379 verifyFormat("typedef class Foo {\n" 8380 " Foo();\n" 8381 "} Foo_t;", 8382 Style); 8383 verifyFormat("struct Foo {\n" 8384 " Foo();\n" 8385 "};", 8386 Style); 8387 verifyFormat("typedef struct Foo {\n" 8388 " Foo();\n" 8389 "} Foo_t;", 8390 Style); 8391 verifyFormat("union Foo {\n" 8392 " A,\n" 8393 "};", 8394 Style); 8395 verifyFormat("typedef union Foo {\n" 8396 " A,\n" 8397 "} Foo_t;", 8398 Style); 8399 verifyFormat("namespace Foo {\n" 8400 "void Bar();\n" 8401 "};", 8402 Style); 8403 8404 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8405 Style.BraceWrapping.AfterClass = true; 8406 Style.BraceWrapping.AfterStruct = true; 8407 Style.BraceWrapping.AfterUnion = true; 8408 Style.BraceWrapping.AfterNamespace = true; 8409 verifyFormat("class Foo\n" 8410 "{\n" 8411 " Foo();\n" 8412 "};", 8413 Style); 8414 verifyFormat("typedef class Foo\n" 8415 "{\n" 8416 " Foo();\n" 8417 "} Foo_t;", 8418 Style); 8419 verifyFormat("struct Foo\n" 8420 "{\n" 8421 " Foo();\n" 8422 "};", 8423 Style); 8424 verifyFormat("typedef struct Foo\n" 8425 "{\n" 8426 " Foo();\n" 8427 "} Foo_t;", 8428 Style); 8429 verifyFormat("union Foo\n" 8430 "{\n" 8431 " A,\n" 8432 "};", 8433 Style); 8434 verifyFormat("typedef union Foo\n" 8435 "{\n" 8436 " A,\n" 8437 "} Foo_t;", 8438 Style); 8439 verifyFormat("namespace Foo\n" 8440 "{\n" 8441 "void Bar();\n" 8442 "};", 8443 Style); 8444 } 8445 8446 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 8447 // Elaborate type variable declarations. 8448 verifyFormat("struct foo a = {bar};\nint n;"); 8449 verifyFormat("class foo a = {bar};\nint n;"); 8450 verifyFormat("union foo a = {bar};\nint n;"); 8451 8452 // Elaborate types inside function definitions. 8453 verifyFormat("struct foo f() {}\nint n;"); 8454 verifyFormat("class foo f() {}\nint n;"); 8455 verifyFormat("union foo f() {}\nint n;"); 8456 8457 // Templates. 8458 verifyFormat("template <class X> void f() {}\nint n;"); 8459 verifyFormat("template <struct X> void f() {}\nint n;"); 8460 verifyFormat("template <union X> void f() {}\nint n;"); 8461 8462 // Actual definitions... 8463 verifyFormat("struct {\n} n;"); 8464 verifyFormat( 8465 "template <template <class T, class Y>, class Z> class X {\n} n;"); 8466 verifyFormat("union Z {\n int n;\n} x;"); 8467 verifyFormat("class MACRO Z {\n} n;"); 8468 verifyFormat("class MACRO(X) Z {\n} n;"); 8469 verifyFormat("class __attribute__(X) Z {\n} n;"); 8470 verifyFormat("class __declspec(X) Z {\n} n;"); 8471 verifyFormat("class A##B##C {\n} n;"); 8472 verifyFormat("class alignas(16) Z {\n} n;"); 8473 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 8474 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 8475 8476 // Redefinition from nested context: 8477 verifyFormat("class A::B::C {\n} n;"); 8478 8479 // Template definitions. 8480 verifyFormat( 8481 "template <typename F>\n" 8482 "Matcher(const Matcher<F> &Other,\n" 8483 " typename enable_if_c<is_base_of<F, T>::value &&\n" 8484 " !is_same<F, T>::value>::type * = 0)\n" 8485 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 8486 8487 // FIXME: This is still incorrectly handled at the formatter side. 8488 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 8489 verifyFormat("int i = SomeFunction(a<b, a> b);"); 8490 8491 // FIXME: 8492 // This now gets parsed incorrectly as class definition. 8493 // verifyFormat("class A<int> f() {\n}\nint n;"); 8494 8495 // Elaborate types where incorrectly parsing the structural element would 8496 // break the indent. 8497 verifyFormat("if (true)\n" 8498 " class X x;\n" 8499 "else\n" 8500 " f();\n"); 8501 8502 // This is simply incomplete. Formatting is not important, but must not crash. 8503 verifyFormat("class A:"); 8504 } 8505 8506 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 8507 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 8508 format("#error Leave all white!!!!! space* alone!\n")); 8509 EXPECT_EQ( 8510 "#warning Leave all white!!!!! space* alone!\n", 8511 format("#warning Leave all white!!!!! space* alone!\n")); 8512 EXPECT_EQ("#error 1", format(" # error 1")); 8513 EXPECT_EQ("#warning 1", format(" # warning 1")); 8514 } 8515 8516 TEST_F(FormatTest, FormatHashIfExpressions) { 8517 verifyFormat("#if AAAA && BBBB"); 8518 verifyFormat("#if (AAAA && BBBB)"); 8519 verifyFormat("#elif (AAAA && BBBB)"); 8520 // FIXME: Come up with a better indentation for #elif. 8521 verifyFormat( 8522 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 8523 " defined(BBBBBBBB)\n" 8524 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 8525 " defined(BBBBBBBB)\n" 8526 "#endif", 8527 getLLVMStyleWithColumns(65)); 8528 } 8529 8530 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 8531 FormatStyle AllowsMergedIf = getGoogleStyle(); 8532 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 8533 FormatStyle::SIS_WithoutElse; 8534 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 8535 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 8536 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 8537 EXPECT_EQ("if (true) return 42;", 8538 format("if (true)\nreturn 42;", AllowsMergedIf)); 8539 FormatStyle ShortMergedIf = AllowsMergedIf; 8540 ShortMergedIf.ColumnLimit = 25; 8541 verifyFormat("#define A \\\n" 8542 " if (true) return 42;", 8543 ShortMergedIf); 8544 verifyFormat("#define A \\\n" 8545 " f(); \\\n" 8546 " if (true)\n" 8547 "#define B", 8548 ShortMergedIf); 8549 verifyFormat("#define A \\\n" 8550 " f(); \\\n" 8551 " if (true)\n" 8552 "g();", 8553 ShortMergedIf); 8554 verifyFormat("{\n" 8555 "#ifdef A\n" 8556 " // Comment\n" 8557 " if (true) continue;\n" 8558 "#endif\n" 8559 " // Comment\n" 8560 " if (true) continue;\n" 8561 "}", 8562 ShortMergedIf); 8563 ShortMergedIf.ColumnLimit = 33; 8564 verifyFormat("#define A \\\n" 8565 " if constexpr (true) return 42;", 8566 ShortMergedIf); 8567 ShortMergedIf.ColumnLimit = 29; 8568 verifyFormat("#define A \\\n" 8569 " if (aaaaaaaaaa) return 1; \\\n" 8570 " return 2;", 8571 ShortMergedIf); 8572 ShortMergedIf.ColumnLimit = 28; 8573 verifyFormat("#define A \\\n" 8574 " if (aaaaaaaaaa) \\\n" 8575 " return 1; \\\n" 8576 " return 2;", 8577 ShortMergedIf); 8578 verifyFormat("#define A \\\n" 8579 " if constexpr (aaaaaaa) \\\n" 8580 " return 1; \\\n" 8581 " return 2;", 8582 ShortMergedIf); 8583 } 8584 8585 TEST_F(FormatTest, FormatStarDependingOnContext) { 8586 verifyFormat("void f(int *a);"); 8587 verifyFormat("void f() { f(fint * b); }"); 8588 verifyFormat("class A {\n void f(int *a);\n};"); 8589 verifyFormat("class A {\n int *a;\n};"); 8590 verifyFormat("namespace a {\n" 8591 "namespace b {\n" 8592 "class A {\n" 8593 " void f() {}\n" 8594 " int *a;\n" 8595 "};\n" 8596 "} // namespace b\n" 8597 "} // namespace a"); 8598 } 8599 8600 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 8601 verifyFormat("while"); 8602 verifyFormat("operator"); 8603 } 8604 8605 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 8606 // This code would be painfully slow to format if we didn't skip it. 8607 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 8608 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8609 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8610 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8611 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8612 "A(1, 1)\n" 8613 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 8614 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8615 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8616 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8617 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8618 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8619 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8620 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8621 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8622 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 8623 // Deeply nested part is untouched, rest is formatted. 8624 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 8625 format(std::string("int i;\n") + Code + "int j;\n", 8626 getLLVMStyle(), SC_ExpectIncomplete)); 8627 } 8628 8629 //===----------------------------------------------------------------------===// 8630 // Objective-C tests. 8631 //===----------------------------------------------------------------------===// 8632 8633 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 8634 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 8635 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 8636 format("-(NSUInteger)indexOfObject:(id)anObject;")); 8637 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 8638 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 8639 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 8640 format("-(NSInteger)Method3:(id)anObject;")); 8641 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 8642 format("-(NSInteger)Method4:(id)anObject;")); 8643 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 8644 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 8645 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 8646 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 8647 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 8648 "forAllCells:(BOOL)flag;", 8649 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 8650 "forAllCells:(BOOL)flag;")); 8651 8652 // Very long objectiveC method declaration. 8653 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 8654 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 8655 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 8656 " inRange:(NSRange)range\n" 8657 " outRange:(NSRange)out_range\n" 8658 " outRange1:(NSRange)out_range1\n" 8659 " outRange2:(NSRange)out_range2\n" 8660 " outRange3:(NSRange)out_range3\n" 8661 " outRange4:(NSRange)out_range4\n" 8662 " outRange5:(NSRange)out_range5\n" 8663 " outRange6:(NSRange)out_range6\n" 8664 " outRange7:(NSRange)out_range7\n" 8665 " outRange8:(NSRange)out_range8\n" 8666 " outRange9:(NSRange)out_range9;"); 8667 8668 // When the function name has to be wrapped. 8669 FormatStyle Style = getLLVMStyle(); 8670 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 8671 // and always indents instead. 8672 Style.IndentWrappedFunctionNames = false; 8673 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 8674 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 8675 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 8676 "}", 8677 Style); 8678 Style.IndentWrappedFunctionNames = true; 8679 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 8680 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 8681 " anotherName:(NSString)dddddddddddddd {\n" 8682 "}", 8683 Style); 8684 8685 verifyFormat("- (int)sum:(vector<int>)numbers;"); 8686 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 8687 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 8688 // protocol lists (but not for template classes): 8689 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 8690 8691 verifyFormat("- (int (*)())foo:(int (*)())f;"); 8692 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 8693 8694 // If there's no return type (very rare in practice!), LLVM and Google style 8695 // agree. 8696 verifyFormat("- foo;"); 8697 verifyFormat("- foo:(int)f;"); 8698 verifyGoogleFormat("- foo:(int)foo;"); 8699 } 8700 8701 8702 TEST_F(FormatTest, BreaksStringLiterals) { 8703 EXPECT_EQ("\"some text \"\n" 8704 "\"other\";", 8705 format("\"some text other\";", getLLVMStyleWithColumns(12))); 8706 EXPECT_EQ("\"some text \"\n" 8707 "\"other\";", 8708 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 8709 EXPECT_EQ( 8710 "#define A \\\n" 8711 " \"some \" \\\n" 8712 " \"text \" \\\n" 8713 " \"other\";", 8714 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 8715 EXPECT_EQ( 8716 "#define A \\\n" 8717 " \"so \" \\\n" 8718 " \"text \" \\\n" 8719 " \"other\";", 8720 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 8721 8722 EXPECT_EQ("\"some text\"", 8723 format("\"some text\"", getLLVMStyleWithColumns(1))); 8724 EXPECT_EQ("\"some text\"", 8725 format("\"some text\"", getLLVMStyleWithColumns(11))); 8726 EXPECT_EQ("\"some \"\n" 8727 "\"text\"", 8728 format("\"some text\"", getLLVMStyleWithColumns(10))); 8729 EXPECT_EQ("\"some \"\n" 8730 "\"text\"", 8731 format("\"some text\"", getLLVMStyleWithColumns(7))); 8732 EXPECT_EQ("\"some\"\n" 8733 "\" tex\"\n" 8734 "\"t\"", 8735 format("\"some text\"", getLLVMStyleWithColumns(6))); 8736 EXPECT_EQ("\"some\"\n" 8737 "\" tex\"\n" 8738 "\" and\"", 8739 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 8740 EXPECT_EQ("\"some\"\n" 8741 "\"/tex\"\n" 8742 "\"/and\"", 8743 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 8744 8745 EXPECT_EQ("variable =\n" 8746 " \"long string \"\n" 8747 " \"literal\";", 8748 format("variable = \"long string literal\";", 8749 getLLVMStyleWithColumns(20))); 8750 8751 EXPECT_EQ("variable = f(\n" 8752 " \"long string \"\n" 8753 " \"literal\",\n" 8754 " short,\n" 8755 " loooooooooooooooooooong);", 8756 format("variable = f(\"long string literal\", short, " 8757 "loooooooooooooooooooong);", 8758 getLLVMStyleWithColumns(20))); 8759 8760 EXPECT_EQ( 8761 "f(g(\"long string \"\n" 8762 " \"literal\"),\n" 8763 " b);", 8764 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 8765 EXPECT_EQ("f(g(\"long string \"\n" 8766 " \"literal\",\n" 8767 " a),\n" 8768 " b);", 8769 format("f(g(\"long string literal\", a), b);", 8770 getLLVMStyleWithColumns(20))); 8771 EXPECT_EQ( 8772 "f(\"one two\".split(\n" 8773 " variable));", 8774 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 8775 EXPECT_EQ("f(\"one two three four five six \"\n" 8776 " \"seven\".split(\n" 8777 " really_looooong_variable));", 8778 format("f(\"one two three four five six seven\"." 8779 "split(really_looooong_variable));", 8780 getLLVMStyleWithColumns(33))); 8781 8782 EXPECT_EQ("f(\"some \"\n" 8783 " \"text\",\n" 8784 " other);", 8785 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 8786 8787 // Only break as a last resort. 8788 verifyFormat( 8789 "aaaaaaaaaaaaaaaaaaaa(\n" 8790 " aaaaaaaaaaaaaaaaaaaa,\n" 8791 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 8792 8793 EXPECT_EQ("\"splitmea\"\n" 8794 "\"trandomp\"\n" 8795 "\"oint\"", 8796 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 8797 8798 EXPECT_EQ("\"split/\"\n" 8799 "\"pathat/\"\n" 8800 "\"slashes\"", 8801 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 8802 8803 EXPECT_EQ("\"split/\"\n" 8804 "\"pathat/\"\n" 8805 "\"slashes\"", 8806 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 8807 EXPECT_EQ("\"split at \"\n" 8808 "\"spaces/at/\"\n" 8809 "\"slashes.at.any$\"\n" 8810 "\"non-alphanumeric%\"\n" 8811 "\"1111111111characte\"\n" 8812 "\"rs\"", 8813 format("\"split at " 8814 "spaces/at/" 8815 "slashes.at." 8816 "any$non-" 8817 "alphanumeric%" 8818 "1111111111characte" 8819 "rs\"", 8820 getLLVMStyleWithColumns(20))); 8821 8822 // Verify that splitting the strings understands 8823 // Style::AlwaysBreakBeforeMultilineStrings. 8824 EXPECT_EQ( 8825 "aaaaaaaaaaaa(\n" 8826 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 8827 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 8828 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 8829 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 8830 "aaaaaaaaaaaaaaaaaaaaaa\");", 8831 getGoogleStyle())); 8832 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8833 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 8834 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 8835 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 8836 "aaaaaaaaaaaaaaaaaaaaaa\";", 8837 getGoogleStyle())); 8838 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8839 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 8840 format("llvm::outs() << " 8841 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 8842 "aaaaaaaaaaaaaaaaaaa\";")); 8843 EXPECT_EQ("ffff(\n" 8844 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 8845 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 8846 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 8847 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 8848 getGoogleStyle())); 8849 8850 FormatStyle Style = getLLVMStyleWithColumns(12); 8851 Style.BreakStringLiterals = false; 8852 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 8853 8854 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 8855 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 8856 EXPECT_EQ("#define A \\\n" 8857 " \"some \" \\\n" 8858 " \"text \" \\\n" 8859 " \"other\";", 8860 format("#define A \"some text other\";", AlignLeft)); 8861 } 8862 8863 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 8864 EXPECT_EQ("C a = \"some more \"\n" 8865 " \"text\";", 8866 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 8867 } 8868 8869 TEST_F(FormatTest, FullyRemoveEmptyLines) { 8870 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 8871 NoEmptyLines.MaxEmptyLinesToKeep = 0; 8872 EXPECT_EQ("int i = a(b());", 8873 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 8874 } 8875 8876 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 8877 EXPECT_EQ( 8878 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 8879 "(\n" 8880 " \"x\t\");", 8881 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 8882 "aaaaaaa(" 8883 "\"x\t\");")); 8884 } 8885 8886 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 8887 EXPECT_EQ( 8888 "u8\"utf8 string \"\n" 8889 "u8\"literal\";", 8890 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 8891 EXPECT_EQ( 8892 "u\"utf16 string \"\n" 8893 "u\"literal\";", 8894 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 8895 EXPECT_EQ( 8896 "U\"utf32 string \"\n" 8897 "U\"literal\";", 8898 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 8899 EXPECT_EQ("L\"wide string \"\n" 8900 "L\"literal\";", 8901 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 8902 EXPECT_EQ("@\"NSString \"\n" 8903 "@\"literal\";", 8904 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 8905 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 8906 8907 // This input makes clang-format try to split the incomplete unicode escape 8908 // sequence, which used to lead to a crasher. 8909 verifyNoCrash( 8910 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 8911 getLLVMStyleWithColumns(60)); 8912 } 8913 8914 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 8915 FormatStyle Style = getGoogleStyleWithColumns(15); 8916 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 8917 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 8918 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 8919 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 8920 EXPECT_EQ("u8R\"x(raw literal)x\";", 8921 format("u8R\"x(raw literal)x\";", Style)); 8922 } 8923 8924 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 8925 FormatStyle Style = getLLVMStyleWithColumns(20); 8926 EXPECT_EQ( 8927 "_T(\"aaaaaaaaaaaaaa\")\n" 8928 "_T(\"aaaaaaaaaaaaaa\")\n" 8929 "_T(\"aaaaaaaaaaaa\")", 8930 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 8931 EXPECT_EQ("f(x,\n" 8932 " _T(\"aaaaaaaaaaaa\")\n" 8933 " _T(\"aaa\"),\n" 8934 " z);", 8935 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 8936 8937 // FIXME: Handle embedded spaces in one iteration. 8938 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 8939 // "_T(\"aaaaaaaaaaaaa\")\n" 8940 // "_T(\"aaaaaaaaaaaaa\")\n" 8941 // "_T(\"a\")", 8942 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 8943 // getLLVMStyleWithColumns(20))); 8944 EXPECT_EQ( 8945 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 8946 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 8947 EXPECT_EQ("f(\n" 8948 "#if !TEST\n" 8949 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 8950 "#endif\n" 8951 ");", 8952 format("f(\n" 8953 "#if !TEST\n" 8954 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 8955 "#endif\n" 8956 ");")); 8957 EXPECT_EQ("f(\n" 8958 "\n" 8959 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 8960 format("f(\n" 8961 "\n" 8962 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 8963 } 8964 8965 TEST_F(FormatTest, BreaksStringLiteralOperands) { 8966 // In a function call with two operands, the second can be broken with no line 8967 // break before it. 8968 EXPECT_EQ("func(a, \"long long \"\n" 8969 " \"long long\");", 8970 format("func(a, \"long long long long\");", 8971 getLLVMStyleWithColumns(24))); 8972 // In a function call with three operands, the second must be broken with a 8973 // line break before it. 8974 EXPECT_EQ("func(a,\n" 8975 " \"long long long \"\n" 8976 " \"long\",\n" 8977 " c);", 8978 format("func(a, \"long long long long\", c);", 8979 getLLVMStyleWithColumns(24))); 8980 // In a function call with three operands, the third must be broken with a 8981 // line break before it. 8982 EXPECT_EQ("func(a, b,\n" 8983 " \"long long long \"\n" 8984 " \"long\");", 8985 format("func(a, b, \"long long long long\");", 8986 getLLVMStyleWithColumns(24))); 8987 // In a function call with three operands, both the second and the third must 8988 // be broken with a line break before them. 8989 EXPECT_EQ("func(a,\n" 8990 " \"long long long \"\n" 8991 " \"long\",\n" 8992 " \"long long long \"\n" 8993 " \"long\");", 8994 format("func(a, \"long long long long\", \"long long long long\");", 8995 getLLVMStyleWithColumns(24))); 8996 // In a chain of << with two operands, the second can be broken with no line 8997 // break before it. 8998 EXPECT_EQ("a << \"line line \"\n" 8999 " \"line\";", 9000 format("a << \"line line line\";", 9001 getLLVMStyleWithColumns(20))); 9002 // In a chain of << with three operands, the second can be broken with no line 9003 // break before it. 9004 EXPECT_EQ("abcde << \"line \"\n" 9005 " \"line line\"\n" 9006 " << c;", 9007 format("abcde << \"line line line\" << c;", 9008 getLLVMStyleWithColumns(20))); 9009 // In a chain of << with three operands, the third must be broken with a line 9010 // break before it. 9011 EXPECT_EQ("a << b\n" 9012 " << \"line line \"\n" 9013 " \"line\";", 9014 format("a << b << \"line line line\";", 9015 getLLVMStyleWithColumns(20))); 9016 // In a chain of << with three operands, the second can be broken with no line 9017 // break before it and the third must be broken with a line break before it. 9018 EXPECT_EQ("abcd << \"line line \"\n" 9019 " \"line\"\n" 9020 " << \"line line \"\n" 9021 " \"line\";", 9022 format("abcd << \"line line line\" << \"line line line\";", 9023 getLLVMStyleWithColumns(20))); 9024 // In a chain of binary operators with two operands, the second can be broken 9025 // with no line break before it. 9026 EXPECT_EQ("abcd + \"line line \"\n" 9027 " \"line line\";", 9028 format("abcd + \"line line line line\";", 9029 getLLVMStyleWithColumns(20))); 9030 // In a chain of binary operators with three operands, the second must be 9031 // broken with a line break before it. 9032 EXPECT_EQ("abcd +\n" 9033 " \"line line \"\n" 9034 " \"line line\" +\n" 9035 " e;", 9036 format("abcd + \"line line line line\" + e;", 9037 getLLVMStyleWithColumns(20))); 9038 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9039 // the first must be broken with a line break before it. 9040 FormatStyle Style = getLLVMStyleWithColumns(25); 9041 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9042 EXPECT_EQ("someFunction(\n" 9043 " \"long long long \"\n" 9044 " \"long\",\n" 9045 " a);", 9046 format("someFunction(\"long long long long\", a);", Style)); 9047 } 9048 9049 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9050 EXPECT_EQ( 9051 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9053 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9054 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9057 } 9058 9059 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9060 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9061 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9062 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9063 "multiline raw string literal xxxxxxxxxxxxxx\n" 9064 ")x\",\n" 9065 " a),\n" 9066 " b);", 9067 format("fffffffffff(g(R\"x(\n" 9068 "multiline raw string literal xxxxxxxxxxxxxx\n" 9069 ")x\", a), b);", 9070 getGoogleStyleWithColumns(20))); 9071 EXPECT_EQ("fffffffffff(\n" 9072 " g(R\"x(qqq\n" 9073 "multiline raw string literal xxxxxxxxxxxxxx\n" 9074 ")x\",\n" 9075 " a),\n" 9076 " b);", 9077 format("fffffffffff(g(R\"x(qqq\n" 9078 "multiline raw string literal xxxxxxxxxxxxxx\n" 9079 ")x\", a), b);", 9080 getGoogleStyleWithColumns(20))); 9081 9082 EXPECT_EQ("fffffffffff(R\"x(\n" 9083 "multiline raw string literal xxxxxxxxxxxxxx\n" 9084 ")x\");", 9085 format("fffffffffff(R\"x(\n" 9086 "multiline raw string literal xxxxxxxxxxxxxx\n" 9087 ")x\");", 9088 getGoogleStyleWithColumns(20))); 9089 EXPECT_EQ("fffffffffff(R\"x(\n" 9090 "multiline raw string literal xxxxxxxxxxxxxx\n" 9091 ")x\" + bbbbbb);", 9092 format("fffffffffff(R\"x(\n" 9093 "multiline raw string literal xxxxxxxxxxxxxx\n" 9094 ")x\" + bbbbbb);", 9095 getGoogleStyleWithColumns(20))); 9096 EXPECT_EQ("fffffffffff(\n" 9097 " R\"x(\n" 9098 "multiline raw string literal xxxxxxxxxxxxxx\n" 9099 ")x\" +\n" 9100 " bbbbbb);", 9101 format("fffffffffff(\n" 9102 " R\"x(\n" 9103 "multiline raw string literal xxxxxxxxxxxxxx\n" 9104 ")x\" + bbbbbb);", 9105 getGoogleStyleWithColumns(20))); 9106 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9107 format("fffffffffff(\n" 9108 " R\"(single line raw string)\" + bbbbbb);")); 9109 } 9110 9111 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9112 verifyFormat("string a = \"unterminated;"); 9113 EXPECT_EQ("function(\"unterminated,\n" 9114 " OtherParameter);", 9115 format("function( \"unterminated,\n" 9116 " OtherParameter);")); 9117 } 9118 9119 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9120 FormatStyle Style = getLLVMStyle(); 9121 Style.Standard = FormatStyle::LS_Cpp03; 9122 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9123 format("#define x(_a) printf(\"foo\"_a);", Style)); 9124 } 9125 9126 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9127 9128 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9129 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9130 " \"ddeeefff\");", 9131 format("someFunction(\"aaabbbcccdddeeefff\");", 9132 getLLVMStyleWithColumns(25))); 9133 EXPECT_EQ("someFunction1234567890(\n" 9134 " \"aaabbbcccdddeeefff\");", 9135 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9136 getLLVMStyleWithColumns(26))); 9137 EXPECT_EQ("someFunction1234567890(\n" 9138 " \"aaabbbcccdddeeeff\"\n" 9139 " \"f\");", 9140 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9141 getLLVMStyleWithColumns(25))); 9142 EXPECT_EQ("someFunction1234567890(\n" 9143 " \"aaabbbcccdddeeeff\"\n" 9144 " \"f\");", 9145 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9146 getLLVMStyleWithColumns(24))); 9147 EXPECT_EQ("someFunction(\n" 9148 " \"aaabbbcc ddde \"\n" 9149 " \"efff\");", 9150 format("someFunction(\"aaabbbcc ddde efff\");", 9151 getLLVMStyleWithColumns(25))); 9152 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9153 " \"ddeeefff\");", 9154 format("someFunction(\"aaabbbccc ddeeefff\");", 9155 getLLVMStyleWithColumns(25))); 9156 EXPECT_EQ("someFunction1234567890(\n" 9157 " \"aaabb \"\n" 9158 " \"cccdddeeefff\");", 9159 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9160 getLLVMStyleWithColumns(25))); 9161 EXPECT_EQ("#define A \\\n" 9162 " string s = \\\n" 9163 " \"123456789\" \\\n" 9164 " \"0\"; \\\n" 9165 " int i;", 9166 format("#define A string s = \"1234567890\"; int i;", 9167 getLLVMStyleWithColumns(20))); 9168 EXPECT_EQ("someFunction(\n" 9169 " \"aaabbbcc \"\n" 9170 " \"dddeeefff\");", 9171 format("someFunction(\"aaabbbcc dddeeefff\");", 9172 getLLVMStyleWithColumns(25))); 9173 } 9174 9175 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9176 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9177 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9178 EXPECT_EQ("\"test\"\n" 9179 "\"\\n\"", 9180 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9181 EXPECT_EQ("\"tes\\\\\"\n" 9182 "\"n\"", 9183 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9184 EXPECT_EQ("\"\\\\\\\\\"\n" 9185 "\"\\n\"", 9186 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9187 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9188 EXPECT_EQ("\"\\uff01\"\n" 9189 "\"test\"", 9190 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9191 EXPECT_EQ("\"\\Uff01ff02\"", 9192 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9193 EXPECT_EQ("\"\\x000000000001\"\n" 9194 "\"next\"", 9195 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9196 EXPECT_EQ("\"\\x000000000001next\"", 9197 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9198 EXPECT_EQ("\"\\x000000000001\"", 9199 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9200 EXPECT_EQ("\"test\"\n" 9201 "\"\\000000\"\n" 9202 "\"000001\"", 9203 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9204 EXPECT_EQ("\"test\\000\"\n" 9205 "\"00000000\"\n" 9206 "\"1\"", 9207 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9208 } 9209 9210 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9211 verifyFormat("void f() {\n" 9212 " return g() {}\n" 9213 " void h() {}"); 9214 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9215 "g();\n" 9216 "}"); 9217 } 9218 9219 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9220 verifyFormat( 9221 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9222 } 9223 9224 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9225 verifyFormat("class X {\n" 9226 " void f() {\n" 9227 " }\n" 9228 "};", 9229 getLLVMStyleWithColumns(12)); 9230 } 9231 9232 TEST_F(FormatTest, ConfigurableIndentWidth) { 9233 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9234 EightIndent.IndentWidth = 8; 9235 EightIndent.ContinuationIndentWidth = 8; 9236 verifyFormat("void f() {\n" 9237 " someFunction();\n" 9238 " if (true) {\n" 9239 " f();\n" 9240 " }\n" 9241 "}", 9242 EightIndent); 9243 verifyFormat("class X {\n" 9244 " void f() {\n" 9245 " }\n" 9246 "};", 9247 EightIndent); 9248 verifyFormat("int x[] = {\n" 9249 " call(),\n" 9250 " call()};", 9251 EightIndent); 9252 } 9253 9254 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9255 verifyFormat("double\n" 9256 "f();", 9257 getLLVMStyleWithColumns(8)); 9258 } 9259 9260 TEST_F(FormatTest, ConfigurableUseOfTab) { 9261 FormatStyle Tab = getLLVMStyleWithColumns(42); 9262 Tab.IndentWidth = 8; 9263 Tab.UseTab = FormatStyle::UT_Always; 9264 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9265 9266 EXPECT_EQ("if (aaaaaaaa && // q\n" 9267 " bb)\t\t// w\n" 9268 "\t;", 9269 format("if (aaaaaaaa &&// q\n" 9270 "bb)// w\n" 9271 ";", 9272 Tab)); 9273 EXPECT_EQ("if (aaa && bbb) // w\n" 9274 "\t;", 9275 format("if(aaa&&bbb)// w\n" 9276 ";", 9277 Tab)); 9278 9279 verifyFormat("class X {\n" 9280 "\tvoid f() {\n" 9281 "\t\tsomeFunction(parameter1,\n" 9282 "\t\t\t parameter2);\n" 9283 "\t}\n" 9284 "};", 9285 Tab); 9286 verifyFormat("#define A \\\n" 9287 "\tvoid f() { \\\n" 9288 "\t\tsomeFunction( \\\n" 9289 "\t\t parameter1, \\\n" 9290 "\t\t parameter2); \\\n" 9291 "\t}", 9292 Tab); 9293 verifyFormat("int a;\t // x\n" 9294 "int bbbbbbbb; // x\n", 9295 Tab); 9296 9297 Tab.TabWidth = 4; 9298 Tab.IndentWidth = 8; 9299 verifyFormat("class TabWidth4Indent8 {\n" 9300 "\t\tvoid f() {\n" 9301 "\t\t\t\tsomeFunction(parameter1,\n" 9302 "\t\t\t\t\t\t\t parameter2);\n" 9303 "\t\t}\n" 9304 "};", 9305 Tab); 9306 9307 Tab.TabWidth = 4; 9308 Tab.IndentWidth = 4; 9309 verifyFormat("class TabWidth4Indent4 {\n" 9310 "\tvoid f() {\n" 9311 "\t\tsomeFunction(parameter1,\n" 9312 "\t\t\t\t\t parameter2);\n" 9313 "\t}\n" 9314 "};", 9315 Tab); 9316 9317 Tab.TabWidth = 8; 9318 Tab.IndentWidth = 4; 9319 verifyFormat("class TabWidth8Indent4 {\n" 9320 " void f() {\n" 9321 "\tsomeFunction(parameter1,\n" 9322 "\t\t parameter2);\n" 9323 " }\n" 9324 "};", 9325 Tab); 9326 9327 Tab.TabWidth = 8; 9328 Tab.IndentWidth = 8; 9329 EXPECT_EQ("/*\n" 9330 "\t a\t\tcomment\n" 9331 "\t in multiple lines\n" 9332 " */", 9333 format(" /*\t \t \n" 9334 " \t \t a\t\tcomment\t \t\n" 9335 " \t \t in multiple lines\t\n" 9336 " \t */", 9337 Tab)); 9338 9339 Tab.UseTab = FormatStyle::UT_ForIndentation; 9340 verifyFormat("{\n" 9341 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9342 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9343 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9344 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9345 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9346 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9347 "};", 9348 Tab); 9349 verifyFormat("enum AA {\n" 9350 "\ta1, // Force multiple lines\n" 9351 "\ta2,\n" 9352 "\ta3\n" 9353 "};", 9354 Tab); 9355 EXPECT_EQ("if (aaaaaaaa && // q\n" 9356 " bb) // w\n" 9357 "\t;", 9358 format("if (aaaaaaaa &&// q\n" 9359 "bb)// w\n" 9360 ";", 9361 Tab)); 9362 verifyFormat("class X {\n" 9363 "\tvoid f() {\n" 9364 "\t\tsomeFunction(parameter1,\n" 9365 "\t\t parameter2);\n" 9366 "\t}\n" 9367 "};", 9368 Tab); 9369 verifyFormat("{\n" 9370 "\tQ(\n" 9371 "\t {\n" 9372 "\t\t int a;\n" 9373 "\t\t someFunction(aaaaaaaa,\n" 9374 "\t\t bbbbbbb);\n" 9375 "\t },\n" 9376 "\t p);\n" 9377 "}", 9378 Tab); 9379 EXPECT_EQ("{\n" 9380 "\t/* aaaa\n" 9381 "\t bbbb */\n" 9382 "}", 9383 format("{\n" 9384 "/* aaaa\n" 9385 " bbbb */\n" 9386 "}", 9387 Tab)); 9388 EXPECT_EQ("{\n" 9389 "\t/*\n" 9390 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9391 "\t bbbbbbbbbbbbb\n" 9392 "\t*/\n" 9393 "}", 9394 format("{\n" 9395 "/*\n" 9396 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9397 "*/\n" 9398 "}", 9399 Tab)); 9400 EXPECT_EQ("{\n" 9401 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9402 "\t// bbbbbbbbbbbbb\n" 9403 "}", 9404 format("{\n" 9405 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9406 "}", 9407 Tab)); 9408 EXPECT_EQ("{\n" 9409 "\t/*\n" 9410 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9411 "\t bbbbbbbbbbbbb\n" 9412 "\t*/\n" 9413 "}", 9414 format("{\n" 9415 "\t/*\n" 9416 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9417 "\t*/\n" 9418 "}", 9419 Tab)); 9420 EXPECT_EQ("{\n" 9421 "\t/*\n" 9422 "\n" 9423 "\t*/\n" 9424 "}", 9425 format("{\n" 9426 "\t/*\n" 9427 "\n" 9428 "\t*/\n" 9429 "}", 9430 Tab)); 9431 EXPECT_EQ("{\n" 9432 "\t/*\n" 9433 " asdf\n" 9434 "\t*/\n" 9435 "}", 9436 format("{\n" 9437 "\t/*\n" 9438 " asdf\n" 9439 "\t*/\n" 9440 "}", 9441 Tab)); 9442 9443 Tab.UseTab = FormatStyle::UT_Never; 9444 EXPECT_EQ("/*\n" 9445 " a\t\tcomment\n" 9446 " in multiple lines\n" 9447 " */", 9448 format(" /*\t \t \n" 9449 " \t \t a\t\tcomment\t \t\n" 9450 " \t \t in multiple lines\t\n" 9451 " \t */", 9452 Tab)); 9453 EXPECT_EQ("/* some\n" 9454 " comment */", 9455 format(" \t \t /* some\n" 9456 " \t \t comment */", 9457 Tab)); 9458 EXPECT_EQ("int a; /* some\n" 9459 " comment */", 9460 format(" \t \t int a; /* some\n" 9461 " \t \t comment */", 9462 Tab)); 9463 9464 EXPECT_EQ("int a; /* some\n" 9465 "comment */", 9466 format(" \t \t int\ta; /* some\n" 9467 " \t \t comment */", 9468 Tab)); 9469 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9470 " comment */", 9471 format(" \t \t f(\"\t\t\"); /* some\n" 9472 " \t \t comment */", 9473 Tab)); 9474 EXPECT_EQ("{\n" 9475 " /*\n" 9476 " * Comment\n" 9477 " */\n" 9478 " int i;\n" 9479 "}", 9480 format("{\n" 9481 "\t/*\n" 9482 "\t * Comment\n" 9483 "\t */\n" 9484 "\t int i;\n" 9485 "}")); 9486 9487 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 9488 Tab.TabWidth = 8; 9489 Tab.IndentWidth = 8; 9490 EXPECT_EQ("if (aaaaaaaa && // q\n" 9491 " bb) // w\n" 9492 "\t;", 9493 format("if (aaaaaaaa &&// q\n" 9494 "bb)// w\n" 9495 ";", 9496 Tab)); 9497 EXPECT_EQ("if (aaa && bbb) // w\n" 9498 "\t;", 9499 format("if(aaa&&bbb)// w\n" 9500 ";", 9501 Tab)); 9502 verifyFormat("class X {\n" 9503 "\tvoid f() {\n" 9504 "\t\tsomeFunction(parameter1,\n" 9505 "\t\t\t parameter2);\n" 9506 "\t}\n" 9507 "};", 9508 Tab); 9509 verifyFormat("#define A \\\n" 9510 "\tvoid f() { \\\n" 9511 "\t\tsomeFunction( \\\n" 9512 "\t\t parameter1, \\\n" 9513 "\t\t parameter2); \\\n" 9514 "\t}", 9515 Tab); 9516 Tab.TabWidth = 4; 9517 Tab.IndentWidth = 8; 9518 verifyFormat("class TabWidth4Indent8 {\n" 9519 "\t\tvoid f() {\n" 9520 "\t\t\t\tsomeFunction(parameter1,\n" 9521 "\t\t\t\t\t\t\t parameter2);\n" 9522 "\t\t}\n" 9523 "};", 9524 Tab); 9525 Tab.TabWidth = 4; 9526 Tab.IndentWidth = 4; 9527 verifyFormat("class TabWidth4Indent4 {\n" 9528 "\tvoid f() {\n" 9529 "\t\tsomeFunction(parameter1,\n" 9530 "\t\t\t\t\t parameter2);\n" 9531 "\t}\n" 9532 "};", 9533 Tab); 9534 Tab.TabWidth = 8; 9535 Tab.IndentWidth = 4; 9536 verifyFormat("class TabWidth8Indent4 {\n" 9537 " void f() {\n" 9538 "\tsomeFunction(parameter1,\n" 9539 "\t\t parameter2);\n" 9540 " }\n" 9541 "};", 9542 Tab); 9543 Tab.TabWidth = 8; 9544 Tab.IndentWidth = 8; 9545 EXPECT_EQ("/*\n" 9546 "\t a\t\tcomment\n" 9547 "\t in multiple lines\n" 9548 " */", 9549 format(" /*\t \t \n" 9550 " \t \t a\t\tcomment\t \t\n" 9551 " \t \t in multiple lines\t\n" 9552 " \t */", 9553 Tab)); 9554 verifyFormat("{\n" 9555 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9556 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9557 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9558 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9559 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9560 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9561 "};", 9562 Tab); 9563 verifyFormat("enum AA {\n" 9564 "\ta1, // Force multiple lines\n" 9565 "\ta2,\n" 9566 "\ta3\n" 9567 "};", 9568 Tab); 9569 EXPECT_EQ("if (aaaaaaaa && // q\n" 9570 " bb) // w\n" 9571 "\t;", 9572 format("if (aaaaaaaa &&// q\n" 9573 "bb)// w\n" 9574 ";", 9575 Tab)); 9576 verifyFormat("class X {\n" 9577 "\tvoid f() {\n" 9578 "\t\tsomeFunction(parameter1,\n" 9579 "\t\t\t parameter2);\n" 9580 "\t}\n" 9581 "};", 9582 Tab); 9583 verifyFormat("{\n" 9584 "\tQ(\n" 9585 "\t {\n" 9586 "\t\t int a;\n" 9587 "\t\t someFunction(aaaaaaaa,\n" 9588 "\t\t\t\t bbbbbbb);\n" 9589 "\t },\n" 9590 "\t p);\n" 9591 "}", 9592 Tab); 9593 EXPECT_EQ("{\n" 9594 "\t/* aaaa\n" 9595 "\t bbbb */\n" 9596 "}", 9597 format("{\n" 9598 "/* aaaa\n" 9599 " bbbb */\n" 9600 "}", 9601 Tab)); 9602 EXPECT_EQ("{\n" 9603 "\t/*\n" 9604 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9605 "\t bbbbbbbbbbbbb\n" 9606 "\t*/\n" 9607 "}", 9608 format("{\n" 9609 "/*\n" 9610 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9611 "*/\n" 9612 "}", 9613 Tab)); 9614 EXPECT_EQ("{\n" 9615 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9616 "\t// bbbbbbbbbbbbb\n" 9617 "}", 9618 format("{\n" 9619 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9620 "}", 9621 Tab)); 9622 EXPECT_EQ("{\n" 9623 "\t/*\n" 9624 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9625 "\t bbbbbbbbbbbbb\n" 9626 "\t*/\n" 9627 "}", 9628 format("{\n" 9629 "\t/*\n" 9630 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9631 "\t*/\n" 9632 "}", 9633 Tab)); 9634 EXPECT_EQ("{\n" 9635 "\t/*\n" 9636 "\n" 9637 "\t*/\n" 9638 "}", 9639 format("{\n" 9640 "\t/*\n" 9641 "\n" 9642 "\t*/\n" 9643 "}", 9644 Tab)); 9645 EXPECT_EQ("{\n" 9646 "\t/*\n" 9647 " asdf\n" 9648 "\t*/\n" 9649 "}", 9650 format("{\n" 9651 "\t/*\n" 9652 " asdf\n" 9653 "\t*/\n" 9654 "}", 9655 Tab)); 9656 EXPECT_EQ("/*\n" 9657 "\t a\t\tcomment\n" 9658 "\t in multiple lines\n" 9659 " */", 9660 format(" /*\t \t \n" 9661 " \t \t a\t\tcomment\t \t\n" 9662 " \t \t in multiple lines\t\n" 9663 " \t */", 9664 Tab)); 9665 EXPECT_EQ("/* some\n" 9666 " comment */", 9667 format(" \t \t /* some\n" 9668 " \t \t comment */", 9669 Tab)); 9670 EXPECT_EQ("int a; /* some\n" 9671 " comment */", 9672 format(" \t \t int a; /* some\n" 9673 " \t \t comment */", 9674 Tab)); 9675 EXPECT_EQ("int a; /* some\n" 9676 "comment */", 9677 format(" \t \t int\ta; /* some\n" 9678 " \t \t comment */", 9679 Tab)); 9680 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9681 " comment */", 9682 format(" \t \t f(\"\t\t\"); /* some\n" 9683 " \t \t comment */", 9684 Tab)); 9685 EXPECT_EQ("{\n" 9686 " /*\n" 9687 " * Comment\n" 9688 " */\n" 9689 " int i;\n" 9690 "}", 9691 format("{\n" 9692 "\t/*\n" 9693 "\t * Comment\n" 9694 "\t */\n" 9695 "\t int i;\n" 9696 "}")); 9697 Tab.AlignConsecutiveAssignments = true; 9698 Tab.AlignConsecutiveDeclarations = true; 9699 Tab.TabWidth = 4; 9700 Tab.IndentWidth = 4; 9701 verifyFormat("class Assign {\n" 9702 "\tvoid f() {\n" 9703 "\t\tint x = 123;\n" 9704 "\t\tint random = 4;\n" 9705 "\t\tstd::string alphabet =\n" 9706 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 9707 "\t}\n" 9708 "};", 9709 Tab); 9710 } 9711 9712 TEST_F(FormatTest, CalculatesOriginalColumn) { 9713 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9714 "q\"; /* some\n" 9715 " comment */", 9716 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9717 "q\"; /* some\n" 9718 " comment */", 9719 getLLVMStyle())); 9720 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 9721 "/* some\n" 9722 " comment */", 9723 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 9724 " /* some\n" 9725 " comment */", 9726 getLLVMStyle())); 9727 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9728 "qqq\n" 9729 "/* some\n" 9730 " comment */", 9731 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9732 "qqq\n" 9733 " /* some\n" 9734 " comment */", 9735 getLLVMStyle())); 9736 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9737 "wwww; /* some\n" 9738 " comment */", 9739 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 9740 "wwww; /* some\n" 9741 " comment */", 9742 getLLVMStyle())); 9743 } 9744 9745 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 9746 FormatStyle NoSpace = getLLVMStyle(); 9747 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 9748 9749 verifyFormat("while(true)\n" 9750 " continue;", 9751 NoSpace); 9752 verifyFormat("for(;;)\n" 9753 " continue;", 9754 NoSpace); 9755 verifyFormat("if(true)\n" 9756 " f();\n" 9757 "else if(true)\n" 9758 " f();", 9759 NoSpace); 9760 verifyFormat("do {\n" 9761 " do_something();\n" 9762 "} while(something());", 9763 NoSpace); 9764 verifyFormat("switch(x) {\n" 9765 "default:\n" 9766 " break;\n" 9767 "}", 9768 NoSpace); 9769 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 9770 verifyFormat("size_t x = sizeof(x);", NoSpace); 9771 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 9772 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 9773 verifyFormat("alignas(128) char a[128];", NoSpace); 9774 verifyFormat("size_t x = alignof(MyType);", NoSpace); 9775 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 9776 verifyFormat("int f() throw(Deprecated);", NoSpace); 9777 verifyFormat("typedef void (*cb)(int);", NoSpace); 9778 verifyFormat("T A::operator()();", NoSpace); 9779 verifyFormat("X A::operator++(T);", NoSpace); 9780 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 9781 9782 FormatStyle Space = getLLVMStyle(); 9783 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 9784 9785 verifyFormat("int f ();", Space); 9786 verifyFormat("void f (int a, T b) {\n" 9787 " while (true)\n" 9788 " continue;\n" 9789 "}", 9790 Space); 9791 verifyFormat("if (true)\n" 9792 " f ();\n" 9793 "else if (true)\n" 9794 " f ();", 9795 Space); 9796 verifyFormat("do {\n" 9797 " do_something ();\n" 9798 "} while (something ());", 9799 Space); 9800 verifyFormat("switch (x) {\n" 9801 "default:\n" 9802 " break;\n" 9803 "}", 9804 Space); 9805 verifyFormat("A::A () : a (1) {}", Space); 9806 verifyFormat("void f () __attribute__ ((asdf));", Space); 9807 verifyFormat("*(&a + 1);\n" 9808 "&((&a)[1]);\n" 9809 "a[(b + c) * d];\n" 9810 "(((a + 1) * 2) + 3) * 4;", 9811 Space); 9812 verifyFormat("#define A(x) x", Space); 9813 verifyFormat("#define A (x) x", Space); 9814 verifyFormat("#if defined(x)\n" 9815 "#endif", 9816 Space); 9817 verifyFormat("auto i = std::make_unique<int> (5);", Space); 9818 verifyFormat("size_t x = sizeof (x);", Space); 9819 verifyFormat("auto f (int x) -> decltype (x);", Space); 9820 verifyFormat("int f (T x) noexcept (x.create ());", Space); 9821 verifyFormat("alignas (128) char a[128];", Space); 9822 verifyFormat("size_t x = alignof (MyType);", Space); 9823 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 9824 verifyFormat("int f () throw (Deprecated);", Space); 9825 verifyFormat("typedef void (*cb) (int);", Space); 9826 verifyFormat("T A::operator() ();", Space); 9827 verifyFormat("X A::operator++ (T);", Space); 9828 verifyFormat("auto lambda = [] () { return 0; };", Space); 9829 verifyFormat("int x = int (y);", Space); 9830 9831 FormatStyle SomeSpace = getLLVMStyle(); 9832 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 9833 9834 verifyFormat("[]() -> float {}", SomeSpace); 9835 verifyFormat("[] (auto foo) {}", SomeSpace); 9836 verifyFormat("[foo]() -> int {}", SomeSpace); 9837 verifyFormat("int f();", SomeSpace); 9838 verifyFormat("void f (int a, T b) {\n" 9839 " while (true)\n" 9840 " continue;\n" 9841 "}", 9842 SomeSpace); 9843 verifyFormat("if (true)\n" 9844 " f();\n" 9845 "else if (true)\n" 9846 " f();", 9847 SomeSpace); 9848 verifyFormat("do {\n" 9849 " do_something();\n" 9850 "} while (something());", 9851 SomeSpace); 9852 verifyFormat("switch (x) {\n" 9853 "default:\n" 9854 " break;\n" 9855 "}", 9856 SomeSpace); 9857 verifyFormat("A::A() : a (1) {}", SomeSpace); 9858 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 9859 verifyFormat("*(&a + 1);\n" 9860 "&((&a)[1]);\n" 9861 "a[(b + c) * d];\n" 9862 "(((a + 1) * 2) + 3) * 4;", 9863 SomeSpace); 9864 verifyFormat("#define A(x) x", SomeSpace); 9865 verifyFormat("#define A (x) x", SomeSpace); 9866 verifyFormat("#if defined(x)\n" 9867 "#endif", 9868 SomeSpace); 9869 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 9870 verifyFormat("size_t x = sizeof (x);", SomeSpace); 9871 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 9872 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 9873 verifyFormat("alignas (128) char a[128];", SomeSpace); 9874 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 9875 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 9876 SomeSpace); 9877 verifyFormat("int f() throw (Deprecated);", SomeSpace); 9878 verifyFormat("typedef void (*cb) (int);", SomeSpace); 9879 verifyFormat("T A::operator()();", SomeSpace); 9880 verifyFormat("X A::operator++ (T);", SomeSpace); 9881 verifyFormat("int x = int (y);", SomeSpace); 9882 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 9883 } 9884 9885 TEST_F(FormatTest, SpaceAfterLogicalNot) { 9886 FormatStyle Spaces = getLLVMStyle(); 9887 Spaces.SpaceAfterLogicalNot = true; 9888 9889 verifyFormat("bool x = ! y", Spaces); 9890 verifyFormat("if (! isFailure())", Spaces); 9891 verifyFormat("if (! (a && b))", Spaces); 9892 verifyFormat("\"Error!\"", Spaces); 9893 verifyFormat("! ! x", Spaces); 9894 } 9895 9896 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 9897 FormatStyle Spaces = getLLVMStyle(); 9898 9899 Spaces.SpacesInParentheses = true; 9900 verifyFormat("do_something( ::globalVar );", Spaces); 9901 verifyFormat("call( x, y, z );", Spaces); 9902 verifyFormat("call();", Spaces); 9903 verifyFormat("std::function<void( int, int )> callback;", Spaces); 9904 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 9905 Spaces); 9906 verifyFormat("while ( (bool)1 )\n" 9907 " continue;", 9908 Spaces); 9909 verifyFormat("for ( ;; )\n" 9910 " continue;", 9911 Spaces); 9912 verifyFormat("if ( true )\n" 9913 " f();\n" 9914 "else if ( true )\n" 9915 " f();", 9916 Spaces); 9917 verifyFormat("do {\n" 9918 " do_something( (int)i );\n" 9919 "} while ( something() );", 9920 Spaces); 9921 verifyFormat("switch ( x ) {\n" 9922 "default:\n" 9923 " break;\n" 9924 "}", 9925 Spaces); 9926 9927 Spaces.SpacesInParentheses = false; 9928 Spaces.SpacesInCStyleCastParentheses = true; 9929 verifyFormat("Type *A = ( Type * )P;", Spaces); 9930 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 9931 verifyFormat("x = ( int32 )y;", Spaces); 9932 verifyFormat("int a = ( int )(2.0f);", Spaces); 9933 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 9934 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 9935 verifyFormat("#define x (( int )-1)", Spaces); 9936 9937 // Run the first set of tests again with: 9938 Spaces.SpacesInParentheses = false; 9939 Spaces.SpaceInEmptyParentheses = true; 9940 Spaces.SpacesInCStyleCastParentheses = true; 9941 verifyFormat("call(x, y, z);", Spaces); 9942 verifyFormat("call( );", Spaces); 9943 verifyFormat("std::function<void(int, int)> callback;", Spaces); 9944 verifyFormat("while (( bool )1)\n" 9945 " continue;", 9946 Spaces); 9947 verifyFormat("for (;;)\n" 9948 " continue;", 9949 Spaces); 9950 verifyFormat("if (true)\n" 9951 " f( );\n" 9952 "else if (true)\n" 9953 " f( );", 9954 Spaces); 9955 verifyFormat("do {\n" 9956 " do_something(( int )i);\n" 9957 "} while (something( ));", 9958 Spaces); 9959 verifyFormat("switch (x) {\n" 9960 "default:\n" 9961 " break;\n" 9962 "}", 9963 Spaces); 9964 9965 // Run the first set of tests again with: 9966 Spaces.SpaceAfterCStyleCast = true; 9967 verifyFormat("call(x, y, z);", Spaces); 9968 verifyFormat("call( );", Spaces); 9969 verifyFormat("std::function<void(int, int)> callback;", Spaces); 9970 verifyFormat("while (( bool ) 1)\n" 9971 " continue;", 9972 Spaces); 9973 verifyFormat("for (;;)\n" 9974 " continue;", 9975 Spaces); 9976 verifyFormat("if (true)\n" 9977 " f( );\n" 9978 "else if (true)\n" 9979 " f( );", 9980 Spaces); 9981 verifyFormat("do {\n" 9982 " do_something(( int ) i);\n" 9983 "} while (something( ));", 9984 Spaces); 9985 verifyFormat("switch (x) {\n" 9986 "default:\n" 9987 " break;\n" 9988 "}", 9989 Spaces); 9990 9991 // Run subset of tests again with: 9992 Spaces.SpacesInCStyleCastParentheses = false; 9993 Spaces.SpaceAfterCStyleCast = true; 9994 verifyFormat("while ((bool) 1)\n" 9995 " continue;", 9996 Spaces); 9997 verifyFormat("do {\n" 9998 " do_something((int) i);\n" 9999 "} while (something( ));", 10000 Spaces); 10001 } 10002 10003 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 10004 verifyFormat("int a[5];"); 10005 verifyFormat("a[3] += 42;"); 10006 10007 FormatStyle Spaces = getLLVMStyle(); 10008 Spaces.SpacesInSquareBrackets = true; 10009 // Lambdas unchanged. 10010 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 10011 verifyFormat("return [i, args...] {};", Spaces); 10012 10013 // Not lambdas. 10014 verifyFormat("int a[ 5 ];", Spaces); 10015 verifyFormat("a[ 3 ] += 42;", Spaces); 10016 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 10017 verifyFormat("double &operator[](int i) { return 0; }\n" 10018 "int i;", 10019 Spaces); 10020 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 10021 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 10022 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 10023 } 10024 10025 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10026 verifyFormat("int a = 5;"); 10027 verifyFormat("a += 42;"); 10028 verifyFormat("a or_eq 8;"); 10029 10030 FormatStyle Spaces = getLLVMStyle(); 10031 Spaces.SpaceBeforeAssignmentOperators = false; 10032 verifyFormat("int a= 5;", Spaces); 10033 verifyFormat("a+= 42;", Spaces); 10034 verifyFormat("a or_eq 8;", Spaces); 10035 } 10036 10037 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10038 verifyFormat("class Foo : public Bar {};"); 10039 verifyFormat("Foo::Foo() : foo(1) {}"); 10040 verifyFormat("for (auto a : b) {\n}"); 10041 verifyFormat("int x = a ? b : c;"); 10042 verifyFormat("{\n" 10043 "label0:\n" 10044 " int x = 0;\n" 10045 "}"); 10046 verifyFormat("switch (x) {\n" 10047 "case 1:\n" 10048 "default:\n" 10049 "}"); 10050 10051 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10052 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10053 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10054 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10055 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10056 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10057 verifyFormat("{\n" 10058 "label1:\n" 10059 " int x = 0;\n" 10060 "}", 10061 CtorInitializerStyle); 10062 verifyFormat("switch (x) {\n" 10063 "case 1:\n" 10064 "default:\n" 10065 "}", 10066 CtorInitializerStyle); 10067 CtorInitializerStyle.BreakConstructorInitializers = 10068 FormatStyle::BCIS_AfterColon; 10069 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10070 " aaaaaaaaaaaaaaaa(1),\n" 10071 " bbbbbbbbbbbbbbbb(2) {}", 10072 CtorInitializerStyle); 10073 CtorInitializerStyle.BreakConstructorInitializers = 10074 FormatStyle::BCIS_BeforeComma; 10075 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10076 " : aaaaaaaaaaaaaaaa(1)\n" 10077 " , bbbbbbbbbbbbbbbb(2) {}", 10078 CtorInitializerStyle); 10079 CtorInitializerStyle.BreakConstructorInitializers = 10080 FormatStyle::BCIS_BeforeColon; 10081 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10082 " : aaaaaaaaaaaaaaaa(1),\n" 10083 " bbbbbbbbbbbbbbbb(2) {}", 10084 CtorInitializerStyle); 10085 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10086 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10087 ": aaaaaaaaaaaaaaaa(1),\n" 10088 " bbbbbbbbbbbbbbbb(2) {}", 10089 CtorInitializerStyle); 10090 10091 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10092 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10093 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10094 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10095 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10096 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10097 verifyFormat("{\n" 10098 "label2:\n" 10099 " int x = 0;\n" 10100 "}", 10101 InheritanceStyle); 10102 verifyFormat("switch (x) {\n" 10103 "case 1:\n" 10104 "default:\n" 10105 "}", 10106 InheritanceStyle); 10107 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10108 verifyFormat("class Foooooooooooooooooooooo:\n" 10109 " public aaaaaaaaaaaaaaaaaa,\n" 10110 " public bbbbbbbbbbbbbbbbbb {\n" 10111 "}", 10112 InheritanceStyle); 10113 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10114 verifyFormat("class Foooooooooooooooooooooo\n" 10115 " : public aaaaaaaaaaaaaaaaaa\n" 10116 " , public bbbbbbbbbbbbbbbbbb {\n" 10117 "}", 10118 InheritanceStyle); 10119 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10120 verifyFormat("class Foooooooooooooooooooooo\n" 10121 " : public aaaaaaaaaaaaaaaaaa,\n" 10122 " public bbbbbbbbbbbbbbbbbb {\n" 10123 "}", 10124 InheritanceStyle); 10125 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10126 verifyFormat("class Foooooooooooooooooooooo\n" 10127 ": public aaaaaaaaaaaaaaaaaa,\n" 10128 " public bbbbbbbbbbbbbbbbbb {}", 10129 InheritanceStyle); 10130 10131 FormatStyle ForLoopStyle = getLLVMStyle(); 10132 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10133 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10134 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10135 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10136 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10137 verifyFormat("{\n" 10138 "label2:\n" 10139 " int x = 0;\n" 10140 "}", 10141 ForLoopStyle); 10142 verifyFormat("switch (x) {\n" 10143 "case 1:\n" 10144 "default:\n" 10145 "}", 10146 ForLoopStyle); 10147 10148 FormatStyle NoSpaceStyle = getLLVMStyle(); 10149 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10150 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10151 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10152 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10153 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10154 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10155 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10156 verifyFormat("{\n" 10157 "label3:\n" 10158 " int x = 0;\n" 10159 "}", 10160 NoSpaceStyle); 10161 verifyFormat("switch (x) {\n" 10162 "case 1:\n" 10163 "default:\n" 10164 "}", 10165 NoSpaceStyle); 10166 } 10167 10168 TEST_F(FormatTest, AlignConsecutiveMacros) { 10169 FormatStyle Style = getLLVMStyle(); 10170 Style.AlignConsecutiveAssignments = true; 10171 Style.AlignConsecutiveDeclarations = true; 10172 Style.AlignConsecutiveMacros = false; 10173 10174 verifyFormat("#define a 3\n" 10175 "#define bbbb 4\n" 10176 "#define ccc (5)", 10177 Style); 10178 10179 verifyFormat("#define f(x) (x * x)\n" 10180 "#define fff(x, y, z) (x * y + z)\n" 10181 "#define ffff(x, y) (x - y)", 10182 Style); 10183 10184 verifyFormat("#define foo(x, y) (x + y)\n" 10185 "#define bar (5, 6)(2 + 2)", 10186 Style); 10187 10188 verifyFormat("#define a 3\n" 10189 "#define bbbb 4\n" 10190 "#define ccc (5)\n" 10191 "#define f(x) (x * x)\n" 10192 "#define fff(x, y, z) (x * y + z)\n" 10193 "#define ffff(x, y) (x - y)", 10194 Style); 10195 10196 Style.AlignConsecutiveMacros = true; 10197 verifyFormat("#define a 3\n" 10198 "#define bbbb 4\n" 10199 "#define ccc (5)", 10200 Style); 10201 10202 verifyFormat("#define f(x) (x * x)\n" 10203 "#define fff(x, y, z) (x * y + z)\n" 10204 "#define ffff(x, y) (x - y)", 10205 Style); 10206 10207 verifyFormat("#define foo(x, y) (x + y)\n" 10208 "#define bar (5, 6)(2 + 2)", 10209 Style); 10210 10211 verifyFormat("#define a 3\n" 10212 "#define bbbb 4\n" 10213 "#define ccc (5)\n" 10214 "#define f(x) (x * x)\n" 10215 "#define fff(x, y, z) (x * y + z)\n" 10216 "#define ffff(x, y) (x - y)", 10217 Style); 10218 10219 verifyFormat("#define a 5\n" 10220 "#define foo(x, y) (x + y)\n" 10221 "#define CCC (6)\n" 10222 "auto lambda = []() {\n" 10223 " auto ii = 0;\n" 10224 " float j = 0;\n" 10225 " return 0;\n" 10226 "};\n" 10227 "int i = 0;\n" 10228 "float i2 = 0;\n" 10229 "auto v = type{\n" 10230 " i = 1, //\n" 10231 " (i = 2), //\n" 10232 " i = 3 //\n" 10233 "};", 10234 Style); 10235 10236 Style.AlignConsecutiveMacros = false; 10237 Style.ColumnLimit = 20; 10238 10239 verifyFormat("#define a \\\n" 10240 " \"aabbbbbbbbbbbb\"\n" 10241 "#define D \\\n" 10242 " \"aabbbbbbbbbbbb\" \\\n" 10243 " \"ccddeeeeeeeee\"\n" 10244 "#define B \\\n" 10245 " \"QQQQQQQQQQQQQ\" \\\n" 10246 " \"FFFFFFFFFFFFF\" \\\n" 10247 " \"LLLLLLLL\"\n", 10248 Style); 10249 10250 Style.AlignConsecutiveMacros = true; 10251 verifyFormat("#define a \\\n" 10252 " \"aabbbbbbbbbbbb\"\n" 10253 "#define D \\\n" 10254 " \"aabbbbbbbbbbbb\" \\\n" 10255 " \"ccddeeeeeeeee\"\n" 10256 "#define B \\\n" 10257 " \"QQQQQQQQQQQQQ\" \\\n" 10258 " \"FFFFFFFFFFFFF\" \\\n" 10259 " \"LLLLLLLL\"\n", 10260 Style); 10261 } 10262 10263 TEST_F(FormatTest, AlignConsecutiveAssignments) { 10264 FormatStyle Alignment = getLLVMStyle(); 10265 Alignment.AlignConsecutiveMacros = true; 10266 Alignment.AlignConsecutiveAssignments = false; 10267 verifyFormat("int a = 5;\n" 10268 "int oneTwoThree = 123;", 10269 Alignment); 10270 verifyFormat("int a = 5;\n" 10271 "int oneTwoThree = 123;", 10272 Alignment); 10273 10274 Alignment.AlignConsecutiveAssignments = true; 10275 verifyFormat("int a = 5;\n" 10276 "int oneTwoThree = 123;", 10277 Alignment); 10278 verifyFormat("int a = method();\n" 10279 "int oneTwoThree = 133;", 10280 Alignment); 10281 verifyFormat("a &= 5;\n" 10282 "bcd *= 5;\n" 10283 "ghtyf += 5;\n" 10284 "dvfvdb -= 5;\n" 10285 "a /= 5;\n" 10286 "vdsvsv %= 5;\n" 10287 "sfdbddfbdfbb ^= 5;\n" 10288 "dvsdsv |= 5;\n" 10289 "int dsvvdvsdvvv = 123;", 10290 Alignment); 10291 verifyFormat("int i = 1, j = 10;\n" 10292 "something = 2000;", 10293 Alignment); 10294 verifyFormat("something = 2000;\n" 10295 "int i = 1, j = 10;\n", 10296 Alignment); 10297 verifyFormat("something = 2000;\n" 10298 "another = 911;\n" 10299 "int i = 1, j = 10;\n" 10300 "oneMore = 1;\n" 10301 "i = 2;", 10302 Alignment); 10303 verifyFormat("int a = 5;\n" 10304 "int one = 1;\n" 10305 "method();\n" 10306 "int oneTwoThree = 123;\n" 10307 "int oneTwo = 12;", 10308 Alignment); 10309 verifyFormat("int oneTwoThree = 123;\n" 10310 "int oneTwo = 12;\n" 10311 "method();\n", 10312 Alignment); 10313 verifyFormat("int oneTwoThree = 123; // comment\n" 10314 "int oneTwo = 12; // comment", 10315 Alignment); 10316 EXPECT_EQ("int a = 5;\n" 10317 "\n" 10318 "int oneTwoThree = 123;", 10319 format("int a = 5;\n" 10320 "\n" 10321 "int oneTwoThree= 123;", 10322 Alignment)); 10323 EXPECT_EQ("int a = 5;\n" 10324 "int one = 1;\n" 10325 "\n" 10326 "int oneTwoThree = 123;", 10327 format("int a = 5;\n" 10328 "int one = 1;\n" 10329 "\n" 10330 "int oneTwoThree = 123;", 10331 Alignment)); 10332 EXPECT_EQ("int a = 5;\n" 10333 "int one = 1;\n" 10334 "\n" 10335 "int oneTwoThree = 123;\n" 10336 "int oneTwo = 12;", 10337 format("int a = 5;\n" 10338 "int one = 1;\n" 10339 "\n" 10340 "int oneTwoThree = 123;\n" 10341 "int oneTwo = 12;", 10342 Alignment)); 10343 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10344 verifyFormat("#define A \\\n" 10345 " int aaaa = 12; \\\n" 10346 " int b = 23; \\\n" 10347 " int ccc = 234; \\\n" 10348 " int dddddddddd = 2345;", 10349 Alignment); 10350 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10351 verifyFormat("#define A \\\n" 10352 " int aaaa = 12; \\\n" 10353 " int b = 23; \\\n" 10354 " int ccc = 234; \\\n" 10355 " int dddddddddd = 2345;", 10356 Alignment); 10357 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10358 verifyFormat("#define A " 10359 " \\\n" 10360 " int aaaa = 12; " 10361 " \\\n" 10362 " int b = 23; " 10363 " \\\n" 10364 " int ccc = 234; " 10365 " \\\n" 10366 " int dddddddddd = 2345;", 10367 Alignment); 10368 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10369 "k = 4, int l = 5,\n" 10370 " int m = 6) {\n" 10371 " int j = 10;\n" 10372 " otherThing = 1;\n" 10373 "}", 10374 Alignment); 10375 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10376 " int i = 1;\n" 10377 " int j = 2;\n" 10378 " int big = 10000;\n" 10379 "}", 10380 Alignment); 10381 verifyFormat("class C {\n" 10382 "public:\n" 10383 " int i = 1;\n" 10384 " virtual void f() = 0;\n" 10385 "};", 10386 Alignment); 10387 verifyFormat("int i = 1;\n" 10388 "if (SomeType t = getSomething()) {\n" 10389 "}\n" 10390 "int j = 2;\n" 10391 "int big = 10000;", 10392 Alignment); 10393 verifyFormat("int j = 7;\n" 10394 "for (int k = 0; k < N; ++k) {\n" 10395 "}\n" 10396 "int j = 2;\n" 10397 "int big = 10000;\n" 10398 "}", 10399 Alignment); 10400 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10401 verifyFormat("int i = 1;\n" 10402 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10403 " = someLooooooooooooooooongFunction();\n" 10404 "int j = 2;", 10405 Alignment); 10406 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10407 verifyFormat("int i = 1;\n" 10408 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10409 " someLooooooooooooooooongFunction();\n" 10410 "int j = 2;", 10411 Alignment); 10412 10413 verifyFormat("auto lambda = []() {\n" 10414 " auto i = 0;\n" 10415 " return 0;\n" 10416 "};\n" 10417 "int i = 0;\n" 10418 "auto v = type{\n" 10419 " i = 1, //\n" 10420 " (i = 2), //\n" 10421 " i = 3 //\n" 10422 "};", 10423 Alignment); 10424 10425 verifyFormat( 10426 "int i = 1;\n" 10427 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10428 " loooooooooooooooooooooongParameterB);\n" 10429 "int j = 2;", 10430 Alignment); 10431 10432 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 10433 " typename B = very_long_type_name_1,\n" 10434 " typename T_2 = very_long_type_name_2>\n" 10435 "auto foo() {}\n", 10436 Alignment); 10437 verifyFormat("int a, b = 1;\n" 10438 "int c = 2;\n" 10439 "int dd = 3;\n", 10440 Alignment); 10441 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10442 "float b[1][] = {{3.f}};\n", 10443 Alignment); 10444 verifyFormat("for (int i = 0; i < 1; i++)\n" 10445 " int x = 1;\n", 10446 Alignment); 10447 verifyFormat("for (i = 0; i < 1; i++)\n" 10448 " x = 1;\n" 10449 "y = 1;\n", 10450 Alignment); 10451 } 10452 10453 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 10454 FormatStyle Alignment = getLLVMStyle(); 10455 Alignment.AlignConsecutiveMacros = true; 10456 Alignment.AlignConsecutiveDeclarations = false; 10457 verifyFormat("float const a = 5;\n" 10458 "int oneTwoThree = 123;", 10459 Alignment); 10460 verifyFormat("int a = 5;\n" 10461 "float const oneTwoThree = 123;", 10462 Alignment); 10463 10464 Alignment.AlignConsecutiveDeclarations = true; 10465 verifyFormat("float const a = 5;\n" 10466 "int oneTwoThree = 123;", 10467 Alignment); 10468 verifyFormat("int a = method();\n" 10469 "float const oneTwoThree = 133;", 10470 Alignment); 10471 verifyFormat("int i = 1, j = 10;\n" 10472 "something = 2000;", 10473 Alignment); 10474 verifyFormat("something = 2000;\n" 10475 "int i = 1, j = 10;\n", 10476 Alignment); 10477 verifyFormat("float something = 2000;\n" 10478 "double another = 911;\n" 10479 "int i = 1, j = 10;\n" 10480 "const int *oneMore = 1;\n" 10481 "unsigned i = 2;", 10482 Alignment); 10483 verifyFormat("float a = 5;\n" 10484 "int one = 1;\n" 10485 "method();\n" 10486 "const double oneTwoThree = 123;\n" 10487 "const unsigned int oneTwo = 12;", 10488 Alignment); 10489 verifyFormat("int oneTwoThree{0}; // comment\n" 10490 "unsigned oneTwo; // comment", 10491 Alignment); 10492 EXPECT_EQ("float const a = 5;\n" 10493 "\n" 10494 "int oneTwoThree = 123;", 10495 format("float const a = 5;\n" 10496 "\n" 10497 "int oneTwoThree= 123;", 10498 Alignment)); 10499 EXPECT_EQ("float a = 5;\n" 10500 "int one = 1;\n" 10501 "\n" 10502 "unsigned oneTwoThree = 123;", 10503 format("float a = 5;\n" 10504 "int one = 1;\n" 10505 "\n" 10506 "unsigned oneTwoThree = 123;", 10507 Alignment)); 10508 EXPECT_EQ("float a = 5;\n" 10509 "int one = 1;\n" 10510 "\n" 10511 "unsigned oneTwoThree = 123;\n" 10512 "int oneTwo = 12;", 10513 format("float a = 5;\n" 10514 "int one = 1;\n" 10515 "\n" 10516 "unsigned oneTwoThree = 123;\n" 10517 "int oneTwo = 12;", 10518 Alignment)); 10519 // Function prototype alignment 10520 verifyFormat("int a();\n" 10521 "double b();", 10522 Alignment); 10523 verifyFormat("int a(int x);\n" 10524 "double b();", 10525 Alignment); 10526 unsigned OldColumnLimit = Alignment.ColumnLimit; 10527 // We need to set ColumnLimit to zero, in order to stress nested alignments, 10528 // otherwise the function parameters will be re-flowed onto a single line. 10529 Alignment.ColumnLimit = 0; 10530 EXPECT_EQ("int a(int x,\n" 10531 " float y);\n" 10532 "double b(int x,\n" 10533 " double y);", 10534 format("int a(int x,\n" 10535 " float y);\n" 10536 "double b(int x,\n" 10537 " double y);", 10538 Alignment)); 10539 // This ensures that function parameters of function declarations are 10540 // correctly indented when their owning functions are indented. 10541 // The failure case here is for 'double y' to not be indented enough. 10542 EXPECT_EQ("double a(int x);\n" 10543 "int b(int y,\n" 10544 " double z);", 10545 format("double a(int x);\n" 10546 "int b(int y,\n" 10547 " double z);", 10548 Alignment)); 10549 // Set ColumnLimit low so that we induce wrapping immediately after 10550 // the function name and opening paren. 10551 Alignment.ColumnLimit = 13; 10552 verifyFormat("int function(\n" 10553 " int x,\n" 10554 " bool y);", 10555 Alignment); 10556 Alignment.ColumnLimit = OldColumnLimit; 10557 // Ensure function pointers don't screw up recursive alignment 10558 verifyFormat("int a(int x, void (*fp)(int y));\n" 10559 "double b();", 10560 Alignment); 10561 Alignment.AlignConsecutiveAssignments = true; 10562 // Ensure recursive alignment is broken by function braces, so that the 10563 // "a = 1" does not align with subsequent assignments inside the function 10564 // body. 10565 verifyFormat("int func(int a = 1) {\n" 10566 " int b = 2;\n" 10567 " int cc = 3;\n" 10568 "}", 10569 Alignment); 10570 verifyFormat("float something = 2000;\n" 10571 "double another = 911;\n" 10572 "int i = 1, j = 10;\n" 10573 "const int *oneMore = 1;\n" 10574 "unsigned i = 2;", 10575 Alignment); 10576 verifyFormat("int oneTwoThree = {0}; // comment\n" 10577 "unsigned oneTwo = 0; // comment", 10578 Alignment); 10579 // Make sure that scope is correctly tracked, in the absence of braces 10580 verifyFormat("for (int i = 0; i < n; i++)\n" 10581 " j = i;\n" 10582 "double x = 1;\n", 10583 Alignment); 10584 verifyFormat("if (int i = 0)\n" 10585 " j = i;\n" 10586 "double x = 1;\n", 10587 Alignment); 10588 // Ensure operator[] and operator() are comprehended 10589 verifyFormat("struct test {\n" 10590 " long long int foo();\n" 10591 " int operator[](int a);\n" 10592 " double bar();\n" 10593 "};\n", 10594 Alignment); 10595 verifyFormat("struct test {\n" 10596 " long long int foo();\n" 10597 " int operator()(int a);\n" 10598 " double bar();\n" 10599 "};\n", 10600 Alignment); 10601 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 10602 " int const i = 1;\n" 10603 " int * j = 2;\n" 10604 " int big = 10000;\n" 10605 "\n" 10606 " unsigned oneTwoThree = 123;\n" 10607 " int oneTwo = 12;\n" 10608 " method();\n" 10609 " float k = 2;\n" 10610 " int ll = 10000;\n" 10611 "}", 10612 format("void SomeFunction(int parameter= 0) {\n" 10613 " int const i= 1;\n" 10614 " int *j=2;\n" 10615 " int big = 10000;\n" 10616 "\n" 10617 "unsigned oneTwoThree =123;\n" 10618 "int oneTwo = 12;\n" 10619 " method();\n" 10620 "float k= 2;\n" 10621 "int ll=10000;\n" 10622 "}", 10623 Alignment)); 10624 Alignment.AlignConsecutiveAssignments = false; 10625 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10626 verifyFormat("#define A \\\n" 10627 " int aaaa = 12; \\\n" 10628 " float b = 23; \\\n" 10629 " const int ccc = 234; \\\n" 10630 " unsigned dddddddddd = 2345;", 10631 Alignment); 10632 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10633 verifyFormat("#define A \\\n" 10634 " int aaaa = 12; \\\n" 10635 " float b = 23; \\\n" 10636 " const int ccc = 234; \\\n" 10637 " unsigned dddddddddd = 2345;", 10638 Alignment); 10639 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10640 Alignment.ColumnLimit = 30; 10641 verifyFormat("#define A \\\n" 10642 " int aaaa = 12; \\\n" 10643 " float b = 23; \\\n" 10644 " const int ccc = 234; \\\n" 10645 " int dddddddddd = 2345;", 10646 Alignment); 10647 Alignment.ColumnLimit = 80; 10648 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10649 "k = 4, int l = 5,\n" 10650 " int m = 6) {\n" 10651 " const int j = 10;\n" 10652 " otherThing = 1;\n" 10653 "}", 10654 Alignment); 10655 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10656 " int const i = 1;\n" 10657 " int * j = 2;\n" 10658 " int big = 10000;\n" 10659 "}", 10660 Alignment); 10661 verifyFormat("class C {\n" 10662 "public:\n" 10663 " int i = 1;\n" 10664 " virtual void f() = 0;\n" 10665 "};", 10666 Alignment); 10667 verifyFormat("float i = 1;\n" 10668 "if (SomeType t = getSomething()) {\n" 10669 "}\n" 10670 "const unsigned j = 2;\n" 10671 "int big = 10000;", 10672 Alignment); 10673 verifyFormat("float j = 7;\n" 10674 "for (int k = 0; k < N; ++k) {\n" 10675 "}\n" 10676 "unsigned j = 2;\n" 10677 "int big = 10000;\n" 10678 "}", 10679 Alignment); 10680 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10681 verifyFormat("float i = 1;\n" 10682 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10683 " = someLooooooooooooooooongFunction();\n" 10684 "int j = 2;", 10685 Alignment); 10686 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10687 verifyFormat("int i = 1;\n" 10688 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10689 " someLooooooooooooooooongFunction();\n" 10690 "int j = 2;", 10691 Alignment); 10692 10693 Alignment.AlignConsecutiveAssignments = true; 10694 verifyFormat("auto lambda = []() {\n" 10695 " auto ii = 0;\n" 10696 " float j = 0;\n" 10697 " return 0;\n" 10698 "};\n" 10699 "int i = 0;\n" 10700 "float i2 = 0;\n" 10701 "auto v = type{\n" 10702 " i = 1, //\n" 10703 " (i = 2), //\n" 10704 " i = 3 //\n" 10705 "};", 10706 Alignment); 10707 Alignment.AlignConsecutiveAssignments = false; 10708 10709 verifyFormat( 10710 "int i = 1;\n" 10711 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10712 " loooooooooooooooooooooongParameterB);\n" 10713 "int j = 2;", 10714 Alignment); 10715 10716 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 10717 // We expect declarations and assignments to align, as long as it doesn't 10718 // exceed the column limit, starting a new alignment sequence whenever it 10719 // happens. 10720 Alignment.AlignConsecutiveAssignments = true; 10721 Alignment.ColumnLimit = 30; 10722 verifyFormat("float ii = 1;\n" 10723 "unsigned j = 2;\n" 10724 "int someVerylongVariable = 1;\n" 10725 "AnotherLongType ll = 123456;\n" 10726 "VeryVeryLongType k = 2;\n" 10727 "int myvar = 1;", 10728 Alignment); 10729 Alignment.ColumnLimit = 80; 10730 Alignment.AlignConsecutiveAssignments = false; 10731 10732 verifyFormat( 10733 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 10734 " typename LongType, typename B>\n" 10735 "auto foo() {}\n", 10736 Alignment); 10737 verifyFormat("float a, b = 1;\n" 10738 "int c = 2;\n" 10739 "int dd = 3;\n", 10740 Alignment); 10741 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10742 "float b[1][] = {{3.f}};\n", 10743 Alignment); 10744 Alignment.AlignConsecutiveAssignments = true; 10745 verifyFormat("float a, b = 1;\n" 10746 "int c = 2;\n" 10747 "int dd = 3;\n", 10748 Alignment); 10749 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10750 "float b[1][] = {{3.f}};\n", 10751 Alignment); 10752 Alignment.AlignConsecutiveAssignments = false; 10753 10754 Alignment.ColumnLimit = 30; 10755 Alignment.BinPackParameters = false; 10756 verifyFormat("void foo(float a,\n" 10757 " float b,\n" 10758 " int c,\n" 10759 " uint32_t *d) {\n" 10760 " int * e = 0;\n" 10761 " float f = 0;\n" 10762 " double g = 0;\n" 10763 "}\n" 10764 "void bar(ino_t a,\n" 10765 " int b,\n" 10766 " uint32_t *c,\n" 10767 " bool d) {}\n", 10768 Alignment); 10769 Alignment.BinPackParameters = true; 10770 Alignment.ColumnLimit = 80; 10771 10772 // Bug 33507 10773 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 10774 verifyFormat( 10775 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 10776 " static const Version verVs2017;\n" 10777 " return true;\n" 10778 "});\n", 10779 Alignment); 10780 Alignment.PointerAlignment = FormatStyle::PAS_Right; 10781 10782 // See llvm.org/PR35641 10783 Alignment.AlignConsecutiveDeclarations = true; 10784 verifyFormat("int func() { //\n" 10785 " int b;\n" 10786 " unsigned c;\n" 10787 "}", 10788 Alignment); 10789 10790 // See PR37175 10791 FormatStyle Style = getMozillaStyle(); 10792 Style.AlignConsecutiveDeclarations = true; 10793 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 10794 "foo(int a);", 10795 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 10796 } 10797 10798 TEST_F(FormatTest, LinuxBraceBreaking) { 10799 FormatStyle LinuxBraceStyle = getLLVMStyle(); 10800 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 10801 verifyFormat("namespace a\n" 10802 "{\n" 10803 "class A\n" 10804 "{\n" 10805 " void f()\n" 10806 " {\n" 10807 " if (true) {\n" 10808 " a();\n" 10809 " b();\n" 10810 " } else {\n" 10811 " a();\n" 10812 " }\n" 10813 " }\n" 10814 " void g() { return; }\n" 10815 "};\n" 10816 "struct B {\n" 10817 " int x;\n" 10818 "};\n" 10819 "} // namespace a\n", 10820 LinuxBraceStyle); 10821 verifyFormat("enum X {\n" 10822 " Y = 0,\n" 10823 "}\n", 10824 LinuxBraceStyle); 10825 verifyFormat("struct S {\n" 10826 " int Type;\n" 10827 " union {\n" 10828 " int x;\n" 10829 " double y;\n" 10830 " } Value;\n" 10831 " class C\n" 10832 " {\n" 10833 " MyFavoriteType Value;\n" 10834 " } Class;\n" 10835 "}\n", 10836 LinuxBraceStyle); 10837 } 10838 10839 TEST_F(FormatTest, MozillaBraceBreaking) { 10840 FormatStyle MozillaBraceStyle = getLLVMStyle(); 10841 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 10842 MozillaBraceStyle.FixNamespaceComments = false; 10843 verifyFormat("namespace a {\n" 10844 "class A\n" 10845 "{\n" 10846 " void f()\n" 10847 " {\n" 10848 " if (true) {\n" 10849 " a();\n" 10850 " b();\n" 10851 " }\n" 10852 " }\n" 10853 " void g() { return; }\n" 10854 "};\n" 10855 "enum E\n" 10856 "{\n" 10857 " A,\n" 10858 " // foo\n" 10859 " B,\n" 10860 " C\n" 10861 "};\n" 10862 "struct B\n" 10863 "{\n" 10864 " int x;\n" 10865 "};\n" 10866 "}\n", 10867 MozillaBraceStyle); 10868 verifyFormat("struct S\n" 10869 "{\n" 10870 " int Type;\n" 10871 " union\n" 10872 " {\n" 10873 " int x;\n" 10874 " double y;\n" 10875 " } Value;\n" 10876 " class C\n" 10877 " {\n" 10878 " MyFavoriteType Value;\n" 10879 " } Class;\n" 10880 "}\n", 10881 MozillaBraceStyle); 10882 } 10883 10884 TEST_F(FormatTest, StroustrupBraceBreaking) { 10885 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 10886 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 10887 verifyFormat("namespace a {\n" 10888 "class A {\n" 10889 " void f()\n" 10890 " {\n" 10891 " if (true) {\n" 10892 " a();\n" 10893 " b();\n" 10894 " }\n" 10895 " }\n" 10896 " void g() { return; }\n" 10897 "};\n" 10898 "struct B {\n" 10899 " int x;\n" 10900 "};\n" 10901 "} // namespace a\n", 10902 StroustrupBraceStyle); 10903 10904 verifyFormat("void foo()\n" 10905 "{\n" 10906 " if (a) {\n" 10907 " a();\n" 10908 " }\n" 10909 " else {\n" 10910 " b();\n" 10911 " }\n" 10912 "}\n", 10913 StroustrupBraceStyle); 10914 10915 verifyFormat("#ifdef _DEBUG\n" 10916 "int foo(int i = 0)\n" 10917 "#else\n" 10918 "int foo(int i = 5)\n" 10919 "#endif\n" 10920 "{\n" 10921 " return i;\n" 10922 "}", 10923 StroustrupBraceStyle); 10924 10925 verifyFormat("void foo() {}\n" 10926 "void bar()\n" 10927 "#ifdef _DEBUG\n" 10928 "{\n" 10929 " foo();\n" 10930 "}\n" 10931 "#else\n" 10932 "{\n" 10933 "}\n" 10934 "#endif", 10935 StroustrupBraceStyle); 10936 10937 verifyFormat("void foobar() { int i = 5; }\n" 10938 "#ifdef _DEBUG\n" 10939 "void bar() {}\n" 10940 "#else\n" 10941 "void bar() { foobar(); }\n" 10942 "#endif", 10943 StroustrupBraceStyle); 10944 } 10945 10946 TEST_F(FormatTest, AllmanBraceBreaking) { 10947 FormatStyle AllmanBraceStyle = getLLVMStyle(); 10948 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 10949 10950 EXPECT_EQ("namespace a\n" 10951 "{\n" 10952 "void f();\n" 10953 "void g();\n" 10954 "} // namespace a\n", 10955 format("namespace a\n" 10956 "{\n" 10957 "void f();\n" 10958 "void g();\n" 10959 "}\n", 10960 AllmanBraceStyle)); 10961 10962 verifyFormat("namespace a\n" 10963 "{\n" 10964 "class A\n" 10965 "{\n" 10966 " void f()\n" 10967 " {\n" 10968 " if (true)\n" 10969 " {\n" 10970 " a();\n" 10971 " b();\n" 10972 " }\n" 10973 " }\n" 10974 " void g() { return; }\n" 10975 "};\n" 10976 "struct B\n" 10977 "{\n" 10978 " int x;\n" 10979 "};\n" 10980 "} // namespace a", 10981 AllmanBraceStyle); 10982 10983 verifyFormat("void f()\n" 10984 "{\n" 10985 " if (true)\n" 10986 " {\n" 10987 " a();\n" 10988 " }\n" 10989 " else if (false)\n" 10990 " {\n" 10991 " b();\n" 10992 " }\n" 10993 " else\n" 10994 " {\n" 10995 " c();\n" 10996 " }\n" 10997 "}\n", 10998 AllmanBraceStyle); 10999 11000 verifyFormat("void f()\n" 11001 "{\n" 11002 " for (int i = 0; i < 10; ++i)\n" 11003 " {\n" 11004 " a();\n" 11005 " }\n" 11006 " while (false)\n" 11007 " {\n" 11008 " b();\n" 11009 " }\n" 11010 " do\n" 11011 " {\n" 11012 " c();\n" 11013 " } while (false)\n" 11014 "}\n", 11015 AllmanBraceStyle); 11016 11017 verifyFormat("void f(int a)\n" 11018 "{\n" 11019 " switch (a)\n" 11020 " {\n" 11021 " case 0:\n" 11022 " break;\n" 11023 " case 1:\n" 11024 " {\n" 11025 " break;\n" 11026 " }\n" 11027 " case 2:\n" 11028 " {\n" 11029 " }\n" 11030 " break;\n" 11031 " default:\n" 11032 " break;\n" 11033 " }\n" 11034 "}\n", 11035 AllmanBraceStyle); 11036 11037 verifyFormat("enum X\n" 11038 "{\n" 11039 " Y = 0,\n" 11040 "}\n", 11041 AllmanBraceStyle); 11042 verifyFormat("enum X\n" 11043 "{\n" 11044 " Y = 0\n" 11045 "}\n", 11046 AllmanBraceStyle); 11047 11048 verifyFormat("@interface BSApplicationController ()\n" 11049 "{\n" 11050 "@private\n" 11051 " id _extraIvar;\n" 11052 "}\n" 11053 "@end\n", 11054 AllmanBraceStyle); 11055 11056 verifyFormat("#ifdef _DEBUG\n" 11057 "int foo(int i = 0)\n" 11058 "#else\n" 11059 "int foo(int i = 5)\n" 11060 "#endif\n" 11061 "{\n" 11062 " return i;\n" 11063 "}", 11064 AllmanBraceStyle); 11065 11066 verifyFormat("void foo() {}\n" 11067 "void bar()\n" 11068 "#ifdef _DEBUG\n" 11069 "{\n" 11070 " foo();\n" 11071 "}\n" 11072 "#else\n" 11073 "{\n" 11074 "}\n" 11075 "#endif", 11076 AllmanBraceStyle); 11077 11078 verifyFormat("void foobar() { int i = 5; }\n" 11079 "#ifdef _DEBUG\n" 11080 "void bar() {}\n" 11081 "#else\n" 11082 "void bar() { foobar(); }\n" 11083 "#endif", 11084 AllmanBraceStyle); 11085 11086 // This shouldn't affect ObjC blocks.. 11087 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11088 " // ...\n" 11089 " int i;\n" 11090 "}];", 11091 AllmanBraceStyle); 11092 verifyFormat("void (^block)(void) = ^{\n" 11093 " // ...\n" 11094 " int i;\n" 11095 "};", 11096 AllmanBraceStyle); 11097 // .. or dict literals. 11098 verifyFormat("void f()\n" 11099 "{\n" 11100 " // ...\n" 11101 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11102 "}", 11103 AllmanBraceStyle); 11104 verifyFormat("void f()\n" 11105 "{\n" 11106 " // ...\n" 11107 " [object someMethod:@{a : @\"b\"}];\n" 11108 "}", 11109 AllmanBraceStyle); 11110 verifyFormat("int f()\n" 11111 "{ // comment\n" 11112 " return 42;\n" 11113 "}", 11114 AllmanBraceStyle); 11115 11116 AllmanBraceStyle.ColumnLimit = 19; 11117 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11118 AllmanBraceStyle.ColumnLimit = 18; 11119 verifyFormat("void f()\n" 11120 "{\n" 11121 " int i;\n" 11122 "}", 11123 AllmanBraceStyle); 11124 AllmanBraceStyle.ColumnLimit = 80; 11125 11126 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11127 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11128 FormatStyle::SIS_WithoutElse; 11129 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11130 verifyFormat("void f(bool b)\n" 11131 "{\n" 11132 " if (b)\n" 11133 " {\n" 11134 " return;\n" 11135 " }\n" 11136 "}\n", 11137 BreakBeforeBraceShortIfs); 11138 verifyFormat("void f(bool b)\n" 11139 "{\n" 11140 " if constexpr (b)\n" 11141 " {\n" 11142 " return;\n" 11143 " }\n" 11144 "}\n", 11145 BreakBeforeBraceShortIfs); 11146 verifyFormat("void f(bool b)\n" 11147 "{\n" 11148 " if (b) return;\n" 11149 "}\n", 11150 BreakBeforeBraceShortIfs); 11151 verifyFormat("void f(bool b)\n" 11152 "{\n" 11153 " if constexpr (b) return;\n" 11154 "}\n", 11155 BreakBeforeBraceShortIfs); 11156 verifyFormat("void f(bool b)\n" 11157 "{\n" 11158 " while (b)\n" 11159 " {\n" 11160 " return;\n" 11161 " }\n" 11162 "}\n", 11163 BreakBeforeBraceShortIfs); 11164 } 11165 11166 TEST_F(FormatTest, GNUBraceBreaking) { 11167 FormatStyle GNUBraceStyle = getLLVMStyle(); 11168 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 11169 verifyFormat("namespace a\n" 11170 "{\n" 11171 "class A\n" 11172 "{\n" 11173 " void f()\n" 11174 " {\n" 11175 " int a;\n" 11176 " {\n" 11177 " int b;\n" 11178 " }\n" 11179 " if (true)\n" 11180 " {\n" 11181 " a();\n" 11182 " b();\n" 11183 " }\n" 11184 " }\n" 11185 " void g() { return; }\n" 11186 "}\n" 11187 "} // namespace a", 11188 GNUBraceStyle); 11189 11190 verifyFormat("void f()\n" 11191 "{\n" 11192 " if (true)\n" 11193 " {\n" 11194 " a();\n" 11195 " }\n" 11196 " else if (false)\n" 11197 " {\n" 11198 " b();\n" 11199 " }\n" 11200 " else\n" 11201 " {\n" 11202 " c();\n" 11203 " }\n" 11204 "}\n", 11205 GNUBraceStyle); 11206 11207 verifyFormat("void f()\n" 11208 "{\n" 11209 " for (int i = 0; i < 10; ++i)\n" 11210 " {\n" 11211 " a();\n" 11212 " }\n" 11213 " while (false)\n" 11214 " {\n" 11215 " b();\n" 11216 " }\n" 11217 " do\n" 11218 " {\n" 11219 " c();\n" 11220 " }\n" 11221 " while (false);\n" 11222 "}\n", 11223 GNUBraceStyle); 11224 11225 verifyFormat("void f(int a)\n" 11226 "{\n" 11227 " switch (a)\n" 11228 " {\n" 11229 " case 0:\n" 11230 " break;\n" 11231 " case 1:\n" 11232 " {\n" 11233 " break;\n" 11234 " }\n" 11235 " case 2:\n" 11236 " {\n" 11237 " }\n" 11238 " break;\n" 11239 " default:\n" 11240 " break;\n" 11241 " }\n" 11242 "}\n", 11243 GNUBraceStyle); 11244 11245 verifyFormat("enum X\n" 11246 "{\n" 11247 " Y = 0,\n" 11248 "}\n", 11249 GNUBraceStyle); 11250 11251 verifyFormat("@interface BSApplicationController ()\n" 11252 "{\n" 11253 "@private\n" 11254 " id _extraIvar;\n" 11255 "}\n" 11256 "@end\n", 11257 GNUBraceStyle); 11258 11259 verifyFormat("#ifdef _DEBUG\n" 11260 "int foo(int i = 0)\n" 11261 "#else\n" 11262 "int foo(int i = 5)\n" 11263 "#endif\n" 11264 "{\n" 11265 " return i;\n" 11266 "}", 11267 GNUBraceStyle); 11268 11269 verifyFormat("void foo() {}\n" 11270 "void bar()\n" 11271 "#ifdef _DEBUG\n" 11272 "{\n" 11273 " foo();\n" 11274 "}\n" 11275 "#else\n" 11276 "{\n" 11277 "}\n" 11278 "#endif", 11279 GNUBraceStyle); 11280 11281 verifyFormat("void foobar() { int i = 5; }\n" 11282 "#ifdef _DEBUG\n" 11283 "void bar() {}\n" 11284 "#else\n" 11285 "void bar() { foobar(); }\n" 11286 "#endif", 11287 GNUBraceStyle); 11288 } 11289 11290 TEST_F(FormatTest, WebKitBraceBreaking) { 11291 FormatStyle WebKitBraceStyle = getLLVMStyle(); 11292 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 11293 WebKitBraceStyle.FixNamespaceComments = false; 11294 verifyFormat("namespace a {\n" 11295 "class A {\n" 11296 " void f()\n" 11297 " {\n" 11298 " if (true) {\n" 11299 " a();\n" 11300 " b();\n" 11301 " }\n" 11302 " }\n" 11303 " void g() { return; }\n" 11304 "};\n" 11305 "enum E {\n" 11306 " A,\n" 11307 " // foo\n" 11308 " B,\n" 11309 " C\n" 11310 "};\n" 11311 "struct B {\n" 11312 " int x;\n" 11313 "};\n" 11314 "}\n", 11315 WebKitBraceStyle); 11316 verifyFormat("struct S {\n" 11317 " int Type;\n" 11318 " union {\n" 11319 " int x;\n" 11320 " double y;\n" 11321 " } Value;\n" 11322 " class C {\n" 11323 " MyFavoriteType Value;\n" 11324 " } Class;\n" 11325 "};\n", 11326 WebKitBraceStyle); 11327 } 11328 11329 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 11330 verifyFormat("void f() {\n" 11331 " try {\n" 11332 " } catch (const Exception &e) {\n" 11333 " }\n" 11334 "}\n", 11335 getLLVMStyle()); 11336 } 11337 11338 TEST_F(FormatTest, UnderstandsPragmas) { 11339 verifyFormat("#pragma omp reduction(| : var)"); 11340 verifyFormat("#pragma omp reduction(+ : var)"); 11341 11342 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 11343 "(including parentheses).", 11344 format("#pragma mark Any non-hyphenated or hyphenated string " 11345 "(including parentheses).")); 11346 } 11347 11348 TEST_F(FormatTest, UnderstandPragmaOption) { 11349 verifyFormat("#pragma option -C -A"); 11350 11351 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 11352 } 11353 11354 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 11355 FormatStyle Style = getLLVMStyle(); 11356 Style.ColumnLimit = 20; 11357 11358 // See PR41213 11359 EXPECT_EQ("/*\n" 11360 " *\t9012345\n" 11361 " * /8901\n" 11362 " */", 11363 format("/*\n" 11364 " *\t9012345 /8901\n" 11365 " */", 11366 Style)); 11367 EXPECT_EQ("/*\n" 11368 " *345678\n" 11369 " *\t/8901\n" 11370 " */", 11371 format("/*\n" 11372 " *345678\t/8901\n" 11373 " */", 11374 Style)); 11375 11376 verifyFormat("int a; // the\n" 11377 " // comment", Style); 11378 EXPECT_EQ("int a; /* first line\n" 11379 " * second\n" 11380 " * line third\n" 11381 " * line\n" 11382 " */", 11383 format("int a; /* first line\n" 11384 " * second\n" 11385 " * line third\n" 11386 " * line\n" 11387 " */", 11388 Style)); 11389 EXPECT_EQ("int a; // first line\n" 11390 " // second\n" 11391 " // line third\n" 11392 " // line", 11393 format("int a; // first line\n" 11394 " // second line\n" 11395 " // third line", 11396 Style)); 11397 11398 Style.PenaltyExcessCharacter = 90; 11399 verifyFormat("int a; // the comment", Style); 11400 EXPECT_EQ("int a; // the comment\n" 11401 " // aaa", 11402 format("int a; // the comment aaa", Style)); 11403 EXPECT_EQ("int a; /* first line\n" 11404 " * second line\n" 11405 " * third line\n" 11406 " */", 11407 format("int a; /* first line\n" 11408 " * second line\n" 11409 " * third line\n" 11410 " */", 11411 Style)); 11412 EXPECT_EQ("int a; // first line\n" 11413 " // second line\n" 11414 " // third line", 11415 format("int a; // first line\n" 11416 " // second line\n" 11417 " // third line", 11418 Style)); 11419 // FIXME: Investigate why this is not getting the same layout as the test 11420 // above. 11421 EXPECT_EQ("int a; /* first line\n" 11422 " * second line\n" 11423 " * third line\n" 11424 " */", 11425 format("int a; /* first line second line third line" 11426 "\n*/", 11427 Style)); 11428 11429 EXPECT_EQ("// foo bar baz bazfoo\n" 11430 "// foo bar foo bar\n", 11431 format("// foo bar baz bazfoo\n" 11432 "// foo bar foo bar\n", 11433 Style)); 11434 EXPECT_EQ("// foo bar baz bazfoo\n" 11435 "// foo bar foo bar\n", 11436 format("// foo bar baz bazfoo\n" 11437 "// foo bar foo bar\n", 11438 Style)); 11439 11440 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 11441 // next one. 11442 EXPECT_EQ("// foo bar baz bazfoo\n" 11443 "// bar foo bar\n", 11444 format("// foo bar baz bazfoo bar\n" 11445 "// foo bar\n", 11446 Style)); 11447 11448 EXPECT_EQ("// foo bar baz bazfoo\n" 11449 "// foo bar baz bazfoo\n" 11450 "// bar foo bar\n", 11451 format("// foo bar baz bazfoo\n" 11452 "// foo bar baz bazfoo bar\n" 11453 "// foo bar\n", 11454 Style)); 11455 11456 EXPECT_EQ("// foo bar baz bazfoo\n" 11457 "// foo bar baz bazfoo\n" 11458 "// bar foo bar\n", 11459 format("// foo bar baz bazfoo\n" 11460 "// foo bar baz bazfoo bar\n" 11461 "// foo bar\n", 11462 Style)); 11463 11464 // Make sure we do not keep protruding characters if strict mode reflow is 11465 // cheaper than keeping protruding characters. 11466 Style.ColumnLimit = 21; 11467 EXPECT_EQ("// foo foo foo foo\n" 11468 "// foo foo foo foo\n" 11469 "// foo foo foo foo\n", 11470 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", 11471 Style)); 11472 11473 EXPECT_EQ("int a = /* long block\n" 11474 " comment */\n" 11475 " 42;", 11476 format("int a = /* long block comment */ 42;", Style)); 11477 } 11478 11479 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 11480 for (size_t i = 1; i < Styles.size(); ++i) \ 11481 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \ 11482 << " differs from Style #0" 11483 11484 TEST_F(FormatTest, GetsPredefinedStyleByName) { 11485 SmallVector<FormatStyle, 3> Styles; 11486 Styles.resize(3); 11487 11488 Styles[0] = getLLVMStyle(); 11489 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 11490 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 11491 EXPECT_ALL_STYLES_EQUAL(Styles); 11492 11493 Styles[0] = getGoogleStyle(); 11494 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 11495 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 11496 EXPECT_ALL_STYLES_EQUAL(Styles); 11497 11498 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 11499 EXPECT_TRUE( 11500 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 11501 EXPECT_TRUE( 11502 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 11503 EXPECT_ALL_STYLES_EQUAL(Styles); 11504 11505 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 11506 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 11507 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 11508 EXPECT_ALL_STYLES_EQUAL(Styles); 11509 11510 Styles[0] = getMozillaStyle(); 11511 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 11512 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 11513 EXPECT_ALL_STYLES_EQUAL(Styles); 11514 11515 Styles[0] = getWebKitStyle(); 11516 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 11517 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 11518 EXPECT_ALL_STYLES_EQUAL(Styles); 11519 11520 Styles[0] = getGNUStyle(); 11521 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 11522 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 11523 EXPECT_ALL_STYLES_EQUAL(Styles); 11524 11525 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 11526 } 11527 11528 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 11529 SmallVector<FormatStyle, 8> Styles; 11530 Styles.resize(2); 11531 11532 Styles[0] = getGoogleStyle(); 11533 Styles[1] = getLLVMStyle(); 11534 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 11535 EXPECT_ALL_STYLES_EQUAL(Styles); 11536 11537 Styles.resize(5); 11538 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 11539 Styles[1] = getLLVMStyle(); 11540 Styles[1].Language = FormatStyle::LK_JavaScript; 11541 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 11542 11543 Styles[2] = getLLVMStyle(); 11544 Styles[2].Language = FormatStyle::LK_JavaScript; 11545 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 11546 "BasedOnStyle: Google", 11547 &Styles[2]) 11548 .value()); 11549 11550 Styles[3] = getLLVMStyle(); 11551 Styles[3].Language = FormatStyle::LK_JavaScript; 11552 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 11553 "Language: JavaScript", 11554 &Styles[3]) 11555 .value()); 11556 11557 Styles[4] = getLLVMStyle(); 11558 Styles[4].Language = FormatStyle::LK_JavaScript; 11559 EXPECT_EQ(0, parseConfiguration("---\n" 11560 "BasedOnStyle: LLVM\n" 11561 "IndentWidth: 123\n" 11562 "---\n" 11563 "BasedOnStyle: Google\n" 11564 "Language: JavaScript", 11565 &Styles[4]) 11566 .value()); 11567 EXPECT_ALL_STYLES_EQUAL(Styles); 11568 } 11569 11570 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 11571 Style.FIELD = false; \ 11572 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 11573 EXPECT_TRUE(Style.FIELD); \ 11574 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 11575 EXPECT_FALSE(Style.FIELD); 11576 11577 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 11578 11579 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 11580 Style.STRUCT.FIELD = false; \ 11581 EXPECT_EQ(0, \ 11582 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 11583 .value()); \ 11584 EXPECT_TRUE(Style.STRUCT.FIELD); \ 11585 EXPECT_EQ(0, \ 11586 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 11587 .value()); \ 11588 EXPECT_FALSE(Style.STRUCT.FIELD); 11589 11590 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 11591 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 11592 11593 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 11594 EXPECT_NE(VALUE, Style.FIELD); \ 11595 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 11596 EXPECT_EQ(VALUE, Style.FIELD) 11597 11598 TEST_F(FormatTest, ParsesConfigurationBools) { 11599 FormatStyle Style = {}; 11600 Style.Language = FormatStyle::LK_Cpp; 11601 CHECK_PARSE_BOOL(AlignOperands); 11602 CHECK_PARSE_BOOL(AlignTrailingComments); 11603 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 11604 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 11605 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 11606 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 11607 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 11608 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 11609 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine); 11610 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 11611 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 11612 CHECK_PARSE_BOOL(BinPackArguments); 11613 CHECK_PARSE_BOOL(BinPackParameters); 11614 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 11615 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 11616 CHECK_PARSE_BOOL(BreakStringLiterals); 11617 CHECK_PARSE_BOOL(CompactNamespaces); 11618 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 11619 CHECK_PARSE_BOOL(DerivePointerAlignment); 11620 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 11621 CHECK_PARSE_BOOL(DisableFormat); 11622 CHECK_PARSE_BOOL(IndentCaseLabels); 11623 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 11624 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 11625 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 11626 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 11627 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 11628 CHECK_PARSE_BOOL(ReflowComments); 11629 CHECK_PARSE_BOOL(SortIncludes); 11630 CHECK_PARSE_BOOL(SortUsingDeclarations); 11631 CHECK_PARSE_BOOL(SpacesInParentheses); 11632 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 11633 CHECK_PARSE_BOOL(SpacesInAngles); 11634 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 11635 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 11636 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 11637 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 11638 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 11639 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 11640 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 11641 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 11642 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 11643 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 11644 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 11645 11646 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 11647 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 11648 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement); 11649 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 11650 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 11651 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 11652 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 11653 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 11654 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 11655 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 11656 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 11657 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 11658 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 11659 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 11660 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 11661 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 11662 } 11663 11664 #undef CHECK_PARSE_BOOL 11665 11666 TEST_F(FormatTest, ParsesConfiguration) { 11667 FormatStyle Style = {}; 11668 Style.Language = FormatStyle::LK_Cpp; 11669 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 11670 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 11671 ConstructorInitializerIndentWidth, 1234u); 11672 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 11673 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 11674 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 11675 CHECK_PARSE("PenaltyBreakAssignment: 1234", 11676 PenaltyBreakAssignment, 1234u); 11677 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 11678 PenaltyBreakBeforeFirstCallParameter, 1234u); 11679 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 11680 PenaltyBreakTemplateDeclaration, 1234u); 11681 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 11682 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 11683 PenaltyReturnTypeOnItsOwnLine, 1234u); 11684 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 11685 SpacesBeforeTrailingComments, 1234u); 11686 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 11687 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 11688 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 11689 11690 Style.PointerAlignment = FormatStyle::PAS_Middle; 11691 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 11692 FormatStyle::PAS_Left); 11693 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 11694 FormatStyle::PAS_Right); 11695 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 11696 FormatStyle::PAS_Middle); 11697 // For backward compatibility: 11698 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 11699 FormatStyle::PAS_Left); 11700 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 11701 FormatStyle::PAS_Right); 11702 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 11703 FormatStyle::PAS_Middle); 11704 11705 Style.Standard = FormatStyle::LS_Auto; 11706 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 11707 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11); 11708 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 11709 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 11710 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 11711 11712 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11713 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 11714 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 11715 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 11716 FormatStyle::BOS_None); 11717 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 11718 FormatStyle::BOS_All); 11719 // For backward compatibility: 11720 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 11721 FormatStyle::BOS_None); 11722 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 11723 FormatStyle::BOS_All); 11724 11725 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 11726 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 11727 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 11728 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 11729 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 11730 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 11731 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 11732 // For backward compatibility: 11733 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 11734 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 11735 11736 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 11737 CHECK_PARSE("BreakInheritanceList: BeforeComma", 11738 BreakInheritanceList, FormatStyle::BILS_BeforeComma); 11739 CHECK_PARSE("BreakInheritanceList: AfterColon", 11740 BreakInheritanceList, FormatStyle::BILS_AfterColon); 11741 CHECK_PARSE("BreakInheritanceList: BeforeColon", 11742 BreakInheritanceList, FormatStyle::BILS_BeforeColon); 11743 // For backward compatibility: 11744 CHECK_PARSE("BreakBeforeInheritanceComma: true", 11745 BreakInheritanceList, FormatStyle::BILS_BeforeComma); 11746 11747 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 11748 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 11749 FormatStyle::BAS_Align); 11750 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 11751 FormatStyle::BAS_DontAlign); 11752 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 11753 FormatStyle::BAS_AlwaysBreak); 11754 // For backward compatibility: 11755 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 11756 FormatStyle::BAS_DontAlign); 11757 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 11758 FormatStyle::BAS_Align); 11759 11760 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11761 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 11762 FormatStyle::ENAS_DontAlign); 11763 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 11764 FormatStyle::ENAS_Left); 11765 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 11766 FormatStyle::ENAS_Right); 11767 // For backward compatibility: 11768 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 11769 FormatStyle::ENAS_Left); 11770 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 11771 FormatStyle::ENAS_Right); 11772 11773 Style.UseTab = FormatStyle::UT_ForIndentation; 11774 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 11775 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 11776 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 11777 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 11778 FormatStyle::UT_ForContinuationAndIndentation); 11779 // For backward compatibility: 11780 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 11781 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 11782 11783 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 11784 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 11785 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 11786 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 11787 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 11788 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 11789 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 11790 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 11791 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 11792 // For backward compatibility: 11793 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 11794 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 11795 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 11796 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 11797 11798 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 11799 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 11800 FormatStyle::SBPO_Never); 11801 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 11802 FormatStyle::SBPO_Always); 11803 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 11804 FormatStyle::SBPO_ControlStatements); 11805 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 11806 FormatStyle::SBPO_NonEmptyParentheses); 11807 // For backward compatibility: 11808 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 11809 FormatStyle::SBPO_Never); 11810 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 11811 FormatStyle::SBPO_ControlStatements); 11812 11813 Style.ColumnLimit = 123; 11814 FormatStyle BaseStyle = getLLVMStyle(); 11815 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 11816 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 11817 11818 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11819 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 11820 FormatStyle::BS_Attach); 11821 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 11822 FormatStyle::BS_Linux); 11823 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 11824 FormatStyle::BS_Mozilla); 11825 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 11826 FormatStyle::BS_Stroustrup); 11827 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 11828 FormatStyle::BS_Allman); 11829 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 11830 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 11831 FormatStyle::BS_WebKit); 11832 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 11833 FormatStyle::BS_Custom); 11834 11835 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 11836 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 11837 FormatStyle::RTBS_None); 11838 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 11839 FormatStyle::RTBS_All); 11840 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 11841 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 11842 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 11843 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 11844 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 11845 AlwaysBreakAfterReturnType, 11846 FormatStyle::RTBS_TopLevelDefinitions); 11847 11848 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 11849 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations, 11850 FormatStyle::BTDS_No); 11851 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations, 11852 FormatStyle::BTDS_MultiLine); 11853 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations, 11854 FormatStyle::BTDS_Yes); 11855 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations, 11856 FormatStyle::BTDS_MultiLine); 11857 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations, 11858 FormatStyle::BTDS_Yes); 11859 11860 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 11861 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 11862 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 11863 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 11864 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 11865 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 11866 AlwaysBreakAfterDefinitionReturnType, 11867 FormatStyle::DRTBS_TopLevel); 11868 11869 Style.NamespaceIndentation = FormatStyle::NI_All; 11870 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 11871 FormatStyle::NI_None); 11872 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 11873 FormatStyle::NI_Inner); 11874 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 11875 FormatStyle::NI_All); 11876 11877 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 11878 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 11879 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 11880 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 11881 AllowShortIfStatementsOnASingleLine, 11882 FormatStyle::SIS_WithoutElse); 11883 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 11884 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 11885 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 11886 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 11887 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 11888 AllowShortIfStatementsOnASingleLine, 11889 FormatStyle::SIS_WithoutElse); 11890 11891 // FIXME: This is required because parsing a configuration simply overwrites 11892 // the first N elements of the list instead of resetting it. 11893 Style.ForEachMacros.clear(); 11894 std::vector<std::string> BoostForeach; 11895 BoostForeach.push_back("BOOST_FOREACH"); 11896 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 11897 std::vector<std::string> BoostAndQForeach; 11898 BoostAndQForeach.push_back("BOOST_FOREACH"); 11899 BoostAndQForeach.push_back("Q_FOREACH"); 11900 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 11901 BoostAndQForeach); 11902 11903 Style.StatementMacros.clear(); 11904 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 11905 std::vector<std::string>{"QUNUSED"}); 11906 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 11907 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 11908 11909 Style.NamespaceMacros.clear(); 11910 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 11911 std::vector<std::string>{"TESTSUITE"}); 11912 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 11913 std::vector<std::string>({"TESTSUITE", "SUITE"})); 11914 11915 Style.IncludeStyle.IncludeCategories.clear(); 11916 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 11917 {"abc/.*", 2}, {".*", 1}}; 11918 CHECK_PARSE("IncludeCategories:\n" 11919 " - Regex: abc/.*\n" 11920 " Priority: 2\n" 11921 " - Regex: .*\n" 11922 " Priority: 1", 11923 IncludeStyle.IncludeCategories, ExpectedCategories); 11924 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 11925 "abc$"); 11926 11927 Style.RawStringFormats.clear(); 11928 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 11929 { 11930 FormatStyle::LK_TextProto, 11931 {"pb", "proto"}, 11932 {"PARSE_TEXT_PROTO"}, 11933 /*CanonicalDelimiter=*/"", 11934 "llvm", 11935 }, 11936 { 11937 FormatStyle::LK_Cpp, 11938 {"cc", "cpp"}, 11939 {"C_CODEBLOCK", "CPPEVAL"}, 11940 /*CanonicalDelimiter=*/"cc", 11941 /*BasedOnStyle=*/"", 11942 }, 11943 }; 11944 11945 CHECK_PARSE("RawStringFormats:\n" 11946 " - Language: TextProto\n" 11947 " Delimiters:\n" 11948 " - 'pb'\n" 11949 " - 'proto'\n" 11950 " EnclosingFunctions:\n" 11951 " - 'PARSE_TEXT_PROTO'\n" 11952 " BasedOnStyle: llvm\n" 11953 " - Language: Cpp\n" 11954 " Delimiters:\n" 11955 " - 'cc'\n" 11956 " - 'cpp'\n" 11957 " EnclosingFunctions:\n" 11958 " - 'C_CODEBLOCK'\n" 11959 " - 'CPPEVAL'\n" 11960 " CanonicalDelimiter: 'cc'", 11961 RawStringFormats, ExpectedRawStringFormats); 11962 } 11963 11964 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 11965 FormatStyle Style = {}; 11966 Style.Language = FormatStyle::LK_Cpp; 11967 CHECK_PARSE("Language: Cpp\n" 11968 "IndentWidth: 12", 11969 IndentWidth, 12u); 11970 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 11971 "IndentWidth: 34", 11972 &Style), 11973 ParseError::Unsuitable); 11974 EXPECT_EQ(12u, Style.IndentWidth); 11975 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 11976 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 11977 11978 Style.Language = FormatStyle::LK_JavaScript; 11979 CHECK_PARSE("Language: JavaScript\n" 11980 "IndentWidth: 12", 11981 IndentWidth, 12u); 11982 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 11983 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 11984 "IndentWidth: 34", 11985 &Style), 11986 ParseError::Unsuitable); 11987 EXPECT_EQ(23u, Style.IndentWidth); 11988 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 11989 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 11990 11991 CHECK_PARSE("BasedOnStyle: LLVM\n" 11992 "IndentWidth: 67", 11993 IndentWidth, 67u); 11994 11995 CHECK_PARSE("---\n" 11996 "Language: JavaScript\n" 11997 "IndentWidth: 12\n" 11998 "---\n" 11999 "Language: Cpp\n" 12000 "IndentWidth: 34\n" 12001 "...\n", 12002 IndentWidth, 12u); 12003 12004 Style.Language = FormatStyle::LK_Cpp; 12005 CHECK_PARSE("---\n" 12006 "Language: JavaScript\n" 12007 "IndentWidth: 12\n" 12008 "---\n" 12009 "Language: Cpp\n" 12010 "IndentWidth: 34\n" 12011 "...\n", 12012 IndentWidth, 34u); 12013 CHECK_PARSE("---\n" 12014 "IndentWidth: 78\n" 12015 "---\n" 12016 "Language: JavaScript\n" 12017 "IndentWidth: 56\n" 12018 "...\n", 12019 IndentWidth, 78u); 12020 12021 Style.ColumnLimit = 123; 12022 Style.IndentWidth = 234; 12023 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 12024 Style.TabWidth = 345; 12025 EXPECT_FALSE(parseConfiguration("---\n" 12026 "IndentWidth: 456\n" 12027 "BreakBeforeBraces: Allman\n" 12028 "---\n" 12029 "Language: JavaScript\n" 12030 "IndentWidth: 111\n" 12031 "TabWidth: 111\n" 12032 "---\n" 12033 "Language: Cpp\n" 12034 "BreakBeforeBraces: Stroustrup\n" 12035 "TabWidth: 789\n" 12036 "...\n", 12037 &Style)); 12038 EXPECT_EQ(123u, Style.ColumnLimit); 12039 EXPECT_EQ(456u, Style.IndentWidth); 12040 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 12041 EXPECT_EQ(789u, Style.TabWidth); 12042 12043 EXPECT_EQ(parseConfiguration("---\n" 12044 "Language: JavaScript\n" 12045 "IndentWidth: 56\n" 12046 "---\n" 12047 "IndentWidth: 78\n" 12048 "...\n", 12049 &Style), 12050 ParseError::Error); 12051 EXPECT_EQ(parseConfiguration("---\n" 12052 "Language: JavaScript\n" 12053 "IndentWidth: 56\n" 12054 "---\n" 12055 "Language: JavaScript\n" 12056 "IndentWidth: 78\n" 12057 "...\n", 12058 &Style), 12059 ParseError::Error); 12060 12061 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12062 } 12063 12064 #undef CHECK_PARSE 12065 12066 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 12067 FormatStyle Style = {}; 12068 Style.Language = FormatStyle::LK_JavaScript; 12069 Style.BreakBeforeTernaryOperators = true; 12070 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 12071 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12072 12073 Style.BreakBeforeTernaryOperators = true; 12074 EXPECT_EQ(0, parseConfiguration("---\n" 12075 "BasedOnStyle: Google\n" 12076 "---\n" 12077 "Language: JavaScript\n" 12078 "IndentWidth: 76\n" 12079 "...\n", 12080 &Style) 12081 .value()); 12082 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12083 EXPECT_EQ(76u, Style.IndentWidth); 12084 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12085 } 12086 12087 TEST_F(FormatTest, ConfigurationRoundTripTest) { 12088 FormatStyle Style = getLLVMStyle(); 12089 std::string YAML = configurationAsText(Style); 12090 FormatStyle ParsedStyle = {}; 12091 ParsedStyle.Language = FormatStyle::LK_Cpp; 12092 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 12093 EXPECT_EQ(Style, ParsedStyle); 12094 } 12095 12096 TEST_F(FormatTest, WorksFor8bitEncodings) { 12097 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 12098 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 12099 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 12100 "\"\xef\xee\xf0\xf3...\"", 12101 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 12102 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 12103 "\xef\xee\xf0\xf3...\"", 12104 getLLVMStyleWithColumns(12))); 12105 } 12106 12107 TEST_F(FormatTest, HandlesUTF8BOM) { 12108 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 12109 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 12110 format("\xef\xbb\xbf#include <iostream>")); 12111 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 12112 format("\xef\xbb\xbf\n#include <iostream>")); 12113 } 12114 12115 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 12116 #if !defined(_MSC_VER) 12117 12118 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 12119 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 12120 getLLVMStyleWithColumns(35)); 12121 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 12122 getLLVMStyleWithColumns(31)); 12123 verifyFormat("// Однажды в студёную зимнюю пору...", 12124 getLLVMStyleWithColumns(36)); 12125 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 12126 verifyFormat("/* Однажды в студёную зимнюю пору... */", 12127 getLLVMStyleWithColumns(39)); 12128 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 12129 getLLVMStyleWithColumns(35)); 12130 } 12131 12132 TEST_F(FormatTest, SplitsUTF8Strings) { 12133 // Non-printable characters' width is currently considered to be the length in 12134 // bytes in UTF8. The characters can be displayed in very different manner 12135 // (zero-width, single width with a substitution glyph, expanded to their code 12136 // (e.g. "<8d>"), so there's no single correct way to handle them. 12137 EXPECT_EQ("\"aaaaÄ\"\n" 12138 "\"\xc2\x8d\";", 12139 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12140 EXPECT_EQ("\"aaaaaaaÄ\"\n" 12141 "\"\xc2\x8d\";", 12142 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12143 EXPECT_EQ("\"Однажды, в \"\n" 12144 "\"студёную \"\n" 12145 "\"зимнюю \"\n" 12146 "\"пору,\"", 12147 format("\"Однажды, в студёную зимнюю пору,\"", 12148 getLLVMStyleWithColumns(13))); 12149 EXPECT_EQ( 12150 "\"一 二 三 \"\n" 12151 "\"四 五六 \"\n" 12152 "\"七 八 九 \"\n" 12153 "\"十\"", 12154 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 12155 EXPECT_EQ("\"一\t\"\n" 12156 "\"二 \t\"\n" 12157 "\"三 四 \"\n" 12158 "\"五\t\"\n" 12159 "\"六 \t\"\n" 12160 "\"七 \"\n" 12161 "\"八九十\tqq\"", 12162 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 12163 getLLVMStyleWithColumns(11))); 12164 12165 // UTF8 character in an escape sequence. 12166 EXPECT_EQ("\"aaaaaa\"\n" 12167 "\"\\\xC2\x8D\"", 12168 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 12169 } 12170 12171 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 12172 EXPECT_EQ("const char *sssss =\n" 12173 " \"一二三四五六七八\\\n" 12174 " 九 十\";", 12175 format("const char *sssss = \"一二三四五六七八\\\n" 12176 " 九 十\";", 12177 getLLVMStyleWithColumns(30))); 12178 } 12179 12180 TEST_F(FormatTest, SplitsUTF8LineComments) { 12181 EXPECT_EQ("// aaaaÄ\xc2\x8d", 12182 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 12183 EXPECT_EQ("// Я из лесу\n" 12184 "// вышел; был\n" 12185 "// сильный\n" 12186 "// мороз.", 12187 format("// Я из лесу вышел; был сильный мороз.", 12188 getLLVMStyleWithColumns(13))); 12189 EXPECT_EQ("// 一二三\n" 12190 "// 四五六七\n" 12191 "// 八 九\n" 12192 "// 十", 12193 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 12194 } 12195 12196 TEST_F(FormatTest, SplitsUTF8BlockComments) { 12197 EXPECT_EQ("/* Гляжу,\n" 12198 " * поднимается\n" 12199 " * медленно в\n" 12200 " * гору\n" 12201 " * Лошадка,\n" 12202 " * везущая\n" 12203 " * хворосту\n" 12204 " * воз. */", 12205 format("/* Гляжу, поднимается медленно в гору\n" 12206 " * Лошадка, везущая хворосту воз. */", 12207 getLLVMStyleWithColumns(13))); 12208 EXPECT_EQ( 12209 "/* 一二三\n" 12210 " * 四五六七\n" 12211 " * 八 九\n" 12212 " * 十 */", 12213 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 12214 EXPECT_EQ("/* \n" 12215 " * \n" 12216 " * - */", 12217 format("/* - */", getLLVMStyleWithColumns(12))); 12218 } 12219 12220 #endif // _MSC_VER 12221 12222 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 12223 FormatStyle Style = getLLVMStyle(); 12224 12225 Style.ConstructorInitializerIndentWidth = 4; 12226 verifyFormat( 12227 "SomeClass::Constructor()\n" 12228 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12229 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12230 Style); 12231 12232 Style.ConstructorInitializerIndentWidth = 2; 12233 verifyFormat( 12234 "SomeClass::Constructor()\n" 12235 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12236 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12237 Style); 12238 12239 Style.ConstructorInitializerIndentWidth = 0; 12240 verifyFormat( 12241 "SomeClass::Constructor()\n" 12242 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12243 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12244 Style); 12245 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12246 verifyFormat( 12247 "SomeLongTemplateVariableName<\n" 12248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 12249 Style); 12250 verifyFormat( 12251 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 12252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 12253 Style); 12254 12255 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 12256 verifyFormat( 12257 "SomeClass::Constructor() :\n" 12258 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 12259 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 12260 Style); 12261 } 12262 12263 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 12264 FormatStyle Style = getLLVMStyle(); 12265 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 12266 Style.ConstructorInitializerIndentWidth = 4; 12267 verifyFormat("SomeClass::Constructor()\n" 12268 " : a(a)\n" 12269 " , b(b)\n" 12270 " , c(c) {}", 12271 Style); 12272 verifyFormat("SomeClass::Constructor()\n" 12273 " : a(a) {}", 12274 Style); 12275 12276 Style.ColumnLimit = 0; 12277 verifyFormat("SomeClass::Constructor()\n" 12278 " : a(a) {}", 12279 Style); 12280 verifyFormat("SomeClass::Constructor() noexcept\n" 12281 " : a(a) {}", 12282 Style); 12283 verifyFormat("SomeClass::Constructor()\n" 12284 " : a(a)\n" 12285 " , b(b)\n" 12286 " , c(c) {}", 12287 Style); 12288 verifyFormat("SomeClass::Constructor()\n" 12289 " : a(a) {\n" 12290 " foo();\n" 12291 " bar();\n" 12292 "}", 12293 Style); 12294 12295 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 12296 verifyFormat("SomeClass::Constructor()\n" 12297 " : a(a)\n" 12298 " , b(b)\n" 12299 " , c(c) {\n}", 12300 Style); 12301 verifyFormat("SomeClass::Constructor()\n" 12302 " : a(a) {\n}", 12303 Style); 12304 12305 Style.ColumnLimit = 80; 12306 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 12307 Style.ConstructorInitializerIndentWidth = 2; 12308 verifyFormat("SomeClass::Constructor()\n" 12309 " : a(a)\n" 12310 " , b(b)\n" 12311 " , c(c) {}", 12312 Style); 12313 12314 Style.ConstructorInitializerIndentWidth = 0; 12315 verifyFormat("SomeClass::Constructor()\n" 12316 ": a(a)\n" 12317 ", b(b)\n" 12318 ", c(c) {}", 12319 Style); 12320 12321 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 12322 Style.ConstructorInitializerIndentWidth = 4; 12323 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 12324 verifyFormat( 12325 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 12326 Style); 12327 verifyFormat( 12328 "SomeClass::Constructor()\n" 12329 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 12330 Style); 12331 Style.ConstructorInitializerIndentWidth = 4; 12332 Style.ColumnLimit = 60; 12333 verifyFormat("SomeClass::Constructor()\n" 12334 " : aaaaaaaa(aaaaaaaa)\n" 12335 " , aaaaaaaa(aaaaaaaa)\n" 12336 " , aaaaaaaa(aaaaaaaa) {}", 12337 Style); 12338 } 12339 12340 TEST_F(FormatTest, Destructors) { 12341 verifyFormat("void F(int &i) { i.~int(); }"); 12342 verifyFormat("void F(int &i) { i->~int(); }"); 12343 } 12344 12345 TEST_F(FormatTest, FormatsWithWebKitStyle) { 12346 FormatStyle Style = getWebKitStyle(); 12347 12348 // Don't indent in outer namespaces. 12349 verifyFormat("namespace outer {\n" 12350 "int i;\n" 12351 "namespace inner {\n" 12352 " int i;\n" 12353 "} // namespace inner\n" 12354 "} // namespace outer\n" 12355 "namespace other_outer {\n" 12356 "int i;\n" 12357 "}", 12358 Style); 12359 12360 // Don't indent case labels. 12361 verifyFormat("switch (variable) {\n" 12362 "case 1:\n" 12363 "case 2:\n" 12364 " doSomething();\n" 12365 " break;\n" 12366 "default:\n" 12367 " ++variable;\n" 12368 "}", 12369 Style); 12370 12371 // Wrap before binary operators. 12372 EXPECT_EQ("void f()\n" 12373 "{\n" 12374 " if (aaaaaaaaaaaaaaaa\n" 12375 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 12376 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 12377 " return;\n" 12378 "}", 12379 format("void f() {\n" 12380 "if (aaaaaaaaaaaaaaaa\n" 12381 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 12382 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 12383 "return;\n" 12384 "}", 12385 Style)); 12386 12387 // Allow functions on a single line. 12388 verifyFormat("void f() { return; }", Style); 12389 12390 // Constructor initializers are formatted one per line with the "," on the 12391 // new line. 12392 verifyFormat("Constructor()\n" 12393 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 12394 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 12395 " aaaaaaaaaaaaaa)\n" 12396 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 12397 "{\n" 12398 "}", 12399 Style); 12400 verifyFormat("SomeClass::Constructor()\n" 12401 " : a(a)\n" 12402 "{\n" 12403 "}", 12404 Style); 12405 EXPECT_EQ("SomeClass::Constructor()\n" 12406 " : a(a)\n" 12407 "{\n" 12408 "}", 12409 format("SomeClass::Constructor():a(a){}", Style)); 12410 verifyFormat("SomeClass::Constructor()\n" 12411 " : a(a)\n" 12412 " , b(b)\n" 12413 " , c(c)\n" 12414 "{\n" 12415 "}", 12416 Style); 12417 verifyFormat("SomeClass::Constructor()\n" 12418 " : a(a)\n" 12419 "{\n" 12420 " foo();\n" 12421 " bar();\n" 12422 "}", 12423 Style); 12424 12425 // Access specifiers should be aligned left. 12426 verifyFormat("class C {\n" 12427 "public:\n" 12428 " int i;\n" 12429 "};", 12430 Style); 12431 12432 // Do not align comments. 12433 verifyFormat("int a; // Do not\n" 12434 "double b; // align comments.", 12435 Style); 12436 12437 // Do not align operands. 12438 EXPECT_EQ("ASSERT(aaaa\n" 12439 " || bbbb);", 12440 format("ASSERT ( aaaa\n||bbbb);", Style)); 12441 12442 // Accept input's line breaks. 12443 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 12444 " || bbbbbbbbbbbbbbb) {\n" 12445 " i++;\n" 12446 "}", 12447 format("if (aaaaaaaaaaaaaaa\n" 12448 "|| bbbbbbbbbbbbbbb) { i++; }", 12449 Style)); 12450 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 12451 " i++;\n" 12452 "}", 12453 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 12454 12455 // Don't automatically break all macro definitions (llvm.org/PR17842). 12456 verifyFormat("#define aNumber 10", Style); 12457 // However, generally keep the line breaks that the user authored. 12458 EXPECT_EQ("#define aNumber \\\n" 12459 " 10", 12460 format("#define aNumber \\\n" 12461 " 10", 12462 Style)); 12463 12464 // Keep empty and one-element array literals on a single line. 12465 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 12466 " copyItems:YES];", 12467 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 12468 "copyItems:YES];", 12469 Style)); 12470 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 12471 " copyItems:YES];", 12472 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 12473 " copyItems:YES];", 12474 Style)); 12475 // FIXME: This does not seem right, there should be more indentation before 12476 // the array literal's entries. Nested blocks have the same problem. 12477 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 12478 " @\"a\",\n" 12479 " @\"a\"\n" 12480 "]\n" 12481 " copyItems:YES];", 12482 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 12483 " @\"a\",\n" 12484 " @\"a\"\n" 12485 " ]\n" 12486 " copyItems:YES];", 12487 Style)); 12488 EXPECT_EQ( 12489 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 12490 " copyItems:YES];", 12491 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 12492 " copyItems:YES];", 12493 Style)); 12494 12495 verifyFormat("[self.a b:c c:d];", Style); 12496 EXPECT_EQ("[self.a b:c\n" 12497 " c:d];", 12498 format("[self.a b:c\n" 12499 "c:d];", 12500 Style)); 12501 } 12502 12503 TEST_F(FormatTest, FormatsLambdas) { 12504 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 12505 verifyFormat( 12506 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 12507 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 12508 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 12509 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 12510 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 12511 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 12512 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 12513 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 12514 verifyFormat("int x = f(*+[] {});"); 12515 verifyFormat("void f() {\n" 12516 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 12517 "}\n"); 12518 verifyFormat("void f() {\n" 12519 " other(x.begin(), //\n" 12520 " x.end(), //\n" 12521 " [&](int, int) { return 1; });\n" 12522 "}\n"); 12523 verifyFormat("void f() {\n" 12524 " other.other.other.other.other(\n" 12525 " x.begin(), x.end(),\n" 12526 " [something, rather](int, int, int, int, int, int, int) { return 1; });\n" 12527 "}\n"); 12528 verifyFormat("void f() {\n" 12529 " other.other.other.other.other(\n" 12530 " x.begin(), x.end(),\n" 12531 " [something, rather](int, int, int, int, int, int, int) {\n" 12532 " //\n" 12533 " });\n" 12534 "}\n"); 12535 verifyFormat("SomeFunction([]() { // A cool function...\n" 12536 " return 43;\n" 12537 "});"); 12538 EXPECT_EQ("SomeFunction([]() {\n" 12539 "#define A a\n" 12540 " return 43;\n" 12541 "});", 12542 format("SomeFunction([](){\n" 12543 "#define A a\n" 12544 "return 43;\n" 12545 "});")); 12546 verifyFormat("void f() {\n" 12547 " SomeFunction([](decltype(x), A *a) {});\n" 12548 "}"); 12549 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 12550 " [](const aaaaaaaaaa &a) { return a; });"); 12551 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 12552 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 12553 "});"); 12554 verifyFormat("Constructor()\n" 12555 " : Field([] { // comment\n" 12556 " int i;\n" 12557 " }) {}"); 12558 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 12559 " return some_parameter.size();\n" 12560 "};"); 12561 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 12562 " [](const string &s) { return s; };"); 12563 verifyFormat("int i = aaaaaa ? 1 //\n" 12564 " : [] {\n" 12565 " return 2; //\n" 12566 " }();"); 12567 verifyFormat("llvm::errs() << \"number of twos is \"\n" 12568 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 12569 " return x == 2; // force break\n" 12570 " });"); 12571 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 12572 " [=](int iiiiiiiiiiii) {\n" 12573 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 12574 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 12575 " });", 12576 getLLVMStyleWithColumns(60)); 12577 verifyFormat("SomeFunction({[&] {\n" 12578 " // comment\n" 12579 " },\n" 12580 " [&] {\n" 12581 " // comment\n" 12582 " }});"); 12583 verifyFormat("SomeFunction({[&] {\n" 12584 " // comment\n" 12585 "}});"); 12586 verifyFormat("virtual aaaaaaaaaaaaaaaa(\n" 12587 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 12588 " aaaaa aaaaaaaaa);"); 12589 12590 // Lambdas with return types. 12591 verifyFormat("int c = []() -> int { return 2; }();\n"); 12592 verifyFormat("int c = []() -> int * { return 2; }();\n"); 12593 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 12594 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 12595 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 12596 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 12597 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 12598 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 12599 verifyFormat("[a, a]() -> a<1> {};"); 12600 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 12601 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 12602 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 12603 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 12604 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 12605 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 12606 verifyFormat("[]() -> foo<!5> { return {}; };"); 12607 verifyFormat("[]() -> foo<~5> { return {}; };"); 12608 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 12609 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 12610 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 12611 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 12612 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 12613 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 12614 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 12615 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 12616 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 12617 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 12618 verifyFormat("namespace bar {\n" 12619 "// broken:\n" 12620 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 12621 "} // namespace bar"); 12622 verifyFormat("namespace bar {\n" 12623 "// broken:\n" 12624 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 12625 "} // namespace bar"); 12626 verifyFormat("namespace bar {\n" 12627 "// broken:\n" 12628 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 12629 "} // namespace bar"); 12630 verifyFormat("namespace bar {\n" 12631 "// broken:\n" 12632 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 12633 "} // namespace bar"); 12634 verifyFormat("namespace bar {\n" 12635 "// broken:\n" 12636 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 12637 "} // namespace bar"); 12638 verifyFormat("namespace bar {\n" 12639 "// broken:\n" 12640 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 12641 "} // namespace bar"); 12642 verifyFormat("namespace bar {\n" 12643 "// broken:\n" 12644 "auto foo{[]() -> foo<!5> { return {}; }};\n" 12645 "} // namespace bar"); 12646 verifyFormat("namespace bar {\n" 12647 "// broken:\n" 12648 "auto foo{[]() -> foo<~5> { return {}; }};\n" 12649 "} // namespace bar"); 12650 verifyFormat("namespace bar {\n" 12651 "// broken:\n" 12652 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 12653 "} // namespace bar"); 12654 verifyFormat("namespace bar {\n" 12655 "// broken:\n" 12656 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 12657 "} // namespace bar"); 12658 verifyFormat("namespace bar {\n" 12659 "// broken:\n" 12660 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 12661 "} // namespace bar"); 12662 verifyFormat("namespace bar {\n" 12663 "// broken:\n" 12664 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 12665 "} // namespace bar"); 12666 verifyFormat("namespace bar {\n" 12667 "// broken:\n" 12668 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 12669 "} // namespace bar"); 12670 verifyFormat("namespace bar {\n" 12671 "// broken:\n" 12672 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 12673 "} // namespace bar"); 12674 verifyFormat("namespace bar {\n" 12675 "// broken:\n" 12676 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 12677 "} // namespace bar"); 12678 verifyFormat("namespace bar {\n" 12679 "// broken:\n" 12680 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 12681 "} // namespace bar"); 12682 verifyFormat("namespace bar {\n" 12683 "// broken:\n" 12684 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 12685 "} // namespace bar"); 12686 verifyFormat("namespace bar {\n" 12687 "// broken:\n" 12688 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 12689 "} // namespace bar"); 12690 verifyFormat("[]() -> a<1> {};"); 12691 verifyFormat("[]() -> a<1> { ; };"); 12692 verifyFormat("[]() -> a<1> { ; }();"); 12693 verifyFormat("[a, a]() -> a<true> {};"); 12694 verifyFormat("[]() -> a<true> {};"); 12695 verifyFormat("[]() -> a<true> { ; };"); 12696 verifyFormat("[]() -> a<true> { ; }();"); 12697 verifyFormat("[a, a]() -> a<false> {};"); 12698 verifyFormat("[]() -> a<false> {};"); 12699 verifyFormat("[]() -> a<false> { ; };"); 12700 verifyFormat("[]() -> a<false> { ; }();"); 12701 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 12702 verifyFormat("namespace bar {\n" 12703 "auto foo{[]() -> foo<false> { ; }};\n" 12704 "} // namespace bar"); 12705 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 12706 " int j) -> int {\n" 12707 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 12708 "};"); 12709 verifyFormat( 12710 "aaaaaaaaaaaaaaaaaaaaaa(\n" 12711 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 12712 " return aaaaaaaaaaaaaaaaa;\n" 12713 " });", 12714 getLLVMStyleWithColumns(70)); 12715 verifyFormat("[]() //\n" 12716 " -> int {\n" 12717 " return 1; //\n" 12718 "};"); 12719 12720 // Multiple lambdas in the same parentheses change indentation rules. These 12721 // lambdas are forced to start on new lines. 12722 verifyFormat("SomeFunction(\n" 12723 " []() {\n" 12724 " //\n" 12725 " },\n" 12726 " []() {\n" 12727 " //\n" 12728 " });"); 12729 12730 // A lambda passed as arg0 is always pushed to the next line. 12731 verifyFormat("SomeFunction(\n" 12732 " [this] {\n" 12733 " //\n" 12734 " },\n" 12735 " 1);\n"); 12736 12737 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like the arg0 12738 // case above. 12739 auto Style = getGoogleStyle(); 12740 Style.BinPackArguments = false; 12741 verifyFormat("SomeFunction(\n" 12742 " a,\n" 12743 " [this] {\n" 12744 " //\n" 12745 " },\n" 12746 " b);\n", 12747 Style); 12748 verifyFormat("SomeFunction(\n" 12749 " a,\n" 12750 " [this] {\n" 12751 " //\n" 12752 " },\n" 12753 " b);\n"); 12754 12755 // A lambda with a very long line forces arg0 to be pushed out irrespective of 12756 // the BinPackArguments value (as long as the code is wide enough). 12757 verifyFormat("something->SomeFunction(\n" 12758 " a,\n" 12759 " [this] {\n" 12760 " D0000000000000000000000000000000000000000000000000000000000001();\n" 12761 " },\n" 12762 " b);\n"); 12763 12764 // A multi-line lambda is pulled up as long as the introducer fits on the previous 12765 // line and there are no further args. 12766 verifyFormat("function(1, [this, that] {\n" 12767 " //\n" 12768 "});\n"); 12769 verifyFormat("function([this, that] {\n" 12770 " //\n" 12771 "});\n"); 12772 // FIXME: this format is not ideal and we should consider forcing the first arg 12773 // onto its own line. 12774 verifyFormat("function(a, b, c, //\n" 12775 " d, [this, that] {\n" 12776 " //\n" 12777 " });\n"); 12778 12779 // Multiple lambdas are treated correctly even when there is a short arg0. 12780 verifyFormat("SomeFunction(\n" 12781 " 1,\n" 12782 " [this] {\n" 12783 " //\n" 12784 " },\n" 12785 " [this] {\n" 12786 " //\n" 12787 " },\n" 12788 " 1);\n"); 12789 12790 // More complex introducers. 12791 verifyFormat("return [i, args...] {};"); 12792 12793 // Not lambdas. 12794 verifyFormat("constexpr char hello[]{\"hello\"};"); 12795 verifyFormat("double &operator[](int i) { return 0; }\n" 12796 "int i;"); 12797 verifyFormat("std::unique_ptr<int[]> foo() {}"); 12798 verifyFormat("int i = a[a][a]->f();"); 12799 verifyFormat("int i = (*b)[a]->f();"); 12800 12801 // Other corner cases. 12802 verifyFormat("void f() {\n" 12803 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 12804 " );\n" 12805 "}"); 12806 12807 // Lambdas created through weird macros. 12808 verifyFormat("void f() {\n" 12809 " MACRO((const AA &a) { return 1; });\n" 12810 " MACRO((AA &a) { return 1; });\n" 12811 "}"); 12812 12813 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 12814 " doo_dah();\n" 12815 " doo_dah();\n" 12816 " })) {\n" 12817 "}"); 12818 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 12819 " doo_dah();\n" 12820 " doo_dah();\n" 12821 " })) {\n" 12822 "}"); 12823 verifyFormat("auto lambda = []() {\n" 12824 " int a = 2\n" 12825 "#if A\n" 12826 " + 2\n" 12827 "#endif\n" 12828 " ;\n" 12829 "};"); 12830 12831 // Lambdas with complex multiline introducers. 12832 verifyFormat( 12833 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 12834 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 12835 " -> ::std::unordered_set<\n" 12836 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 12837 " //\n" 12838 " });"); 12839 12840 FormatStyle DoNotMerge = getLLVMStyle(); 12841 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 12842 verifyFormat("auto c = []() {\n" 12843 " return b;\n" 12844 "};", 12845 "auto c = []() { return b; };", DoNotMerge); 12846 verifyFormat("auto c = []() {\n" 12847 "};", 12848 " auto c = []() {};", DoNotMerge); 12849 12850 FormatStyle MergeEmptyOnly = getLLVMStyle(); 12851 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 12852 verifyFormat("auto c = []() {\n" 12853 " return b;\n" 12854 "};", 12855 "auto c = []() {\n" 12856 " return b;\n" 12857 " };", 12858 MergeEmptyOnly); 12859 verifyFormat("auto c = []() {};", 12860 "auto c = []() {\n" 12861 "};", 12862 MergeEmptyOnly); 12863 12864 FormatStyle MergeInline = getLLVMStyle(); 12865 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 12866 verifyFormat("auto c = []() {\n" 12867 " return b;\n" 12868 "};", 12869 "auto c = []() { return b; };", MergeInline); 12870 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 12871 MergeInline); 12872 verifyFormat("function([]() { return b; }, a)", 12873 "function([]() { return b; }, a)", MergeInline); 12874 verifyFormat("function(a, []() { return b; })", 12875 "function(a, []() { return b; })", MergeInline); 12876 } 12877 12878 TEST_F(FormatTest, EmptyLinesInLambdas) { 12879 verifyFormat("auto lambda = []() {\n" 12880 " x(); //\n" 12881 "};", 12882 "auto lambda = []() {\n" 12883 "\n" 12884 " x(); //\n" 12885 "\n" 12886 "};"); 12887 } 12888 12889 TEST_F(FormatTest, FormatsBlocks) { 12890 FormatStyle ShortBlocks = getLLVMStyle(); 12891 ShortBlocks.AllowShortBlocksOnASingleLine = true; 12892 verifyFormat("int (^Block)(int, int);", ShortBlocks); 12893 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 12894 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 12895 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 12896 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 12897 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 12898 12899 verifyFormat("foo(^{ bar(); });", ShortBlocks); 12900 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 12901 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 12902 12903 verifyFormat("[operation setCompletionBlock:^{\n" 12904 " [self onOperationDone];\n" 12905 "}];"); 12906 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 12907 " [self onOperationDone];\n" 12908 "}]};"); 12909 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 12910 " f();\n" 12911 "}];"); 12912 verifyFormat("int a = [operation block:^int(int *i) {\n" 12913 " return 1;\n" 12914 "}];"); 12915 verifyFormat("[myObject doSomethingWith:arg1\n" 12916 " aaa:^int(int *a) {\n" 12917 " return 1;\n" 12918 " }\n" 12919 " bbb:f(a * bbbbbbbb)];"); 12920 12921 verifyFormat("[operation setCompletionBlock:^{\n" 12922 " [self.delegate newDataAvailable];\n" 12923 "}];", 12924 getLLVMStyleWithColumns(60)); 12925 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 12926 " NSString *path = [self sessionFilePath];\n" 12927 " if (path) {\n" 12928 " // ...\n" 12929 " }\n" 12930 "});"); 12931 verifyFormat("[[SessionService sharedService]\n" 12932 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 12933 " if (window) {\n" 12934 " [self windowDidLoad:window];\n" 12935 " } else {\n" 12936 " [self errorLoadingWindow];\n" 12937 " }\n" 12938 " }];"); 12939 verifyFormat("void (^largeBlock)(void) = ^{\n" 12940 " // ...\n" 12941 "};\n", 12942 getLLVMStyleWithColumns(40)); 12943 verifyFormat("[[SessionService sharedService]\n" 12944 " loadWindowWithCompletionBlock: //\n" 12945 " ^(SessionWindow *window) {\n" 12946 " if (window) {\n" 12947 " [self windowDidLoad:window];\n" 12948 " } else {\n" 12949 " [self errorLoadingWindow];\n" 12950 " }\n" 12951 " }];", 12952 getLLVMStyleWithColumns(60)); 12953 verifyFormat("[myObject doSomethingWith:arg1\n" 12954 " firstBlock:^(Foo *a) {\n" 12955 " // ...\n" 12956 " int i;\n" 12957 " }\n" 12958 " secondBlock:^(Bar *b) {\n" 12959 " // ...\n" 12960 " int i;\n" 12961 " }\n" 12962 " thirdBlock:^Foo(Bar *b) {\n" 12963 " // ...\n" 12964 " int i;\n" 12965 " }];"); 12966 verifyFormat("[myObject doSomethingWith:arg1\n" 12967 " firstBlock:-1\n" 12968 " secondBlock:^(Bar *b) {\n" 12969 " // ...\n" 12970 " int i;\n" 12971 " }];"); 12972 12973 verifyFormat("f(^{\n" 12974 " @autoreleasepool {\n" 12975 " if (a) {\n" 12976 " g();\n" 12977 " }\n" 12978 " }\n" 12979 "});"); 12980 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 12981 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 12982 "};"); 12983 12984 FormatStyle FourIndent = getLLVMStyle(); 12985 FourIndent.ObjCBlockIndentWidth = 4; 12986 verifyFormat("[operation setCompletionBlock:^{\n" 12987 " [self onOperationDone];\n" 12988 "}];", 12989 FourIndent); 12990 } 12991 12992 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 12993 FormatStyle ZeroColumn = getLLVMStyle(); 12994 ZeroColumn.ColumnLimit = 0; 12995 12996 verifyFormat("[[SessionService sharedService] " 12997 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 12998 " if (window) {\n" 12999 " [self windowDidLoad:window];\n" 13000 " } else {\n" 13001 " [self errorLoadingWindow];\n" 13002 " }\n" 13003 "}];", 13004 ZeroColumn); 13005 EXPECT_EQ("[[SessionService sharedService]\n" 13006 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13007 " if (window) {\n" 13008 " [self windowDidLoad:window];\n" 13009 " } else {\n" 13010 " [self errorLoadingWindow];\n" 13011 " }\n" 13012 " }];", 13013 format("[[SessionService sharedService]\n" 13014 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13015 " if (window) {\n" 13016 " [self windowDidLoad:window];\n" 13017 " } else {\n" 13018 " [self errorLoadingWindow];\n" 13019 " }\n" 13020 "}];", 13021 ZeroColumn)); 13022 verifyFormat("[myObject doSomethingWith:arg1\n" 13023 " firstBlock:^(Foo *a) {\n" 13024 " // ...\n" 13025 " int i;\n" 13026 " }\n" 13027 " secondBlock:^(Bar *b) {\n" 13028 " // ...\n" 13029 " int i;\n" 13030 " }\n" 13031 " thirdBlock:^Foo(Bar *b) {\n" 13032 " // ...\n" 13033 " int i;\n" 13034 " }];", 13035 ZeroColumn); 13036 verifyFormat("f(^{\n" 13037 " @autoreleasepool {\n" 13038 " if (a) {\n" 13039 " g();\n" 13040 " }\n" 13041 " }\n" 13042 "});", 13043 ZeroColumn); 13044 verifyFormat("void (^largeBlock)(void) = ^{\n" 13045 " // ...\n" 13046 "};", 13047 ZeroColumn); 13048 13049 ZeroColumn.AllowShortBlocksOnASingleLine = true; 13050 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 13051 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13052 ZeroColumn.AllowShortBlocksOnASingleLine = false; 13053 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 13054 " int i;\n" 13055 "};", 13056 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13057 } 13058 13059 TEST_F(FormatTest, SupportsCRLF) { 13060 EXPECT_EQ("int a;\r\n" 13061 "int b;\r\n" 13062 "int c;\r\n", 13063 format("int a;\r\n" 13064 " int b;\r\n" 13065 " int c;\r\n", 13066 getLLVMStyle())); 13067 EXPECT_EQ("int a;\r\n" 13068 "int b;\r\n" 13069 "int c;\r\n", 13070 format("int a;\r\n" 13071 " int b;\n" 13072 " int c;\r\n", 13073 getLLVMStyle())); 13074 EXPECT_EQ("int a;\n" 13075 "int b;\n" 13076 "int c;\n", 13077 format("int a;\r\n" 13078 " int b;\n" 13079 " int c;\n", 13080 getLLVMStyle())); 13081 EXPECT_EQ("\"aaaaaaa \"\r\n" 13082 "\"bbbbbbb\";\r\n", 13083 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 13084 EXPECT_EQ("#define A \\\r\n" 13085 " b; \\\r\n" 13086 " c; \\\r\n" 13087 " d;\r\n", 13088 format("#define A \\\r\n" 13089 " b; \\\r\n" 13090 " c; d; \r\n", 13091 getGoogleStyle())); 13092 13093 EXPECT_EQ("/*\r\n" 13094 "multi line block comments\r\n" 13095 "should not introduce\r\n" 13096 "an extra carriage return\r\n" 13097 "*/\r\n", 13098 format("/*\r\n" 13099 "multi line block comments\r\n" 13100 "should not introduce\r\n" 13101 "an extra carriage return\r\n" 13102 "*/\r\n")); 13103 EXPECT_EQ("/*\r\n" 13104 "\r\n" 13105 "*/", 13106 format("/*\r\n" 13107 " \r\r\r\n" 13108 "*/")); 13109 } 13110 13111 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 13112 verifyFormat("MY_CLASS(C) {\n" 13113 " int i;\n" 13114 " int j;\n" 13115 "};"); 13116 } 13117 13118 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 13119 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 13120 TwoIndent.ContinuationIndentWidth = 2; 13121 13122 EXPECT_EQ("int i =\n" 13123 " longFunction(\n" 13124 " arg);", 13125 format("int i = longFunction(arg);", TwoIndent)); 13126 13127 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 13128 SixIndent.ContinuationIndentWidth = 6; 13129 13130 EXPECT_EQ("int i =\n" 13131 " longFunction(\n" 13132 " arg);", 13133 format("int i = longFunction(arg);", SixIndent)); 13134 } 13135 13136 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 13137 FormatStyle Style = getLLVMStyle(); 13138 verifyFormat("int Foo::getter(\n" 13139 " //\n" 13140 ") const {\n" 13141 " return foo;\n" 13142 "}", 13143 Style); 13144 verifyFormat("void Foo::setter(\n" 13145 " //\n" 13146 ") {\n" 13147 " foo = 1;\n" 13148 "}", 13149 Style); 13150 } 13151 13152 TEST_F(FormatTest, SpacesInAngles) { 13153 FormatStyle Spaces = getLLVMStyle(); 13154 Spaces.SpacesInAngles = true; 13155 13156 verifyFormat("static_cast< int >(arg);", Spaces); 13157 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 13158 verifyFormat("f< int, float >();", Spaces); 13159 verifyFormat("template <> g() {}", Spaces); 13160 verifyFormat("template < std::vector< int > > f() {}", Spaces); 13161 verifyFormat("std::function< void(int, int) > fct;", Spaces); 13162 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 13163 Spaces); 13164 13165 Spaces.Standard = FormatStyle::LS_Cpp03; 13166 Spaces.SpacesInAngles = true; 13167 verifyFormat("A< A< int > >();", Spaces); 13168 13169 Spaces.SpacesInAngles = false; 13170 verifyFormat("A<A<int> >();", Spaces); 13171 13172 Spaces.Standard = FormatStyle::LS_Cpp11; 13173 Spaces.SpacesInAngles = true; 13174 verifyFormat("A< A< int > >();", Spaces); 13175 13176 Spaces.SpacesInAngles = false; 13177 verifyFormat("A<A<int>>();", Spaces); 13178 } 13179 13180 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 13181 FormatStyle Style = getLLVMStyle(); 13182 Style.SpaceAfterTemplateKeyword = false; 13183 verifyFormat("template<int> void foo();", Style); 13184 } 13185 13186 TEST_F(FormatTest, TripleAngleBrackets) { 13187 verifyFormat("f<<<1, 1>>>();"); 13188 verifyFormat("f<<<1, 1, 1, s>>>();"); 13189 verifyFormat("f<<<a, b, c, d>>>();"); 13190 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 13191 verifyFormat("f<param><<<1, 1>>>();"); 13192 verifyFormat("f<1><<<1, 1>>>();"); 13193 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 13194 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13195 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 13196 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 13197 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 13198 } 13199 13200 TEST_F(FormatTest, MergeLessLessAtEnd) { 13201 verifyFormat("<<"); 13202 EXPECT_EQ("< < <", format("\\\n<<<")); 13203 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13204 "aaallvm::outs() <<"); 13205 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13206 "aaaallvm::outs()\n <<"); 13207 } 13208 13209 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 13210 std::string code = "#if A\n" 13211 "#if B\n" 13212 "a.\n" 13213 "#endif\n" 13214 " a = 1;\n" 13215 "#else\n" 13216 "#endif\n" 13217 "#if C\n" 13218 "#else\n" 13219 "#endif\n"; 13220 EXPECT_EQ(code, format(code)); 13221 } 13222 13223 TEST_F(FormatTest, HandleConflictMarkers) { 13224 // Git/SVN conflict markers. 13225 EXPECT_EQ("int a;\n" 13226 "void f() {\n" 13227 " callme(some(parameter1,\n" 13228 "<<<<<<< text by the vcs\n" 13229 " parameter2),\n" 13230 "||||||| text by the vcs\n" 13231 " parameter2),\n" 13232 " parameter3,\n" 13233 "======= text by the vcs\n" 13234 " parameter2, parameter3),\n" 13235 ">>>>>>> text by the vcs\n" 13236 " otherparameter);\n", 13237 format("int a;\n" 13238 "void f() {\n" 13239 " callme(some(parameter1,\n" 13240 "<<<<<<< text by the vcs\n" 13241 " parameter2),\n" 13242 "||||||| text by the vcs\n" 13243 " parameter2),\n" 13244 " parameter3,\n" 13245 "======= text by the vcs\n" 13246 " parameter2,\n" 13247 " parameter3),\n" 13248 ">>>>>>> text by the vcs\n" 13249 " otherparameter);\n")); 13250 13251 // Perforce markers. 13252 EXPECT_EQ("void f() {\n" 13253 " function(\n" 13254 ">>>> text by the vcs\n" 13255 " parameter,\n" 13256 "==== text by the vcs\n" 13257 " parameter,\n" 13258 "==== text by the vcs\n" 13259 " parameter,\n" 13260 "<<<< text by the vcs\n" 13261 " parameter);\n", 13262 format("void f() {\n" 13263 " function(\n" 13264 ">>>> text by the vcs\n" 13265 " parameter,\n" 13266 "==== text by the vcs\n" 13267 " parameter,\n" 13268 "==== text by the vcs\n" 13269 " parameter,\n" 13270 "<<<< text by the vcs\n" 13271 " parameter);\n")); 13272 13273 EXPECT_EQ("<<<<<<<\n" 13274 "|||||||\n" 13275 "=======\n" 13276 ">>>>>>>", 13277 format("<<<<<<<\n" 13278 "|||||||\n" 13279 "=======\n" 13280 ">>>>>>>")); 13281 13282 EXPECT_EQ("<<<<<<<\n" 13283 "|||||||\n" 13284 "int i;\n" 13285 "=======\n" 13286 ">>>>>>>", 13287 format("<<<<<<<\n" 13288 "|||||||\n" 13289 "int i;\n" 13290 "=======\n" 13291 ">>>>>>>")); 13292 13293 // FIXME: Handle parsing of macros around conflict markers correctly: 13294 EXPECT_EQ("#define Macro \\\n" 13295 "<<<<<<<\n" 13296 "Something \\\n" 13297 "|||||||\n" 13298 "Else \\\n" 13299 "=======\n" 13300 "Other \\\n" 13301 ">>>>>>>\n" 13302 " End int i;\n", 13303 format("#define Macro \\\n" 13304 "<<<<<<<\n" 13305 " Something \\\n" 13306 "|||||||\n" 13307 " Else \\\n" 13308 "=======\n" 13309 " Other \\\n" 13310 ">>>>>>>\n" 13311 " End\n" 13312 "int i;\n")); 13313 } 13314 13315 TEST_F(FormatTest, DisableRegions) { 13316 EXPECT_EQ("int i;\n" 13317 "// clang-format off\n" 13318 " int j;\n" 13319 "// clang-format on\n" 13320 "int k;", 13321 format(" int i;\n" 13322 " // clang-format off\n" 13323 " int j;\n" 13324 " // clang-format on\n" 13325 " int k;")); 13326 EXPECT_EQ("int i;\n" 13327 "/* clang-format off */\n" 13328 " int j;\n" 13329 "/* clang-format on */\n" 13330 "int k;", 13331 format(" int i;\n" 13332 " /* clang-format off */\n" 13333 " int j;\n" 13334 " /* clang-format on */\n" 13335 " int k;")); 13336 13337 // Don't reflow comments within disabled regions. 13338 EXPECT_EQ( 13339 "// clang-format off\n" 13340 "// long long long long long long line\n" 13341 "/* clang-format on */\n" 13342 "/* long long long\n" 13343 " * long long long\n" 13344 " * line */\n" 13345 "int i;\n" 13346 "/* clang-format off */\n" 13347 "/* long long long long long long line */\n", 13348 format("// clang-format off\n" 13349 "// long long long long long long line\n" 13350 "/* clang-format on */\n" 13351 "/* long long long long long long line */\n" 13352 "int i;\n" 13353 "/* clang-format off */\n" 13354 "/* long long long long long long line */\n", 13355 getLLVMStyleWithColumns(20))); 13356 } 13357 13358 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 13359 format("? ) ="); 13360 verifyNoCrash("#define a\\\n /**/}"); 13361 } 13362 13363 TEST_F(FormatTest, FormatsTableGenCode) { 13364 FormatStyle Style = getLLVMStyle(); 13365 Style.Language = FormatStyle::LK_TableGen; 13366 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 13367 } 13368 13369 TEST_F(FormatTest, ArrayOfTemplates) { 13370 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 13371 format("auto a = new unique_ptr<int > [ 10];")); 13372 13373 FormatStyle Spaces = getLLVMStyle(); 13374 Spaces.SpacesInSquareBrackets = true; 13375 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 13376 format("auto a = new unique_ptr<int > [10];", Spaces)); 13377 } 13378 13379 TEST_F(FormatTest, ArrayAsTemplateType) { 13380 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 13381 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 13382 13383 FormatStyle Spaces = getLLVMStyle(); 13384 Spaces.SpacesInSquareBrackets = true; 13385 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 13386 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 13387 } 13388 13389 TEST_F(FormatTest, NoSpaceAfterSuper) { 13390 verifyFormat("__super::FooBar();"); 13391 } 13392 13393 TEST(FormatStyle, GetStyleWithEmptyFileName) { 13394 llvm::vfs::InMemoryFileSystem FS; 13395 auto Style1 = getStyle("file", "", "Google", "", &FS); 13396 ASSERT_TRUE((bool)Style1); 13397 ASSERT_EQ(*Style1, getGoogleStyle()); 13398 } 13399 13400 TEST(FormatStyle, GetStyleOfFile) { 13401 llvm::vfs::InMemoryFileSystem FS; 13402 // Test 1: format file in the same directory. 13403 ASSERT_TRUE( 13404 FS.addFile("/a/.clang-format", 0, 13405 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 13406 ASSERT_TRUE( 13407 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13408 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 13409 ASSERT_TRUE((bool)Style1); 13410 ASSERT_EQ(*Style1, getLLVMStyle()); 13411 13412 // Test 2.1: fallback to default. 13413 ASSERT_TRUE( 13414 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13415 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 13416 ASSERT_TRUE((bool)Style2); 13417 ASSERT_EQ(*Style2, getMozillaStyle()); 13418 13419 // Test 2.2: no format on 'none' fallback style. 13420 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 13421 ASSERT_TRUE((bool)Style2); 13422 ASSERT_EQ(*Style2, getNoStyle()); 13423 13424 // Test 2.3: format if config is found with no based style while fallback is 13425 // 'none'. 13426 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 13427 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 13428 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 13429 ASSERT_TRUE((bool)Style2); 13430 ASSERT_EQ(*Style2, getLLVMStyle()); 13431 13432 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 13433 Style2 = getStyle("{}", "a.h", "none", "", &FS); 13434 ASSERT_TRUE((bool)Style2); 13435 ASSERT_EQ(*Style2, getLLVMStyle()); 13436 13437 // Test 3: format file in parent directory. 13438 ASSERT_TRUE( 13439 FS.addFile("/c/.clang-format", 0, 13440 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 13441 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 13442 llvm::MemoryBuffer::getMemBuffer("int i;"))); 13443 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 13444 ASSERT_TRUE((bool)Style3); 13445 ASSERT_EQ(*Style3, getGoogleStyle()); 13446 13447 // Test 4: error on invalid fallback style 13448 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 13449 ASSERT_FALSE((bool)Style4); 13450 llvm::consumeError(Style4.takeError()); 13451 13452 // Test 5: error on invalid yaml on command line 13453 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 13454 ASSERT_FALSE((bool)Style5); 13455 llvm::consumeError(Style5.takeError()); 13456 13457 // Test 6: error on invalid style 13458 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 13459 ASSERT_FALSE((bool)Style6); 13460 llvm::consumeError(Style6.takeError()); 13461 13462 // Test 7: found config file, error on parsing it 13463 ASSERT_TRUE( 13464 FS.addFile("/d/.clang-format", 0, 13465 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 13466 "InvalidKey: InvalidValue"))); 13467 ASSERT_TRUE( 13468 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 13469 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 13470 ASSERT_FALSE((bool)Style7); 13471 llvm::consumeError(Style7.takeError()); 13472 13473 // Test 8: inferred per-language defaults apply. 13474 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 13475 ASSERT_TRUE((bool)StyleTd); 13476 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 13477 } 13478 13479 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 13480 // Column limit is 20. 13481 std::string Code = "Type *a =\n" 13482 " new Type();\n" 13483 "g(iiiii, 0, jjjjj,\n" 13484 " 0, kkkkk, 0, mm);\n" 13485 "int bad = format ;"; 13486 std::string Expected = "auto a = new Type();\n" 13487 "g(iiiii, nullptr,\n" 13488 " jjjjj, nullptr,\n" 13489 " kkkkk, nullptr,\n" 13490 " mm);\n" 13491 "int bad = format ;"; 13492 FileID ID = Context.createInMemoryFile("format.cpp", Code); 13493 tooling::Replacements Replaces = toReplacements( 13494 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 13495 "auto "), 13496 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 13497 "nullptr"), 13498 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 13499 "nullptr"), 13500 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 13501 "nullptr")}); 13502 13503 format::FormatStyle Style = format::getLLVMStyle(); 13504 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 13505 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 13506 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 13507 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 13508 auto Result = applyAllReplacements(Code, *FormattedReplaces); 13509 EXPECT_TRUE(static_cast<bool>(Result)); 13510 EXPECT_EQ(Expected, *Result); 13511 } 13512 13513 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 13514 std::string Code = "#include \"a.h\"\n" 13515 "#include \"c.h\"\n" 13516 "\n" 13517 "int main() {\n" 13518 " return 0;\n" 13519 "}"; 13520 std::string Expected = "#include \"a.h\"\n" 13521 "#include \"b.h\"\n" 13522 "#include \"c.h\"\n" 13523 "\n" 13524 "int main() {\n" 13525 " return 0;\n" 13526 "}"; 13527 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 13528 tooling::Replacements Replaces = toReplacements( 13529 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 13530 "#include \"b.h\"\n")}); 13531 13532 format::FormatStyle Style = format::getLLVMStyle(); 13533 Style.SortIncludes = true; 13534 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 13535 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 13536 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 13537 auto Result = applyAllReplacements(Code, *FormattedReplaces); 13538 EXPECT_TRUE(static_cast<bool>(Result)); 13539 EXPECT_EQ(Expected, *Result); 13540 } 13541 13542 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 13543 EXPECT_EQ("using std::cin;\n" 13544 "using std::cout;", 13545 format("using std::cout;\n" 13546 "using std::cin;", getGoogleStyle())); 13547 } 13548 13549 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 13550 format::FormatStyle Style = format::getLLVMStyle(); 13551 Style.Standard = FormatStyle::LS_Cpp03; 13552 // cpp03 recognize this string as identifier u8 and literal character 'a' 13553 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 13554 } 13555 13556 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 13557 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 13558 // all modes, including C++11, C++14 and C++17 13559 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 13560 } 13561 13562 TEST_F(FormatTest, DoNotFormatLikelyXml) { 13563 EXPECT_EQ("<!-- ;> -->", 13564 format("<!-- ;> -->", getGoogleStyle())); 13565 EXPECT_EQ(" <!-- >; -->", 13566 format(" <!-- >; -->", getGoogleStyle())); 13567 } 13568 13569 TEST_F(FormatTest, StructuredBindings) { 13570 // Structured bindings is a C++17 feature. 13571 // all modes, including C++11, C++14 and C++17 13572 verifyFormat("auto [a, b] = f();"); 13573 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 13574 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 13575 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 13576 EXPECT_EQ("auto const volatile [a, b] = f();", 13577 format("auto const volatile[a, b] = f();")); 13578 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 13579 EXPECT_EQ("auto &[a, b, c] = f();", 13580 format("auto &[ a , b,c ] = f();")); 13581 EXPECT_EQ("auto &&[a, b, c] = f();", 13582 format("auto &&[ a , b,c ] = f();")); 13583 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 13584 EXPECT_EQ("auto const volatile &&[a, b] = f();", 13585 format("auto const volatile &&[a, b] = f();")); 13586 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();")); 13587 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();")); 13588 EXPECT_EQ("const auto volatile &&[a, b] = f();", 13589 format("const auto volatile &&[a, b] = f();")); 13590 EXPECT_EQ("volatile const auto &&[a, b] = f();", 13591 format("volatile const auto &&[a, b] = f();")); 13592 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();")); 13593 13594 // Make sure we don't mistake structured bindings for lambdas. 13595 FormatStyle PointerMiddle = getLLVMStyle(); 13596 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 13597 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 13598 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 13599 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 13600 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 13601 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 13602 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 13603 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 13604 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 13605 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 13606 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 13607 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 13608 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 13609 13610 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 13611 format("for (const auto && [a, b] : some_range) {\n}")); 13612 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 13613 format("for (const auto & [a, b] : some_range) {\n}")); 13614 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 13615 format("for (const auto[a, b] : some_range) {\n}")); 13616 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 13617 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 13618 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 13619 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);")); 13620 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);")); 13621 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 13622 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};")); 13623 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};")); 13624 13625 format::FormatStyle Spaces = format::getLLVMStyle(); 13626 Spaces.SpacesInSquareBrackets = true; 13627 verifyFormat("auto [ a, b ] = f();", Spaces); 13628 verifyFormat("auto &&[ a, b ] = f();", Spaces); 13629 verifyFormat("auto &[ a, b ] = f();", Spaces); 13630 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 13631 verifyFormat("auto const &[ a, b ] = f();", Spaces); 13632 } 13633 13634 TEST_F(FormatTest, FileAndCode) { 13635 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 13636 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 13637 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 13638 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 13639 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n")); 13640 EXPECT_EQ( 13641 FormatStyle::LK_ObjC, 13642 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 13643 EXPECT_EQ(FormatStyle::LK_ObjC, 13644 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 13645 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 13646 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 13647 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n")); 13648 EXPECT_EQ(FormatStyle::LK_ObjC, 13649 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 13650 EXPECT_EQ( 13651 FormatStyle::LK_ObjC, 13652 guessLanguage("foo.h", 13653 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 13654 EXPECT_EQ( 13655 FormatStyle::LK_Cpp, 13656 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 13657 } 13658 13659 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 13660 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 13661 EXPECT_EQ(FormatStyle::LK_ObjC, 13662 guessLanguage("foo.h", "array[[calculator getIndex]];")); 13663 EXPECT_EQ(FormatStyle::LK_Cpp, 13664 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 13665 EXPECT_EQ( 13666 FormatStyle::LK_Cpp, 13667 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 13668 EXPECT_EQ(FormatStyle::LK_ObjC, 13669 guessLanguage("foo.h", "[[noreturn foo] bar];")); 13670 EXPECT_EQ(FormatStyle::LK_Cpp, 13671 guessLanguage("foo.h", "[[clang::fallthrough]];")); 13672 EXPECT_EQ(FormatStyle::LK_ObjC, 13673 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 13674 EXPECT_EQ(FormatStyle::LK_Cpp, 13675 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 13676 EXPECT_EQ(FormatStyle::LK_Cpp, 13677 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 13678 EXPECT_EQ(FormatStyle::LK_ObjC, 13679 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 13680 EXPECT_EQ(FormatStyle::LK_Cpp, 13681 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 13682 EXPECT_EQ( 13683 FormatStyle::LK_Cpp, 13684 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 13685 EXPECT_EQ( 13686 FormatStyle::LK_Cpp, 13687 guessLanguage("foo.h", 13688 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 13689 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 13690 } 13691 13692 TEST_F(FormatTest, GuessLanguageWithCaret) { 13693 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 13694 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 13695 EXPECT_EQ(FormatStyle::LK_ObjC, 13696 guessLanguage("foo.h", "int(^)(char, float);")); 13697 EXPECT_EQ(FormatStyle::LK_ObjC, 13698 guessLanguage("foo.h", "int(^foo)(char, float);")); 13699 EXPECT_EQ(FormatStyle::LK_ObjC, 13700 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 13701 EXPECT_EQ(FormatStyle::LK_ObjC, 13702 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 13703 EXPECT_EQ( 13704 FormatStyle::LK_ObjC, 13705 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 13706 } 13707 13708 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 13709 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13710 "void f() {\n" 13711 " asm (\"mov %[e], %[d]\"\n" 13712 " : [d] \"=rm\" (d)\n" 13713 " [e] \"rm\" (*e));\n" 13714 "}")); 13715 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13716 "void f() {\n" 13717 " _asm (\"mov %[e], %[d]\"\n" 13718 " : [d] \"=rm\" (d)\n" 13719 " [e] \"rm\" (*e));\n" 13720 "}")); 13721 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13722 "void f() {\n" 13723 " __asm (\"mov %[e], %[d]\"\n" 13724 " : [d] \"=rm\" (d)\n" 13725 " [e] \"rm\" (*e));\n" 13726 "}")); 13727 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13728 "void f() {\n" 13729 " __asm__ (\"mov %[e], %[d]\"\n" 13730 " : [d] \"=rm\" (d)\n" 13731 " [e] \"rm\" (*e));\n" 13732 "}")); 13733 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", 13734 "void f() {\n" 13735 " asm (\"mov %[e], %[d]\"\n" 13736 " : [d] \"=rm\" (d),\n" 13737 " [e] \"rm\" (*e));\n" 13738 "}")); 13739 EXPECT_EQ(FormatStyle::LK_Cpp, 13740 guessLanguage("foo.h", "void f() {\n" 13741 " asm volatile (\"mov %[e], %[d]\"\n" 13742 " : [d] \"=rm\" (d)\n" 13743 " [e] \"rm\" (*e));\n" 13744 "}")); 13745 } 13746 13747 TEST_F(FormatTest, GuessLanguageWithChildLines) { 13748 EXPECT_EQ(FormatStyle::LK_Cpp, 13749 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 13750 EXPECT_EQ(FormatStyle::LK_ObjC, 13751 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 13752 EXPECT_EQ( 13753 FormatStyle::LK_Cpp, 13754 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 13755 EXPECT_EQ( 13756 FormatStyle::LK_ObjC, 13757 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 13758 } 13759 13760 TEST_F(FormatTest, TypenameMacros) { 13761 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 13762 13763 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 13764 FormatStyle Google = getGoogleStyleWithColumns(0); 13765 Google.TypenameMacros = TypenameMacros; 13766 verifyFormat("struct foo {\n" 13767 " int bar;\n" 13768 " TAILQ_ENTRY(a) bleh;\n" 13769 "};", Google); 13770 13771 FormatStyle Macros = getLLVMStyle(); 13772 Macros.TypenameMacros = TypenameMacros; 13773 13774 verifyFormat("STACK_OF(int) a;", Macros); 13775 verifyFormat("STACK_OF(int) *a;", Macros); 13776 verifyFormat("STACK_OF(int const *) *a;", Macros); 13777 verifyFormat("STACK_OF(int *const) *a;", Macros); 13778 verifyFormat("STACK_OF(int, string) a;", Macros); 13779 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 13780 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 13781 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 13782 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 13783 13784 Macros.PointerAlignment = FormatStyle::PAS_Left; 13785 verifyFormat("STACK_OF(int)* a;", Macros); 13786 verifyFormat("STACK_OF(int*)* a;", Macros); 13787 } 13788 13789 } // end namespace 13790 } // end namespace format 13791 } // end namespace clang 13792