1 //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "clang/Format/Format.h" 10 11 #include "../Tooling/ReplacementTest.h" 12 #include "FormatTestUtils.h" 13 14 #include "clang/Frontend/TextDiagnosticPrinter.h" 15 #include "llvm/Support/Debug.h" 16 #include "llvm/Support/MemoryBuffer.h" 17 #include "gtest/gtest.h" 18 19 #define DEBUG_TYPE "format-test" 20 21 using clang::tooling::ReplacementTest; 22 using clang::tooling::toReplacements; 23 24 namespace clang { 25 namespace format { 26 namespace { 27 28 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); } 29 30 class FormatTest : public ::testing::Test { 31 protected: 32 enum StatusCheck { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck }; 33 34 std::string format(llvm::StringRef Code, 35 const FormatStyle &Style = getLLVMStyle(), 36 StatusCheck CheckComplete = SC_ExpectComplete) { 37 LLVM_DEBUG(llvm::errs() << "---\n"); 38 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 39 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 40 FormattingAttemptStatus Status; 41 tooling::Replacements Replaces = 42 reformat(Style, Code, Ranges, "<stdin>", &Status); 43 if (CheckComplete != SC_DoNotCheck) { 44 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete; 45 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete) 46 << Code << "\n\n"; 47 } 48 ReplacementCount = Replaces.size(); 49 auto Result = applyAllReplacements(Code, Replaces); 50 EXPECT_TRUE(static_cast<bool>(Result)); 51 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 52 return *Result; 53 } 54 55 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) { 56 Style.ColumnLimit = ColumnLimit; 57 return Style; 58 } 59 60 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) { 61 return getStyleWithColumns(getLLVMStyle(), ColumnLimit); 62 } 63 64 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) { 65 return getStyleWithColumns(getGoogleStyle(), ColumnLimit); 66 } 67 68 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code, 69 const FormatStyle &Style = getLLVMStyle()) { 70 EXPECT_EQ(Expected.str(), format(Expected, Style)) 71 << "Expected code is not stable"; 72 EXPECT_EQ(Expected.str(), format(Code, Style)); 73 if (Style.Language == FormatStyle::LK_Cpp) { 74 // Objective-C++ is a superset of C++, so everything checked for C++ 75 // needs to be checked for Objective-C++ as well. 76 FormatStyle ObjCStyle = Style; 77 ObjCStyle.Language = FormatStyle::LK_ObjC; 78 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle)); 79 } 80 } 81 82 void verifyFormat(llvm::StringRef Code, 83 const FormatStyle &Style = getLLVMStyle()) { 84 verifyFormat(Code, test::messUp(Code), Style); 85 } 86 87 void verifyIncompleteFormat(llvm::StringRef Code, 88 const FormatStyle &Style = getLLVMStyle()) { 89 EXPECT_EQ(Code.str(), 90 format(test::messUp(Code), Style, SC_ExpectIncomplete)); 91 } 92 93 void verifyGoogleFormat(llvm::StringRef Code) { 94 verifyFormat(Code, getGoogleStyle()); 95 } 96 97 void verifyIndependentOfContext(llvm::StringRef text) { 98 verifyFormat(text); 99 verifyFormat(llvm::Twine("void f() { " + text + " }").str()); 100 } 101 102 /// \brief Verify that clang-format does not crash on the given input. 103 void verifyNoCrash(llvm::StringRef Code, 104 const FormatStyle &Style = getLLVMStyle()) { 105 format(Code, Style, SC_DoNotCheck); 106 } 107 108 int ReplacementCount; 109 }; 110 111 TEST_F(FormatTest, MessUp) { 112 EXPECT_EQ("1 2 3", test::messUp("1 2 3")); 113 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n")); 114 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc")); 115 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc")); 116 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne")); 117 } 118 119 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) { 120 EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language); 121 } 122 123 TEST_F(FormatTest, LLVMStyleOverride) { 124 EXPECT_EQ(FormatStyle::LK_Proto, 125 getLLVMStyle(FormatStyle::LK_Proto).Language); 126 } 127 128 //===----------------------------------------------------------------------===// 129 // Basic function tests. 130 //===----------------------------------------------------------------------===// 131 132 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) { 133 EXPECT_EQ(";", format(";")); 134 } 135 136 TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 137 EXPECT_EQ("int i;", format(" int i;")); 138 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;")); 139 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 140 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 141 } 142 143 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 144 EXPECT_EQ("int i;", format("int\ni;")); 145 } 146 147 TEST_F(FormatTest, FormatsNestedBlockStatements) { 148 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}")); 149 } 150 151 TEST_F(FormatTest, FormatsNestedCall) { 152 verifyFormat("Method(f1, f2(f3));"); 153 verifyFormat("Method(f1(f2, f3()));"); 154 verifyFormat("Method(f1(f2, (f3())));"); 155 } 156 157 TEST_F(FormatTest, NestedNameSpecifiers) { 158 verifyFormat("vector<::Type> v;"); 159 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); 160 verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); 161 verifyFormat("bool a = 2 < ::SomeFunction();"); 162 verifyFormat("ALWAYS_INLINE ::std::string getName();"); 163 verifyFormat("some::string getName();"); 164 } 165 166 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { 167 EXPECT_EQ("if (a) {\n" 168 " f();\n" 169 "}", 170 format("if(a){f();}")); 171 EXPECT_EQ(4, ReplacementCount); 172 EXPECT_EQ("if (a) {\n" 173 " f();\n" 174 "}", 175 format("if (a) {\n" 176 " f();\n" 177 "}")); 178 EXPECT_EQ(0, ReplacementCount); 179 EXPECT_EQ("/*\r\n" 180 "\r\n" 181 "*/\r\n", 182 format("/*\r\n" 183 "\r\n" 184 "*/\r\n")); 185 EXPECT_EQ(0, ReplacementCount); 186 } 187 188 TEST_F(FormatTest, RemovesEmptyLines) { 189 EXPECT_EQ("class C {\n" 190 " int i;\n" 191 "};", 192 format("class C {\n" 193 " int i;\n" 194 "\n" 195 "};")); 196 197 // Don't remove empty lines at the start of namespaces or extern "C" blocks. 198 EXPECT_EQ("namespace N {\n" 199 "\n" 200 "int i;\n" 201 "}", 202 format("namespace N {\n" 203 "\n" 204 "int i;\n" 205 "}", 206 getGoogleStyle())); 207 EXPECT_EQ("/* something */ namespace N {\n" 208 "\n" 209 "int i;\n" 210 "}", 211 format("/* something */ namespace N {\n" 212 "\n" 213 "int i;\n" 214 "}", 215 getGoogleStyle())); 216 EXPECT_EQ("inline namespace N {\n" 217 "\n" 218 "int i;\n" 219 "}", 220 format("inline namespace N {\n" 221 "\n" 222 "int i;\n" 223 "}", 224 getGoogleStyle())); 225 EXPECT_EQ("/* something */ inline namespace N {\n" 226 "\n" 227 "int i;\n" 228 "}", 229 format("/* something */ inline namespace N {\n" 230 "\n" 231 "int i;\n" 232 "}", 233 getGoogleStyle())); 234 EXPECT_EQ("export namespace N {\n" 235 "\n" 236 "int i;\n" 237 "}", 238 format("export namespace N {\n" 239 "\n" 240 "int i;\n" 241 "}", 242 getGoogleStyle())); 243 EXPECT_EQ("extern /**/ \"C\" /**/ {\n" 244 "\n" 245 "int i;\n" 246 "}", 247 format("extern /**/ \"C\" /**/ {\n" 248 "\n" 249 "int i;\n" 250 "}", 251 getGoogleStyle())); 252 253 // ...but do keep inlining and removing empty lines for non-block extern "C" 254 // functions. 255 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); 256 EXPECT_EQ("extern \"C\" int f() {\n" 257 " int i = 42;\n" 258 " return i;\n" 259 "}", 260 format("extern \"C\" int f() {\n" 261 "\n" 262 " int i = 42;\n" 263 " return i;\n" 264 "}", 265 getGoogleStyle())); 266 267 // Remove empty lines at the beginning and end of blocks. 268 EXPECT_EQ("void f() {\n" 269 "\n" 270 " if (a) {\n" 271 "\n" 272 " f();\n" 273 " }\n" 274 "}", 275 format("void f() {\n" 276 "\n" 277 " if (a) {\n" 278 "\n" 279 " f();\n" 280 "\n" 281 " }\n" 282 "\n" 283 "}", 284 getLLVMStyle())); 285 EXPECT_EQ("void f() {\n" 286 " if (a) {\n" 287 " f();\n" 288 " }\n" 289 "}", 290 format("void f() {\n" 291 "\n" 292 " if (a) {\n" 293 "\n" 294 " f();\n" 295 "\n" 296 " }\n" 297 "\n" 298 "}", 299 getGoogleStyle())); 300 301 // Don't remove empty lines in more complex control statements. 302 EXPECT_EQ("void f() {\n" 303 " if (a) {\n" 304 " f();\n" 305 "\n" 306 " } else if (b) {\n" 307 " f();\n" 308 " }\n" 309 "}", 310 format("void f() {\n" 311 " if (a) {\n" 312 " f();\n" 313 "\n" 314 " } else if (b) {\n" 315 " f();\n" 316 "\n" 317 " }\n" 318 "\n" 319 "}")); 320 321 // Don't remove empty lines before namespace endings. 322 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 323 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 324 EXPECT_EQ("namespace {\n" 325 "int i;\n" 326 "\n" 327 "}", 328 format("namespace {\n" 329 "int i;\n" 330 "\n" 331 "}", 332 LLVMWithNoNamespaceFix)); 333 EXPECT_EQ("namespace {\n" 334 "int i;\n" 335 "}", 336 format("namespace {\n" 337 "int i;\n" 338 "}", 339 LLVMWithNoNamespaceFix)); 340 EXPECT_EQ("namespace {\n" 341 "int i;\n" 342 "\n" 343 "};", 344 format("namespace {\n" 345 "int i;\n" 346 "\n" 347 "};", 348 LLVMWithNoNamespaceFix)); 349 EXPECT_EQ("namespace {\n" 350 "int i;\n" 351 "};", 352 format("namespace {\n" 353 "int i;\n" 354 "};", 355 LLVMWithNoNamespaceFix)); 356 EXPECT_EQ("namespace {\n" 357 "int i;\n" 358 "\n" 359 "}", 360 format("namespace {\n" 361 "int i;\n" 362 "\n" 363 "}")); 364 EXPECT_EQ("namespace {\n" 365 "int i;\n" 366 "\n" 367 "} // namespace", 368 format("namespace {\n" 369 "int i;\n" 370 "\n" 371 "} // namespace")); 372 373 FormatStyle Style = getLLVMStyle(); 374 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 375 Style.MaxEmptyLinesToKeep = 2; 376 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 377 Style.BraceWrapping.AfterClass = true; 378 Style.BraceWrapping.AfterFunction = true; 379 Style.KeepEmptyLinesAtTheStartOfBlocks = false; 380 381 EXPECT_EQ("class Foo\n" 382 "{\n" 383 " Foo() {}\n" 384 "\n" 385 " void funk() {}\n" 386 "};", 387 format("class Foo\n" 388 "{\n" 389 " Foo()\n" 390 " {\n" 391 " }\n" 392 "\n" 393 " void funk() {}\n" 394 "};", 395 Style)); 396 } 397 398 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) { 399 verifyFormat("x = (a) and (b);"); 400 verifyFormat("x = (a) or (b);"); 401 verifyFormat("x = (a) bitand (b);"); 402 verifyFormat("x = (a) bitor (b);"); 403 verifyFormat("x = (a) not_eq (b);"); 404 verifyFormat("x = (a) and_eq (b);"); 405 verifyFormat("x = (a) or_eq (b);"); 406 verifyFormat("x = (a) xor (b);"); 407 } 408 409 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) { 410 verifyFormat("x = compl(a);"); 411 verifyFormat("x = not(a);"); 412 verifyFormat("x = bitand(a);"); 413 // Unary operator must not be merged with the next identifier 414 verifyFormat("x = compl a;"); 415 verifyFormat("x = not a;"); 416 verifyFormat("x = bitand a;"); 417 } 418 419 //===----------------------------------------------------------------------===// 420 // Tests for control statements. 421 //===----------------------------------------------------------------------===// 422 423 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) { 424 verifyFormat("if (true)\n f();\ng();"); 425 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();"); 426 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();"); 427 verifyFormat("if constexpr (true)\n" 428 " f();\ng();"); 429 verifyFormat("if CONSTEXPR (true)\n" 430 " f();\ng();"); 431 verifyFormat("if constexpr (a)\n" 432 " if constexpr (b)\n" 433 " if constexpr (c)\n" 434 " g();\n" 435 "h();"); 436 verifyFormat("if CONSTEXPR (a)\n" 437 " if CONSTEXPR (b)\n" 438 " if CONSTEXPR (c)\n" 439 " g();\n" 440 "h();"); 441 verifyFormat("if constexpr (a)\n" 442 " if constexpr (b) {\n" 443 " f();\n" 444 " }\n" 445 "g();"); 446 verifyFormat("if CONSTEXPR (a)\n" 447 " if CONSTEXPR (b) {\n" 448 " f();\n" 449 " }\n" 450 "g();"); 451 452 FormatStyle AllowsMergedIf = getLLVMStyle(); 453 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 454 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 455 FormatStyle::SIS_WithoutElse; 456 verifyFormat("if (a)\n" 457 " // comment\n" 458 " f();", 459 AllowsMergedIf); 460 verifyFormat("{\n" 461 " if (a)\n" 462 " label:\n" 463 " f();\n" 464 "}", 465 AllowsMergedIf); 466 verifyFormat("#define A \\\n" 467 " if (a) \\\n" 468 " label: \\\n" 469 " f()", 470 AllowsMergedIf); 471 verifyFormat("if (a)\n" 472 " ;", 473 AllowsMergedIf); 474 verifyFormat("if (a)\n" 475 " if (b) return;", 476 AllowsMergedIf); 477 478 verifyFormat("if (a) // Can't merge this\n" 479 " f();\n", 480 AllowsMergedIf); 481 verifyFormat("if (a) /* still don't merge */\n" 482 " f();", 483 AllowsMergedIf); 484 verifyFormat("if (a) { // Never merge this\n" 485 " f();\n" 486 "}", 487 AllowsMergedIf); 488 verifyFormat("if (a) { /* Never merge this */\n" 489 " f();\n" 490 "}", 491 AllowsMergedIf); 492 493 AllowsMergedIf.ColumnLimit = 14; 494 verifyFormat("if (a) return;", AllowsMergedIf); 495 verifyFormat("if (aaaaaaaaa)\n" 496 " return;", 497 AllowsMergedIf); 498 499 AllowsMergedIf.ColumnLimit = 13; 500 verifyFormat("if (a)\n return;", AllowsMergedIf); 501 } 502 503 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) { 504 FormatStyle AllowsMergedIf = getLLVMStyle(); 505 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 506 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 507 FormatStyle::SIS_WithoutElse; 508 verifyFormat("if (a)\n" 509 " f();\n" 510 "else {\n" 511 " g();\n" 512 "}", 513 AllowsMergedIf); 514 verifyFormat("if (a)\n" 515 " f();\n" 516 "else\n" 517 " g();\n", 518 AllowsMergedIf); 519 520 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 521 522 verifyFormat("if (a) f();\n" 523 "else {\n" 524 " g();\n" 525 "}", 526 AllowsMergedIf); 527 verifyFormat("if (a) f();\n" 528 "else {\n" 529 " if (a) f();\n" 530 " else {\n" 531 " g();\n" 532 " }\n" 533 " g();\n" 534 "}", 535 AllowsMergedIf); 536 } 537 538 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) { 539 FormatStyle AllowsMergedLoops = getLLVMStyle(); 540 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true; 541 verifyFormat("while (true) continue;", AllowsMergedLoops); 542 verifyFormat("for (;;) continue;", AllowsMergedLoops); 543 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops); 544 verifyFormat("while (true)\n" 545 " ;", 546 AllowsMergedLoops); 547 verifyFormat("for (;;)\n" 548 " ;", 549 AllowsMergedLoops); 550 verifyFormat("for (;;)\n" 551 " for (;;) continue;", 552 AllowsMergedLoops); 553 verifyFormat("for (;;) // Can't merge this\n" 554 " continue;", 555 AllowsMergedLoops); 556 verifyFormat("for (;;) /* still don't merge */\n" 557 " continue;", 558 AllowsMergedLoops); 559 verifyFormat("do a++;\n" 560 "while (true);", 561 AllowsMergedLoops); 562 verifyFormat("do /* Don't merge */\n" 563 " a++;\n" 564 "while (true);", 565 AllowsMergedLoops); 566 verifyFormat("do // Don't merge\n" 567 " a++;\n" 568 "while (true);", 569 AllowsMergedLoops); 570 verifyFormat("do\n" 571 " // Don't merge\n" 572 " a++;\n" 573 "while (true);", 574 AllowsMergedLoops); 575 // Without braces labels are interpreted differently. 576 verifyFormat("{\n" 577 " do\n" 578 " label:\n" 579 " a++;\n" 580 " while (true);\n" 581 "}", 582 AllowsMergedLoops); 583 } 584 585 TEST_F(FormatTest, FormatShortBracedStatements) { 586 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 587 AllowSimpleBracedStatements.ColumnLimit = 40; 588 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = 589 FormatStyle::SBS_Always; 590 591 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 592 FormatStyle::SIS_WithoutElse; 593 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 594 595 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom; 596 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true; 597 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false; 598 599 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 600 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 601 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 602 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 603 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 604 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 605 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 606 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 607 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 608 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 609 verifyFormat("if (true) {\n" 610 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 611 "}", 612 AllowSimpleBracedStatements); 613 verifyFormat("if (true) { //\n" 614 " f();\n" 615 "}", 616 AllowSimpleBracedStatements); 617 verifyFormat("if (true) {\n" 618 " f();\n" 619 " f();\n" 620 "}", 621 AllowSimpleBracedStatements); 622 verifyFormat("if (true) {\n" 623 " f();\n" 624 "} else {\n" 625 " f();\n" 626 "}", 627 AllowSimpleBracedStatements); 628 629 verifyFormat("struct A2 {\n" 630 " int X;\n" 631 "};", 632 AllowSimpleBracedStatements); 633 verifyFormat("typedef struct A2 {\n" 634 " int X;\n" 635 "} A2_t;", 636 AllowSimpleBracedStatements); 637 verifyFormat("template <int> struct A2 {\n" 638 " struct B {};\n" 639 "};", 640 AllowSimpleBracedStatements); 641 642 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 643 FormatStyle::SIS_Never; 644 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 645 verifyFormat("if (true) {\n" 646 " f();\n" 647 "}", 648 AllowSimpleBracedStatements); 649 verifyFormat("if (true) {\n" 650 " f();\n" 651 "} else {\n" 652 " f();\n" 653 "}", 654 AllowSimpleBracedStatements); 655 656 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 657 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 658 verifyFormat("while (true) {\n" 659 " f();\n" 660 "}", 661 AllowSimpleBracedStatements); 662 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 663 verifyFormat("for (;;) {\n" 664 " f();\n" 665 "}", 666 AllowSimpleBracedStatements); 667 668 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 669 FormatStyle::SIS_WithoutElse; 670 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 671 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = 672 FormatStyle::BWACS_Always; 673 674 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 675 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 676 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 677 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 678 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 679 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 680 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 681 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 682 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 683 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 684 verifyFormat("if (true)\n" 685 "{\n" 686 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 687 "}", 688 AllowSimpleBracedStatements); 689 verifyFormat("if (true)\n" 690 "{ //\n" 691 " f();\n" 692 "}", 693 AllowSimpleBracedStatements); 694 verifyFormat("if (true)\n" 695 "{\n" 696 " f();\n" 697 " f();\n" 698 "}", 699 AllowSimpleBracedStatements); 700 verifyFormat("if (true)\n" 701 "{\n" 702 " f();\n" 703 "} else\n" 704 "{\n" 705 " f();\n" 706 "}", 707 AllowSimpleBracedStatements); 708 709 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 710 FormatStyle::SIS_Never; 711 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 712 verifyFormat("if (true)\n" 713 "{\n" 714 " f();\n" 715 "}", 716 AllowSimpleBracedStatements); 717 verifyFormat("if (true)\n" 718 "{\n" 719 " f();\n" 720 "} else\n" 721 "{\n" 722 " f();\n" 723 "}", 724 AllowSimpleBracedStatements); 725 726 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 727 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 728 verifyFormat("while (true)\n" 729 "{\n" 730 " f();\n" 731 "}", 732 AllowSimpleBracedStatements); 733 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 734 verifyFormat("for (;;)\n" 735 "{\n" 736 " f();\n" 737 "}", 738 AllowSimpleBracedStatements); 739 } 740 741 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 742 FormatStyle Style = getLLVMStyleWithColumns(60); 743 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 744 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 745 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 746 EXPECT_EQ("#define A \\\n" 747 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 748 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 749 "X;", 750 format("#define A \\\n" 751 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 752 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 753 " }\n" 754 "X;", 755 Style)); 756 } 757 758 TEST_F(FormatTest, ParseIfElse) { 759 verifyFormat("if (true)\n" 760 " if (true)\n" 761 " if (true)\n" 762 " f();\n" 763 " else\n" 764 " g();\n" 765 " else\n" 766 " h();\n" 767 "else\n" 768 " i();"); 769 verifyFormat("if (true)\n" 770 " if (true)\n" 771 " if (true) {\n" 772 " if (true)\n" 773 " f();\n" 774 " } else {\n" 775 " g();\n" 776 " }\n" 777 " else\n" 778 " h();\n" 779 "else {\n" 780 " i();\n" 781 "}"); 782 verifyFormat("if (true)\n" 783 " if constexpr (true)\n" 784 " if (true) {\n" 785 " if constexpr (true)\n" 786 " f();\n" 787 " } else {\n" 788 " g();\n" 789 " }\n" 790 " else\n" 791 " h();\n" 792 "else {\n" 793 " i();\n" 794 "}"); 795 verifyFormat("if (true)\n" 796 " if CONSTEXPR (true)\n" 797 " if (true) {\n" 798 " if CONSTEXPR (true)\n" 799 " f();\n" 800 " } else {\n" 801 " g();\n" 802 " }\n" 803 " else\n" 804 " h();\n" 805 "else {\n" 806 " i();\n" 807 "}"); 808 verifyFormat("void f() {\n" 809 " if (a) {\n" 810 " } else {\n" 811 " }\n" 812 "}"); 813 } 814 815 TEST_F(FormatTest, ElseIf) { 816 verifyFormat("if (a) {\n} else if (b) {\n}"); 817 verifyFormat("if (a)\n" 818 " f();\n" 819 "else if (b)\n" 820 " g();\n" 821 "else\n" 822 " h();"); 823 verifyFormat("if constexpr (a)\n" 824 " f();\n" 825 "else if constexpr (b)\n" 826 " g();\n" 827 "else\n" 828 " h();"); 829 verifyFormat("if CONSTEXPR (a)\n" 830 " f();\n" 831 "else if CONSTEXPR (b)\n" 832 " g();\n" 833 "else\n" 834 " h();"); 835 verifyFormat("if (a) {\n" 836 " f();\n" 837 "}\n" 838 "// or else ..\n" 839 "else {\n" 840 " g()\n" 841 "}"); 842 843 verifyFormat("if (a) {\n" 844 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 845 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 846 "}"); 847 verifyFormat("if (a) {\n" 848 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 849 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 850 "}"); 851 verifyFormat("if (a) {\n" 852 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 853 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 854 "}"); 855 verifyFormat("if (a) {\n" 856 "} else if (\n" 857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 858 "}", 859 getLLVMStyleWithColumns(62)); 860 verifyFormat("if (a) {\n" 861 "} else if constexpr (\n" 862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 863 "}", 864 getLLVMStyleWithColumns(62)); 865 verifyFormat("if (a) {\n" 866 "} else if CONSTEXPR (\n" 867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 868 "}", 869 getLLVMStyleWithColumns(62)); 870 } 871 872 TEST_F(FormatTest, FormatsForLoop) { 873 verifyFormat( 874 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 875 " ++VeryVeryLongLoopVariable)\n" 876 " ;"); 877 verifyFormat("for (;;)\n" 878 " f();"); 879 verifyFormat("for (;;) {\n}"); 880 verifyFormat("for (;;) {\n" 881 " f();\n" 882 "}"); 883 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 884 885 verifyFormat( 886 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 887 " E = UnwrappedLines.end();\n" 888 " I != E; ++I) {\n}"); 889 890 verifyFormat( 891 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 892 " ++IIIII) {\n}"); 893 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 894 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 895 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 896 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 897 " I = FD->getDeclsInPrototypeScope().begin(),\n" 898 " E = FD->getDeclsInPrototypeScope().end();\n" 899 " I != E; ++I) {\n}"); 900 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 901 " I = Container.begin(),\n" 902 " E = Container.end();\n" 903 " I != E; ++I) {\n}", 904 getLLVMStyleWithColumns(76)); 905 906 verifyFormat( 907 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 908 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 909 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 911 " ++aaaaaaaaaaa) {\n}"); 912 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 913 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 914 " ++i) {\n}"); 915 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 916 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 917 "}"); 918 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 919 " aaaaaaaaaa);\n" 920 " iter; ++iter) {\n" 921 "}"); 922 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 924 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 925 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 926 927 // These should not be formatted as Objective-C for-in loops. 928 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 929 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 930 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 931 verifyFormat( 932 "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 933 934 FormatStyle NoBinPacking = getLLVMStyle(); 935 NoBinPacking.BinPackParameters = false; 936 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 937 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 938 " aaaaaaaaaaaaaaaa,\n" 939 " aaaaaaaaaaaaaaaa,\n" 940 " aaaaaaaaaaaaaaaa);\n" 941 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 942 "}", 943 NoBinPacking); 944 verifyFormat( 945 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 946 " E = UnwrappedLines.end();\n" 947 " I != E;\n" 948 " ++I) {\n}", 949 NoBinPacking); 950 951 FormatStyle AlignLeft = getLLVMStyle(); 952 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 953 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 954 } 955 956 TEST_F(FormatTest, RangeBasedForLoops) { 957 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 958 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 959 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 960 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 961 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 963 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 964 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 965 } 966 967 TEST_F(FormatTest, ForEachLoops) { 968 verifyFormat("void f() {\n" 969 " foreach (Item *item, itemlist) {}\n" 970 " Q_FOREACH (Item *item, itemlist) {}\n" 971 " BOOST_FOREACH (Item *item, itemlist) {}\n" 972 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 973 "}"); 974 975 // As function-like macros. 976 verifyFormat("#define foreach(x, y)\n" 977 "#define Q_FOREACH(x, y)\n" 978 "#define BOOST_FOREACH(x, y)\n" 979 "#define UNKNOWN_FOREACH(x, y)\n"); 980 981 // Not as function-like macros. 982 verifyFormat("#define foreach (x, y)\n" 983 "#define Q_FOREACH (x, y)\n" 984 "#define BOOST_FOREACH (x, y)\n" 985 "#define UNKNOWN_FOREACH (x, y)\n"); 986 } 987 988 TEST_F(FormatTest, FormatsWhileLoop) { 989 verifyFormat("while (true) {\n}"); 990 verifyFormat("while (true)\n" 991 " f();"); 992 verifyFormat("while () {\n}"); 993 verifyFormat("while () {\n" 994 " f();\n" 995 "}"); 996 } 997 998 TEST_F(FormatTest, FormatsDoWhile) { 999 verifyFormat("do {\n" 1000 " do_something();\n" 1001 "} while (something());"); 1002 verifyFormat("do\n" 1003 " do_something();\n" 1004 "while (something());"); 1005 } 1006 1007 TEST_F(FormatTest, FormatsSwitchStatement) { 1008 verifyFormat("switch (x) {\n" 1009 "case 1:\n" 1010 " f();\n" 1011 " break;\n" 1012 "case kFoo:\n" 1013 "case ns::kBar:\n" 1014 "case kBaz:\n" 1015 " break;\n" 1016 "default:\n" 1017 " g();\n" 1018 " break;\n" 1019 "}"); 1020 verifyFormat("switch (x) {\n" 1021 "case 1: {\n" 1022 " f();\n" 1023 " break;\n" 1024 "}\n" 1025 "case 2: {\n" 1026 " break;\n" 1027 "}\n" 1028 "}"); 1029 verifyFormat("switch (x) {\n" 1030 "case 1: {\n" 1031 " f();\n" 1032 " {\n" 1033 " g();\n" 1034 " h();\n" 1035 " }\n" 1036 " break;\n" 1037 "}\n" 1038 "}"); 1039 verifyFormat("switch (x) {\n" 1040 "case 1: {\n" 1041 " f();\n" 1042 " if (foo) {\n" 1043 " g();\n" 1044 " h();\n" 1045 " }\n" 1046 " break;\n" 1047 "}\n" 1048 "}"); 1049 verifyFormat("switch (x) {\n" 1050 "case 1: {\n" 1051 " f();\n" 1052 " g();\n" 1053 "} break;\n" 1054 "}"); 1055 verifyFormat("switch (test)\n" 1056 " ;"); 1057 verifyFormat("switch (x) {\n" 1058 "default: {\n" 1059 " // Do nothing.\n" 1060 "}\n" 1061 "}"); 1062 verifyFormat("switch (x) {\n" 1063 "// comment\n" 1064 "// if 1, do f()\n" 1065 "case 1:\n" 1066 " f();\n" 1067 "}"); 1068 verifyFormat("switch (x) {\n" 1069 "case 1:\n" 1070 " // Do amazing stuff\n" 1071 " {\n" 1072 " f();\n" 1073 " g();\n" 1074 " }\n" 1075 " break;\n" 1076 "}"); 1077 verifyFormat("#define A \\\n" 1078 " switch (x) { \\\n" 1079 " case a: \\\n" 1080 " foo = b; \\\n" 1081 " }", 1082 getLLVMStyleWithColumns(20)); 1083 verifyFormat("#define OPERATION_CASE(name) \\\n" 1084 " case OP_name: \\\n" 1085 " return operations::Operation##name\n", 1086 getLLVMStyleWithColumns(40)); 1087 verifyFormat("switch (x) {\n" 1088 "case 1:;\n" 1089 "default:;\n" 1090 " int i;\n" 1091 "}"); 1092 1093 verifyGoogleFormat("switch (x) {\n" 1094 " case 1:\n" 1095 " f();\n" 1096 " break;\n" 1097 " case kFoo:\n" 1098 " case ns::kBar:\n" 1099 " case kBaz:\n" 1100 " break;\n" 1101 " default:\n" 1102 " g();\n" 1103 " break;\n" 1104 "}"); 1105 verifyGoogleFormat("switch (x) {\n" 1106 " case 1: {\n" 1107 " f();\n" 1108 " break;\n" 1109 " }\n" 1110 "}"); 1111 verifyGoogleFormat("switch (test)\n" 1112 " ;"); 1113 1114 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1115 " case OP_name: \\\n" 1116 " return operations::Operation##name\n"); 1117 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1118 " // Get the correction operation class.\n" 1119 " switch (OpCode) {\n" 1120 " CASE(Add);\n" 1121 " CASE(Subtract);\n" 1122 " default:\n" 1123 " return operations::Unknown;\n" 1124 " }\n" 1125 "#undef OPERATION_CASE\n" 1126 "}"); 1127 verifyFormat("DEBUG({\n" 1128 " switch (x) {\n" 1129 " case A:\n" 1130 " f();\n" 1131 " break;\n" 1132 " // fallthrough\n" 1133 " case B:\n" 1134 " g();\n" 1135 " break;\n" 1136 " }\n" 1137 "});"); 1138 EXPECT_EQ("DEBUG({\n" 1139 " switch (x) {\n" 1140 " case A:\n" 1141 " f();\n" 1142 " break;\n" 1143 " // On B:\n" 1144 " case B:\n" 1145 " g();\n" 1146 " break;\n" 1147 " }\n" 1148 "});", 1149 format("DEBUG({\n" 1150 " switch (x) {\n" 1151 " case A:\n" 1152 " f();\n" 1153 " break;\n" 1154 " // On B:\n" 1155 " case B:\n" 1156 " g();\n" 1157 " break;\n" 1158 " }\n" 1159 "});", 1160 getLLVMStyle())); 1161 EXPECT_EQ("switch (n) {\n" 1162 "case 0: {\n" 1163 " return false;\n" 1164 "}\n" 1165 "default: {\n" 1166 " return true;\n" 1167 "}\n" 1168 "}", 1169 format("switch (n)\n" 1170 "{\n" 1171 "case 0: {\n" 1172 " return false;\n" 1173 "}\n" 1174 "default: {\n" 1175 " return true;\n" 1176 "}\n" 1177 "}", 1178 getLLVMStyle())); 1179 verifyFormat("switch (a) {\n" 1180 "case (b):\n" 1181 " return;\n" 1182 "}"); 1183 1184 verifyFormat("switch (a) {\n" 1185 "case some_namespace::\n" 1186 " some_constant:\n" 1187 " return;\n" 1188 "}", 1189 getLLVMStyleWithColumns(34)); 1190 1191 FormatStyle Style = getLLVMStyle(); 1192 Style.IndentCaseLabels = true; 1193 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1194 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1195 Style.BraceWrapping.AfterCaseLabel = true; 1196 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1197 EXPECT_EQ("switch (n)\n" 1198 "{\n" 1199 " case 0:\n" 1200 " {\n" 1201 " return false;\n" 1202 " }\n" 1203 " default:\n" 1204 " {\n" 1205 " return true;\n" 1206 " }\n" 1207 "}", 1208 format("switch (n) {\n" 1209 " case 0: {\n" 1210 " return false;\n" 1211 " }\n" 1212 " default: {\n" 1213 " return true;\n" 1214 " }\n" 1215 "}", 1216 Style)); 1217 Style.BraceWrapping.AfterCaseLabel = false; 1218 EXPECT_EQ("switch (n)\n" 1219 "{\n" 1220 " case 0: {\n" 1221 " return false;\n" 1222 " }\n" 1223 " default: {\n" 1224 " return true;\n" 1225 " }\n" 1226 "}", 1227 format("switch (n) {\n" 1228 " case 0:\n" 1229 " {\n" 1230 " return false;\n" 1231 " }\n" 1232 " default:\n" 1233 " {\n" 1234 " return true;\n" 1235 " }\n" 1236 "}", 1237 Style)); 1238 Style.IndentCaseLabels = false; 1239 Style.IndentCaseBlocks = true; 1240 EXPECT_EQ("switch (n)\n" 1241 "{\n" 1242 "case 0:\n" 1243 " {\n" 1244 " return false;\n" 1245 " }\n" 1246 "case 1:\n" 1247 " break;\n" 1248 "default:\n" 1249 " {\n" 1250 " return true;\n" 1251 " }\n" 1252 "}", 1253 format("switch (n) {\n" 1254 "case 0: {\n" 1255 " return false;\n" 1256 "}\n" 1257 "case 1:\n" 1258 " break;\n" 1259 "default: {\n" 1260 " return true;\n" 1261 "}\n" 1262 "}", 1263 Style)); 1264 Style.IndentCaseLabels = true; 1265 Style.IndentCaseBlocks = true; 1266 EXPECT_EQ("switch (n)\n" 1267 "{\n" 1268 " case 0:\n" 1269 " {\n" 1270 " return false;\n" 1271 " }\n" 1272 " case 1:\n" 1273 " break;\n" 1274 " default:\n" 1275 " {\n" 1276 " return true;\n" 1277 " }\n" 1278 "}", 1279 format("switch (n) {\n" 1280 "case 0: {\n" 1281 " return false;\n" 1282 "}\n" 1283 "case 1:\n" 1284 " break;\n" 1285 "default: {\n" 1286 " return true;\n" 1287 "}\n" 1288 "}", 1289 Style)); 1290 } 1291 1292 TEST_F(FormatTest, CaseRanges) { 1293 verifyFormat("switch (x) {\n" 1294 "case 'A' ... 'Z':\n" 1295 "case 1 ... 5:\n" 1296 "case a ... b:\n" 1297 " break;\n" 1298 "}"); 1299 } 1300 1301 TEST_F(FormatTest, ShortCaseLabels) { 1302 FormatStyle Style = getLLVMStyle(); 1303 Style.AllowShortCaseLabelsOnASingleLine = true; 1304 verifyFormat("switch (a) {\n" 1305 "case 1: x = 1; break;\n" 1306 "case 2: return;\n" 1307 "case 3:\n" 1308 "case 4:\n" 1309 "case 5: return;\n" 1310 "case 6: // comment\n" 1311 " return;\n" 1312 "case 7:\n" 1313 " // comment\n" 1314 " return;\n" 1315 "case 8:\n" 1316 " x = 8; // comment\n" 1317 " break;\n" 1318 "default: y = 1; break;\n" 1319 "}", 1320 Style); 1321 verifyFormat("switch (a) {\n" 1322 "case 0: return; // comment\n" 1323 "case 1: break; // comment\n" 1324 "case 2: return;\n" 1325 "// comment\n" 1326 "case 3: return;\n" 1327 "// comment 1\n" 1328 "// comment 2\n" 1329 "// comment 3\n" 1330 "case 4: break; /* comment */\n" 1331 "case 5:\n" 1332 " // comment\n" 1333 " break;\n" 1334 "case 6: /* comment */ x = 1; break;\n" 1335 "case 7: x = /* comment */ 1; break;\n" 1336 "case 8:\n" 1337 " x = 1; /* comment */\n" 1338 " break;\n" 1339 "case 9:\n" 1340 " break; // comment line 1\n" 1341 " // comment line 2\n" 1342 "}", 1343 Style); 1344 EXPECT_EQ("switch (a) {\n" 1345 "case 1:\n" 1346 " x = 8;\n" 1347 " // fall through\n" 1348 "case 2: x = 8;\n" 1349 "// comment\n" 1350 "case 3:\n" 1351 " return; /* comment line 1\n" 1352 " * comment line 2 */\n" 1353 "case 4: i = 8;\n" 1354 "// something else\n" 1355 "#if FOO\n" 1356 "case 5: break;\n" 1357 "#endif\n" 1358 "}", 1359 format("switch (a) {\n" 1360 "case 1: x = 8;\n" 1361 " // fall through\n" 1362 "case 2:\n" 1363 " x = 8;\n" 1364 "// comment\n" 1365 "case 3:\n" 1366 " return; /* comment line 1\n" 1367 " * comment line 2 */\n" 1368 "case 4:\n" 1369 " i = 8;\n" 1370 "// something else\n" 1371 "#if FOO\n" 1372 "case 5: break;\n" 1373 "#endif\n" 1374 "}", 1375 Style)); 1376 EXPECT_EQ("switch (a) {\n" 1377 "case 0:\n" 1378 " return; // long long long long long long long long long long " 1379 "long long comment\n" 1380 " // line\n" 1381 "}", 1382 format("switch (a) {\n" 1383 "case 0: return; // long long long long long long long long " 1384 "long long long long comment line\n" 1385 "}", 1386 Style)); 1387 EXPECT_EQ("switch (a) {\n" 1388 "case 0:\n" 1389 " return; /* long long long long long long long long long long " 1390 "long long comment\n" 1391 " line */\n" 1392 "}", 1393 format("switch (a) {\n" 1394 "case 0: return; /* long long long long long long long long " 1395 "long long long long comment line */\n" 1396 "}", 1397 Style)); 1398 verifyFormat("switch (a) {\n" 1399 "#if FOO\n" 1400 "case 0: return 0;\n" 1401 "#endif\n" 1402 "}", 1403 Style); 1404 verifyFormat("switch (a) {\n" 1405 "case 1: {\n" 1406 "}\n" 1407 "case 2: {\n" 1408 " return;\n" 1409 "}\n" 1410 "case 3: {\n" 1411 " x = 1;\n" 1412 " return;\n" 1413 "}\n" 1414 "case 4:\n" 1415 " if (x)\n" 1416 " return;\n" 1417 "}", 1418 Style); 1419 Style.ColumnLimit = 21; 1420 verifyFormat("switch (a) {\n" 1421 "case 1: x = 1; break;\n" 1422 "case 2: return;\n" 1423 "case 3:\n" 1424 "case 4:\n" 1425 "case 5: return;\n" 1426 "default:\n" 1427 " y = 1;\n" 1428 " break;\n" 1429 "}", 1430 Style); 1431 Style.ColumnLimit = 80; 1432 Style.AllowShortCaseLabelsOnASingleLine = false; 1433 Style.IndentCaseLabels = true; 1434 EXPECT_EQ("switch (n) {\n" 1435 " default /*comments*/:\n" 1436 " return true;\n" 1437 " case 0:\n" 1438 " return false;\n" 1439 "}", 1440 format("switch (n) {\n" 1441 "default/*comments*/:\n" 1442 " return true;\n" 1443 "case 0:\n" 1444 " return false;\n" 1445 "}", 1446 Style)); 1447 Style.AllowShortCaseLabelsOnASingleLine = true; 1448 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1449 Style.BraceWrapping.AfterCaseLabel = true; 1450 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1451 EXPECT_EQ("switch (n)\n" 1452 "{\n" 1453 " case 0:\n" 1454 " {\n" 1455 " return false;\n" 1456 " }\n" 1457 " default:\n" 1458 " {\n" 1459 " return true;\n" 1460 " }\n" 1461 "}", 1462 format("switch (n) {\n" 1463 " case 0: {\n" 1464 " return false;\n" 1465 " }\n" 1466 " default:\n" 1467 " {\n" 1468 " return true;\n" 1469 " }\n" 1470 "}", 1471 Style)); 1472 } 1473 1474 TEST_F(FormatTest, FormatsLabels) { 1475 verifyFormat("void f() {\n" 1476 " some_code();\n" 1477 "test_label:\n" 1478 " some_other_code();\n" 1479 " {\n" 1480 " some_more_code();\n" 1481 " another_label:\n" 1482 " some_more_code();\n" 1483 " }\n" 1484 "}"); 1485 verifyFormat("{\n" 1486 " some_code();\n" 1487 "test_label:\n" 1488 " some_other_code();\n" 1489 "}"); 1490 verifyFormat("{\n" 1491 " some_code();\n" 1492 "test_label:;\n" 1493 " int i = 0;\n" 1494 "}"); 1495 FormatStyle Style = getLLVMStyle(); 1496 Style.IndentGotoLabels = false; 1497 verifyFormat("void f() {\n" 1498 " some_code();\n" 1499 "test_label:\n" 1500 " some_other_code();\n" 1501 " {\n" 1502 " some_more_code();\n" 1503 "another_label:\n" 1504 " some_more_code();\n" 1505 " }\n" 1506 "}", 1507 Style); 1508 verifyFormat("{\n" 1509 " some_code();\n" 1510 "test_label:\n" 1511 " some_other_code();\n" 1512 "}", 1513 Style); 1514 verifyFormat("{\n" 1515 " some_code();\n" 1516 "test_label:;\n" 1517 " int i = 0;\n" 1518 "}"); 1519 } 1520 1521 TEST_F(FormatTest, MultiLineControlStatements) { 1522 FormatStyle Style = getLLVMStyle(); 1523 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1524 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; 1525 Style.ColumnLimit = 20; 1526 // Short lines should keep opening brace on same line. 1527 EXPECT_EQ("if (foo) {\n" 1528 " bar();\n" 1529 "}", 1530 format("if(foo){bar();}", Style)); 1531 EXPECT_EQ("if (foo) {\n" 1532 " bar();\n" 1533 "} else {\n" 1534 " baz();\n" 1535 "}", 1536 format("if(foo){bar();}else{baz();}", Style)); 1537 EXPECT_EQ("if (foo && bar) {\n" 1538 " baz();\n" 1539 "}", 1540 format("if(foo&&bar){baz();}", Style)); 1541 EXPECT_EQ("if (foo) {\n" 1542 " bar();\n" 1543 "} else if (baz) {\n" 1544 " quux();\n" 1545 "}", 1546 format("if(foo){bar();}else if(baz){quux();}", Style)); 1547 EXPECT_EQ( 1548 "if (foo) {\n" 1549 " bar();\n" 1550 "} else if (baz) {\n" 1551 " quux();\n" 1552 "} else {\n" 1553 " foobar();\n" 1554 "}", 1555 format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); 1556 EXPECT_EQ("for (;;) {\n" 1557 " foo();\n" 1558 "}", 1559 format("for(;;){foo();}")); 1560 EXPECT_EQ("while (1) {\n" 1561 " foo();\n" 1562 "}", 1563 format("while(1){foo();}", Style)); 1564 EXPECT_EQ("switch (foo) {\n" 1565 "case bar:\n" 1566 " return;\n" 1567 "}", 1568 format("switch(foo){case bar:return;}", Style)); 1569 EXPECT_EQ("try {\n" 1570 " foo();\n" 1571 "} catch (...) {\n" 1572 " bar();\n" 1573 "}", 1574 format("try{foo();}catch(...){bar();}", Style)); 1575 EXPECT_EQ("do {\n" 1576 " foo();\n" 1577 "} while (bar &&\n" 1578 " baz);", 1579 format("do{foo();}while(bar&&baz);", Style)); 1580 // Long lines should put opening brace on new line. 1581 EXPECT_EQ("if (foo && bar &&\n" 1582 " baz)\n" 1583 "{\n" 1584 " quux();\n" 1585 "}", 1586 format("if(foo&&bar&&baz){quux();}", Style)); 1587 EXPECT_EQ("if (foo && bar &&\n" 1588 " baz)\n" 1589 "{\n" 1590 " quux();\n" 1591 "}", 1592 format("if (foo && bar &&\n" 1593 " baz) {\n" 1594 " quux();\n" 1595 "}", 1596 Style)); 1597 EXPECT_EQ("if (foo) {\n" 1598 " bar();\n" 1599 "} else if (baz ||\n" 1600 " quux)\n" 1601 "{\n" 1602 " foobar();\n" 1603 "}", 1604 format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); 1605 EXPECT_EQ( 1606 "if (foo) {\n" 1607 " bar();\n" 1608 "} else if (baz ||\n" 1609 " quux)\n" 1610 "{\n" 1611 " foobar();\n" 1612 "} else {\n" 1613 " barbaz();\n" 1614 "}", 1615 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1616 Style)); 1617 EXPECT_EQ("for (int i = 0;\n" 1618 " i < 10; ++i)\n" 1619 "{\n" 1620 " foo();\n" 1621 "}", 1622 format("for(int i=0;i<10;++i){foo();}", Style)); 1623 EXPECT_EQ("while (foo || bar ||\n" 1624 " baz)\n" 1625 "{\n" 1626 " quux();\n" 1627 "}", 1628 format("while(foo||bar||baz){quux();}", Style)); 1629 EXPECT_EQ("switch (\n" 1630 " foo = barbaz)\n" 1631 "{\n" 1632 "case quux:\n" 1633 " return;\n" 1634 "}", 1635 format("switch(foo=barbaz){case quux:return;}", Style)); 1636 EXPECT_EQ("try {\n" 1637 " foo();\n" 1638 "} catch (\n" 1639 " Exception &bar)\n" 1640 "{\n" 1641 " baz();\n" 1642 "}", 1643 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1644 Style.ColumnLimit = 1645 40; // to concentrate at brace wrapping, not line wrap due to column limit 1646 EXPECT_EQ("try {\n" 1647 " foo();\n" 1648 "} catch (Exception &bar) {\n" 1649 " baz();\n" 1650 "}", 1651 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1652 Style.ColumnLimit = 1653 20; // to concentrate at brace wrapping, not line wrap due to column limit 1654 1655 Style.BraceWrapping.BeforeElse = true; 1656 EXPECT_EQ( 1657 "if (foo) {\n" 1658 " bar();\n" 1659 "}\n" 1660 "else if (baz ||\n" 1661 " quux)\n" 1662 "{\n" 1663 " foobar();\n" 1664 "}\n" 1665 "else {\n" 1666 " barbaz();\n" 1667 "}", 1668 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1669 Style)); 1670 1671 Style.BraceWrapping.BeforeCatch = true; 1672 EXPECT_EQ("try {\n" 1673 " foo();\n" 1674 "}\n" 1675 "catch (...) {\n" 1676 " baz();\n" 1677 "}", 1678 format("try{foo();}catch(...){baz();}", Style)); 1679 } 1680 1681 //===----------------------------------------------------------------------===// 1682 // Tests for classes, namespaces, etc. 1683 //===----------------------------------------------------------------------===// 1684 1685 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1686 verifyFormat("class A {};"); 1687 } 1688 1689 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1690 verifyFormat("class A {\n" 1691 "public:\n" 1692 "public: // comment\n" 1693 "protected:\n" 1694 "private:\n" 1695 " void f() {}\n" 1696 "};"); 1697 verifyFormat("export class A {\n" 1698 "public:\n" 1699 "public: // comment\n" 1700 "protected:\n" 1701 "private:\n" 1702 " void f() {}\n" 1703 "};"); 1704 verifyGoogleFormat("class A {\n" 1705 " public:\n" 1706 " protected:\n" 1707 " private:\n" 1708 " void f() {}\n" 1709 "};"); 1710 verifyGoogleFormat("export class A {\n" 1711 " public:\n" 1712 " protected:\n" 1713 " private:\n" 1714 " void f() {}\n" 1715 "};"); 1716 verifyFormat("class A {\n" 1717 "public slots:\n" 1718 " void f1() {}\n" 1719 "public Q_SLOTS:\n" 1720 " void f2() {}\n" 1721 "protected slots:\n" 1722 " void f3() {}\n" 1723 "protected Q_SLOTS:\n" 1724 " void f4() {}\n" 1725 "private slots:\n" 1726 " void f5() {}\n" 1727 "private Q_SLOTS:\n" 1728 " void f6() {}\n" 1729 "signals:\n" 1730 " void g1();\n" 1731 "Q_SIGNALS:\n" 1732 " void g2();\n" 1733 "};"); 1734 1735 // Don't interpret 'signals' the wrong way. 1736 verifyFormat("signals.set();"); 1737 verifyFormat("for (Signals signals : f()) {\n}"); 1738 verifyFormat("{\n" 1739 " signals.set(); // This needs indentation.\n" 1740 "}"); 1741 verifyFormat("void f() {\n" 1742 "label:\n" 1743 " signals.baz();\n" 1744 "}"); 1745 } 1746 1747 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1748 EXPECT_EQ("class A {\n" 1749 "public:\n" 1750 " void f();\n" 1751 "\n" 1752 "private:\n" 1753 " void g() {}\n" 1754 " // test\n" 1755 "protected:\n" 1756 " int h;\n" 1757 "};", 1758 format("class A {\n" 1759 "public:\n" 1760 "void f();\n" 1761 "private:\n" 1762 "void g() {}\n" 1763 "// test\n" 1764 "protected:\n" 1765 "int h;\n" 1766 "};")); 1767 EXPECT_EQ("class A {\n" 1768 "protected:\n" 1769 "public:\n" 1770 " void f();\n" 1771 "};", 1772 format("class A {\n" 1773 "protected:\n" 1774 "\n" 1775 "public:\n" 1776 "\n" 1777 " void f();\n" 1778 "};")); 1779 1780 // Even ensure proper spacing inside macros. 1781 EXPECT_EQ("#define B \\\n" 1782 " class A { \\\n" 1783 " protected: \\\n" 1784 " public: \\\n" 1785 " void f(); \\\n" 1786 " };", 1787 format("#define B \\\n" 1788 " class A { \\\n" 1789 " protected: \\\n" 1790 " \\\n" 1791 " public: \\\n" 1792 " \\\n" 1793 " void f(); \\\n" 1794 " };", 1795 getGoogleStyle())); 1796 // But don't remove empty lines after macros ending in access specifiers. 1797 EXPECT_EQ("#define A private:\n" 1798 "\n" 1799 "int i;", 1800 format("#define A private:\n" 1801 "\n" 1802 "int i;")); 1803 } 1804 1805 TEST_F(FormatTest, FormatsClasses) { 1806 verifyFormat("class A : public B {};"); 1807 verifyFormat("class A : public ::B {};"); 1808 1809 verifyFormat( 1810 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1811 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1812 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1813 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1814 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1815 verifyFormat( 1816 "class A : public B, public C, public D, public E, public F {};"); 1817 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1818 " public C,\n" 1819 " public D,\n" 1820 " public E,\n" 1821 " public F,\n" 1822 " public G {};"); 1823 1824 verifyFormat("class\n" 1825 " ReallyReallyLongClassName {\n" 1826 " int i;\n" 1827 "};", 1828 getLLVMStyleWithColumns(32)); 1829 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1830 " aaaaaaaaaaaaaaaa> {};"); 1831 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1832 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1833 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1834 verifyFormat("template <class R, class C>\n" 1835 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1836 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1837 verifyFormat("class ::A::B {};"); 1838 } 1839 1840 TEST_F(FormatTest, BreakInheritanceStyle) { 1841 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1842 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1843 FormatStyle::BILS_BeforeComma; 1844 verifyFormat("class MyClass : public X {};", 1845 StyleWithInheritanceBreakBeforeComma); 1846 verifyFormat("class MyClass\n" 1847 " : public X\n" 1848 " , public Y {};", 1849 StyleWithInheritanceBreakBeforeComma); 1850 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1851 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1852 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1853 StyleWithInheritanceBreakBeforeComma); 1854 verifyFormat("struct aaaaaaaaaaaaa\n" 1855 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1856 " aaaaaaaaaaaaaaaa> {};", 1857 StyleWithInheritanceBreakBeforeComma); 1858 1859 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1860 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1861 FormatStyle::BILS_AfterColon; 1862 verifyFormat("class MyClass : public X {};", 1863 StyleWithInheritanceBreakAfterColon); 1864 verifyFormat("class MyClass : public X, public Y {};", 1865 StyleWithInheritanceBreakAfterColon); 1866 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1867 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1868 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1869 StyleWithInheritanceBreakAfterColon); 1870 verifyFormat("struct aaaaaaaaaaaaa :\n" 1871 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1872 " aaaaaaaaaaaaaaaa> {};", 1873 StyleWithInheritanceBreakAfterColon); 1874 } 1875 1876 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1877 verifyFormat("class A {\n} a, b;"); 1878 verifyFormat("struct A {\n} a, b;"); 1879 verifyFormat("union A {\n} a;"); 1880 } 1881 1882 TEST_F(FormatTest, FormatsEnum) { 1883 verifyFormat("enum {\n" 1884 " Zero,\n" 1885 " One = 1,\n" 1886 " Two = One + 1,\n" 1887 " Three = (One + Two),\n" 1888 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1889 " Five = (One, Two, Three, Four, 5)\n" 1890 "};"); 1891 verifyGoogleFormat("enum {\n" 1892 " Zero,\n" 1893 " One = 1,\n" 1894 " Two = One + 1,\n" 1895 " Three = (One + Two),\n" 1896 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1897 " Five = (One, Two, Three, Four, 5)\n" 1898 "};"); 1899 verifyFormat("enum Enum {};"); 1900 verifyFormat("enum {};"); 1901 verifyFormat("enum X E {} d;"); 1902 verifyFormat("enum __attribute__((...)) E {} d;"); 1903 verifyFormat("enum __declspec__((...)) E {} d;"); 1904 verifyFormat("enum {\n" 1905 " Bar = Foo<int, int>::value\n" 1906 "};", 1907 getLLVMStyleWithColumns(30)); 1908 1909 verifyFormat("enum ShortEnum { A, B, C };"); 1910 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1911 1912 EXPECT_EQ("enum KeepEmptyLines {\n" 1913 " ONE,\n" 1914 "\n" 1915 " TWO,\n" 1916 "\n" 1917 " THREE\n" 1918 "}", 1919 format("enum KeepEmptyLines {\n" 1920 " ONE,\n" 1921 "\n" 1922 " TWO,\n" 1923 "\n" 1924 "\n" 1925 " THREE\n" 1926 "}")); 1927 verifyFormat("enum E { // comment\n" 1928 " ONE,\n" 1929 " TWO\n" 1930 "};\n" 1931 "int i;"); 1932 1933 FormatStyle EightIndent = getLLVMStyle(); 1934 EightIndent.IndentWidth = 8; 1935 verifyFormat("enum {\n" 1936 " VOID,\n" 1937 " CHAR,\n" 1938 " SHORT,\n" 1939 " INT,\n" 1940 " LONG,\n" 1941 " SIGNED,\n" 1942 " UNSIGNED,\n" 1943 " BOOL,\n" 1944 " FLOAT,\n" 1945 " DOUBLE,\n" 1946 " COMPLEX\n" 1947 "};", 1948 EightIndent); 1949 1950 // Not enums. 1951 verifyFormat("enum X f() {\n" 1952 " a();\n" 1953 " return 42;\n" 1954 "}"); 1955 verifyFormat("enum X Type::f() {\n" 1956 " a();\n" 1957 " return 42;\n" 1958 "}"); 1959 verifyFormat("enum ::X f() {\n" 1960 " a();\n" 1961 " return 42;\n" 1962 "}"); 1963 verifyFormat("enum ns::X f() {\n" 1964 " a();\n" 1965 " return 42;\n" 1966 "}"); 1967 } 1968 1969 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1970 verifyFormat("enum Type {\n" 1971 " One = 0; // These semicolons should be commas.\n" 1972 " Two = 1;\n" 1973 "};"); 1974 verifyFormat("namespace n {\n" 1975 "enum Type {\n" 1976 " One,\n" 1977 " Two, // missing };\n" 1978 " int i;\n" 1979 "}\n" 1980 "void g() {}"); 1981 } 1982 1983 TEST_F(FormatTest, FormatsEnumStruct) { 1984 verifyFormat("enum struct {\n" 1985 " Zero,\n" 1986 " One = 1,\n" 1987 " Two = One + 1,\n" 1988 " Three = (One + Two),\n" 1989 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1990 " Five = (One, Two, Three, Four, 5)\n" 1991 "};"); 1992 verifyFormat("enum struct Enum {};"); 1993 verifyFormat("enum struct {};"); 1994 verifyFormat("enum struct X E {} d;"); 1995 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1996 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1997 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1998 } 1999 2000 TEST_F(FormatTest, FormatsEnumClass) { 2001 verifyFormat("enum class {\n" 2002 " Zero,\n" 2003 " One = 1,\n" 2004 " Two = One + 1,\n" 2005 " Three = (One + Two),\n" 2006 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2007 " Five = (One, Two, Three, Four, 5)\n" 2008 "};"); 2009 verifyFormat("enum class Enum {};"); 2010 verifyFormat("enum class {};"); 2011 verifyFormat("enum class X E {} d;"); 2012 verifyFormat("enum class __attribute__((...)) E {} d;"); 2013 verifyFormat("enum class __declspec__((...)) E {} d;"); 2014 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 2015 } 2016 2017 TEST_F(FormatTest, FormatsEnumTypes) { 2018 verifyFormat("enum X : int {\n" 2019 " A, // Force multiple lines.\n" 2020 " B\n" 2021 "};"); 2022 verifyFormat("enum X : int { A, B };"); 2023 verifyFormat("enum X : std::uint32_t { A, B };"); 2024 } 2025 2026 TEST_F(FormatTest, FormatsTypedefEnum) { 2027 FormatStyle Style = getLLVMStyle(); 2028 Style.ColumnLimit = 40; 2029 verifyFormat("typedef enum {} EmptyEnum;"); 2030 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2031 verifyFormat("typedef enum {\n" 2032 " ZERO = 0,\n" 2033 " ONE = 1,\n" 2034 " TWO = 2,\n" 2035 " THREE = 3\n" 2036 "} LongEnum;", 2037 Style); 2038 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2039 Style.BraceWrapping.AfterEnum = true; 2040 verifyFormat("typedef enum {} EmptyEnum;"); 2041 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2042 verifyFormat("typedef enum\n" 2043 "{\n" 2044 " ZERO = 0,\n" 2045 " ONE = 1,\n" 2046 " TWO = 2,\n" 2047 " THREE = 3\n" 2048 "} LongEnum;", 2049 Style); 2050 } 2051 2052 TEST_F(FormatTest, FormatsNSEnums) { 2053 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2054 verifyGoogleFormat( 2055 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2056 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 2057 " // Information about someDecentlyLongValue.\n" 2058 " someDecentlyLongValue,\n" 2059 " // Information about anotherDecentlyLongValue.\n" 2060 " anotherDecentlyLongValue,\n" 2061 " // Information about aThirdDecentlyLongValue.\n" 2062 " aThirdDecentlyLongValue\n" 2063 "};"); 2064 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 2065 " // Information about someDecentlyLongValue.\n" 2066 " someDecentlyLongValue,\n" 2067 " // Information about anotherDecentlyLongValue.\n" 2068 " anotherDecentlyLongValue,\n" 2069 " // Information about aThirdDecentlyLongValue.\n" 2070 " aThirdDecentlyLongValue\n" 2071 "};"); 2072 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 2073 " a = 1,\n" 2074 " b = 2,\n" 2075 " c = 3,\n" 2076 "};"); 2077 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 2078 " a = 1,\n" 2079 " b = 2,\n" 2080 " c = 3,\n" 2081 "};"); 2082 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 2083 " a = 1,\n" 2084 " b = 2,\n" 2085 " c = 3,\n" 2086 "};"); 2087 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 2088 " a = 1,\n" 2089 " b = 2,\n" 2090 " c = 3,\n" 2091 "};"); 2092 } 2093 2094 TEST_F(FormatTest, FormatsBitfields) { 2095 verifyFormat("struct Bitfields {\n" 2096 " unsigned sClass : 8;\n" 2097 " unsigned ValueKind : 2;\n" 2098 "};"); 2099 verifyFormat("struct A {\n" 2100 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 2101 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 2102 "};"); 2103 verifyFormat("struct MyStruct {\n" 2104 " uchar data;\n" 2105 " uchar : 8;\n" 2106 " uchar : 8;\n" 2107 " uchar other;\n" 2108 "};"); 2109 } 2110 2111 TEST_F(FormatTest, FormatsNamespaces) { 2112 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 2113 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 2114 2115 verifyFormat("namespace some_namespace {\n" 2116 "class A {};\n" 2117 "void f() { f(); }\n" 2118 "}", 2119 LLVMWithNoNamespaceFix); 2120 verifyFormat("namespace N::inline D {\n" 2121 "class A {};\n" 2122 "void f() { f(); }\n" 2123 "}", 2124 LLVMWithNoNamespaceFix); 2125 verifyFormat("namespace N::inline D::E {\n" 2126 "class A {};\n" 2127 "void f() { f(); }\n" 2128 "}", 2129 LLVMWithNoNamespaceFix); 2130 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 2131 "class A {};\n" 2132 "void f() { f(); }\n" 2133 "}", 2134 LLVMWithNoNamespaceFix); 2135 verifyFormat("/* something */ namespace some_namespace {\n" 2136 "class A {};\n" 2137 "void f() { f(); }\n" 2138 "}", 2139 LLVMWithNoNamespaceFix); 2140 verifyFormat("namespace {\n" 2141 "class A {};\n" 2142 "void f() { f(); }\n" 2143 "}", 2144 LLVMWithNoNamespaceFix); 2145 verifyFormat("/* something */ namespace {\n" 2146 "class A {};\n" 2147 "void f() { f(); }\n" 2148 "}", 2149 LLVMWithNoNamespaceFix); 2150 verifyFormat("inline namespace X {\n" 2151 "class A {};\n" 2152 "void f() { f(); }\n" 2153 "}", 2154 LLVMWithNoNamespaceFix); 2155 verifyFormat("/* something */ inline namespace X {\n" 2156 "class A {};\n" 2157 "void f() { f(); }\n" 2158 "}", 2159 LLVMWithNoNamespaceFix); 2160 verifyFormat("export namespace X {\n" 2161 "class A {};\n" 2162 "void f() { f(); }\n" 2163 "}", 2164 LLVMWithNoNamespaceFix); 2165 verifyFormat("using namespace some_namespace;\n" 2166 "class A {};\n" 2167 "void f() { f(); }", 2168 LLVMWithNoNamespaceFix); 2169 2170 // This code is more common than we thought; if we 2171 // layout this correctly the semicolon will go into 2172 // its own line, which is undesirable. 2173 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 2174 verifyFormat("namespace {\n" 2175 "class A {};\n" 2176 "};", 2177 LLVMWithNoNamespaceFix); 2178 2179 verifyFormat("namespace {\n" 2180 "int SomeVariable = 0; // comment\n" 2181 "} // namespace", 2182 LLVMWithNoNamespaceFix); 2183 EXPECT_EQ("#ifndef HEADER_GUARD\n" 2184 "#define HEADER_GUARD\n" 2185 "namespace my_namespace {\n" 2186 "int i;\n" 2187 "} // my_namespace\n" 2188 "#endif // HEADER_GUARD", 2189 format("#ifndef HEADER_GUARD\n" 2190 " #define HEADER_GUARD\n" 2191 " namespace my_namespace {\n" 2192 "int i;\n" 2193 "} // my_namespace\n" 2194 "#endif // HEADER_GUARD", 2195 LLVMWithNoNamespaceFix)); 2196 2197 EXPECT_EQ("namespace A::B {\n" 2198 "class C {};\n" 2199 "}", 2200 format("namespace A::B {\n" 2201 "class C {};\n" 2202 "}", 2203 LLVMWithNoNamespaceFix)); 2204 2205 FormatStyle Style = getLLVMStyle(); 2206 Style.NamespaceIndentation = FormatStyle::NI_All; 2207 EXPECT_EQ("namespace out {\n" 2208 " int i;\n" 2209 " namespace in {\n" 2210 " int i;\n" 2211 " } // namespace in\n" 2212 "} // namespace out", 2213 format("namespace out {\n" 2214 "int i;\n" 2215 "namespace in {\n" 2216 "int i;\n" 2217 "} // namespace in\n" 2218 "} // namespace out", 2219 Style)); 2220 2221 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2222 EXPECT_EQ("namespace out {\n" 2223 "int i;\n" 2224 "namespace in {\n" 2225 " int i;\n" 2226 "} // namespace in\n" 2227 "} // namespace out", 2228 format("namespace out {\n" 2229 "int i;\n" 2230 "namespace in {\n" 2231 "int i;\n" 2232 "} // namespace in\n" 2233 "} // namespace out", 2234 Style)); 2235 } 2236 2237 TEST_F(FormatTest, NamespaceMacros) { 2238 FormatStyle Style = getLLVMStyle(); 2239 Style.NamespaceMacros.push_back("TESTSUITE"); 2240 2241 verifyFormat("TESTSUITE(A) {\n" 2242 "int foo();\n" 2243 "} // TESTSUITE(A)", 2244 Style); 2245 2246 verifyFormat("TESTSUITE(A, B) {\n" 2247 "int foo();\n" 2248 "} // TESTSUITE(A)", 2249 Style); 2250 2251 // Properly indent according to NamespaceIndentation style 2252 Style.NamespaceIndentation = FormatStyle::NI_All; 2253 verifyFormat("TESTSUITE(A) {\n" 2254 " int foo();\n" 2255 "} // TESTSUITE(A)", 2256 Style); 2257 verifyFormat("TESTSUITE(A) {\n" 2258 " namespace B {\n" 2259 " int foo();\n" 2260 " } // namespace B\n" 2261 "} // TESTSUITE(A)", 2262 Style); 2263 verifyFormat("namespace A {\n" 2264 " TESTSUITE(B) {\n" 2265 " int foo();\n" 2266 " } // TESTSUITE(B)\n" 2267 "} // namespace A", 2268 Style); 2269 2270 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2271 verifyFormat("TESTSUITE(A) {\n" 2272 "TESTSUITE(B) {\n" 2273 " int foo();\n" 2274 "} // TESTSUITE(B)\n" 2275 "} // TESTSUITE(A)", 2276 Style); 2277 verifyFormat("TESTSUITE(A) {\n" 2278 "namespace B {\n" 2279 " int foo();\n" 2280 "} // namespace B\n" 2281 "} // TESTSUITE(A)", 2282 Style); 2283 verifyFormat("namespace A {\n" 2284 "TESTSUITE(B) {\n" 2285 " int foo();\n" 2286 "} // TESTSUITE(B)\n" 2287 "} // namespace A", 2288 Style); 2289 2290 // Properly merge namespace-macros blocks in CompactNamespaces mode 2291 Style.NamespaceIndentation = FormatStyle::NI_None; 2292 Style.CompactNamespaces = true; 2293 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2294 "}} // TESTSUITE(A::B)", 2295 Style); 2296 2297 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2298 "}} // TESTSUITE(out::in)", 2299 format("TESTSUITE(out) {\n" 2300 "TESTSUITE(in) {\n" 2301 "} // TESTSUITE(in)\n" 2302 "} // TESTSUITE(out)", 2303 Style)); 2304 2305 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2306 "}} // TESTSUITE(out::in)", 2307 format("TESTSUITE(out) {\n" 2308 "TESTSUITE(in) {\n" 2309 "} // TESTSUITE(in)\n" 2310 "} // TESTSUITE(out)", 2311 Style)); 2312 2313 // Do not merge different namespaces/macros 2314 EXPECT_EQ("namespace out {\n" 2315 "TESTSUITE(in) {\n" 2316 "} // TESTSUITE(in)\n" 2317 "} // namespace out", 2318 format("namespace out {\n" 2319 "TESTSUITE(in) {\n" 2320 "} // TESTSUITE(in)\n" 2321 "} // namespace out", 2322 Style)); 2323 EXPECT_EQ("TESTSUITE(out) {\n" 2324 "namespace in {\n" 2325 "} // namespace in\n" 2326 "} // TESTSUITE(out)", 2327 format("TESTSUITE(out) {\n" 2328 "namespace in {\n" 2329 "} // namespace in\n" 2330 "} // TESTSUITE(out)", 2331 Style)); 2332 Style.NamespaceMacros.push_back("FOOBAR"); 2333 EXPECT_EQ("TESTSUITE(out) {\n" 2334 "FOOBAR(in) {\n" 2335 "} // FOOBAR(in)\n" 2336 "} // TESTSUITE(out)", 2337 format("TESTSUITE(out) {\n" 2338 "FOOBAR(in) {\n" 2339 "} // FOOBAR(in)\n" 2340 "} // TESTSUITE(out)", 2341 Style)); 2342 } 2343 2344 TEST_F(FormatTest, FormatsCompactNamespaces) { 2345 FormatStyle Style = getLLVMStyle(); 2346 Style.CompactNamespaces = true; 2347 Style.NamespaceMacros.push_back("TESTSUITE"); 2348 2349 verifyFormat("namespace A { namespace B {\n" 2350 "}} // namespace A::B", 2351 Style); 2352 2353 EXPECT_EQ("namespace out { namespace in {\n" 2354 "}} // namespace out::in", 2355 format("namespace out {\n" 2356 "namespace in {\n" 2357 "} // namespace in\n" 2358 "} // namespace out", 2359 Style)); 2360 2361 // Only namespaces which have both consecutive opening and end get compacted 2362 EXPECT_EQ("namespace out {\n" 2363 "namespace in1 {\n" 2364 "} // namespace in1\n" 2365 "namespace in2 {\n" 2366 "} // namespace in2\n" 2367 "} // namespace out", 2368 format("namespace out {\n" 2369 "namespace in1 {\n" 2370 "} // namespace in1\n" 2371 "namespace in2 {\n" 2372 "} // namespace in2\n" 2373 "} // namespace out", 2374 Style)); 2375 2376 EXPECT_EQ("namespace out {\n" 2377 "int i;\n" 2378 "namespace in {\n" 2379 "int j;\n" 2380 "} // namespace in\n" 2381 "int k;\n" 2382 "} // namespace out", 2383 format("namespace out { int i;\n" 2384 "namespace in { int j; } // namespace in\n" 2385 "int k; } // namespace out", 2386 Style)); 2387 2388 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2389 "}}} // namespace A::B::C\n", 2390 format("namespace A { namespace B {\n" 2391 "namespace C {\n" 2392 "}} // namespace B::C\n" 2393 "} // namespace A\n", 2394 Style)); 2395 2396 Style.ColumnLimit = 40; 2397 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2398 "namespace bbbbbbbbbb {\n" 2399 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2400 format("namespace aaaaaaaaaa {\n" 2401 "namespace bbbbbbbbbb {\n" 2402 "} // namespace bbbbbbbbbb\n" 2403 "} // namespace aaaaaaaaaa", 2404 Style)); 2405 2406 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2407 "namespace cccccc {\n" 2408 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2409 format("namespace aaaaaa {\n" 2410 "namespace bbbbbb {\n" 2411 "namespace cccccc {\n" 2412 "} // namespace cccccc\n" 2413 "} // namespace bbbbbb\n" 2414 "} // namespace aaaaaa", 2415 Style)); 2416 Style.ColumnLimit = 80; 2417 2418 // Extra semicolon after 'inner' closing brace prevents merging 2419 EXPECT_EQ("namespace out { namespace in {\n" 2420 "}; } // namespace out::in", 2421 format("namespace out {\n" 2422 "namespace in {\n" 2423 "}; // namespace in\n" 2424 "} // namespace out", 2425 Style)); 2426 2427 // Extra semicolon after 'outer' closing brace is conserved 2428 EXPECT_EQ("namespace out { namespace in {\n" 2429 "}}; // namespace out::in", 2430 format("namespace out {\n" 2431 "namespace in {\n" 2432 "} // namespace in\n" 2433 "}; // namespace out", 2434 Style)); 2435 2436 Style.NamespaceIndentation = FormatStyle::NI_All; 2437 EXPECT_EQ("namespace out { namespace in {\n" 2438 " int i;\n" 2439 "}} // namespace out::in", 2440 format("namespace out {\n" 2441 "namespace in {\n" 2442 "int i;\n" 2443 "} // namespace in\n" 2444 "} // namespace out", 2445 Style)); 2446 EXPECT_EQ("namespace out { namespace mid {\n" 2447 " namespace in {\n" 2448 " int j;\n" 2449 " } // namespace in\n" 2450 " int k;\n" 2451 "}} // namespace out::mid", 2452 format("namespace out { namespace mid {\n" 2453 "namespace in { int j; } // namespace in\n" 2454 "int k; }} // namespace out::mid", 2455 Style)); 2456 2457 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2458 EXPECT_EQ("namespace out { namespace in {\n" 2459 " int i;\n" 2460 "}} // namespace out::in", 2461 format("namespace out {\n" 2462 "namespace in {\n" 2463 "int i;\n" 2464 "} // namespace in\n" 2465 "} // namespace out", 2466 Style)); 2467 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2468 " int i;\n" 2469 "}}} // namespace out::mid::in", 2470 format("namespace out {\n" 2471 "namespace mid {\n" 2472 "namespace in {\n" 2473 "int i;\n" 2474 "} // namespace in\n" 2475 "} // namespace mid\n" 2476 "} // namespace out", 2477 Style)); 2478 } 2479 2480 TEST_F(FormatTest, FormatsExternC) { 2481 verifyFormat("extern \"C\" {\nint a;"); 2482 verifyFormat("extern \"C\" {}"); 2483 verifyFormat("extern \"C\" {\n" 2484 "int foo();\n" 2485 "}"); 2486 verifyFormat("extern \"C\" int foo() {}"); 2487 verifyFormat("extern \"C\" int foo();"); 2488 verifyFormat("extern \"C\" int foo() {\n" 2489 " int i = 42;\n" 2490 " return i;\n" 2491 "}"); 2492 2493 FormatStyle Style = getLLVMStyle(); 2494 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2495 Style.BraceWrapping.AfterFunction = true; 2496 verifyFormat("extern \"C\" int foo() {}", Style); 2497 verifyFormat("extern \"C\" int foo();", Style); 2498 verifyFormat("extern \"C\" int foo()\n" 2499 "{\n" 2500 " int i = 42;\n" 2501 " return i;\n" 2502 "}", 2503 Style); 2504 2505 Style.BraceWrapping.AfterExternBlock = true; 2506 Style.BraceWrapping.SplitEmptyRecord = false; 2507 verifyFormat("extern \"C\"\n" 2508 "{}", 2509 Style); 2510 verifyFormat("extern \"C\"\n" 2511 "{\n" 2512 " int foo();\n" 2513 "}", 2514 Style); 2515 } 2516 2517 TEST_F(FormatTest, FormatsInlineASM) { 2518 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2519 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2520 verifyFormat( 2521 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2522 " \"cpuid\\n\\t\"\n" 2523 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2524 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2525 " : \"a\"(value));"); 2526 EXPECT_EQ( 2527 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2528 " __asm {\n" 2529 " mov edx,[that] // vtable in edx\n" 2530 " mov eax,methodIndex\n" 2531 " call [edx][eax*4] // stdcall\n" 2532 " }\n" 2533 "}", 2534 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2535 " __asm {\n" 2536 " mov edx,[that] // vtable in edx\n" 2537 " mov eax,methodIndex\n" 2538 " call [edx][eax*4] // stdcall\n" 2539 " }\n" 2540 "}")); 2541 EXPECT_EQ("_asm {\n" 2542 " xor eax, eax;\n" 2543 " cpuid;\n" 2544 "}", 2545 format("_asm {\n" 2546 " xor eax, eax;\n" 2547 " cpuid;\n" 2548 "}")); 2549 verifyFormat("void function() {\n" 2550 " // comment\n" 2551 " asm(\"\");\n" 2552 "}"); 2553 EXPECT_EQ("__asm {\n" 2554 "}\n" 2555 "int i;", 2556 format("__asm {\n" 2557 "}\n" 2558 "int i;")); 2559 } 2560 2561 TEST_F(FormatTest, FormatTryCatch) { 2562 verifyFormat("try {\n" 2563 " throw a * b;\n" 2564 "} catch (int a) {\n" 2565 " // Do nothing.\n" 2566 "} catch (...) {\n" 2567 " exit(42);\n" 2568 "}"); 2569 2570 // Function-level try statements. 2571 verifyFormat("int f() try { return 4; } catch (...) {\n" 2572 " return 5;\n" 2573 "}"); 2574 verifyFormat("class A {\n" 2575 " int a;\n" 2576 " A() try : a(0) {\n" 2577 " } catch (...) {\n" 2578 " throw;\n" 2579 " }\n" 2580 "};\n"); 2581 2582 // Incomplete try-catch blocks. 2583 verifyIncompleteFormat("try {} catch ("); 2584 } 2585 2586 TEST_F(FormatTest, FormatSEHTryCatch) { 2587 verifyFormat("__try {\n" 2588 " int a = b * c;\n" 2589 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2590 " // Do nothing.\n" 2591 "}"); 2592 2593 verifyFormat("__try {\n" 2594 " int a = b * c;\n" 2595 "} __finally {\n" 2596 " // Do nothing.\n" 2597 "}"); 2598 2599 verifyFormat("DEBUG({\n" 2600 " __try {\n" 2601 " } __finally {\n" 2602 " }\n" 2603 "});\n"); 2604 } 2605 2606 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2607 verifyFormat("try {\n" 2608 " f();\n" 2609 "} catch {\n" 2610 " g();\n" 2611 "}"); 2612 verifyFormat("try {\n" 2613 " f();\n" 2614 "} catch (A a) MACRO(x) {\n" 2615 " g();\n" 2616 "} catch (B b) MACRO(x) {\n" 2617 " g();\n" 2618 "}"); 2619 } 2620 2621 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2622 FormatStyle Style = getLLVMStyle(); 2623 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2624 FormatStyle::BS_WebKit}) { 2625 Style.BreakBeforeBraces = BraceStyle; 2626 verifyFormat("try {\n" 2627 " // something\n" 2628 "} catch (...) {\n" 2629 " // something\n" 2630 "}", 2631 Style); 2632 } 2633 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2634 verifyFormat("try {\n" 2635 " // something\n" 2636 "}\n" 2637 "catch (...) {\n" 2638 " // something\n" 2639 "}", 2640 Style); 2641 verifyFormat("__try {\n" 2642 " // something\n" 2643 "}\n" 2644 "__finally {\n" 2645 " // something\n" 2646 "}", 2647 Style); 2648 verifyFormat("@try {\n" 2649 " // something\n" 2650 "}\n" 2651 "@finally {\n" 2652 " // something\n" 2653 "}", 2654 Style); 2655 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2656 verifyFormat("try\n" 2657 "{\n" 2658 " // something\n" 2659 "}\n" 2660 "catch (...)\n" 2661 "{\n" 2662 " // something\n" 2663 "}", 2664 Style); 2665 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2666 verifyFormat("try\n" 2667 " {\n" 2668 " // something white\n" 2669 " }\n" 2670 "catch (...)\n" 2671 " {\n" 2672 " // something white\n" 2673 " }", 2674 Style); 2675 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2676 verifyFormat("try\n" 2677 " {\n" 2678 " // something\n" 2679 " }\n" 2680 "catch (...)\n" 2681 " {\n" 2682 " // something\n" 2683 " }", 2684 Style); 2685 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2686 Style.BraceWrapping.BeforeCatch = true; 2687 verifyFormat("try {\n" 2688 " // something\n" 2689 "}\n" 2690 "catch (...) {\n" 2691 " // something\n" 2692 "}", 2693 Style); 2694 } 2695 2696 TEST_F(FormatTest, StaticInitializers) { 2697 verifyFormat("static SomeClass SC = {1, 'a'};"); 2698 2699 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2700 " 100000000, " 2701 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2702 2703 // Here, everything other than the "}" would fit on a line. 2704 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2705 " 10000000000000000000000000};"); 2706 EXPECT_EQ("S s = {a,\n" 2707 "\n" 2708 " b};", 2709 format("S s = {\n" 2710 " a,\n" 2711 "\n" 2712 " b\n" 2713 "};")); 2714 2715 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2716 // line. However, the formatting looks a bit off and this probably doesn't 2717 // happen often in practice. 2718 verifyFormat("static int Variable[1] = {\n" 2719 " {1000000000000000000000000000000000000}};", 2720 getLLVMStyleWithColumns(40)); 2721 } 2722 2723 TEST_F(FormatTest, DesignatedInitializers) { 2724 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2725 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2726 " .bbbbbbbbbb = 2,\n" 2727 " .cccccccccc = 3,\n" 2728 " .dddddddddd = 4,\n" 2729 " .eeeeeeeeee = 5};"); 2730 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2731 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2732 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2733 " .ccccccccccccccccccccccccccc = 3,\n" 2734 " .ddddddddddddddddddddddddddd = 4,\n" 2735 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2736 2737 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2738 2739 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2740 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2741 " [2] = bbbbbbbbbb,\n" 2742 " [3] = cccccccccc,\n" 2743 " [4] = dddddddddd,\n" 2744 " [5] = eeeeeeeeee};"); 2745 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2746 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2747 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2748 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2749 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2750 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2751 } 2752 2753 TEST_F(FormatTest, NestedStaticInitializers) { 2754 verifyFormat("static A x = {{{}}};\n"); 2755 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2756 " {init1, init2, init3, init4}}};", 2757 getLLVMStyleWithColumns(50)); 2758 2759 verifyFormat("somes Status::global_reps[3] = {\n" 2760 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2761 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2762 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2763 getLLVMStyleWithColumns(60)); 2764 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2765 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2766 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2767 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2768 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2769 " {rect.fRight - rect.fLeft, rect.fBottom - " 2770 "rect.fTop}};"); 2771 2772 verifyFormat( 2773 "SomeArrayOfSomeType a = {\n" 2774 " {{1, 2, 3},\n" 2775 " {1, 2, 3},\n" 2776 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2777 " 333333333333333333333333333333},\n" 2778 " {1, 2, 3},\n" 2779 " {1, 2, 3}}};"); 2780 verifyFormat( 2781 "SomeArrayOfSomeType a = {\n" 2782 " {{1, 2, 3}},\n" 2783 " {{1, 2, 3}},\n" 2784 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2785 " 333333333333333333333333333333}},\n" 2786 " {{1, 2, 3}},\n" 2787 " {{1, 2, 3}}};"); 2788 2789 verifyFormat("struct {\n" 2790 " unsigned bit;\n" 2791 " const char *const name;\n" 2792 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2793 " {kOsWin, \"Windows\"},\n" 2794 " {kOsLinux, \"Linux\"},\n" 2795 " {kOsCrOS, \"Chrome OS\"}};"); 2796 verifyFormat("struct {\n" 2797 " unsigned bit;\n" 2798 " const char *const name;\n" 2799 "} kBitsToOs[] = {\n" 2800 " {kOsMac, \"Mac\"},\n" 2801 " {kOsWin, \"Windows\"},\n" 2802 " {kOsLinux, \"Linux\"},\n" 2803 " {kOsCrOS, \"Chrome OS\"},\n" 2804 "};"); 2805 } 2806 2807 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2808 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2809 " \\\n" 2810 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2811 } 2812 2813 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2814 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2815 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2816 2817 // Do break defaulted and deleted functions. 2818 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2819 " default;", 2820 getLLVMStyleWithColumns(40)); 2821 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2822 " delete;", 2823 getLLVMStyleWithColumns(40)); 2824 } 2825 2826 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2827 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2828 getLLVMStyleWithColumns(40)); 2829 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2830 getLLVMStyleWithColumns(40)); 2831 EXPECT_EQ("#define Q \\\n" 2832 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2833 " \"aaaaaaaa.cpp\"", 2834 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2835 getLLVMStyleWithColumns(40))); 2836 } 2837 2838 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2839 EXPECT_EQ("# 123 \"A string literal\"", 2840 format(" # 123 \"A string literal\"")); 2841 } 2842 2843 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2844 EXPECT_EQ("#;", format("#;")); 2845 verifyFormat("#\n;\n;\n;"); 2846 } 2847 2848 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2849 EXPECT_EQ("#line 42 \"test\"\n", 2850 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2851 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2852 getLLVMStyleWithColumns(12))); 2853 } 2854 2855 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2856 EXPECT_EQ("#line 42 \"test\"", 2857 format("# \\\n line \\\n 42 \\\n \"test\"")); 2858 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2859 } 2860 2861 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2862 verifyFormat("#define A \\x20"); 2863 verifyFormat("#define A \\ x20"); 2864 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2865 verifyFormat("#define A ''"); 2866 verifyFormat("#define A ''qqq"); 2867 verifyFormat("#define A `qqq"); 2868 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2869 EXPECT_EQ("const char *c = STRINGIFY(\n" 2870 "\\na : b);", 2871 format("const char * c = STRINGIFY(\n" 2872 "\\na : b);")); 2873 2874 verifyFormat("a\r\\"); 2875 verifyFormat("a\v\\"); 2876 verifyFormat("a\f\\"); 2877 } 2878 2879 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2880 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2881 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2882 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2883 // FIXME: We never break before the macro name. 2884 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2885 2886 verifyFormat("#define A A\n#define A A"); 2887 verifyFormat("#define A(X) A\n#define A A"); 2888 2889 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2890 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2891 } 2892 2893 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2894 EXPECT_EQ("// somecomment\n" 2895 "#include \"a.h\"\n" 2896 "#define A( \\\n" 2897 " A, B)\n" 2898 "#include \"b.h\"\n" 2899 "// somecomment\n", 2900 format(" // somecomment\n" 2901 " #include \"a.h\"\n" 2902 "#define A(A,\\\n" 2903 " B)\n" 2904 " #include \"b.h\"\n" 2905 " // somecomment\n", 2906 getLLVMStyleWithColumns(13))); 2907 } 2908 2909 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2910 2911 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2912 EXPECT_EQ("#define A \\\n" 2913 " c; \\\n" 2914 " e;\n" 2915 "f;", 2916 format("#define A c; e;\n" 2917 "f;", 2918 getLLVMStyleWithColumns(14))); 2919 } 2920 2921 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2922 2923 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2924 EXPECT_EQ("int x,\n" 2925 "#define A\n" 2926 " y;", 2927 format("int x,\n#define A\ny;")); 2928 } 2929 2930 TEST_F(FormatTest, HashInMacroDefinition) { 2931 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2932 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2933 verifyFormat("#define A \\\n" 2934 " { \\\n" 2935 " f(#c); \\\n" 2936 " }", 2937 getLLVMStyleWithColumns(11)); 2938 2939 verifyFormat("#define A(X) \\\n" 2940 " void function##X()", 2941 getLLVMStyleWithColumns(22)); 2942 2943 verifyFormat("#define A(a, b, c) \\\n" 2944 " void a##b##c()", 2945 getLLVMStyleWithColumns(22)); 2946 2947 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2948 } 2949 2950 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2951 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2952 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2953 2954 FormatStyle Style = getLLVMStyle(); 2955 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2956 verifyFormat("#define true ((foo)1)", Style); 2957 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2958 verifyFormat("#define false((foo)0)", Style); 2959 } 2960 2961 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2962 EXPECT_EQ("#define A b;", format("#define A \\\n" 2963 " \\\n" 2964 " b;", 2965 getLLVMStyleWithColumns(25))); 2966 EXPECT_EQ("#define A \\\n" 2967 " \\\n" 2968 " a; \\\n" 2969 " b;", 2970 format("#define A \\\n" 2971 " \\\n" 2972 " a; \\\n" 2973 " b;", 2974 getLLVMStyleWithColumns(11))); 2975 EXPECT_EQ("#define A \\\n" 2976 " a; \\\n" 2977 " \\\n" 2978 " b;", 2979 format("#define A \\\n" 2980 " a; \\\n" 2981 " \\\n" 2982 " b;", 2983 getLLVMStyleWithColumns(11))); 2984 } 2985 2986 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2987 verifyIncompleteFormat("#define A :"); 2988 verifyFormat("#define SOMECASES \\\n" 2989 " case 1: \\\n" 2990 " case 2\n", 2991 getLLVMStyleWithColumns(20)); 2992 verifyFormat("#define MACRO(a) \\\n" 2993 " if (a) \\\n" 2994 " f(); \\\n" 2995 " else \\\n" 2996 " g()", 2997 getLLVMStyleWithColumns(18)); 2998 verifyFormat("#define A template <typename T>"); 2999 verifyIncompleteFormat("#define STR(x) #x\n" 3000 "f(STR(this_is_a_string_literal{));"); 3001 verifyFormat("#pragma omp threadprivate( \\\n" 3002 " y)), // expected-warning", 3003 getLLVMStyleWithColumns(28)); 3004 verifyFormat("#d, = };"); 3005 verifyFormat("#if \"a"); 3006 verifyIncompleteFormat("({\n" 3007 "#define b \\\n" 3008 " } \\\n" 3009 " a\n" 3010 "a", 3011 getLLVMStyleWithColumns(15)); 3012 verifyFormat("#define A \\\n" 3013 " { \\\n" 3014 " {\n" 3015 "#define B \\\n" 3016 " } \\\n" 3017 " }", 3018 getLLVMStyleWithColumns(15)); 3019 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 3020 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 3021 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 3022 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 3023 } 3024 3025 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 3026 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 3027 EXPECT_EQ("class A : public QObject {\n" 3028 " Q_OBJECT\n" 3029 "\n" 3030 " A() {}\n" 3031 "};", 3032 format("class A : public QObject {\n" 3033 " Q_OBJECT\n" 3034 "\n" 3035 " A() {\n}\n" 3036 "} ;")); 3037 EXPECT_EQ("MACRO\n" 3038 "/*static*/ int i;", 3039 format("MACRO\n" 3040 " /*static*/ int i;")); 3041 EXPECT_EQ("SOME_MACRO\n" 3042 "namespace {\n" 3043 "void f();\n" 3044 "} // namespace", 3045 format("SOME_MACRO\n" 3046 " namespace {\n" 3047 "void f( );\n" 3048 "} // namespace")); 3049 // Only if the identifier contains at least 5 characters. 3050 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 3051 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 3052 // Only if everything is upper case. 3053 EXPECT_EQ("class A : public QObject {\n" 3054 " Q_Object A() {}\n" 3055 "};", 3056 format("class A : public QObject {\n" 3057 " Q_Object\n" 3058 " A() {\n}\n" 3059 "} ;")); 3060 3061 // Only if the next line can actually start an unwrapped line. 3062 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 3063 format("SOME_WEIRD_LOG_MACRO\n" 3064 "<< SomeThing;")); 3065 3066 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 3067 "(n, buffers))\n", 3068 getChromiumStyle(FormatStyle::LK_Cpp)); 3069 3070 // See PR41483 3071 EXPECT_EQ("/**/ FOO(a)\n" 3072 "FOO(b)", 3073 format("/**/ FOO(a)\n" 3074 "FOO(b)")); 3075 } 3076 3077 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 3078 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3079 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3080 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3081 "class X {};\n" 3082 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3083 "int *createScopDetectionPass() { return 0; }", 3084 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3085 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3086 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3087 " class X {};\n" 3088 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3089 " int *createScopDetectionPass() { return 0; }")); 3090 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 3091 // braces, so that inner block is indented one level more. 3092 EXPECT_EQ("int q() {\n" 3093 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3094 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3095 " IPC_END_MESSAGE_MAP()\n" 3096 "}", 3097 format("int q() {\n" 3098 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3099 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3100 " IPC_END_MESSAGE_MAP()\n" 3101 "}")); 3102 3103 // Same inside macros. 3104 EXPECT_EQ("#define LIST(L) \\\n" 3105 " L(A) \\\n" 3106 " L(B) \\\n" 3107 " L(C)", 3108 format("#define LIST(L) \\\n" 3109 " L(A) \\\n" 3110 " L(B) \\\n" 3111 " L(C)", 3112 getGoogleStyle())); 3113 3114 // These must not be recognized as macros. 3115 EXPECT_EQ("int q() {\n" 3116 " f(x);\n" 3117 " f(x) {}\n" 3118 " f(x)->g();\n" 3119 " f(x)->*g();\n" 3120 " f(x).g();\n" 3121 " f(x) = x;\n" 3122 " f(x) += x;\n" 3123 " f(x) -= x;\n" 3124 " f(x) *= x;\n" 3125 " f(x) /= x;\n" 3126 " f(x) %= x;\n" 3127 " f(x) &= x;\n" 3128 " f(x) |= x;\n" 3129 " f(x) ^= x;\n" 3130 " f(x) >>= x;\n" 3131 " f(x) <<= x;\n" 3132 " f(x)[y].z();\n" 3133 " LOG(INFO) << x;\n" 3134 " ifstream(x) >> x;\n" 3135 "}\n", 3136 format("int q() {\n" 3137 " f(x)\n;\n" 3138 " f(x)\n {}\n" 3139 " f(x)\n->g();\n" 3140 " f(x)\n->*g();\n" 3141 " f(x)\n.g();\n" 3142 " f(x)\n = x;\n" 3143 " f(x)\n += x;\n" 3144 " f(x)\n -= x;\n" 3145 " f(x)\n *= x;\n" 3146 " f(x)\n /= x;\n" 3147 " f(x)\n %= x;\n" 3148 " f(x)\n &= x;\n" 3149 " f(x)\n |= x;\n" 3150 " f(x)\n ^= x;\n" 3151 " f(x)\n >>= x;\n" 3152 " f(x)\n <<= x;\n" 3153 " f(x)\n[y].z();\n" 3154 " LOG(INFO)\n << x;\n" 3155 " ifstream(x)\n >> x;\n" 3156 "}\n")); 3157 EXPECT_EQ("int q() {\n" 3158 " F(x)\n" 3159 " if (1) {\n" 3160 " }\n" 3161 " F(x)\n" 3162 " while (1) {\n" 3163 " }\n" 3164 " F(x)\n" 3165 " G(x);\n" 3166 " F(x)\n" 3167 " try {\n" 3168 " Q();\n" 3169 " } catch (...) {\n" 3170 " }\n" 3171 "}\n", 3172 format("int q() {\n" 3173 "F(x)\n" 3174 "if (1) {}\n" 3175 "F(x)\n" 3176 "while (1) {}\n" 3177 "F(x)\n" 3178 "G(x);\n" 3179 "F(x)\n" 3180 "try { Q(); } catch (...) {}\n" 3181 "}\n")); 3182 EXPECT_EQ("class A {\n" 3183 " A() : t(0) {}\n" 3184 " A(int i) noexcept() : {}\n" 3185 " A(X x)\n" // FIXME: function-level try blocks are broken. 3186 " try : t(0) {\n" 3187 " } catch (...) {\n" 3188 " }\n" 3189 "};", 3190 format("class A {\n" 3191 " A()\n : t(0) {}\n" 3192 " A(int i)\n noexcept() : {}\n" 3193 " A(X x)\n" 3194 " try : t(0) {} catch (...) {}\n" 3195 "};")); 3196 FormatStyle Style = getLLVMStyle(); 3197 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3198 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3199 Style.BraceWrapping.AfterFunction = true; 3200 EXPECT_EQ("void f()\n" 3201 "try\n" 3202 "{\n" 3203 "}", 3204 format("void f() try {\n" 3205 "}", 3206 Style)); 3207 EXPECT_EQ("class SomeClass {\n" 3208 "public:\n" 3209 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3210 "};", 3211 format("class SomeClass {\n" 3212 "public:\n" 3213 " SomeClass()\n" 3214 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3215 "};")); 3216 EXPECT_EQ("class SomeClass {\n" 3217 "public:\n" 3218 " SomeClass()\n" 3219 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3220 "};", 3221 format("class SomeClass {\n" 3222 "public:\n" 3223 " SomeClass()\n" 3224 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3225 "};", 3226 getLLVMStyleWithColumns(40))); 3227 3228 verifyFormat("MACRO(>)"); 3229 3230 // Some macros contain an implicit semicolon. 3231 Style = getLLVMStyle(); 3232 Style.StatementMacros.push_back("FOO"); 3233 verifyFormat("FOO(a) int b = 0;"); 3234 verifyFormat("FOO(a)\n" 3235 "int b = 0;", 3236 Style); 3237 verifyFormat("FOO(a);\n" 3238 "int b = 0;", 3239 Style); 3240 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3241 "int b = 0;", 3242 Style); 3243 verifyFormat("FOO()\n" 3244 "int b = 0;", 3245 Style); 3246 verifyFormat("FOO\n" 3247 "int b = 0;", 3248 Style); 3249 verifyFormat("void f() {\n" 3250 " FOO(a)\n" 3251 " return a;\n" 3252 "}", 3253 Style); 3254 verifyFormat("FOO(a)\n" 3255 "FOO(b)", 3256 Style); 3257 verifyFormat("int a = 0;\n" 3258 "FOO(b)\n" 3259 "int c = 0;", 3260 Style); 3261 verifyFormat("int a = 0;\n" 3262 "int x = FOO(a)\n" 3263 "int b = 0;", 3264 Style); 3265 verifyFormat("void foo(int a) { FOO(a) }\n" 3266 "uint32_t bar() {}", 3267 Style); 3268 } 3269 3270 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3271 verifyFormat("#define A \\\n" 3272 " f({ \\\n" 3273 " g(); \\\n" 3274 " });", 3275 getLLVMStyleWithColumns(11)); 3276 } 3277 3278 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3279 FormatStyle Style = getLLVMStyle(); 3280 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3281 Style.ColumnLimit = 40; 3282 verifyFormat("#ifdef _WIN32\n" 3283 "#define A 0\n" 3284 "#ifdef VAR2\n" 3285 "#define B 1\n" 3286 "#include <someheader.h>\n" 3287 "#define MACRO \\\n" 3288 " some_very_long_func_aaaaaaaaaa();\n" 3289 "#endif\n" 3290 "#else\n" 3291 "#define A 1\n" 3292 "#endif", 3293 Style); 3294 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3295 verifyFormat("#ifdef _WIN32\n" 3296 "# define A 0\n" 3297 "# ifdef VAR2\n" 3298 "# define B 1\n" 3299 "# include <someheader.h>\n" 3300 "# define MACRO \\\n" 3301 " some_very_long_func_aaaaaaaaaa();\n" 3302 "# endif\n" 3303 "#else\n" 3304 "# define A 1\n" 3305 "#endif", 3306 Style); 3307 verifyFormat("#if A\n" 3308 "# define MACRO \\\n" 3309 " void a(int x) { \\\n" 3310 " b(); \\\n" 3311 " c(); \\\n" 3312 " d(); \\\n" 3313 " e(); \\\n" 3314 " f(); \\\n" 3315 " }\n" 3316 "#endif", 3317 Style); 3318 // Comments before include guard. 3319 verifyFormat("// file comment\n" 3320 "// file comment\n" 3321 "#ifndef HEADER_H\n" 3322 "#define HEADER_H\n" 3323 "code();\n" 3324 "#endif", 3325 Style); 3326 // Test with include guards. 3327 verifyFormat("#ifndef HEADER_H\n" 3328 "#define HEADER_H\n" 3329 "code();\n" 3330 "#endif", 3331 Style); 3332 // Include guards must have a #define with the same variable immediately 3333 // after #ifndef. 3334 verifyFormat("#ifndef NOT_GUARD\n" 3335 "# define FOO\n" 3336 "code();\n" 3337 "#endif", 3338 Style); 3339 3340 // Include guards must cover the entire file. 3341 verifyFormat("code();\n" 3342 "code();\n" 3343 "#ifndef NOT_GUARD\n" 3344 "# define NOT_GUARD\n" 3345 "code();\n" 3346 "#endif", 3347 Style); 3348 verifyFormat("#ifndef NOT_GUARD\n" 3349 "# define NOT_GUARD\n" 3350 "code();\n" 3351 "#endif\n" 3352 "code();", 3353 Style); 3354 // Test with trailing blank lines. 3355 verifyFormat("#ifndef HEADER_H\n" 3356 "#define HEADER_H\n" 3357 "code();\n" 3358 "#endif\n", 3359 Style); 3360 // Include guards don't have #else. 3361 verifyFormat("#ifndef NOT_GUARD\n" 3362 "# define NOT_GUARD\n" 3363 "code();\n" 3364 "#else\n" 3365 "#endif", 3366 Style); 3367 verifyFormat("#ifndef NOT_GUARD\n" 3368 "# define NOT_GUARD\n" 3369 "code();\n" 3370 "#elif FOO\n" 3371 "#endif", 3372 Style); 3373 // Non-identifier #define after potential include guard. 3374 verifyFormat("#ifndef FOO\n" 3375 "# define 1\n" 3376 "#endif\n", 3377 Style); 3378 // #if closes past last non-preprocessor line. 3379 verifyFormat("#ifndef FOO\n" 3380 "#define FOO\n" 3381 "#if 1\n" 3382 "int i;\n" 3383 "# define A 0\n" 3384 "#endif\n" 3385 "#endif\n", 3386 Style); 3387 // Don't crash if there is an #elif directive without a condition. 3388 verifyFormat("#if 1\n" 3389 "int x;\n" 3390 "#elif\n" 3391 "int y;\n" 3392 "#else\n" 3393 "int z;\n" 3394 "#endif", 3395 Style); 3396 // FIXME: This doesn't handle the case where there's code between the 3397 // #ifndef and #define but all other conditions hold. This is because when 3398 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3399 // previous code line yet, so we can't detect it. 3400 EXPECT_EQ("#ifndef NOT_GUARD\n" 3401 "code();\n" 3402 "#define NOT_GUARD\n" 3403 "code();\n" 3404 "#endif", 3405 format("#ifndef NOT_GUARD\n" 3406 "code();\n" 3407 "# define NOT_GUARD\n" 3408 "code();\n" 3409 "#endif", 3410 Style)); 3411 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3412 // be outside an include guard. Examples are #pragma once and 3413 // #pragma GCC diagnostic, or anything else that does not change the meaning 3414 // of the file if it's included multiple times. 3415 EXPECT_EQ("#ifdef WIN32\n" 3416 "# pragma once\n" 3417 "#endif\n" 3418 "#ifndef HEADER_H\n" 3419 "# define HEADER_H\n" 3420 "code();\n" 3421 "#endif", 3422 format("#ifdef WIN32\n" 3423 "# pragma once\n" 3424 "#endif\n" 3425 "#ifndef HEADER_H\n" 3426 "#define HEADER_H\n" 3427 "code();\n" 3428 "#endif", 3429 Style)); 3430 // FIXME: This does not detect when there is a single non-preprocessor line 3431 // in front of an include-guard-like structure where other conditions hold 3432 // because ScopedLineState hides the line. 3433 EXPECT_EQ("code();\n" 3434 "#ifndef HEADER_H\n" 3435 "#define HEADER_H\n" 3436 "code();\n" 3437 "#endif", 3438 format("code();\n" 3439 "#ifndef HEADER_H\n" 3440 "# define HEADER_H\n" 3441 "code();\n" 3442 "#endif", 3443 Style)); 3444 // Keep comments aligned with #, otherwise indent comments normally. These 3445 // tests cannot use verifyFormat because messUp manipulates leading 3446 // whitespace. 3447 { 3448 const char *Expected = "" 3449 "void f() {\n" 3450 "#if 1\n" 3451 "// Preprocessor aligned.\n" 3452 "# define A 0\n" 3453 " // Code. Separated by blank line.\n" 3454 "\n" 3455 "# define B 0\n" 3456 " // Code. Not aligned with #\n" 3457 "# define C 0\n" 3458 "#endif"; 3459 const char *ToFormat = "" 3460 "void f() {\n" 3461 "#if 1\n" 3462 "// Preprocessor aligned.\n" 3463 "# define A 0\n" 3464 "// Code. Separated by blank line.\n" 3465 "\n" 3466 "# define B 0\n" 3467 " // Code. Not aligned with #\n" 3468 "# define C 0\n" 3469 "#endif"; 3470 EXPECT_EQ(Expected, format(ToFormat, Style)); 3471 EXPECT_EQ(Expected, format(Expected, Style)); 3472 } 3473 // Keep block quotes aligned. 3474 { 3475 const char *Expected = "" 3476 "void f() {\n" 3477 "#if 1\n" 3478 "/* Preprocessor aligned. */\n" 3479 "# define A 0\n" 3480 " /* Code. Separated by blank line. */\n" 3481 "\n" 3482 "# define B 0\n" 3483 " /* Code. Not aligned with # */\n" 3484 "# define C 0\n" 3485 "#endif"; 3486 const char *ToFormat = "" 3487 "void f() {\n" 3488 "#if 1\n" 3489 "/* Preprocessor aligned. */\n" 3490 "# define A 0\n" 3491 "/* Code. Separated by blank line. */\n" 3492 "\n" 3493 "# define B 0\n" 3494 " /* Code. Not aligned with # */\n" 3495 "# define C 0\n" 3496 "#endif"; 3497 EXPECT_EQ(Expected, format(ToFormat, Style)); 3498 EXPECT_EQ(Expected, format(Expected, Style)); 3499 } 3500 // Keep comments aligned with un-indented directives. 3501 { 3502 const char *Expected = "" 3503 "void f() {\n" 3504 "// Preprocessor aligned.\n" 3505 "#define A 0\n" 3506 " // Code. Separated by blank line.\n" 3507 "\n" 3508 "#define B 0\n" 3509 " // Code. Not aligned with #\n" 3510 "#define C 0\n"; 3511 const char *ToFormat = "" 3512 "void f() {\n" 3513 "// Preprocessor aligned.\n" 3514 "#define A 0\n" 3515 "// Code. Separated by blank line.\n" 3516 "\n" 3517 "#define B 0\n" 3518 " // Code. Not aligned with #\n" 3519 "#define C 0\n"; 3520 EXPECT_EQ(Expected, format(ToFormat, Style)); 3521 EXPECT_EQ(Expected, format(Expected, Style)); 3522 } 3523 // Test AfterHash with tabs. 3524 { 3525 FormatStyle Tabbed = Style; 3526 Tabbed.UseTab = FormatStyle::UT_Always; 3527 Tabbed.IndentWidth = 8; 3528 Tabbed.TabWidth = 8; 3529 verifyFormat("#ifdef _WIN32\n" 3530 "#\tdefine A 0\n" 3531 "#\tifdef VAR2\n" 3532 "#\t\tdefine B 1\n" 3533 "#\t\tinclude <someheader.h>\n" 3534 "#\t\tdefine MACRO \\\n" 3535 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3536 "#\tendif\n" 3537 "#else\n" 3538 "#\tdefine A 1\n" 3539 "#endif", 3540 Tabbed); 3541 } 3542 3543 // Regression test: Multiline-macro inside include guards. 3544 verifyFormat("#ifndef HEADER_H\n" 3545 "#define HEADER_H\n" 3546 "#define A() \\\n" 3547 " int i; \\\n" 3548 " int j;\n" 3549 "#endif // HEADER_H", 3550 getLLVMStyleWithColumns(20)); 3551 3552 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3553 // Basic before hash indent tests 3554 verifyFormat("#ifdef _WIN32\n" 3555 " #define A 0\n" 3556 " #ifdef VAR2\n" 3557 " #define B 1\n" 3558 " #include <someheader.h>\n" 3559 " #define MACRO \\\n" 3560 " some_very_long_func_aaaaaaaaaa();\n" 3561 " #endif\n" 3562 "#else\n" 3563 " #define A 1\n" 3564 "#endif", 3565 Style); 3566 verifyFormat("#if A\n" 3567 " #define MACRO \\\n" 3568 " void a(int x) { \\\n" 3569 " b(); \\\n" 3570 " c(); \\\n" 3571 " d(); \\\n" 3572 " e(); \\\n" 3573 " f(); \\\n" 3574 " }\n" 3575 "#endif", 3576 Style); 3577 // Keep comments aligned with indented directives. These 3578 // tests cannot use verifyFormat because messUp manipulates leading 3579 // whitespace. 3580 { 3581 const char *Expected = "void f() {\n" 3582 "// Aligned to preprocessor.\n" 3583 "#if 1\n" 3584 " // Aligned to code.\n" 3585 " int a;\n" 3586 " #if 1\n" 3587 " // Aligned to preprocessor.\n" 3588 " #define A 0\n" 3589 " // Aligned to code.\n" 3590 " int b;\n" 3591 " #endif\n" 3592 "#endif\n" 3593 "}"; 3594 const char *ToFormat = "void f() {\n" 3595 "// Aligned to preprocessor.\n" 3596 "#if 1\n" 3597 "// Aligned to code.\n" 3598 "int a;\n" 3599 "#if 1\n" 3600 "// Aligned to preprocessor.\n" 3601 "#define A 0\n" 3602 "// Aligned to code.\n" 3603 "int b;\n" 3604 "#endif\n" 3605 "#endif\n" 3606 "}"; 3607 EXPECT_EQ(Expected, format(ToFormat, Style)); 3608 EXPECT_EQ(Expected, format(Expected, Style)); 3609 } 3610 { 3611 const char *Expected = "void f() {\n" 3612 "/* Aligned to preprocessor. */\n" 3613 "#if 1\n" 3614 " /* Aligned to code. */\n" 3615 " int a;\n" 3616 " #if 1\n" 3617 " /* Aligned to preprocessor. */\n" 3618 " #define A 0\n" 3619 " /* Aligned to code. */\n" 3620 " int b;\n" 3621 " #endif\n" 3622 "#endif\n" 3623 "}"; 3624 const char *ToFormat = "void f() {\n" 3625 "/* Aligned to preprocessor. */\n" 3626 "#if 1\n" 3627 "/* Aligned to code. */\n" 3628 "int a;\n" 3629 "#if 1\n" 3630 "/* Aligned to preprocessor. */\n" 3631 "#define A 0\n" 3632 "/* Aligned to code. */\n" 3633 "int b;\n" 3634 "#endif\n" 3635 "#endif\n" 3636 "}"; 3637 EXPECT_EQ(Expected, format(ToFormat, Style)); 3638 EXPECT_EQ(Expected, format(Expected, Style)); 3639 } 3640 3641 // Test single comment before preprocessor 3642 verifyFormat("// Comment\n" 3643 "\n" 3644 "#if 1\n" 3645 "#endif", 3646 Style); 3647 } 3648 3649 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3650 verifyFormat("{\n { a #c; }\n}"); 3651 } 3652 3653 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3654 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3655 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3656 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3657 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3658 } 3659 3660 TEST_F(FormatTest, EscapedNewlines) { 3661 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3662 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3663 format("#define A \\\nint i;\\\n int j;", Narrow)); 3664 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3665 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3666 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3667 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3668 3669 FormatStyle AlignLeft = getLLVMStyle(); 3670 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3671 EXPECT_EQ("#define MACRO(x) \\\n" 3672 "private: \\\n" 3673 " int x(int a);\n", 3674 format("#define MACRO(x) \\\n" 3675 "private: \\\n" 3676 " int x(int a);\n", 3677 AlignLeft)); 3678 3679 // CRLF line endings 3680 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3681 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3682 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3683 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3684 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3685 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3686 EXPECT_EQ("#define MACRO(x) \\\r\n" 3687 "private: \\\r\n" 3688 " int x(int a);\r\n", 3689 format("#define MACRO(x) \\\r\n" 3690 "private: \\\r\n" 3691 " int x(int a);\r\n", 3692 AlignLeft)); 3693 3694 FormatStyle DontAlign = getLLVMStyle(); 3695 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3696 DontAlign.MaxEmptyLinesToKeep = 3; 3697 // FIXME: can't use verifyFormat here because the newline before 3698 // "public:" is not inserted the first time it's reformatted 3699 EXPECT_EQ("#define A \\\n" 3700 " class Foo { \\\n" 3701 " void bar(); \\\n" 3702 "\\\n" 3703 "\\\n" 3704 "\\\n" 3705 " public: \\\n" 3706 " void baz(); \\\n" 3707 " };", 3708 format("#define A \\\n" 3709 " class Foo { \\\n" 3710 " void bar(); \\\n" 3711 "\\\n" 3712 "\\\n" 3713 "\\\n" 3714 " public: \\\n" 3715 " void baz(); \\\n" 3716 " };", 3717 DontAlign)); 3718 } 3719 3720 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3721 verifyFormat("#define A \\\n" 3722 " int v( \\\n" 3723 " a); \\\n" 3724 " int i;", 3725 getLLVMStyleWithColumns(11)); 3726 } 3727 3728 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3729 EXPECT_EQ( 3730 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3731 " \\\n" 3732 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3733 "\n" 3734 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3735 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3736 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3737 "\\\n" 3738 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3739 " \n" 3740 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3741 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3742 } 3743 3744 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3745 EXPECT_EQ("int\n" 3746 "#define A\n" 3747 " a;", 3748 format("int\n#define A\na;")); 3749 verifyFormat("functionCallTo(\n" 3750 " someOtherFunction(\n" 3751 " withSomeParameters, whichInSequence,\n" 3752 " areLongerThanALine(andAnotherCall,\n" 3753 "#define A B\n" 3754 " withMoreParamters,\n" 3755 " whichStronglyInfluenceTheLayout),\n" 3756 " andMoreParameters),\n" 3757 " trailing);", 3758 getLLVMStyleWithColumns(69)); 3759 verifyFormat("Foo::Foo()\n" 3760 "#ifdef BAR\n" 3761 " : baz(0)\n" 3762 "#endif\n" 3763 "{\n" 3764 "}"); 3765 verifyFormat("void f() {\n" 3766 " if (true)\n" 3767 "#ifdef A\n" 3768 " f(42);\n" 3769 " x();\n" 3770 "#else\n" 3771 " g();\n" 3772 " x();\n" 3773 "#endif\n" 3774 "}"); 3775 verifyFormat("void f(param1, param2,\n" 3776 " param3,\n" 3777 "#ifdef A\n" 3778 " param4(param5,\n" 3779 "#ifdef A1\n" 3780 " param6,\n" 3781 "#ifdef A2\n" 3782 " param7),\n" 3783 "#else\n" 3784 " param8),\n" 3785 " param9,\n" 3786 "#endif\n" 3787 " param10,\n" 3788 "#endif\n" 3789 " param11)\n" 3790 "#else\n" 3791 " param12)\n" 3792 "#endif\n" 3793 "{\n" 3794 " x();\n" 3795 "}", 3796 getLLVMStyleWithColumns(28)); 3797 verifyFormat("#if 1\n" 3798 "int i;"); 3799 verifyFormat("#if 1\n" 3800 "#endif\n" 3801 "#if 1\n" 3802 "#else\n" 3803 "#endif\n"); 3804 verifyFormat("DEBUG({\n" 3805 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3806 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3807 "});\n" 3808 "#if a\n" 3809 "#else\n" 3810 "#endif"); 3811 3812 verifyIncompleteFormat("void f(\n" 3813 "#if A\n" 3814 ");\n" 3815 "#else\n" 3816 "#endif"); 3817 } 3818 3819 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3820 verifyFormat("#endif\n" 3821 "#if B"); 3822 } 3823 3824 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3825 FormatStyle SingleLine = getLLVMStyle(); 3826 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3827 verifyFormat("#if 0\n" 3828 "#elif 1\n" 3829 "#endif\n" 3830 "void foo() {\n" 3831 " if (test) foo2();\n" 3832 "}", 3833 SingleLine); 3834 } 3835 3836 TEST_F(FormatTest, LayoutBlockInsideParens) { 3837 verifyFormat("functionCall({ int i; });"); 3838 verifyFormat("functionCall({\n" 3839 " int i;\n" 3840 " int j;\n" 3841 "});"); 3842 verifyFormat("functionCall(\n" 3843 " {\n" 3844 " int i;\n" 3845 " int j;\n" 3846 " },\n" 3847 " aaaa, bbbb, cccc);"); 3848 verifyFormat("functionA(functionB({\n" 3849 " int i;\n" 3850 " int j;\n" 3851 " }),\n" 3852 " aaaa, bbbb, cccc);"); 3853 verifyFormat("functionCall(\n" 3854 " {\n" 3855 " int i;\n" 3856 " int j;\n" 3857 " },\n" 3858 " aaaa, bbbb, // comment\n" 3859 " cccc);"); 3860 verifyFormat("functionA(functionB({\n" 3861 " int i;\n" 3862 " int j;\n" 3863 " }),\n" 3864 " aaaa, bbbb, // comment\n" 3865 " cccc);"); 3866 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3867 verifyFormat("functionCall(aaaa, bbbb, {\n" 3868 " int i;\n" 3869 " int j;\n" 3870 "});"); 3871 verifyFormat( 3872 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3873 " {\n" 3874 " int i; // break\n" 3875 " },\n" 3876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3877 " ccccccccccccccccc));"); 3878 verifyFormat("DEBUG({\n" 3879 " if (a)\n" 3880 " f();\n" 3881 "});"); 3882 } 3883 3884 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3885 EXPECT_EQ("SOME_MACRO { int i; }\n" 3886 "int i;", 3887 format(" SOME_MACRO {int i;} int i;")); 3888 } 3889 3890 TEST_F(FormatTest, LayoutNestedBlocks) { 3891 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3892 " struct s {\n" 3893 " int i;\n" 3894 " };\n" 3895 " s kBitsToOs[] = {{10}};\n" 3896 " for (int i = 0; i < 10; ++i)\n" 3897 " return;\n" 3898 "}"); 3899 verifyFormat("call(parameter, {\n" 3900 " something();\n" 3901 " // Comment using all columns.\n" 3902 " somethingelse();\n" 3903 "});", 3904 getLLVMStyleWithColumns(40)); 3905 verifyFormat("DEBUG( //\n" 3906 " { f(); }, a);"); 3907 verifyFormat("DEBUG( //\n" 3908 " {\n" 3909 " f(); //\n" 3910 " },\n" 3911 " a);"); 3912 3913 EXPECT_EQ("call(parameter, {\n" 3914 " something();\n" 3915 " // Comment too\n" 3916 " // looooooooooong.\n" 3917 " somethingElse();\n" 3918 "});", 3919 format("call(parameter, {\n" 3920 " something();\n" 3921 " // Comment too looooooooooong.\n" 3922 " somethingElse();\n" 3923 "});", 3924 getLLVMStyleWithColumns(29))); 3925 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3926 EXPECT_EQ("DEBUG({ // comment\n" 3927 " int i;\n" 3928 "});", 3929 format("DEBUG({ // comment\n" 3930 "int i;\n" 3931 "});")); 3932 EXPECT_EQ("DEBUG({\n" 3933 " int i;\n" 3934 "\n" 3935 " // comment\n" 3936 " int j;\n" 3937 "});", 3938 format("DEBUG({\n" 3939 " int i;\n" 3940 "\n" 3941 " // comment\n" 3942 " int j;\n" 3943 "});")); 3944 3945 verifyFormat("DEBUG({\n" 3946 " if (a)\n" 3947 " return;\n" 3948 "});"); 3949 verifyGoogleFormat("DEBUG({\n" 3950 " if (a) return;\n" 3951 "});"); 3952 FormatStyle Style = getGoogleStyle(); 3953 Style.ColumnLimit = 45; 3954 verifyFormat("Debug(\n" 3955 " aaaaa,\n" 3956 " {\n" 3957 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3958 " },\n" 3959 " a);", 3960 Style); 3961 3962 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3963 3964 verifyNoCrash("^{v^{a}}"); 3965 } 3966 3967 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3968 EXPECT_EQ("#define MACRO() \\\n" 3969 " Debug(aaa, /* force line break */ \\\n" 3970 " { \\\n" 3971 " int i; \\\n" 3972 " int j; \\\n" 3973 " })", 3974 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3975 " { int i; int j; })", 3976 getGoogleStyle())); 3977 3978 EXPECT_EQ("#define A \\\n" 3979 " [] { \\\n" 3980 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3981 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3982 " }", 3983 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3984 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3985 getGoogleStyle())); 3986 } 3987 3988 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3989 EXPECT_EQ("{}", format("{}")); 3990 verifyFormat("enum E {};"); 3991 verifyFormat("enum E {}"); 3992 FormatStyle Style = getLLVMStyle(); 3993 Style.SpaceInEmptyBlock = true; 3994 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 3995 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 3996 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 3997 } 3998 3999 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 4000 FormatStyle Style = getLLVMStyle(); 4001 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 4002 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 4003 verifyFormat("FOO_BEGIN\n" 4004 " FOO_ENTRY\n" 4005 "FOO_END", 4006 Style); 4007 verifyFormat("FOO_BEGIN\n" 4008 " NESTED_FOO_BEGIN\n" 4009 " NESTED_FOO_ENTRY\n" 4010 " NESTED_FOO_END\n" 4011 "FOO_END", 4012 Style); 4013 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 4014 " int x;\n" 4015 " x = 1;\n" 4016 "FOO_END(Baz)", 4017 Style); 4018 } 4019 4020 //===----------------------------------------------------------------------===// 4021 // Line break tests. 4022 //===----------------------------------------------------------------------===// 4023 4024 TEST_F(FormatTest, PreventConfusingIndents) { 4025 verifyFormat( 4026 "void f() {\n" 4027 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 4028 " parameter, parameter, parameter)),\n" 4029 " SecondLongCall(parameter));\n" 4030 "}"); 4031 verifyFormat( 4032 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4033 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4034 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4035 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 4036 verifyFormat( 4037 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4038 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 4039 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 4040 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 4041 verifyFormat( 4042 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 4043 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 4044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 4045 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 4046 verifyFormat("int a = bbbb && ccc &&\n" 4047 " fffff(\n" 4048 "#define A Just forcing a new line\n" 4049 " ddd);"); 4050 } 4051 4052 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 4053 verifyFormat( 4054 "bool aaaaaaa =\n" 4055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 4056 " bbbbbbbb();"); 4057 verifyFormat( 4058 "bool aaaaaaa =\n" 4059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 4060 " bbbbbbbb();"); 4061 4062 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 4064 " ccccccccc == ddddddddddd;"); 4065 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 4067 " ccccccccc == ddddddddddd;"); 4068 verifyFormat( 4069 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 4070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 4071 " ccccccccc == ddddddddddd;"); 4072 4073 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4074 " aaaaaa) &&\n" 4075 " bbbbbb && cccccc;"); 4076 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4077 " aaaaaa) >>\n" 4078 " bbbbbb;"); 4079 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 4080 " SourceMgr.getSpellingColumnNumber(\n" 4081 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 4082 " 1);"); 4083 4084 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4085 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 4086 " cccccc) {\n}"); 4087 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4088 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4089 " cccccc) {\n}"); 4090 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4091 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4092 " cccccc) {\n}"); 4093 verifyFormat("b = a &&\n" 4094 " // Comment\n" 4095 " b.c && d;"); 4096 4097 // If the LHS of a comparison is not a binary expression itself, the 4098 // additional linebreak confuses many people. 4099 verifyFormat( 4100 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4101 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 4102 "}"); 4103 verifyFormat( 4104 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4106 "}"); 4107 verifyFormat( 4108 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 4109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4110 "}"); 4111 verifyFormat( 4112 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 4114 "}"); 4115 // Even explicit parentheses stress the precedence enough to make the 4116 // additional break unnecessary. 4117 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4119 "}"); 4120 // This cases is borderline, but with the indentation it is still readable. 4121 verifyFormat( 4122 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4123 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4125 "}", 4126 getLLVMStyleWithColumns(75)); 4127 4128 // If the LHS is a binary expression, we should still use the additional break 4129 // as otherwise the formatting hides the operator precedence. 4130 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4132 " 5) {\n" 4133 "}"); 4134 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4135 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4136 " 5) {\n" 4137 "}"); 4138 4139 FormatStyle OnePerLine = getLLVMStyle(); 4140 OnePerLine.BinPackParameters = false; 4141 verifyFormat( 4142 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4145 OnePerLine); 4146 4147 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4148 " .aaa(aaaaaaaaaaaaa) *\n" 4149 " aaaaaaa +\n" 4150 " aaaaaaa;", 4151 getLLVMStyleWithColumns(40)); 4152 } 4153 4154 TEST_F(FormatTest, ExpressionIndentation) { 4155 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4159 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4160 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4161 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4163 " ccccccccccccccccccccccccccccccccccccccccc;"); 4164 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4165 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4167 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4168 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4169 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4171 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4172 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4173 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4175 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4176 verifyFormat("if () {\n" 4177 "} else if (aaaaa && bbbbb > // break\n" 4178 " ccccc) {\n" 4179 "}"); 4180 verifyFormat("if () {\n" 4181 "} else if constexpr (aaaaa && bbbbb > // break\n" 4182 " ccccc) {\n" 4183 "}"); 4184 verifyFormat("if () {\n" 4185 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4186 " ccccc) {\n" 4187 "}"); 4188 verifyFormat("if () {\n" 4189 "} else if (aaaaa &&\n" 4190 " bbbbb > // break\n" 4191 " ccccc &&\n" 4192 " ddddd) {\n" 4193 "}"); 4194 4195 // Presence of a trailing comment used to change indentation of b. 4196 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4197 " b;\n" 4198 "return aaaaaaaaaaaaaaaaaaa +\n" 4199 " b; //", 4200 getLLVMStyleWithColumns(30)); 4201 } 4202 4203 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4204 // Not sure what the best system is here. Like this, the LHS can be found 4205 // immediately above an operator (everything with the same or a higher 4206 // indent). The RHS is aligned right of the operator and so compasses 4207 // everything until something with the same indent as the operator is found. 4208 // FIXME: Is this a good system? 4209 FormatStyle Style = getLLVMStyle(); 4210 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4211 verifyFormat( 4212 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4213 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4214 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4215 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4216 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4217 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4218 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4219 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4220 " > ccccccccccccccccccccccccccccccccccccccccc;", 4221 Style); 4222 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4223 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4224 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4225 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4226 Style); 4227 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4228 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4229 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4230 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4231 Style); 4232 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4233 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4234 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4235 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4236 Style); 4237 verifyFormat("if () {\n" 4238 "} else if (aaaaa\n" 4239 " && bbbbb // break\n" 4240 " > ccccc) {\n" 4241 "}", 4242 Style); 4243 verifyFormat("return (a)\n" 4244 " // comment\n" 4245 " + b;", 4246 Style); 4247 verifyFormat( 4248 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4249 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4250 " + cc;", 4251 Style); 4252 4253 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4254 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4255 Style); 4256 4257 // Forced by comments. 4258 verifyFormat( 4259 "unsigned ContentSize =\n" 4260 " sizeof(int16_t) // DWARF ARange version number\n" 4261 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4262 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4263 " + sizeof(int8_t); // Segment Size (in bytes)"); 4264 4265 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4266 " == boost::fusion::at_c<1>(iiii).second;", 4267 Style); 4268 4269 Style.ColumnLimit = 60; 4270 verifyFormat("zzzzzzzzzz\n" 4271 " = bbbbbbbbbbbbbbbbb\n" 4272 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4273 Style); 4274 4275 Style.ColumnLimit = 80; 4276 Style.IndentWidth = 4; 4277 Style.TabWidth = 4; 4278 Style.UseTab = FormatStyle::UT_Always; 4279 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4280 Style.AlignOperands = false; 4281 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4282 "\t&& (someOtherLongishConditionPart1\n" 4283 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4284 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4285 "(someOtherLongishConditionPart1 || " 4286 "someOtherEvenLongerNestedConditionPart2);", 4287 Style)); 4288 } 4289 4290 TEST_F(FormatTest, EnforcedOperatorWraps) { 4291 // Here we'd like to wrap after the || operators, but a comment is forcing an 4292 // earlier wrap. 4293 verifyFormat("bool x = aaaaa //\n" 4294 " || bbbbb\n" 4295 " //\n" 4296 " || cccc;"); 4297 } 4298 4299 TEST_F(FormatTest, NoOperandAlignment) { 4300 FormatStyle Style = getLLVMStyle(); 4301 Style.AlignOperands = false; 4302 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4305 Style); 4306 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4307 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4308 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4309 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4310 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4311 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4312 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4313 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4314 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4315 " > ccccccccccccccccccccccccccccccccccccccccc;", 4316 Style); 4317 4318 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4319 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4320 " + cc;", 4321 Style); 4322 verifyFormat("int a = aa\n" 4323 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4324 " * cccccccccccccccccccccccccccccccccccc;\n", 4325 Style); 4326 4327 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4328 verifyFormat("return (a > b\n" 4329 " // comment1\n" 4330 " // comment2\n" 4331 " || c);", 4332 Style); 4333 } 4334 4335 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4336 FormatStyle Style = getLLVMStyle(); 4337 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4338 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4340 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4341 Style); 4342 } 4343 4344 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4345 FormatStyle Style = getLLVMStyle(); 4346 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4347 Style.BinPackArguments = false; 4348 Style.ColumnLimit = 40; 4349 verifyFormat("void test() {\n" 4350 " someFunction(\n" 4351 " this + argument + is + quite\n" 4352 " + long + so + it + gets + wrapped\n" 4353 " + but + remains + bin - packed);\n" 4354 "}", 4355 Style); 4356 verifyFormat("void test() {\n" 4357 " someFunction(arg1,\n" 4358 " this + argument + is\n" 4359 " + quite + long + so\n" 4360 " + it + gets + wrapped\n" 4361 " + but + remains + bin\n" 4362 " - packed,\n" 4363 " arg3);\n" 4364 "}", 4365 Style); 4366 verifyFormat("void test() {\n" 4367 " someFunction(\n" 4368 " arg1,\n" 4369 " this + argument + has\n" 4370 " + anotherFunc(nested,\n" 4371 " calls + whose\n" 4372 " + arguments\n" 4373 " + are + also\n" 4374 " + wrapped,\n" 4375 " in + addition)\n" 4376 " + to + being + bin - packed,\n" 4377 " arg3);\n" 4378 "}", 4379 Style); 4380 4381 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4382 verifyFormat("void test() {\n" 4383 " someFunction(\n" 4384 " arg1,\n" 4385 " this + argument + has +\n" 4386 " anotherFunc(nested,\n" 4387 " calls + whose +\n" 4388 " arguments +\n" 4389 " are + also +\n" 4390 " wrapped,\n" 4391 " in + addition) +\n" 4392 " to + being + bin - packed,\n" 4393 " arg3);\n" 4394 "}", 4395 Style); 4396 } 4397 4398 TEST_F(FormatTest, ConstructorInitializers) { 4399 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4400 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4401 getLLVMStyleWithColumns(45)); 4402 verifyFormat("Constructor()\n" 4403 " : Inttializer(FitsOnTheLine) {}", 4404 getLLVMStyleWithColumns(44)); 4405 verifyFormat("Constructor()\n" 4406 " : Inttializer(FitsOnTheLine) {}", 4407 getLLVMStyleWithColumns(43)); 4408 4409 verifyFormat("template <typename T>\n" 4410 "Constructor() : Initializer(FitsOnTheLine) {}", 4411 getLLVMStyleWithColumns(45)); 4412 4413 verifyFormat( 4414 "SomeClass::Constructor()\n" 4415 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4416 4417 verifyFormat( 4418 "SomeClass::Constructor()\n" 4419 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4420 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4421 verifyFormat( 4422 "SomeClass::Constructor()\n" 4423 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4424 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4425 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4426 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4427 " : aaaaaaaaaa(aaaaaa) {}"); 4428 4429 verifyFormat("Constructor()\n" 4430 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4431 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4432 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4433 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4434 4435 verifyFormat("Constructor()\n" 4436 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4438 4439 verifyFormat("Constructor(int Parameter = 0)\n" 4440 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4441 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4442 verifyFormat("Constructor()\n" 4443 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4444 "}", 4445 getLLVMStyleWithColumns(60)); 4446 verifyFormat("Constructor()\n" 4447 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4448 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4449 4450 // Here a line could be saved by splitting the second initializer onto two 4451 // lines, but that is not desirable. 4452 verifyFormat("Constructor()\n" 4453 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4454 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4455 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4456 4457 FormatStyle OnePerLine = getLLVMStyle(); 4458 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4459 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4460 verifyFormat("SomeClass::Constructor()\n" 4461 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4462 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4463 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4464 OnePerLine); 4465 verifyFormat("SomeClass::Constructor()\n" 4466 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4467 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4468 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4469 OnePerLine); 4470 verifyFormat("MyClass::MyClass(int var)\n" 4471 " : some_var_(var), // 4 space indent\n" 4472 " some_other_var_(var + 1) { // lined up\n" 4473 "}", 4474 OnePerLine); 4475 verifyFormat("Constructor()\n" 4476 " : aaaaa(aaaaaa),\n" 4477 " aaaaa(aaaaaa),\n" 4478 " aaaaa(aaaaaa),\n" 4479 " aaaaa(aaaaaa),\n" 4480 " aaaaa(aaaaaa) {}", 4481 OnePerLine); 4482 verifyFormat("Constructor()\n" 4483 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4484 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4485 OnePerLine); 4486 OnePerLine.BinPackParameters = false; 4487 verifyFormat( 4488 "Constructor()\n" 4489 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4490 " aaaaaaaaaaa().aaa(),\n" 4491 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4492 OnePerLine); 4493 OnePerLine.ColumnLimit = 60; 4494 verifyFormat("Constructor()\n" 4495 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4496 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4497 OnePerLine); 4498 4499 EXPECT_EQ("Constructor()\n" 4500 " : // Comment forcing unwanted break.\n" 4501 " aaaa(aaaa) {}", 4502 format("Constructor() :\n" 4503 " // Comment forcing unwanted break.\n" 4504 " aaaa(aaaa) {}")); 4505 } 4506 4507 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4508 FormatStyle Style = getLLVMStyle(); 4509 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4510 Style.ColumnLimit = 60; 4511 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4512 Style.AllowAllConstructorInitializersOnNextLine = true; 4513 Style.BinPackParameters = false; 4514 4515 for (int i = 0; i < 4; ++i) { 4516 // Test all combinations of parameters that should not have an effect. 4517 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4518 Style.AllowAllArgumentsOnNextLine = i & 2; 4519 4520 Style.AllowAllConstructorInitializersOnNextLine = true; 4521 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4522 verifyFormat("Constructor()\n" 4523 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4524 Style); 4525 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4526 4527 Style.AllowAllConstructorInitializersOnNextLine = false; 4528 verifyFormat("Constructor()\n" 4529 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4530 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4531 Style); 4532 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4533 4534 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4535 Style.AllowAllConstructorInitializersOnNextLine = true; 4536 verifyFormat("Constructor()\n" 4537 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4538 Style); 4539 4540 Style.AllowAllConstructorInitializersOnNextLine = false; 4541 verifyFormat("Constructor()\n" 4542 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4543 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4544 Style); 4545 4546 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4547 Style.AllowAllConstructorInitializersOnNextLine = true; 4548 verifyFormat("Constructor() :\n" 4549 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4550 Style); 4551 4552 Style.AllowAllConstructorInitializersOnNextLine = false; 4553 verifyFormat("Constructor() :\n" 4554 " aaaaaaaaaaaaaaaaaa(a),\n" 4555 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4556 Style); 4557 } 4558 4559 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4560 // AllowAllConstructorInitializersOnNextLine in all 4561 // BreakConstructorInitializers modes 4562 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4563 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4564 Style.AllowAllConstructorInitializersOnNextLine = false; 4565 verifyFormat("SomeClassWithALongName::Constructor(\n" 4566 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4567 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4568 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4569 Style); 4570 4571 Style.AllowAllConstructorInitializersOnNextLine = true; 4572 verifyFormat("SomeClassWithALongName::Constructor(\n" 4573 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4574 " int bbbbbbbbbbbbb,\n" 4575 " int cccccccccccccccc)\n" 4576 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4577 Style); 4578 4579 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4580 Style.AllowAllConstructorInitializersOnNextLine = false; 4581 verifyFormat("SomeClassWithALongName::Constructor(\n" 4582 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4583 " int bbbbbbbbbbbbb)\n" 4584 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4585 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4586 Style); 4587 4588 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4589 4590 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4591 verifyFormat("SomeClassWithALongName::Constructor(\n" 4592 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4593 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4594 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4595 Style); 4596 4597 Style.AllowAllConstructorInitializersOnNextLine = true; 4598 verifyFormat("SomeClassWithALongName::Constructor(\n" 4599 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4600 " int bbbbbbbbbbbbb,\n" 4601 " int cccccccccccccccc)\n" 4602 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4603 Style); 4604 4605 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4606 Style.AllowAllConstructorInitializersOnNextLine = false; 4607 verifyFormat("SomeClassWithALongName::Constructor(\n" 4608 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4609 " int bbbbbbbbbbbbb)\n" 4610 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4611 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4612 Style); 4613 4614 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4615 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4616 verifyFormat("SomeClassWithALongName::Constructor(\n" 4617 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4618 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4619 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4620 Style); 4621 4622 Style.AllowAllConstructorInitializersOnNextLine = true; 4623 verifyFormat("SomeClassWithALongName::Constructor(\n" 4624 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4625 " int bbbbbbbbbbbbb,\n" 4626 " int cccccccccccccccc) :\n" 4627 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4628 Style); 4629 4630 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4631 Style.AllowAllConstructorInitializersOnNextLine = false; 4632 verifyFormat("SomeClassWithALongName::Constructor(\n" 4633 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4634 " int bbbbbbbbbbbbb) :\n" 4635 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4636 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4637 Style); 4638 } 4639 4640 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4641 FormatStyle Style = getLLVMStyle(); 4642 Style.ColumnLimit = 60; 4643 Style.BinPackArguments = false; 4644 for (int i = 0; i < 4; ++i) { 4645 // Test all combinations of parameters that should not have an effect. 4646 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4647 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4648 4649 Style.AllowAllArgumentsOnNextLine = true; 4650 verifyFormat("void foo() {\n" 4651 " FunctionCallWithReallyLongName(\n" 4652 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4653 "}", 4654 Style); 4655 Style.AllowAllArgumentsOnNextLine = false; 4656 verifyFormat("void foo() {\n" 4657 " FunctionCallWithReallyLongName(\n" 4658 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4659 " bbbbbbbbbbbb);\n" 4660 "}", 4661 Style); 4662 4663 Style.AllowAllArgumentsOnNextLine = true; 4664 verifyFormat("void foo() {\n" 4665 " auto VariableWithReallyLongName = {\n" 4666 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4667 "}", 4668 Style); 4669 Style.AllowAllArgumentsOnNextLine = false; 4670 verifyFormat("void foo() {\n" 4671 " auto VariableWithReallyLongName = {\n" 4672 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4673 " bbbbbbbbbbbb};\n" 4674 "}", 4675 Style); 4676 } 4677 4678 // This parameter should not affect declarations. 4679 Style.BinPackParameters = false; 4680 Style.AllowAllArgumentsOnNextLine = false; 4681 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4682 verifyFormat("void FunctionCallWithReallyLongName(\n" 4683 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4684 Style); 4685 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4686 verifyFormat("void FunctionCallWithReallyLongName(\n" 4687 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4688 " int bbbbbbbbbbbb);", 4689 Style); 4690 } 4691 4692 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4693 FormatStyle Style = getLLVMStyle(); 4694 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4695 4696 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4697 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4698 getStyleWithColumns(Style, 45)); 4699 verifyFormat("Constructor() :\n" 4700 " Initializer(FitsOnTheLine) {}", 4701 getStyleWithColumns(Style, 44)); 4702 verifyFormat("Constructor() :\n" 4703 " Initializer(FitsOnTheLine) {}", 4704 getStyleWithColumns(Style, 43)); 4705 4706 verifyFormat("template <typename T>\n" 4707 "Constructor() : Initializer(FitsOnTheLine) {}", 4708 getStyleWithColumns(Style, 50)); 4709 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4710 verifyFormat( 4711 "SomeClass::Constructor() :\n" 4712 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4713 Style); 4714 4715 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4716 verifyFormat( 4717 "SomeClass::Constructor() :\n" 4718 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4719 Style); 4720 4721 verifyFormat( 4722 "SomeClass::Constructor() :\n" 4723 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4724 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4725 Style); 4726 verifyFormat( 4727 "SomeClass::Constructor() :\n" 4728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4729 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4730 Style); 4731 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4732 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4733 " aaaaaaaaaa(aaaaaa) {}", 4734 Style); 4735 4736 verifyFormat("Constructor() :\n" 4737 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4738 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4739 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4740 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4741 Style); 4742 4743 verifyFormat("Constructor() :\n" 4744 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4746 Style); 4747 4748 verifyFormat("Constructor(int Parameter = 0) :\n" 4749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4750 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4751 Style); 4752 verifyFormat("Constructor() :\n" 4753 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4754 "}", 4755 getStyleWithColumns(Style, 60)); 4756 verifyFormat("Constructor() :\n" 4757 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4758 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4759 Style); 4760 4761 // Here a line could be saved by splitting the second initializer onto two 4762 // lines, but that is not desirable. 4763 verifyFormat("Constructor() :\n" 4764 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4765 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4766 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4767 Style); 4768 4769 FormatStyle OnePerLine = Style; 4770 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4771 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4772 verifyFormat("SomeClass::Constructor() :\n" 4773 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4774 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4775 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4776 OnePerLine); 4777 verifyFormat("SomeClass::Constructor() :\n" 4778 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4779 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4780 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4781 OnePerLine); 4782 verifyFormat("MyClass::MyClass(int var) :\n" 4783 " some_var_(var), // 4 space indent\n" 4784 " some_other_var_(var + 1) { // lined up\n" 4785 "}", 4786 OnePerLine); 4787 verifyFormat("Constructor() :\n" 4788 " aaaaa(aaaaaa),\n" 4789 " aaaaa(aaaaaa),\n" 4790 " aaaaa(aaaaaa),\n" 4791 " aaaaa(aaaaaa),\n" 4792 " aaaaa(aaaaaa) {}", 4793 OnePerLine); 4794 verifyFormat("Constructor() :\n" 4795 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4796 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4797 OnePerLine); 4798 OnePerLine.BinPackParameters = false; 4799 verifyFormat("Constructor() :\n" 4800 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4801 " aaaaaaaaaaa().aaa(),\n" 4802 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4803 OnePerLine); 4804 OnePerLine.ColumnLimit = 60; 4805 verifyFormat("Constructor() :\n" 4806 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4807 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4808 OnePerLine); 4809 4810 EXPECT_EQ("Constructor() :\n" 4811 " // Comment forcing unwanted break.\n" 4812 " aaaa(aaaa) {}", 4813 format("Constructor() :\n" 4814 " // Comment forcing unwanted break.\n" 4815 " aaaa(aaaa) {}", 4816 Style)); 4817 4818 Style.ColumnLimit = 0; 4819 verifyFormat("SomeClass::Constructor() :\n" 4820 " a(a) {}", 4821 Style); 4822 verifyFormat("SomeClass::Constructor() noexcept :\n" 4823 " a(a) {}", 4824 Style); 4825 verifyFormat("SomeClass::Constructor() :\n" 4826 " a(a), b(b), c(c) {}", 4827 Style); 4828 verifyFormat("SomeClass::Constructor() :\n" 4829 " a(a) {\n" 4830 " foo();\n" 4831 " bar();\n" 4832 "}", 4833 Style); 4834 4835 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4836 verifyFormat("SomeClass::Constructor() :\n" 4837 " a(a), b(b), c(c) {\n" 4838 "}", 4839 Style); 4840 verifyFormat("SomeClass::Constructor() :\n" 4841 " a(a) {\n" 4842 "}", 4843 Style); 4844 4845 Style.ColumnLimit = 80; 4846 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4847 Style.ConstructorInitializerIndentWidth = 2; 4848 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 4849 verifyFormat("SomeClass::Constructor() :\n" 4850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4851 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4852 Style); 4853 4854 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 4855 // well 4856 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4857 verifyFormat( 4858 "class SomeClass\n" 4859 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4860 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4861 Style); 4862 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4863 verifyFormat( 4864 "class SomeClass\n" 4865 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4866 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4867 Style); 4868 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4869 verifyFormat( 4870 "class SomeClass :\n" 4871 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4872 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4873 Style); 4874 } 4875 4876 #ifndef EXPENSIVE_CHECKS 4877 // Expensive checks enables libstdc++ checking which includes validating the 4878 // state of ranges used in std::priority_queue - this blows out the 4879 // runtime/scalability of the function and makes this test unacceptably slow. 4880 TEST_F(FormatTest, MemoizationTests) { 4881 // This breaks if the memoization lookup does not take \c Indent and 4882 // \c LastSpace into account. 4883 verifyFormat( 4884 "extern CFRunLoopTimerRef\n" 4885 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4886 " CFTimeInterval interval, CFOptionFlags flags,\n" 4887 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4888 " CFRunLoopTimerContext *context) {}"); 4889 4890 // Deep nesting somewhat works around our memoization. 4891 verifyFormat( 4892 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4893 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4894 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4895 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4896 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4897 getLLVMStyleWithColumns(65)); 4898 verifyFormat( 4899 "aaaaa(\n" 4900 " aaaaa,\n" 4901 " aaaaa(\n" 4902 " aaaaa,\n" 4903 " aaaaa(\n" 4904 " aaaaa,\n" 4905 " aaaaa(\n" 4906 " aaaaa,\n" 4907 " aaaaa(\n" 4908 " aaaaa,\n" 4909 " aaaaa(\n" 4910 " aaaaa,\n" 4911 " aaaaa(\n" 4912 " aaaaa,\n" 4913 " aaaaa(\n" 4914 " aaaaa,\n" 4915 " aaaaa(\n" 4916 " aaaaa,\n" 4917 " aaaaa(\n" 4918 " aaaaa,\n" 4919 " aaaaa(\n" 4920 " aaaaa,\n" 4921 " aaaaa(\n" 4922 " aaaaa,\n" 4923 " aaaaa))))))))))));", 4924 getLLVMStyleWithColumns(65)); 4925 verifyFormat( 4926 "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" 4927 " a),\n" 4928 " a),\n" 4929 " a),\n" 4930 " a),\n" 4931 " a),\n" 4932 " a),\n" 4933 " a),\n" 4934 " a),\n" 4935 " a),\n" 4936 " a),\n" 4937 " a),\n" 4938 " a),\n" 4939 " a),\n" 4940 " a),\n" 4941 " a),\n" 4942 " a),\n" 4943 " a)", 4944 getLLVMStyleWithColumns(65)); 4945 4946 // This test takes VERY long when memoization is broken. 4947 FormatStyle OnePerLine = getLLVMStyle(); 4948 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4949 OnePerLine.BinPackParameters = false; 4950 std::string input = "Constructor()\n" 4951 " : aaaa(a,\n"; 4952 for (unsigned i = 0, e = 80; i != e; ++i) { 4953 input += " a,\n"; 4954 } 4955 input += " a) {}"; 4956 verifyFormat(input, OnePerLine); 4957 } 4958 #endif 4959 4960 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4961 verifyFormat( 4962 "void f() {\n" 4963 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4964 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4965 " f();\n" 4966 "}"); 4967 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4968 " Intervals[i - 1].getRange().getLast()) {\n}"); 4969 } 4970 4971 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4972 // Principially, we break function declarations in a certain order: 4973 // 1) break amongst arguments. 4974 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 4975 " Cccccccccccccc cccccccccccccc);"); 4976 verifyFormat("template <class TemplateIt>\n" 4977 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 4978 " TemplateIt *stop) {}"); 4979 4980 // 2) break after return type. 4981 verifyFormat( 4982 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4983 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 4984 getGoogleStyle()); 4985 4986 // 3) break after (. 4987 verifyFormat( 4988 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 4989 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 4990 getGoogleStyle()); 4991 4992 // 4) break before after nested name specifiers. 4993 verifyFormat( 4994 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4995 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 4996 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 4997 getGoogleStyle()); 4998 4999 // However, there are exceptions, if a sufficient amount of lines can be 5000 // saved. 5001 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 5002 // more adjusting. 5003 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5004 " Cccccccccccccc cccccccccc,\n" 5005 " Cccccccccccccc cccccccccc,\n" 5006 " Cccccccccccccc cccccccccc,\n" 5007 " Cccccccccccccc cccccccccc);"); 5008 verifyFormat( 5009 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5010 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5011 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5012 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 5013 getGoogleStyle()); 5014 verifyFormat( 5015 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5016 " Cccccccccccccc cccccccccc,\n" 5017 " Cccccccccccccc cccccccccc,\n" 5018 " Cccccccccccccc cccccccccc,\n" 5019 " Cccccccccccccc cccccccccc,\n" 5020 " Cccccccccccccc cccccccccc,\n" 5021 " Cccccccccccccc cccccccccc);"); 5022 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5023 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5024 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5025 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5026 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 5027 5028 // Break after multi-line parameters. 5029 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5032 " bbbb bbbb);"); 5033 verifyFormat("void SomeLoooooooooooongFunction(\n" 5034 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5035 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5036 " int bbbbbbbbbbbbb);"); 5037 5038 // Treat overloaded operators like other functions. 5039 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5040 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 5041 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5042 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 5043 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5044 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 5045 verifyGoogleFormat( 5046 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 5047 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5048 verifyGoogleFormat( 5049 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 5050 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5051 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5052 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5053 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 5054 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5055 verifyGoogleFormat( 5056 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 5057 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5058 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 5059 verifyGoogleFormat("template <typename T>\n" 5060 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5061 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 5062 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 5063 5064 FormatStyle Style = getLLVMStyle(); 5065 Style.PointerAlignment = FormatStyle::PAS_Left; 5066 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5067 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 5068 Style); 5069 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 5070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5071 Style); 5072 } 5073 5074 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 5075 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 5076 // Prefer keeping `::` followed by `operator` together. 5077 EXPECT_EQ("const aaaa::bbbbbbb &\n" 5078 "ccccccccc::operator++() {\n" 5079 " stuff();\n" 5080 "}", 5081 format("const aaaa::bbbbbbb\n" 5082 "&ccccccccc::operator++() { stuff(); }", 5083 getLLVMStyleWithColumns(40))); 5084 } 5085 5086 TEST_F(FormatTest, TrailingReturnType) { 5087 verifyFormat("auto foo() -> int;\n"); 5088 // correct trailing return type spacing 5089 verifyFormat("auto operator->() -> int;\n"); 5090 verifyFormat("auto operator++(int) -> int;\n"); 5091 5092 verifyFormat("struct S {\n" 5093 " auto bar() const -> int;\n" 5094 "};"); 5095 verifyFormat("template <size_t Order, typename T>\n" 5096 "auto load_img(const std::string &filename)\n" 5097 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5098 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5099 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5100 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5101 verifyFormat("template <typename T>\n" 5102 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5103 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5104 5105 // Not trailing return types. 5106 verifyFormat("void f() { auto a = b->c(); }"); 5107 } 5108 5109 TEST_F(FormatTest, DeductionGuides) { 5110 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5111 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5112 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5113 verifyFormat( 5114 "template <class... T>\n" 5115 "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5116 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5117 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5118 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5119 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5120 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5121 verifyFormat("template <class T> x() -> x<1>;"); 5122 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5123 5124 // Ensure not deduction guides. 5125 verifyFormat("c()->f<int>();"); 5126 verifyFormat("x()->foo<1>;"); 5127 verifyFormat("x = p->foo<3>();"); 5128 verifyFormat("x()->x<1>();"); 5129 verifyFormat("x()->x<1>;"); 5130 } 5131 5132 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5133 // Avoid breaking before trailing 'const' or other trailing annotations, if 5134 // they are not function-like. 5135 FormatStyle Style = getGoogleStyle(); 5136 Style.ColumnLimit = 47; 5137 verifyFormat("void someLongFunction(\n" 5138 " int someLoooooooooooooongParameter) const {\n}", 5139 getLLVMStyleWithColumns(47)); 5140 verifyFormat("LoooooongReturnType\n" 5141 "someLoooooooongFunction() const {}", 5142 getLLVMStyleWithColumns(47)); 5143 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5144 " const {}", 5145 Style); 5146 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5147 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5148 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5149 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5150 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5151 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5152 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5153 " aaaaaaaaaaa aaaaa) const override;"); 5154 verifyGoogleFormat( 5155 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5156 " const override;"); 5157 5158 // Even if the first parameter has to be wrapped. 5159 verifyFormat("void someLongFunction(\n" 5160 " int someLongParameter) const {}", 5161 getLLVMStyleWithColumns(46)); 5162 verifyFormat("void someLongFunction(\n" 5163 " int someLongParameter) const {}", 5164 Style); 5165 verifyFormat("void someLongFunction(\n" 5166 " int someLongParameter) override {}", 5167 Style); 5168 verifyFormat("void someLongFunction(\n" 5169 " int someLongParameter) OVERRIDE {}", 5170 Style); 5171 verifyFormat("void someLongFunction(\n" 5172 " int someLongParameter) final {}", 5173 Style); 5174 verifyFormat("void someLongFunction(\n" 5175 " int someLongParameter) FINAL {}", 5176 Style); 5177 verifyFormat("void someLongFunction(\n" 5178 " int parameter) const override {}", 5179 Style); 5180 5181 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5182 verifyFormat("void someLongFunction(\n" 5183 " int someLongParameter) const\n" 5184 "{\n" 5185 "}", 5186 Style); 5187 5188 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5189 verifyFormat("void someLongFunction(\n" 5190 " int someLongParameter) const\n" 5191 " {\n" 5192 " }", 5193 Style); 5194 5195 // Unless these are unknown annotations. 5196 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5197 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5198 " LONG_AND_UGLY_ANNOTATION;"); 5199 5200 // Breaking before function-like trailing annotations is fine to keep them 5201 // close to their arguments. 5202 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5203 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5204 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5205 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5206 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5207 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5208 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5209 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5210 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5211 5212 verifyFormat( 5213 "void aaaaaaaaaaaaaaaaaa()\n" 5214 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5215 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5216 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5217 " __attribute__((unused));"); 5218 verifyGoogleFormat( 5219 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5220 " GUARDED_BY(aaaaaaaaaaaa);"); 5221 verifyGoogleFormat( 5222 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5223 " GUARDED_BY(aaaaaaaaaaaa);"); 5224 verifyGoogleFormat( 5225 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5226 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5227 verifyGoogleFormat( 5228 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5229 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5230 } 5231 5232 TEST_F(FormatTest, FunctionAnnotations) { 5233 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5234 "int OldFunction(const string ¶meter) {}"); 5235 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5236 "string OldFunction(const string ¶meter) {}"); 5237 verifyFormat("template <typename T>\n" 5238 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5239 "string OldFunction(const string ¶meter) {}"); 5240 5241 // Not function annotations. 5242 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5243 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5244 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5245 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5246 verifyFormat("MACRO(abc).function() // wrap\n" 5247 " << abc;"); 5248 verifyFormat("MACRO(abc)->function() // wrap\n" 5249 " << abc;"); 5250 verifyFormat("MACRO(abc)::function() // wrap\n" 5251 " << abc;"); 5252 } 5253 5254 TEST_F(FormatTest, BreaksDesireably) { 5255 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5256 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5257 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5258 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5259 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5260 "}"); 5261 5262 verifyFormat( 5263 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5265 5266 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5267 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5269 5270 verifyFormat( 5271 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5272 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5274 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5276 5277 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5278 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5279 5280 verifyFormat( 5281 "void f() {\n" 5282 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5284 "}"); 5285 verifyFormat( 5286 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5288 verifyFormat( 5289 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5291 verifyFormat( 5292 "aaaaaa(aaa,\n" 5293 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5295 " aaaa);"); 5296 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5299 5300 // Indent consistently independent of call expression and unary operator. 5301 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5302 " dddddddddddddddddddddddddddddd));"); 5303 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5304 " dddddddddddddddddddddddddddddd));"); 5305 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5306 " dddddddddddddddddddddddddddddd));"); 5307 5308 // This test case breaks on an incorrect memoization, i.e. an optimization not 5309 // taking into account the StopAt value. 5310 verifyFormat( 5311 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5312 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5313 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5314 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5315 5316 verifyFormat("{\n {\n {\n" 5317 " Annotation.SpaceRequiredBefore =\n" 5318 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5319 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5320 " }\n }\n}"); 5321 5322 // Break on an outer level if there was a break on an inner level. 5323 EXPECT_EQ("f(g(h(a, // comment\n" 5324 " b, c),\n" 5325 " d, e),\n" 5326 " x, y);", 5327 format("f(g(h(a, // comment\n" 5328 " b, c), d, e), x, y);")); 5329 5330 // Prefer breaking similar line breaks. 5331 verifyFormat( 5332 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5333 " NSTrackingMouseEnteredAndExited |\n" 5334 " NSTrackingActiveAlways;"); 5335 } 5336 5337 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5338 FormatStyle NoBinPacking = getGoogleStyle(); 5339 NoBinPacking.BinPackParameters = false; 5340 NoBinPacking.BinPackArguments = true; 5341 verifyFormat("void f() {\n" 5342 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5344 "}", 5345 NoBinPacking); 5346 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5347 " int aaaaaaaaaaaaaaaaaaaa,\n" 5348 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5349 NoBinPacking); 5350 5351 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5352 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5353 " vector<int> bbbbbbbbbbbbbbb);", 5354 NoBinPacking); 5355 // FIXME: This behavior difference is probably not wanted. However, currently 5356 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5357 // template arguments from BreakBeforeParameter being set because of the 5358 // one-per-line formatting. 5359 verifyFormat( 5360 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5361 " aaaaaaaaaa> aaaaaaaaaa);", 5362 NoBinPacking); 5363 verifyFormat( 5364 "void fffffffffff(\n" 5365 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5366 " aaaaaaaaaa);"); 5367 } 5368 5369 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5370 FormatStyle NoBinPacking = getGoogleStyle(); 5371 NoBinPacking.BinPackParameters = false; 5372 NoBinPacking.BinPackArguments = false; 5373 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5374 " aaaaaaaaaaaaaaaaaaaa,\n" 5375 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5376 NoBinPacking); 5377 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5378 " aaaaaaaaaaaaa,\n" 5379 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5380 NoBinPacking); 5381 verifyFormat( 5382 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5383 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5385 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5387 NoBinPacking); 5388 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5389 " .aaaaaaaaaaaaaaaaaa();", 5390 NoBinPacking); 5391 verifyFormat("void f() {\n" 5392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5393 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5394 "}", 5395 NoBinPacking); 5396 5397 verifyFormat( 5398 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5399 " aaaaaaaaaaaa,\n" 5400 " aaaaaaaaaaaa);", 5401 NoBinPacking); 5402 verifyFormat( 5403 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5404 " ddddddddddddddddddddddddddddd),\n" 5405 " test);", 5406 NoBinPacking); 5407 5408 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5409 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5410 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5411 " aaaaaaaaaaaaaaaaaa;", 5412 NoBinPacking); 5413 verifyFormat("a(\"a\"\n" 5414 " \"a\",\n" 5415 " a);"); 5416 5417 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5418 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5419 " aaaaaaaaa,\n" 5420 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5421 NoBinPacking); 5422 verifyFormat( 5423 "void f() {\n" 5424 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5425 " .aaaaaaa();\n" 5426 "}", 5427 NoBinPacking); 5428 verifyFormat( 5429 "template <class SomeType, class SomeOtherType>\n" 5430 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5431 NoBinPacking); 5432 } 5433 5434 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5435 FormatStyle Style = getLLVMStyleWithColumns(15); 5436 Style.ExperimentalAutoDetectBinPacking = true; 5437 EXPECT_EQ("aaa(aaaa,\n" 5438 " aaaa,\n" 5439 " aaaa);\n" 5440 "aaa(aaaa,\n" 5441 " aaaa,\n" 5442 " aaaa);", 5443 format("aaa(aaaa,\n" // one-per-line 5444 " aaaa,\n" 5445 " aaaa );\n" 5446 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5447 Style)); 5448 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5449 " aaaa);\n" 5450 "aaa(aaaa, aaaa,\n" 5451 " aaaa);", 5452 format("aaa(aaaa, aaaa,\n" // bin-packed 5453 " aaaa );\n" 5454 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5455 Style)); 5456 } 5457 5458 TEST_F(FormatTest, FormatsBuilderPattern) { 5459 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5460 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5461 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5462 " .StartsWith(\".init\", ORDER_INIT)\n" 5463 " .StartsWith(\".fini\", ORDER_FINI)\n" 5464 " .StartsWith(\".hash\", ORDER_HASH)\n" 5465 " .Default(ORDER_TEXT);\n"); 5466 5467 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5468 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5469 verifyFormat("aaaaaaa->aaaaaaa\n" 5470 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5472 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5473 verifyFormat( 5474 "aaaaaaa->aaaaaaa\n" 5475 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5476 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5477 verifyFormat( 5478 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5479 " aaaaaaaaaaaaaa);"); 5480 verifyFormat( 5481 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5482 " aaaaaa->aaaaaaaaaaaa()\n" 5483 " ->aaaaaaaaaaaaaaaa(\n" 5484 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5485 " ->aaaaaaaaaaaaaaaaa();"); 5486 verifyGoogleFormat( 5487 "void f() {\n" 5488 " someo->Add((new util::filetools::Handler(dir))\n" 5489 " ->OnEvent1(NewPermanentCallback(\n" 5490 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5491 " ->OnEvent2(NewPermanentCallback(\n" 5492 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5493 " ->OnEvent3(NewPermanentCallback(\n" 5494 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5495 " ->OnEvent5(NewPermanentCallback(\n" 5496 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5497 " ->OnEvent6(NewPermanentCallback(\n" 5498 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5499 "}"); 5500 5501 verifyFormat( 5502 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5503 verifyFormat("aaaaaaaaaaaaaaa()\n" 5504 " .aaaaaaaaaaaaaaa()\n" 5505 " .aaaaaaaaaaaaaaa()\n" 5506 " .aaaaaaaaaaaaaaa()\n" 5507 " .aaaaaaaaaaaaaaa();"); 5508 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5509 " .aaaaaaaaaaaaaaa()\n" 5510 " .aaaaaaaaaaaaaaa()\n" 5511 " .aaaaaaaaaaaaaaa();"); 5512 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5513 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5514 " .aaaaaaaaaaaaaaa();"); 5515 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5516 " ->aaaaaaaaaaaaaae(0)\n" 5517 " ->aaaaaaaaaaaaaaa();"); 5518 5519 // Don't linewrap after very short segments. 5520 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5521 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5522 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5523 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5524 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5525 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5526 verifyFormat("aaa()\n" 5527 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5528 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5529 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5530 5531 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5532 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5533 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5534 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5535 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5536 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5537 5538 // Prefer not to break after empty parentheses. 5539 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5540 " First->LastNewlineOffset);"); 5541 5542 // Prefer not to create "hanging" indents. 5543 verifyFormat( 5544 "return !soooooooooooooome_map\n" 5545 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5546 " .second;"); 5547 verifyFormat( 5548 "return aaaaaaaaaaaaaaaa\n" 5549 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5550 " .aaaa(aaaaaaaaaaaaaa);"); 5551 // No hanging indent here. 5552 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5553 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5554 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5555 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5556 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5557 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5558 getLLVMStyleWithColumns(60)); 5559 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5560 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5561 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5562 getLLVMStyleWithColumns(59)); 5563 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5565 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5566 5567 // Dont break if only closing statements before member call 5568 verifyFormat("test() {\n" 5569 " ([]() -> {\n" 5570 " int b = 32;\n" 5571 " return 3;\n" 5572 " }).foo();\n" 5573 "}"); 5574 verifyFormat("test() {\n" 5575 " (\n" 5576 " []() -> {\n" 5577 " int b = 32;\n" 5578 " return 3;\n" 5579 " },\n" 5580 " foo, bar)\n" 5581 " .foo();\n" 5582 "}"); 5583 verifyFormat("test() {\n" 5584 " ([]() -> {\n" 5585 " int b = 32;\n" 5586 " return 3;\n" 5587 " })\n" 5588 " .foo()\n" 5589 " .bar();\n" 5590 "}"); 5591 verifyFormat("test() {\n" 5592 " ([]() -> {\n" 5593 " int b = 32;\n" 5594 " return 3;\n" 5595 " })\n" 5596 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5597 " \"bbbb\");\n" 5598 "}", 5599 getLLVMStyleWithColumns(30)); 5600 } 5601 5602 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5603 verifyFormat( 5604 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5605 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5606 verifyFormat( 5607 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5608 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5609 5610 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5611 " ccccccccccccccccccccccccc) {\n}"); 5612 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5613 " ccccccccccccccccccccccccc) {\n}"); 5614 5615 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5616 " ccccccccccccccccccccccccc) {\n}"); 5617 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5618 " ccccccccccccccccccccccccc) {\n}"); 5619 5620 verifyFormat( 5621 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5622 " ccccccccccccccccccccccccc) {\n}"); 5623 verifyFormat( 5624 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5625 " ccccccccccccccccccccccccc) {\n}"); 5626 5627 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5628 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5629 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5630 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5631 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5632 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5633 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5634 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5635 5636 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5637 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5638 " aaaaaaaaaaaaaaa != aa) {\n}"); 5639 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5640 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5641 " aaaaaaaaaaaaaaa != aa) {\n}"); 5642 } 5643 5644 TEST_F(FormatTest, BreaksAfterAssignments) { 5645 verifyFormat( 5646 "unsigned Cost =\n" 5647 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5648 " SI->getPointerAddressSpaceee());\n"); 5649 verifyFormat( 5650 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5651 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5652 5653 verifyFormat( 5654 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5655 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5656 verifyFormat("unsigned OriginalStartColumn =\n" 5657 " SourceMgr.getSpellingColumnNumber(\n" 5658 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5659 " 1;"); 5660 } 5661 5662 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5663 FormatStyle Style = getLLVMStyle(); 5664 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5665 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5666 Style); 5667 5668 Style.PenaltyBreakAssignment = 20; 5669 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5670 " cccccccccccccccccccccccccc;", 5671 Style); 5672 } 5673 5674 TEST_F(FormatTest, AlignsAfterAssignments) { 5675 verifyFormat( 5676 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5677 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5678 verifyFormat( 5679 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5680 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5681 verifyFormat( 5682 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5683 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5684 verifyFormat( 5685 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5686 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5687 verifyFormat( 5688 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5689 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5690 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5691 } 5692 5693 TEST_F(FormatTest, AlignsAfterReturn) { 5694 verifyFormat( 5695 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5696 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5697 verifyFormat( 5698 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5699 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5700 verifyFormat( 5701 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5702 " aaaaaaaaaaaaaaaaaaaaaa();"); 5703 verifyFormat( 5704 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5705 " aaaaaaaaaaaaaaaaaaaaaa());"); 5706 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5708 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5711 verifyFormat("return\n" 5712 " // true if code is one of a or b.\n" 5713 " code == a || code == b;"); 5714 } 5715 5716 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5717 verifyFormat( 5718 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5719 " aaaaaaaaa aaaaaaa) {}"); 5720 verifyFormat( 5721 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5722 " aaaaaaaaaaa aaaaaaaaa);"); 5723 verifyFormat( 5724 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5725 " aaaaaaaaaaaaaaaaaaaaa));"); 5726 FormatStyle Style = getLLVMStyle(); 5727 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5728 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5729 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5730 Style); 5731 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5732 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5733 Style); 5734 verifyFormat("SomeLongVariableName->someFunction(\n" 5735 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5736 Style); 5737 verifyFormat( 5738 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5739 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5740 Style); 5741 verifyFormat( 5742 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5743 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5744 Style); 5745 verifyFormat( 5746 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5747 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5748 Style); 5749 5750 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5751 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5752 " b));", 5753 Style); 5754 5755 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5756 Style.BinPackArguments = false; 5757 Style.BinPackParameters = false; 5758 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5759 " aaaaaaaaaaa aaaaaaaa,\n" 5760 " aaaaaaaaa aaaaaaa,\n" 5761 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5762 Style); 5763 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5764 " aaaaaaaaaaa aaaaaaaaa,\n" 5765 " aaaaaaaaaaa aaaaaaaaa,\n" 5766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5767 Style); 5768 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5769 " aaaaaaaaaaaaaaa,\n" 5770 " aaaaaaaaaaaaaaaaaaaaa,\n" 5771 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5772 Style); 5773 verifyFormat( 5774 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5775 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5776 Style); 5777 verifyFormat( 5778 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5779 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5780 Style); 5781 verifyFormat( 5782 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5783 " aaaaaaaaaaaaaaaaaaaaa(\n" 5784 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5785 " aaaaaaaaaaaaaaaa);", 5786 Style); 5787 verifyFormat( 5788 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5789 " aaaaaaaaaaaaaaaaaaaaa(\n" 5790 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5791 " aaaaaaaaaaaaaaaa);", 5792 Style); 5793 } 5794 5795 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5796 FormatStyle Style = getLLVMStyleWithColumns(40); 5797 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5798 " bbbbbbbbbbbbbbbbbbbbbb);", 5799 Style); 5800 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5801 Style.AlignOperands = false; 5802 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5803 " bbbbbbbbbbbbbbbbbbbbbb);", 5804 Style); 5805 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5806 Style.AlignOperands = true; 5807 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5808 " bbbbbbbbbbbbbbbbbbbbbb);", 5809 Style); 5810 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5811 Style.AlignOperands = false; 5812 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5813 " bbbbbbbbbbbbbbbbbbbbbb);", 5814 Style); 5815 } 5816 5817 TEST_F(FormatTest, BreaksConditionalExpressions) { 5818 verifyFormat( 5819 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5820 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5821 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5822 verifyFormat( 5823 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5824 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5825 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5826 verifyFormat( 5827 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5828 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5829 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5830 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5831 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5832 verifyFormat( 5833 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5834 " : aaaaaaaaaaaaa);"); 5835 verifyFormat( 5836 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5837 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5838 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5839 " aaaaaaaaaaaaa);"); 5840 verifyFormat( 5841 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5842 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5843 " aaaaaaaaaaaaa);"); 5844 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5845 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5846 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5847 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5848 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5849 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5851 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5852 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5853 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5854 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5855 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5856 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5858 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5860 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5861 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5862 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5863 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5864 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5865 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5866 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5867 " : aaaaaaaaaaaaaaaa;"); 5868 verifyFormat( 5869 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5870 " ? aaaaaaaaaaaaaaa\n" 5871 " : aaaaaaaaaaaaaaa;"); 5872 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5873 " aaaaaaaaa\n" 5874 " ? b\n" 5875 " : c);"); 5876 verifyFormat("return aaaa == bbbb\n" 5877 " // comment\n" 5878 " ? aaaa\n" 5879 " : bbbb;"); 5880 verifyFormat("unsigned Indent =\n" 5881 " format(TheLine.First,\n" 5882 " IndentForLevel[TheLine.Level] >= 0\n" 5883 " ? IndentForLevel[TheLine.Level]\n" 5884 " : TheLine * 2,\n" 5885 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5886 getLLVMStyleWithColumns(60)); 5887 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5888 " ? aaaaaaaaaaaaaaa\n" 5889 " : bbbbbbbbbbbbbbb //\n" 5890 " ? ccccccccccccccc\n" 5891 " : ddddddddddddddd;"); 5892 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5893 " ? aaaaaaaaaaaaaaa\n" 5894 " : (bbbbbbbbbbbbbbb //\n" 5895 " ? ccccccccccccccc\n" 5896 " : ddddddddddddddd);"); 5897 verifyFormat( 5898 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5899 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5900 " aaaaaaaaaaaaaaaaaaaaa +\n" 5901 " aaaaaaaaaaaaaaaaaaaaa\n" 5902 " : aaaaaaaaaa;"); 5903 verifyFormat( 5904 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5905 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5906 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5907 5908 FormatStyle NoBinPacking = getLLVMStyle(); 5909 NoBinPacking.BinPackArguments = false; 5910 verifyFormat( 5911 "void f() {\n" 5912 " g(aaa,\n" 5913 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5914 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5915 " ? aaaaaaaaaaaaaaa\n" 5916 " : aaaaaaaaaaaaaaa);\n" 5917 "}", 5918 NoBinPacking); 5919 verifyFormat( 5920 "void f() {\n" 5921 " g(aaa,\n" 5922 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5924 " ?: aaaaaaaaaaaaaaa);\n" 5925 "}", 5926 NoBinPacking); 5927 5928 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5929 " // comment.\n" 5930 " ccccccccccccccccccccccccccccccccccccccc\n" 5931 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5932 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5933 5934 // Assignments in conditional expressions. Apparently not uncommon :-(. 5935 verifyFormat("return a != b\n" 5936 " // comment\n" 5937 " ? a = b\n" 5938 " : a = b;"); 5939 verifyFormat("return a != b\n" 5940 " // comment\n" 5941 " ? a = a != b\n" 5942 " // comment\n" 5943 " ? a = b\n" 5944 " : a\n" 5945 " : a;\n"); 5946 verifyFormat("return a != b\n" 5947 " // comment\n" 5948 " ? a\n" 5949 " : a = a != b\n" 5950 " // comment\n" 5951 " ? a = b\n" 5952 " : a;"); 5953 } 5954 5955 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5956 FormatStyle Style = getLLVMStyle(); 5957 Style.BreakBeforeTernaryOperators = false; 5958 Style.ColumnLimit = 70; 5959 verifyFormat( 5960 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5963 Style); 5964 verifyFormat( 5965 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5966 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5968 Style); 5969 verifyFormat( 5970 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5972 Style); 5973 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5974 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5976 Style); 5977 verifyFormat( 5978 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 5979 " aaaaaaaaaaaaa);", 5980 Style); 5981 verifyFormat( 5982 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5983 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5985 " aaaaaaaaaaaaa);", 5986 Style); 5987 verifyFormat( 5988 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5989 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5990 " aaaaaaaaaaaaa);", 5991 Style); 5992 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5993 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5997 Style); 5998 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6004 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6005 Style); 6006 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 6008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6009 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6010 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6011 Style); 6012 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6013 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6014 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6015 Style); 6016 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6017 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6018 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6020 Style); 6021 verifyFormat( 6022 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6023 " aaaaaaaaaaaaaaa :\n" 6024 " aaaaaaaaaaaaaaa;", 6025 Style); 6026 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6027 " aaaaaaaaa ?\n" 6028 " b :\n" 6029 " c);", 6030 Style); 6031 verifyFormat("unsigned Indent =\n" 6032 " format(TheLine.First,\n" 6033 " IndentForLevel[TheLine.Level] >= 0 ?\n" 6034 " IndentForLevel[TheLine.Level] :\n" 6035 " TheLine * 2,\n" 6036 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6037 Style); 6038 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6039 " aaaaaaaaaaaaaaa :\n" 6040 " bbbbbbbbbbbbbbb ? //\n" 6041 " ccccccccccccccc :\n" 6042 " ddddddddddddddd;", 6043 Style); 6044 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6045 " aaaaaaaaaaaaaaa :\n" 6046 " (bbbbbbbbbbbbbbb ? //\n" 6047 " ccccccccccccccc :\n" 6048 " ddddddddddddddd);", 6049 Style); 6050 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6051 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 6052 " ccccccccccccccccccccccccccc;", 6053 Style); 6054 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6055 " aaaaa :\n" 6056 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 6057 Style); 6058 } 6059 6060 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 6061 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 6062 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 6063 verifyFormat("bool a = true, b = false;"); 6064 6065 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 6067 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 6068 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 6069 verifyFormat( 6070 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 6071 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 6072 " d = e && f;"); 6073 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 6074 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 6075 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6076 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 6077 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 6078 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 6079 6080 FormatStyle Style = getGoogleStyle(); 6081 Style.PointerAlignment = FormatStyle::PAS_Left; 6082 Style.DerivePointerAlignment = false; 6083 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6084 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 6085 " *b = bbbbbbbbbbbbbbbbbbb;", 6086 Style); 6087 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6088 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 6089 Style); 6090 verifyFormat("vector<int*> a, b;", Style); 6091 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 6092 } 6093 6094 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6095 verifyFormat("arr[foo ? bar : baz];"); 6096 verifyFormat("f()[foo ? bar : baz];"); 6097 verifyFormat("(a + b)[foo ? bar : baz];"); 6098 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6099 } 6100 6101 TEST_F(FormatTest, AlignsStringLiterals) { 6102 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6103 " \"short literal\");"); 6104 verifyFormat( 6105 "looooooooooooooooooooooooongFunction(\n" 6106 " \"short literal\"\n" 6107 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6108 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6109 " \" string literals\",\n" 6110 " and, other, parameters);"); 6111 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6112 " \"5678\";", 6113 format("fun + \"1243\" /* comment */\n" 6114 " \"5678\";", 6115 getLLVMStyleWithColumns(28))); 6116 EXPECT_EQ( 6117 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6118 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6119 " \"aaaaaaaaaaaaaaaa\";", 6120 format("aaaaaa =" 6121 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6122 "aaaaaaaaaaaaaaaaaaaaa\" " 6123 "\"aaaaaaaaaaaaaaaa\";")); 6124 verifyFormat("a = a + \"a\"\n" 6125 " \"a\"\n" 6126 " \"a\";"); 6127 verifyFormat("f(\"a\", \"b\"\n" 6128 " \"c\");"); 6129 6130 verifyFormat( 6131 "#define LL_FORMAT \"ll\"\n" 6132 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6133 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6134 6135 verifyFormat("#define A(X) \\\n" 6136 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6137 " \"ccccc\"", 6138 getLLVMStyleWithColumns(23)); 6139 verifyFormat("#define A \"def\"\n" 6140 "f(\"abc\" A \"ghi\"\n" 6141 " \"jkl\");"); 6142 6143 verifyFormat("f(L\"a\"\n" 6144 " L\"b\");"); 6145 verifyFormat("#define A(X) \\\n" 6146 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6147 " L\"ccccc\"", 6148 getLLVMStyleWithColumns(25)); 6149 6150 verifyFormat("f(@\"a\"\n" 6151 " @\"b\");"); 6152 verifyFormat("NSString s = @\"a\"\n" 6153 " @\"b\"\n" 6154 " @\"c\";"); 6155 verifyFormat("NSString s = @\"a\"\n" 6156 " \"b\"\n" 6157 " \"c\";"); 6158 } 6159 6160 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6161 FormatStyle Style = getLLVMStyle(); 6162 // No declarations or definitions should be moved to own line. 6163 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6164 verifyFormat("class A {\n" 6165 " int f() { return 1; }\n" 6166 " int g();\n" 6167 "};\n" 6168 "int f() { return 1; }\n" 6169 "int g();\n", 6170 Style); 6171 6172 // All declarations and definitions should have the return type moved to its 6173 // own 6174 // line. 6175 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6176 verifyFormat("class E {\n" 6177 " int\n" 6178 " f() {\n" 6179 " return 1;\n" 6180 " }\n" 6181 " int\n" 6182 " g();\n" 6183 "};\n" 6184 "int\n" 6185 "f() {\n" 6186 " return 1;\n" 6187 "}\n" 6188 "int\n" 6189 "g();\n", 6190 Style); 6191 6192 // Top-level definitions, and no kinds of declarations should have the 6193 // return type moved to its own line. 6194 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6195 verifyFormat("class B {\n" 6196 " int f() { return 1; }\n" 6197 " int g();\n" 6198 "};\n" 6199 "int\n" 6200 "f() {\n" 6201 " return 1;\n" 6202 "}\n" 6203 "int g();\n", 6204 Style); 6205 6206 // Top-level definitions and declarations should have the return type moved 6207 // to its own line. 6208 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6209 verifyFormat("class C {\n" 6210 " int f() { return 1; }\n" 6211 " int g();\n" 6212 "};\n" 6213 "int\n" 6214 "f() {\n" 6215 " return 1;\n" 6216 "}\n" 6217 "int\n" 6218 "g();\n", 6219 Style); 6220 6221 // All definitions should have the return type moved to its own line, but no 6222 // kinds of declarations. 6223 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6224 verifyFormat("class D {\n" 6225 " int\n" 6226 " f() {\n" 6227 " return 1;\n" 6228 " }\n" 6229 " int g();\n" 6230 "};\n" 6231 "int\n" 6232 "f() {\n" 6233 " return 1;\n" 6234 "}\n" 6235 "int g();\n", 6236 Style); 6237 verifyFormat("const char *\n" 6238 "f(void) {\n" // Break here. 6239 " return \"\";\n" 6240 "}\n" 6241 "const char *bar(void);\n", // No break here. 6242 Style); 6243 verifyFormat("template <class T>\n" 6244 "T *\n" 6245 "f(T &c) {\n" // Break here. 6246 " return NULL;\n" 6247 "}\n" 6248 "template <class T> T *f(T &c);\n", // No break here. 6249 Style); 6250 verifyFormat("class C {\n" 6251 " int\n" 6252 " operator+() {\n" 6253 " return 1;\n" 6254 " }\n" 6255 " int\n" 6256 " operator()() {\n" 6257 " return 1;\n" 6258 " }\n" 6259 "};\n", 6260 Style); 6261 verifyFormat("void\n" 6262 "A::operator()() {}\n" 6263 "void\n" 6264 "A::operator>>() {}\n" 6265 "void\n" 6266 "A::operator+() {}\n" 6267 "void\n" 6268 "A::operator*() {}\n" 6269 "void\n" 6270 "A::operator->() {}\n" 6271 "void\n" 6272 "A::operator void *() {}\n" 6273 "void\n" 6274 "A::operator void &() {}\n" 6275 "void\n" 6276 "A::operator void &&() {}\n" 6277 "void\n" 6278 "A::operator char *() {}\n" 6279 "void\n" 6280 "A::operator[]() {}\n" 6281 "void\n" 6282 "A::operator!() {}\n", 6283 Style); 6284 verifyFormat("constexpr auto\n" 6285 "operator()() const -> reference {}\n" 6286 "constexpr auto\n" 6287 "operator>>() const -> reference {}\n" 6288 "constexpr auto\n" 6289 "operator+() const -> reference {}\n" 6290 "constexpr auto\n" 6291 "operator*() const -> reference {}\n" 6292 "constexpr auto\n" 6293 "operator->() const -> reference {}\n" 6294 "constexpr auto\n" 6295 "operator++() const -> reference {}\n" 6296 "constexpr auto\n" 6297 "operator void *() const -> reference {}\n" 6298 "constexpr auto\n" 6299 "operator void &() const -> reference {}\n" 6300 "constexpr auto\n" 6301 "operator void &&() const -> reference {}\n" 6302 "constexpr auto\n" 6303 "operator char *() const -> reference {}\n" 6304 "constexpr auto\n" 6305 "operator!() const -> reference {}\n" 6306 "constexpr auto\n" 6307 "operator[]() const -> reference {}\n", 6308 Style); 6309 verifyFormat("void *operator new(std::size_t s);", // No break here. 6310 Style); 6311 verifyFormat("void *\n" 6312 "operator new(std::size_t s) {}", 6313 Style); 6314 verifyFormat("void *\n" 6315 "operator delete[](void *ptr) {}", 6316 Style); 6317 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6318 verifyFormat("const char *\n" 6319 "f(void)\n" // Break here. 6320 "{\n" 6321 " return \"\";\n" 6322 "}\n" 6323 "const char *bar(void);\n", // No break here. 6324 Style); 6325 verifyFormat("template <class T>\n" 6326 "T *\n" // Problem here: no line break 6327 "f(T &c)\n" // Break here. 6328 "{\n" 6329 " return NULL;\n" 6330 "}\n" 6331 "template <class T> T *f(T &c);\n", // No break here. 6332 Style); 6333 verifyFormat("int\n" 6334 "foo(A<bool> a)\n" 6335 "{\n" 6336 " return a;\n" 6337 "}\n", 6338 Style); 6339 verifyFormat("int\n" 6340 "foo(A<8> a)\n" 6341 "{\n" 6342 " return a;\n" 6343 "}\n", 6344 Style); 6345 verifyFormat("int\n" 6346 "foo(A<B<bool>, 8> a)\n" 6347 "{\n" 6348 " return a;\n" 6349 "}\n", 6350 Style); 6351 verifyFormat("int\n" 6352 "foo(A<B<8>, bool> a)\n" 6353 "{\n" 6354 " return a;\n" 6355 "}\n", 6356 Style); 6357 verifyFormat("int\n" 6358 "foo(A<B<bool>, bool> a)\n" 6359 "{\n" 6360 " return a;\n" 6361 "}\n", 6362 Style); 6363 verifyFormat("int\n" 6364 "foo(A<B<8>, 8> a)\n" 6365 "{\n" 6366 " return a;\n" 6367 "}\n", 6368 Style); 6369 6370 Style = getGNUStyle(); 6371 6372 // Test for comments at the end of function declarations. 6373 verifyFormat("void\n" 6374 "foo (int a, /*abc*/ int b) // def\n" 6375 "{\n" 6376 "}\n", 6377 Style); 6378 6379 verifyFormat("void\n" 6380 "foo (int a, /* abc */ int b) /* def */\n" 6381 "{\n" 6382 "}\n", 6383 Style); 6384 6385 // Definitions that should not break after return type 6386 verifyFormat("void foo (int a, int b); // def\n", Style); 6387 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6388 verifyFormat("void foo (int a, int b);\n", Style); 6389 } 6390 6391 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6392 FormatStyle NoBreak = getLLVMStyle(); 6393 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6394 FormatStyle Break = getLLVMStyle(); 6395 Break.AlwaysBreakBeforeMultilineStrings = true; 6396 verifyFormat("aaaa = \"bbbb\"\n" 6397 " \"cccc\";", 6398 NoBreak); 6399 verifyFormat("aaaa =\n" 6400 " \"bbbb\"\n" 6401 " \"cccc\";", 6402 Break); 6403 verifyFormat("aaaa(\"bbbb\"\n" 6404 " \"cccc\");", 6405 NoBreak); 6406 verifyFormat("aaaa(\n" 6407 " \"bbbb\"\n" 6408 " \"cccc\");", 6409 Break); 6410 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6411 " \"cccc\");", 6412 NoBreak); 6413 verifyFormat("aaaa(qqq,\n" 6414 " \"bbbb\"\n" 6415 " \"cccc\");", 6416 Break); 6417 verifyFormat("aaaa(qqq,\n" 6418 " L\"bbbb\"\n" 6419 " L\"cccc\");", 6420 Break); 6421 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6422 " \"bbbb\"));", 6423 Break); 6424 verifyFormat("string s = someFunction(\n" 6425 " \"abc\"\n" 6426 " \"abc\");", 6427 Break); 6428 6429 // As we break before unary operators, breaking right after them is bad. 6430 verifyFormat("string foo = abc ? \"x\"\n" 6431 " \"blah blah blah blah blah blah\"\n" 6432 " : \"y\";", 6433 Break); 6434 6435 // Don't break if there is no column gain. 6436 verifyFormat("f(\"aaaa\"\n" 6437 " \"bbbb\");", 6438 Break); 6439 6440 // Treat literals with escaped newlines like multi-line string literals. 6441 EXPECT_EQ("x = \"a\\\n" 6442 "b\\\n" 6443 "c\";", 6444 format("x = \"a\\\n" 6445 "b\\\n" 6446 "c\";", 6447 NoBreak)); 6448 EXPECT_EQ("xxxx =\n" 6449 " \"a\\\n" 6450 "b\\\n" 6451 "c\";", 6452 format("xxxx = \"a\\\n" 6453 "b\\\n" 6454 "c\";", 6455 Break)); 6456 6457 EXPECT_EQ("NSString *const kString =\n" 6458 " @\"aaaa\"\n" 6459 " @\"bbbb\";", 6460 format("NSString *const kString = @\"aaaa\"\n" 6461 "@\"bbbb\";", 6462 Break)); 6463 6464 Break.ColumnLimit = 0; 6465 verifyFormat("const char *hello = \"hello llvm\";", Break); 6466 } 6467 6468 TEST_F(FormatTest, AlignsPipes) { 6469 verifyFormat( 6470 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6471 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6472 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6473 verifyFormat( 6474 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6475 " << aaaaaaaaaaaaaaaaaaaa;"); 6476 verifyFormat( 6477 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6478 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6479 verifyFormat( 6480 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6481 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6482 verifyFormat( 6483 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6484 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6485 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6486 verifyFormat( 6487 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6488 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6489 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6490 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6491 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6492 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6493 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6494 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6495 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6496 verifyFormat( 6497 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6498 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6499 verifyFormat( 6500 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6501 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6502 6503 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6504 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6505 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6506 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6507 " aaaaaaaaaaaaaaaaaaaaa)\n" 6508 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6509 verifyFormat("LOG_IF(aaa == //\n" 6510 " bbb)\n" 6511 " << a << b;"); 6512 6513 // But sometimes, breaking before the first "<<" is desirable. 6514 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6515 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6516 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6517 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6518 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6519 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6520 " << BEF << IsTemplate << Description << E->getType();"); 6521 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6522 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6524 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6525 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6527 " << aaa;"); 6528 6529 verifyFormat( 6530 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6531 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6532 6533 // Incomplete string literal. 6534 EXPECT_EQ("llvm::errs() << \"\n" 6535 " << a;", 6536 format("llvm::errs() << \"\n<<a;")); 6537 6538 verifyFormat("void f() {\n" 6539 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6540 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6541 "}"); 6542 6543 // Handle 'endl'. 6544 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6545 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6546 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6547 6548 // Handle '\n'. 6549 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6550 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6551 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6552 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6553 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6554 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6555 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6556 } 6557 6558 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6559 verifyFormat("return out << \"somepacket = {\\n\"\n" 6560 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6561 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6562 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6563 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6564 " << \"}\";"); 6565 6566 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6567 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6568 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6569 verifyFormat( 6570 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6571 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6572 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6573 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6574 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6575 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6576 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6577 verifyFormat( 6578 "void f() {\n" 6579 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6580 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6581 "}"); 6582 6583 // Breaking before the first "<<" is generally not desirable. 6584 verifyFormat( 6585 "llvm::errs()\n" 6586 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6587 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6588 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6589 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6590 getLLVMStyleWithColumns(70)); 6591 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6592 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6593 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6594 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6595 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6596 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6597 getLLVMStyleWithColumns(70)); 6598 6599 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6600 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6601 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6602 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6603 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6604 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6605 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6606 " (aaaa + aaaa);", 6607 getLLVMStyleWithColumns(40)); 6608 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6609 " (aaaaaaa + aaaaa));", 6610 getLLVMStyleWithColumns(40)); 6611 verifyFormat( 6612 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6613 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6614 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6615 } 6616 6617 TEST_F(FormatTest, UnderstandsEquals) { 6618 verifyFormat( 6619 "aaaaaaaaaaaaaaaaa =\n" 6620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6621 verifyFormat( 6622 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6624 verifyFormat( 6625 "if (a) {\n" 6626 " f();\n" 6627 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6628 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6629 "}"); 6630 6631 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6632 " 100000000 + 10000000) {\n}"); 6633 } 6634 6635 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6636 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6637 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6638 6639 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6640 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6641 6642 verifyFormat( 6643 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6644 " Parameter2);"); 6645 6646 verifyFormat( 6647 "ShortObject->shortFunction(\n" 6648 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6649 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6650 6651 verifyFormat("loooooooooooooongFunction(\n" 6652 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6653 6654 verifyFormat( 6655 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6656 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6657 6658 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6659 " .WillRepeatedly(Return(SomeValue));"); 6660 verifyFormat("void f() {\n" 6661 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6662 " .Times(2)\n" 6663 " .WillRepeatedly(Return(SomeValue));\n" 6664 "}"); 6665 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6666 " ccccccccccccccccccccccc);"); 6667 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6669 " .aaaaa(aaaaa),\n" 6670 " aaaaaaaaaaaaaaaaaaaaa);"); 6671 verifyFormat("void f() {\n" 6672 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6673 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6674 "}"); 6675 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6677 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6678 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6679 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6680 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6681 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6682 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6683 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6684 "}"); 6685 6686 // Here, it is not necessary to wrap at "." or "->". 6687 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6688 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6689 verifyFormat( 6690 "aaaaaaaaaaa->aaaaaaaaa(\n" 6691 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6692 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6693 6694 verifyFormat( 6695 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6697 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6698 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6699 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6700 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6701 6702 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6703 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6704 " .a();"); 6705 6706 FormatStyle NoBinPacking = getLLVMStyle(); 6707 NoBinPacking.BinPackParameters = false; 6708 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6709 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6710 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6711 " aaaaaaaaaaaaaaaaaaa,\n" 6712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6713 NoBinPacking); 6714 6715 // If there is a subsequent call, change to hanging indentation. 6716 verifyFormat( 6717 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6718 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6719 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6720 verifyFormat( 6721 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6722 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6723 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6725 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6726 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6728 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6729 } 6730 6731 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6732 verifyFormat("template <typename T>\n" 6733 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6734 verifyFormat("template <typename T>\n" 6735 "// T should be one of {A, B}.\n" 6736 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6737 verifyFormat( 6738 "template <typename T>\n" 6739 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6740 verifyFormat("template <typename T>\n" 6741 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6742 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6743 verifyFormat( 6744 "template <typename T>\n" 6745 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6746 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6747 verifyFormat( 6748 "template <typename T>\n" 6749 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6750 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6752 verifyFormat("template <typename T>\n" 6753 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6754 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6755 verifyFormat( 6756 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6757 " typename T4 = char>\n" 6758 "void f();"); 6759 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6760 " template <typename> class cccccccccccccccccccccc,\n" 6761 " typename ddddddddddddd>\n" 6762 "class C {};"); 6763 verifyFormat( 6764 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6766 6767 verifyFormat("void f() {\n" 6768 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6769 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6770 "}"); 6771 6772 verifyFormat("template <typename T> class C {};"); 6773 verifyFormat("template <typename T> void f();"); 6774 verifyFormat("template <typename T> void f() {}"); 6775 verifyFormat( 6776 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6777 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6779 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6781 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6782 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6783 getLLVMStyleWithColumns(72)); 6784 EXPECT_EQ("static_cast<A< //\n" 6785 " B> *>(\n" 6786 "\n" 6787 ");", 6788 format("static_cast<A<//\n" 6789 " B>*>(\n" 6790 "\n" 6791 " );")); 6792 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6793 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6794 6795 FormatStyle AlwaysBreak = getLLVMStyle(); 6796 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6797 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6798 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6799 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6800 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6801 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6802 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6803 verifyFormat("template <template <typename> class Fooooooo,\n" 6804 " template <typename> class Baaaaaaar>\n" 6805 "struct C {};", 6806 AlwaysBreak); 6807 verifyFormat("template <typename T> // T can be A, B or C.\n" 6808 "struct C {};", 6809 AlwaysBreak); 6810 verifyFormat("template <enum E> class A {\n" 6811 "public:\n" 6812 " E *f();\n" 6813 "};"); 6814 6815 FormatStyle NeverBreak = getLLVMStyle(); 6816 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6817 verifyFormat("template <typename T> class C {};", NeverBreak); 6818 verifyFormat("template <typename T> void f();", NeverBreak); 6819 verifyFormat("template <typename T> void f() {}", NeverBreak); 6820 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6821 "bbbbbbbbbbbbbbbbbbbb) {}", 6822 NeverBreak); 6823 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6824 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6825 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6826 NeverBreak); 6827 verifyFormat("template <template <typename> class Fooooooo,\n" 6828 " template <typename> class Baaaaaaar>\n" 6829 "struct C {};", 6830 NeverBreak); 6831 verifyFormat("template <typename T> // T can be A, B or C.\n" 6832 "struct C {};", 6833 NeverBreak); 6834 verifyFormat("template <enum E> class A {\n" 6835 "public:\n" 6836 " E *f();\n" 6837 "};", 6838 NeverBreak); 6839 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6840 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6841 "bbbbbbbbbbbbbbbbbbbb) {}", 6842 NeverBreak); 6843 } 6844 6845 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6846 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6847 Style.ColumnLimit = 60; 6848 EXPECT_EQ("// Baseline - no comments.\n" 6849 "template <\n" 6850 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6851 "void f() {}", 6852 format("// Baseline - no comments.\n" 6853 "template <\n" 6854 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6855 "void f() {}", 6856 Style)); 6857 6858 EXPECT_EQ("template <\n" 6859 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6860 "void f() {}", 6861 format("template <\n" 6862 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6863 "void f() {}", 6864 Style)); 6865 6866 EXPECT_EQ( 6867 "template <\n" 6868 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6869 "void f() {}", 6870 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6871 "void f() {}", 6872 Style)); 6873 6874 EXPECT_EQ( 6875 "template <\n" 6876 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6877 " // multiline\n" 6878 "void f() {}", 6879 format("template <\n" 6880 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6881 " // multiline\n" 6882 "void f() {}", 6883 Style)); 6884 6885 EXPECT_EQ( 6886 "template <typename aaaaaaaaaa<\n" 6887 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6888 "void f() {}", 6889 format( 6890 "template <\n" 6891 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6892 "void f() {}", 6893 Style)); 6894 } 6895 6896 TEST_F(FormatTest, WrapsTemplateParameters) { 6897 FormatStyle Style = getLLVMStyle(); 6898 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6899 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6900 verifyFormat( 6901 "template <typename... a> struct q {};\n" 6902 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6903 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6904 " y;", 6905 Style); 6906 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6907 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6908 verifyFormat( 6909 "template <typename... a> struct r {};\n" 6910 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6911 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6912 " y;", 6913 Style); 6914 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6915 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6916 verifyFormat("template <typename... a> struct s {};\n" 6917 "extern s<\n" 6918 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6919 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6920 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6921 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6922 " y;", 6923 Style); 6924 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6925 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6926 verifyFormat("template <typename... a> struct t {};\n" 6927 "extern t<\n" 6928 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6929 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6930 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6931 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6932 " y;", 6933 Style); 6934 } 6935 6936 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6937 verifyFormat( 6938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6940 verifyFormat( 6941 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6942 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6943 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6944 6945 // FIXME: Should we have the extra indent after the second break? 6946 verifyFormat( 6947 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6948 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6950 6951 verifyFormat( 6952 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6953 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6954 6955 // Breaking at nested name specifiers is generally not desirable. 6956 verifyFormat( 6957 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6958 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6959 6960 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 6961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6963 " aaaaaaaaaaaaaaaaaaaaa);", 6964 getLLVMStyleWithColumns(74)); 6965 6966 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6968 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6969 } 6970 6971 TEST_F(FormatTest, UnderstandsTemplateParameters) { 6972 verifyFormat("A<int> a;"); 6973 verifyFormat("A<A<A<int>>> a;"); 6974 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 6975 verifyFormat("bool x = a < 1 || 2 > a;"); 6976 verifyFormat("bool x = 5 < f<int>();"); 6977 verifyFormat("bool x = f<int>() > 5;"); 6978 verifyFormat("bool x = 5 < a<int>::x;"); 6979 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 6980 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 6981 6982 verifyGoogleFormat("A<A<int>> a;"); 6983 verifyGoogleFormat("A<A<A<int>>> a;"); 6984 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 6985 verifyGoogleFormat("A<A<int> > a;"); 6986 verifyGoogleFormat("A<A<A<int> > > a;"); 6987 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 6988 verifyGoogleFormat("A<::A<int>> a;"); 6989 verifyGoogleFormat("A<::A> a;"); 6990 verifyGoogleFormat("A< ::A> a;"); 6991 verifyGoogleFormat("A< ::A<int> > a;"); 6992 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 6993 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 6994 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 6995 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 6996 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 6997 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 6998 6999 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 7000 7001 // template closer followed by a token that starts with > or = 7002 verifyFormat("bool b = a<1> > 1;"); 7003 verifyFormat("bool b = a<1> >= 1;"); 7004 verifyFormat("int i = a<1> >> 1;"); 7005 FormatStyle Style = getLLVMStyle(); 7006 Style.SpaceBeforeAssignmentOperators = false; 7007 verifyFormat("bool b= a<1> == 1;", Style); 7008 verifyFormat("a<int> = 1;", Style); 7009 verifyFormat("a<int> >>= 1;", Style); 7010 7011 verifyFormat("test >> a >> b;"); 7012 verifyFormat("test << a >> b;"); 7013 7014 verifyFormat("f<int>();"); 7015 verifyFormat("template <typename T> void f() {}"); 7016 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 7017 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 7018 "sizeof(char)>::type>;"); 7019 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 7020 verifyFormat("f(a.operator()<A>());"); 7021 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7022 " .template operator()<A>());", 7023 getLLVMStyleWithColumns(35)); 7024 7025 // Not template parameters. 7026 verifyFormat("return a < b && c > d;"); 7027 verifyFormat("void f() {\n" 7028 " while (a < b && c > d) {\n" 7029 " }\n" 7030 "}"); 7031 verifyFormat("template <typename... Types>\n" 7032 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 7033 7034 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7035 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 7036 getLLVMStyleWithColumns(60)); 7037 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 7038 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 7039 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 7040 } 7041 7042 TEST_F(FormatTest, BitshiftOperatorWidth) { 7043 EXPECT_EQ("int a = 1 << 2; /* foo\n" 7044 " bar */", 7045 format("int a=1<<2; /* foo\n" 7046 " bar */")); 7047 7048 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 7049 " bar */", 7050 format("int b =256>>1 ; /* foo\n" 7051 " bar */")); 7052 } 7053 7054 TEST_F(FormatTest, UnderstandsBinaryOperators) { 7055 verifyFormat("COMPARE(a, ==, b);"); 7056 verifyFormat("auto s = sizeof...(Ts) - 1;"); 7057 } 7058 7059 TEST_F(FormatTest, UnderstandsPointersToMembers) { 7060 verifyFormat("int A::*x;"); 7061 verifyFormat("int (S::*func)(void *);"); 7062 verifyFormat("void f() { int (S::*func)(void *); }"); 7063 verifyFormat("typedef bool *(Class::*Member)() const;"); 7064 verifyFormat("void f() {\n" 7065 " (a->*f)();\n" 7066 " a->*x;\n" 7067 " (a.*f)();\n" 7068 " ((*a).*f)();\n" 7069 " a.*x;\n" 7070 "}"); 7071 verifyFormat("void f() {\n" 7072 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7073 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 7074 "}"); 7075 verifyFormat( 7076 "(aaaaaaaaaa->*bbbbbbb)(\n" 7077 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7078 FormatStyle Style = getLLVMStyle(); 7079 Style.PointerAlignment = FormatStyle::PAS_Left; 7080 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 7081 } 7082 7083 TEST_F(FormatTest, UnderstandsUnaryOperators) { 7084 verifyFormat("int a = -2;"); 7085 verifyFormat("f(-1, -2, -3);"); 7086 verifyFormat("a[-1] = 5;"); 7087 verifyFormat("int a = 5 + -2;"); 7088 verifyFormat("if (i == -1) {\n}"); 7089 verifyFormat("if (i != -1) {\n}"); 7090 verifyFormat("if (i > -1) {\n}"); 7091 verifyFormat("if (i < -1) {\n}"); 7092 verifyFormat("++(a->f());"); 7093 verifyFormat("--(a->f());"); 7094 verifyFormat("(a->f())++;"); 7095 verifyFormat("a[42]++;"); 7096 verifyFormat("if (!(a->f())) {\n}"); 7097 verifyFormat("if (!+i) {\n}"); 7098 verifyFormat("~&a;"); 7099 7100 verifyFormat("a-- > b;"); 7101 verifyFormat("b ? -a : c;"); 7102 verifyFormat("n * sizeof char16;"); 7103 verifyFormat("n * alignof char16;", getGoogleStyle()); 7104 verifyFormat("sizeof(char);"); 7105 verifyFormat("alignof(char);", getGoogleStyle()); 7106 7107 verifyFormat("return -1;"); 7108 verifyFormat("throw -1;"); 7109 verifyFormat("switch (a) {\n" 7110 "case -1:\n" 7111 " break;\n" 7112 "}"); 7113 verifyFormat("#define X -1"); 7114 verifyFormat("#define X -kConstant"); 7115 7116 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7117 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7118 7119 verifyFormat("int a = /* confusing comment */ -1;"); 7120 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7121 verifyFormat("int a = i /* confusing comment */++;"); 7122 7123 verifyFormat("co_yield -1;"); 7124 verifyFormat("co_return -1;"); 7125 } 7126 7127 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7128 verifyFormat("if (!aaaaaaaaaa( // break\n" 7129 " aaaaa)) {\n" 7130 "}"); 7131 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7132 " aaaaa));"); 7133 verifyFormat("*aaa = aaaaaaa( // break\n" 7134 " bbbbbb);"); 7135 } 7136 7137 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7138 verifyFormat("bool operator<();"); 7139 verifyFormat("bool operator>();"); 7140 verifyFormat("bool operator=();"); 7141 verifyFormat("bool operator==();"); 7142 verifyFormat("bool operator!=();"); 7143 verifyFormat("int operator+();"); 7144 verifyFormat("int operator++();"); 7145 verifyFormat("int operator++(int) volatile noexcept;"); 7146 verifyFormat("bool operator,();"); 7147 verifyFormat("bool operator();"); 7148 verifyFormat("bool operator()();"); 7149 verifyFormat("bool operator[]();"); 7150 verifyFormat("operator bool();"); 7151 verifyFormat("operator int();"); 7152 verifyFormat("operator void *();"); 7153 verifyFormat("operator SomeType<int>();"); 7154 verifyFormat("operator SomeType<int, int>();"); 7155 verifyFormat("operator SomeType<SomeType<int>>();"); 7156 verifyFormat("void *operator new(std::size_t size);"); 7157 verifyFormat("void *operator new[](std::size_t size);"); 7158 verifyFormat("void operator delete(void *ptr);"); 7159 verifyFormat("void operator delete[](void *ptr);"); 7160 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7161 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7162 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7163 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7164 7165 verifyFormat( 7166 "ostream &operator<<(ostream &OutputStream,\n" 7167 " SomeReallyLongType WithSomeReallyLongValue);"); 7168 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7169 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7170 " return left.group < right.group;\n" 7171 "}"); 7172 verifyFormat("SomeType &operator=(const SomeType &S);"); 7173 verifyFormat("f.template operator()<int>();"); 7174 7175 verifyGoogleFormat("operator void*();"); 7176 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7177 verifyGoogleFormat("operator ::A();"); 7178 7179 verifyFormat("using A::operator+;"); 7180 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7181 "int i;"); 7182 } 7183 7184 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7185 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7186 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7187 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7188 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7189 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7190 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7191 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7192 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7193 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7194 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7195 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7196 verifyFormat("void Fn(T const &) const &;"); 7197 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7198 verifyFormat("template <typename T>\n" 7199 "void F(T) && = delete;", 7200 getGoogleStyle()); 7201 7202 FormatStyle AlignLeft = getLLVMStyle(); 7203 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7204 verifyFormat("void A::b() && {}", AlignLeft); 7205 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7206 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7207 AlignLeft); 7208 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7209 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7210 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7211 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7212 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7213 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7214 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7215 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7216 7217 FormatStyle Spaces = getLLVMStyle(); 7218 Spaces.SpacesInCStyleCastParentheses = true; 7219 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7220 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7221 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7222 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7223 7224 Spaces.SpacesInCStyleCastParentheses = false; 7225 Spaces.SpacesInParentheses = true; 7226 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7227 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7228 Spaces); 7229 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7230 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7231 7232 FormatStyle BreakTemplate = getLLVMStyle(); 7233 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7234 7235 verifyFormat("struct f {\n" 7236 " template <class T>\n" 7237 " int &foo(const std::string &str) &noexcept {}\n" 7238 "};", 7239 BreakTemplate); 7240 7241 verifyFormat("struct f {\n" 7242 " template <class T>\n" 7243 " int &foo(const std::string &str) &&noexcept {}\n" 7244 "};", 7245 BreakTemplate); 7246 7247 verifyFormat("struct f {\n" 7248 " template <class T>\n" 7249 " int &foo(const std::string &str) const &noexcept {}\n" 7250 "};", 7251 BreakTemplate); 7252 7253 verifyFormat("struct f {\n" 7254 " template <class T>\n" 7255 " int &foo(const std::string &str) const &noexcept {}\n" 7256 "};", 7257 BreakTemplate); 7258 7259 verifyFormat("struct f {\n" 7260 " template <class T>\n" 7261 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7262 "};", 7263 BreakTemplate); 7264 7265 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7266 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7267 FormatStyle::BTDS_Yes; 7268 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7269 7270 verifyFormat("struct f {\n" 7271 " template <class T>\n" 7272 " int& foo(const std::string& str) & noexcept {}\n" 7273 "};", 7274 AlignLeftBreakTemplate); 7275 7276 verifyFormat("struct f {\n" 7277 " template <class T>\n" 7278 " int& foo(const std::string& str) && noexcept {}\n" 7279 "};", 7280 AlignLeftBreakTemplate); 7281 7282 verifyFormat("struct f {\n" 7283 " template <class T>\n" 7284 " int& foo(const std::string& str) const& noexcept {}\n" 7285 "};", 7286 AlignLeftBreakTemplate); 7287 7288 verifyFormat("struct f {\n" 7289 " template <class T>\n" 7290 " int& foo(const std::string& str) const&& noexcept {}\n" 7291 "};", 7292 AlignLeftBreakTemplate); 7293 7294 verifyFormat("struct f {\n" 7295 " template <class T>\n" 7296 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7297 "};", 7298 AlignLeftBreakTemplate); 7299 7300 // The `&` in `Type&` should not be confused with a trailing `&` of 7301 // DEPRECATED(reason) member function. 7302 verifyFormat("struct f {\n" 7303 " template <class T>\n" 7304 " DEPRECATED(reason)\n" 7305 " Type &foo(arguments) {}\n" 7306 "};", 7307 BreakTemplate); 7308 7309 verifyFormat("struct f {\n" 7310 " template <class T>\n" 7311 " DEPRECATED(reason)\n" 7312 " Type& foo(arguments) {}\n" 7313 "};", 7314 AlignLeftBreakTemplate); 7315 7316 verifyFormat("void (*foopt)(int) = &func;"); 7317 } 7318 7319 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7320 verifyFormat("void f() {\n" 7321 " A *a = new A;\n" 7322 " A *a = new (placement) A;\n" 7323 " delete a;\n" 7324 " delete (A *)a;\n" 7325 "}"); 7326 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7327 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7328 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7329 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7330 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7331 verifyFormat("delete[] h->p;"); 7332 } 7333 7334 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7335 verifyFormat("int *f(int *a) {}"); 7336 verifyFormat("int main(int argc, char **argv) {}"); 7337 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7338 verifyIndependentOfContext("f(a, *a);"); 7339 verifyFormat("void g() { f(*a); }"); 7340 verifyIndependentOfContext("int a = b * 10;"); 7341 verifyIndependentOfContext("int a = 10 * b;"); 7342 verifyIndependentOfContext("int a = b * c;"); 7343 verifyIndependentOfContext("int a += b * c;"); 7344 verifyIndependentOfContext("int a -= b * c;"); 7345 verifyIndependentOfContext("int a *= b * c;"); 7346 verifyIndependentOfContext("int a /= b * c;"); 7347 verifyIndependentOfContext("int a = *b;"); 7348 verifyIndependentOfContext("int a = *b * c;"); 7349 verifyIndependentOfContext("int a = b * *c;"); 7350 verifyIndependentOfContext("int a = b * (10);"); 7351 verifyIndependentOfContext("S << b * (10);"); 7352 verifyIndependentOfContext("return 10 * b;"); 7353 verifyIndependentOfContext("return *b * *c;"); 7354 verifyIndependentOfContext("return a & ~b;"); 7355 verifyIndependentOfContext("f(b ? *c : *d);"); 7356 verifyIndependentOfContext("int a = b ? *c : *d;"); 7357 verifyIndependentOfContext("*b = a;"); 7358 verifyIndependentOfContext("a * ~b;"); 7359 verifyIndependentOfContext("a * !b;"); 7360 verifyIndependentOfContext("a * +b;"); 7361 verifyIndependentOfContext("a * -b;"); 7362 verifyIndependentOfContext("a * ++b;"); 7363 verifyIndependentOfContext("a * --b;"); 7364 verifyIndependentOfContext("a[4] * b;"); 7365 verifyIndependentOfContext("a[a * a] = 1;"); 7366 verifyIndependentOfContext("f() * b;"); 7367 verifyIndependentOfContext("a * [self dostuff];"); 7368 verifyIndependentOfContext("int x = a * (a + b);"); 7369 verifyIndependentOfContext("(a *)(a + b);"); 7370 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7371 verifyIndependentOfContext("int *pa = (int *)&a;"); 7372 verifyIndependentOfContext("return sizeof(int **);"); 7373 verifyIndependentOfContext("return sizeof(int ******);"); 7374 verifyIndependentOfContext("return (int **&)a;"); 7375 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7376 verifyFormat("void f(Type (*parameter)[10]) {}"); 7377 verifyFormat("void f(Type (¶meter)[10]) {}"); 7378 verifyGoogleFormat("return sizeof(int**);"); 7379 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7380 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7381 verifyFormat("auto a = [](int **&, int ***) {};"); 7382 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7383 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7384 verifyFormat("[](const decltype(*a) &value) {}"); 7385 verifyFormat("decltype(a * b) F();"); 7386 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7387 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7388 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7389 verifyIndependentOfContext("int i{a * b};"); 7390 verifyIndependentOfContext("aaa && aaa->f();"); 7391 verifyIndependentOfContext("int x = ~*p;"); 7392 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7393 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7394 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7395 verifyFormat("void f() { f(a, c * d); }"); 7396 verifyFormat("void f() { f(new a(), c * d); }"); 7397 verifyFormat("void f(const MyOverride &override);"); 7398 verifyFormat("void f(const MyFinal &final);"); 7399 verifyIndependentOfContext("bool a = f() && override.f();"); 7400 verifyIndependentOfContext("bool a = f() && final.f();"); 7401 7402 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7403 7404 verifyIndependentOfContext("A<int *> a;"); 7405 verifyIndependentOfContext("A<int **> a;"); 7406 verifyIndependentOfContext("A<int *, int *> a;"); 7407 verifyIndependentOfContext("A<int *[]> a;"); 7408 verifyIndependentOfContext( 7409 "const char *const p = reinterpret_cast<const char *const>(q);"); 7410 verifyIndependentOfContext("A<int **, int **> a;"); 7411 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7412 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7413 verifyFormat("for (; a && b;) {\n}"); 7414 verifyFormat("bool foo = true && [] { return false; }();"); 7415 7416 verifyFormat( 7417 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7419 7420 verifyGoogleFormat("int const* a = &b;"); 7421 verifyGoogleFormat("**outparam = 1;"); 7422 verifyGoogleFormat("*outparam = a * b;"); 7423 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7424 verifyGoogleFormat("A<int*> a;"); 7425 verifyGoogleFormat("A<int**> a;"); 7426 verifyGoogleFormat("A<int*, int*> a;"); 7427 verifyGoogleFormat("A<int**, int**> a;"); 7428 verifyGoogleFormat("f(b ? *c : *d);"); 7429 verifyGoogleFormat("int a = b ? *c : *d;"); 7430 verifyGoogleFormat("Type* t = **x;"); 7431 verifyGoogleFormat("Type* t = *++*x;"); 7432 verifyGoogleFormat("*++*x;"); 7433 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7434 verifyGoogleFormat("Type* t = x++ * y;"); 7435 verifyGoogleFormat( 7436 "const char* const p = reinterpret_cast<const char* const>(q);"); 7437 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7438 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7439 verifyGoogleFormat("template <typename T>\n" 7440 "void f(int i = 0, SomeType** temps = NULL);"); 7441 7442 FormatStyle Left = getLLVMStyle(); 7443 Left.PointerAlignment = FormatStyle::PAS_Left; 7444 verifyFormat("x = *a(x) = *a(y);", Left); 7445 verifyFormat("for (;; *a = b) {\n}", Left); 7446 verifyFormat("return *this += 1;", Left); 7447 verifyFormat("throw *x;", Left); 7448 verifyFormat("delete *x;", Left); 7449 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7450 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7451 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7452 verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left); 7453 verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left); 7454 verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left); 7455 7456 verifyIndependentOfContext("a = *(x + y);"); 7457 verifyIndependentOfContext("a = &(x + y);"); 7458 verifyIndependentOfContext("*(x + y).call();"); 7459 verifyIndependentOfContext("&(x + y)->call();"); 7460 verifyFormat("void f() { &(*I).first; }"); 7461 7462 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7463 verifyFormat( 7464 "int *MyValues = {\n" 7465 " *A, // Operator detection might be confused by the '{'\n" 7466 " *BB // Operator detection might be confused by previous comment\n" 7467 "};"); 7468 7469 verifyIndependentOfContext("if (int *a = &b)"); 7470 verifyIndependentOfContext("if (int &a = *b)"); 7471 verifyIndependentOfContext("if (a & b[i])"); 7472 verifyIndependentOfContext("if constexpr (a & b[i])"); 7473 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7474 verifyIndependentOfContext("if (a * (b * c))"); 7475 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7476 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7477 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7478 verifyIndependentOfContext("if (*b[i])"); 7479 verifyIndependentOfContext("if (int *a = (&b))"); 7480 verifyIndependentOfContext("while (int *a = &b)"); 7481 verifyIndependentOfContext("while (a * (b * c))"); 7482 verifyIndependentOfContext("size = sizeof *a;"); 7483 verifyIndependentOfContext("if (a && (b = c))"); 7484 verifyFormat("void f() {\n" 7485 " for (const int &v : Values) {\n" 7486 " }\n" 7487 "}"); 7488 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7489 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7490 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7491 7492 verifyFormat("#define A (!a * b)"); 7493 verifyFormat("#define MACRO \\\n" 7494 " int *i = a * b; \\\n" 7495 " void f(a *b);", 7496 getLLVMStyleWithColumns(19)); 7497 7498 verifyIndependentOfContext("A = new SomeType *[Length];"); 7499 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7500 verifyIndependentOfContext("T **t = new T *;"); 7501 verifyIndependentOfContext("T **t = new T *();"); 7502 verifyGoogleFormat("A = new SomeType*[Length]();"); 7503 verifyGoogleFormat("A = new SomeType*[Length];"); 7504 verifyGoogleFormat("T** t = new T*;"); 7505 verifyGoogleFormat("T** t = new T*();"); 7506 7507 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7508 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7509 verifyFormat("template <bool a, bool b> " 7510 "typename t::if<x && y>::type f() {}"); 7511 verifyFormat("template <int *y> f() {}"); 7512 verifyFormat("vector<int *> v;"); 7513 verifyFormat("vector<int *const> v;"); 7514 verifyFormat("vector<int *const **const *> v;"); 7515 verifyFormat("vector<int *volatile> v;"); 7516 verifyFormat("vector<a * b> v;"); 7517 verifyFormat("foo<b && false>();"); 7518 verifyFormat("foo<b & 1>();"); 7519 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7520 verifyFormat( 7521 "template <class T, class = typename std::enable_if<\n" 7522 " std::is_integral<T>::value &&\n" 7523 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7524 "void F();", 7525 getLLVMStyleWithColumns(70)); 7526 verifyFormat("template <class T,\n" 7527 " class = typename std::enable_if<\n" 7528 " std::is_integral<T>::value &&\n" 7529 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7530 " class U>\n" 7531 "void F();", 7532 getLLVMStyleWithColumns(70)); 7533 verifyFormat( 7534 "template <class T,\n" 7535 " class = typename ::std::enable_if<\n" 7536 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7537 "void F();", 7538 getGoogleStyleWithColumns(68)); 7539 7540 verifyIndependentOfContext("MACRO(int *i);"); 7541 verifyIndependentOfContext("MACRO(auto *a);"); 7542 verifyIndependentOfContext("MACRO(const A *a);"); 7543 verifyIndependentOfContext("MACRO(A *const a);"); 7544 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7545 verifyFormat("void f() { f(float{1}, a * a); }"); 7546 // FIXME: Is there a way to make this work? 7547 // verifyIndependentOfContext("MACRO(A *a);"); 7548 7549 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7550 verifyFormat("return options != nullptr && operator==(*options);"); 7551 7552 EXPECT_EQ("#define OP(x) \\\n" 7553 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7554 " return s << a.DebugString(); \\\n" 7555 " }", 7556 format("#define OP(x) \\\n" 7557 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7558 " return s << a.DebugString(); \\\n" 7559 " }", 7560 getLLVMStyleWithColumns(50))); 7561 7562 // FIXME: We cannot handle this case yet; we might be able to figure out that 7563 // foo<x> d > v; doesn't make sense. 7564 verifyFormat("foo<a<b && c> d> v;"); 7565 7566 FormatStyle PointerMiddle = getLLVMStyle(); 7567 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7568 verifyFormat("delete *x;", PointerMiddle); 7569 verifyFormat("int * x;", PointerMiddle); 7570 verifyFormat("int *[] x;", PointerMiddle); 7571 verifyFormat("template <int * y> f() {}", PointerMiddle); 7572 verifyFormat("int * f(int * a) {}", PointerMiddle); 7573 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7574 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7575 verifyFormat("A<int *> a;", PointerMiddle); 7576 verifyFormat("A<int **> a;", PointerMiddle); 7577 verifyFormat("A<int *, int *> a;", PointerMiddle); 7578 verifyFormat("A<int *[]> a;", PointerMiddle); 7579 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7580 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7581 verifyFormat("T ** t = new T *;", PointerMiddle); 7582 7583 // Member function reference qualifiers aren't binary operators. 7584 verifyFormat("string // break\n" 7585 "operator()() & {}"); 7586 verifyFormat("string // break\n" 7587 "operator()() && {}"); 7588 verifyGoogleFormat("template <typename T>\n" 7589 "auto x() & -> int {}"); 7590 } 7591 7592 TEST_F(FormatTest, UnderstandsAttributes) { 7593 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7594 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7595 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7596 FormatStyle AfterType = getLLVMStyle(); 7597 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7598 verifyFormat("__attribute__((nodebug)) void\n" 7599 "foo() {}\n", 7600 AfterType); 7601 } 7602 7603 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7604 verifyFormat("SomeType s [[unused]] (InitValue);"); 7605 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7606 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7607 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7608 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7609 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7610 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7611 7612 // Make sure we do not mistake attributes for array subscripts. 7613 verifyFormat("int a() {}\n" 7614 "[[unused]] int b() {}\n"); 7615 verifyFormat("NSArray *arr;\n" 7616 "arr[[Foo() bar]];"); 7617 7618 // On the other hand, we still need to correctly find array subscripts. 7619 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7620 7621 // Make sure that we do not mistake Objective-C method inside array literals 7622 // as attributes, even if those method names are also keywords. 7623 verifyFormat("@[ [foo bar] ];"); 7624 verifyFormat("@[ [NSArray class] ];"); 7625 verifyFormat("@[ [foo enum] ];"); 7626 7627 // Make sure we do not parse attributes as lambda introducers. 7628 FormatStyle MultiLineFunctions = getLLVMStyle(); 7629 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7630 verifyFormat("[[unused]] int b() {\n" 7631 " return 42;\n" 7632 "}\n", 7633 MultiLineFunctions); 7634 } 7635 7636 TEST_F(FormatTest, UnderstandsEllipsis) { 7637 verifyFormat("int printf(const char *fmt, ...);"); 7638 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7639 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7640 7641 FormatStyle PointersLeft = getLLVMStyle(); 7642 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7643 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7644 } 7645 7646 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7647 EXPECT_EQ("int *a;\n" 7648 "int *a;\n" 7649 "int *a;", 7650 format("int *a;\n" 7651 "int* a;\n" 7652 "int *a;", 7653 getGoogleStyle())); 7654 EXPECT_EQ("int* a;\n" 7655 "int* a;\n" 7656 "int* a;", 7657 format("int* a;\n" 7658 "int* a;\n" 7659 "int *a;", 7660 getGoogleStyle())); 7661 EXPECT_EQ("int *a;\n" 7662 "int *a;\n" 7663 "int *a;", 7664 format("int *a;\n" 7665 "int * a;\n" 7666 "int * a;", 7667 getGoogleStyle())); 7668 EXPECT_EQ("auto x = [] {\n" 7669 " int *a;\n" 7670 " int *a;\n" 7671 " int *a;\n" 7672 "};", 7673 format("auto x=[]{int *a;\n" 7674 "int * a;\n" 7675 "int * a;};", 7676 getGoogleStyle())); 7677 } 7678 7679 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7680 verifyFormat("int f(int &&a) {}"); 7681 verifyFormat("int f(int a, char &&b) {}"); 7682 verifyFormat("void f() { int &&a = b; }"); 7683 verifyGoogleFormat("int f(int a, char&& b) {}"); 7684 verifyGoogleFormat("void f() { int&& a = b; }"); 7685 7686 verifyIndependentOfContext("A<int &&> a;"); 7687 verifyIndependentOfContext("A<int &&, int &&> a;"); 7688 verifyGoogleFormat("A<int&&> a;"); 7689 verifyGoogleFormat("A<int&&, int&&> a;"); 7690 7691 // Not rvalue references: 7692 verifyFormat("template <bool B, bool C> class A {\n" 7693 " static_assert(B && C, \"Something is wrong\");\n" 7694 "};"); 7695 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7696 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7697 verifyFormat("#define A(a, b) (a && b)"); 7698 } 7699 7700 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7701 verifyFormat("void f() {\n" 7702 " x[aaaaaaaaa -\n" 7703 " b] = 23;\n" 7704 "}", 7705 getLLVMStyleWithColumns(15)); 7706 } 7707 7708 TEST_F(FormatTest, FormatsCasts) { 7709 verifyFormat("Type *A = static_cast<Type *>(P);"); 7710 verifyFormat("Type *A = (Type *)P;"); 7711 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7712 verifyFormat("int a = (int)(2.0f);"); 7713 verifyFormat("int a = (int)2.0f;"); 7714 verifyFormat("x[(int32)y];"); 7715 verifyFormat("x = (int32)y;"); 7716 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7717 verifyFormat("int a = (int)*b;"); 7718 verifyFormat("int a = (int)2.0f;"); 7719 verifyFormat("int a = (int)~0;"); 7720 verifyFormat("int a = (int)++a;"); 7721 verifyFormat("int a = (int)sizeof(int);"); 7722 verifyFormat("int a = (int)+2;"); 7723 verifyFormat("my_int a = (my_int)2.0f;"); 7724 verifyFormat("my_int a = (my_int)sizeof(int);"); 7725 verifyFormat("return (my_int)aaa;"); 7726 verifyFormat("#define x ((int)-1)"); 7727 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7728 verifyFormat("#define p(q) ((int *)&q)"); 7729 verifyFormat("fn(a)(b) + 1;"); 7730 7731 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7732 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7733 verifyFormat("my_int a = (my_int)~0;"); 7734 verifyFormat("my_int a = (my_int)++a;"); 7735 verifyFormat("my_int a = (my_int)-2;"); 7736 verifyFormat("my_int a = (my_int)1;"); 7737 verifyFormat("my_int a = (my_int *)1;"); 7738 verifyFormat("my_int a = (const my_int)-1;"); 7739 verifyFormat("my_int a = (const my_int *)-1;"); 7740 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7741 verifyFormat("my_int a = (ns::my_int)-2;"); 7742 verifyFormat("case (my_int)ONE:"); 7743 verifyFormat("auto x = (X)this;"); 7744 // Casts in Obj-C style calls used to not be recognized as such. 7745 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 7746 7747 // FIXME: single value wrapped with paren will be treated as cast. 7748 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7749 7750 verifyFormat("{ (void)F; }"); 7751 7752 // Don't break after a cast's 7753 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7754 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7755 " bbbbbbbbbbbbbbbbbbbbbb);"); 7756 7757 // These are not casts. 7758 verifyFormat("void f(int *) {}"); 7759 verifyFormat("f(foo)->b;"); 7760 verifyFormat("f(foo).b;"); 7761 verifyFormat("f(foo)(b);"); 7762 verifyFormat("f(foo)[b];"); 7763 verifyFormat("[](foo) { return 4; }(bar);"); 7764 verifyFormat("(*funptr)(foo)[4];"); 7765 verifyFormat("funptrs[4](foo)[4];"); 7766 verifyFormat("void f(int *);"); 7767 verifyFormat("void f(int *) = 0;"); 7768 verifyFormat("void f(SmallVector<int>) {}"); 7769 verifyFormat("void f(SmallVector<int>);"); 7770 verifyFormat("void f(SmallVector<int>) = 0;"); 7771 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7772 verifyFormat("int a = sizeof(int) * b;"); 7773 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7774 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7775 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7776 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7777 7778 // These are not casts, but at some point were confused with casts. 7779 verifyFormat("virtual void foo(int *) override;"); 7780 verifyFormat("virtual void foo(char &) const;"); 7781 verifyFormat("virtual void foo(int *a, char *) const;"); 7782 verifyFormat("int a = sizeof(int *) + b;"); 7783 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7784 verifyFormat("bool b = f(g<int>) && c;"); 7785 verifyFormat("typedef void (*f)(int i) func;"); 7786 verifyFormat("void operator++(int) noexcept;"); 7787 verifyFormat("void operator++(int &) noexcept;"); 7788 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 7789 "&) noexcept;"); 7790 verifyFormat( 7791 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 7792 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 7793 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 7794 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 7795 verifyFormat("void operator delete(foo &) noexcept;"); 7796 verifyFormat("void operator delete(foo) noexcept;"); 7797 verifyFormat("void operator delete(int) noexcept;"); 7798 verifyFormat("void operator delete(int &) noexcept;"); 7799 verifyFormat("void operator delete(int &) volatile noexcept;"); 7800 verifyFormat("void operator delete(int &) const"); 7801 verifyFormat("void operator delete(int &) = default"); 7802 verifyFormat("void operator delete(int &) = delete"); 7803 verifyFormat("void operator delete(int &) [[noreturn]]"); 7804 verifyFormat("void operator delete(int &) throw();"); 7805 verifyFormat("void operator delete(int &) throw(int);"); 7806 verifyFormat("auto operator delete(int &) -> int;"); 7807 verifyFormat("auto operator delete(int &) override"); 7808 verifyFormat("auto operator delete(int &) final"); 7809 7810 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7811 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7812 // FIXME: The indentation here is not ideal. 7813 verifyFormat( 7814 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7815 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7816 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7817 } 7818 7819 TEST_F(FormatTest, FormatsFunctionTypes) { 7820 verifyFormat("A<bool()> a;"); 7821 verifyFormat("A<SomeType()> a;"); 7822 verifyFormat("A<void (*)(int, std::string)> a;"); 7823 verifyFormat("A<void *(int)>;"); 7824 verifyFormat("void *(*a)(int *, SomeType *);"); 7825 verifyFormat("int (*func)(void *);"); 7826 verifyFormat("void f() { int (*func)(void *); }"); 7827 verifyFormat("template <class CallbackClass>\n" 7828 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7829 7830 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7831 verifyGoogleFormat("void* (*a)(int);"); 7832 verifyGoogleFormat( 7833 "template <class CallbackClass>\n" 7834 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7835 7836 // Other constructs can look somewhat like function types: 7837 verifyFormat("A<sizeof(*x)> a;"); 7838 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7839 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7840 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7841 verifyFormat("int x = f(&h)();"); 7842 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7843 verifyFormat("std::function<\n" 7844 " LooooooooooongTemplatedType<\n" 7845 " SomeType>*(\n" 7846 " LooooooooooooooooongType type)>\n" 7847 " function;", 7848 getGoogleStyleWithColumns(40)); 7849 } 7850 7851 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7852 verifyFormat("A (*foo_)[6];"); 7853 verifyFormat("vector<int> (*foo_)[6];"); 7854 } 7855 7856 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7857 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7858 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7859 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7860 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7861 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7862 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7863 7864 // Different ways of ()-initializiation. 7865 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7866 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7867 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7868 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7869 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7870 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7871 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7872 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7873 7874 // Lambdas should not confuse the variable declaration heuristic. 7875 verifyFormat("LooooooooooooooooongType\n" 7876 " variable(nullptr, [](A *a) {});", 7877 getLLVMStyleWithColumns(40)); 7878 } 7879 7880 TEST_F(FormatTest, BreaksLongDeclarations) { 7881 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7882 " AnotherNameForTheLongType;"); 7883 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7885 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7886 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7887 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7888 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7889 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7890 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7891 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7892 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7893 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7894 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7895 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7896 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7897 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7898 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7899 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7900 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7901 FormatStyle Indented = getLLVMStyle(); 7902 Indented.IndentWrappedFunctionNames = true; 7903 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7904 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7905 Indented); 7906 verifyFormat( 7907 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7908 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7909 Indented); 7910 verifyFormat( 7911 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7912 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7913 Indented); 7914 verifyFormat( 7915 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7916 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7917 Indented); 7918 7919 // FIXME: Without the comment, this breaks after "(". 7920 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7921 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7922 getGoogleStyle()); 7923 7924 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7925 " int LoooooooooooooooooooongParam2) {}"); 7926 verifyFormat( 7927 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7928 " SourceLocation L, IdentifierIn *II,\n" 7929 " Type *T) {}"); 7930 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7931 "ReallyReaaallyLongFunctionName(\n" 7932 " const std::string &SomeParameter,\n" 7933 " const SomeType<string, SomeOtherTemplateParameter>\n" 7934 " &ReallyReallyLongParameterName,\n" 7935 " const SomeType<string, SomeOtherTemplateParameter>\n" 7936 " &AnotherLongParameterName) {}"); 7937 verifyFormat("template <typename A>\n" 7938 "SomeLoooooooooooooooooooooongType<\n" 7939 " typename some_namespace::SomeOtherType<A>::Type>\n" 7940 "Function() {}"); 7941 7942 verifyGoogleFormat( 7943 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7944 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7945 verifyGoogleFormat( 7946 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7947 " SourceLocation L) {}"); 7948 verifyGoogleFormat( 7949 "some_namespace::LongReturnType\n" 7950 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7951 " int first_long_parameter, int second_parameter) {}"); 7952 7953 verifyGoogleFormat("template <typename T>\n" 7954 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7955 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7956 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7957 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7958 7959 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7960 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7961 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7962 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7963 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7964 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7965 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7966 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7969 7970 verifyFormat("template <typename T> // Templates on own line.\n" 7971 "static int // Some comment.\n" 7972 "MyFunction(int a);", 7973 getLLVMStyle()); 7974 } 7975 7976 TEST_F(FormatTest, FormatsArrays) { 7977 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7978 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7979 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7980 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7981 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7982 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7983 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7984 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7985 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7986 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7987 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7988 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7989 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7990 verifyFormat( 7991 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7992 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7993 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7994 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7995 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7996 7997 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7998 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7999 verifyFormat( 8000 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 8001 " .aaaaaaa[0]\n" 8002 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8003 verifyFormat("a[::b::c];"); 8004 8005 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 8006 8007 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 8008 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 8009 } 8010 8011 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 8012 verifyFormat("(a)->b();"); 8013 verifyFormat("--a;"); 8014 } 8015 8016 TEST_F(FormatTest, HandlesIncludeDirectives) { 8017 verifyFormat("#include <string>\n" 8018 "#include <a/b/c.h>\n" 8019 "#include \"a/b/string\"\n" 8020 "#include \"string.h\"\n" 8021 "#include \"string.h\"\n" 8022 "#include <a-a>\n" 8023 "#include < path with space >\n" 8024 "#include_next <test.h>" 8025 "#include \"abc.h\" // this is included for ABC\n" 8026 "#include \"some long include\" // with a comment\n" 8027 "#include \"some very long include path\"\n" 8028 "#include <some/very/long/include/path>\n", 8029 getLLVMStyleWithColumns(35)); 8030 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 8031 EXPECT_EQ("#include <a>", format("#include<a>")); 8032 8033 verifyFormat("#import <string>"); 8034 verifyFormat("#import <a/b/c.h>"); 8035 verifyFormat("#import \"a/b/string\""); 8036 verifyFormat("#import \"string.h\""); 8037 verifyFormat("#import \"string.h\""); 8038 verifyFormat("#if __has_include(<strstream>)\n" 8039 "#include <strstream>\n" 8040 "#endif"); 8041 8042 verifyFormat("#define MY_IMPORT <a/b>"); 8043 8044 verifyFormat("#if __has_include(<a/b>)"); 8045 verifyFormat("#if __has_include_next(<a/b>)"); 8046 verifyFormat("#define F __has_include(<a/b>)"); 8047 verifyFormat("#define F __has_include_next(<a/b>)"); 8048 8049 // Protocol buffer definition or missing "#". 8050 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 8051 getLLVMStyleWithColumns(30)); 8052 8053 FormatStyle Style = getLLVMStyle(); 8054 Style.AlwaysBreakBeforeMultilineStrings = true; 8055 Style.ColumnLimit = 0; 8056 verifyFormat("#import \"abc.h\"", Style); 8057 8058 // But 'import' might also be a regular C++ namespace. 8059 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8060 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8061 } 8062 8063 //===----------------------------------------------------------------------===// 8064 // Error recovery tests. 8065 //===----------------------------------------------------------------------===// 8066 8067 TEST_F(FormatTest, IncompleteParameterLists) { 8068 FormatStyle NoBinPacking = getLLVMStyle(); 8069 NoBinPacking.BinPackParameters = false; 8070 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 8071 " double *min_x,\n" 8072 " double *max_x,\n" 8073 " double *min_y,\n" 8074 " double *max_y,\n" 8075 " double *min_z,\n" 8076 " double *max_z, ) {}", 8077 NoBinPacking); 8078 } 8079 8080 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 8081 verifyFormat("void f() { return; }\n42"); 8082 verifyFormat("void f() {\n" 8083 " if (0)\n" 8084 " return;\n" 8085 "}\n" 8086 "42"); 8087 verifyFormat("void f() { return }\n42"); 8088 verifyFormat("void f() {\n" 8089 " if (0)\n" 8090 " return\n" 8091 "}\n" 8092 "42"); 8093 } 8094 8095 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 8096 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 8097 EXPECT_EQ("void f() {\n" 8098 " if (a)\n" 8099 " return\n" 8100 "}", 8101 format("void f ( ) { if ( a ) return }")); 8102 EXPECT_EQ("namespace N {\n" 8103 "void f()\n" 8104 "}", 8105 format("namespace N { void f() }")); 8106 EXPECT_EQ("namespace N {\n" 8107 "void f() {}\n" 8108 "void g()\n" 8109 "} // namespace N", 8110 format("namespace N { void f( ) { } void g( ) }")); 8111 } 8112 8113 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 8114 verifyFormat("int aaaaaaaa =\n" 8115 " // Overlylongcomment\n" 8116 " b;", 8117 getLLVMStyleWithColumns(20)); 8118 verifyFormat("function(\n" 8119 " ShortArgument,\n" 8120 " LoooooooooooongArgument);\n", 8121 getLLVMStyleWithColumns(20)); 8122 } 8123 8124 TEST_F(FormatTest, IncorrectAccessSpecifier) { 8125 verifyFormat("public:"); 8126 verifyFormat("class A {\n" 8127 "public\n" 8128 " void f() {}\n" 8129 "};"); 8130 verifyFormat("public\n" 8131 "int qwerty;"); 8132 verifyFormat("public\n" 8133 "B {}"); 8134 verifyFormat("public\n" 8135 "{}"); 8136 verifyFormat("public\n" 8137 "B { int x; }"); 8138 } 8139 8140 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 8141 verifyFormat("{"); 8142 verifyFormat("#})"); 8143 verifyNoCrash("(/**/[:!] ?[)."); 8144 } 8145 8146 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 8147 // Found by oss-fuzz: 8148 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 8149 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 8150 Style.ColumnLimit = 60; 8151 verifyNoCrash( 8152 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 8153 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 8154 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 8155 Style); 8156 } 8157 8158 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 8159 verifyFormat("do {\n}"); 8160 verifyFormat("do {\n}\n" 8161 "f();"); 8162 verifyFormat("do {\n}\n" 8163 "wheeee(fun);"); 8164 verifyFormat("do {\n" 8165 " f();\n" 8166 "}"); 8167 } 8168 8169 TEST_F(FormatTest, IncorrectCodeMissingParens) { 8170 verifyFormat("if {\n foo;\n foo();\n}"); 8171 verifyFormat("switch {\n foo;\n foo();\n}"); 8172 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 8173 verifyFormat("while {\n foo;\n foo();\n}"); 8174 verifyFormat("do {\n foo;\n foo();\n} while;"); 8175 } 8176 8177 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 8178 verifyIncompleteFormat("namespace {\n" 8179 "class Foo { Foo (\n" 8180 "};\n" 8181 "} // namespace"); 8182 } 8183 8184 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 8185 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 8186 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 8187 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 8188 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 8189 8190 EXPECT_EQ("{\n" 8191 " {\n" 8192 " breakme(\n" 8193 " qwe);\n" 8194 " }\n", 8195 format("{\n" 8196 " {\n" 8197 " breakme(qwe);\n" 8198 "}\n", 8199 getLLVMStyleWithColumns(10))); 8200 } 8201 8202 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 8203 verifyFormat("int x = {\n" 8204 " avariable,\n" 8205 " b(alongervariable)};", 8206 getLLVMStyleWithColumns(25)); 8207 } 8208 8209 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 8210 verifyFormat("return (a)(b){1, 2, 3};"); 8211 } 8212 8213 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 8214 verifyFormat("vector<int> x{1, 2, 3, 4};"); 8215 verifyFormat("vector<int> x{\n" 8216 " 1,\n" 8217 " 2,\n" 8218 " 3,\n" 8219 " 4,\n" 8220 "};"); 8221 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 8222 verifyFormat("f({1, 2});"); 8223 verifyFormat("auto v = Foo{-1};"); 8224 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 8225 verifyFormat("Class::Class : member{1, 2, 3} {}"); 8226 verifyFormat("new vector<int>{1, 2, 3};"); 8227 verifyFormat("new int[3]{1, 2, 3};"); 8228 verifyFormat("new int{1};"); 8229 verifyFormat("return {arg1, arg2};"); 8230 verifyFormat("return {arg1, SomeType{parameter}};"); 8231 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 8232 verifyFormat("new T{arg1, arg2};"); 8233 verifyFormat("f(MyMap[{composite, key}]);"); 8234 verifyFormat("class Class {\n" 8235 " T member = {arg1, arg2};\n" 8236 "};"); 8237 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 8238 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 8239 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 8240 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 8241 verifyFormat("int a = std::is_integral<int>{} + 0;"); 8242 8243 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8244 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8245 verifyFormat("auto i = decltype(x){};"); 8246 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 8247 verifyFormat("Node n{1, Node{1000}, //\n" 8248 " 2};"); 8249 verifyFormat("Aaaa aaaaaaa{\n" 8250 " {\n" 8251 " aaaa,\n" 8252 " },\n" 8253 "};"); 8254 verifyFormat("class C : public D {\n" 8255 " SomeClass SC{2};\n" 8256 "};"); 8257 verifyFormat("class C : public A {\n" 8258 " class D : public B {\n" 8259 " void f() { int i{2}; }\n" 8260 " };\n" 8261 "};"); 8262 verifyFormat("#define A {a, a},"); 8263 8264 // Avoid breaking between equal sign and opening brace 8265 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 8266 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 8267 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 8268 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 8269 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 8270 " {\"ccccccccccccccccccccc\", 2}};", 8271 AvoidBreakingFirstArgument); 8272 8273 // Binpacking only if there is no trailing comma 8274 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 8275 " cccccccccc, dddddddddd};", 8276 getLLVMStyleWithColumns(50)); 8277 verifyFormat("const Aaaaaa aaaaa = {\n" 8278 " aaaaaaaaaaa,\n" 8279 " bbbbbbbbbbb,\n" 8280 " ccccccccccc,\n" 8281 " ddddddddddd,\n" 8282 "};", 8283 getLLVMStyleWithColumns(50)); 8284 8285 // Cases where distinguising braced lists and blocks is hard. 8286 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 8287 verifyFormat("void f() {\n" 8288 " return; // comment\n" 8289 "}\n" 8290 "SomeType t;"); 8291 verifyFormat("void f() {\n" 8292 " if (a) {\n" 8293 " f();\n" 8294 " }\n" 8295 "}\n" 8296 "SomeType t;"); 8297 8298 // In combination with BinPackArguments = false. 8299 FormatStyle NoBinPacking = getLLVMStyle(); 8300 NoBinPacking.BinPackArguments = false; 8301 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 8302 " bbbbb,\n" 8303 " ccccc,\n" 8304 " ddddd,\n" 8305 " eeeee,\n" 8306 " ffffff,\n" 8307 " ggggg,\n" 8308 " hhhhhh,\n" 8309 " iiiiii,\n" 8310 " jjjjjj,\n" 8311 " kkkkkk};", 8312 NoBinPacking); 8313 verifyFormat("const Aaaaaa aaaaa = {\n" 8314 " aaaaa,\n" 8315 " bbbbb,\n" 8316 " ccccc,\n" 8317 " ddddd,\n" 8318 " eeeee,\n" 8319 " ffffff,\n" 8320 " ggggg,\n" 8321 " hhhhhh,\n" 8322 " iiiiii,\n" 8323 " jjjjjj,\n" 8324 " kkkkkk,\n" 8325 "};", 8326 NoBinPacking); 8327 verifyFormat( 8328 "const Aaaaaa aaaaa = {\n" 8329 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 8330 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 8331 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 8332 "};", 8333 NoBinPacking); 8334 8335 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8336 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 8337 " CDDDP83848_BMCR_REGISTER,\n" 8338 " CDDDP83848_BMSR_REGISTER,\n" 8339 " CDDDP83848_RBR_REGISTER};", 8340 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 8341 " CDDDP83848_BMSR_REGISTER,\n" 8342 " CDDDP83848_RBR_REGISTER};", 8343 NoBinPacking)); 8344 8345 // FIXME: The alignment of these trailing comments might be bad. Then again, 8346 // this might be utterly useless in real code. 8347 verifyFormat("Constructor::Constructor()\n" 8348 " : some_value{ //\n" 8349 " aaaaaaa, //\n" 8350 " bbbbbbb} {}"); 8351 8352 // In braced lists, the first comment is always assumed to belong to the 8353 // first element. Thus, it can be moved to the next or previous line as 8354 // appropriate. 8355 EXPECT_EQ("function({// First element:\n" 8356 " 1,\n" 8357 " // Second element:\n" 8358 " 2});", 8359 format("function({\n" 8360 " // First element:\n" 8361 " 1,\n" 8362 " // Second element:\n" 8363 " 2});")); 8364 EXPECT_EQ("std::vector<int> MyNumbers{\n" 8365 " // First element:\n" 8366 " 1,\n" 8367 " // Second element:\n" 8368 " 2};", 8369 format("std::vector<int> MyNumbers{// First element:\n" 8370 " 1,\n" 8371 " // Second element:\n" 8372 " 2};", 8373 getLLVMStyleWithColumns(30))); 8374 // A trailing comma should still lead to an enforced line break and no 8375 // binpacking. 8376 EXPECT_EQ("vector<int> SomeVector = {\n" 8377 " // aaa\n" 8378 " 1,\n" 8379 " 2,\n" 8380 "};", 8381 format("vector<int> SomeVector = { // aaa\n" 8382 " 1, 2, };")); 8383 8384 FormatStyle ExtraSpaces = getLLVMStyle(); 8385 ExtraSpaces.Cpp11BracedListStyle = false; 8386 ExtraSpaces.ColumnLimit = 75; 8387 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8388 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8389 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8390 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8391 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8392 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8393 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8394 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8395 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8396 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8397 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8398 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8399 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8400 verifyFormat("class Class {\n" 8401 " T member = { arg1, arg2 };\n" 8402 "};", 8403 ExtraSpaces); 8404 verifyFormat( 8405 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8406 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8407 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8408 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8409 ExtraSpaces); 8410 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 8411 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 8412 ExtraSpaces); 8413 verifyFormat( 8414 "someFunction(OtherParam,\n" 8415 " BracedList{ // comment 1 (Forcing interesting break)\n" 8416 " param1, param2,\n" 8417 " // comment 2\n" 8418 " param3, param4 });", 8419 ExtraSpaces); 8420 verifyFormat( 8421 "std::this_thread::sleep_for(\n" 8422 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 8423 ExtraSpaces); 8424 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 8425 " aaaaaaa,\n" 8426 " aaaaaaaaaa,\n" 8427 " aaaaa,\n" 8428 " aaaaaaaaaaaaaaa,\n" 8429 " aaa,\n" 8430 " aaaaaaaaaa,\n" 8431 " a,\n" 8432 " aaaaaaaaaaaaaaaaaaaaa,\n" 8433 " aaaaaaaaaaaa,\n" 8434 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 8435 " aaaaaaa,\n" 8436 " a};"); 8437 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 8438 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 8439 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 8440 8441 // Avoid breaking between initializer/equal sign and opening brace 8442 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 8443 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 8444 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8445 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8446 " { \"ccccccccccccccccccccc\", 2 }\n" 8447 "};", 8448 ExtraSpaces); 8449 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 8450 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8451 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8452 " { \"ccccccccccccccccccccc\", 2 }\n" 8453 "};", 8454 ExtraSpaces); 8455 8456 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 8457 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 8458 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 8459 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 8460 8461 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 8462 SpaceBetweenBraces.SpacesInAngles = true; 8463 SpaceBetweenBraces.SpacesInParentheses = true; 8464 SpaceBetweenBraces.SpacesInSquareBrackets = true; 8465 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 8466 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 8467 verifyFormat("vector< int > x{ // comment 1\n" 8468 " 1, 2, 3, 4 };", 8469 SpaceBetweenBraces); 8470 SpaceBetweenBraces.ColumnLimit = 20; 8471 EXPECT_EQ("vector< int > x{\n" 8472 " 1, 2, 3, 4 };", 8473 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8474 SpaceBetweenBraces.ColumnLimit = 24; 8475 EXPECT_EQ("vector< int > x{ 1, 2,\n" 8476 " 3, 4 };", 8477 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 8478 EXPECT_EQ("vector< int > x{\n" 8479 " 1,\n" 8480 " 2,\n" 8481 " 3,\n" 8482 " 4,\n" 8483 "};", 8484 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 8485 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 8486 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 8487 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 8488 } 8489 8490 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 8491 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8492 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8493 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8494 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8495 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8496 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8497 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 8498 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8499 " 1, 22, 333, 4444, 55555, //\n" 8500 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8501 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8502 verifyFormat( 8503 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8504 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8505 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 8506 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8507 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8508 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8509 " 7777777};"); 8510 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8511 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8512 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8513 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8514 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8515 " // Separating comment.\n" 8516 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8517 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8518 " // Leading comment\n" 8519 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8520 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8521 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8522 " 1, 1, 1, 1};", 8523 getLLVMStyleWithColumns(39)); 8524 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8525 " 1, 1, 1, 1};", 8526 getLLVMStyleWithColumns(38)); 8527 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 8528 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 8529 getLLVMStyleWithColumns(43)); 8530 verifyFormat( 8531 "static unsigned SomeValues[10][3] = {\n" 8532 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 8533 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 8534 verifyFormat("static auto fields = new vector<string>{\n" 8535 " \"aaaaaaaaaaaaa\",\n" 8536 " \"aaaaaaaaaaaaa\",\n" 8537 " \"aaaaaaaaaaaa\",\n" 8538 " \"aaaaaaaaaaaaaa\",\n" 8539 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8540 " \"aaaaaaaaaaaa\",\n" 8541 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8542 "};"); 8543 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8544 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8545 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8546 " 3, cccccccccccccccccccccc};", 8547 getLLVMStyleWithColumns(60)); 8548 8549 // Trailing commas. 8550 verifyFormat("vector<int> x = {\n" 8551 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8552 "};", 8553 getLLVMStyleWithColumns(39)); 8554 verifyFormat("vector<int> x = {\n" 8555 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8556 "};", 8557 getLLVMStyleWithColumns(39)); 8558 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8559 " 1, 1, 1, 1,\n" 8560 " /**/ /**/};", 8561 getLLVMStyleWithColumns(39)); 8562 8563 // Trailing comment in the first line. 8564 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8565 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8566 " 111111111, 222222222, 3333333333, 444444444, //\n" 8567 " 11111111, 22222222, 333333333, 44444444};"); 8568 // Trailing comment in the last line. 8569 verifyFormat("int aaaaa[] = {\n" 8570 " 1, 2, 3, // comment\n" 8571 " 4, 5, 6 // comment\n" 8572 "};"); 8573 8574 // With nested lists, we should either format one item per line or all nested 8575 // lists one on line. 8576 // FIXME: For some nested lists, we can do better. 8577 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8578 " {aaaaaaaaaaaaaaaaaaa},\n" 8579 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8580 " {aaaaaaaaaaaaaaaaa}};", 8581 getLLVMStyleWithColumns(60)); 8582 verifyFormat( 8583 "SomeStruct my_struct_array = {\n" 8584 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8585 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8586 " {aaa, aaa},\n" 8587 " {aaa, aaa},\n" 8588 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8589 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8590 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8591 8592 // No column layout should be used here. 8593 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8594 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8595 8596 verifyNoCrash("a<,"); 8597 8598 // No braced initializer here. 8599 verifyFormat("void f() {\n" 8600 " struct Dummy {};\n" 8601 " f(v);\n" 8602 "}"); 8603 8604 // Long lists should be formatted in columns even if they are nested. 8605 verifyFormat( 8606 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8607 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8608 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8609 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8610 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8611 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8612 8613 // Allow "single-column" layout even if that violates the column limit. There 8614 // isn't going to be a better way. 8615 verifyFormat("std::vector<int> a = {\n" 8616 " aaaaaaaa,\n" 8617 " aaaaaaaa,\n" 8618 " aaaaaaaa,\n" 8619 " aaaaaaaa,\n" 8620 " aaaaaaaaaa,\n" 8621 " aaaaaaaa,\n" 8622 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8623 getLLVMStyleWithColumns(30)); 8624 verifyFormat("vector<int> aaaa = {\n" 8625 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8626 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8627 " aaaaaa.aaaaaaa,\n" 8628 " aaaaaa.aaaaaaa,\n" 8629 " aaaaaa.aaaaaaa,\n" 8630 " aaaaaa.aaaaaaa,\n" 8631 "};"); 8632 8633 // Don't create hanging lists. 8634 verifyFormat("someFunction(Param, {List1, List2,\n" 8635 " List3});", 8636 getLLVMStyleWithColumns(35)); 8637 verifyFormat("someFunction(Param, Param,\n" 8638 " {List1, List2,\n" 8639 " List3});", 8640 getLLVMStyleWithColumns(35)); 8641 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8642 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8643 } 8644 8645 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8646 FormatStyle DoNotMerge = getLLVMStyle(); 8647 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8648 8649 verifyFormat("void f() { return 42; }"); 8650 verifyFormat("void f() {\n" 8651 " return 42;\n" 8652 "}", 8653 DoNotMerge); 8654 verifyFormat("void f() {\n" 8655 " // Comment\n" 8656 "}"); 8657 verifyFormat("{\n" 8658 "#error {\n" 8659 " int a;\n" 8660 "}"); 8661 verifyFormat("{\n" 8662 " int a;\n" 8663 "#error {\n" 8664 "}"); 8665 verifyFormat("void f() {} // comment"); 8666 verifyFormat("void f() { int a; } // comment"); 8667 verifyFormat("void f() {\n" 8668 "} // comment", 8669 DoNotMerge); 8670 verifyFormat("void f() {\n" 8671 " int a;\n" 8672 "} // comment", 8673 DoNotMerge); 8674 verifyFormat("void f() {\n" 8675 "} // comment", 8676 getLLVMStyleWithColumns(15)); 8677 8678 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8679 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8680 8681 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8682 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8683 verifyFormat("class C {\n" 8684 " C()\n" 8685 " : iiiiiiii(nullptr),\n" 8686 " kkkkkkk(nullptr),\n" 8687 " mmmmmmm(nullptr),\n" 8688 " nnnnnnn(nullptr) {}\n" 8689 "};", 8690 getGoogleStyle()); 8691 8692 FormatStyle NoColumnLimit = getLLVMStyle(); 8693 NoColumnLimit.ColumnLimit = 0; 8694 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8695 EXPECT_EQ("class C {\n" 8696 " A() : b(0) {}\n" 8697 "};", 8698 format("class C{A():b(0){}};", NoColumnLimit)); 8699 EXPECT_EQ("A()\n" 8700 " : b(0) {\n" 8701 "}", 8702 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8703 8704 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8705 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8706 FormatStyle::SFS_None; 8707 EXPECT_EQ("A()\n" 8708 " : b(0) {\n" 8709 "}", 8710 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8711 EXPECT_EQ("A()\n" 8712 " : b(0) {\n" 8713 "}", 8714 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8715 8716 verifyFormat("#define A \\\n" 8717 " void f() { \\\n" 8718 " int i; \\\n" 8719 " }", 8720 getLLVMStyleWithColumns(20)); 8721 verifyFormat("#define A \\\n" 8722 " void f() { int i; }", 8723 getLLVMStyleWithColumns(21)); 8724 verifyFormat("#define A \\\n" 8725 " void f() { \\\n" 8726 " int i; \\\n" 8727 " } \\\n" 8728 " int j;", 8729 getLLVMStyleWithColumns(22)); 8730 verifyFormat("#define A \\\n" 8731 " void f() { int i; } \\\n" 8732 " int j;", 8733 getLLVMStyleWithColumns(23)); 8734 } 8735 8736 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8737 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8738 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8739 verifyFormat("class C {\n" 8740 " int f() {}\n" 8741 "};", 8742 MergeEmptyOnly); 8743 verifyFormat("class C {\n" 8744 " int f() {\n" 8745 " return 42;\n" 8746 " }\n" 8747 "};", 8748 MergeEmptyOnly); 8749 verifyFormat("int f() {}", MergeEmptyOnly); 8750 verifyFormat("int f() {\n" 8751 " return 42;\n" 8752 "}", 8753 MergeEmptyOnly); 8754 8755 // Also verify behavior when BraceWrapping.AfterFunction = true 8756 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8757 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8758 verifyFormat("int f() {}", MergeEmptyOnly); 8759 verifyFormat("class C {\n" 8760 " int f() {}\n" 8761 "};", 8762 MergeEmptyOnly); 8763 } 8764 8765 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8766 FormatStyle MergeInlineOnly = getLLVMStyle(); 8767 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8768 verifyFormat("class C {\n" 8769 " int f() { return 42; }\n" 8770 "};", 8771 MergeInlineOnly); 8772 verifyFormat("int f() {\n" 8773 " return 42;\n" 8774 "}", 8775 MergeInlineOnly); 8776 8777 // SFS_Inline implies SFS_Empty 8778 verifyFormat("class C {\n" 8779 " int f() {}\n" 8780 "};", 8781 MergeInlineOnly); 8782 verifyFormat("int f() {}", MergeInlineOnly); 8783 8784 // Also verify behavior when BraceWrapping.AfterFunction = true 8785 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8786 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8787 verifyFormat("class C {\n" 8788 " int f() { return 42; }\n" 8789 "};", 8790 MergeInlineOnly); 8791 verifyFormat("int f()\n" 8792 "{\n" 8793 " return 42;\n" 8794 "}", 8795 MergeInlineOnly); 8796 8797 // SFS_Inline implies SFS_Empty 8798 verifyFormat("int f() {}", MergeInlineOnly); 8799 verifyFormat("class C {\n" 8800 " int f() {}\n" 8801 "};", 8802 MergeInlineOnly); 8803 } 8804 8805 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8806 FormatStyle MergeInlineOnly = getLLVMStyle(); 8807 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8808 FormatStyle::SFS_InlineOnly; 8809 verifyFormat("class C {\n" 8810 " int f() { return 42; }\n" 8811 "};", 8812 MergeInlineOnly); 8813 verifyFormat("int f() {\n" 8814 " return 42;\n" 8815 "}", 8816 MergeInlineOnly); 8817 8818 // SFS_InlineOnly does not imply SFS_Empty 8819 verifyFormat("class C {\n" 8820 " int f() {}\n" 8821 "};", 8822 MergeInlineOnly); 8823 verifyFormat("int f() {\n" 8824 "}", 8825 MergeInlineOnly); 8826 8827 // Also verify behavior when BraceWrapping.AfterFunction = true 8828 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8829 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8830 verifyFormat("class C {\n" 8831 " int f() { return 42; }\n" 8832 "};", 8833 MergeInlineOnly); 8834 verifyFormat("int f()\n" 8835 "{\n" 8836 " return 42;\n" 8837 "}", 8838 MergeInlineOnly); 8839 8840 // SFS_InlineOnly does not imply SFS_Empty 8841 verifyFormat("int f()\n" 8842 "{\n" 8843 "}", 8844 MergeInlineOnly); 8845 verifyFormat("class C {\n" 8846 " int f() {}\n" 8847 "};", 8848 MergeInlineOnly); 8849 } 8850 8851 TEST_F(FormatTest, SplitEmptyFunction) { 8852 FormatStyle Style = getLLVMStyle(); 8853 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8854 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8855 Style.BraceWrapping.AfterFunction = true; 8856 Style.BraceWrapping.SplitEmptyFunction = false; 8857 Style.ColumnLimit = 40; 8858 8859 verifyFormat("int f()\n" 8860 "{}", 8861 Style); 8862 verifyFormat("int f()\n" 8863 "{\n" 8864 " return 42;\n" 8865 "}", 8866 Style); 8867 verifyFormat("int f()\n" 8868 "{\n" 8869 " // some comment\n" 8870 "}", 8871 Style); 8872 8873 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8874 verifyFormat("int f() {}", Style); 8875 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8876 "{}", 8877 Style); 8878 verifyFormat("int f()\n" 8879 "{\n" 8880 " return 0;\n" 8881 "}", 8882 Style); 8883 8884 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8885 verifyFormat("class Foo {\n" 8886 " int f() {}\n" 8887 "};\n", 8888 Style); 8889 verifyFormat("class Foo {\n" 8890 " int f() { return 0; }\n" 8891 "};\n", 8892 Style); 8893 verifyFormat("class Foo {\n" 8894 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8895 " {}\n" 8896 "};\n", 8897 Style); 8898 verifyFormat("class Foo {\n" 8899 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8900 " {\n" 8901 " return 0;\n" 8902 " }\n" 8903 "};\n", 8904 Style); 8905 8906 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8907 verifyFormat("int f() {}", Style); 8908 verifyFormat("int f() { return 0; }", Style); 8909 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8910 "{}", 8911 Style); 8912 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8913 "{\n" 8914 " return 0;\n" 8915 "}", 8916 Style); 8917 } 8918 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8919 FormatStyle Style = getLLVMStyle(); 8920 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8921 verifyFormat("#ifdef A\n" 8922 "int f() {}\n" 8923 "#else\n" 8924 "int g() {}\n" 8925 "#endif", 8926 Style); 8927 } 8928 8929 TEST_F(FormatTest, SplitEmptyClass) { 8930 FormatStyle Style = getLLVMStyle(); 8931 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8932 Style.BraceWrapping.AfterClass = true; 8933 Style.BraceWrapping.SplitEmptyRecord = false; 8934 8935 verifyFormat("class Foo\n" 8936 "{};", 8937 Style); 8938 verifyFormat("/* something */ class Foo\n" 8939 "{};", 8940 Style); 8941 verifyFormat("template <typename X> class Foo\n" 8942 "{};", 8943 Style); 8944 verifyFormat("class Foo\n" 8945 "{\n" 8946 " Foo();\n" 8947 "};", 8948 Style); 8949 verifyFormat("typedef class Foo\n" 8950 "{\n" 8951 "} Foo_t;", 8952 Style); 8953 } 8954 8955 TEST_F(FormatTest, SplitEmptyStruct) { 8956 FormatStyle Style = getLLVMStyle(); 8957 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8958 Style.BraceWrapping.AfterStruct = true; 8959 Style.BraceWrapping.SplitEmptyRecord = false; 8960 8961 verifyFormat("struct Foo\n" 8962 "{};", 8963 Style); 8964 verifyFormat("/* something */ struct Foo\n" 8965 "{};", 8966 Style); 8967 verifyFormat("template <typename X> struct Foo\n" 8968 "{};", 8969 Style); 8970 verifyFormat("struct Foo\n" 8971 "{\n" 8972 " Foo();\n" 8973 "};", 8974 Style); 8975 verifyFormat("typedef struct Foo\n" 8976 "{\n" 8977 "} Foo_t;", 8978 Style); 8979 // typedef struct Bar {} Bar_t; 8980 } 8981 8982 TEST_F(FormatTest, SplitEmptyUnion) { 8983 FormatStyle Style = getLLVMStyle(); 8984 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8985 Style.BraceWrapping.AfterUnion = true; 8986 Style.BraceWrapping.SplitEmptyRecord = false; 8987 8988 verifyFormat("union Foo\n" 8989 "{};", 8990 Style); 8991 verifyFormat("/* something */ union Foo\n" 8992 "{};", 8993 Style); 8994 verifyFormat("union Foo\n" 8995 "{\n" 8996 " A,\n" 8997 "};", 8998 Style); 8999 verifyFormat("typedef union Foo\n" 9000 "{\n" 9001 "} Foo_t;", 9002 Style); 9003 } 9004 9005 TEST_F(FormatTest, SplitEmptyNamespace) { 9006 FormatStyle Style = getLLVMStyle(); 9007 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9008 Style.BraceWrapping.AfterNamespace = true; 9009 Style.BraceWrapping.SplitEmptyNamespace = false; 9010 9011 verifyFormat("namespace Foo\n" 9012 "{};", 9013 Style); 9014 verifyFormat("/* something */ namespace Foo\n" 9015 "{};", 9016 Style); 9017 verifyFormat("inline namespace Foo\n" 9018 "{};", 9019 Style); 9020 verifyFormat("/* something */ inline namespace Foo\n" 9021 "{};", 9022 Style); 9023 verifyFormat("export namespace Foo\n" 9024 "{};", 9025 Style); 9026 verifyFormat("namespace Foo\n" 9027 "{\n" 9028 "void Bar();\n" 9029 "};", 9030 Style); 9031 } 9032 9033 TEST_F(FormatTest, NeverMergeShortRecords) { 9034 FormatStyle Style = getLLVMStyle(); 9035 9036 verifyFormat("class Foo {\n" 9037 " Foo();\n" 9038 "};", 9039 Style); 9040 verifyFormat("typedef class Foo {\n" 9041 " Foo();\n" 9042 "} Foo_t;", 9043 Style); 9044 verifyFormat("struct Foo {\n" 9045 " Foo();\n" 9046 "};", 9047 Style); 9048 verifyFormat("typedef struct Foo {\n" 9049 " Foo();\n" 9050 "} Foo_t;", 9051 Style); 9052 verifyFormat("union Foo {\n" 9053 " A,\n" 9054 "};", 9055 Style); 9056 verifyFormat("typedef union Foo {\n" 9057 " A,\n" 9058 "} Foo_t;", 9059 Style); 9060 verifyFormat("namespace Foo {\n" 9061 "void Bar();\n" 9062 "};", 9063 Style); 9064 9065 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9066 Style.BraceWrapping.AfterClass = true; 9067 Style.BraceWrapping.AfterStruct = true; 9068 Style.BraceWrapping.AfterUnion = true; 9069 Style.BraceWrapping.AfterNamespace = true; 9070 verifyFormat("class Foo\n" 9071 "{\n" 9072 " Foo();\n" 9073 "};", 9074 Style); 9075 verifyFormat("typedef class Foo\n" 9076 "{\n" 9077 " Foo();\n" 9078 "} Foo_t;", 9079 Style); 9080 verifyFormat("struct Foo\n" 9081 "{\n" 9082 " Foo();\n" 9083 "};", 9084 Style); 9085 verifyFormat("typedef struct Foo\n" 9086 "{\n" 9087 " Foo();\n" 9088 "} Foo_t;", 9089 Style); 9090 verifyFormat("union Foo\n" 9091 "{\n" 9092 " A,\n" 9093 "};", 9094 Style); 9095 verifyFormat("typedef union Foo\n" 9096 "{\n" 9097 " A,\n" 9098 "} Foo_t;", 9099 Style); 9100 verifyFormat("namespace Foo\n" 9101 "{\n" 9102 "void Bar();\n" 9103 "};", 9104 Style); 9105 } 9106 9107 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 9108 // Elaborate type variable declarations. 9109 verifyFormat("struct foo a = {bar};\nint n;"); 9110 verifyFormat("class foo a = {bar};\nint n;"); 9111 verifyFormat("union foo a = {bar};\nint n;"); 9112 9113 // Elaborate types inside function definitions. 9114 verifyFormat("struct foo f() {}\nint n;"); 9115 verifyFormat("class foo f() {}\nint n;"); 9116 verifyFormat("union foo f() {}\nint n;"); 9117 9118 // Templates. 9119 verifyFormat("template <class X> void f() {}\nint n;"); 9120 verifyFormat("template <struct X> void f() {}\nint n;"); 9121 verifyFormat("template <union X> void f() {}\nint n;"); 9122 9123 // Actual definitions... 9124 verifyFormat("struct {\n} n;"); 9125 verifyFormat( 9126 "template <template <class T, class Y>, class Z> class X {\n} n;"); 9127 verifyFormat("union Z {\n int n;\n} x;"); 9128 verifyFormat("class MACRO Z {\n} n;"); 9129 verifyFormat("class MACRO(X) Z {\n} n;"); 9130 verifyFormat("class __attribute__(X) Z {\n} n;"); 9131 verifyFormat("class __declspec(X) Z {\n} n;"); 9132 verifyFormat("class A##B##C {\n} n;"); 9133 verifyFormat("class alignas(16) Z {\n} n;"); 9134 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 9135 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 9136 9137 // Redefinition from nested context: 9138 verifyFormat("class A::B::C {\n} n;"); 9139 9140 // Template definitions. 9141 verifyFormat( 9142 "template <typename F>\n" 9143 "Matcher(const Matcher<F> &Other,\n" 9144 " typename enable_if_c<is_base_of<F, T>::value &&\n" 9145 " !is_same<F, T>::value>::type * = 0)\n" 9146 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 9147 9148 // FIXME: This is still incorrectly handled at the formatter side. 9149 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 9150 verifyFormat("int i = SomeFunction(a<b, a> b);"); 9151 9152 // FIXME: 9153 // This now gets parsed incorrectly as class definition. 9154 // verifyFormat("class A<int> f() {\n}\nint n;"); 9155 9156 // Elaborate types where incorrectly parsing the structural element would 9157 // break the indent. 9158 verifyFormat("if (true)\n" 9159 " class X x;\n" 9160 "else\n" 9161 " f();\n"); 9162 9163 // This is simply incomplete. Formatting is not important, but must not crash. 9164 verifyFormat("class A:"); 9165 } 9166 9167 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 9168 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 9169 format("#error Leave all white!!!!! space* alone!\n")); 9170 EXPECT_EQ( 9171 "#warning Leave all white!!!!! space* alone!\n", 9172 format("#warning Leave all white!!!!! space* alone!\n")); 9173 EXPECT_EQ("#error 1", format(" # error 1")); 9174 EXPECT_EQ("#warning 1", format(" # warning 1")); 9175 } 9176 9177 TEST_F(FormatTest, FormatHashIfExpressions) { 9178 verifyFormat("#if AAAA && BBBB"); 9179 verifyFormat("#if (AAAA && BBBB)"); 9180 verifyFormat("#elif (AAAA && BBBB)"); 9181 // FIXME: Come up with a better indentation for #elif. 9182 verifyFormat( 9183 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 9184 " defined(BBBBBBBB)\n" 9185 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 9186 " defined(BBBBBBBB)\n" 9187 "#endif", 9188 getLLVMStyleWithColumns(65)); 9189 } 9190 9191 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 9192 FormatStyle AllowsMergedIf = getGoogleStyle(); 9193 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 9194 FormatStyle::SIS_WithoutElse; 9195 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 9196 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 9197 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 9198 EXPECT_EQ("if (true) return 42;", 9199 format("if (true)\nreturn 42;", AllowsMergedIf)); 9200 FormatStyle ShortMergedIf = AllowsMergedIf; 9201 ShortMergedIf.ColumnLimit = 25; 9202 verifyFormat("#define A \\\n" 9203 " if (true) return 42;", 9204 ShortMergedIf); 9205 verifyFormat("#define A \\\n" 9206 " f(); \\\n" 9207 " if (true)\n" 9208 "#define B", 9209 ShortMergedIf); 9210 verifyFormat("#define A \\\n" 9211 " f(); \\\n" 9212 " if (true)\n" 9213 "g();", 9214 ShortMergedIf); 9215 verifyFormat("{\n" 9216 "#ifdef A\n" 9217 " // Comment\n" 9218 " if (true) continue;\n" 9219 "#endif\n" 9220 " // Comment\n" 9221 " if (true) continue;\n" 9222 "}", 9223 ShortMergedIf); 9224 ShortMergedIf.ColumnLimit = 33; 9225 verifyFormat("#define A \\\n" 9226 " if constexpr (true) return 42;", 9227 ShortMergedIf); 9228 verifyFormat("#define A \\\n" 9229 " if CONSTEXPR (true) return 42;", 9230 ShortMergedIf); 9231 ShortMergedIf.ColumnLimit = 29; 9232 verifyFormat("#define A \\\n" 9233 " if (aaaaaaaaaa) return 1; \\\n" 9234 " return 2;", 9235 ShortMergedIf); 9236 ShortMergedIf.ColumnLimit = 28; 9237 verifyFormat("#define A \\\n" 9238 " if (aaaaaaaaaa) \\\n" 9239 " return 1; \\\n" 9240 " return 2;", 9241 ShortMergedIf); 9242 verifyFormat("#define A \\\n" 9243 " if constexpr (aaaaaaa) \\\n" 9244 " return 1; \\\n" 9245 " return 2;", 9246 ShortMergedIf); 9247 verifyFormat("#define A \\\n" 9248 " if CONSTEXPR (aaaaaaa) \\\n" 9249 " return 1; \\\n" 9250 " return 2;", 9251 ShortMergedIf); 9252 } 9253 9254 TEST_F(FormatTest, FormatStarDependingOnContext) { 9255 verifyFormat("void f(int *a);"); 9256 verifyFormat("void f() { f(fint * b); }"); 9257 verifyFormat("class A {\n void f(int *a);\n};"); 9258 verifyFormat("class A {\n int *a;\n};"); 9259 verifyFormat("namespace a {\n" 9260 "namespace b {\n" 9261 "class A {\n" 9262 " void f() {}\n" 9263 " int *a;\n" 9264 "};\n" 9265 "} // namespace b\n" 9266 "} // namespace a"); 9267 } 9268 9269 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 9270 verifyFormat("while"); 9271 verifyFormat("operator"); 9272 } 9273 9274 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 9275 // This code would be painfully slow to format if we didn't skip it. 9276 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 9277 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9278 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9279 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9280 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9281 "A(1, 1)\n" 9282 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 9283 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9284 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9285 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9286 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9287 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9288 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9289 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9290 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9291 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 9292 // Deeply nested part is untouched, rest is formatted. 9293 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 9294 format(std::string("int i;\n") + Code + "int j;\n", 9295 getLLVMStyle(), SC_ExpectIncomplete)); 9296 } 9297 9298 //===----------------------------------------------------------------------===// 9299 // Objective-C tests. 9300 //===----------------------------------------------------------------------===// 9301 9302 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 9303 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 9304 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 9305 format("-(NSUInteger)indexOfObject:(id)anObject;")); 9306 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 9307 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 9308 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 9309 format("-(NSInteger)Method3:(id)anObject;")); 9310 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 9311 format("-(NSInteger)Method4:(id)anObject;")); 9312 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 9313 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 9314 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 9315 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 9316 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9317 "forAllCells:(BOOL)flag;", 9318 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9319 "forAllCells:(BOOL)flag;")); 9320 9321 // Very long objectiveC method declaration. 9322 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 9323 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 9324 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 9325 " inRange:(NSRange)range\n" 9326 " outRange:(NSRange)out_range\n" 9327 " outRange1:(NSRange)out_range1\n" 9328 " outRange2:(NSRange)out_range2\n" 9329 " outRange3:(NSRange)out_range3\n" 9330 " outRange4:(NSRange)out_range4\n" 9331 " outRange5:(NSRange)out_range5\n" 9332 " outRange6:(NSRange)out_range6\n" 9333 " outRange7:(NSRange)out_range7\n" 9334 " outRange8:(NSRange)out_range8\n" 9335 " outRange9:(NSRange)out_range9;"); 9336 9337 // When the function name has to be wrapped. 9338 FormatStyle Style = getLLVMStyle(); 9339 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 9340 // and always indents instead. 9341 Style.IndentWrappedFunctionNames = false; 9342 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9343 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 9344 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 9345 "}", 9346 Style); 9347 Style.IndentWrappedFunctionNames = true; 9348 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9349 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 9350 " anotherName:(NSString)dddddddddddddd {\n" 9351 "}", 9352 Style); 9353 9354 verifyFormat("- (int)sum:(vector<int>)numbers;"); 9355 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 9356 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 9357 // protocol lists (but not for template classes): 9358 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 9359 9360 verifyFormat("- (int (*)())foo:(int (*)())f;"); 9361 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 9362 9363 // If there's no return type (very rare in practice!), LLVM and Google style 9364 // agree. 9365 verifyFormat("- foo;"); 9366 verifyFormat("- foo:(int)f;"); 9367 verifyGoogleFormat("- foo:(int)foo;"); 9368 } 9369 9370 TEST_F(FormatTest, BreaksStringLiterals) { 9371 EXPECT_EQ("\"some text \"\n" 9372 "\"other\";", 9373 format("\"some text other\";", getLLVMStyleWithColumns(12))); 9374 EXPECT_EQ("\"some text \"\n" 9375 "\"other\";", 9376 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 9377 EXPECT_EQ( 9378 "#define A \\\n" 9379 " \"some \" \\\n" 9380 " \"text \" \\\n" 9381 " \"other\";", 9382 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 9383 EXPECT_EQ( 9384 "#define A \\\n" 9385 " \"so \" \\\n" 9386 " \"text \" \\\n" 9387 " \"other\";", 9388 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 9389 9390 EXPECT_EQ("\"some text\"", 9391 format("\"some text\"", getLLVMStyleWithColumns(1))); 9392 EXPECT_EQ("\"some text\"", 9393 format("\"some text\"", getLLVMStyleWithColumns(11))); 9394 EXPECT_EQ("\"some \"\n" 9395 "\"text\"", 9396 format("\"some text\"", getLLVMStyleWithColumns(10))); 9397 EXPECT_EQ("\"some \"\n" 9398 "\"text\"", 9399 format("\"some text\"", getLLVMStyleWithColumns(7))); 9400 EXPECT_EQ("\"some\"\n" 9401 "\" tex\"\n" 9402 "\"t\"", 9403 format("\"some text\"", getLLVMStyleWithColumns(6))); 9404 EXPECT_EQ("\"some\"\n" 9405 "\" tex\"\n" 9406 "\" and\"", 9407 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 9408 EXPECT_EQ("\"some\"\n" 9409 "\"/tex\"\n" 9410 "\"/and\"", 9411 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 9412 9413 EXPECT_EQ("variable =\n" 9414 " \"long string \"\n" 9415 " \"literal\";", 9416 format("variable = \"long string literal\";", 9417 getLLVMStyleWithColumns(20))); 9418 9419 EXPECT_EQ("variable = f(\n" 9420 " \"long string \"\n" 9421 " \"literal\",\n" 9422 " short,\n" 9423 " loooooooooooooooooooong);", 9424 format("variable = f(\"long string literal\", short, " 9425 "loooooooooooooooooooong);", 9426 getLLVMStyleWithColumns(20))); 9427 9428 EXPECT_EQ( 9429 "f(g(\"long string \"\n" 9430 " \"literal\"),\n" 9431 " b);", 9432 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 9433 EXPECT_EQ("f(g(\"long string \"\n" 9434 " \"literal\",\n" 9435 " a),\n" 9436 " b);", 9437 format("f(g(\"long string literal\", a), b);", 9438 getLLVMStyleWithColumns(20))); 9439 EXPECT_EQ( 9440 "f(\"one two\".split(\n" 9441 " variable));", 9442 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 9443 EXPECT_EQ("f(\"one two three four five six \"\n" 9444 " \"seven\".split(\n" 9445 " really_looooong_variable));", 9446 format("f(\"one two three four five six seven\"." 9447 "split(really_looooong_variable));", 9448 getLLVMStyleWithColumns(33))); 9449 9450 EXPECT_EQ("f(\"some \"\n" 9451 " \"text\",\n" 9452 " other);", 9453 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 9454 9455 // Only break as a last resort. 9456 verifyFormat( 9457 "aaaaaaaaaaaaaaaaaaaa(\n" 9458 " aaaaaaaaaaaaaaaaaaaa,\n" 9459 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 9460 9461 EXPECT_EQ("\"splitmea\"\n" 9462 "\"trandomp\"\n" 9463 "\"oint\"", 9464 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 9465 9466 EXPECT_EQ("\"split/\"\n" 9467 "\"pathat/\"\n" 9468 "\"slashes\"", 9469 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9470 9471 EXPECT_EQ("\"split/\"\n" 9472 "\"pathat/\"\n" 9473 "\"slashes\"", 9474 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9475 EXPECT_EQ("\"split at \"\n" 9476 "\"spaces/at/\"\n" 9477 "\"slashes.at.any$\"\n" 9478 "\"non-alphanumeric%\"\n" 9479 "\"1111111111characte\"\n" 9480 "\"rs\"", 9481 format("\"split at " 9482 "spaces/at/" 9483 "slashes.at." 9484 "any$non-" 9485 "alphanumeric%" 9486 "1111111111characte" 9487 "rs\"", 9488 getLLVMStyleWithColumns(20))); 9489 9490 // Verify that splitting the strings understands 9491 // Style::AlwaysBreakBeforeMultilineStrings. 9492 EXPECT_EQ("aaaaaaaaaaaa(\n" 9493 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 9494 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 9495 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 9496 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9497 "aaaaaaaaaaaaaaaaaaaaaa\");", 9498 getGoogleStyle())); 9499 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9500 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9501 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9502 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9503 "aaaaaaaaaaaaaaaaaaaaaa\";", 9504 getGoogleStyle())); 9505 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9506 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9507 format("llvm::outs() << " 9508 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 9509 "aaaaaaaaaaaaaaaaaaa\";")); 9510 EXPECT_EQ("ffff(\n" 9511 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9512 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9513 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 9514 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9515 getGoogleStyle())); 9516 9517 FormatStyle Style = getLLVMStyleWithColumns(12); 9518 Style.BreakStringLiterals = false; 9519 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 9520 9521 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 9522 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9523 EXPECT_EQ("#define A \\\n" 9524 " \"some \" \\\n" 9525 " \"text \" \\\n" 9526 " \"other\";", 9527 format("#define A \"some text other\";", AlignLeft)); 9528 } 9529 9530 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 9531 EXPECT_EQ("C a = \"some more \"\n" 9532 " \"text\";", 9533 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9534 } 9535 9536 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9537 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9538 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9539 EXPECT_EQ("int i = a(b());", 9540 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9541 } 9542 9543 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9544 EXPECT_EQ( 9545 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9546 "(\n" 9547 " \"x\t\");", 9548 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9549 "aaaaaaa(" 9550 "\"x\t\");")); 9551 } 9552 9553 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9554 EXPECT_EQ( 9555 "u8\"utf8 string \"\n" 9556 "u8\"literal\";", 9557 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9558 EXPECT_EQ( 9559 "u\"utf16 string \"\n" 9560 "u\"literal\";", 9561 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9562 EXPECT_EQ( 9563 "U\"utf32 string \"\n" 9564 "U\"literal\";", 9565 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9566 EXPECT_EQ("L\"wide string \"\n" 9567 "L\"literal\";", 9568 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9569 EXPECT_EQ("@\"NSString \"\n" 9570 "@\"literal\";", 9571 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9572 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9573 9574 // This input makes clang-format try to split the incomplete unicode escape 9575 // sequence, which used to lead to a crasher. 9576 verifyNoCrash( 9577 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9578 getLLVMStyleWithColumns(60)); 9579 } 9580 9581 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9582 FormatStyle Style = getGoogleStyleWithColumns(15); 9583 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9584 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9585 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9586 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9587 EXPECT_EQ("u8R\"x(raw literal)x\";", 9588 format("u8R\"x(raw literal)x\";", Style)); 9589 } 9590 9591 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9592 FormatStyle Style = getLLVMStyleWithColumns(20); 9593 EXPECT_EQ( 9594 "_T(\"aaaaaaaaaaaaaa\")\n" 9595 "_T(\"aaaaaaaaaaaaaa\")\n" 9596 "_T(\"aaaaaaaaaaaa\")", 9597 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9598 EXPECT_EQ("f(x,\n" 9599 " _T(\"aaaaaaaaaaaa\")\n" 9600 " _T(\"aaa\"),\n" 9601 " z);", 9602 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9603 9604 // FIXME: Handle embedded spaces in one iteration. 9605 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9606 // "_T(\"aaaaaaaaaaaaa\")\n" 9607 // "_T(\"aaaaaaaaaaaaa\")\n" 9608 // "_T(\"a\")", 9609 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9610 // getLLVMStyleWithColumns(20))); 9611 EXPECT_EQ( 9612 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9613 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9614 EXPECT_EQ("f(\n" 9615 "#if !TEST\n" 9616 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9617 "#endif\n" 9618 ");", 9619 format("f(\n" 9620 "#if !TEST\n" 9621 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9622 "#endif\n" 9623 ");")); 9624 EXPECT_EQ("f(\n" 9625 "\n" 9626 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9627 format("f(\n" 9628 "\n" 9629 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9630 } 9631 9632 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9633 // In a function call with two operands, the second can be broken with no line 9634 // break before it. 9635 EXPECT_EQ( 9636 "func(a, \"long long \"\n" 9637 " \"long long\");", 9638 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 9639 // In a function call with three operands, the second must be broken with a 9640 // line break before it. 9641 EXPECT_EQ("func(a,\n" 9642 " \"long long long \"\n" 9643 " \"long\",\n" 9644 " c);", 9645 format("func(a, \"long long long long\", c);", 9646 getLLVMStyleWithColumns(24))); 9647 // In a function call with three operands, the third must be broken with a 9648 // line break before it. 9649 EXPECT_EQ("func(a, b,\n" 9650 " \"long long long \"\n" 9651 " \"long\");", 9652 format("func(a, b, \"long long long long\");", 9653 getLLVMStyleWithColumns(24))); 9654 // In a function call with three operands, both the second and the third must 9655 // be broken with a line break before them. 9656 EXPECT_EQ("func(a,\n" 9657 " \"long long long \"\n" 9658 " \"long\",\n" 9659 " \"long long long \"\n" 9660 " \"long\");", 9661 format("func(a, \"long long long long\", \"long long long long\");", 9662 getLLVMStyleWithColumns(24))); 9663 // In a chain of << with two operands, the second can be broken with no line 9664 // break before it. 9665 EXPECT_EQ("a << \"line line \"\n" 9666 " \"line\";", 9667 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 9668 // In a chain of << with three operands, the second can be broken with no line 9669 // break before it. 9670 EXPECT_EQ( 9671 "abcde << \"line \"\n" 9672 " \"line line\"\n" 9673 " << c;", 9674 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 9675 // In a chain of << with three operands, the third must be broken with a line 9676 // break before it. 9677 EXPECT_EQ( 9678 "a << b\n" 9679 " << \"line line \"\n" 9680 " \"line\";", 9681 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 9682 // In a chain of << with three operands, the second can be broken with no line 9683 // break before it and the third must be broken with a line break before it. 9684 EXPECT_EQ("abcd << \"line line \"\n" 9685 " \"line\"\n" 9686 " << \"line line \"\n" 9687 " \"line\";", 9688 format("abcd << \"line line line\" << \"line line line\";", 9689 getLLVMStyleWithColumns(20))); 9690 // In a chain of binary operators with two operands, the second can be broken 9691 // with no line break before it. 9692 EXPECT_EQ( 9693 "abcd + \"line line \"\n" 9694 " \"line line\";", 9695 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 9696 // In a chain of binary operators with three operands, the second must be 9697 // broken with a line break before it. 9698 EXPECT_EQ("abcd +\n" 9699 " \"line line \"\n" 9700 " \"line line\" +\n" 9701 " e;", 9702 format("abcd + \"line line line line\" + e;", 9703 getLLVMStyleWithColumns(20))); 9704 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9705 // the first must be broken with a line break before it. 9706 FormatStyle Style = getLLVMStyleWithColumns(25); 9707 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9708 EXPECT_EQ("someFunction(\n" 9709 " \"long long long \"\n" 9710 " \"long\",\n" 9711 " a);", 9712 format("someFunction(\"long long long long\", a);", Style)); 9713 } 9714 9715 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9716 EXPECT_EQ( 9717 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9720 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9723 } 9724 9725 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9726 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9727 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9728 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9729 "multiline raw string literal xxxxxxxxxxxxxx\n" 9730 ")x\",\n" 9731 " a),\n" 9732 " b);", 9733 format("fffffffffff(g(R\"x(\n" 9734 "multiline raw string literal xxxxxxxxxxxxxx\n" 9735 ")x\", a), b);", 9736 getGoogleStyleWithColumns(20))); 9737 EXPECT_EQ("fffffffffff(\n" 9738 " g(R\"x(qqq\n" 9739 "multiline raw string literal xxxxxxxxxxxxxx\n" 9740 ")x\",\n" 9741 " a),\n" 9742 " b);", 9743 format("fffffffffff(g(R\"x(qqq\n" 9744 "multiline raw string literal xxxxxxxxxxxxxx\n" 9745 ")x\", a), b);", 9746 getGoogleStyleWithColumns(20))); 9747 9748 EXPECT_EQ("fffffffffff(R\"x(\n" 9749 "multiline raw string literal xxxxxxxxxxxxxx\n" 9750 ")x\");", 9751 format("fffffffffff(R\"x(\n" 9752 "multiline raw string literal xxxxxxxxxxxxxx\n" 9753 ")x\");", 9754 getGoogleStyleWithColumns(20))); 9755 EXPECT_EQ("fffffffffff(R\"x(\n" 9756 "multiline raw string literal xxxxxxxxxxxxxx\n" 9757 ")x\" + bbbbbb);", 9758 format("fffffffffff(R\"x(\n" 9759 "multiline raw string literal xxxxxxxxxxxxxx\n" 9760 ")x\" + bbbbbb);", 9761 getGoogleStyleWithColumns(20))); 9762 EXPECT_EQ("fffffffffff(\n" 9763 " R\"x(\n" 9764 "multiline raw string literal xxxxxxxxxxxxxx\n" 9765 ")x\" +\n" 9766 " bbbbbb);", 9767 format("fffffffffff(\n" 9768 " R\"x(\n" 9769 "multiline raw string literal xxxxxxxxxxxxxx\n" 9770 ")x\" + bbbbbb);", 9771 getGoogleStyleWithColumns(20))); 9772 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9773 format("fffffffffff(\n" 9774 " R\"(single line raw string)\" + bbbbbb);")); 9775 } 9776 9777 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9778 verifyFormat("string a = \"unterminated;"); 9779 EXPECT_EQ("function(\"unterminated,\n" 9780 " OtherParameter);", 9781 format("function( \"unterminated,\n" 9782 " OtherParameter);")); 9783 } 9784 9785 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9786 FormatStyle Style = getLLVMStyle(); 9787 Style.Standard = FormatStyle::LS_Cpp03; 9788 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9789 format("#define x(_a) printf(\"foo\"_a);", Style)); 9790 } 9791 9792 TEST_F(FormatTest, CppLexVersion) { 9793 FormatStyle Style = getLLVMStyle(); 9794 // Formatting of x * y differs if x is a type. 9795 verifyFormat("void foo() { MACRO(a * b); }", Style); 9796 verifyFormat("void foo() { MACRO(int *b); }", Style); 9797 9798 // LLVM style uses latest lexer. 9799 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 9800 Style.Standard = FormatStyle::LS_Cpp17; 9801 // But in c++17, char8_t isn't a keyword. 9802 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 9803 } 9804 9805 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9806 9807 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9808 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9809 " \"ddeeefff\");", 9810 format("someFunction(\"aaabbbcccdddeeefff\");", 9811 getLLVMStyleWithColumns(25))); 9812 EXPECT_EQ("someFunction1234567890(\n" 9813 " \"aaabbbcccdddeeefff\");", 9814 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9815 getLLVMStyleWithColumns(26))); 9816 EXPECT_EQ("someFunction1234567890(\n" 9817 " \"aaabbbcccdddeeeff\"\n" 9818 " \"f\");", 9819 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9820 getLLVMStyleWithColumns(25))); 9821 EXPECT_EQ("someFunction1234567890(\n" 9822 " \"aaabbbcccdddeeeff\"\n" 9823 " \"f\");", 9824 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9825 getLLVMStyleWithColumns(24))); 9826 EXPECT_EQ("someFunction(\n" 9827 " \"aaabbbcc ddde \"\n" 9828 " \"efff\");", 9829 format("someFunction(\"aaabbbcc ddde efff\");", 9830 getLLVMStyleWithColumns(25))); 9831 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9832 " \"ddeeefff\");", 9833 format("someFunction(\"aaabbbccc ddeeefff\");", 9834 getLLVMStyleWithColumns(25))); 9835 EXPECT_EQ("someFunction1234567890(\n" 9836 " \"aaabb \"\n" 9837 " \"cccdddeeefff\");", 9838 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9839 getLLVMStyleWithColumns(25))); 9840 EXPECT_EQ("#define A \\\n" 9841 " string s = \\\n" 9842 " \"123456789\" \\\n" 9843 " \"0\"; \\\n" 9844 " int i;", 9845 format("#define A string s = \"1234567890\"; int i;", 9846 getLLVMStyleWithColumns(20))); 9847 EXPECT_EQ("someFunction(\n" 9848 " \"aaabbbcc \"\n" 9849 " \"dddeeefff\");", 9850 format("someFunction(\"aaabbbcc dddeeefff\");", 9851 getLLVMStyleWithColumns(25))); 9852 } 9853 9854 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9855 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9856 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9857 EXPECT_EQ("\"test\"\n" 9858 "\"\\n\"", 9859 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9860 EXPECT_EQ("\"tes\\\\\"\n" 9861 "\"n\"", 9862 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9863 EXPECT_EQ("\"\\\\\\\\\"\n" 9864 "\"\\n\"", 9865 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9866 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9867 EXPECT_EQ("\"\\uff01\"\n" 9868 "\"test\"", 9869 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9870 EXPECT_EQ("\"\\Uff01ff02\"", 9871 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9872 EXPECT_EQ("\"\\x000000000001\"\n" 9873 "\"next\"", 9874 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9875 EXPECT_EQ("\"\\x000000000001next\"", 9876 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9877 EXPECT_EQ("\"\\x000000000001\"", 9878 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9879 EXPECT_EQ("\"test\"\n" 9880 "\"\\000000\"\n" 9881 "\"000001\"", 9882 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9883 EXPECT_EQ("\"test\\000\"\n" 9884 "\"00000000\"\n" 9885 "\"1\"", 9886 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9887 } 9888 9889 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9890 verifyFormat("void f() {\n" 9891 " return g() {}\n" 9892 " void h() {}"); 9893 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9894 "g();\n" 9895 "}"); 9896 } 9897 9898 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9899 verifyFormat( 9900 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9901 } 9902 9903 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9904 verifyFormat("class X {\n" 9905 " void f() {\n" 9906 " }\n" 9907 "};", 9908 getLLVMStyleWithColumns(12)); 9909 } 9910 9911 TEST_F(FormatTest, ConfigurableIndentWidth) { 9912 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9913 EightIndent.IndentWidth = 8; 9914 EightIndent.ContinuationIndentWidth = 8; 9915 verifyFormat("void f() {\n" 9916 " someFunction();\n" 9917 " if (true) {\n" 9918 " f();\n" 9919 " }\n" 9920 "}", 9921 EightIndent); 9922 verifyFormat("class X {\n" 9923 " void f() {\n" 9924 " }\n" 9925 "};", 9926 EightIndent); 9927 verifyFormat("int x[] = {\n" 9928 " call(),\n" 9929 " call()};", 9930 EightIndent); 9931 } 9932 9933 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9934 verifyFormat("double\n" 9935 "f();", 9936 getLLVMStyleWithColumns(8)); 9937 } 9938 9939 TEST_F(FormatTest, ConfigurableUseOfTab) { 9940 FormatStyle Tab = getLLVMStyleWithColumns(42); 9941 Tab.IndentWidth = 8; 9942 Tab.UseTab = FormatStyle::UT_Always; 9943 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9944 9945 EXPECT_EQ("if (aaaaaaaa && // q\n" 9946 " bb)\t\t// w\n" 9947 "\t;", 9948 format("if (aaaaaaaa &&// q\n" 9949 "bb)// w\n" 9950 ";", 9951 Tab)); 9952 EXPECT_EQ("if (aaa && bbb) // w\n" 9953 "\t;", 9954 format("if(aaa&&bbb)// w\n" 9955 ";", 9956 Tab)); 9957 9958 verifyFormat("class X {\n" 9959 "\tvoid f() {\n" 9960 "\t\tsomeFunction(parameter1,\n" 9961 "\t\t\t parameter2);\n" 9962 "\t}\n" 9963 "};", 9964 Tab); 9965 verifyFormat("#define A \\\n" 9966 "\tvoid f() { \\\n" 9967 "\t\tsomeFunction( \\\n" 9968 "\t\t parameter1, \\\n" 9969 "\t\t parameter2); \\\n" 9970 "\t}", 9971 Tab); 9972 verifyFormat("int a;\t // x\n" 9973 "int bbbbbbbb; // x\n", 9974 Tab); 9975 9976 Tab.TabWidth = 4; 9977 Tab.IndentWidth = 8; 9978 verifyFormat("class TabWidth4Indent8 {\n" 9979 "\t\tvoid f() {\n" 9980 "\t\t\t\tsomeFunction(parameter1,\n" 9981 "\t\t\t\t\t\t\t parameter2);\n" 9982 "\t\t}\n" 9983 "};", 9984 Tab); 9985 9986 Tab.TabWidth = 4; 9987 Tab.IndentWidth = 4; 9988 verifyFormat("class TabWidth4Indent4 {\n" 9989 "\tvoid f() {\n" 9990 "\t\tsomeFunction(parameter1,\n" 9991 "\t\t\t\t\t parameter2);\n" 9992 "\t}\n" 9993 "};", 9994 Tab); 9995 9996 Tab.TabWidth = 8; 9997 Tab.IndentWidth = 4; 9998 verifyFormat("class TabWidth8Indent4 {\n" 9999 " void f() {\n" 10000 "\tsomeFunction(parameter1,\n" 10001 "\t\t parameter2);\n" 10002 " }\n" 10003 "};", 10004 Tab); 10005 10006 Tab.TabWidth = 8; 10007 Tab.IndentWidth = 8; 10008 EXPECT_EQ("/*\n" 10009 "\t a\t\tcomment\n" 10010 "\t in multiple lines\n" 10011 " */", 10012 format(" /*\t \t \n" 10013 " \t \t a\t\tcomment\t \t\n" 10014 " \t \t in multiple lines\t\n" 10015 " \t */", 10016 Tab)); 10017 10018 Tab.UseTab = FormatStyle::UT_ForIndentation; 10019 verifyFormat("{\n" 10020 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10021 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10022 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10023 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10024 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10025 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10026 "};", 10027 Tab); 10028 verifyFormat("enum AA {\n" 10029 "\ta1, // Force multiple lines\n" 10030 "\ta2,\n" 10031 "\ta3\n" 10032 "};", 10033 Tab); 10034 EXPECT_EQ("if (aaaaaaaa && // q\n" 10035 " bb) // w\n" 10036 "\t;", 10037 format("if (aaaaaaaa &&// q\n" 10038 "bb)// w\n" 10039 ";", 10040 Tab)); 10041 verifyFormat("class X {\n" 10042 "\tvoid f() {\n" 10043 "\t\tsomeFunction(parameter1,\n" 10044 "\t\t parameter2);\n" 10045 "\t}\n" 10046 "};", 10047 Tab); 10048 verifyFormat("{\n" 10049 "\tQ(\n" 10050 "\t {\n" 10051 "\t\t int a;\n" 10052 "\t\t someFunction(aaaaaaaa,\n" 10053 "\t\t bbbbbbb);\n" 10054 "\t },\n" 10055 "\t p);\n" 10056 "}", 10057 Tab); 10058 EXPECT_EQ("{\n" 10059 "\t/* aaaa\n" 10060 "\t bbbb */\n" 10061 "}", 10062 format("{\n" 10063 "/* aaaa\n" 10064 " bbbb */\n" 10065 "}", 10066 Tab)); 10067 EXPECT_EQ("{\n" 10068 "\t/*\n" 10069 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10070 "\t bbbbbbbbbbbbb\n" 10071 "\t*/\n" 10072 "}", 10073 format("{\n" 10074 "/*\n" 10075 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10076 "*/\n" 10077 "}", 10078 Tab)); 10079 EXPECT_EQ("{\n" 10080 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10081 "\t// bbbbbbbbbbbbb\n" 10082 "}", 10083 format("{\n" 10084 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10085 "}", 10086 Tab)); 10087 EXPECT_EQ("{\n" 10088 "\t/*\n" 10089 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10090 "\t bbbbbbbbbbbbb\n" 10091 "\t*/\n" 10092 "}", 10093 format("{\n" 10094 "\t/*\n" 10095 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10096 "\t*/\n" 10097 "}", 10098 Tab)); 10099 EXPECT_EQ("{\n" 10100 "\t/*\n" 10101 "\n" 10102 "\t*/\n" 10103 "}", 10104 format("{\n" 10105 "\t/*\n" 10106 "\n" 10107 "\t*/\n" 10108 "}", 10109 Tab)); 10110 EXPECT_EQ("{\n" 10111 "\t/*\n" 10112 " asdf\n" 10113 "\t*/\n" 10114 "}", 10115 format("{\n" 10116 "\t/*\n" 10117 " asdf\n" 10118 "\t*/\n" 10119 "}", 10120 Tab)); 10121 10122 Tab.UseTab = FormatStyle::UT_Never; 10123 EXPECT_EQ("/*\n" 10124 " a\t\tcomment\n" 10125 " in multiple lines\n" 10126 " */", 10127 format(" /*\t \t \n" 10128 " \t \t a\t\tcomment\t \t\n" 10129 " \t \t in multiple lines\t\n" 10130 " \t */", 10131 Tab)); 10132 EXPECT_EQ("/* some\n" 10133 " comment */", 10134 format(" \t \t /* some\n" 10135 " \t \t comment */", 10136 Tab)); 10137 EXPECT_EQ("int a; /* some\n" 10138 " comment */", 10139 format(" \t \t int a; /* some\n" 10140 " \t \t comment */", 10141 Tab)); 10142 10143 EXPECT_EQ("int a; /* some\n" 10144 "comment */", 10145 format(" \t \t int\ta; /* some\n" 10146 " \t \t comment */", 10147 Tab)); 10148 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10149 " comment */", 10150 format(" \t \t f(\"\t\t\"); /* some\n" 10151 " \t \t comment */", 10152 Tab)); 10153 EXPECT_EQ("{\n" 10154 " /*\n" 10155 " * Comment\n" 10156 " */\n" 10157 " int i;\n" 10158 "}", 10159 format("{\n" 10160 "\t/*\n" 10161 "\t * Comment\n" 10162 "\t */\n" 10163 "\t int i;\n" 10164 "}", 10165 Tab)); 10166 10167 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10168 Tab.TabWidth = 8; 10169 Tab.IndentWidth = 8; 10170 EXPECT_EQ("if (aaaaaaaa && // q\n" 10171 " bb) // w\n" 10172 "\t;", 10173 format("if (aaaaaaaa &&// q\n" 10174 "bb)// w\n" 10175 ";", 10176 Tab)); 10177 EXPECT_EQ("if (aaa && bbb) // w\n" 10178 "\t;", 10179 format("if(aaa&&bbb)// w\n" 10180 ";", 10181 Tab)); 10182 verifyFormat("class X {\n" 10183 "\tvoid f() {\n" 10184 "\t\tsomeFunction(parameter1,\n" 10185 "\t\t\t parameter2);\n" 10186 "\t}\n" 10187 "};", 10188 Tab); 10189 verifyFormat("#define A \\\n" 10190 "\tvoid f() { \\\n" 10191 "\t\tsomeFunction( \\\n" 10192 "\t\t parameter1, \\\n" 10193 "\t\t parameter2); \\\n" 10194 "\t}", 10195 Tab); 10196 Tab.TabWidth = 4; 10197 Tab.IndentWidth = 8; 10198 verifyFormat("class TabWidth4Indent8 {\n" 10199 "\t\tvoid f() {\n" 10200 "\t\t\t\tsomeFunction(parameter1,\n" 10201 "\t\t\t\t\t\t\t parameter2);\n" 10202 "\t\t}\n" 10203 "};", 10204 Tab); 10205 Tab.TabWidth = 4; 10206 Tab.IndentWidth = 4; 10207 verifyFormat("class TabWidth4Indent4 {\n" 10208 "\tvoid f() {\n" 10209 "\t\tsomeFunction(parameter1,\n" 10210 "\t\t\t\t\t parameter2);\n" 10211 "\t}\n" 10212 "};", 10213 Tab); 10214 Tab.TabWidth = 8; 10215 Tab.IndentWidth = 4; 10216 verifyFormat("class TabWidth8Indent4 {\n" 10217 " void f() {\n" 10218 "\tsomeFunction(parameter1,\n" 10219 "\t\t parameter2);\n" 10220 " }\n" 10221 "};", 10222 Tab); 10223 Tab.TabWidth = 8; 10224 Tab.IndentWidth = 8; 10225 EXPECT_EQ("/*\n" 10226 "\t a\t\tcomment\n" 10227 "\t in multiple lines\n" 10228 " */", 10229 format(" /*\t \t \n" 10230 " \t \t a\t\tcomment\t \t\n" 10231 " \t \t in multiple lines\t\n" 10232 " \t */", 10233 Tab)); 10234 verifyFormat("{\n" 10235 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10236 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10237 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10238 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10239 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10240 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10241 "};", 10242 Tab); 10243 verifyFormat("enum AA {\n" 10244 "\ta1, // Force multiple lines\n" 10245 "\ta2,\n" 10246 "\ta3\n" 10247 "};", 10248 Tab); 10249 EXPECT_EQ("if (aaaaaaaa && // q\n" 10250 " bb) // w\n" 10251 "\t;", 10252 format("if (aaaaaaaa &&// q\n" 10253 "bb)// w\n" 10254 ";", 10255 Tab)); 10256 verifyFormat("class X {\n" 10257 "\tvoid f() {\n" 10258 "\t\tsomeFunction(parameter1,\n" 10259 "\t\t\t parameter2);\n" 10260 "\t}\n" 10261 "};", 10262 Tab); 10263 verifyFormat("{\n" 10264 "\tQ(\n" 10265 "\t {\n" 10266 "\t\t int a;\n" 10267 "\t\t someFunction(aaaaaaaa,\n" 10268 "\t\t\t\t bbbbbbb);\n" 10269 "\t },\n" 10270 "\t p);\n" 10271 "}", 10272 Tab); 10273 EXPECT_EQ("{\n" 10274 "\t/* aaaa\n" 10275 "\t bbbb */\n" 10276 "}", 10277 format("{\n" 10278 "/* aaaa\n" 10279 " bbbb */\n" 10280 "}", 10281 Tab)); 10282 EXPECT_EQ("{\n" 10283 "\t/*\n" 10284 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10285 "\t bbbbbbbbbbbbb\n" 10286 "\t*/\n" 10287 "}", 10288 format("{\n" 10289 "/*\n" 10290 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10291 "*/\n" 10292 "}", 10293 Tab)); 10294 EXPECT_EQ("{\n" 10295 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10296 "\t// bbbbbbbbbbbbb\n" 10297 "}", 10298 format("{\n" 10299 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10300 "}", 10301 Tab)); 10302 EXPECT_EQ("{\n" 10303 "\t/*\n" 10304 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10305 "\t bbbbbbbbbbbbb\n" 10306 "\t*/\n" 10307 "}", 10308 format("{\n" 10309 "\t/*\n" 10310 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10311 "\t*/\n" 10312 "}", 10313 Tab)); 10314 EXPECT_EQ("{\n" 10315 "\t/*\n" 10316 "\n" 10317 "\t*/\n" 10318 "}", 10319 format("{\n" 10320 "\t/*\n" 10321 "\n" 10322 "\t*/\n" 10323 "}", 10324 Tab)); 10325 EXPECT_EQ("{\n" 10326 "\t/*\n" 10327 " asdf\n" 10328 "\t*/\n" 10329 "}", 10330 format("{\n" 10331 "\t/*\n" 10332 " asdf\n" 10333 "\t*/\n" 10334 "}", 10335 Tab)); 10336 EXPECT_EQ("/* some\n" 10337 " comment */", 10338 format(" \t \t /* some\n" 10339 " \t \t comment */", 10340 Tab)); 10341 EXPECT_EQ("int a; /* some\n" 10342 " comment */", 10343 format(" \t \t int a; /* some\n" 10344 " \t \t comment */", 10345 Tab)); 10346 EXPECT_EQ("int a; /* some\n" 10347 "comment */", 10348 format(" \t \t int\ta; /* some\n" 10349 " \t \t comment */", 10350 Tab)); 10351 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10352 " comment */", 10353 format(" \t \t f(\"\t\t\"); /* some\n" 10354 " \t \t comment */", 10355 Tab)); 10356 EXPECT_EQ("{\n" 10357 "\t/*\n" 10358 "\t * Comment\n" 10359 "\t */\n" 10360 "\tint i;\n" 10361 "}", 10362 format("{\n" 10363 "\t/*\n" 10364 "\t * Comment\n" 10365 "\t */\n" 10366 "\t int i;\n" 10367 "}", 10368 Tab)); 10369 Tab.TabWidth = 2; 10370 Tab.IndentWidth = 2; 10371 EXPECT_EQ("{\n" 10372 "\t/* aaaa\n" 10373 "\t\t bbbb */\n" 10374 "}", 10375 format("{\n" 10376 "/* aaaa\n" 10377 "\t bbbb */\n" 10378 "}", 10379 Tab)); 10380 EXPECT_EQ("{\n" 10381 "\t/*\n" 10382 "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10383 "\t\tbbbbbbbbbbbbb\n" 10384 "\t*/\n" 10385 "}", 10386 format("{\n" 10387 "/*\n" 10388 "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10389 "*/\n" 10390 "}", 10391 Tab)); 10392 Tab.AlignConsecutiveAssignments = true; 10393 Tab.AlignConsecutiveDeclarations = true; 10394 Tab.TabWidth = 4; 10395 Tab.IndentWidth = 4; 10396 verifyFormat("class Assign {\n" 10397 "\tvoid f() {\n" 10398 "\t\tint x = 123;\n" 10399 "\t\tint random = 4;\n" 10400 "\t\tstd::string alphabet =\n" 10401 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10402 "\t}\n" 10403 "};", 10404 Tab); 10405 10406 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 10407 Tab.TabWidth = 8; 10408 Tab.IndentWidth = 8; 10409 EXPECT_EQ("if (aaaaaaaa && // q\n" 10410 " bb) // w\n" 10411 "\t;", 10412 format("if (aaaaaaaa &&// q\n" 10413 "bb)// w\n" 10414 ";", 10415 Tab)); 10416 EXPECT_EQ("if (aaa && bbb) // w\n" 10417 "\t;", 10418 format("if(aaa&&bbb)// w\n" 10419 ";", 10420 Tab)); 10421 verifyFormat("class X {\n" 10422 "\tvoid f() {\n" 10423 "\t\tsomeFunction(parameter1,\n" 10424 "\t\t parameter2);\n" 10425 "\t}\n" 10426 "};", 10427 Tab); 10428 verifyFormat("#define A \\\n" 10429 "\tvoid f() { \\\n" 10430 "\t\tsomeFunction( \\\n" 10431 "\t\t parameter1, \\\n" 10432 "\t\t parameter2); \\\n" 10433 "\t}", 10434 Tab); 10435 Tab.TabWidth = 4; 10436 Tab.IndentWidth = 8; 10437 verifyFormat("class TabWidth4Indent8 {\n" 10438 "\t\tvoid f() {\n" 10439 "\t\t\t\tsomeFunction(parameter1,\n" 10440 "\t\t\t\t parameter2);\n" 10441 "\t\t}\n" 10442 "};", 10443 Tab); 10444 Tab.TabWidth = 4; 10445 Tab.IndentWidth = 4; 10446 verifyFormat("class TabWidth4Indent4 {\n" 10447 "\tvoid f() {\n" 10448 "\t\tsomeFunction(parameter1,\n" 10449 "\t\t parameter2);\n" 10450 "\t}\n" 10451 "};", 10452 Tab); 10453 Tab.TabWidth = 8; 10454 Tab.IndentWidth = 4; 10455 verifyFormat("class TabWidth8Indent4 {\n" 10456 " void f() {\n" 10457 "\tsomeFunction(parameter1,\n" 10458 "\t parameter2);\n" 10459 " }\n" 10460 "};", 10461 Tab); 10462 Tab.TabWidth = 8; 10463 Tab.IndentWidth = 8; 10464 EXPECT_EQ("/*\n" 10465 " a\t\tcomment\n" 10466 " in multiple lines\n" 10467 " */", 10468 format(" /*\t \t \n" 10469 " \t \t a\t\tcomment\t \t\n" 10470 " \t \t in multiple lines\t\n" 10471 " \t */", 10472 Tab)); 10473 verifyFormat("{\n" 10474 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10475 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10476 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10477 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10478 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10479 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10480 "};", 10481 Tab); 10482 verifyFormat("enum AA {\n" 10483 "\ta1, // Force multiple lines\n" 10484 "\ta2,\n" 10485 "\ta3\n" 10486 "};", 10487 Tab); 10488 EXPECT_EQ("if (aaaaaaaa && // q\n" 10489 " bb) // w\n" 10490 "\t;", 10491 format("if (aaaaaaaa &&// q\n" 10492 "bb)// w\n" 10493 ";", 10494 Tab)); 10495 verifyFormat("class X {\n" 10496 "\tvoid f() {\n" 10497 "\t\tsomeFunction(parameter1,\n" 10498 "\t\t parameter2);\n" 10499 "\t}\n" 10500 "};", 10501 Tab); 10502 verifyFormat("{\n" 10503 "\tQ(\n" 10504 "\t {\n" 10505 "\t\t int a;\n" 10506 "\t\t someFunction(aaaaaaaa,\n" 10507 "\t\t bbbbbbb);\n" 10508 "\t },\n" 10509 "\t p);\n" 10510 "}", 10511 Tab); 10512 EXPECT_EQ("{\n" 10513 "\t/* aaaa\n" 10514 "\t bbbb */\n" 10515 "}", 10516 format("{\n" 10517 "/* aaaa\n" 10518 " bbbb */\n" 10519 "}", 10520 Tab)); 10521 EXPECT_EQ("{\n" 10522 "\t/*\n" 10523 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10524 "\t bbbbbbbbbbbbb\n" 10525 "\t*/\n" 10526 "}", 10527 format("{\n" 10528 "/*\n" 10529 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10530 "*/\n" 10531 "}", 10532 Tab)); 10533 EXPECT_EQ("{\n" 10534 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10535 "\t// bbbbbbbbbbbbb\n" 10536 "}", 10537 format("{\n" 10538 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10539 "}", 10540 Tab)); 10541 EXPECT_EQ("{\n" 10542 "\t/*\n" 10543 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10544 "\t bbbbbbbbbbbbb\n" 10545 "\t*/\n" 10546 "}", 10547 format("{\n" 10548 "\t/*\n" 10549 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10550 "\t*/\n" 10551 "}", 10552 Tab)); 10553 EXPECT_EQ("{\n" 10554 "\t/*\n" 10555 "\n" 10556 "\t*/\n" 10557 "}", 10558 format("{\n" 10559 "\t/*\n" 10560 "\n" 10561 "\t*/\n" 10562 "}", 10563 Tab)); 10564 EXPECT_EQ("{\n" 10565 "\t/*\n" 10566 " asdf\n" 10567 "\t*/\n" 10568 "}", 10569 format("{\n" 10570 "\t/*\n" 10571 " asdf\n" 10572 "\t*/\n" 10573 "}", 10574 Tab)); 10575 EXPECT_EQ("/* some\n" 10576 " comment */", 10577 format(" \t \t /* some\n" 10578 " \t \t comment */", 10579 Tab)); 10580 EXPECT_EQ("int a; /* some\n" 10581 " comment */", 10582 format(" \t \t int a; /* some\n" 10583 " \t \t comment */", 10584 Tab)); 10585 EXPECT_EQ("int a; /* some\n" 10586 "comment */", 10587 format(" \t \t int\ta; /* some\n" 10588 " \t \t comment */", 10589 Tab)); 10590 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10591 " comment */", 10592 format(" \t \t f(\"\t\t\"); /* some\n" 10593 " \t \t comment */", 10594 Tab)); 10595 EXPECT_EQ("{\n" 10596 "\t/*\n" 10597 "\t * Comment\n" 10598 "\t */\n" 10599 "\tint i;\n" 10600 "}", 10601 format("{\n" 10602 "\t/*\n" 10603 "\t * Comment\n" 10604 "\t */\n" 10605 "\t int i;\n" 10606 "}", 10607 Tab)); 10608 Tab.TabWidth = 2; 10609 Tab.IndentWidth = 2; 10610 EXPECT_EQ("{\n" 10611 "\t/* aaaa\n" 10612 "\t bbbb */\n" 10613 "}", 10614 format("{\n" 10615 "/* aaaa\n" 10616 " bbbb */\n" 10617 "}", 10618 Tab)); 10619 EXPECT_EQ("{\n" 10620 "\t/*\n" 10621 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10622 "\t bbbbbbbbbbbbb\n" 10623 "\t*/\n" 10624 "}", 10625 format("{\n" 10626 "/*\n" 10627 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10628 "*/\n" 10629 "}", 10630 Tab)); 10631 Tab.AlignConsecutiveAssignments = true; 10632 Tab.AlignConsecutiveDeclarations = true; 10633 Tab.TabWidth = 4; 10634 Tab.IndentWidth = 4; 10635 verifyFormat("class Assign {\n" 10636 "\tvoid f() {\n" 10637 "\t\tint x = 123;\n" 10638 "\t\tint random = 4;\n" 10639 "\t\tstd::string alphabet =\n" 10640 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 10641 "\t}\n" 10642 "};", 10643 Tab); 10644 } 10645 10646 TEST_F(FormatTest, ZeroTabWidth) { 10647 FormatStyle Tab = getLLVMStyleWithColumns(42); 10648 Tab.IndentWidth = 8; 10649 Tab.UseTab = FormatStyle::UT_Never; 10650 Tab.TabWidth = 0; 10651 EXPECT_EQ("void a(){\n" 10652 " // line starts with '\t'\n" 10653 "};", 10654 format("void a(){\n" 10655 "\t// line starts with '\t'\n" 10656 "};", 10657 Tab)); 10658 10659 EXPECT_EQ("void a(){\n" 10660 " // line starts with '\t'\n" 10661 "};", 10662 format("void a(){\n" 10663 "\t\t// line starts with '\t'\n" 10664 "};", 10665 Tab)); 10666 10667 Tab.UseTab = FormatStyle::UT_ForIndentation; 10668 EXPECT_EQ("void a(){\n" 10669 " // line starts with '\t'\n" 10670 "};", 10671 format("void a(){\n" 10672 "\t// line starts with '\t'\n" 10673 "};", 10674 Tab)); 10675 10676 EXPECT_EQ("void a(){\n" 10677 " // line starts with '\t'\n" 10678 "};", 10679 format("void a(){\n" 10680 "\t\t// line starts with '\t'\n" 10681 "};", 10682 Tab)); 10683 10684 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10685 EXPECT_EQ("void a(){\n" 10686 " // line starts with '\t'\n" 10687 "};", 10688 format("void a(){\n" 10689 "\t// line starts with '\t'\n" 10690 "};", 10691 Tab)); 10692 10693 EXPECT_EQ("void a(){\n" 10694 " // line starts with '\t'\n" 10695 "};", 10696 format("void a(){\n" 10697 "\t\t// line starts with '\t'\n" 10698 "};", 10699 Tab)); 10700 10701 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 10702 EXPECT_EQ("void a(){\n" 10703 " // line starts with '\t'\n" 10704 "};", 10705 format("void a(){\n" 10706 "\t// line starts with '\t'\n" 10707 "};", 10708 Tab)); 10709 10710 EXPECT_EQ("void a(){\n" 10711 " // line starts with '\t'\n" 10712 "};", 10713 format("void a(){\n" 10714 "\t\t// line starts with '\t'\n" 10715 "};", 10716 Tab)); 10717 10718 Tab.UseTab = FormatStyle::UT_Always; 10719 EXPECT_EQ("void a(){\n" 10720 "// line starts with '\t'\n" 10721 "};", 10722 format("void a(){\n" 10723 "\t// line starts with '\t'\n" 10724 "};", 10725 Tab)); 10726 10727 EXPECT_EQ("void a(){\n" 10728 "// line starts with '\t'\n" 10729 "};", 10730 format("void a(){\n" 10731 "\t\t// line starts with '\t'\n" 10732 "};", 10733 Tab)); 10734 } 10735 10736 TEST_F(FormatTest, CalculatesOriginalColumn) { 10737 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10738 "q\"; /* some\n" 10739 " comment */", 10740 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10741 "q\"; /* some\n" 10742 " comment */", 10743 getLLVMStyle())); 10744 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10745 "/* some\n" 10746 " comment */", 10747 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10748 " /* some\n" 10749 " comment */", 10750 getLLVMStyle())); 10751 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10752 "qqq\n" 10753 "/* some\n" 10754 " comment */", 10755 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10756 "qqq\n" 10757 " /* some\n" 10758 " comment */", 10759 getLLVMStyle())); 10760 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10761 "wwww; /* some\n" 10762 " comment */", 10763 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10764 "wwww; /* some\n" 10765 " comment */", 10766 getLLVMStyle())); 10767 } 10768 10769 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 10770 FormatStyle NoSpace = getLLVMStyle(); 10771 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 10772 10773 verifyFormat("while(true)\n" 10774 " continue;", 10775 NoSpace); 10776 verifyFormat("for(;;)\n" 10777 " continue;", 10778 NoSpace); 10779 verifyFormat("if(true)\n" 10780 " f();\n" 10781 "else if(true)\n" 10782 " f();", 10783 NoSpace); 10784 verifyFormat("do {\n" 10785 " do_something();\n" 10786 "} while(something());", 10787 NoSpace); 10788 verifyFormat("switch(x) {\n" 10789 "default:\n" 10790 " break;\n" 10791 "}", 10792 NoSpace); 10793 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 10794 verifyFormat("size_t x = sizeof(x);", NoSpace); 10795 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 10796 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 10797 verifyFormat("alignas(128) char a[128];", NoSpace); 10798 verifyFormat("size_t x = alignof(MyType);", NoSpace); 10799 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 10800 verifyFormat("int f() throw(Deprecated);", NoSpace); 10801 verifyFormat("typedef void (*cb)(int);", NoSpace); 10802 verifyFormat("T A::operator()();", NoSpace); 10803 verifyFormat("X A::operator++(T);", NoSpace); 10804 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 10805 10806 FormatStyle Space = getLLVMStyle(); 10807 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 10808 10809 verifyFormat("int f ();", Space); 10810 verifyFormat("void f (int a, T b) {\n" 10811 " while (true)\n" 10812 " continue;\n" 10813 "}", 10814 Space); 10815 verifyFormat("if (true)\n" 10816 " f ();\n" 10817 "else if (true)\n" 10818 " f ();", 10819 Space); 10820 verifyFormat("do {\n" 10821 " do_something ();\n" 10822 "} while (something ());", 10823 Space); 10824 verifyFormat("switch (x) {\n" 10825 "default:\n" 10826 " break;\n" 10827 "}", 10828 Space); 10829 verifyFormat("A::A () : a (1) {}", Space); 10830 verifyFormat("void f () __attribute__ ((asdf));", Space); 10831 verifyFormat("*(&a + 1);\n" 10832 "&((&a)[1]);\n" 10833 "a[(b + c) * d];\n" 10834 "(((a + 1) * 2) + 3) * 4;", 10835 Space); 10836 verifyFormat("#define A(x) x", Space); 10837 verifyFormat("#define A (x) x", Space); 10838 verifyFormat("#if defined(x)\n" 10839 "#endif", 10840 Space); 10841 verifyFormat("auto i = std::make_unique<int> (5);", Space); 10842 verifyFormat("size_t x = sizeof (x);", Space); 10843 verifyFormat("auto f (int x) -> decltype (x);", Space); 10844 verifyFormat("int f (T x) noexcept (x.create ());", Space); 10845 verifyFormat("alignas (128) char a[128];", Space); 10846 verifyFormat("size_t x = alignof (MyType);", Space); 10847 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 10848 verifyFormat("int f () throw (Deprecated);", Space); 10849 verifyFormat("typedef void (*cb) (int);", Space); 10850 verifyFormat("T A::operator() ();", Space); 10851 verifyFormat("X A::operator++ (T);", Space); 10852 verifyFormat("auto lambda = [] () { return 0; };", Space); 10853 verifyFormat("int x = int (y);", Space); 10854 10855 FormatStyle SomeSpace = getLLVMStyle(); 10856 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 10857 10858 verifyFormat("[]() -> float {}", SomeSpace); 10859 verifyFormat("[] (auto foo) {}", SomeSpace); 10860 verifyFormat("[foo]() -> int {}", SomeSpace); 10861 verifyFormat("int f();", SomeSpace); 10862 verifyFormat("void f (int a, T b) {\n" 10863 " while (true)\n" 10864 " continue;\n" 10865 "}", 10866 SomeSpace); 10867 verifyFormat("if (true)\n" 10868 " f();\n" 10869 "else if (true)\n" 10870 " f();", 10871 SomeSpace); 10872 verifyFormat("do {\n" 10873 " do_something();\n" 10874 "} while (something());", 10875 SomeSpace); 10876 verifyFormat("switch (x) {\n" 10877 "default:\n" 10878 " break;\n" 10879 "}", 10880 SomeSpace); 10881 verifyFormat("A::A() : a (1) {}", SomeSpace); 10882 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 10883 verifyFormat("*(&a + 1);\n" 10884 "&((&a)[1]);\n" 10885 "a[(b + c) * d];\n" 10886 "(((a + 1) * 2) + 3) * 4;", 10887 SomeSpace); 10888 verifyFormat("#define A(x) x", SomeSpace); 10889 verifyFormat("#define A (x) x", SomeSpace); 10890 verifyFormat("#if defined(x)\n" 10891 "#endif", 10892 SomeSpace); 10893 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10894 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10895 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10896 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10897 verifyFormat("alignas (128) char a[128];", SomeSpace); 10898 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10899 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10900 SomeSpace); 10901 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10902 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10903 verifyFormat("T A::operator()();", SomeSpace); 10904 verifyFormat("X A::operator++ (T);", SomeSpace); 10905 verifyFormat("int x = int (y);", SomeSpace); 10906 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10907 } 10908 10909 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10910 FormatStyle Spaces = getLLVMStyle(); 10911 Spaces.SpaceAfterLogicalNot = true; 10912 10913 verifyFormat("bool x = ! y", Spaces); 10914 verifyFormat("if (! isFailure())", Spaces); 10915 verifyFormat("if (! (a && b))", Spaces); 10916 verifyFormat("\"Error!\"", Spaces); 10917 verifyFormat("! ! x", Spaces); 10918 } 10919 10920 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10921 FormatStyle Spaces = getLLVMStyle(); 10922 10923 Spaces.SpacesInParentheses = true; 10924 verifyFormat("do_something( ::globalVar );", Spaces); 10925 verifyFormat("call( x, y, z );", Spaces); 10926 verifyFormat("call();", Spaces); 10927 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10928 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10929 Spaces); 10930 verifyFormat("while ( (bool)1 )\n" 10931 " continue;", 10932 Spaces); 10933 verifyFormat("for ( ;; )\n" 10934 " continue;", 10935 Spaces); 10936 verifyFormat("if ( true )\n" 10937 " f();\n" 10938 "else if ( true )\n" 10939 " f();", 10940 Spaces); 10941 verifyFormat("do {\n" 10942 " do_something( (int)i );\n" 10943 "} while ( something() );", 10944 Spaces); 10945 verifyFormat("switch ( x ) {\n" 10946 "default:\n" 10947 " break;\n" 10948 "}", 10949 Spaces); 10950 10951 Spaces.SpacesInParentheses = false; 10952 Spaces.SpacesInCStyleCastParentheses = true; 10953 verifyFormat("Type *A = ( Type * )P;", Spaces); 10954 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 10955 verifyFormat("x = ( int32 )y;", Spaces); 10956 verifyFormat("int a = ( int )(2.0f);", Spaces); 10957 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 10958 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 10959 verifyFormat("#define x (( int )-1)", Spaces); 10960 10961 // Run the first set of tests again with: 10962 Spaces.SpacesInParentheses = false; 10963 Spaces.SpaceInEmptyParentheses = true; 10964 Spaces.SpacesInCStyleCastParentheses = true; 10965 verifyFormat("call(x, y, z);", Spaces); 10966 verifyFormat("call( );", Spaces); 10967 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10968 verifyFormat("while (( bool )1)\n" 10969 " continue;", 10970 Spaces); 10971 verifyFormat("for (;;)\n" 10972 " continue;", 10973 Spaces); 10974 verifyFormat("if (true)\n" 10975 " f( );\n" 10976 "else if (true)\n" 10977 " f( );", 10978 Spaces); 10979 verifyFormat("do {\n" 10980 " do_something(( int )i);\n" 10981 "} while (something( ));", 10982 Spaces); 10983 verifyFormat("switch (x) {\n" 10984 "default:\n" 10985 " break;\n" 10986 "}", 10987 Spaces); 10988 10989 // Run the first set of tests again with: 10990 Spaces.SpaceAfterCStyleCast = true; 10991 verifyFormat("call(x, y, z);", Spaces); 10992 verifyFormat("call( );", Spaces); 10993 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10994 verifyFormat("while (( bool ) 1)\n" 10995 " continue;", 10996 Spaces); 10997 verifyFormat("for (;;)\n" 10998 " continue;", 10999 Spaces); 11000 verifyFormat("if (true)\n" 11001 " f( );\n" 11002 "else if (true)\n" 11003 " f( );", 11004 Spaces); 11005 verifyFormat("do {\n" 11006 " do_something(( int ) i);\n" 11007 "} while (something( ));", 11008 Spaces); 11009 verifyFormat("switch (x) {\n" 11010 "default:\n" 11011 " break;\n" 11012 "}", 11013 Spaces); 11014 11015 // Run subset of tests again with: 11016 Spaces.SpacesInCStyleCastParentheses = false; 11017 Spaces.SpaceAfterCStyleCast = true; 11018 verifyFormat("while ((bool) 1)\n" 11019 " continue;", 11020 Spaces); 11021 verifyFormat("do {\n" 11022 " do_something((int) i);\n" 11023 "} while (something( ));", 11024 Spaces); 11025 } 11026 11027 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 11028 verifyFormat("int a[5];"); 11029 verifyFormat("a[3] += 42;"); 11030 11031 FormatStyle Spaces = getLLVMStyle(); 11032 Spaces.SpacesInSquareBrackets = true; 11033 // Not lambdas. 11034 verifyFormat("int a[ 5 ];", Spaces); 11035 verifyFormat("a[ 3 ] += 42;", Spaces); 11036 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 11037 verifyFormat("double &operator[](int i) { return 0; }\n" 11038 "int i;", 11039 Spaces); 11040 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 11041 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 11042 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 11043 // Lambdas. 11044 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 11045 verifyFormat("return [ i, args... ] {};", Spaces); 11046 verifyFormat("int foo = [ &bar ]() {};", Spaces); 11047 verifyFormat("int foo = [ = ]() {};", Spaces); 11048 verifyFormat("int foo = [ & ]() {};", Spaces); 11049 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 11050 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 11051 } 11052 11053 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 11054 FormatStyle NoSpaceStyle = getLLVMStyle(); 11055 verifyFormat("int a[5];", NoSpaceStyle); 11056 verifyFormat("a[3] += 42;", NoSpaceStyle); 11057 11058 verifyFormat("int a[1];", NoSpaceStyle); 11059 verifyFormat("int 1 [a];", NoSpaceStyle); 11060 verifyFormat("int a[1][2];", NoSpaceStyle); 11061 verifyFormat("a[7] = 5;", NoSpaceStyle); 11062 verifyFormat("int a = (f())[23];", NoSpaceStyle); 11063 verifyFormat("f([] {})", NoSpaceStyle); 11064 11065 FormatStyle Space = getLLVMStyle(); 11066 Space.SpaceBeforeSquareBrackets = true; 11067 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 11068 verifyFormat("return [i, args...] {};", Space); 11069 11070 verifyFormat("int a [5];", Space); 11071 verifyFormat("a [3] += 42;", Space); 11072 verifyFormat("constexpr char hello []{\"hello\"};", Space); 11073 verifyFormat("double &operator[](int i) { return 0; }\n" 11074 "int i;", 11075 Space); 11076 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 11077 verifyFormat("int i = a [a][a]->f();", Space); 11078 verifyFormat("int i = (*b) [a]->f();", Space); 11079 11080 verifyFormat("int a [1];", Space); 11081 verifyFormat("int 1 [a];", Space); 11082 verifyFormat("int a [1][2];", Space); 11083 verifyFormat("a [7] = 5;", Space); 11084 verifyFormat("int a = (f()) [23];", Space); 11085 verifyFormat("f([] {})", Space); 11086 } 11087 11088 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 11089 verifyFormat("int a = 5;"); 11090 verifyFormat("a += 42;"); 11091 verifyFormat("a or_eq 8;"); 11092 11093 FormatStyle Spaces = getLLVMStyle(); 11094 Spaces.SpaceBeforeAssignmentOperators = false; 11095 verifyFormat("int a= 5;", Spaces); 11096 verifyFormat("a+= 42;", Spaces); 11097 verifyFormat("a or_eq 8;", Spaces); 11098 } 11099 11100 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 11101 verifyFormat("class Foo : public Bar {};"); 11102 verifyFormat("Foo::Foo() : foo(1) {}"); 11103 verifyFormat("for (auto a : b) {\n}"); 11104 verifyFormat("int x = a ? b : c;"); 11105 verifyFormat("{\n" 11106 "label0:\n" 11107 " int x = 0;\n" 11108 "}"); 11109 verifyFormat("switch (x) {\n" 11110 "case 1:\n" 11111 "default:\n" 11112 "}"); 11113 11114 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 11115 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 11116 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 11117 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 11118 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 11119 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 11120 verifyFormat("{\n" 11121 "label1:\n" 11122 " int x = 0;\n" 11123 "}", 11124 CtorInitializerStyle); 11125 verifyFormat("switch (x) {\n" 11126 "case 1:\n" 11127 "default:\n" 11128 "}", 11129 CtorInitializerStyle); 11130 CtorInitializerStyle.BreakConstructorInitializers = 11131 FormatStyle::BCIS_AfterColon; 11132 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 11133 " aaaaaaaaaaaaaaaa(1),\n" 11134 " bbbbbbbbbbbbbbbb(2) {}", 11135 CtorInitializerStyle); 11136 CtorInitializerStyle.BreakConstructorInitializers = 11137 FormatStyle::BCIS_BeforeComma; 11138 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11139 " : aaaaaaaaaaaaaaaa(1)\n" 11140 " , bbbbbbbbbbbbbbbb(2) {}", 11141 CtorInitializerStyle); 11142 CtorInitializerStyle.BreakConstructorInitializers = 11143 FormatStyle::BCIS_BeforeColon; 11144 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11145 " : aaaaaaaaaaaaaaaa(1),\n" 11146 " bbbbbbbbbbbbbbbb(2) {}", 11147 CtorInitializerStyle); 11148 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 11149 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11150 ": aaaaaaaaaaaaaaaa(1),\n" 11151 " bbbbbbbbbbbbbbbb(2) {}", 11152 CtorInitializerStyle); 11153 11154 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 11155 InheritanceStyle.SpaceBeforeInheritanceColon = false; 11156 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 11157 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 11158 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 11159 verifyFormat("int x = a ? b : c;", InheritanceStyle); 11160 verifyFormat("{\n" 11161 "label2:\n" 11162 " int x = 0;\n" 11163 "}", 11164 InheritanceStyle); 11165 verifyFormat("switch (x) {\n" 11166 "case 1:\n" 11167 "default:\n" 11168 "}", 11169 InheritanceStyle); 11170 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 11171 verifyFormat("class Foooooooooooooooooooooo:\n" 11172 " public aaaaaaaaaaaaaaaaaa,\n" 11173 " public bbbbbbbbbbbbbbbbbb {\n" 11174 "}", 11175 InheritanceStyle); 11176 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 11177 verifyFormat("class Foooooooooooooooooooooo\n" 11178 " : public aaaaaaaaaaaaaaaaaa\n" 11179 " , public bbbbbbbbbbbbbbbbbb {\n" 11180 "}", 11181 InheritanceStyle); 11182 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 11183 verifyFormat("class Foooooooooooooooooooooo\n" 11184 " : public aaaaaaaaaaaaaaaaaa,\n" 11185 " public bbbbbbbbbbbbbbbbbb {\n" 11186 "}", 11187 InheritanceStyle); 11188 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 11189 verifyFormat("class Foooooooooooooooooooooo\n" 11190 ": public aaaaaaaaaaaaaaaaaa,\n" 11191 " public bbbbbbbbbbbbbbbbbb {}", 11192 InheritanceStyle); 11193 11194 FormatStyle ForLoopStyle = getLLVMStyle(); 11195 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 11196 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 11197 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 11198 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 11199 verifyFormat("int x = a ? b : c;", ForLoopStyle); 11200 verifyFormat("{\n" 11201 "label2:\n" 11202 " int x = 0;\n" 11203 "}", 11204 ForLoopStyle); 11205 verifyFormat("switch (x) {\n" 11206 "case 1:\n" 11207 "default:\n" 11208 "}", 11209 ForLoopStyle); 11210 11211 FormatStyle NoSpaceStyle = getLLVMStyle(); 11212 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 11213 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 11214 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 11215 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 11216 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 11217 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 11218 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 11219 verifyFormat("{\n" 11220 "label3:\n" 11221 " int x = 0;\n" 11222 "}", 11223 NoSpaceStyle); 11224 verifyFormat("switch (x) {\n" 11225 "case 1:\n" 11226 "default:\n" 11227 "}", 11228 NoSpaceStyle); 11229 } 11230 11231 TEST_F(FormatTest, AlignConsecutiveMacros) { 11232 FormatStyle Style = getLLVMStyle(); 11233 Style.AlignConsecutiveAssignments = true; 11234 Style.AlignConsecutiveDeclarations = true; 11235 Style.AlignConsecutiveMacros = false; 11236 11237 verifyFormat("#define a 3\n" 11238 "#define bbbb 4\n" 11239 "#define ccc (5)", 11240 Style); 11241 11242 verifyFormat("#define f(x) (x * x)\n" 11243 "#define fff(x, y, z) (x * y + z)\n" 11244 "#define ffff(x, y) (x - y)", 11245 Style); 11246 11247 verifyFormat("#define foo(x, y) (x + y)\n" 11248 "#define bar (5, 6)(2 + 2)", 11249 Style); 11250 11251 verifyFormat("#define a 3\n" 11252 "#define bbbb 4\n" 11253 "#define ccc (5)\n" 11254 "#define f(x) (x * x)\n" 11255 "#define fff(x, y, z) (x * y + z)\n" 11256 "#define ffff(x, y) (x - y)", 11257 Style); 11258 11259 Style.AlignConsecutiveMacros = true; 11260 verifyFormat("#define a 3\n" 11261 "#define bbbb 4\n" 11262 "#define ccc (5)", 11263 Style); 11264 11265 verifyFormat("#define f(x) (x * x)\n" 11266 "#define fff(x, y, z) (x * y + z)\n" 11267 "#define ffff(x, y) (x - y)", 11268 Style); 11269 11270 verifyFormat("#define foo(x, y) (x + y)\n" 11271 "#define bar (5, 6)(2 + 2)", 11272 Style); 11273 11274 verifyFormat("#define a 3\n" 11275 "#define bbbb 4\n" 11276 "#define ccc (5)\n" 11277 "#define f(x) (x * x)\n" 11278 "#define fff(x, y, z) (x * y + z)\n" 11279 "#define ffff(x, y) (x - y)", 11280 Style); 11281 11282 verifyFormat("#define a 5\n" 11283 "#define foo(x, y) (x + y)\n" 11284 "#define CCC (6)\n" 11285 "auto lambda = []() {\n" 11286 " auto ii = 0;\n" 11287 " float j = 0;\n" 11288 " return 0;\n" 11289 "};\n" 11290 "int i = 0;\n" 11291 "float i2 = 0;\n" 11292 "auto v = type{\n" 11293 " i = 1, //\n" 11294 " (i = 2), //\n" 11295 " i = 3 //\n" 11296 "};", 11297 Style); 11298 11299 Style.AlignConsecutiveMacros = false; 11300 Style.ColumnLimit = 20; 11301 11302 verifyFormat("#define a \\\n" 11303 " \"aabbbbbbbbbbbb\"\n" 11304 "#define D \\\n" 11305 " \"aabbbbbbbbbbbb\" \\\n" 11306 " \"ccddeeeeeeeee\"\n" 11307 "#define B \\\n" 11308 " \"QQQQQQQQQQQQQ\" \\\n" 11309 " \"FFFFFFFFFFFFF\" \\\n" 11310 " \"LLLLLLLL\"\n", 11311 Style); 11312 11313 Style.AlignConsecutiveMacros = true; 11314 verifyFormat("#define a \\\n" 11315 " \"aabbbbbbbbbbbb\"\n" 11316 "#define D \\\n" 11317 " \"aabbbbbbbbbbbb\" \\\n" 11318 " \"ccddeeeeeeeee\"\n" 11319 "#define B \\\n" 11320 " \"QQQQQQQQQQQQQ\" \\\n" 11321 " \"FFFFFFFFFFFFF\" \\\n" 11322 " \"LLLLLLLL\"\n", 11323 Style); 11324 } 11325 11326 TEST_F(FormatTest, AlignConsecutiveAssignments) { 11327 FormatStyle Alignment = getLLVMStyle(); 11328 Alignment.AlignConsecutiveMacros = true; 11329 Alignment.AlignConsecutiveAssignments = false; 11330 verifyFormat("int a = 5;\n" 11331 "int oneTwoThree = 123;", 11332 Alignment); 11333 verifyFormat("int a = 5;\n" 11334 "int oneTwoThree = 123;", 11335 Alignment); 11336 11337 Alignment.AlignConsecutiveAssignments = true; 11338 verifyFormat("int a = 5;\n" 11339 "int oneTwoThree = 123;", 11340 Alignment); 11341 verifyFormat("int a = method();\n" 11342 "int oneTwoThree = 133;", 11343 Alignment); 11344 verifyFormat("a &= 5;\n" 11345 "bcd *= 5;\n" 11346 "ghtyf += 5;\n" 11347 "dvfvdb -= 5;\n" 11348 "a /= 5;\n" 11349 "vdsvsv %= 5;\n" 11350 "sfdbddfbdfbb ^= 5;\n" 11351 "dvsdsv |= 5;\n" 11352 "int dsvvdvsdvvv = 123;", 11353 Alignment); 11354 verifyFormat("int i = 1, j = 10;\n" 11355 "something = 2000;", 11356 Alignment); 11357 verifyFormat("something = 2000;\n" 11358 "int i = 1, j = 10;\n", 11359 Alignment); 11360 verifyFormat("something = 2000;\n" 11361 "another = 911;\n" 11362 "int i = 1, j = 10;\n" 11363 "oneMore = 1;\n" 11364 "i = 2;", 11365 Alignment); 11366 verifyFormat("int a = 5;\n" 11367 "int one = 1;\n" 11368 "method();\n" 11369 "int oneTwoThree = 123;\n" 11370 "int oneTwo = 12;", 11371 Alignment); 11372 verifyFormat("int oneTwoThree = 123;\n" 11373 "int oneTwo = 12;\n" 11374 "method();\n", 11375 Alignment); 11376 verifyFormat("int oneTwoThree = 123; // comment\n" 11377 "int oneTwo = 12; // comment", 11378 Alignment); 11379 EXPECT_EQ("int a = 5;\n" 11380 "\n" 11381 "int oneTwoThree = 123;", 11382 format("int a = 5;\n" 11383 "\n" 11384 "int oneTwoThree= 123;", 11385 Alignment)); 11386 EXPECT_EQ("int a = 5;\n" 11387 "int one = 1;\n" 11388 "\n" 11389 "int oneTwoThree = 123;", 11390 format("int a = 5;\n" 11391 "int one = 1;\n" 11392 "\n" 11393 "int oneTwoThree = 123;", 11394 Alignment)); 11395 EXPECT_EQ("int a = 5;\n" 11396 "int one = 1;\n" 11397 "\n" 11398 "int oneTwoThree = 123;\n" 11399 "int oneTwo = 12;", 11400 format("int a = 5;\n" 11401 "int one = 1;\n" 11402 "\n" 11403 "int oneTwoThree = 123;\n" 11404 "int oneTwo = 12;", 11405 Alignment)); 11406 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11407 verifyFormat("#define A \\\n" 11408 " int aaaa = 12; \\\n" 11409 " int b = 23; \\\n" 11410 " int ccc = 234; \\\n" 11411 " int dddddddddd = 2345;", 11412 Alignment); 11413 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11414 verifyFormat("#define A \\\n" 11415 " int aaaa = 12; \\\n" 11416 " int b = 23; \\\n" 11417 " int ccc = 234; \\\n" 11418 " int dddddddddd = 2345;", 11419 Alignment); 11420 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11421 verifyFormat("#define A " 11422 " \\\n" 11423 " int aaaa = 12; " 11424 " \\\n" 11425 " int b = 23; " 11426 " \\\n" 11427 " int ccc = 234; " 11428 " \\\n" 11429 " int dddddddddd = 2345;", 11430 Alignment); 11431 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11432 "k = 4, int l = 5,\n" 11433 " int m = 6) {\n" 11434 " int j = 10;\n" 11435 " otherThing = 1;\n" 11436 "}", 11437 Alignment); 11438 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11439 " int i = 1;\n" 11440 " int j = 2;\n" 11441 " int big = 10000;\n" 11442 "}", 11443 Alignment); 11444 verifyFormat("class C {\n" 11445 "public:\n" 11446 " int i = 1;\n" 11447 " virtual void f() = 0;\n" 11448 "};", 11449 Alignment); 11450 verifyFormat("int i = 1;\n" 11451 "if (SomeType t = getSomething()) {\n" 11452 "}\n" 11453 "int j = 2;\n" 11454 "int big = 10000;", 11455 Alignment); 11456 verifyFormat("int j = 7;\n" 11457 "for (int k = 0; k < N; ++k) {\n" 11458 "}\n" 11459 "int j = 2;\n" 11460 "int big = 10000;\n" 11461 "}", 11462 Alignment); 11463 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11464 verifyFormat("int i = 1;\n" 11465 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11466 " = someLooooooooooooooooongFunction();\n" 11467 "int j = 2;", 11468 Alignment); 11469 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11470 verifyFormat("int i = 1;\n" 11471 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11472 " someLooooooooooooooooongFunction();\n" 11473 "int j = 2;", 11474 Alignment); 11475 11476 verifyFormat("auto lambda = []() {\n" 11477 " auto i = 0;\n" 11478 " return 0;\n" 11479 "};\n" 11480 "int i = 0;\n" 11481 "auto v = type{\n" 11482 " i = 1, //\n" 11483 " (i = 2), //\n" 11484 " i = 3 //\n" 11485 "};", 11486 Alignment); 11487 11488 verifyFormat( 11489 "int i = 1;\n" 11490 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11491 " loooooooooooooooooooooongParameterB);\n" 11492 "int j = 2;", 11493 Alignment); 11494 11495 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 11496 " typename B = very_long_type_name_1,\n" 11497 " typename T_2 = very_long_type_name_2>\n" 11498 "auto foo() {}\n", 11499 Alignment); 11500 verifyFormat("int a, b = 1;\n" 11501 "int c = 2;\n" 11502 "int dd = 3;\n", 11503 Alignment); 11504 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11505 "float b[1][] = {{3.f}};\n", 11506 Alignment); 11507 verifyFormat("for (int i = 0; i < 1; i++)\n" 11508 " int x = 1;\n", 11509 Alignment); 11510 verifyFormat("for (i = 0; i < 1; i++)\n" 11511 " x = 1;\n" 11512 "y = 1;\n", 11513 Alignment); 11514 } 11515 11516 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 11517 FormatStyle Alignment = getLLVMStyle(); 11518 Alignment.AlignConsecutiveMacros = true; 11519 Alignment.AlignConsecutiveDeclarations = false; 11520 verifyFormat("float const a = 5;\n" 11521 "int oneTwoThree = 123;", 11522 Alignment); 11523 verifyFormat("int a = 5;\n" 11524 "float const oneTwoThree = 123;", 11525 Alignment); 11526 11527 Alignment.AlignConsecutiveDeclarations = true; 11528 verifyFormat("float const a = 5;\n" 11529 "int oneTwoThree = 123;", 11530 Alignment); 11531 verifyFormat("int a = method();\n" 11532 "float const oneTwoThree = 133;", 11533 Alignment); 11534 verifyFormat("int i = 1, j = 10;\n" 11535 "something = 2000;", 11536 Alignment); 11537 verifyFormat("something = 2000;\n" 11538 "int i = 1, j = 10;\n", 11539 Alignment); 11540 verifyFormat("float something = 2000;\n" 11541 "double another = 911;\n" 11542 "int i = 1, j = 10;\n" 11543 "const int *oneMore = 1;\n" 11544 "unsigned i = 2;", 11545 Alignment); 11546 verifyFormat("float a = 5;\n" 11547 "int one = 1;\n" 11548 "method();\n" 11549 "const double oneTwoThree = 123;\n" 11550 "const unsigned int oneTwo = 12;", 11551 Alignment); 11552 verifyFormat("int oneTwoThree{0}; // comment\n" 11553 "unsigned oneTwo; // comment", 11554 Alignment); 11555 EXPECT_EQ("float const a = 5;\n" 11556 "\n" 11557 "int oneTwoThree = 123;", 11558 format("float const a = 5;\n" 11559 "\n" 11560 "int oneTwoThree= 123;", 11561 Alignment)); 11562 EXPECT_EQ("float a = 5;\n" 11563 "int one = 1;\n" 11564 "\n" 11565 "unsigned oneTwoThree = 123;", 11566 format("float a = 5;\n" 11567 "int one = 1;\n" 11568 "\n" 11569 "unsigned oneTwoThree = 123;", 11570 Alignment)); 11571 EXPECT_EQ("float a = 5;\n" 11572 "int one = 1;\n" 11573 "\n" 11574 "unsigned oneTwoThree = 123;\n" 11575 "int oneTwo = 12;", 11576 format("float a = 5;\n" 11577 "int one = 1;\n" 11578 "\n" 11579 "unsigned oneTwoThree = 123;\n" 11580 "int oneTwo = 12;", 11581 Alignment)); 11582 // Function prototype alignment 11583 verifyFormat("int a();\n" 11584 "double b();", 11585 Alignment); 11586 verifyFormat("int a(int x);\n" 11587 "double b();", 11588 Alignment); 11589 unsigned OldColumnLimit = Alignment.ColumnLimit; 11590 // We need to set ColumnLimit to zero, in order to stress nested alignments, 11591 // otherwise the function parameters will be re-flowed onto a single line. 11592 Alignment.ColumnLimit = 0; 11593 EXPECT_EQ("int a(int x,\n" 11594 " float y);\n" 11595 "double b(int x,\n" 11596 " double y);", 11597 format("int a(int x,\n" 11598 " float y);\n" 11599 "double b(int x,\n" 11600 " double y);", 11601 Alignment)); 11602 // This ensures that function parameters of function declarations are 11603 // correctly indented when their owning functions are indented. 11604 // The failure case here is for 'double y' to not be indented enough. 11605 EXPECT_EQ("double a(int x);\n" 11606 "int b(int y,\n" 11607 " double z);", 11608 format("double a(int x);\n" 11609 "int b(int y,\n" 11610 " double z);", 11611 Alignment)); 11612 // Set ColumnLimit low so that we induce wrapping immediately after 11613 // the function name and opening paren. 11614 Alignment.ColumnLimit = 13; 11615 verifyFormat("int function(\n" 11616 " int x,\n" 11617 " bool y);", 11618 Alignment); 11619 Alignment.ColumnLimit = OldColumnLimit; 11620 // Ensure function pointers don't screw up recursive alignment 11621 verifyFormat("int a(int x, void (*fp)(int y));\n" 11622 "double b();", 11623 Alignment); 11624 Alignment.AlignConsecutiveAssignments = true; 11625 // Ensure recursive alignment is broken by function braces, so that the 11626 // "a = 1" does not align with subsequent assignments inside the function 11627 // body. 11628 verifyFormat("int func(int a = 1) {\n" 11629 " int b = 2;\n" 11630 " int cc = 3;\n" 11631 "}", 11632 Alignment); 11633 verifyFormat("float something = 2000;\n" 11634 "double another = 911;\n" 11635 "int i = 1, j = 10;\n" 11636 "const int *oneMore = 1;\n" 11637 "unsigned i = 2;", 11638 Alignment); 11639 verifyFormat("int oneTwoThree = {0}; // comment\n" 11640 "unsigned oneTwo = 0; // comment", 11641 Alignment); 11642 // Make sure that scope is correctly tracked, in the absence of braces 11643 verifyFormat("for (int i = 0; i < n; i++)\n" 11644 " j = i;\n" 11645 "double x = 1;\n", 11646 Alignment); 11647 verifyFormat("if (int i = 0)\n" 11648 " j = i;\n" 11649 "double x = 1;\n", 11650 Alignment); 11651 // Ensure operator[] and operator() are comprehended 11652 verifyFormat("struct test {\n" 11653 " long long int foo();\n" 11654 " int operator[](int a);\n" 11655 " double bar();\n" 11656 "};\n", 11657 Alignment); 11658 verifyFormat("struct test {\n" 11659 " long long int foo();\n" 11660 " int operator()(int a);\n" 11661 " double bar();\n" 11662 "};\n", 11663 Alignment); 11664 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 11665 " int const i = 1;\n" 11666 " int * j = 2;\n" 11667 " int big = 10000;\n" 11668 "\n" 11669 " unsigned oneTwoThree = 123;\n" 11670 " int oneTwo = 12;\n" 11671 " method();\n" 11672 " float k = 2;\n" 11673 " int ll = 10000;\n" 11674 "}", 11675 format("void SomeFunction(int parameter= 0) {\n" 11676 " int const i= 1;\n" 11677 " int *j=2;\n" 11678 " int big = 10000;\n" 11679 "\n" 11680 "unsigned oneTwoThree =123;\n" 11681 "int oneTwo = 12;\n" 11682 " method();\n" 11683 "float k= 2;\n" 11684 "int ll=10000;\n" 11685 "}", 11686 Alignment)); 11687 Alignment.AlignConsecutiveAssignments = false; 11688 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 11689 verifyFormat("#define A \\\n" 11690 " int aaaa = 12; \\\n" 11691 " float b = 23; \\\n" 11692 " const int ccc = 234; \\\n" 11693 " unsigned dddddddddd = 2345;", 11694 Alignment); 11695 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 11696 verifyFormat("#define A \\\n" 11697 " int aaaa = 12; \\\n" 11698 " float b = 23; \\\n" 11699 " const int ccc = 234; \\\n" 11700 " unsigned dddddddddd = 2345;", 11701 Alignment); 11702 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 11703 Alignment.ColumnLimit = 30; 11704 verifyFormat("#define A \\\n" 11705 " int aaaa = 12; \\\n" 11706 " float b = 23; \\\n" 11707 " const int ccc = 234; \\\n" 11708 " int dddddddddd = 2345;", 11709 Alignment); 11710 Alignment.ColumnLimit = 80; 11711 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 11712 "k = 4, int l = 5,\n" 11713 " int m = 6) {\n" 11714 " const int j = 10;\n" 11715 " otherThing = 1;\n" 11716 "}", 11717 Alignment); 11718 verifyFormat("void SomeFunction(int parameter = 0) {\n" 11719 " int const i = 1;\n" 11720 " int * j = 2;\n" 11721 " int big = 10000;\n" 11722 "}", 11723 Alignment); 11724 verifyFormat("class C {\n" 11725 "public:\n" 11726 " int i = 1;\n" 11727 " virtual void f() = 0;\n" 11728 "};", 11729 Alignment); 11730 verifyFormat("float i = 1;\n" 11731 "if (SomeType t = getSomething()) {\n" 11732 "}\n" 11733 "const unsigned j = 2;\n" 11734 "int big = 10000;", 11735 Alignment); 11736 verifyFormat("float j = 7;\n" 11737 "for (int k = 0; k < N; ++k) {\n" 11738 "}\n" 11739 "unsigned j = 2;\n" 11740 "int big = 10000;\n" 11741 "}", 11742 Alignment); 11743 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11744 verifyFormat("float i = 1;\n" 11745 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11746 " = someLooooooooooooooooongFunction();\n" 11747 "int j = 2;", 11748 Alignment); 11749 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11750 verifyFormat("int i = 1;\n" 11751 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11752 " someLooooooooooooooooongFunction();\n" 11753 "int j = 2;", 11754 Alignment); 11755 11756 Alignment.AlignConsecutiveAssignments = true; 11757 verifyFormat("auto lambda = []() {\n" 11758 " auto ii = 0;\n" 11759 " float j = 0;\n" 11760 " return 0;\n" 11761 "};\n" 11762 "int i = 0;\n" 11763 "float i2 = 0;\n" 11764 "auto v = type{\n" 11765 " i = 1, //\n" 11766 " (i = 2), //\n" 11767 " i = 3 //\n" 11768 "};", 11769 Alignment); 11770 Alignment.AlignConsecutiveAssignments = false; 11771 11772 verifyFormat( 11773 "int i = 1;\n" 11774 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11775 " loooooooooooooooooooooongParameterB);\n" 11776 "int j = 2;", 11777 Alignment); 11778 11779 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 11780 // We expect declarations and assignments to align, as long as it doesn't 11781 // exceed the column limit, starting a new alignment sequence whenever it 11782 // happens. 11783 Alignment.AlignConsecutiveAssignments = true; 11784 Alignment.ColumnLimit = 30; 11785 verifyFormat("float ii = 1;\n" 11786 "unsigned j = 2;\n" 11787 "int someVerylongVariable = 1;\n" 11788 "AnotherLongType ll = 123456;\n" 11789 "VeryVeryLongType k = 2;\n" 11790 "int myvar = 1;", 11791 Alignment); 11792 Alignment.ColumnLimit = 80; 11793 Alignment.AlignConsecutiveAssignments = false; 11794 11795 verifyFormat( 11796 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 11797 " typename LongType, typename B>\n" 11798 "auto foo() {}\n", 11799 Alignment); 11800 verifyFormat("float a, b = 1;\n" 11801 "int c = 2;\n" 11802 "int dd = 3;\n", 11803 Alignment); 11804 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11805 "float b[1][] = {{3.f}};\n", 11806 Alignment); 11807 Alignment.AlignConsecutiveAssignments = true; 11808 verifyFormat("float a, b = 1;\n" 11809 "int c = 2;\n" 11810 "int dd = 3;\n", 11811 Alignment); 11812 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11813 "float b[1][] = {{3.f}};\n", 11814 Alignment); 11815 Alignment.AlignConsecutiveAssignments = false; 11816 11817 Alignment.ColumnLimit = 30; 11818 Alignment.BinPackParameters = false; 11819 verifyFormat("void foo(float a,\n" 11820 " float b,\n" 11821 " int c,\n" 11822 " uint32_t *d) {\n" 11823 " int * e = 0;\n" 11824 " float f = 0;\n" 11825 " double g = 0;\n" 11826 "}\n" 11827 "void bar(ino_t a,\n" 11828 " int b,\n" 11829 " uint32_t *c,\n" 11830 " bool d) {}\n", 11831 Alignment); 11832 Alignment.BinPackParameters = true; 11833 Alignment.ColumnLimit = 80; 11834 11835 // Bug 33507 11836 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 11837 verifyFormat( 11838 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 11839 " static const Version verVs2017;\n" 11840 " return true;\n" 11841 "});\n", 11842 Alignment); 11843 Alignment.PointerAlignment = FormatStyle::PAS_Right; 11844 11845 // See llvm.org/PR35641 11846 Alignment.AlignConsecutiveDeclarations = true; 11847 verifyFormat("int func() { //\n" 11848 " int b;\n" 11849 " unsigned c;\n" 11850 "}", 11851 Alignment); 11852 11853 // See PR37175 11854 FormatStyle Style = getMozillaStyle(); 11855 Style.AlignConsecutiveDeclarations = true; 11856 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 11857 "foo(int a);", 11858 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 11859 } 11860 11861 TEST_F(FormatTest, LinuxBraceBreaking) { 11862 FormatStyle LinuxBraceStyle = getLLVMStyle(); 11863 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 11864 verifyFormat("namespace a\n" 11865 "{\n" 11866 "class A\n" 11867 "{\n" 11868 " void f()\n" 11869 " {\n" 11870 " if (true) {\n" 11871 " a();\n" 11872 " b();\n" 11873 " } else {\n" 11874 " a();\n" 11875 " }\n" 11876 " }\n" 11877 " void g() { return; }\n" 11878 "};\n" 11879 "struct B {\n" 11880 " int x;\n" 11881 "};\n" 11882 "} // namespace a\n", 11883 LinuxBraceStyle); 11884 verifyFormat("enum X {\n" 11885 " Y = 0,\n" 11886 "}\n", 11887 LinuxBraceStyle); 11888 verifyFormat("struct S {\n" 11889 " int Type;\n" 11890 " union {\n" 11891 " int x;\n" 11892 " double y;\n" 11893 " } Value;\n" 11894 " class C\n" 11895 " {\n" 11896 " MyFavoriteType Value;\n" 11897 " } Class;\n" 11898 "}\n", 11899 LinuxBraceStyle); 11900 } 11901 11902 TEST_F(FormatTest, MozillaBraceBreaking) { 11903 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11904 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11905 MozillaBraceStyle.FixNamespaceComments = false; 11906 verifyFormat("namespace a {\n" 11907 "class A\n" 11908 "{\n" 11909 " void f()\n" 11910 " {\n" 11911 " if (true) {\n" 11912 " a();\n" 11913 " b();\n" 11914 " }\n" 11915 " }\n" 11916 " void g() { return; }\n" 11917 "};\n" 11918 "enum E\n" 11919 "{\n" 11920 " A,\n" 11921 " // foo\n" 11922 " B,\n" 11923 " C\n" 11924 "};\n" 11925 "struct B\n" 11926 "{\n" 11927 " int x;\n" 11928 "};\n" 11929 "}\n", 11930 MozillaBraceStyle); 11931 verifyFormat("struct S\n" 11932 "{\n" 11933 " int Type;\n" 11934 " union\n" 11935 " {\n" 11936 " int x;\n" 11937 " double y;\n" 11938 " } Value;\n" 11939 " class C\n" 11940 " {\n" 11941 " MyFavoriteType Value;\n" 11942 " } Class;\n" 11943 "}\n", 11944 MozillaBraceStyle); 11945 } 11946 11947 TEST_F(FormatTest, StroustrupBraceBreaking) { 11948 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11949 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11950 verifyFormat("namespace a {\n" 11951 "class A {\n" 11952 " void f()\n" 11953 " {\n" 11954 " if (true) {\n" 11955 " a();\n" 11956 " b();\n" 11957 " }\n" 11958 " }\n" 11959 " void g() { return; }\n" 11960 "};\n" 11961 "struct B {\n" 11962 " int x;\n" 11963 "};\n" 11964 "} // namespace a\n", 11965 StroustrupBraceStyle); 11966 11967 verifyFormat("void foo()\n" 11968 "{\n" 11969 " if (a) {\n" 11970 " a();\n" 11971 " }\n" 11972 " else {\n" 11973 " b();\n" 11974 " }\n" 11975 "}\n", 11976 StroustrupBraceStyle); 11977 11978 verifyFormat("#ifdef _DEBUG\n" 11979 "int foo(int i = 0)\n" 11980 "#else\n" 11981 "int foo(int i = 5)\n" 11982 "#endif\n" 11983 "{\n" 11984 " return i;\n" 11985 "}", 11986 StroustrupBraceStyle); 11987 11988 verifyFormat("void foo() {}\n" 11989 "void bar()\n" 11990 "#ifdef _DEBUG\n" 11991 "{\n" 11992 " foo();\n" 11993 "}\n" 11994 "#else\n" 11995 "{\n" 11996 "}\n" 11997 "#endif", 11998 StroustrupBraceStyle); 11999 12000 verifyFormat("void foobar() { int i = 5; }\n" 12001 "#ifdef _DEBUG\n" 12002 "void bar() {}\n" 12003 "#else\n" 12004 "void bar() { foobar(); }\n" 12005 "#endif", 12006 StroustrupBraceStyle); 12007 } 12008 12009 TEST_F(FormatTest, AllmanBraceBreaking) { 12010 FormatStyle AllmanBraceStyle = getLLVMStyle(); 12011 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 12012 12013 EXPECT_EQ("namespace a\n" 12014 "{\n" 12015 "void f();\n" 12016 "void g();\n" 12017 "} // namespace a\n", 12018 format("namespace a\n" 12019 "{\n" 12020 "void f();\n" 12021 "void g();\n" 12022 "}\n", 12023 AllmanBraceStyle)); 12024 12025 verifyFormat("namespace a\n" 12026 "{\n" 12027 "class A\n" 12028 "{\n" 12029 " void f()\n" 12030 " {\n" 12031 " if (true)\n" 12032 " {\n" 12033 " a();\n" 12034 " b();\n" 12035 " }\n" 12036 " }\n" 12037 " void g() { return; }\n" 12038 "};\n" 12039 "struct B\n" 12040 "{\n" 12041 " int x;\n" 12042 "};\n" 12043 "union C\n" 12044 "{\n" 12045 "};\n" 12046 "} // namespace a", 12047 AllmanBraceStyle); 12048 12049 verifyFormat("void f()\n" 12050 "{\n" 12051 " if (true)\n" 12052 " {\n" 12053 " a();\n" 12054 " }\n" 12055 " else if (false)\n" 12056 " {\n" 12057 " b();\n" 12058 " }\n" 12059 " else\n" 12060 " {\n" 12061 " c();\n" 12062 " }\n" 12063 "}\n", 12064 AllmanBraceStyle); 12065 12066 verifyFormat("void f()\n" 12067 "{\n" 12068 " for (int i = 0; i < 10; ++i)\n" 12069 " {\n" 12070 " a();\n" 12071 " }\n" 12072 " while (false)\n" 12073 " {\n" 12074 " b();\n" 12075 " }\n" 12076 " do\n" 12077 " {\n" 12078 " c();\n" 12079 " } while (false)\n" 12080 "}\n", 12081 AllmanBraceStyle); 12082 12083 verifyFormat("void f(int a)\n" 12084 "{\n" 12085 " switch (a)\n" 12086 " {\n" 12087 " case 0:\n" 12088 " break;\n" 12089 " case 1:\n" 12090 " {\n" 12091 " break;\n" 12092 " }\n" 12093 " case 2:\n" 12094 " {\n" 12095 " }\n" 12096 " break;\n" 12097 " default:\n" 12098 " break;\n" 12099 " }\n" 12100 "}\n", 12101 AllmanBraceStyle); 12102 12103 verifyFormat("enum X\n" 12104 "{\n" 12105 " Y = 0,\n" 12106 "}\n", 12107 AllmanBraceStyle); 12108 verifyFormat("enum X\n" 12109 "{\n" 12110 " Y = 0\n" 12111 "}\n", 12112 AllmanBraceStyle); 12113 12114 verifyFormat("@interface BSApplicationController ()\n" 12115 "{\n" 12116 "@private\n" 12117 " id _extraIvar;\n" 12118 "}\n" 12119 "@end\n", 12120 AllmanBraceStyle); 12121 12122 verifyFormat("#ifdef _DEBUG\n" 12123 "int foo(int i = 0)\n" 12124 "#else\n" 12125 "int foo(int i = 5)\n" 12126 "#endif\n" 12127 "{\n" 12128 " return i;\n" 12129 "}", 12130 AllmanBraceStyle); 12131 12132 verifyFormat("void foo() {}\n" 12133 "void bar()\n" 12134 "#ifdef _DEBUG\n" 12135 "{\n" 12136 " foo();\n" 12137 "}\n" 12138 "#else\n" 12139 "{\n" 12140 "}\n" 12141 "#endif", 12142 AllmanBraceStyle); 12143 12144 verifyFormat("void foobar() { int i = 5; }\n" 12145 "#ifdef _DEBUG\n" 12146 "void bar() {}\n" 12147 "#else\n" 12148 "void bar() { foobar(); }\n" 12149 "#endif", 12150 AllmanBraceStyle); 12151 12152 // This shouldn't affect ObjC blocks.. 12153 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 12154 " // ...\n" 12155 " int i;\n" 12156 "}];", 12157 AllmanBraceStyle); 12158 verifyFormat("void (^block)(void) = ^{\n" 12159 " // ...\n" 12160 " int i;\n" 12161 "};", 12162 AllmanBraceStyle); 12163 // .. or dict literals. 12164 verifyFormat("void f()\n" 12165 "{\n" 12166 " // ...\n" 12167 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 12168 "}", 12169 AllmanBraceStyle); 12170 verifyFormat("void f()\n" 12171 "{\n" 12172 " // ...\n" 12173 " [object someMethod:@{a : @\"b\"}];\n" 12174 "}", 12175 AllmanBraceStyle); 12176 verifyFormat("int f()\n" 12177 "{ // comment\n" 12178 " return 42;\n" 12179 "}", 12180 AllmanBraceStyle); 12181 12182 AllmanBraceStyle.ColumnLimit = 19; 12183 verifyFormat("void f() { int i; }", AllmanBraceStyle); 12184 AllmanBraceStyle.ColumnLimit = 18; 12185 verifyFormat("void f()\n" 12186 "{\n" 12187 " int i;\n" 12188 "}", 12189 AllmanBraceStyle); 12190 AllmanBraceStyle.ColumnLimit = 80; 12191 12192 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 12193 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 12194 FormatStyle::SIS_WithoutElse; 12195 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 12196 verifyFormat("void f(bool b)\n" 12197 "{\n" 12198 " if (b)\n" 12199 " {\n" 12200 " return;\n" 12201 " }\n" 12202 "}\n", 12203 BreakBeforeBraceShortIfs); 12204 verifyFormat("void f(bool b)\n" 12205 "{\n" 12206 " if constexpr (b)\n" 12207 " {\n" 12208 " return;\n" 12209 " }\n" 12210 "}\n", 12211 BreakBeforeBraceShortIfs); 12212 verifyFormat("void f(bool b)\n" 12213 "{\n" 12214 " if CONSTEXPR (b)\n" 12215 " {\n" 12216 " return;\n" 12217 " }\n" 12218 "}\n", 12219 BreakBeforeBraceShortIfs); 12220 verifyFormat("void f(bool b)\n" 12221 "{\n" 12222 " if (b) return;\n" 12223 "}\n", 12224 BreakBeforeBraceShortIfs); 12225 verifyFormat("void f(bool b)\n" 12226 "{\n" 12227 " if constexpr (b) return;\n" 12228 "}\n", 12229 BreakBeforeBraceShortIfs); 12230 verifyFormat("void f(bool b)\n" 12231 "{\n" 12232 " if CONSTEXPR (b) return;\n" 12233 "}\n", 12234 BreakBeforeBraceShortIfs); 12235 verifyFormat("void f(bool b)\n" 12236 "{\n" 12237 " while (b)\n" 12238 " {\n" 12239 " return;\n" 12240 " }\n" 12241 "}\n", 12242 BreakBeforeBraceShortIfs); 12243 } 12244 12245 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 12246 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 12247 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 12248 12249 // Make a few changes to the style for testing purposes 12250 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 12251 FormatStyle::SFS_Empty; 12252 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 12253 WhitesmithsBraceStyle.ColumnLimit = 0; 12254 12255 // FIXME: this test case can't decide whether there should be a blank line 12256 // after the ~D() line or not. It adds one if one doesn't exist in the test 12257 // and it removes the line if one exists. 12258 /* 12259 verifyFormat("class A;\n" 12260 "namespace B\n" 12261 " {\n" 12262 "class C;\n" 12263 "// Comment\n" 12264 "class D\n" 12265 " {\n" 12266 "public:\n" 12267 " D();\n" 12268 " ~D() {}\n" 12269 "private:\n" 12270 " enum E\n" 12271 " {\n" 12272 " F\n" 12273 " }\n" 12274 " };\n" 12275 " } // namespace B\n", 12276 WhitesmithsBraceStyle); 12277 */ 12278 12279 verifyFormat("namespace a\n" 12280 " {\n" 12281 "class A\n" 12282 " {\n" 12283 " void f()\n" 12284 " {\n" 12285 " if (true)\n" 12286 " {\n" 12287 " a();\n" 12288 " b();\n" 12289 " }\n" 12290 " }\n" 12291 " void g()\n" 12292 " {\n" 12293 " return;\n" 12294 " }\n" 12295 " };\n" 12296 "struct B\n" 12297 " {\n" 12298 " int x;\n" 12299 " };\n" 12300 " } // namespace a", 12301 WhitesmithsBraceStyle); 12302 12303 verifyFormat("void f()\n" 12304 " {\n" 12305 " if (true)\n" 12306 " {\n" 12307 " a();\n" 12308 " }\n" 12309 " else if (false)\n" 12310 " {\n" 12311 " b();\n" 12312 " }\n" 12313 " else\n" 12314 " {\n" 12315 " c();\n" 12316 " }\n" 12317 " }\n", 12318 WhitesmithsBraceStyle); 12319 12320 verifyFormat("void f()\n" 12321 " {\n" 12322 " for (int i = 0; i < 10; ++i)\n" 12323 " {\n" 12324 " a();\n" 12325 " }\n" 12326 " while (false)\n" 12327 " {\n" 12328 " b();\n" 12329 " }\n" 12330 " do\n" 12331 " {\n" 12332 " c();\n" 12333 " } while (false)\n" 12334 " }\n", 12335 WhitesmithsBraceStyle); 12336 12337 // FIXME: the block and the break under case 2 in this test don't get indented 12338 // correctly 12339 /* 12340 verifyFormat("void switchTest1(int a)\n" 12341 " {\n" 12342 " switch (a)\n" 12343 " {\n" 12344 " case 2:\n" 12345 " {\n" 12346 " }\n" 12347 " break;\n" 12348 " }\n" 12349 " }\n", 12350 WhitesmithsBraceStyle); 12351 */ 12352 12353 // FIXME: the block and the break under case 2 in this test don't get indented 12354 // correctly 12355 /* 12356 verifyFormat("void switchTest2(int a)\n" 12357 " {\n" 12358 " switch (a)\n" 12359 " {\n" 12360 " case 0:\n" 12361 " break;\n" 12362 " case 1:\n" 12363 " {\n" 12364 " break;\n" 12365 " }\n" 12366 " case 2:\n" 12367 " {\n" 12368 " }\n" 12369 " break;\n" 12370 " default:\n" 12371 " break;\n" 12372 " }\n" 12373 " }\n", 12374 WhitesmithsBraceStyle); 12375 */ 12376 12377 verifyFormat("enum X\n" 12378 " {\n" 12379 " Y = 0, // testing\n" 12380 " }\n", 12381 WhitesmithsBraceStyle); 12382 12383 verifyFormat("enum X\n" 12384 " {\n" 12385 " Y = 0\n" 12386 " }\n", 12387 WhitesmithsBraceStyle); 12388 verifyFormat("enum X\n" 12389 " {\n" 12390 " Y = 0,\n" 12391 " Z = 1\n" 12392 " };\n", 12393 WhitesmithsBraceStyle); 12394 12395 verifyFormat("@interface BSApplicationController ()\n" 12396 " {\n" 12397 "@private\n" 12398 " id _extraIvar;\n" 12399 " }\n" 12400 "@end\n", 12401 WhitesmithsBraceStyle); 12402 12403 verifyFormat("#ifdef _DEBUG\n" 12404 "int foo(int i = 0)\n" 12405 "#else\n" 12406 "int foo(int i = 5)\n" 12407 "#endif\n" 12408 " {\n" 12409 " return i;\n" 12410 " }", 12411 WhitesmithsBraceStyle); 12412 12413 verifyFormat("void foo() {}\n" 12414 "void bar()\n" 12415 "#ifdef _DEBUG\n" 12416 " {\n" 12417 " foo();\n" 12418 " }\n" 12419 "#else\n" 12420 " {\n" 12421 " }\n" 12422 "#endif", 12423 WhitesmithsBraceStyle); 12424 12425 verifyFormat("void foobar()\n" 12426 " {\n" 12427 " int i = 5;\n" 12428 " }\n" 12429 "#ifdef _DEBUG\n" 12430 "void bar()\n" 12431 " {\n" 12432 " }\n" 12433 "#else\n" 12434 "void bar()\n" 12435 " {\n" 12436 " foobar();\n" 12437 " }\n" 12438 "#endif", 12439 WhitesmithsBraceStyle); 12440 12441 // This shouldn't affect ObjC blocks.. 12442 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 12443 " // ...\n" 12444 " int i;\n" 12445 "}];", 12446 WhitesmithsBraceStyle); 12447 verifyFormat("void (^block)(void) = ^{\n" 12448 " // ...\n" 12449 " int i;\n" 12450 "};", 12451 WhitesmithsBraceStyle); 12452 // .. or dict literals. 12453 verifyFormat("void f()\n" 12454 " {\n" 12455 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 12456 " }", 12457 WhitesmithsBraceStyle); 12458 12459 verifyFormat("int f()\n" 12460 " { // comment\n" 12461 " return 42;\n" 12462 " }", 12463 WhitesmithsBraceStyle); 12464 12465 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 12466 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 12467 FormatStyle::SIS_Always; 12468 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 12469 verifyFormat("void f(bool b)\n" 12470 " {\n" 12471 " if (b)\n" 12472 " {\n" 12473 " return;\n" 12474 " }\n" 12475 " }\n", 12476 BreakBeforeBraceShortIfs); 12477 verifyFormat("void f(bool b)\n" 12478 " {\n" 12479 " if (b) return;\n" 12480 " }\n", 12481 BreakBeforeBraceShortIfs); 12482 verifyFormat("void f(bool b)\n" 12483 " {\n" 12484 " while (b)\n" 12485 " {\n" 12486 " return;\n" 12487 " }\n" 12488 " }\n", 12489 BreakBeforeBraceShortIfs); 12490 } 12491 12492 TEST_F(FormatTest, GNUBraceBreaking) { 12493 FormatStyle GNUBraceStyle = getLLVMStyle(); 12494 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 12495 verifyFormat("namespace a\n" 12496 "{\n" 12497 "class A\n" 12498 "{\n" 12499 " void f()\n" 12500 " {\n" 12501 " int a;\n" 12502 " {\n" 12503 " int b;\n" 12504 " }\n" 12505 " if (true)\n" 12506 " {\n" 12507 " a();\n" 12508 " b();\n" 12509 " }\n" 12510 " }\n" 12511 " void g() { return; }\n" 12512 "}\n" 12513 "} // namespace a", 12514 GNUBraceStyle); 12515 12516 verifyFormat("void f()\n" 12517 "{\n" 12518 " if (true)\n" 12519 " {\n" 12520 " a();\n" 12521 " }\n" 12522 " else if (false)\n" 12523 " {\n" 12524 " b();\n" 12525 " }\n" 12526 " else\n" 12527 " {\n" 12528 " c();\n" 12529 " }\n" 12530 "}\n", 12531 GNUBraceStyle); 12532 12533 verifyFormat("void f()\n" 12534 "{\n" 12535 " for (int i = 0; i < 10; ++i)\n" 12536 " {\n" 12537 " a();\n" 12538 " }\n" 12539 " while (false)\n" 12540 " {\n" 12541 " b();\n" 12542 " }\n" 12543 " do\n" 12544 " {\n" 12545 " c();\n" 12546 " }\n" 12547 " while (false);\n" 12548 "}\n", 12549 GNUBraceStyle); 12550 12551 verifyFormat("void f(int a)\n" 12552 "{\n" 12553 " switch (a)\n" 12554 " {\n" 12555 " case 0:\n" 12556 " break;\n" 12557 " case 1:\n" 12558 " {\n" 12559 " break;\n" 12560 " }\n" 12561 " case 2:\n" 12562 " {\n" 12563 " }\n" 12564 " break;\n" 12565 " default:\n" 12566 " break;\n" 12567 " }\n" 12568 "}\n", 12569 GNUBraceStyle); 12570 12571 verifyFormat("enum X\n" 12572 "{\n" 12573 " Y = 0,\n" 12574 "}\n", 12575 GNUBraceStyle); 12576 12577 verifyFormat("@interface BSApplicationController ()\n" 12578 "{\n" 12579 "@private\n" 12580 " id _extraIvar;\n" 12581 "}\n" 12582 "@end\n", 12583 GNUBraceStyle); 12584 12585 verifyFormat("#ifdef _DEBUG\n" 12586 "int foo(int i = 0)\n" 12587 "#else\n" 12588 "int foo(int i = 5)\n" 12589 "#endif\n" 12590 "{\n" 12591 " return i;\n" 12592 "}", 12593 GNUBraceStyle); 12594 12595 verifyFormat("void foo() {}\n" 12596 "void bar()\n" 12597 "#ifdef _DEBUG\n" 12598 "{\n" 12599 " foo();\n" 12600 "}\n" 12601 "#else\n" 12602 "{\n" 12603 "}\n" 12604 "#endif", 12605 GNUBraceStyle); 12606 12607 verifyFormat("void foobar() { int i = 5; }\n" 12608 "#ifdef _DEBUG\n" 12609 "void bar() {}\n" 12610 "#else\n" 12611 "void bar() { foobar(); }\n" 12612 "#endif", 12613 GNUBraceStyle); 12614 } 12615 12616 TEST_F(FormatTest, WebKitBraceBreaking) { 12617 FormatStyle WebKitBraceStyle = getLLVMStyle(); 12618 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 12619 WebKitBraceStyle.FixNamespaceComments = false; 12620 verifyFormat("namespace a {\n" 12621 "class A {\n" 12622 " void f()\n" 12623 " {\n" 12624 " if (true) {\n" 12625 " a();\n" 12626 " b();\n" 12627 " }\n" 12628 " }\n" 12629 " void g() { return; }\n" 12630 "};\n" 12631 "enum E {\n" 12632 " A,\n" 12633 " // foo\n" 12634 " B,\n" 12635 " C\n" 12636 "};\n" 12637 "struct B {\n" 12638 " int x;\n" 12639 "};\n" 12640 "}\n", 12641 WebKitBraceStyle); 12642 verifyFormat("struct S {\n" 12643 " int Type;\n" 12644 " union {\n" 12645 " int x;\n" 12646 " double y;\n" 12647 " } Value;\n" 12648 " class C {\n" 12649 " MyFavoriteType Value;\n" 12650 " } Class;\n" 12651 "};\n", 12652 WebKitBraceStyle); 12653 } 12654 12655 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 12656 verifyFormat("void f() {\n" 12657 " try {\n" 12658 " } catch (const Exception &e) {\n" 12659 " }\n" 12660 "}\n", 12661 getLLVMStyle()); 12662 } 12663 12664 TEST_F(FormatTest, UnderstandsPragmas) { 12665 verifyFormat("#pragma omp reduction(| : var)"); 12666 verifyFormat("#pragma omp reduction(+ : var)"); 12667 12668 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 12669 "(including parentheses).", 12670 format("#pragma mark Any non-hyphenated or hyphenated string " 12671 "(including parentheses).")); 12672 } 12673 12674 TEST_F(FormatTest, UnderstandPragmaOption) { 12675 verifyFormat("#pragma option -C -A"); 12676 12677 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 12678 } 12679 12680 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 12681 FormatStyle Style = getLLVMStyle(); 12682 Style.ColumnLimit = 20; 12683 12684 // See PR41213 12685 EXPECT_EQ("/*\n" 12686 " *\t9012345\n" 12687 " * /8901\n" 12688 " */", 12689 format("/*\n" 12690 " *\t9012345 /8901\n" 12691 " */", 12692 Style)); 12693 EXPECT_EQ("/*\n" 12694 " *345678\n" 12695 " *\t/8901\n" 12696 " */", 12697 format("/*\n" 12698 " *345678\t/8901\n" 12699 " */", 12700 Style)); 12701 12702 verifyFormat("int a; // the\n" 12703 " // comment", 12704 Style); 12705 EXPECT_EQ("int a; /* first line\n" 12706 " * second\n" 12707 " * line third\n" 12708 " * line\n" 12709 " */", 12710 format("int a; /* first line\n" 12711 " * second\n" 12712 " * line third\n" 12713 " * line\n" 12714 " */", 12715 Style)); 12716 EXPECT_EQ("int a; // first line\n" 12717 " // second\n" 12718 " // line third\n" 12719 " // line", 12720 format("int a; // first line\n" 12721 " // second line\n" 12722 " // third line", 12723 Style)); 12724 12725 Style.PenaltyExcessCharacter = 90; 12726 verifyFormat("int a; // the comment", Style); 12727 EXPECT_EQ("int a; // the comment\n" 12728 " // aaa", 12729 format("int a; // the comment aaa", Style)); 12730 EXPECT_EQ("int a; /* first line\n" 12731 " * second line\n" 12732 " * third line\n" 12733 " */", 12734 format("int a; /* first line\n" 12735 " * second line\n" 12736 " * third line\n" 12737 " */", 12738 Style)); 12739 EXPECT_EQ("int a; // first line\n" 12740 " // second line\n" 12741 " // third line", 12742 format("int a; // first line\n" 12743 " // second line\n" 12744 " // third line", 12745 Style)); 12746 // FIXME: Investigate why this is not getting the same layout as the test 12747 // above. 12748 EXPECT_EQ("int a; /* first line\n" 12749 " * second line\n" 12750 " * third line\n" 12751 " */", 12752 format("int a; /* first line second line third line" 12753 "\n*/", 12754 Style)); 12755 12756 EXPECT_EQ("// foo bar baz bazfoo\n" 12757 "// foo bar foo bar\n", 12758 format("// foo bar baz bazfoo\n" 12759 "// foo bar foo bar\n", 12760 Style)); 12761 EXPECT_EQ("// foo bar baz bazfoo\n" 12762 "// foo bar foo bar\n", 12763 format("// foo bar baz bazfoo\n" 12764 "// foo bar foo bar\n", 12765 Style)); 12766 12767 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 12768 // next one. 12769 EXPECT_EQ("// foo bar baz bazfoo\n" 12770 "// bar foo bar\n", 12771 format("// foo bar baz bazfoo bar\n" 12772 "// foo bar\n", 12773 Style)); 12774 12775 EXPECT_EQ("// foo bar baz bazfoo\n" 12776 "// foo bar baz bazfoo\n" 12777 "// bar foo bar\n", 12778 format("// foo bar baz bazfoo\n" 12779 "// foo bar baz bazfoo bar\n" 12780 "// foo bar\n", 12781 Style)); 12782 12783 EXPECT_EQ("// foo bar baz bazfoo\n" 12784 "// foo bar baz bazfoo\n" 12785 "// bar foo bar\n", 12786 format("// foo bar baz bazfoo\n" 12787 "// foo bar baz bazfoo bar\n" 12788 "// foo bar\n", 12789 Style)); 12790 12791 // Make sure we do not keep protruding characters if strict mode reflow is 12792 // cheaper than keeping protruding characters. 12793 Style.ColumnLimit = 21; 12794 EXPECT_EQ( 12795 "// foo foo foo foo\n" 12796 "// foo foo foo foo\n" 12797 "// foo foo foo foo\n", 12798 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 12799 12800 EXPECT_EQ("int a = /* long block\n" 12801 " comment */\n" 12802 " 42;", 12803 format("int a = /* long block comment */ 42;", Style)); 12804 } 12805 12806 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 12807 for (size_t i = 1; i < Styles.size(); ++i) \ 12808 EXPECT_EQ(Styles[0], Styles[i]) \ 12809 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 12810 12811 TEST_F(FormatTest, GetsPredefinedStyleByName) { 12812 SmallVector<FormatStyle, 3> Styles; 12813 Styles.resize(3); 12814 12815 Styles[0] = getLLVMStyle(); 12816 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 12817 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 12818 EXPECT_ALL_STYLES_EQUAL(Styles); 12819 12820 Styles[0] = getGoogleStyle(); 12821 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 12822 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 12823 EXPECT_ALL_STYLES_EQUAL(Styles); 12824 12825 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12826 EXPECT_TRUE( 12827 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 12828 EXPECT_TRUE( 12829 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 12830 EXPECT_ALL_STYLES_EQUAL(Styles); 12831 12832 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 12833 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 12834 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 12835 EXPECT_ALL_STYLES_EQUAL(Styles); 12836 12837 Styles[0] = getMozillaStyle(); 12838 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 12839 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 12840 EXPECT_ALL_STYLES_EQUAL(Styles); 12841 12842 Styles[0] = getWebKitStyle(); 12843 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 12844 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 12845 EXPECT_ALL_STYLES_EQUAL(Styles); 12846 12847 Styles[0] = getGNUStyle(); 12848 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 12849 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 12850 EXPECT_ALL_STYLES_EQUAL(Styles); 12851 12852 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 12853 } 12854 12855 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 12856 SmallVector<FormatStyle, 8> Styles; 12857 Styles.resize(2); 12858 12859 Styles[0] = getGoogleStyle(); 12860 Styles[1] = getLLVMStyle(); 12861 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12862 EXPECT_ALL_STYLES_EQUAL(Styles); 12863 12864 Styles.resize(5); 12865 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12866 Styles[1] = getLLVMStyle(); 12867 Styles[1].Language = FormatStyle::LK_JavaScript; 12868 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12869 12870 Styles[2] = getLLVMStyle(); 12871 Styles[2].Language = FormatStyle::LK_JavaScript; 12872 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 12873 "BasedOnStyle: Google", 12874 &Styles[2]) 12875 .value()); 12876 12877 Styles[3] = getLLVMStyle(); 12878 Styles[3].Language = FormatStyle::LK_JavaScript; 12879 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 12880 "Language: JavaScript", 12881 &Styles[3]) 12882 .value()); 12883 12884 Styles[4] = getLLVMStyle(); 12885 Styles[4].Language = FormatStyle::LK_JavaScript; 12886 EXPECT_EQ(0, parseConfiguration("---\n" 12887 "BasedOnStyle: LLVM\n" 12888 "IndentWidth: 123\n" 12889 "---\n" 12890 "BasedOnStyle: Google\n" 12891 "Language: JavaScript", 12892 &Styles[4]) 12893 .value()); 12894 EXPECT_ALL_STYLES_EQUAL(Styles); 12895 } 12896 12897 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 12898 Style.FIELD = false; \ 12899 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 12900 EXPECT_TRUE(Style.FIELD); \ 12901 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 12902 EXPECT_FALSE(Style.FIELD); 12903 12904 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 12905 12906 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 12907 Style.STRUCT.FIELD = false; \ 12908 EXPECT_EQ(0, \ 12909 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 12910 .value()); \ 12911 EXPECT_TRUE(Style.STRUCT.FIELD); \ 12912 EXPECT_EQ(0, \ 12913 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 12914 .value()); \ 12915 EXPECT_FALSE(Style.STRUCT.FIELD); 12916 12917 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 12918 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 12919 12920 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 12921 EXPECT_NE(VALUE, Style.FIELD); \ 12922 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 12923 EXPECT_EQ(VALUE, Style.FIELD) 12924 12925 TEST_F(FormatTest, ParsesConfigurationBools) { 12926 FormatStyle Style = {}; 12927 Style.Language = FormatStyle::LK_Cpp; 12928 CHECK_PARSE_BOOL(AlignOperands); 12929 CHECK_PARSE_BOOL(AlignTrailingComments); 12930 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 12931 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 12932 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 12933 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 12934 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 12935 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 12936 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 12937 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 12938 CHECK_PARSE_BOOL(BinPackArguments); 12939 CHECK_PARSE_BOOL(BinPackParameters); 12940 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 12941 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 12942 CHECK_PARSE_BOOL(BreakStringLiterals); 12943 CHECK_PARSE_BOOL(CompactNamespaces); 12944 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 12945 CHECK_PARSE_BOOL(DeriveLineEnding); 12946 CHECK_PARSE_BOOL(DerivePointerAlignment); 12947 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 12948 CHECK_PARSE_BOOL(DisableFormat); 12949 CHECK_PARSE_BOOL(IndentCaseLabels); 12950 CHECK_PARSE_BOOL(IndentCaseBlocks); 12951 CHECK_PARSE_BOOL(IndentGotoLabels); 12952 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 12953 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 12954 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 12955 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 12956 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 12957 CHECK_PARSE_BOOL(ReflowComments); 12958 CHECK_PARSE_BOOL(SortIncludes); 12959 CHECK_PARSE_BOOL(SortUsingDeclarations); 12960 CHECK_PARSE_BOOL(SpacesInParentheses); 12961 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 12962 CHECK_PARSE_BOOL(SpacesInAngles); 12963 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 12964 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 12965 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 12966 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 12967 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 12968 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 12969 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 12970 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 12971 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 12972 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 12973 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 12974 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 12975 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 12976 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 12977 CHECK_PARSE_BOOL(UseCRLF); 12978 12979 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 12980 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 12981 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 12982 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 12983 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 12984 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 12985 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 12986 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 12987 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 12988 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 12989 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 12990 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody); 12991 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 12992 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 12993 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 12994 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 12995 } 12996 12997 #undef CHECK_PARSE_BOOL 12998 12999 TEST_F(FormatTest, ParsesConfiguration) { 13000 FormatStyle Style = {}; 13001 Style.Language = FormatStyle::LK_Cpp; 13002 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 13003 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 13004 ConstructorInitializerIndentWidth, 1234u); 13005 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 13006 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 13007 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 13008 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 13009 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 13010 PenaltyBreakBeforeFirstCallParameter, 1234u); 13011 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 13012 PenaltyBreakTemplateDeclaration, 1234u); 13013 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 13014 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 13015 PenaltyReturnTypeOnItsOwnLine, 1234u); 13016 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 13017 SpacesBeforeTrailingComments, 1234u); 13018 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 13019 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 13020 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 13021 13022 Style.PointerAlignment = FormatStyle::PAS_Middle; 13023 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 13024 FormatStyle::PAS_Left); 13025 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 13026 FormatStyle::PAS_Right); 13027 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 13028 FormatStyle::PAS_Middle); 13029 // For backward compatibility: 13030 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 13031 FormatStyle::PAS_Left); 13032 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 13033 FormatStyle::PAS_Right); 13034 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 13035 FormatStyle::PAS_Middle); 13036 13037 Style.Standard = FormatStyle::LS_Auto; 13038 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 13039 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 13040 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 13041 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 13042 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 13043 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 13044 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 13045 // Legacy aliases: 13046 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 13047 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 13048 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 13049 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 13050 13051 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 13052 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 13053 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 13054 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 13055 FormatStyle::BOS_None); 13056 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 13057 FormatStyle::BOS_All); 13058 // For backward compatibility: 13059 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 13060 FormatStyle::BOS_None); 13061 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 13062 FormatStyle::BOS_All); 13063 13064 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 13065 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 13066 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 13067 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 13068 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 13069 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 13070 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 13071 // For backward compatibility: 13072 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 13073 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 13074 13075 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 13076 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 13077 FormatStyle::BILS_BeforeComma); 13078 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 13079 FormatStyle::BILS_AfterColon); 13080 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 13081 FormatStyle::BILS_BeforeColon); 13082 // For backward compatibility: 13083 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 13084 FormatStyle::BILS_BeforeComma); 13085 13086 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13087 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 13088 FormatStyle::BAS_Align); 13089 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 13090 FormatStyle::BAS_DontAlign); 13091 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 13092 FormatStyle::BAS_AlwaysBreak); 13093 // For backward compatibility: 13094 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 13095 FormatStyle::BAS_DontAlign); 13096 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 13097 FormatStyle::BAS_Align); 13098 13099 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 13100 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 13101 FormatStyle::ENAS_DontAlign); 13102 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 13103 FormatStyle::ENAS_Left); 13104 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 13105 FormatStyle::ENAS_Right); 13106 // For backward compatibility: 13107 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 13108 FormatStyle::ENAS_Left); 13109 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 13110 FormatStyle::ENAS_Right); 13111 13112 Style.UseTab = FormatStyle::UT_ForIndentation; 13113 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 13114 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 13115 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 13116 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 13117 FormatStyle::UT_ForContinuationAndIndentation); 13118 CHECK_PARSE("UseTab: AlignWithSpaces", UseTab, 13119 FormatStyle::UT_AlignWithSpaces); 13120 // For backward compatibility: 13121 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 13122 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 13123 13124 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 13125 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 13126 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 13127 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 13128 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 13129 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 13130 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 13131 // For backward compatibility: 13132 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 13133 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 13134 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 13135 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 13136 13137 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 13138 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 13139 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 13140 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 13141 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 13142 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 13143 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 13144 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 13145 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 13146 // For backward compatibility: 13147 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 13148 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 13149 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 13150 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 13151 13152 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 13153 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 13154 FormatStyle::SBPO_Never); 13155 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 13156 FormatStyle::SBPO_Always); 13157 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 13158 FormatStyle::SBPO_ControlStatements); 13159 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 13160 FormatStyle::SBPO_NonEmptyParentheses); 13161 // For backward compatibility: 13162 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 13163 FormatStyle::SBPO_Never); 13164 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 13165 FormatStyle::SBPO_ControlStatements); 13166 13167 Style.ColumnLimit = 123; 13168 FormatStyle BaseStyle = getLLVMStyle(); 13169 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 13170 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 13171 13172 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 13173 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 13174 FormatStyle::BS_Attach); 13175 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 13176 FormatStyle::BS_Linux); 13177 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 13178 FormatStyle::BS_Mozilla); 13179 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 13180 FormatStyle::BS_Stroustrup); 13181 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 13182 FormatStyle::BS_Allman); 13183 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 13184 FormatStyle::BS_Whitesmiths); 13185 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 13186 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 13187 FormatStyle::BS_WebKit); 13188 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 13189 FormatStyle::BS_Custom); 13190 13191 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 13192 CHECK_PARSE("BraceWrapping:\n" 13193 " AfterControlStatement: MultiLine", 13194 BraceWrapping.AfterControlStatement, 13195 FormatStyle::BWACS_MultiLine); 13196 CHECK_PARSE("BraceWrapping:\n" 13197 " AfterControlStatement: Always", 13198 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 13199 CHECK_PARSE("BraceWrapping:\n" 13200 " AfterControlStatement: Never", 13201 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 13202 // For backward compatibility: 13203 CHECK_PARSE("BraceWrapping:\n" 13204 " AfterControlStatement: true", 13205 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 13206 CHECK_PARSE("BraceWrapping:\n" 13207 " AfterControlStatement: false", 13208 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 13209 13210 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 13211 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 13212 FormatStyle::RTBS_None); 13213 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 13214 FormatStyle::RTBS_All); 13215 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 13216 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 13217 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 13218 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 13219 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 13220 AlwaysBreakAfterReturnType, 13221 FormatStyle::RTBS_TopLevelDefinitions); 13222 13223 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 13224 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 13225 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 13226 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 13227 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 13228 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 13229 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 13230 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 13231 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 13232 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 13233 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 13234 13235 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 13236 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 13237 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 13238 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 13239 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 13240 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 13241 AlwaysBreakAfterDefinitionReturnType, 13242 FormatStyle::DRTBS_TopLevel); 13243 13244 Style.NamespaceIndentation = FormatStyle::NI_All; 13245 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 13246 FormatStyle::NI_None); 13247 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 13248 FormatStyle::NI_Inner); 13249 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 13250 FormatStyle::NI_All); 13251 13252 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 13253 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 13254 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 13255 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 13256 AllowShortIfStatementsOnASingleLine, 13257 FormatStyle::SIS_WithoutElse); 13258 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 13259 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 13260 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 13261 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 13262 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 13263 AllowShortIfStatementsOnASingleLine, 13264 FormatStyle::SIS_WithoutElse); 13265 13266 // FIXME: This is required because parsing a configuration simply overwrites 13267 // the first N elements of the list instead of resetting it. 13268 Style.ForEachMacros.clear(); 13269 std::vector<std::string> BoostForeach; 13270 BoostForeach.push_back("BOOST_FOREACH"); 13271 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 13272 std::vector<std::string> BoostAndQForeach; 13273 BoostAndQForeach.push_back("BOOST_FOREACH"); 13274 BoostAndQForeach.push_back("Q_FOREACH"); 13275 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 13276 BoostAndQForeach); 13277 13278 Style.StatementMacros.clear(); 13279 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 13280 std::vector<std::string>{"QUNUSED"}); 13281 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 13282 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 13283 13284 Style.NamespaceMacros.clear(); 13285 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 13286 std::vector<std::string>{"TESTSUITE"}); 13287 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 13288 std::vector<std::string>({"TESTSUITE", "SUITE"})); 13289 13290 Style.IncludeStyle.IncludeCategories.clear(); 13291 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 13292 {"abc/.*", 2, 0}, {".*", 1, 0}}; 13293 CHECK_PARSE("IncludeCategories:\n" 13294 " - Regex: abc/.*\n" 13295 " Priority: 2\n" 13296 " - Regex: .*\n" 13297 " Priority: 1", 13298 IncludeStyle.IncludeCategories, ExpectedCategories); 13299 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 13300 "abc$"); 13301 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 13302 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 13303 13304 Style.RawStringFormats.clear(); 13305 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 13306 { 13307 FormatStyle::LK_TextProto, 13308 {"pb", "proto"}, 13309 {"PARSE_TEXT_PROTO"}, 13310 /*CanonicalDelimiter=*/"", 13311 "llvm", 13312 }, 13313 { 13314 FormatStyle::LK_Cpp, 13315 {"cc", "cpp"}, 13316 {"C_CODEBLOCK", "CPPEVAL"}, 13317 /*CanonicalDelimiter=*/"cc", 13318 /*BasedOnStyle=*/"", 13319 }, 13320 }; 13321 13322 CHECK_PARSE("RawStringFormats:\n" 13323 " - Language: TextProto\n" 13324 " Delimiters:\n" 13325 " - 'pb'\n" 13326 " - 'proto'\n" 13327 " EnclosingFunctions:\n" 13328 " - 'PARSE_TEXT_PROTO'\n" 13329 " BasedOnStyle: llvm\n" 13330 " - Language: Cpp\n" 13331 " Delimiters:\n" 13332 " - 'cc'\n" 13333 " - 'cpp'\n" 13334 " EnclosingFunctions:\n" 13335 " - 'C_CODEBLOCK'\n" 13336 " - 'CPPEVAL'\n" 13337 " CanonicalDelimiter: 'cc'", 13338 RawStringFormats, ExpectedRawStringFormats); 13339 } 13340 13341 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 13342 FormatStyle Style = {}; 13343 Style.Language = FormatStyle::LK_Cpp; 13344 CHECK_PARSE("Language: Cpp\n" 13345 "IndentWidth: 12", 13346 IndentWidth, 12u); 13347 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 13348 "IndentWidth: 34", 13349 &Style), 13350 ParseError::Unsuitable); 13351 FormatStyle BinPackedTCS = {}; 13352 BinPackedTCS.Language = FormatStyle::LK_JavaScript; 13353 EXPECT_EQ(parseConfiguration("BinPackArguments: true\n" 13354 "InsertTrailingCommas: Wrapped", 13355 &BinPackedTCS), 13356 ParseError::BinPackTrailingCommaConflict); 13357 EXPECT_EQ(12u, Style.IndentWidth); 13358 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 13359 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 13360 13361 Style.Language = FormatStyle::LK_JavaScript; 13362 CHECK_PARSE("Language: JavaScript\n" 13363 "IndentWidth: 12", 13364 IndentWidth, 12u); 13365 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 13366 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 13367 "IndentWidth: 34", 13368 &Style), 13369 ParseError::Unsuitable); 13370 EXPECT_EQ(23u, Style.IndentWidth); 13371 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 13372 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 13373 13374 CHECK_PARSE("BasedOnStyle: LLVM\n" 13375 "IndentWidth: 67", 13376 IndentWidth, 67u); 13377 13378 CHECK_PARSE("---\n" 13379 "Language: JavaScript\n" 13380 "IndentWidth: 12\n" 13381 "---\n" 13382 "Language: Cpp\n" 13383 "IndentWidth: 34\n" 13384 "...\n", 13385 IndentWidth, 12u); 13386 13387 Style.Language = FormatStyle::LK_Cpp; 13388 CHECK_PARSE("---\n" 13389 "Language: JavaScript\n" 13390 "IndentWidth: 12\n" 13391 "---\n" 13392 "Language: Cpp\n" 13393 "IndentWidth: 34\n" 13394 "...\n", 13395 IndentWidth, 34u); 13396 CHECK_PARSE("---\n" 13397 "IndentWidth: 78\n" 13398 "---\n" 13399 "Language: JavaScript\n" 13400 "IndentWidth: 56\n" 13401 "...\n", 13402 IndentWidth, 78u); 13403 13404 Style.ColumnLimit = 123; 13405 Style.IndentWidth = 234; 13406 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 13407 Style.TabWidth = 345; 13408 EXPECT_FALSE(parseConfiguration("---\n" 13409 "IndentWidth: 456\n" 13410 "BreakBeforeBraces: Allman\n" 13411 "---\n" 13412 "Language: JavaScript\n" 13413 "IndentWidth: 111\n" 13414 "TabWidth: 111\n" 13415 "---\n" 13416 "Language: Cpp\n" 13417 "BreakBeforeBraces: Stroustrup\n" 13418 "TabWidth: 789\n" 13419 "...\n", 13420 &Style)); 13421 EXPECT_EQ(123u, Style.ColumnLimit); 13422 EXPECT_EQ(456u, Style.IndentWidth); 13423 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 13424 EXPECT_EQ(789u, Style.TabWidth); 13425 13426 EXPECT_EQ(parseConfiguration("---\n" 13427 "Language: JavaScript\n" 13428 "IndentWidth: 56\n" 13429 "---\n" 13430 "IndentWidth: 78\n" 13431 "...\n", 13432 &Style), 13433 ParseError::Error); 13434 EXPECT_EQ(parseConfiguration("---\n" 13435 "Language: JavaScript\n" 13436 "IndentWidth: 56\n" 13437 "---\n" 13438 "Language: JavaScript\n" 13439 "IndentWidth: 78\n" 13440 "...\n", 13441 &Style), 13442 ParseError::Error); 13443 13444 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 13445 } 13446 13447 #undef CHECK_PARSE 13448 13449 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 13450 FormatStyle Style = {}; 13451 Style.Language = FormatStyle::LK_JavaScript; 13452 Style.BreakBeforeTernaryOperators = true; 13453 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 13454 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 13455 13456 Style.BreakBeforeTernaryOperators = true; 13457 EXPECT_EQ(0, parseConfiguration("---\n" 13458 "BasedOnStyle: Google\n" 13459 "---\n" 13460 "Language: JavaScript\n" 13461 "IndentWidth: 76\n" 13462 "...\n", 13463 &Style) 13464 .value()); 13465 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 13466 EXPECT_EQ(76u, Style.IndentWidth); 13467 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 13468 } 13469 13470 TEST_F(FormatTest, ConfigurationRoundTripTest) { 13471 FormatStyle Style = getLLVMStyle(); 13472 std::string YAML = configurationAsText(Style); 13473 FormatStyle ParsedStyle = {}; 13474 ParsedStyle.Language = FormatStyle::LK_Cpp; 13475 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 13476 EXPECT_EQ(Style, ParsedStyle); 13477 } 13478 13479 TEST_F(FormatTest, WorksFor8bitEncodings) { 13480 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 13481 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 13482 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 13483 "\"\xef\xee\xf0\xf3...\"", 13484 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 13485 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 13486 "\xef\xee\xf0\xf3...\"", 13487 getLLVMStyleWithColumns(12))); 13488 } 13489 13490 TEST_F(FormatTest, HandlesUTF8BOM) { 13491 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 13492 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 13493 format("\xef\xbb\xbf#include <iostream>")); 13494 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 13495 format("\xef\xbb\xbf\n#include <iostream>")); 13496 } 13497 13498 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 13499 #if !defined(_MSC_VER) 13500 13501 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 13502 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 13503 getLLVMStyleWithColumns(35)); 13504 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 13505 getLLVMStyleWithColumns(31)); 13506 verifyFormat("// Однажды в студёную зимнюю пору...", 13507 getLLVMStyleWithColumns(36)); 13508 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 13509 verifyFormat("/* Однажды в студёную зимнюю пору... */", 13510 getLLVMStyleWithColumns(39)); 13511 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 13512 getLLVMStyleWithColumns(35)); 13513 } 13514 13515 TEST_F(FormatTest, SplitsUTF8Strings) { 13516 // Non-printable characters' width is currently considered to be the length in 13517 // bytes in UTF8. The characters can be displayed in very different manner 13518 // (zero-width, single width with a substitution glyph, expanded to their code 13519 // (e.g. "<8d>"), so there's no single correct way to handle them. 13520 EXPECT_EQ("\"aaaaÄ\"\n" 13521 "\"\xc2\x8d\";", 13522 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13523 EXPECT_EQ("\"aaaaaaaÄ\"\n" 13524 "\"\xc2\x8d\";", 13525 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 13526 EXPECT_EQ("\"Однажды, в \"\n" 13527 "\"студёную \"\n" 13528 "\"зимнюю \"\n" 13529 "\"пору,\"", 13530 format("\"Однажды, в студёную зимнюю пору,\"", 13531 getLLVMStyleWithColumns(13))); 13532 EXPECT_EQ( 13533 "\"一 二 三 \"\n" 13534 "\"四 五六 \"\n" 13535 "\"七 八 九 \"\n" 13536 "\"十\"", 13537 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 13538 EXPECT_EQ("\"一\t\"\n" 13539 "\"二 \t\"\n" 13540 "\"三 四 \"\n" 13541 "\"五\t\"\n" 13542 "\"六 \t\"\n" 13543 "\"七 \"\n" 13544 "\"八九十\tqq\"", 13545 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 13546 getLLVMStyleWithColumns(11))); 13547 13548 // UTF8 character in an escape sequence. 13549 EXPECT_EQ("\"aaaaaa\"\n" 13550 "\"\\\xC2\x8D\"", 13551 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 13552 } 13553 13554 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 13555 EXPECT_EQ("const char *sssss =\n" 13556 " \"一二三四五六七八\\\n" 13557 " 九 十\";", 13558 format("const char *sssss = \"一二三四五六七八\\\n" 13559 " 九 十\";", 13560 getLLVMStyleWithColumns(30))); 13561 } 13562 13563 TEST_F(FormatTest, SplitsUTF8LineComments) { 13564 EXPECT_EQ("// aaaaÄ\xc2\x8d", 13565 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 13566 EXPECT_EQ("// Я из лесу\n" 13567 "// вышел; был\n" 13568 "// сильный\n" 13569 "// мороз.", 13570 format("// Я из лесу вышел; был сильный мороз.", 13571 getLLVMStyleWithColumns(13))); 13572 EXPECT_EQ("// 一二三\n" 13573 "// 四五六七\n" 13574 "// 八 九\n" 13575 "// 十", 13576 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 13577 } 13578 13579 TEST_F(FormatTest, SplitsUTF8BlockComments) { 13580 EXPECT_EQ("/* Гляжу,\n" 13581 " * поднимается\n" 13582 " * медленно в\n" 13583 " * гору\n" 13584 " * Лошадка,\n" 13585 " * везущая\n" 13586 " * хворосту\n" 13587 " * воз. */", 13588 format("/* Гляжу, поднимается медленно в гору\n" 13589 " * Лошадка, везущая хворосту воз. */", 13590 getLLVMStyleWithColumns(13))); 13591 EXPECT_EQ( 13592 "/* 一二三\n" 13593 " * 四五六七\n" 13594 " * 八 九\n" 13595 " * 十 */", 13596 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 13597 EXPECT_EQ("/* \n" 13598 " * \n" 13599 " * - */", 13600 format("/* - */", getLLVMStyleWithColumns(12))); 13601 } 13602 13603 #endif // _MSC_VER 13604 13605 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 13606 FormatStyle Style = getLLVMStyle(); 13607 13608 Style.ConstructorInitializerIndentWidth = 4; 13609 verifyFormat( 13610 "SomeClass::Constructor()\n" 13611 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13612 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13613 Style); 13614 13615 Style.ConstructorInitializerIndentWidth = 2; 13616 verifyFormat( 13617 "SomeClass::Constructor()\n" 13618 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13619 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13620 Style); 13621 13622 Style.ConstructorInitializerIndentWidth = 0; 13623 verifyFormat( 13624 "SomeClass::Constructor()\n" 13625 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 13626 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 13627 Style); 13628 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13629 verifyFormat( 13630 "SomeLongTemplateVariableName<\n" 13631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 13632 Style); 13633 verifyFormat("bool smaller = 1 < " 13634 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 13635 " " 13636 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 13637 Style); 13638 13639 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 13640 verifyFormat("SomeClass::Constructor() :\n" 13641 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 13642 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 13643 Style); 13644 } 13645 13646 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 13647 FormatStyle Style = getLLVMStyle(); 13648 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 13649 Style.ConstructorInitializerIndentWidth = 4; 13650 verifyFormat("SomeClass::Constructor()\n" 13651 " : a(a)\n" 13652 " , b(b)\n" 13653 " , c(c) {}", 13654 Style); 13655 verifyFormat("SomeClass::Constructor()\n" 13656 " : a(a) {}", 13657 Style); 13658 13659 Style.ColumnLimit = 0; 13660 verifyFormat("SomeClass::Constructor()\n" 13661 " : a(a) {}", 13662 Style); 13663 verifyFormat("SomeClass::Constructor() noexcept\n" 13664 " : a(a) {}", 13665 Style); 13666 verifyFormat("SomeClass::Constructor()\n" 13667 " : a(a)\n" 13668 " , b(b)\n" 13669 " , c(c) {}", 13670 Style); 13671 verifyFormat("SomeClass::Constructor()\n" 13672 " : a(a) {\n" 13673 " foo();\n" 13674 " bar();\n" 13675 "}", 13676 Style); 13677 13678 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 13679 verifyFormat("SomeClass::Constructor()\n" 13680 " : a(a)\n" 13681 " , b(b)\n" 13682 " , c(c) {\n}", 13683 Style); 13684 verifyFormat("SomeClass::Constructor()\n" 13685 " : a(a) {\n}", 13686 Style); 13687 13688 Style.ColumnLimit = 80; 13689 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 13690 Style.ConstructorInitializerIndentWidth = 2; 13691 verifyFormat("SomeClass::Constructor()\n" 13692 " : a(a)\n" 13693 " , b(b)\n" 13694 " , c(c) {}", 13695 Style); 13696 13697 Style.ConstructorInitializerIndentWidth = 0; 13698 verifyFormat("SomeClass::Constructor()\n" 13699 ": a(a)\n" 13700 ", b(b)\n" 13701 ", c(c) {}", 13702 Style); 13703 13704 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 13705 Style.ConstructorInitializerIndentWidth = 4; 13706 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 13707 verifyFormat( 13708 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 13709 Style); 13710 verifyFormat( 13711 "SomeClass::Constructor()\n" 13712 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 13713 Style); 13714 Style.ConstructorInitializerIndentWidth = 4; 13715 Style.ColumnLimit = 60; 13716 verifyFormat("SomeClass::Constructor()\n" 13717 " : aaaaaaaa(aaaaaaaa)\n" 13718 " , aaaaaaaa(aaaaaaaa)\n" 13719 " , aaaaaaaa(aaaaaaaa) {}", 13720 Style); 13721 } 13722 13723 TEST_F(FormatTest, Destructors) { 13724 verifyFormat("void F(int &i) { i.~int(); }"); 13725 verifyFormat("void F(int &i) { i->~int(); }"); 13726 } 13727 13728 TEST_F(FormatTest, FormatsWithWebKitStyle) { 13729 FormatStyle Style = getWebKitStyle(); 13730 13731 // Don't indent in outer namespaces. 13732 verifyFormat("namespace outer {\n" 13733 "int i;\n" 13734 "namespace inner {\n" 13735 " int i;\n" 13736 "} // namespace inner\n" 13737 "} // namespace outer\n" 13738 "namespace other_outer {\n" 13739 "int i;\n" 13740 "}", 13741 Style); 13742 13743 // Don't indent case labels. 13744 verifyFormat("switch (variable) {\n" 13745 "case 1:\n" 13746 "case 2:\n" 13747 " doSomething();\n" 13748 " break;\n" 13749 "default:\n" 13750 " ++variable;\n" 13751 "}", 13752 Style); 13753 13754 // Wrap before binary operators. 13755 EXPECT_EQ("void f()\n" 13756 "{\n" 13757 " if (aaaaaaaaaaaaaaaa\n" 13758 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 13759 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13760 " return;\n" 13761 "}", 13762 format("void f() {\n" 13763 "if (aaaaaaaaaaaaaaaa\n" 13764 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 13765 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13766 "return;\n" 13767 "}", 13768 Style)); 13769 13770 // Allow functions on a single line. 13771 verifyFormat("void f() { return; }", Style); 13772 13773 // Allow empty blocks on a single line and insert a space in empty blocks. 13774 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 13775 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 13776 // However, don't merge non-empty short loops. 13777 EXPECT_EQ("while (true) {\n" 13778 " continue;\n" 13779 "}", 13780 format("while (true) { continue; }", Style)); 13781 13782 // Constructor initializers are formatted one per line with the "," on the 13783 // new line. 13784 verifyFormat("Constructor()\n" 13785 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 13786 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 13787 " aaaaaaaaaaaaaa)\n" 13788 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 13789 "{\n" 13790 "}", 13791 Style); 13792 verifyFormat("SomeClass::Constructor()\n" 13793 " : a(a)\n" 13794 "{\n" 13795 "}", 13796 Style); 13797 EXPECT_EQ("SomeClass::Constructor()\n" 13798 " : a(a)\n" 13799 "{\n" 13800 "}", 13801 format("SomeClass::Constructor():a(a){}", Style)); 13802 verifyFormat("SomeClass::Constructor()\n" 13803 " : a(a)\n" 13804 " , b(b)\n" 13805 " , c(c)\n" 13806 "{\n" 13807 "}", 13808 Style); 13809 verifyFormat("SomeClass::Constructor()\n" 13810 " : a(a)\n" 13811 "{\n" 13812 " foo();\n" 13813 " bar();\n" 13814 "}", 13815 Style); 13816 13817 // Access specifiers should be aligned left. 13818 verifyFormat("class C {\n" 13819 "public:\n" 13820 " int i;\n" 13821 "};", 13822 Style); 13823 13824 // Do not align comments. 13825 verifyFormat("int a; // Do not\n" 13826 "double b; // align comments.", 13827 Style); 13828 13829 // Do not align operands. 13830 EXPECT_EQ("ASSERT(aaaa\n" 13831 " || bbbb);", 13832 format("ASSERT ( aaaa\n||bbbb);", Style)); 13833 13834 // Accept input's line breaks. 13835 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 13836 " || bbbbbbbbbbbbbbb) {\n" 13837 " i++;\n" 13838 "}", 13839 format("if (aaaaaaaaaaaaaaa\n" 13840 "|| bbbbbbbbbbbbbbb) { i++; }", 13841 Style)); 13842 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 13843 " i++;\n" 13844 "}", 13845 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 13846 13847 // Don't automatically break all macro definitions (llvm.org/PR17842). 13848 verifyFormat("#define aNumber 10", Style); 13849 // However, generally keep the line breaks that the user authored. 13850 EXPECT_EQ("#define aNumber \\\n" 13851 " 10", 13852 format("#define aNumber \\\n" 13853 " 10", 13854 Style)); 13855 13856 // Keep empty and one-element array literals on a single line. 13857 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 13858 " copyItems:YES];", 13859 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 13860 "copyItems:YES];", 13861 Style)); 13862 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 13863 " copyItems:YES];", 13864 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 13865 " copyItems:YES];", 13866 Style)); 13867 // FIXME: This does not seem right, there should be more indentation before 13868 // the array literal's entries. Nested blocks have the same problem. 13869 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13870 " @\"a\",\n" 13871 " @\"a\"\n" 13872 "]\n" 13873 " copyItems:YES];", 13874 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13875 " @\"a\",\n" 13876 " @\"a\"\n" 13877 " ]\n" 13878 " copyItems:YES];", 13879 Style)); 13880 EXPECT_EQ( 13881 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13882 " copyItems:YES];", 13883 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13884 " copyItems:YES];", 13885 Style)); 13886 13887 verifyFormat("[self.a b:c c:d];", Style); 13888 EXPECT_EQ("[self.a b:c\n" 13889 " c:d];", 13890 format("[self.a b:c\n" 13891 "c:d];", 13892 Style)); 13893 } 13894 13895 TEST_F(FormatTest, FormatsLambdas) { 13896 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 13897 verifyFormat( 13898 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 13899 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 13900 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 13901 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 13902 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 13903 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 13904 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 13905 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 13906 verifyFormat("int x = f(*+[] {});"); 13907 verifyFormat("void f() {\n" 13908 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 13909 "}\n"); 13910 verifyFormat("void f() {\n" 13911 " other(x.begin(), //\n" 13912 " x.end(), //\n" 13913 " [&](int, int) { return 1; });\n" 13914 "}\n"); 13915 verifyFormat("void f() {\n" 13916 " other.other.other.other.other(\n" 13917 " x.begin(), x.end(),\n" 13918 " [something, rather](int, int, int, int, int, int, int) { " 13919 "return 1; });\n" 13920 "}\n"); 13921 verifyFormat( 13922 "void f() {\n" 13923 " other.other.other.other.other(\n" 13924 " x.begin(), x.end(),\n" 13925 " [something, rather](int, int, int, int, int, int, int) {\n" 13926 " //\n" 13927 " });\n" 13928 "}\n"); 13929 verifyFormat("SomeFunction([]() { // A cool function...\n" 13930 " return 43;\n" 13931 "});"); 13932 EXPECT_EQ("SomeFunction([]() {\n" 13933 "#define A a\n" 13934 " return 43;\n" 13935 "});", 13936 format("SomeFunction([](){\n" 13937 "#define A a\n" 13938 "return 43;\n" 13939 "});")); 13940 verifyFormat("void f() {\n" 13941 " SomeFunction([](decltype(x), A *a) {});\n" 13942 "}"); 13943 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13944 " [](const aaaaaaaaaa &a) { return a; });"); 13945 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 13946 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 13947 "});"); 13948 verifyFormat("Constructor()\n" 13949 " : Field([] { // comment\n" 13950 " int i;\n" 13951 " }) {}"); 13952 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 13953 " return some_parameter.size();\n" 13954 "};"); 13955 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 13956 " [](const string &s) { return s; };"); 13957 verifyFormat("int i = aaaaaa ? 1 //\n" 13958 " : [] {\n" 13959 " return 2; //\n" 13960 " }();"); 13961 verifyFormat("llvm::errs() << \"number of twos is \"\n" 13962 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 13963 " return x == 2; // force break\n" 13964 " });"); 13965 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13966 " [=](int iiiiiiiiiiii) {\n" 13967 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 13968 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 13969 " });", 13970 getLLVMStyleWithColumns(60)); 13971 verifyFormat("SomeFunction({[&] {\n" 13972 " // comment\n" 13973 " },\n" 13974 " [&] {\n" 13975 " // comment\n" 13976 " }});"); 13977 verifyFormat("SomeFunction({[&] {\n" 13978 " // comment\n" 13979 "}});"); 13980 verifyFormat( 13981 "virtual aaaaaaaaaaaaaaaa(\n" 13982 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 13983 " aaaaa aaaaaaaaa);"); 13984 13985 // Lambdas with return types. 13986 verifyFormat("int c = []() -> int { return 2; }();\n"); 13987 verifyFormat("int c = []() -> int * { return 2; }();\n"); 13988 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 13989 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 13990 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 13991 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 13992 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 13993 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 13994 verifyFormat("[a, a]() -> a<1> {};"); 13995 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 13996 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 13997 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 13998 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 13999 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 14000 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 14001 verifyFormat("[]() -> foo<!5> { return {}; };"); 14002 verifyFormat("[]() -> foo<~5> { return {}; };"); 14003 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 14004 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 14005 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 14006 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 14007 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 14008 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 14009 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 14010 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 14011 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 14012 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 14013 verifyFormat("namespace bar {\n" 14014 "// broken:\n" 14015 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 14016 "} // namespace bar"); 14017 verifyFormat("namespace bar {\n" 14018 "// broken:\n" 14019 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 14020 "} // namespace bar"); 14021 verifyFormat("namespace bar {\n" 14022 "// broken:\n" 14023 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 14024 "} // namespace bar"); 14025 verifyFormat("namespace bar {\n" 14026 "// broken:\n" 14027 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 14028 "} // namespace bar"); 14029 verifyFormat("namespace bar {\n" 14030 "// broken:\n" 14031 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 14032 "} // namespace bar"); 14033 verifyFormat("namespace bar {\n" 14034 "// broken:\n" 14035 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 14036 "} // namespace bar"); 14037 verifyFormat("namespace bar {\n" 14038 "// broken:\n" 14039 "auto foo{[]() -> foo<!5> { return {}; }};\n" 14040 "} // namespace bar"); 14041 verifyFormat("namespace bar {\n" 14042 "// broken:\n" 14043 "auto foo{[]() -> foo<~5> { return {}; }};\n" 14044 "} // namespace bar"); 14045 verifyFormat("namespace bar {\n" 14046 "// broken:\n" 14047 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 14048 "} // namespace bar"); 14049 verifyFormat("namespace bar {\n" 14050 "// broken:\n" 14051 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 14052 "} // namespace bar"); 14053 verifyFormat("namespace bar {\n" 14054 "// broken:\n" 14055 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 14056 "} // namespace bar"); 14057 verifyFormat("namespace bar {\n" 14058 "// broken:\n" 14059 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 14060 "} // namespace bar"); 14061 verifyFormat("namespace bar {\n" 14062 "// broken:\n" 14063 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 14064 "} // namespace bar"); 14065 verifyFormat("namespace bar {\n" 14066 "// broken:\n" 14067 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 14068 "} // namespace bar"); 14069 verifyFormat("namespace bar {\n" 14070 "// broken:\n" 14071 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 14072 "} // namespace bar"); 14073 verifyFormat("namespace bar {\n" 14074 "// broken:\n" 14075 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 14076 "} // namespace bar"); 14077 verifyFormat("namespace bar {\n" 14078 "// broken:\n" 14079 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 14080 "} // namespace bar"); 14081 verifyFormat("namespace bar {\n" 14082 "// broken:\n" 14083 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 14084 "} // namespace bar"); 14085 verifyFormat("[]() -> a<1> {};"); 14086 verifyFormat("[]() -> a<1> { ; };"); 14087 verifyFormat("[]() -> a<1> { ; }();"); 14088 verifyFormat("[a, a]() -> a<true> {};"); 14089 verifyFormat("[]() -> a<true> {};"); 14090 verifyFormat("[]() -> a<true> { ; };"); 14091 verifyFormat("[]() -> a<true> { ; }();"); 14092 verifyFormat("[a, a]() -> a<false> {};"); 14093 verifyFormat("[]() -> a<false> {};"); 14094 verifyFormat("[]() -> a<false> { ; };"); 14095 verifyFormat("[]() -> a<false> { ; }();"); 14096 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 14097 verifyFormat("namespace bar {\n" 14098 "auto foo{[]() -> foo<false> { ; }};\n" 14099 "} // namespace bar"); 14100 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 14101 " int j) -> int {\n" 14102 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 14103 "};"); 14104 verifyFormat( 14105 "aaaaaaaaaaaaaaaaaaaaaa(\n" 14106 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 14107 " return aaaaaaaaaaaaaaaaa;\n" 14108 " });", 14109 getLLVMStyleWithColumns(70)); 14110 verifyFormat("[]() //\n" 14111 " -> int {\n" 14112 " return 1; //\n" 14113 "};"); 14114 14115 // Lambdas with explicit template argument lists. 14116 verifyFormat( 14117 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 14118 14119 // Multiple lambdas in the same parentheses change indentation rules. These 14120 // lambdas are forced to start on new lines. 14121 verifyFormat("SomeFunction(\n" 14122 " []() {\n" 14123 " //\n" 14124 " },\n" 14125 " []() {\n" 14126 " //\n" 14127 " });"); 14128 14129 // A lambda passed as arg0 is always pushed to the next line. 14130 verifyFormat("SomeFunction(\n" 14131 " [this] {\n" 14132 " //\n" 14133 " },\n" 14134 " 1);\n"); 14135 14136 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 14137 // the arg0 case above. 14138 auto Style = getGoogleStyle(); 14139 Style.BinPackArguments = false; 14140 verifyFormat("SomeFunction(\n" 14141 " a,\n" 14142 " [this] {\n" 14143 " //\n" 14144 " },\n" 14145 " b);\n", 14146 Style); 14147 verifyFormat("SomeFunction(\n" 14148 " a,\n" 14149 " [this] {\n" 14150 " //\n" 14151 " },\n" 14152 " b);\n"); 14153 14154 // A lambda with a very long line forces arg0 to be pushed out irrespective of 14155 // the BinPackArguments value (as long as the code is wide enough). 14156 verifyFormat( 14157 "something->SomeFunction(\n" 14158 " a,\n" 14159 " [this] {\n" 14160 " " 14161 "D0000000000000000000000000000000000000000000000000000000000001();\n" 14162 " },\n" 14163 " b);\n"); 14164 14165 // A multi-line lambda is pulled up as long as the introducer fits on the 14166 // previous line and there are no further args. 14167 verifyFormat("function(1, [this, that] {\n" 14168 " //\n" 14169 "});\n"); 14170 verifyFormat("function([this, that] {\n" 14171 " //\n" 14172 "});\n"); 14173 // FIXME: this format is not ideal and we should consider forcing the first 14174 // arg onto its own line. 14175 verifyFormat("function(a, b, c, //\n" 14176 " d, [this, that] {\n" 14177 " //\n" 14178 " });\n"); 14179 14180 // Multiple lambdas are treated correctly even when there is a short arg0. 14181 verifyFormat("SomeFunction(\n" 14182 " 1,\n" 14183 " [this] {\n" 14184 " //\n" 14185 " },\n" 14186 " [this] {\n" 14187 " //\n" 14188 " },\n" 14189 " 1);\n"); 14190 14191 // More complex introducers. 14192 verifyFormat("return [i, args...] {};"); 14193 14194 // Not lambdas. 14195 verifyFormat("constexpr char hello[]{\"hello\"};"); 14196 verifyFormat("double &operator[](int i) { return 0; }\n" 14197 "int i;"); 14198 verifyFormat("std::unique_ptr<int[]> foo() {}"); 14199 verifyFormat("int i = a[a][a]->f();"); 14200 verifyFormat("int i = (*b)[a]->f();"); 14201 14202 // Other corner cases. 14203 verifyFormat("void f() {\n" 14204 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 14205 " );\n" 14206 "}"); 14207 14208 // Lambdas created through weird macros. 14209 verifyFormat("void f() {\n" 14210 " MACRO((const AA &a) { return 1; });\n" 14211 " MACRO((AA &a) { return 1; });\n" 14212 "}"); 14213 14214 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 14215 " doo_dah();\n" 14216 " doo_dah();\n" 14217 " })) {\n" 14218 "}"); 14219 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 14220 " doo_dah();\n" 14221 " doo_dah();\n" 14222 " })) {\n" 14223 "}"); 14224 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 14225 " doo_dah();\n" 14226 " doo_dah();\n" 14227 " })) {\n" 14228 "}"); 14229 verifyFormat("auto lambda = []() {\n" 14230 " int a = 2\n" 14231 "#if A\n" 14232 " + 2\n" 14233 "#endif\n" 14234 " ;\n" 14235 "};"); 14236 14237 // Lambdas with complex multiline introducers. 14238 verifyFormat( 14239 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14240 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 14241 " -> ::std::unordered_set<\n" 14242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 14243 " //\n" 14244 " });"); 14245 14246 FormatStyle DoNotMerge = getLLVMStyle(); 14247 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 14248 verifyFormat("auto c = []() {\n" 14249 " return b;\n" 14250 "};", 14251 "auto c = []() { return b; };", DoNotMerge); 14252 verifyFormat("auto c = []() {\n" 14253 "};", 14254 " auto c = []() {};", DoNotMerge); 14255 14256 FormatStyle MergeEmptyOnly = getLLVMStyle(); 14257 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 14258 verifyFormat("auto c = []() {\n" 14259 " return b;\n" 14260 "};", 14261 "auto c = []() {\n" 14262 " return b;\n" 14263 " };", 14264 MergeEmptyOnly); 14265 verifyFormat("auto c = []() {};", 14266 "auto c = []() {\n" 14267 "};", 14268 MergeEmptyOnly); 14269 14270 FormatStyle MergeInline = getLLVMStyle(); 14271 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 14272 verifyFormat("auto c = []() {\n" 14273 " return b;\n" 14274 "};", 14275 "auto c = []() { return b; };", MergeInline); 14276 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 14277 MergeInline); 14278 verifyFormat("function([]() { return b; }, a)", 14279 "function([]() { return b; }, a)", MergeInline); 14280 verifyFormat("function(a, []() { return b; })", 14281 "function(a, []() { return b; })", MergeInline); 14282 14283 // Check option "BraceWrapping.BeforeLambdaBody" and different state of 14284 // AllowShortLambdasOnASingleLine 14285 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 14286 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 14287 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 14288 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14289 FormatStyle::ShortLambdaStyle::SLS_None; 14290 verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n" 14291 " []()\n" 14292 " {\n" 14293 " return 17;\n" 14294 " });", 14295 LLVMWithBeforeLambdaBody); 14296 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n" 14297 " []()\n" 14298 " {\n" 14299 " });", 14300 LLVMWithBeforeLambdaBody); 14301 verifyFormat("auto fct_SLS_None = []()\n" 14302 "{\n" 14303 " return 17;\n" 14304 "};", 14305 LLVMWithBeforeLambdaBody); 14306 verifyFormat("TwoNestedLambdas_SLS_None(\n" 14307 " []()\n" 14308 " {\n" 14309 " return Call(\n" 14310 " []()\n" 14311 " {\n" 14312 " return 17;\n" 14313 " });\n" 14314 " });", 14315 LLVMWithBeforeLambdaBody); 14316 verifyFormat("void Fct()\n" 14317 "{\n" 14318 " return {[]()\n" 14319 " {\n" 14320 " return 17;\n" 14321 " }};\n" 14322 "}", 14323 LLVMWithBeforeLambdaBody); 14324 14325 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14326 FormatStyle::ShortLambdaStyle::SLS_Empty; 14327 verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" 14328 " []()\n" 14329 " {\n" 14330 " return 17;\n" 14331 " });", 14332 LLVMWithBeforeLambdaBody); 14333 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});", 14334 LLVMWithBeforeLambdaBody); 14335 verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL" 14336 "ongFunctionName_SLS_Empty(\n" 14337 " []() {});", 14338 LLVMWithBeforeLambdaBody); 14339 verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n" 14340 " []()\n" 14341 " {\n" 14342 " return 17;\n" 14343 " });", 14344 LLVMWithBeforeLambdaBody); 14345 verifyFormat("auto fct_SLS_Empty = []()\n" 14346 "{\n" 14347 " return 17;\n" 14348 "};", 14349 LLVMWithBeforeLambdaBody); 14350 verifyFormat("TwoNestedLambdas_SLS_Empty(\n" 14351 " []()\n" 14352 " {\n" 14353 " return Call([]() {});\n" 14354 " });", 14355 LLVMWithBeforeLambdaBody); 14356 verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n" 14357 " []()\n" 14358 " {\n" 14359 " return Call([]() {});\n" 14360 " });", 14361 LLVMWithBeforeLambdaBody); 14362 verifyFormat( 14363 "FctWithLongLineInLambda_SLS_Empty(\n" 14364 " []()\n" 14365 " {\n" 14366 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14367 " AndShouldNotBeConsiderAsInline,\n" 14368 " LambdaBodyMustBeBreak);\n" 14369 " });", 14370 LLVMWithBeforeLambdaBody); 14371 14372 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14373 FormatStyle::ShortLambdaStyle::SLS_Inline; 14374 verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });", 14375 LLVMWithBeforeLambdaBody); 14376 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});", 14377 LLVMWithBeforeLambdaBody); 14378 verifyFormat("auto fct_SLS_Inline = []()\n" 14379 "{\n" 14380 " return 17;\n" 14381 "};", 14382 LLVMWithBeforeLambdaBody); 14383 verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return " 14384 "17; }); });", 14385 LLVMWithBeforeLambdaBody); 14386 verifyFormat( 14387 "FctWithLongLineInLambda_SLS_Inline(\n" 14388 " []()\n" 14389 " {\n" 14390 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14391 " AndShouldNotBeConsiderAsInline,\n" 14392 " LambdaBodyMustBeBreak);\n" 14393 " });", 14394 LLVMWithBeforeLambdaBody); 14395 verifyFormat("FctWithMultipleParams_SLS_Inline(" 14396 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 14397 " []() { return 17; });", 14398 LLVMWithBeforeLambdaBody); 14399 verifyFormat( 14400 "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });", 14401 LLVMWithBeforeLambdaBody); 14402 14403 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 14404 FormatStyle::ShortLambdaStyle::SLS_All; 14405 verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });", 14406 LLVMWithBeforeLambdaBody); 14407 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});", 14408 LLVMWithBeforeLambdaBody); 14409 verifyFormat("auto fct_SLS_All = []() { return 17; };", 14410 LLVMWithBeforeLambdaBody); 14411 verifyFormat("FctWithOneParam_SLS_All(\n" 14412 " []()\n" 14413 " {\n" 14414 " // A cool function...\n" 14415 " return 43;\n" 14416 " });", 14417 LLVMWithBeforeLambdaBody); 14418 verifyFormat("FctWithMultipleParams_SLS_All(" 14419 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 14420 " []() { return 17; });", 14421 LLVMWithBeforeLambdaBody); 14422 verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });", 14423 LLVMWithBeforeLambdaBody); 14424 verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });", 14425 LLVMWithBeforeLambdaBody); 14426 verifyFormat( 14427 "FctWithLongLineInLambda_SLS_All(\n" 14428 " []()\n" 14429 " {\n" 14430 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14431 " AndShouldNotBeConsiderAsInline,\n" 14432 " LambdaBodyMustBeBreak);\n" 14433 " });", 14434 LLVMWithBeforeLambdaBody); 14435 verifyFormat( 14436 "auto fct_SLS_All = []()\n" 14437 "{\n" 14438 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14439 " AndShouldNotBeConsiderAsInline,\n" 14440 " LambdaBodyMustBeBreak);\n" 14441 "};", 14442 LLVMWithBeforeLambdaBody); 14443 LLVMWithBeforeLambdaBody.BinPackParameters = false; 14444 verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);", 14445 LLVMWithBeforeLambdaBody); 14446 verifyFormat( 14447 "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n" 14448 " FirstParam,\n" 14449 " SecondParam,\n" 14450 " ThirdParam,\n" 14451 " FourthParam);", 14452 LLVMWithBeforeLambdaBody); 14453 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 14454 " []() { return " 14455 "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n" 14456 " FirstParam,\n" 14457 " SecondParam,\n" 14458 " ThirdParam,\n" 14459 " FourthParam);", 14460 LLVMWithBeforeLambdaBody); 14461 verifyFormat( 14462 "FctWithLongLineInLambda_SLS_All(FirstParam,\n" 14463 " SecondParam,\n" 14464 " ThirdParam,\n" 14465 " FourthParam,\n" 14466 " []() { return SomeValueNotSoLong; });", 14467 LLVMWithBeforeLambdaBody); 14468 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 14469 " []()\n" 14470 " {\n" 14471 " return " 14472 "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB" 14473 "eConsiderAsInline;\n" 14474 " });", 14475 LLVMWithBeforeLambdaBody); 14476 verifyFormat( 14477 "FctWithLongLineInLambda_SLS_All(\n" 14478 " []()\n" 14479 " {\n" 14480 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 14481 " AndShouldNotBeConsiderAsInline,\n" 14482 " LambdaBodyMustBeBreak);\n" 14483 " });", 14484 LLVMWithBeforeLambdaBody); 14485 verifyFormat("FctWithTwoParams_SLS_All(\n" 14486 " []()\n" 14487 " {\n" 14488 " // A cool function...\n" 14489 " return 43;\n" 14490 " },\n" 14491 " 87);", 14492 LLVMWithBeforeLambdaBody); 14493 verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);", 14494 LLVMWithBeforeLambdaBody); 14495 verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });", 14496 LLVMWithBeforeLambdaBody); 14497 verifyFormat( 14498 "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });", 14499 LLVMWithBeforeLambdaBody); 14500 verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; " 14501 "}); }, x);", 14502 LLVMWithBeforeLambdaBody); 14503 verifyFormat("TwoNestedLambdas_SLS_All(\n" 14504 " []()\n" 14505 " {\n" 14506 " // A cool function...\n" 14507 " return Call([]() { return 17; });\n" 14508 " });", 14509 LLVMWithBeforeLambdaBody); 14510 verifyFormat("TwoNestedLambdas_SLS_All(\n" 14511 " []()\n" 14512 " {\n" 14513 " return Call(\n" 14514 " []()\n" 14515 " {\n" 14516 " // A cool function...\n" 14517 " return 17;\n" 14518 " });\n" 14519 " });", 14520 LLVMWithBeforeLambdaBody); 14521 } 14522 14523 TEST_F(FormatTest, EmptyLinesInLambdas) { 14524 verifyFormat("auto lambda = []() {\n" 14525 " x(); //\n" 14526 "};", 14527 "auto lambda = []() {\n" 14528 "\n" 14529 " x(); //\n" 14530 "\n" 14531 "};"); 14532 } 14533 14534 TEST_F(FormatTest, FormatsBlocks) { 14535 FormatStyle ShortBlocks = getLLVMStyle(); 14536 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 14537 verifyFormat("int (^Block)(int, int);", ShortBlocks); 14538 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 14539 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 14540 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 14541 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 14542 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 14543 14544 verifyFormat("foo(^{ bar(); });", ShortBlocks); 14545 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 14546 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 14547 14548 verifyFormat("[operation setCompletionBlock:^{\n" 14549 " [self onOperationDone];\n" 14550 "}];"); 14551 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 14552 " [self onOperationDone];\n" 14553 "}]};"); 14554 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 14555 " f();\n" 14556 "}];"); 14557 verifyFormat("int a = [operation block:^int(int *i) {\n" 14558 " return 1;\n" 14559 "}];"); 14560 verifyFormat("[myObject doSomethingWith:arg1\n" 14561 " aaa:^int(int *a) {\n" 14562 " return 1;\n" 14563 " }\n" 14564 " bbb:f(a * bbbbbbbb)];"); 14565 14566 verifyFormat("[operation setCompletionBlock:^{\n" 14567 " [self.delegate newDataAvailable];\n" 14568 "}];", 14569 getLLVMStyleWithColumns(60)); 14570 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 14571 " NSString *path = [self sessionFilePath];\n" 14572 " if (path) {\n" 14573 " // ...\n" 14574 " }\n" 14575 "});"); 14576 verifyFormat("[[SessionService sharedService]\n" 14577 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14578 " if (window) {\n" 14579 " [self windowDidLoad:window];\n" 14580 " } else {\n" 14581 " [self errorLoadingWindow];\n" 14582 " }\n" 14583 " }];"); 14584 verifyFormat("void (^largeBlock)(void) = ^{\n" 14585 " // ...\n" 14586 "};\n", 14587 getLLVMStyleWithColumns(40)); 14588 verifyFormat("[[SessionService sharedService]\n" 14589 " loadWindowWithCompletionBlock: //\n" 14590 " ^(SessionWindow *window) {\n" 14591 " if (window) {\n" 14592 " [self windowDidLoad:window];\n" 14593 " } else {\n" 14594 " [self errorLoadingWindow];\n" 14595 " }\n" 14596 " }];", 14597 getLLVMStyleWithColumns(60)); 14598 verifyFormat("[myObject doSomethingWith:arg1\n" 14599 " firstBlock:^(Foo *a) {\n" 14600 " // ...\n" 14601 " int i;\n" 14602 " }\n" 14603 " secondBlock:^(Bar *b) {\n" 14604 " // ...\n" 14605 " int i;\n" 14606 " }\n" 14607 " thirdBlock:^Foo(Bar *b) {\n" 14608 " // ...\n" 14609 " int i;\n" 14610 " }];"); 14611 verifyFormat("[myObject doSomethingWith:arg1\n" 14612 " firstBlock:-1\n" 14613 " secondBlock:^(Bar *b) {\n" 14614 " // ...\n" 14615 " int i;\n" 14616 " }];"); 14617 14618 verifyFormat("f(^{\n" 14619 " @autoreleasepool {\n" 14620 " if (a) {\n" 14621 " g();\n" 14622 " }\n" 14623 " }\n" 14624 "});"); 14625 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 14626 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 14627 "};"); 14628 14629 FormatStyle FourIndent = getLLVMStyle(); 14630 FourIndent.ObjCBlockIndentWidth = 4; 14631 verifyFormat("[operation setCompletionBlock:^{\n" 14632 " [self onOperationDone];\n" 14633 "}];", 14634 FourIndent); 14635 } 14636 14637 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 14638 FormatStyle ZeroColumn = getLLVMStyle(); 14639 ZeroColumn.ColumnLimit = 0; 14640 14641 verifyFormat("[[SessionService sharedService] " 14642 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14643 " if (window) {\n" 14644 " [self windowDidLoad:window];\n" 14645 " } else {\n" 14646 " [self errorLoadingWindow];\n" 14647 " }\n" 14648 "}];", 14649 ZeroColumn); 14650 EXPECT_EQ("[[SessionService sharedService]\n" 14651 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14652 " if (window) {\n" 14653 " [self windowDidLoad:window];\n" 14654 " } else {\n" 14655 " [self errorLoadingWindow];\n" 14656 " }\n" 14657 " }];", 14658 format("[[SessionService sharedService]\n" 14659 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 14660 " if (window) {\n" 14661 " [self windowDidLoad:window];\n" 14662 " } else {\n" 14663 " [self errorLoadingWindow];\n" 14664 " }\n" 14665 "}];", 14666 ZeroColumn)); 14667 verifyFormat("[myObject doSomethingWith:arg1\n" 14668 " firstBlock:^(Foo *a) {\n" 14669 " // ...\n" 14670 " int i;\n" 14671 " }\n" 14672 " secondBlock:^(Bar *b) {\n" 14673 " // ...\n" 14674 " int i;\n" 14675 " }\n" 14676 " thirdBlock:^Foo(Bar *b) {\n" 14677 " // ...\n" 14678 " int i;\n" 14679 " }];", 14680 ZeroColumn); 14681 verifyFormat("f(^{\n" 14682 " @autoreleasepool {\n" 14683 " if (a) {\n" 14684 " g();\n" 14685 " }\n" 14686 " }\n" 14687 "});", 14688 ZeroColumn); 14689 verifyFormat("void (^largeBlock)(void) = ^{\n" 14690 " // ...\n" 14691 "};", 14692 ZeroColumn); 14693 14694 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 14695 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 14696 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 14697 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 14698 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 14699 " int i;\n" 14700 "};", 14701 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 14702 } 14703 14704 TEST_F(FormatTest, SupportsCRLF) { 14705 EXPECT_EQ("int a;\r\n" 14706 "int b;\r\n" 14707 "int c;\r\n", 14708 format("int a;\r\n" 14709 " int b;\r\n" 14710 " int c;\r\n", 14711 getLLVMStyle())); 14712 EXPECT_EQ("int a;\r\n" 14713 "int b;\r\n" 14714 "int c;\r\n", 14715 format("int a;\r\n" 14716 " int b;\n" 14717 " int c;\r\n", 14718 getLLVMStyle())); 14719 EXPECT_EQ("int a;\n" 14720 "int b;\n" 14721 "int c;\n", 14722 format("int a;\r\n" 14723 " int b;\n" 14724 " int c;\n", 14725 getLLVMStyle())); 14726 EXPECT_EQ("\"aaaaaaa \"\r\n" 14727 "\"bbbbbbb\";\r\n", 14728 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 14729 EXPECT_EQ("#define A \\\r\n" 14730 " b; \\\r\n" 14731 " c; \\\r\n" 14732 " d;\r\n", 14733 format("#define A \\\r\n" 14734 " b; \\\r\n" 14735 " c; d; \r\n", 14736 getGoogleStyle())); 14737 14738 EXPECT_EQ("/*\r\n" 14739 "multi line block comments\r\n" 14740 "should not introduce\r\n" 14741 "an extra carriage return\r\n" 14742 "*/\r\n", 14743 format("/*\r\n" 14744 "multi line block comments\r\n" 14745 "should not introduce\r\n" 14746 "an extra carriage return\r\n" 14747 "*/\r\n")); 14748 EXPECT_EQ("/*\r\n" 14749 "\r\n" 14750 "*/", 14751 format("/*\r\n" 14752 " \r\r\r\n" 14753 "*/")); 14754 14755 FormatStyle style = getLLVMStyle(); 14756 14757 style.DeriveLineEnding = true; 14758 style.UseCRLF = false; 14759 EXPECT_EQ("union FooBarBazQux {\n" 14760 " int foo;\n" 14761 " int bar;\n" 14762 " int baz;\n" 14763 "};", 14764 format("union FooBarBazQux {\r\n" 14765 " int foo;\n" 14766 " int bar;\r\n" 14767 " int baz;\n" 14768 "};", 14769 style)); 14770 style.UseCRLF = true; 14771 EXPECT_EQ("union FooBarBazQux {\r\n" 14772 " int foo;\r\n" 14773 " int bar;\r\n" 14774 " int baz;\r\n" 14775 "};", 14776 format("union FooBarBazQux {\r\n" 14777 " int foo;\n" 14778 " int bar;\r\n" 14779 " int baz;\n" 14780 "};", 14781 style)); 14782 14783 style.DeriveLineEnding = false; 14784 style.UseCRLF = false; 14785 EXPECT_EQ("union FooBarBazQux {\n" 14786 " int foo;\n" 14787 " int bar;\n" 14788 " int baz;\n" 14789 " int qux;\n" 14790 "};", 14791 format("union FooBarBazQux {\r\n" 14792 " int foo;\n" 14793 " int bar;\r\n" 14794 " int baz;\n" 14795 " int qux;\r\n" 14796 "};", 14797 style)); 14798 style.UseCRLF = true; 14799 EXPECT_EQ("union FooBarBazQux {\r\n" 14800 " int foo;\r\n" 14801 " int bar;\r\n" 14802 " int baz;\r\n" 14803 " int qux;\r\n" 14804 "};", 14805 format("union FooBarBazQux {\r\n" 14806 " int foo;\n" 14807 " int bar;\r\n" 14808 " int baz;\n" 14809 " int qux;\n" 14810 "};", 14811 style)); 14812 14813 style.DeriveLineEnding = true; 14814 style.UseCRLF = false; 14815 EXPECT_EQ("union FooBarBazQux {\r\n" 14816 " int foo;\r\n" 14817 " int bar;\r\n" 14818 " int baz;\r\n" 14819 " int qux;\r\n" 14820 "};", 14821 format("union FooBarBazQux {\r\n" 14822 " int foo;\n" 14823 " int bar;\r\n" 14824 " int baz;\n" 14825 " int qux;\r\n" 14826 "};", 14827 style)); 14828 style.UseCRLF = true; 14829 EXPECT_EQ("union FooBarBazQux {\n" 14830 " int foo;\n" 14831 " int bar;\n" 14832 " int baz;\n" 14833 " int qux;\n" 14834 "};", 14835 format("union FooBarBazQux {\r\n" 14836 " int foo;\n" 14837 " int bar;\r\n" 14838 " int baz;\n" 14839 " int qux;\n" 14840 "};", 14841 style)); 14842 } 14843 14844 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 14845 verifyFormat("MY_CLASS(C) {\n" 14846 " int i;\n" 14847 " int j;\n" 14848 "};"); 14849 } 14850 14851 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 14852 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 14853 TwoIndent.ContinuationIndentWidth = 2; 14854 14855 EXPECT_EQ("int i =\n" 14856 " longFunction(\n" 14857 " arg);", 14858 format("int i = longFunction(arg);", TwoIndent)); 14859 14860 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 14861 SixIndent.ContinuationIndentWidth = 6; 14862 14863 EXPECT_EQ("int i =\n" 14864 " longFunction(\n" 14865 " arg);", 14866 format("int i = longFunction(arg);", SixIndent)); 14867 } 14868 14869 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 14870 FormatStyle Style = getLLVMStyle(); 14871 verifyFormat("int Foo::getter(\n" 14872 " //\n" 14873 ") const {\n" 14874 " return foo;\n" 14875 "}", 14876 Style); 14877 verifyFormat("void Foo::setter(\n" 14878 " //\n" 14879 ") {\n" 14880 " foo = 1;\n" 14881 "}", 14882 Style); 14883 } 14884 14885 TEST_F(FormatTest, SpacesInAngles) { 14886 FormatStyle Spaces = getLLVMStyle(); 14887 Spaces.SpacesInAngles = true; 14888 14889 verifyFormat("static_cast< int >(arg);", Spaces); 14890 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 14891 verifyFormat("f< int, float >();", Spaces); 14892 verifyFormat("template <> g() {}", Spaces); 14893 verifyFormat("template < std::vector< int > > f() {}", Spaces); 14894 verifyFormat("std::function< void(int, int) > fct;", Spaces); 14895 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 14896 Spaces); 14897 14898 Spaces.Standard = FormatStyle::LS_Cpp03; 14899 Spaces.SpacesInAngles = true; 14900 verifyFormat("A< A< int > >();", Spaces); 14901 14902 Spaces.SpacesInAngles = false; 14903 verifyFormat("A<A<int> >();", Spaces); 14904 14905 Spaces.Standard = FormatStyle::LS_Cpp11; 14906 Spaces.SpacesInAngles = true; 14907 verifyFormat("A< A< int > >();", Spaces); 14908 14909 Spaces.SpacesInAngles = false; 14910 verifyFormat("A<A<int>>();", Spaces); 14911 } 14912 14913 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 14914 FormatStyle Style = getLLVMStyle(); 14915 Style.SpaceAfterTemplateKeyword = false; 14916 verifyFormat("template<int> void foo();", Style); 14917 } 14918 14919 TEST_F(FormatTest, TripleAngleBrackets) { 14920 verifyFormat("f<<<1, 1>>>();"); 14921 verifyFormat("f<<<1, 1, 1, s>>>();"); 14922 verifyFormat("f<<<a, b, c, d>>>();"); 14923 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 14924 verifyFormat("f<param><<<1, 1>>>();"); 14925 verifyFormat("f<1><<<1, 1>>>();"); 14926 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 14927 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14928 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 14929 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 14930 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 14931 } 14932 14933 TEST_F(FormatTest, MergeLessLessAtEnd) { 14934 verifyFormat("<<"); 14935 EXPECT_EQ("< < <", format("\\\n<<<")); 14936 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14937 "aaallvm::outs() <<"); 14938 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 14939 "aaaallvm::outs()\n <<"); 14940 } 14941 14942 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 14943 std::string code = "#if A\n" 14944 "#if B\n" 14945 "a.\n" 14946 "#endif\n" 14947 " a = 1;\n" 14948 "#else\n" 14949 "#endif\n" 14950 "#if C\n" 14951 "#else\n" 14952 "#endif\n"; 14953 EXPECT_EQ(code, format(code)); 14954 } 14955 14956 TEST_F(FormatTest, HandleConflictMarkers) { 14957 // Git/SVN conflict markers. 14958 EXPECT_EQ("int a;\n" 14959 "void f() {\n" 14960 " callme(some(parameter1,\n" 14961 "<<<<<<< text by the vcs\n" 14962 " parameter2),\n" 14963 "||||||| text by the vcs\n" 14964 " parameter2),\n" 14965 " parameter3,\n" 14966 "======= text by the vcs\n" 14967 " parameter2, parameter3),\n" 14968 ">>>>>>> text by the vcs\n" 14969 " otherparameter);\n", 14970 format("int a;\n" 14971 "void f() {\n" 14972 " callme(some(parameter1,\n" 14973 "<<<<<<< text by the vcs\n" 14974 " parameter2),\n" 14975 "||||||| text by the vcs\n" 14976 " parameter2),\n" 14977 " parameter3,\n" 14978 "======= text by the vcs\n" 14979 " parameter2,\n" 14980 " parameter3),\n" 14981 ">>>>>>> text by the vcs\n" 14982 " otherparameter);\n")); 14983 14984 // Perforce markers. 14985 EXPECT_EQ("void f() {\n" 14986 " function(\n" 14987 ">>>> text by the vcs\n" 14988 " parameter,\n" 14989 "==== text by the vcs\n" 14990 " parameter,\n" 14991 "==== text by the vcs\n" 14992 " parameter,\n" 14993 "<<<< text by the vcs\n" 14994 " parameter);\n", 14995 format("void f() {\n" 14996 " function(\n" 14997 ">>>> text by the vcs\n" 14998 " parameter,\n" 14999 "==== text by the vcs\n" 15000 " parameter,\n" 15001 "==== text by the vcs\n" 15002 " parameter,\n" 15003 "<<<< text by the vcs\n" 15004 " parameter);\n")); 15005 15006 EXPECT_EQ("<<<<<<<\n" 15007 "|||||||\n" 15008 "=======\n" 15009 ">>>>>>>", 15010 format("<<<<<<<\n" 15011 "|||||||\n" 15012 "=======\n" 15013 ">>>>>>>")); 15014 15015 EXPECT_EQ("<<<<<<<\n" 15016 "|||||||\n" 15017 "int i;\n" 15018 "=======\n" 15019 ">>>>>>>", 15020 format("<<<<<<<\n" 15021 "|||||||\n" 15022 "int i;\n" 15023 "=======\n" 15024 ">>>>>>>")); 15025 15026 // FIXME: Handle parsing of macros around conflict markers correctly: 15027 EXPECT_EQ("#define Macro \\\n" 15028 "<<<<<<<\n" 15029 "Something \\\n" 15030 "|||||||\n" 15031 "Else \\\n" 15032 "=======\n" 15033 "Other \\\n" 15034 ">>>>>>>\n" 15035 " End int i;\n", 15036 format("#define Macro \\\n" 15037 "<<<<<<<\n" 15038 " Something \\\n" 15039 "|||||||\n" 15040 " Else \\\n" 15041 "=======\n" 15042 " Other \\\n" 15043 ">>>>>>>\n" 15044 " End\n" 15045 "int i;\n")); 15046 } 15047 15048 TEST_F(FormatTest, DisableRegions) { 15049 EXPECT_EQ("int i;\n" 15050 "// clang-format off\n" 15051 " int j;\n" 15052 "// clang-format on\n" 15053 "int k;", 15054 format(" int i;\n" 15055 " // clang-format off\n" 15056 " int j;\n" 15057 " // clang-format on\n" 15058 " int k;")); 15059 EXPECT_EQ("int i;\n" 15060 "/* clang-format off */\n" 15061 " int j;\n" 15062 "/* clang-format on */\n" 15063 "int k;", 15064 format(" int i;\n" 15065 " /* clang-format off */\n" 15066 " int j;\n" 15067 " /* clang-format on */\n" 15068 " int k;")); 15069 15070 // Don't reflow comments within disabled regions. 15071 EXPECT_EQ("// clang-format off\n" 15072 "// long long long long long long line\n" 15073 "/* clang-format on */\n" 15074 "/* long long long\n" 15075 " * long long long\n" 15076 " * line */\n" 15077 "int i;\n" 15078 "/* clang-format off */\n" 15079 "/* long long long long long long line */\n", 15080 format("// clang-format off\n" 15081 "// long long long long long long line\n" 15082 "/* clang-format on */\n" 15083 "/* long long long long long long line */\n" 15084 "int i;\n" 15085 "/* clang-format off */\n" 15086 "/* long long long long long long line */\n", 15087 getLLVMStyleWithColumns(20))); 15088 } 15089 15090 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 15091 format("? ) ="); 15092 verifyNoCrash("#define a\\\n /**/}"); 15093 } 15094 15095 TEST_F(FormatTest, FormatsTableGenCode) { 15096 FormatStyle Style = getLLVMStyle(); 15097 Style.Language = FormatStyle::LK_TableGen; 15098 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 15099 } 15100 15101 TEST_F(FormatTest, ArrayOfTemplates) { 15102 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 15103 format("auto a = new unique_ptr<int > [ 10];")); 15104 15105 FormatStyle Spaces = getLLVMStyle(); 15106 Spaces.SpacesInSquareBrackets = true; 15107 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 15108 format("auto a = new unique_ptr<int > [10];", Spaces)); 15109 } 15110 15111 TEST_F(FormatTest, ArrayAsTemplateType) { 15112 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 15113 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 15114 15115 FormatStyle Spaces = getLLVMStyle(); 15116 Spaces.SpacesInSquareBrackets = true; 15117 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 15118 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 15119 } 15120 15121 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 15122 15123 TEST(FormatStyle, GetStyleWithEmptyFileName) { 15124 llvm::vfs::InMemoryFileSystem FS; 15125 auto Style1 = getStyle("file", "", "Google", "", &FS); 15126 ASSERT_TRUE((bool)Style1); 15127 ASSERT_EQ(*Style1, getGoogleStyle()); 15128 } 15129 15130 TEST(FormatStyle, GetStyleOfFile) { 15131 llvm::vfs::InMemoryFileSystem FS; 15132 // Test 1: format file in the same directory. 15133 ASSERT_TRUE( 15134 FS.addFile("/a/.clang-format", 0, 15135 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 15136 ASSERT_TRUE( 15137 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15138 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 15139 ASSERT_TRUE((bool)Style1); 15140 ASSERT_EQ(*Style1, getLLVMStyle()); 15141 15142 // Test 2.1: fallback to default. 15143 ASSERT_TRUE( 15144 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15145 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 15146 ASSERT_TRUE((bool)Style2); 15147 ASSERT_EQ(*Style2, getMozillaStyle()); 15148 15149 // Test 2.2: no format on 'none' fallback style. 15150 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 15151 ASSERT_TRUE((bool)Style2); 15152 ASSERT_EQ(*Style2, getNoStyle()); 15153 15154 // Test 2.3: format if config is found with no based style while fallback is 15155 // 'none'. 15156 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 15157 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 15158 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 15159 ASSERT_TRUE((bool)Style2); 15160 ASSERT_EQ(*Style2, getLLVMStyle()); 15161 15162 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 15163 Style2 = getStyle("{}", "a.h", "none", "", &FS); 15164 ASSERT_TRUE((bool)Style2); 15165 ASSERT_EQ(*Style2, getLLVMStyle()); 15166 15167 // Test 3: format file in parent directory. 15168 ASSERT_TRUE( 15169 FS.addFile("/c/.clang-format", 0, 15170 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 15171 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 15172 llvm::MemoryBuffer::getMemBuffer("int i;"))); 15173 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 15174 ASSERT_TRUE((bool)Style3); 15175 ASSERT_EQ(*Style3, getGoogleStyle()); 15176 15177 // Test 4: error on invalid fallback style 15178 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 15179 ASSERT_FALSE((bool)Style4); 15180 llvm::consumeError(Style4.takeError()); 15181 15182 // Test 5: error on invalid yaml on command line 15183 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 15184 ASSERT_FALSE((bool)Style5); 15185 llvm::consumeError(Style5.takeError()); 15186 15187 // Test 6: error on invalid style 15188 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 15189 ASSERT_FALSE((bool)Style6); 15190 llvm::consumeError(Style6.takeError()); 15191 15192 // Test 7: found config file, error on parsing it 15193 ASSERT_TRUE( 15194 FS.addFile("/d/.clang-format", 0, 15195 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 15196 "InvalidKey: InvalidValue"))); 15197 ASSERT_TRUE( 15198 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15199 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 15200 ASSERT_FALSE((bool)Style7); 15201 llvm::consumeError(Style7.takeError()); 15202 15203 // Test 8: inferred per-language defaults apply. 15204 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 15205 ASSERT_TRUE((bool)StyleTd); 15206 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 15207 } 15208 15209 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 15210 // Column limit is 20. 15211 std::string Code = "Type *a =\n" 15212 " new Type();\n" 15213 "g(iiiii, 0, jjjjj,\n" 15214 " 0, kkkkk, 0, mm);\n" 15215 "int bad = format ;"; 15216 std::string Expected = "auto a = new Type();\n" 15217 "g(iiiii, nullptr,\n" 15218 " jjjjj, nullptr,\n" 15219 " kkkkk, nullptr,\n" 15220 " mm);\n" 15221 "int bad = format ;"; 15222 FileID ID = Context.createInMemoryFile("format.cpp", Code); 15223 tooling::Replacements Replaces = toReplacements( 15224 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 15225 "auto "), 15226 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 15227 "nullptr"), 15228 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 15229 "nullptr"), 15230 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 15231 "nullptr")}); 15232 15233 format::FormatStyle Style = format::getLLVMStyle(); 15234 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 15235 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 15236 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 15237 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 15238 auto Result = applyAllReplacements(Code, *FormattedReplaces); 15239 EXPECT_TRUE(static_cast<bool>(Result)); 15240 EXPECT_EQ(Expected, *Result); 15241 } 15242 15243 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 15244 std::string Code = "#include \"a.h\"\n" 15245 "#include \"c.h\"\n" 15246 "\n" 15247 "int main() {\n" 15248 " return 0;\n" 15249 "}"; 15250 std::string Expected = "#include \"a.h\"\n" 15251 "#include \"b.h\"\n" 15252 "#include \"c.h\"\n" 15253 "\n" 15254 "int main() {\n" 15255 " return 0;\n" 15256 "}"; 15257 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 15258 tooling::Replacements Replaces = toReplacements( 15259 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 15260 "#include \"b.h\"\n")}); 15261 15262 format::FormatStyle Style = format::getLLVMStyle(); 15263 Style.SortIncludes = true; 15264 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 15265 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 15266 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 15267 auto Result = applyAllReplacements(Code, *FormattedReplaces); 15268 EXPECT_TRUE(static_cast<bool>(Result)); 15269 EXPECT_EQ(Expected, *Result); 15270 } 15271 15272 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 15273 EXPECT_EQ("using std::cin;\n" 15274 "using std::cout;", 15275 format("using std::cout;\n" 15276 "using std::cin;", 15277 getGoogleStyle())); 15278 } 15279 15280 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 15281 format::FormatStyle Style = format::getLLVMStyle(); 15282 Style.Standard = FormatStyle::LS_Cpp03; 15283 // cpp03 recognize this string as identifier u8 and literal character 'a' 15284 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 15285 } 15286 15287 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 15288 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 15289 // all modes, including C++11, C++14 and C++17 15290 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 15291 } 15292 15293 TEST_F(FormatTest, DoNotFormatLikelyXml) { 15294 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 15295 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 15296 } 15297 15298 TEST_F(FormatTest, StructuredBindings) { 15299 // Structured bindings is a C++17 feature. 15300 // all modes, including C++11, C++14 and C++17 15301 verifyFormat("auto [a, b] = f();"); 15302 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 15303 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 15304 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 15305 EXPECT_EQ("auto const volatile [a, b] = f();", 15306 format("auto const volatile[a, b] = f();")); 15307 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 15308 EXPECT_EQ("auto &[a, b, c] = f();", 15309 format("auto &[ a , b,c ] = f();")); 15310 EXPECT_EQ("auto &&[a, b, c] = f();", 15311 format("auto &&[ a , b,c ] = f();")); 15312 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 15313 EXPECT_EQ("auto const volatile &&[a, b] = f();", 15314 format("auto const volatile &&[a, b] = f();")); 15315 EXPECT_EQ("auto const &&[a, b] = f();", 15316 format("auto const && [a, b] = f();")); 15317 EXPECT_EQ("const auto &[a, b] = f();", 15318 format("const auto & [a, b] = f();")); 15319 EXPECT_EQ("const auto volatile &&[a, b] = f();", 15320 format("const auto volatile &&[a, b] = f();")); 15321 EXPECT_EQ("volatile const auto &&[a, b] = f();", 15322 format("volatile const auto &&[a, b] = f();")); 15323 EXPECT_EQ("const auto &&[a, b] = f();", 15324 format("const auto && [a, b] = f();")); 15325 15326 // Make sure we don't mistake structured bindings for lambdas. 15327 FormatStyle PointerMiddle = getLLVMStyle(); 15328 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 15329 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 15330 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 15331 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 15332 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 15333 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 15334 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 15335 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 15336 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 15337 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 15338 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 15339 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 15340 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 15341 15342 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 15343 format("for (const auto && [a, b] : some_range) {\n}")); 15344 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 15345 format("for (const auto & [a, b] : some_range) {\n}")); 15346 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 15347 format("for (const auto[a, b] : some_range) {\n}")); 15348 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 15349 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 15350 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 15351 EXPECT_EQ("auto const &[x, y](expr);", 15352 format("auto const & [x,y] (expr);")); 15353 EXPECT_EQ("auto const &&[x, y](expr);", 15354 format("auto const && [x,y] (expr);")); 15355 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 15356 EXPECT_EQ("auto const &[x, y]{expr};", 15357 format("auto const & [x,y] {expr};")); 15358 EXPECT_EQ("auto const &&[x, y]{expr};", 15359 format("auto const && [x,y] {expr};")); 15360 15361 format::FormatStyle Spaces = format::getLLVMStyle(); 15362 Spaces.SpacesInSquareBrackets = true; 15363 verifyFormat("auto [ a, b ] = f();", Spaces); 15364 verifyFormat("auto &&[ a, b ] = f();", Spaces); 15365 verifyFormat("auto &[ a, b ] = f();", Spaces); 15366 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 15367 verifyFormat("auto const &[ a, b ] = f();", Spaces); 15368 } 15369 15370 TEST_F(FormatTest, FileAndCode) { 15371 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 15372 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 15373 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 15374 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 15375 EXPECT_EQ(FormatStyle::LK_ObjC, 15376 guessLanguage("foo.h", "@interface Foo\n@end\n")); 15377 EXPECT_EQ( 15378 FormatStyle::LK_ObjC, 15379 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 15380 EXPECT_EQ(FormatStyle::LK_ObjC, 15381 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 15382 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 15383 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 15384 EXPECT_EQ(FormatStyle::LK_ObjC, 15385 guessLanguage("foo", "@interface Foo\n@end\n")); 15386 EXPECT_EQ(FormatStyle::LK_ObjC, 15387 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 15388 EXPECT_EQ( 15389 FormatStyle::LK_ObjC, 15390 guessLanguage("foo.h", 15391 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 15392 EXPECT_EQ( 15393 FormatStyle::LK_Cpp, 15394 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 15395 } 15396 15397 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 15398 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 15399 EXPECT_EQ(FormatStyle::LK_ObjC, 15400 guessLanguage("foo.h", "array[[calculator getIndex]];")); 15401 EXPECT_EQ(FormatStyle::LK_Cpp, 15402 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 15403 EXPECT_EQ( 15404 FormatStyle::LK_Cpp, 15405 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 15406 EXPECT_EQ(FormatStyle::LK_ObjC, 15407 guessLanguage("foo.h", "[[noreturn foo] bar];")); 15408 EXPECT_EQ(FormatStyle::LK_Cpp, 15409 guessLanguage("foo.h", "[[clang::fallthrough]];")); 15410 EXPECT_EQ(FormatStyle::LK_ObjC, 15411 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 15412 EXPECT_EQ(FormatStyle::LK_Cpp, 15413 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 15414 EXPECT_EQ(FormatStyle::LK_Cpp, 15415 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 15416 EXPECT_EQ(FormatStyle::LK_ObjC, 15417 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 15418 EXPECT_EQ(FormatStyle::LK_Cpp, 15419 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 15420 EXPECT_EQ( 15421 FormatStyle::LK_Cpp, 15422 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 15423 EXPECT_EQ( 15424 FormatStyle::LK_Cpp, 15425 guessLanguage("foo.h", 15426 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 15427 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 15428 } 15429 15430 TEST_F(FormatTest, GuessLanguageWithCaret) { 15431 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 15432 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 15433 EXPECT_EQ(FormatStyle::LK_ObjC, 15434 guessLanguage("foo.h", "int(^)(char, float);")); 15435 EXPECT_EQ(FormatStyle::LK_ObjC, 15436 guessLanguage("foo.h", "int(^foo)(char, float);")); 15437 EXPECT_EQ(FormatStyle::LK_ObjC, 15438 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 15439 EXPECT_EQ(FormatStyle::LK_ObjC, 15440 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 15441 EXPECT_EQ( 15442 FormatStyle::LK_ObjC, 15443 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 15444 } 15445 15446 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) { 15447 // ASM symbolic names are identifiers that must be surrounded by [] without 15448 // space in between: 15449 // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands 15450 15451 // Example from https://bugs.llvm.org/show_bug.cgi?id=45108. 15452 verifyFormat(R"(// 15453 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result)); 15454 )"); 15455 15456 // A list of several ASM symbolic names. 15457 verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)"); 15458 15459 // ASM symbolic names in inline ASM with inputs and outputs. 15460 verifyFormat(R"(// 15461 asm("cmoveq %1, %2, %[result]" 15462 : [result] "=r"(result) 15463 : "r"(test), "r"(new), "[result]"(old)); 15464 )"); 15465 15466 // ASM symbolic names in inline ASM with no outputs. 15467 verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)"); 15468 } 15469 15470 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 15471 EXPECT_EQ(FormatStyle::LK_Cpp, 15472 guessLanguage("foo.h", "void f() {\n" 15473 " asm (\"mov %[e], %[d]\"\n" 15474 " : [d] \"=rm\" (d)\n" 15475 " [e] \"rm\" (*e));\n" 15476 "}")); 15477 EXPECT_EQ(FormatStyle::LK_Cpp, 15478 guessLanguage("foo.h", "void f() {\n" 15479 " _asm (\"mov %[e], %[d]\"\n" 15480 " : [d] \"=rm\" (d)\n" 15481 " [e] \"rm\" (*e));\n" 15482 "}")); 15483 EXPECT_EQ(FormatStyle::LK_Cpp, 15484 guessLanguage("foo.h", "void f() {\n" 15485 " __asm (\"mov %[e], %[d]\"\n" 15486 " : [d] \"=rm\" (d)\n" 15487 " [e] \"rm\" (*e));\n" 15488 "}")); 15489 EXPECT_EQ(FormatStyle::LK_Cpp, 15490 guessLanguage("foo.h", "void f() {\n" 15491 " __asm__ (\"mov %[e], %[d]\"\n" 15492 " : [d] \"=rm\" (d)\n" 15493 " [e] \"rm\" (*e));\n" 15494 "}")); 15495 EXPECT_EQ(FormatStyle::LK_Cpp, 15496 guessLanguage("foo.h", "void f() {\n" 15497 " asm (\"mov %[e], %[d]\"\n" 15498 " : [d] \"=rm\" (d),\n" 15499 " [e] \"rm\" (*e));\n" 15500 "}")); 15501 EXPECT_EQ(FormatStyle::LK_Cpp, 15502 guessLanguage("foo.h", "void f() {\n" 15503 " asm volatile (\"mov %[e], %[d]\"\n" 15504 " : [d] \"=rm\" (d)\n" 15505 " [e] \"rm\" (*e));\n" 15506 "}")); 15507 } 15508 15509 TEST_F(FormatTest, GuessLanguageWithChildLines) { 15510 EXPECT_EQ(FormatStyle::LK_Cpp, 15511 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 15512 EXPECT_EQ(FormatStyle::LK_ObjC, 15513 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 15514 EXPECT_EQ( 15515 FormatStyle::LK_Cpp, 15516 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 15517 EXPECT_EQ( 15518 FormatStyle::LK_ObjC, 15519 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 15520 } 15521 15522 TEST_F(FormatTest, TypenameMacros) { 15523 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 15524 15525 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 15526 FormatStyle Google = getGoogleStyleWithColumns(0); 15527 Google.TypenameMacros = TypenameMacros; 15528 verifyFormat("struct foo {\n" 15529 " int bar;\n" 15530 " TAILQ_ENTRY(a) bleh;\n" 15531 "};", 15532 Google); 15533 15534 FormatStyle Macros = getLLVMStyle(); 15535 Macros.TypenameMacros = TypenameMacros; 15536 15537 verifyFormat("STACK_OF(int) a;", Macros); 15538 verifyFormat("STACK_OF(int) *a;", Macros); 15539 verifyFormat("STACK_OF(int const *) *a;", Macros); 15540 verifyFormat("STACK_OF(int *const) *a;", Macros); 15541 verifyFormat("STACK_OF(int, string) a;", Macros); 15542 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 15543 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 15544 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 15545 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 15546 15547 Macros.PointerAlignment = FormatStyle::PAS_Left; 15548 verifyFormat("STACK_OF(int)* a;", Macros); 15549 verifyFormat("STACK_OF(int*)* a;", Macros); 15550 } 15551 15552 TEST_F(FormatTest, AmbersandInLamda) { 15553 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 15554 FormatStyle AlignStyle = getLLVMStyle(); 15555 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 15556 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 15557 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 15558 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 15559 } 15560 15561 TEST_F(FormatTest, SpacesInConditionalStatement) { 15562 FormatStyle Spaces = getLLVMStyle(); 15563 Spaces.SpacesInConditionalStatement = true; 15564 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 15565 verifyFormat("if ( !a )\n return;", Spaces); 15566 verifyFormat("if ( a )\n return;", Spaces); 15567 verifyFormat("if constexpr ( a )\n return;", Spaces); 15568 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 15569 verifyFormat("while ( a )\n return;", Spaces); 15570 verifyFormat("while ( (a && b) )\n return;", Spaces); 15571 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 15572 verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces); 15573 // Check that space on the left of "::" is inserted as expected at beginning 15574 // of condition. 15575 verifyFormat("while ( ::func() )\n return;", Spaces); 15576 } 15577 15578 TEST_F(FormatTest, AlternativeOperators) { 15579 // Test case for ensuring alternate operators are not 15580 // combined with their right most neighbour. 15581 verifyFormat("int a and b;"); 15582 verifyFormat("int a and_eq b;"); 15583 verifyFormat("int a bitand b;"); 15584 verifyFormat("int a bitor b;"); 15585 verifyFormat("int a compl b;"); 15586 verifyFormat("int a not b;"); 15587 verifyFormat("int a not_eq b;"); 15588 verifyFormat("int a or b;"); 15589 verifyFormat("int a xor b;"); 15590 verifyFormat("int a xor_eq b;"); 15591 verifyFormat("return this not_eq bitand other;"); 15592 verifyFormat("bool operator not_eq(const X bitand other)"); 15593 15594 verifyFormat("int a and 5;"); 15595 verifyFormat("int a and_eq 5;"); 15596 verifyFormat("int a bitand 5;"); 15597 verifyFormat("int a bitor 5;"); 15598 verifyFormat("int a compl 5;"); 15599 verifyFormat("int a not 5;"); 15600 verifyFormat("int a not_eq 5;"); 15601 verifyFormat("int a or 5;"); 15602 verifyFormat("int a xor 5;"); 15603 verifyFormat("int a xor_eq 5;"); 15604 15605 verifyFormat("int a compl(5);"); 15606 verifyFormat("int a not(5);"); 15607 15608 /* FIXME handle alternate tokens 15609 * https://en.cppreference.com/w/cpp/language/operator_alternative 15610 // alternative tokens 15611 verifyFormat("compl foo();"); // ~foo(); 15612 verifyFormat("foo() <%%>;"); // foo(); 15613 verifyFormat("void foo() <%%>;"); // void foo(){} 15614 verifyFormat("int a <:1:>;"); // int a[1];[ 15615 verifyFormat("%:define ABC abc"); // #define ABC abc 15616 verifyFormat("%:%:"); // ## 15617 */ 15618 } 15619 15620 TEST_F(FormatTest, STLWhileNotDefineChed) { 15621 verifyFormat("#if defined(while)\n" 15622 "#define while EMIT WARNING C4005\n" 15623 "#endif // while"); 15624 } 15625 15626 TEST_F(FormatTest, OperatorSpacing) { 15627 FormatStyle Style = getLLVMStyle(); 15628 Style.PointerAlignment = FormatStyle::PAS_Right; 15629 verifyFormat("Foo::operator*();", Style); 15630 verifyFormat("Foo::operator void *();", Style); 15631 verifyFormat("Foo::operator()(void *);", Style); 15632 verifyFormat("Foo::operator*(void *);", Style); 15633 verifyFormat("Foo::operator*();", Style); 15634 verifyFormat("operator*(int (*)(), class Foo);", Style); 15635 15636 verifyFormat("Foo::operator&();", Style); 15637 verifyFormat("Foo::operator void &();", Style); 15638 verifyFormat("Foo::operator()(void &);", Style); 15639 verifyFormat("Foo::operator&(void &);", Style); 15640 verifyFormat("Foo::operator&();", Style); 15641 verifyFormat("operator&(int (&)(), class Foo);", Style); 15642 15643 verifyFormat("Foo::operator&&();", Style); 15644 verifyFormat("Foo::operator void &&();", Style); 15645 verifyFormat("Foo::operator()(void &&);", Style); 15646 verifyFormat("Foo::operator&&(void &&);", Style); 15647 verifyFormat("Foo::operator&&();", Style); 15648 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15649 15650 Style.PointerAlignment = FormatStyle::PAS_Left; 15651 verifyFormat("Foo::operator*();", Style); 15652 verifyFormat("Foo::operator void*();", Style); 15653 verifyFormat("Foo::operator/*comment*/ void*();", Style); 15654 verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); 15655 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); 15656 verifyFormat("Foo::operator()(void*);", Style); 15657 verifyFormat("Foo::operator*(void*);", Style); 15658 verifyFormat("Foo::operator*();", Style); 15659 verifyFormat("operator*(int (*)(), class Foo);", Style); 15660 15661 verifyFormat("Foo::operator&();", Style); 15662 verifyFormat("Foo::operator void&();", Style); 15663 verifyFormat("Foo::operator/*comment*/ void&();", Style); 15664 verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); 15665 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); 15666 verifyFormat("Foo::operator()(void&);", Style); 15667 verifyFormat("Foo::operator&(void&);", Style); 15668 verifyFormat("Foo::operator&();", Style); 15669 verifyFormat("operator&(int (&)(), class Foo);", Style); 15670 15671 verifyFormat("Foo::operator&&();", Style); 15672 verifyFormat("Foo::operator void&&();", Style); 15673 verifyFormat("Foo::operator/*comment*/ void&&();", Style); 15674 verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); 15675 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); 15676 verifyFormat("Foo::operator()(void&&);", Style); 15677 verifyFormat("Foo::operator&&(void&&);", Style); 15678 verifyFormat("Foo::operator&&();", Style); 15679 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15680 15681 // PR45107 15682 verifyFormat("operator Vector<String>&();", Style); 15683 verifyFormat("operator foo::Bar*();", Style); 15684 verifyFormat("operator const Foo<X>::Bar<Y>*();", Style); 15685 verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();", 15686 Style); 15687 15688 Style.PointerAlignment = FormatStyle::PAS_Middle; 15689 verifyFormat("Foo::operator*();", Style); 15690 verifyFormat("Foo::operator void *();", Style); 15691 verifyFormat("Foo::operator()(void *);", Style); 15692 verifyFormat("Foo::operator*(void *);", Style); 15693 verifyFormat("Foo::operator*();", Style); 15694 verifyFormat("operator*(int (*)(), class Foo);", Style); 15695 15696 verifyFormat("Foo::operator&();", Style); 15697 verifyFormat("Foo::operator void &();", Style); 15698 verifyFormat("Foo::operator()(void &);", Style); 15699 verifyFormat("Foo::operator&(void &);", Style); 15700 verifyFormat("Foo::operator&();", Style); 15701 verifyFormat("operator&(int (&)(), class Foo);", Style); 15702 15703 verifyFormat("Foo::operator&&();", Style); 15704 verifyFormat("Foo::operator void &&();", Style); 15705 verifyFormat("Foo::operator()(void &&);", Style); 15706 verifyFormat("Foo::operator&&(void &&);", Style); 15707 verifyFormat("Foo::operator&&();", Style); 15708 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 15709 } 15710 15711 } // namespace 15712 } // namespace format 15713 } // namespace clang 15714