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) { fffffffffffffffffffffff(); }", 610 AllowSimpleBracedStatements); 611 verifyFormat("if (true) {\n" 612 " ffffffffffffffffffffffff();\n" 613 "}", 614 AllowSimpleBracedStatements); 615 verifyFormat("if (true) {\n" 616 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 617 "}", 618 AllowSimpleBracedStatements); 619 verifyFormat("if (true) { //\n" 620 " f();\n" 621 "}", 622 AllowSimpleBracedStatements); 623 verifyFormat("if (true) {\n" 624 " f();\n" 625 " f();\n" 626 "}", 627 AllowSimpleBracedStatements); 628 verifyFormat("if (true) {\n" 629 " f();\n" 630 "} else {\n" 631 " f();\n" 632 "}", 633 AllowSimpleBracedStatements); 634 635 verifyFormat("struct A2 {\n" 636 " int X;\n" 637 "};", 638 AllowSimpleBracedStatements); 639 verifyFormat("typedef struct A2 {\n" 640 " int X;\n" 641 "} A2_t;", 642 AllowSimpleBracedStatements); 643 verifyFormat("template <int> struct A2 {\n" 644 " struct B {};\n" 645 "};", 646 AllowSimpleBracedStatements); 647 648 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 649 FormatStyle::SIS_Never; 650 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 651 verifyFormat("if (true) {\n" 652 " f();\n" 653 "}", 654 AllowSimpleBracedStatements); 655 verifyFormat("if (true) {\n" 656 " f();\n" 657 "} else {\n" 658 " f();\n" 659 "}", 660 AllowSimpleBracedStatements); 661 662 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 663 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 664 verifyFormat("while (true) {\n" 665 " f();\n" 666 "}", 667 AllowSimpleBracedStatements); 668 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 669 verifyFormat("for (;;) {\n" 670 " f();\n" 671 "}", 672 AllowSimpleBracedStatements); 673 674 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 675 FormatStyle::SIS_WithoutElse; 676 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 677 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = 678 FormatStyle::BWACS_Always; 679 680 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 681 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 682 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 683 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 684 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 685 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 686 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 687 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 688 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 689 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 690 verifyFormat("if (true) { fffffffffffffffffffffff(); }", 691 AllowSimpleBracedStatements); 692 verifyFormat("if (true)\n" 693 "{\n" 694 " ffffffffffffffffffffffff();\n" 695 "}", 696 AllowSimpleBracedStatements); 697 verifyFormat("if (true)\n" 698 "{\n" 699 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 700 "}", 701 AllowSimpleBracedStatements); 702 verifyFormat("if (true)\n" 703 "{ //\n" 704 " f();\n" 705 "}", 706 AllowSimpleBracedStatements); 707 verifyFormat("if (true)\n" 708 "{\n" 709 " f();\n" 710 " f();\n" 711 "}", 712 AllowSimpleBracedStatements); 713 verifyFormat("if (true)\n" 714 "{\n" 715 " f();\n" 716 "} else\n" 717 "{\n" 718 " f();\n" 719 "}", 720 AllowSimpleBracedStatements); 721 722 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 723 FormatStyle::SIS_Never; 724 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 725 verifyFormat("if (true)\n" 726 "{\n" 727 " f();\n" 728 "}", 729 AllowSimpleBracedStatements); 730 verifyFormat("if (true)\n" 731 "{\n" 732 " f();\n" 733 "} else\n" 734 "{\n" 735 " f();\n" 736 "}", 737 AllowSimpleBracedStatements); 738 739 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 740 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 741 verifyFormat("while (true)\n" 742 "{\n" 743 " f();\n" 744 "}", 745 AllowSimpleBracedStatements); 746 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 747 verifyFormat("for (;;)\n" 748 "{\n" 749 " f();\n" 750 "}", 751 AllowSimpleBracedStatements); 752 } 753 754 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 755 FormatStyle Style = getLLVMStyleWithColumns(60); 756 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 757 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 758 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 759 EXPECT_EQ("#define A \\\n" 760 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 761 " { \\\n" 762 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 763 " }\n" 764 "X;", 765 format("#define A \\\n" 766 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 767 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 768 " }\n" 769 "X;", 770 Style)); 771 } 772 773 TEST_F(FormatTest, ParseIfElse) { 774 verifyFormat("if (true)\n" 775 " if (true)\n" 776 " if (true)\n" 777 " f();\n" 778 " else\n" 779 " g();\n" 780 " else\n" 781 " h();\n" 782 "else\n" 783 " i();"); 784 verifyFormat("if (true)\n" 785 " if (true)\n" 786 " if (true) {\n" 787 " if (true)\n" 788 " f();\n" 789 " } else {\n" 790 " g();\n" 791 " }\n" 792 " else\n" 793 " h();\n" 794 "else {\n" 795 " i();\n" 796 "}"); 797 verifyFormat("if (true)\n" 798 " if constexpr (true)\n" 799 " if (true) {\n" 800 " if constexpr (true)\n" 801 " f();\n" 802 " } else {\n" 803 " g();\n" 804 " }\n" 805 " else\n" 806 " h();\n" 807 "else {\n" 808 " i();\n" 809 "}"); 810 verifyFormat("if (true)\n" 811 " if CONSTEXPR (true)\n" 812 " if (true) {\n" 813 " if CONSTEXPR (true)\n" 814 " f();\n" 815 " } else {\n" 816 " g();\n" 817 " }\n" 818 " else\n" 819 " h();\n" 820 "else {\n" 821 " i();\n" 822 "}"); 823 verifyFormat("void f() {\n" 824 " if (a) {\n" 825 " } else {\n" 826 " }\n" 827 "}"); 828 } 829 830 TEST_F(FormatTest, ElseIf) { 831 verifyFormat("if (a) {\n} else if (b) {\n}"); 832 verifyFormat("if (a)\n" 833 " f();\n" 834 "else if (b)\n" 835 " g();\n" 836 "else\n" 837 " h();"); 838 verifyFormat("if constexpr (a)\n" 839 " f();\n" 840 "else if constexpr (b)\n" 841 " g();\n" 842 "else\n" 843 " h();"); 844 verifyFormat("if CONSTEXPR (a)\n" 845 " f();\n" 846 "else if CONSTEXPR (b)\n" 847 " g();\n" 848 "else\n" 849 " h();"); 850 verifyFormat("if (a) {\n" 851 " f();\n" 852 "}\n" 853 "// or else ..\n" 854 "else {\n" 855 " g()\n" 856 "}"); 857 858 verifyFormat("if (a) {\n" 859 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 860 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 861 "}"); 862 verifyFormat("if (a) {\n" 863 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 865 "}"); 866 verifyFormat("if (a) {\n" 867 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 868 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 869 "}"); 870 verifyFormat("if (a) {\n" 871 "} else if (\n" 872 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 873 "}", 874 getLLVMStyleWithColumns(62)); 875 verifyFormat("if (a) {\n" 876 "} else if constexpr (\n" 877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 878 "}", 879 getLLVMStyleWithColumns(62)); 880 verifyFormat("if (a) {\n" 881 "} else if CONSTEXPR (\n" 882 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 883 "}", 884 getLLVMStyleWithColumns(62)); 885 } 886 887 TEST_F(FormatTest, FormatsForLoop) { 888 verifyFormat( 889 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 890 " ++VeryVeryLongLoopVariable)\n" 891 " ;"); 892 verifyFormat("for (;;)\n" 893 " f();"); 894 verifyFormat("for (;;) {\n}"); 895 verifyFormat("for (;;) {\n" 896 " f();\n" 897 "}"); 898 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 899 900 verifyFormat( 901 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 902 " E = UnwrappedLines.end();\n" 903 " I != E; ++I) {\n}"); 904 905 verifyFormat( 906 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 907 " ++IIIII) {\n}"); 908 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 909 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 910 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 911 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 912 " I = FD->getDeclsInPrototypeScope().begin(),\n" 913 " E = FD->getDeclsInPrototypeScope().end();\n" 914 " I != E; ++I) {\n}"); 915 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 916 " I = Container.begin(),\n" 917 " E = Container.end();\n" 918 " I != E; ++I) {\n}", 919 getLLVMStyleWithColumns(76)); 920 921 verifyFormat( 922 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 924 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 925 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 926 " ++aaaaaaaaaaa) {\n}"); 927 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 928 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 929 " ++i) {\n}"); 930 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 931 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 932 "}"); 933 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 934 " aaaaaaaaaa);\n" 935 " iter; ++iter) {\n" 936 "}"); 937 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 938 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 939 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 940 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 941 942 // These should not be formatted as Objective-C for-in loops. 943 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 944 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 945 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 946 verifyFormat( 947 "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 948 949 FormatStyle NoBinPacking = getLLVMStyle(); 950 NoBinPacking.BinPackParameters = false; 951 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 952 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 953 " aaaaaaaaaaaaaaaa,\n" 954 " aaaaaaaaaaaaaaaa,\n" 955 " aaaaaaaaaaaaaaaa);\n" 956 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 957 "}", 958 NoBinPacking); 959 verifyFormat( 960 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 961 " E = UnwrappedLines.end();\n" 962 " I != E;\n" 963 " ++I) {\n}", 964 NoBinPacking); 965 966 FormatStyle AlignLeft = getLLVMStyle(); 967 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 968 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 969 } 970 971 TEST_F(FormatTest, RangeBasedForLoops) { 972 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 973 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 974 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 975 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 976 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 977 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 978 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 979 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 980 } 981 982 TEST_F(FormatTest, ForEachLoops) { 983 verifyFormat("void f() {\n" 984 " foreach (Item *item, itemlist) {}\n" 985 " Q_FOREACH (Item *item, itemlist) {}\n" 986 " BOOST_FOREACH (Item *item, itemlist) {}\n" 987 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 988 "}"); 989 990 FormatStyle Style = getLLVMStyle(); 991 Style.SpaceBeforeParens = 992 FormatStyle::SBPO_ControlStatementsExceptForEachMacros; 993 verifyFormat("void f() {\n" 994 " foreach(Item *item, itemlist) {}\n" 995 " Q_FOREACH(Item *item, itemlist) {}\n" 996 " BOOST_FOREACH(Item *item, itemlist) {}\n" 997 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 998 "}", 999 Style); 1000 1001 // As function-like macros. 1002 verifyFormat("#define foreach(x, y)\n" 1003 "#define Q_FOREACH(x, y)\n" 1004 "#define BOOST_FOREACH(x, y)\n" 1005 "#define UNKNOWN_FOREACH(x, y)\n"); 1006 1007 // Not as function-like macros. 1008 verifyFormat("#define foreach (x, y)\n" 1009 "#define Q_FOREACH (x, y)\n" 1010 "#define BOOST_FOREACH (x, y)\n" 1011 "#define UNKNOWN_FOREACH (x, y)\n"); 1012 1013 // handle microsoft non standard extension 1014 verifyFormat("for each (char c in x->MyStringProperty)"); 1015 } 1016 1017 TEST_F(FormatTest, FormatsWhileLoop) { 1018 verifyFormat("while (true) {\n}"); 1019 verifyFormat("while (true)\n" 1020 " f();"); 1021 verifyFormat("while () {\n}"); 1022 verifyFormat("while () {\n" 1023 " f();\n" 1024 "}"); 1025 } 1026 1027 TEST_F(FormatTest, FormatsDoWhile) { 1028 verifyFormat("do {\n" 1029 " do_something();\n" 1030 "} while (something());"); 1031 verifyFormat("do\n" 1032 " do_something();\n" 1033 "while (something());"); 1034 } 1035 1036 TEST_F(FormatTest, FormatsSwitchStatement) { 1037 verifyFormat("switch (x) {\n" 1038 "case 1:\n" 1039 " f();\n" 1040 " break;\n" 1041 "case kFoo:\n" 1042 "case ns::kBar:\n" 1043 "case kBaz:\n" 1044 " break;\n" 1045 "default:\n" 1046 " g();\n" 1047 " break;\n" 1048 "}"); 1049 verifyFormat("switch (x) {\n" 1050 "case 1: {\n" 1051 " f();\n" 1052 " break;\n" 1053 "}\n" 1054 "case 2: {\n" 1055 " break;\n" 1056 "}\n" 1057 "}"); 1058 verifyFormat("switch (x) {\n" 1059 "case 1: {\n" 1060 " f();\n" 1061 " {\n" 1062 " g();\n" 1063 " h();\n" 1064 " }\n" 1065 " break;\n" 1066 "}\n" 1067 "}"); 1068 verifyFormat("switch (x) {\n" 1069 "case 1: {\n" 1070 " f();\n" 1071 " if (foo) {\n" 1072 " g();\n" 1073 " h();\n" 1074 " }\n" 1075 " break;\n" 1076 "}\n" 1077 "}"); 1078 verifyFormat("switch (x) {\n" 1079 "case 1: {\n" 1080 " f();\n" 1081 " g();\n" 1082 "} break;\n" 1083 "}"); 1084 verifyFormat("switch (test)\n" 1085 " ;"); 1086 verifyFormat("switch (x) {\n" 1087 "default: {\n" 1088 " // Do nothing.\n" 1089 "}\n" 1090 "}"); 1091 verifyFormat("switch (x) {\n" 1092 "// comment\n" 1093 "// if 1, do f()\n" 1094 "case 1:\n" 1095 " f();\n" 1096 "}"); 1097 verifyFormat("switch (x) {\n" 1098 "case 1:\n" 1099 " // Do amazing stuff\n" 1100 " {\n" 1101 " f();\n" 1102 " g();\n" 1103 " }\n" 1104 " break;\n" 1105 "}"); 1106 verifyFormat("#define A \\\n" 1107 " switch (x) { \\\n" 1108 " case a: \\\n" 1109 " foo = b; \\\n" 1110 " }", 1111 getLLVMStyleWithColumns(20)); 1112 verifyFormat("#define OPERATION_CASE(name) \\\n" 1113 " case OP_name: \\\n" 1114 " return operations::Operation##name\n", 1115 getLLVMStyleWithColumns(40)); 1116 verifyFormat("switch (x) {\n" 1117 "case 1:;\n" 1118 "default:;\n" 1119 " int i;\n" 1120 "}"); 1121 1122 verifyGoogleFormat("switch (x) {\n" 1123 " case 1:\n" 1124 " f();\n" 1125 " break;\n" 1126 " case kFoo:\n" 1127 " case ns::kBar:\n" 1128 " case kBaz:\n" 1129 " break;\n" 1130 " default:\n" 1131 " g();\n" 1132 " break;\n" 1133 "}"); 1134 verifyGoogleFormat("switch (x) {\n" 1135 " case 1: {\n" 1136 " f();\n" 1137 " break;\n" 1138 " }\n" 1139 "}"); 1140 verifyGoogleFormat("switch (test)\n" 1141 " ;"); 1142 1143 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1144 " case OP_name: \\\n" 1145 " return operations::Operation##name\n"); 1146 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1147 " // Get the correction operation class.\n" 1148 " switch (OpCode) {\n" 1149 " CASE(Add);\n" 1150 " CASE(Subtract);\n" 1151 " default:\n" 1152 " return operations::Unknown;\n" 1153 " }\n" 1154 "#undef OPERATION_CASE\n" 1155 "}"); 1156 verifyFormat("DEBUG({\n" 1157 " switch (x) {\n" 1158 " case A:\n" 1159 " f();\n" 1160 " break;\n" 1161 " // fallthrough\n" 1162 " case B:\n" 1163 " g();\n" 1164 " break;\n" 1165 " }\n" 1166 "});"); 1167 EXPECT_EQ("DEBUG({\n" 1168 " switch (x) {\n" 1169 " case A:\n" 1170 " f();\n" 1171 " break;\n" 1172 " // On B:\n" 1173 " case B:\n" 1174 " g();\n" 1175 " break;\n" 1176 " }\n" 1177 "});", 1178 format("DEBUG({\n" 1179 " switch (x) {\n" 1180 " case A:\n" 1181 " f();\n" 1182 " break;\n" 1183 " // On B:\n" 1184 " case B:\n" 1185 " g();\n" 1186 " break;\n" 1187 " }\n" 1188 "});", 1189 getLLVMStyle())); 1190 EXPECT_EQ("switch (n) {\n" 1191 "case 0: {\n" 1192 " return false;\n" 1193 "}\n" 1194 "default: {\n" 1195 " return true;\n" 1196 "}\n" 1197 "}", 1198 format("switch (n)\n" 1199 "{\n" 1200 "case 0: {\n" 1201 " return false;\n" 1202 "}\n" 1203 "default: {\n" 1204 " return true;\n" 1205 "}\n" 1206 "}", 1207 getLLVMStyle())); 1208 verifyFormat("switch (a) {\n" 1209 "case (b):\n" 1210 " return;\n" 1211 "}"); 1212 1213 verifyFormat("switch (a) {\n" 1214 "case some_namespace::\n" 1215 " some_constant:\n" 1216 " return;\n" 1217 "}", 1218 getLLVMStyleWithColumns(34)); 1219 1220 FormatStyle Style = getLLVMStyle(); 1221 Style.IndentCaseLabels = true; 1222 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1223 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1224 Style.BraceWrapping.AfterCaseLabel = true; 1225 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1226 EXPECT_EQ("switch (n)\n" 1227 "{\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 format("switch (n) {\n" 1238 " case 0: {\n" 1239 " return false;\n" 1240 " }\n" 1241 " default: {\n" 1242 " return true;\n" 1243 " }\n" 1244 "}", 1245 Style)); 1246 Style.BraceWrapping.AfterCaseLabel = false; 1247 EXPECT_EQ("switch (n)\n" 1248 "{\n" 1249 " case 0: {\n" 1250 " return false;\n" 1251 " }\n" 1252 " default: {\n" 1253 " return true;\n" 1254 " }\n" 1255 "}", 1256 format("switch (n) {\n" 1257 " case 0:\n" 1258 " {\n" 1259 " return false;\n" 1260 " }\n" 1261 " default:\n" 1262 " {\n" 1263 " return true;\n" 1264 " }\n" 1265 "}", 1266 Style)); 1267 Style.IndentCaseLabels = false; 1268 Style.IndentCaseBlocks = true; 1269 EXPECT_EQ("switch (n)\n" 1270 "{\n" 1271 "case 0:\n" 1272 " {\n" 1273 " return false;\n" 1274 " }\n" 1275 "case 1:\n" 1276 " break;\n" 1277 "default:\n" 1278 " {\n" 1279 " return true;\n" 1280 " }\n" 1281 "}", 1282 format("switch (n) {\n" 1283 "case 0: {\n" 1284 " return false;\n" 1285 "}\n" 1286 "case 1:\n" 1287 " break;\n" 1288 "default: {\n" 1289 " return true;\n" 1290 "}\n" 1291 "}", 1292 Style)); 1293 Style.IndentCaseLabels = true; 1294 Style.IndentCaseBlocks = true; 1295 EXPECT_EQ("switch (n)\n" 1296 "{\n" 1297 " case 0:\n" 1298 " {\n" 1299 " return false;\n" 1300 " }\n" 1301 " case 1:\n" 1302 " break;\n" 1303 " default:\n" 1304 " {\n" 1305 " return true;\n" 1306 " }\n" 1307 "}", 1308 format("switch (n) {\n" 1309 "case 0: {\n" 1310 " return false;\n" 1311 "}\n" 1312 "case 1:\n" 1313 " break;\n" 1314 "default: {\n" 1315 " return true;\n" 1316 "}\n" 1317 "}", 1318 Style)); 1319 } 1320 1321 TEST_F(FormatTest, CaseRanges) { 1322 verifyFormat("switch (x) {\n" 1323 "case 'A' ... 'Z':\n" 1324 "case 1 ... 5:\n" 1325 "case a ... b:\n" 1326 " break;\n" 1327 "}"); 1328 } 1329 1330 TEST_F(FormatTest, ShortEnums) { 1331 FormatStyle Style = getLLVMStyle(); 1332 Style.AllowShortEnumsOnASingleLine = true; 1333 verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style); 1334 Style.AllowShortEnumsOnASingleLine = false; 1335 verifyFormat("enum\n" 1336 "{\n" 1337 " A,\n" 1338 " B,\n" 1339 " C\n" 1340 "} ShortEnum1, ShortEnum2;", 1341 Style); 1342 } 1343 1344 TEST_F(FormatTest, ShortCaseLabels) { 1345 FormatStyle Style = getLLVMStyle(); 1346 Style.AllowShortCaseLabelsOnASingleLine = true; 1347 verifyFormat("switch (a) {\n" 1348 "case 1: x = 1; break;\n" 1349 "case 2: return;\n" 1350 "case 3:\n" 1351 "case 4:\n" 1352 "case 5: return;\n" 1353 "case 6: // comment\n" 1354 " return;\n" 1355 "case 7:\n" 1356 " // comment\n" 1357 " return;\n" 1358 "case 8:\n" 1359 " x = 8; // comment\n" 1360 " break;\n" 1361 "default: y = 1; break;\n" 1362 "}", 1363 Style); 1364 verifyFormat("switch (a) {\n" 1365 "case 0: return; // comment\n" 1366 "case 1: break; // comment\n" 1367 "case 2: return;\n" 1368 "// comment\n" 1369 "case 3: return;\n" 1370 "// comment 1\n" 1371 "// comment 2\n" 1372 "// comment 3\n" 1373 "case 4: break; /* comment */\n" 1374 "case 5:\n" 1375 " // comment\n" 1376 " break;\n" 1377 "case 6: /* comment */ x = 1; break;\n" 1378 "case 7: x = /* comment */ 1; break;\n" 1379 "case 8:\n" 1380 " x = 1; /* comment */\n" 1381 " break;\n" 1382 "case 9:\n" 1383 " break; // comment line 1\n" 1384 " // comment line 2\n" 1385 "}", 1386 Style); 1387 EXPECT_EQ("switch (a) {\n" 1388 "case 1:\n" 1389 " x = 8;\n" 1390 " // fall through\n" 1391 "case 2: x = 8;\n" 1392 "// comment\n" 1393 "case 3:\n" 1394 " return; /* comment line 1\n" 1395 " * comment line 2 */\n" 1396 "case 4: i = 8;\n" 1397 "// something else\n" 1398 "#if FOO\n" 1399 "case 5: break;\n" 1400 "#endif\n" 1401 "}", 1402 format("switch (a) {\n" 1403 "case 1: x = 8;\n" 1404 " // fall through\n" 1405 "case 2:\n" 1406 " x = 8;\n" 1407 "// comment\n" 1408 "case 3:\n" 1409 " return; /* comment line 1\n" 1410 " * comment line 2 */\n" 1411 "case 4:\n" 1412 " i = 8;\n" 1413 "// something else\n" 1414 "#if FOO\n" 1415 "case 5: break;\n" 1416 "#endif\n" 1417 "}", 1418 Style)); 1419 EXPECT_EQ("switch (a) {\n" 1420 "case 0:\n" 1421 " return; // long long long long long long long long long long " 1422 "long long comment\n" 1423 " // line\n" 1424 "}", 1425 format("switch (a) {\n" 1426 "case 0: return; // long long long long long long long long " 1427 "long long long long comment line\n" 1428 "}", 1429 Style)); 1430 EXPECT_EQ("switch (a) {\n" 1431 "case 0:\n" 1432 " return; /* long long long long long long long long long long " 1433 "long long comment\n" 1434 " line */\n" 1435 "}", 1436 format("switch (a) {\n" 1437 "case 0: return; /* long long long long long long long long " 1438 "long long long long comment line */\n" 1439 "}", 1440 Style)); 1441 verifyFormat("switch (a) {\n" 1442 "#if FOO\n" 1443 "case 0: return 0;\n" 1444 "#endif\n" 1445 "}", 1446 Style); 1447 verifyFormat("switch (a) {\n" 1448 "case 1: {\n" 1449 "}\n" 1450 "case 2: {\n" 1451 " return;\n" 1452 "}\n" 1453 "case 3: {\n" 1454 " x = 1;\n" 1455 " return;\n" 1456 "}\n" 1457 "case 4:\n" 1458 " if (x)\n" 1459 " return;\n" 1460 "}", 1461 Style); 1462 Style.ColumnLimit = 21; 1463 verifyFormat("switch (a) {\n" 1464 "case 1: x = 1; break;\n" 1465 "case 2: return;\n" 1466 "case 3:\n" 1467 "case 4:\n" 1468 "case 5: return;\n" 1469 "default:\n" 1470 " y = 1;\n" 1471 " break;\n" 1472 "}", 1473 Style); 1474 Style.ColumnLimit = 80; 1475 Style.AllowShortCaseLabelsOnASingleLine = false; 1476 Style.IndentCaseLabels = true; 1477 EXPECT_EQ("switch (n) {\n" 1478 " default /*comments*/:\n" 1479 " return true;\n" 1480 " case 0:\n" 1481 " return false;\n" 1482 "}", 1483 format("switch (n) {\n" 1484 "default/*comments*/:\n" 1485 " return true;\n" 1486 "case 0:\n" 1487 " return false;\n" 1488 "}", 1489 Style)); 1490 Style.AllowShortCaseLabelsOnASingleLine = true; 1491 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1492 Style.BraceWrapping.AfterCaseLabel = true; 1493 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 1494 EXPECT_EQ("switch (n)\n" 1495 "{\n" 1496 " case 0:\n" 1497 " {\n" 1498 " return false;\n" 1499 " }\n" 1500 " default:\n" 1501 " {\n" 1502 " return true;\n" 1503 " }\n" 1504 "}", 1505 format("switch (n) {\n" 1506 " case 0: {\n" 1507 " return false;\n" 1508 " }\n" 1509 " default:\n" 1510 " {\n" 1511 " return true;\n" 1512 " }\n" 1513 "}", 1514 Style)); 1515 } 1516 1517 TEST_F(FormatTest, FormatsLabels) { 1518 verifyFormat("void f() {\n" 1519 " some_code();\n" 1520 "test_label:\n" 1521 " some_other_code();\n" 1522 " {\n" 1523 " some_more_code();\n" 1524 " another_label:\n" 1525 " some_more_code();\n" 1526 " }\n" 1527 "}"); 1528 verifyFormat("{\n" 1529 " some_code();\n" 1530 "test_label:\n" 1531 " some_other_code();\n" 1532 "}"); 1533 verifyFormat("{\n" 1534 " some_code();\n" 1535 "test_label:;\n" 1536 " int i = 0;\n" 1537 "}"); 1538 FormatStyle Style = getLLVMStyle(); 1539 Style.IndentGotoLabels = false; 1540 verifyFormat("void f() {\n" 1541 " some_code();\n" 1542 "test_label:\n" 1543 " some_other_code();\n" 1544 " {\n" 1545 " some_more_code();\n" 1546 "another_label:\n" 1547 " some_more_code();\n" 1548 " }\n" 1549 "}", 1550 Style); 1551 verifyFormat("{\n" 1552 " some_code();\n" 1553 "test_label:\n" 1554 " some_other_code();\n" 1555 "}", 1556 Style); 1557 verifyFormat("{\n" 1558 " some_code();\n" 1559 "test_label:;\n" 1560 " int i = 0;\n" 1561 "}"); 1562 } 1563 1564 TEST_F(FormatTest, MultiLineControlStatements) { 1565 FormatStyle Style = getLLVMStyle(); 1566 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1567 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine; 1568 Style.ColumnLimit = 20; 1569 // Short lines should keep opening brace on same line. 1570 EXPECT_EQ("if (foo) {\n" 1571 " bar();\n" 1572 "}", 1573 format("if(foo){bar();}", Style)); 1574 EXPECT_EQ("if (foo) {\n" 1575 " bar();\n" 1576 "} else {\n" 1577 " baz();\n" 1578 "}", 1579 format("if(foo){bar();}else{baz();}", Style)); 1580 EXPECT_EQ("if (foo && bar) {\n" 1581 " baz();\n" 1582 "}", 1583 format("if(foo&&bar){baz();}", Style)); 1584 EXPECT_EQ("if (foo) {\n" 1585 " bar();\n" 1586 "} else if (baz) {\n" 1587 " quux();\n" 1588 "}", 1589 format("if(foo){bar();}else if(baz){quux();}", Style)); 1590 EXPECT_EQ( 1591 "if (foo) {\n" 1592 " bar();\n" 1593 "} else if (baz) {\n" 1594 " quux();\n" 1595 "} else {\n" 1596 " foobar();\n" 1597 "}", 1598 format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style)); 1599 EXPECT_EQ("for (;;) {\n" 1600 " foo();\n" 1601 "}", 1602 format("for(;;){foo();}")); 1603 EXPECT_EQ("while (1) {\n" 1604 " foo();\n" 1605 "}", 1606 format("while(1){foo();}", Style)); 1607 EXPECT_EQ("switch (foo) {\n" 1608 "case bar:\n" 1609 " return;\n" 1610 "}", 1611 format("switch(foo){case bar:return;}", Style)); 1612 EXPECT_EQ("try {\n" 1613 " foo();\n" 1614 "} catch (...) {\n" 1615 " bar();\n" 1616 "}", 1617 format("try{foo();}catch(...){bar();}", Style)); 1618 EXPECT_EQ("do {\n" 1619 " foo();\n" 1620 "} while (bar &&\n" 1621 " baz);", 1622 format("do{foo();}while(bar&&baz);", Style)); 1623 // Long lines should put opening brace on new line. 1624 EXPECT_EQ("if (foo && bar &&\n" 1625 " baz)\n" 1626 "{\n" 1627 " quux();\n" 1628 "}", 1629 format("if(foo&&bar&&baz){quux();}", Style)); 1630 EXPECT_EQ("if (foo && bar &&\n" 1631 " baz)\n" 1632 "{\n" 1633 " quux();\n" 1634 "}", 1635 format("if (foo && bar &&\n" 1636 " baz) {\n" 1637 " quux();\n" 1638 "}", 1639 Style)); 1640 EXPECT_EQ("if (foo) {\n" 1641 " bar();\n" 1642 "} else if (baz ||\n" 1643 " quux)\n" 1644 "{\n" 1645 " foobar();\n" 1646 "}", 1647 format("if(foo){bar();}else if(baz||quux){foobar();}", Style)); 1648 EXPECT_EQ( 1649 "if (foo) {\n" 1650 " bar();\n" 1651 "} else if (baz ||\n" 1652 " quux)\n" 1653 "{\n" 1654 " foobar();\n" 1655 "} else {\n" 1656 " barbaz();\n" 1657 "}", 1658 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1659 Style)); 1660 EXPECT_EQ("for (int i = 0;\n" 1661 " i < 10; ++i)\n" 1662 "{\n" 1663 " foo();\n" 1664 "}", 1665 format("for(int i=0;i<10;++i){foo();}", Style)); 1666 EXPECT_EQ("while (foo || bar ||\n" 1667 " baz)\n" 1668 "{\n" 1669 " quux();\n" 1670 "}", 1671 format("while(foo||bar||baz){quux();}", Style)); 1672 EXPECT_EQ("switch (\n" 1673 " foo = barbaz)\n" 1674 "{\n" 1675 "case quux:\n" 1676 " return;\n" 1677 "}", 1678 format("switch(foo=barbaz){case quux:return;}", Style)); 1679 EXPECT_EQ("try {\n" 1680 " foo();\n" 1681 "} catch (\n" 1682 " Exception &bar)\n" 1683 "{\n" 1684 " baz();\n" 1685 "}", 1686 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1687 Style.ColumnLimit = 1688 40; // to concentrate at brace wrapping, not line wrap due to column limit 1689 EXPECT_EQ("try {\n" 1690 " foo();\n" 1691 "} catch (Exception &bar) {\n" 1692 " baz();\n" 1693 "}", 1694 format("try{foo();}catch(Exception&bar){baz();}", Style)); 1695 Style.ColumnLimit = 1696 20; // to concentrate at brace wrapping, not line wrap due to column limit 1697 1698 Style.BraceWrapping.BeforeElse = true; 1699 EXPECT_EQ( 1700 "if (foo) {\n" 1701 " bar();\n" 1702 "}\n" 1703 "else if (baz ||\n" 1704 " quux)\n" 1705 "{\n" 1706 " foobar();\n" 1707 "}\n" 1708 "else {\n" 1709 " barbaz();\n" 1710 "}", 1711 format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}", 1712 Style)); 1713 1714 Style.BraceWrapping.BeforeCatch = true; 1715 EXPECT_EQ("try {\n" 1716 " foo();\n" 1717 "}\n" 1718 "catch (...) {\n" 1719 " baz();\n" 1720 "}", 1721 format("try{foo();}catch(...){baz();}", Style)); 1722 } 1723 1724 TEST_F(FormatTest, BeforeWhile) { 1725 FormatStyle Style = getLLVMStyle(); 1726 Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom; 1727 1728 verifyFormat("do {\n" 1729 " foo();\n" 1730 "} while (1);", 1731 Style); 1732 Style.BraceWrapping.BeforeWhile = true; 1733 verifyFormat("do {\n" 1734 " foo();\n" 1735 "}\n" 1736 "while (1);", 1737 Style); 1738 } 1739 1740 //===----------------------------------------------------------------------===// 1741 // Tests for classes, namespaces, etc. 1742 //===----------------------------------------------------------------------===// 1743 1744 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1745 verifyFormat("class A {};"); 1746 } 1747 1748 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1749 verifyFormat("class A {\n" 1750 "public:\n" 1751 "public: // comment\n" 1752 "protected:\n" 1753 "private:\n" 1754 " void f() {}\n" 1755 "};"); 1756 verifyFormat("export class A {\n" 1757 "public:\n" 1758 "public: // comment\n" 1759 "protected:\n" 1760 "private:\n" 1761 " void f() {}\n" 1762 "};"); 1763 verifyGoogleFormat("class A {\n" 1764 " public:\n" 1765 " protected:\n" 1766 " private:\n" 1767 " void f() {}\n" 1768 "};"); 1769 verifyGoogleFormat("export class A {\n" 1770 " public:\n" 1771 " protected:\n" 1772 " private:\n" 1773 " void f() {}\n" 1774 "};"); 1775 verifyFormat("class A {\n" 1776 "public slots:\n" 1777 " void f1() {}\n" 1778 "public Q_SLOTS:\n" 1779 " void f2() {}\n" 1780 "protected slots:\n" 1781 " void f3() {}\n" 1782 "protected Q_SLOTS:\n" 1783 " void f4() {}\n" 1784 "private slots:\n" 1785 " void f5() {}\n" 1786 "private Q_SLOTS:\n" 1787 " void f6() {}\n" 1788 "signals:\n" 1789 " void g1();\n" 1790 "Q_SIGNALS:\n" 1791 " void g2();\n" 1792 "};"); 1793 1794 // Don't interpret 'signals' the wrong way. 1795 verifyFormat("signals.set();"); 1796 verifyFormat("for (Signals signals : f()) {\n}"); 1797 verifyFormat("{\n" 1798 " signals.set(); // This needs indentation.\n" 1799 "}"); 1800 verifyFormat("void f() {\n" 1801 "label:\n" 1802 " signals.baz();\n" 1803 "}"); 1804 } 1805 1806 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1807 EXPECT_EQ("class A {\n" 1808 "public:\n" 1809 " void f();\n" 1810 "\n" 1811 "private:\n" 1812 " void g() {}\n" 1813 " // test\n" 1814 "protected:\n" 1815 " int h;\n" 1816 "};", 1817 format("class A {\n" 1818 "public:\n" 1819 "void f();\n" 1820 "private:\n" 1821 "void g() {}\n" 1822 "// test\n" 1823 "protected:\n" 1824 "int h;\n" 1825 "};")); 1826 EXPECT_EQ("class A {\n" 1827 "protected:\n" 1828 "public:\n" 1829 " void f();\n" 1830 "};", 1831 format("class A {\n" 1832 "protected:\n" 1833 "\n" 1834 "public:\n" 1835 "\n" 1836 " void f();\n" 1837 "};")); 1838 1839 // Even ensure proper spacing inside macros. 1840 EXPECT_EQ("#define B \\\n" 1841 " class A { \\\n" 1842 " protected: \\\n" 1843 " public: \\\n" 1844 " void f(); \\\n" 1845 " };", 1846 format("#define B \\\n" 1847 " class A { \\\n" 1848 " protected: \\\n" 1849 " \\\n" 1850 " public: \\\n" 1851 " \\\n" 1852 " void f(); \\\n" 1853 " };", 1854 getGoogleStyle())); 1855 // But don't remove empty lines after macros ending in access specifiers. 1856 EXPECT_EQ("#define A private:\n" 1857 "\n" 1858 "int i;", 1859 format("#define A private:\n" 1860 "\n" 1861 "int i;")); 1862 } 1863 1864 TEST_F(FormatTest, FormatsClasses) { 1865 verifyFormat("class A : public B {};"); 1866 verifyFormat("class A : public ::B {};"); 1867 1868 verifyFormat( 1869 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1870 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1871 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1872 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1873 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1874 verifyFormat( 1875 "class A : public B, public C, public D, public E, public F {};"); 1876 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1877 " public C,\n" 1878 " public D,\n" 1879 " public E,\n" 1880 " public F,\n" 1881 " public G {};"); 1882 1883 verifyFormat("class\n" 1884 " ReallyReallyLongClassName {\n" 1885 " int i;\n" 1886 "};", 1887 getLLVMStyleWithColumns(32)); 1888 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1889 " aaaaaaaaaaaaaaaa> {};"); 1890 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1891 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1892 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1893 verifyFormat("template <class R, class C>\n" 1894 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1895 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1896 verifyFormat("class ::A::B {};"); 1897 } 1898 1899 TEST_F(FormatTest, BreakInheritanceStyle) { 1900 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1901 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1902 FormatStyle::BILS_BeforeComma; 1903 verifyFormat("class MyClass : public X {};", 1904 StyleWithInheritanceBreakBeforeComma); 1905 verifyFormat("class MyClass\n" 1906 " : public X\n" 1907 " , public Y {};", 1908 StyleWithInheritanceBreakBeforeComma); 1909 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1910 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1911 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1912 StyleWithInheritanceBreakBeforeComma); 1913 verifyFormat("struct aaaaaaaaaaaaa\n" 1914 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1915 " aaaaaaaaaaaaaaaa> {};", 1916 StyleWithInheritanceBreakBeforeComma); 1917 1918 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1919 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1920 FormatStyle::BILS_AfterColon; 1921 verifyFormat("class MyClass : public X {};", 1922 StyleWithInheritanceBreakAfterColon); 1923 verifyFormat("class MyClass : public X, public Y {};", 1924 StyleWithInheritanceBreakAfterColon); 1925 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1926 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1927 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1928 StyleWithInheritanceBreakAfterColon); 1929 verifyFormat("struct aaaaaaaaaaaaa :\n" 1930 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1931 " aaaaaaaaaaaaaaaa> {};", 1932 StyleWithInheritanceBreakAfterColon); 1933 } 1934 1935 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1936 verifyFormat("class A {\n} a, b;"); 1937 verifyFormat("struct A {\n} a, b;"); 1938 verifyFormat("union A {\n} a;"); 1939 } 1940 1941 TEST_F(FormatTest, FormatsEnum) { 1942 verifyFormat("enum {\n" 1943 " Zero,\n" 1944 " One = 1,\n" 1945 " Two = One + 1,\n" 1946 " Three = (One + Two),\n" 1947 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1948 " Five = (One, Two, Three, Four, 5)\n" 1949 "};"); 1950 verifyGoogleFormat("enum {\n" 1951 " Zero,\n" 1952 " One = 1,\n" 1953 " Two = One + 1,\n" 1954 " Three = (One + Two),\n" 1955 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1956 " Five = (One, Two, Three, Four, 5)\n" 1957 "};"); 1958 verifyFormat("enum Enum {};"); 1959 verifyFormat("enum {};"); 1960 verifyFormat("enum X E {} d;"); 1961 verifyFormat("enum __attribute__((...)) E {} d;"); 1962 verifyFormat("enum __declspec__((...)) E {} d;"); 1963 verifyFormat("enum {\n" 1964 " Bar = Foo<int, int>::value\n" 1965 "};", 1966 getLLVMStyleWithColumns(30)); 1967 1968 verifyFormat("enum ShortEnum { A, B, C };"); 1969 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1970 1971 EXPECT_EQ("enum KeepEmptyLines {\n" 1972 " ONE,\n" 1973 "\n" 1974 " TWO,\n" 1975 "\n" 1976 " THREE\n" 1977 "}", 1978 format("enum KeepEmptyLines {\n" 1979 " ONE,\n" 1980 "\n" 1981 " TWO,\n" 1982 "\n" 1983 "\n" 1984 " THREE\n" 1985 "}")); 1986 verifyFormat("enum E { // comment\n" 1987 " ONE,\n" 1988 " TWO\n" 1989 "};\n" 1990 "int i;"); 1991 1992 FormatStyle EightIndent = getLLVMStyle(); 1993 EightIndent.IndentWidth = 8; 1994 verifyFormat("enum {\n" 1995 " VOID,\n" 1996 " CHAR,\n" 1997 " SHORT,\n" 1998 " INT,\n" 1999 " LONG,\n" 2000 " SIGNED,\n" 2001 " UNSIGNED,\n" 2002 " BOOL,\n" 2003 " FLOAT,\n" 2004 " DOUBLE,\n" 2005 " COMPLEX\n" 2006 "};", 2007 EightIndent); 2008 2009 // Not enums. 2010 verifyFormat("enum X f() {\n" 2011 " a();\n" 2012 " return 42;\n" 2013 "}"); 2014 verifyFormat("enum X Type::f() {\n" 2015 " a();\n" 2016 " return 42;\n" 2017 "}"); 2018 verifyFormat("enum ::X f() {\n" 2019 " a();\n" 2020 " return 42;\n" 2021 "}"); 2022 verifyFormat("enum ns::X f() {\n" 2023 " a();\n" 2024 " return 42;\n" 2025 "}"); 2026 } 2027 2028 TEST_F(FormatTest, FormatsEnumsWithErrors) { 2029 verifyFormat("enum Type {\n" 2030 " One = 0; // These semicolons should be commas.\n" 2031 " Two = 1;\n" 2032 "};"); 2033 verifyFormat("namespace n {\n" 2034 "enum Type {\n" 2035 " One,\n" 2036 " Two, // missing };\n" 2037 " int i;\n" 2038 "}\n" 2039 "void g() {}"); 2040 } 2041 2042 TEST_F(FormatTest, FormatsEnumStruct) { 2043 verifyFormat("enum struct {\n" 2044 " Zero,\n" 2045 " One = 1,\n" 2046 " Two = One + 1,\n" 2047 " Three = (One + Two),\n" 2048 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2049 " Five = (One, Two, Three, Four, 5)\n" 2050 "};"); 2051 verifyFormat("enum struct Enum {};"); 2052 verifyFormat("enum struct {};"); 2053 verifyFormat("enum struct X E {} d;"); 2054 verifyFormat("enum struct __attribute__((...)) E {} d;"); 2055 verifyFormat("enum struct __declspec__((...)) E {} d;"); 2056 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 2057 } 2058 2059 TEST_F(FormatTest, FormatsEnumClass) { 2060 verifyFormat("enum class {\n" 2061 " Zero,\n" 2062 " One = 1,\n" 2063 " Two = One + 1,\n" 2064 " Three = (One + Two),\n" 2065 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2066 " Five = (One, Two, Three, Four, 5)\n" 2067 "};"); 2068 verifyFormat("enum class Enum {};"); 2069 verifyFormat("enum class {};"); 2070 verifyFormat("enum class X E {} d;"); 2071 verifyFormat("enum class __attribute__((...)) E {} d;"); 2072 verifyFormat("enum class __declspec__((...)) E {} d;"); 2073 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 2074 } 2075 2076 TEST_F(FormatTest, FormatsEnumTypes) { 2077 verifyFormat("enum X : int {\n" 2078 " A, // Force multiple lines.\n" 2079 " B\n" 2080 "};"); 2081 verifyFormat("enum X : int { A, B };"); 2082 verifyFormat("enum X : std::uint32_t { A, B };"); 2083 } 2084 2085 TEST_F(FormatTest, FormatsTypedefEnum) { 2086 FormatStyle Style = getLLVMStyle(); 2087 Style.ColumnLimit = 40; 2088 verifyFormat("typedef enum {} EmptyEnum;"); 2089 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2090 verifyFormat("typedef enum {\n" 2091 " ZERO = 0,\n" 2092 " ONE = 1,\n" 2093 " TWO = 2,\n" 2094 " THREE = 3\n" 2095 "} LongEnum;", 2096 Style); 2097 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2098 Style.BraceWrapping.AfterEnum = true; 2099 verifyFormat("typedef enum {} EmptyEnum;"); 2100 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 2101 verifyFormat("typedef enum\n" 2102 "{\n" 2103 " ZERO = 0,\n" 2104 " ONE = 1,\n" 2105 " TWO = 2,\n" 2106 " THREE = 3\n" 2107 "} LongEnum;", 2108 Style); 2109 } 2110 2111 TEST_F(FormatTest, FormatsNSEnums) { 2112 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2113 verifyGoogleFormat( 2114 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 2115 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 2116 " // Information about someDecentlyLongValue.\n" 2117 " someDecentlyLongValue,\n" 2118 " // Information about anotherDecentlyLongValue.\n" 2119 " anotherDecentlyLongValue,\n" 2120 " // Information about aThirdDecentlyLongValue.\n" 2121 " aThirdDecentlyLongValue\n" 2122 "};"); 2123 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 2124 " // Information about someDecentlyLongValue.\n" 2125 " someDecentlyLongValue,\n" 2126 " // Information about anotherDecentlyLongValue.\n" 2127 " anotherDecentlyLongValue,\n" 2128 " // Information about aThirdDecentlyLongValue.\n" 2129 " aThirdDecentlyLongValue\n" 2130 "};"); 2131 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 2132 " a = 1,\n" 2133 " b = 2,\n" 2134 " c = 3,\n" 2135 "};"); 2136 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 2137 " a = 1,\n" 2138 " b = 2,\n" 2139 " c = 3,\n" 2140 "};"); 2141 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 2142 " a = 1,\n" 2143 " b = 2,\n" 2144 " c = 3,\n" 2145 "};"); 2146 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 2147 " a = 1,\n" 2148 " b = 2,\n" 2149 " c = 3,\n" 2150 "};"); 2151 } 2152 2153 TEST_F(FormatTest, FormatsBitfields) { 2154 verifyFormat("struct Bitfields {\n" 2155 " unsigned sClass : 8;\n" 2156 " unsigned ValueKind : 2;\n" 2157 "};"); 2158 verifyFormat("struct A {\n" 2159 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 2160 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 2161 "};"); 2162 verifyFormat("struct MyStruct {\n" 2163 " uchar data;\n" 2164 " uchar : 8;\n" 2165 " uchar : 8;\n" 2166 " uchar other;\n" 2167 "};"); 2168 FormatStyle Style = getLLVMStyle(); 2169 Style.BitFieldColonSpacing = FormatStyle::BFCS_None; 2170 verifyFormat("struct Bitfields {\n" 2171 " unsigned sClass:8;\n" 2172 " unsigned ValueKind:2;\n" 2173 " uchar other;\n" 2174 "};", 2175 Style); 2176 verifyFormat("struct A {\n" 2177 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:1,\n" 2178 " bbbbbbbbbbbbbbbbbbbbbbbbb:2;\n" 2179 "};", 2180 Style); 2181 Style.BitFieldColonSpacing = FormatStyle::BFCS_Before; 2182 verifyFormat("struct Bitfields {\n" 2183 " unsigned sClass :8;\n" 2184 " unsigned ValueKind :2;\n" 2185 " uchar other;\n" 2186 "};", 2187 Style); 2188 Style.BitFieldColonSpacing = FormatStyle::BFCS_After; 2189 verifyFormat("struct Bitfields {\n" 2190 " unsigned sClass: 8;\n" 2191 " unsigned ValueKind: 2;\n" 2192 " uchar other;\n" 2193 "};", 2194 Style); 2195 } 2196 2197 TEST_F(FormatTest, FormatsNamespaces) { 2198 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 2199 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 2200 2201 verifyFormat("namespace some_namespace {\n" 2202 "class A {};\n" 2203 "void f() { f(); }\n" 2204 "}", 2205 LLVMWithNoNamespaceFix); 2206 verifyFormat("namespace N::inline D {\n" 2207 "class A {};\n" 2208 "void f() { f(); }\n" 2209 "}", 2210 LLVMWithNoNamespaceFix); 2211 verifyFormat("namespace N::inline D::E {\n" 2212 "class A {};\n" 2213 "void f() { f(); }\n" 2214 "}", 2215 LLVMWithNoNamespaceFix); 2216 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 2217 "class A {};\n" 2218 "void f() { f(); }\n" 2219 "}", 2220 LLVMWithNoNamespaceFix); 2221 verifyFormat("/* something */ namespace some_namespace {\n" 2222 "class A {};\n" 2223 "void f() { f(); }\n" 2224 "}", 2225 LLVMWithNoNamespaceFix); 2226 verifyFormat("namespace {\n" 2227 "class A {};\n" 2228 "void f() { f(); }\n" 2229 "}", 2230 LLVMWithNoNamespaceFix); 2231 verifyFormat("/* something */ namespace {\n" 2232 "class A {};\n" 2233 "void f() { f(); }\n" 2234 "}", 2235 LLVMWithNoNamespaceFix); 2236 verifyFormat("inline namespace X {\n" 2237 "class A {};\n" 2238 "void f() { f(); }\n" 2239 "}", 2240 LLVMWithNoNamespaceFix); 2241 verifyFormat("/* something */ inline namespace X {\n" 2242 "class A {};\n" 2243 "void f() { f(); }\n" 2244 "}", 2245 LLVMWithNoNamespaceFix); 2246 verifyFormat("export namespace X {\n" 2247 "class A {};\n" 2248 "void f() { f(); }\n" 2249 "}", 2250 LLVMWithNoNamespaceFix); 2251 verifyFormat("using namespace some_namespace;\n" 2252 "class A {};\n" 2253 "void f() { f(); }", 2254 LLVMWithNoNamespaceFix); 2255 2256 // This code is more common than we thought; if we 2257 // layout this correctly the semicolon will go into 2258 // its own line, which is undesirable. 2259 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 2260 verifyFormat("namespace {\n" 2261 "class A {};\n" 2262 "};", 2263 LLVMWithNoNamespaceFix); 2264 2265 verifyFormat("namespace {\n" 2266 "int SomeVariable = 0; // comment\n" 2267 "} // namespace", 2268 LLVMWithNoNamespaceFix); 2269 EXPECT_EQ("#ifndef HEADER_GUARD\n" 2270 "#define HEADER_GUARD\n" 2271 "namespace my_namespace {\n" 2272 "int i;\n" 2273 "} // my_namespace\n" 2274 "#endif // HEADER_GUARD", 2275 format("#ifndef HEADER_GUARD\n" 2276 " #define HEADER_GUARD\n" 2277 " namespace my_namespace {\n" 2278 "int i;\n" 2279 "} // my_namespace\n" 2280 "#endif // HEADER_GUARD", 2281 LLVMWithNoNamespaceFix)); 2282 2283 EXPECT_EQ("namespace A::B {\n" 2284 "class C {};\n" 2285 "}", 2286 format("namespace A::B {\n" 2287 "class C {};\n" 2288 "}", 2289 LLVMWithNoNamespaceFix)); 2290 2291 FormatStyle Style = getLLVMStyle(); 2292 Style.NamespaceIndentation = FormatStyle::NI_All; 2293 EXPECT_EQ("namespace out {\n" 2294 " int i;\n" 2295 " namespace in {\n" 2296 " int i;\n" 2297 " } // namespace in\n" 2298 "} // namespace out", 2299 format("namespace out {\n" 2300 "int i;\n" 2301 "namespace in {\n" 2302 "int i;\n" 2303 "} // namespace in\n" 2304 "} // namespace out", 2305 Style)); 2306 2307 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2308 EXPECT_EQ("namespace out {\n" 2309 "int i;\n" 2310 "namespace in {\n" 2311 " int i;\n" 2312 "} // namespace in\n" 2313 "} // namespace out", 2314 format("namespace out {\n" 2315 "int i;\n" 2316 "namespace in {\n" 2317 "int i;\n" 2318 "} // namespace in\n" 2319 "} // namespace out", 2320 Style)); 2321 } 2322 2323 TEST_F(FormatTest, NamespaceMacros) { 2324 FormatStyle Style = getLLVMStyle(); 2325 Style.NamespaceMacros.push_back("TESTSUITE"); 2326 2327 verifyFormat("TESTSUITE(A) {\n" 2328 "int foo();\n" 2329 "} // TESTSUITE(A)", 2330 Style); 2331 2332 verifyFormat("TESTSUITE(A, B) {\n" 2333 "int foo();\n" 2334 "} // TESTSUITE(A)", 2335 Style); 2336 2337 // Properly indent according to NamespaceIndentation style 2338 Style.NamespaceIndentation = FormatStyle::NI_All; 2339 verifyFormat("TESTSUITE(A) {\n" 2340 " int foo();\n" 2341 "} // TESTSUITE(A)", 2342 Style); 2343 verifyFormat("TESTSUITE(A) {\n" 2344 " namespace B {\n" 2345 " int foo();\n" 2346 " } // namespace B\n" 2347 "} // TESTSUITE(A)", 2348 Style); 2349 verifyFormat("namespace A {\n" 2350 " TESTSUITE(B) {\n" 2351 " int foo();\n" 2352 " } // TESTSUITE(B)\n" 2353 "} // namespace A", 2354 Style); 2355 2356 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2357 verifyFormat("TESTSUITE(A) {\n" 2358 "TESTSUITE(B) {\n" 2359 " int foo();\n" 2360 "} // TESTSUITE(B)\n" 2361 "} // TESTSUITE(A)", 2362 Style); 2363 verifyFormat("TESTSUITE(A) {\n" 2364 "namespace B {\n" 2365 " int foo();\n" 2366 "} // namespace B\n" 2367 "} // TESTSUITE(A)", 2368 Style); 2369 verifyFormat("namespace A {\n" 2370 "TESTSUITE(B) {\n" 2371 " int foo();\n" 2372 "} // TESTSUITE(B)\n" 2373 "} // namespace A", 2374 Style); 2375 2376 // Properly merge namespace-macros blocks in CompactNamespaces mode 2377 Style.NamespaceIndentation = FormatStyle::NI_None; 2378 Style.CompactNamespaces = true; 2379 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2380 "}} // TESTSUITE(A::B)", 2381 Style); 2382 2383 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2384 "}} // TESTSUITE(out::in)", 2385 format("TESTSUITE(out) {\n" 2386 "TESTSUITE(in) {\n" 2387 "} // TESTSUITE(in)\n" 2388 "} // TESTSUITE(out)", 2389 Style)); 2390 2391 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2392 "}} // TESTSUITE(out::in)", 2393 format("TESTSUITE(out) {\n" 2394 "TESTSUITE(in) {\n" 2395 "} // TESTSUITE(in)\n" 2396 "} // TESTSUITE(out)", 2397 Style)); 2398 2399 // Do not merge different namespaces/macros 2400 EXPECT_EQ("namespace out {\n" 2401 "TESTSUITE(in) {\n" 2402 "} // TESTSUITE(in)\n" 2403 "} // namespace out", 2404 format("namespace out {\n" 2405 "TESTSUITE(in) {\n" 2406 "} // TESTSUITE(in)\n" 2407 "} // namespace out", 2408 Style)); 2409 EXPECT_EQ("TESTSUITE(out) {\n" 2410 "namespace in {\n" 2411 "} // namespace in\n" 2412 "} // TESTSUITE(out)", 2413 format("TESTSUITE(out) {\n" 2414 "namespace in {\n" 2415 "} // namespace in\n" 2416 "} // TESTSUITE(out)", 2417 Style)); 2418 Style.NamespaceMacros.push_back("FOOBAR"); 2419 EXPECT_EQ("TESTSUITE(out) {\n" 2420 "FOOBAR(in) {\n" 2421 "} // FOOBAR(in)\n" 2422 "} // TESTSUITE(out)", 2423 format("TESTSUITE(out) {\n" 2424 "FOOBAR(in) {\n" 2425 "} // FOOBAR(in)\n" 2426 "} // TESTSUITE(out)", 2427 Style)); 2428 } 2429 2430 TEST_F(FormatTest, FormatsCompactNamespaces) { 2431 FormatStyle Style = getLLVMStyle(); 2432 Style.CompactNamespaces = true; 2433 Style.NamespaceMacros.push_back("TESTSUITE"); 2434 2435 verifyFormat("namespace A { namespace B {\n" 2436 "}} // namespace A::B", 2437 Style); 2438 2439 EXPECT_EQ("namespace out { namespace in {\n" 2440 "}} // namespace out::in", 2441 format("namespace out {\n" 2442 "namespace in {\n" 2443 "} // namespace in\n" 2444 "} // namespace out", 2445 Style)); 2446 2447 // Only namespaces which have both consecutive opening and end get compacted 2448 EXPECT_EQ("namespace out {\n" 2449 "namespace in1 {\n" 2450 "} // namespace in1\n" 2451 "namespace in2 {\n" 2452 "} // namespace in2\n" 2453 "} // namespace out", 2454 format("namespace out {\n" 2455 "namespace in1 {\n" 2456 "} // namespace in1\n" 2457 "namespace in2 {\n" 2458 "} // namespace in2\n" 2459 "} // namespace out", 2460 Style)); 2461 2462 EXPECT_EQ("namespace out {\n" 2463 "int i;\n" 2464 "namespace in {\n" 2465 "int j;\n" 2466 "} // namespace in\n" 2467 "int k;\n" 2468 "} // namespace out", 2469 format("namespace out { int i;\n" 2470 "namespace in { int j; } // namespace in\n" 2471 "int k; } // namespace out", 2472 Style)); 2473 2474 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2475 "}}} // namespace A::B::C\n", 2476 format("namespace A { namespace B {\n" 2477 "namespace C {\n" 2478 "}} // namespace B::C\n" 2479 "} // namespace A\n", 2480 Style)); 2481 2482 Style.ColumnLimit = 40; 2483 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2484 "namespace bbbbbbbbbb {\n" 2485 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2486 format("namespace aaaaaaaaaa {\n" 2487 "namespace bbbbbbbbbb {\n" 2488 "} // namespace bbbbbbbbbb\n" 2489 "} // namespace aaaaaaaaaa", 2490 Style)); 2491 2492 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2493 "namespace cccccc {\n" 2494 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2495 format("namespace aaaaaa {\n" 2496 "namespace bbbbbb {\n" 2497 "namespace cccccc {\n" 2498 "} // namespace cccccc\n" 2499 "} // namespace bbbbbb\n" 2500 "} // namespace aaaaaa", 2501 Style)); 2502 Style.ColumnLimit = 80; 2503 2504 // Extra semicolon after 'inner' closing brace prevents merging 2505 EXPECT_EQ("namespace out { namespace in {\n" 2506 "}; } // namespace out::in", 2507 format("namespace out {\n" 2508 "namespace in {\n" 2509 "}; // namespace in\n" 2510 "} // namespace out", 2511 Style)); 2512 2513 // Extra semicolon after 'outer' closing brace is conserved 2514 EXPECT_EQ("namespace out { namespace in {\n" 2515 "}}; // namespace out::in", 2516 format("namespace out {\n" 2517 "namespace in {\n" 2518 "} // namespace in\n" 2519 "}; // namespace out", 2520 Style)); 2521 2522 Style.NamespaceIndentation = FormatStyle::NI_All; 2523 EXPECT_EQ("namespace out { namespace in {\n" 2524 " int i;\n" 2525 "}} // namespace out::in", 2526 format("namespace out {\n" 2527 "namespace in {\n" 2528 "int i;\n" 2529 "} // namespace in\n" 2530 "} // namespace out", 2531 Style)); 2532 EXPECT_EQ("namespace out { namespace mid {\n" 2533 " namespace in {\n" 2534 " int j;\n" 2535 " } // namespace in\n" 2536 " int k;\n" 2537 "}} // namespace out::mid", 2538 format("namespace out { namespace mid {\n" 2539 "namespace in { int j; } // namespace in\n" 2540 "int k; }} // namespace out::mid", 2541 Style)); 2542 2543 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2544 EXPECT_EQ("namespace out { namespace in {\n" 2545 " int i;\n" 2546 "}} // namespace out::in", 2547 format("namespace out {\n" 2548 "namespace in {\n" 2549 "int i;\n" 2550 "} // namespace in\n" 2551 "} // namespace out", 2552 Style)); 2553 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2554 " int i;\n" 2555 "}}} // namespace out::mid::in", 2556 format("namespace out {\n" 2557 "namespace mid {\n" 2558 "namespace in {\n" 2559 "int i;\n" 2560 "} // namespace in\n" 2561 "} // namespace mid\n" 2562 "} // namespace out", 2563 Style)); 2564 } 2565 2566 TEST_F(FormatTest, FormatsExternC) { 2567 verifyFormat("extern \"C\" {\nint a;"); 2568 verifyFormat("extern \"C\" {}"); 2569 verifyFormat("extern \"C\" {\n" 2570 "int foo();\n" 2571 "}"); 2572 verifyFormat("extern \"C\" int foo() {}"); 2573 verifyFormat("extern \"C\" int foo();"); 2574 verifyFormat("extern \"C\" int foo() {\n" 2575 " int i = 42;\n" 2576 " return i;\n" 2577 "}"); 2578 2579 FormatStyle Style = getLLVMStyle(); 2580 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2581 Style.BraceWrapping.AfterFunction = true; 2582 verifyFormat("extern \"C\" int foo() {}", Style); 2583 verifyFormat("extern \"C\" int foo();", Style); 2584 verifyFormat("extern \"C\" int foo()\n" 2585 "{\n" 2586 " int i = 42;\n" 2587 " return i;\n" 2588 "}", 2589 Style); 2590 2591 Style.BraceWrapping.AfterExternBlock = true; 2592 Style.BraceWrapping.SplitEmptyRecord = false; 2593 verifyFormat("extern \"C\"\n" 2594 "{}", 2595 Style); 2596 verifyFormat("extern \"C\"\n" 2597 "{\n" 2598 " int foo();\n" 2599 "}", 2600 Style); 2601 } 2602 2603 TEST_F(FormatTest, IndentExternBlockStyle) { 2604 FormatStyle Style = getLLVMStyle(); 2605 Style.IndentWidth = 2; 2606 2607 Style.IndentExternBlock = FormatStyle::IEBS_Indent; 2608 verifyFormat("extern \"C\" { /*9*/\n}", Style); 2609 verifyFormat("extern \"C\" {\n" 2610 " int foo10();\n" 2611 "}", 2612 Style); 2613 2614 Style.IndentExternBlock = FormatStyle::IEBS_NoIndent; 2615 verifyFormat("extern \"C\" { /*11*/\n}", Style); 2616 verifyFormat("extern \"C\" {\n" 2617 "int foo12();\n" 2618 "}", 2619 Style); 2620 2621 Style.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock; 2622 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2623 Style.BraceWrapping.AfterExternBlock = true; 2624 verifyFormat("extern \"C\"\n{ /*13*/\n}", Style); 2625 verifyFormat("extern \"C\"\n{\n" 2626 " int foo14();\n" 2627 "}", 2628 Style); 2629 2630 Style.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock; 2631 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2632 Style.BraceWrapping.AfterExternBlock = false; 2633 verifyFormat("extern \"C\" { /*15*/\n}", Style); 2634 verifyFormat("extern \"C\" {\n" 2635 "int foo16();\n" 2636 "}", 2637 Style); 2638 } 2639 2640 TEST_F(FormatTest, FormatsInlineASM) { 2641 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2642 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2643 verifyFormat( 2644 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2645 " \"cpuid\\n\\t\"\n" 2646 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2647 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2648 " : \"a\"(value));"); 2649 EXPECT_EQ( 2650 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2651 " __asm {\n" 2652 " mov edx,[that] // vtable in edx\n" 2653 " mov eax,methodIndex\n" 2654 " call [edx][eax*4] // stdcall\n" 2655 " }\n" 2656 "}", 2657 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2658 " __asm {\n" 2659 " mov edx,[that] // vtable in edx\n" 2660 " mov eax,methodIndex\n" 2661 " call [edx][eax*4] // stdcall\n" 2662 " }\n" 2663 "}")); 2664 EXPECT_EQ("_asm {\n" 2665 " xor eax, eax;\n" 2666 " cpuid;\n" 2667 "}", 2668 format("_asm {\n" 2669 " xor eax, eax;\n" 2670 " cpuid;\n" 2671 "}")); 2672 verifyFormat("void function() {\n" 2673 " // comment\n" 2674 " asm(\"\");\n" 2675 "}"); 2676 EXPECT_EQ("__asm {\n" 2677 "}\n" 2678 "int i;", 2679 format("__asm {\n" 2680 "}\n" 2681 "int i;")); 2682 } 2683 2684 TEST_F(FormatTest, FormatTryCatch) { 2685 verifyFormat("try {\n" 2686 " throw a * b;\n" 2687 "} catch (int a) {\n" 2688 " // Do nothing.\n" 2689 "} catch (...) {\n" 2690 " exit(42);\n" 2691 "}"); 2692 2693 // Function-level try statements. 2694 verifyFormat("int f() try { return 4; } catch (...) {\n" 2695 " return 5;\n" 2696 "}"); 2697 verifyFormat("class A {\n" 2698 " int a;\n" 2699 " A() try : a(0) {\n" 2700 " } catch (...) {\n" 2701 " throw;\n" 2702 " }\n" 2703 "};\n"); 2704 2705 // Incomplete try-catch blocks. 2706 verifyIncompleteFormat("try {} catch ("); 2707 } 2708 2709 TEST_F(FormatTest, FormatTryAsAVariable) { 2710 verifyFormat("int try;"); 2711 verifyFormat("int try, size;"); 2712 verifyFormat("try = foo();"); 2713 verifyFormat("if (try < size) {\n return true;\n}"); 2714 2715 verifyFormat("int catch;"); 2716 verifyFormat("int catch, size;"); 2717 verifyFormat("catch = foo();"); 2718 verifyFormat("if (catch < size) {\n return true;\n}"); 2719 } 2720 2721 TEST_F(FormatTest, FormatSEHTryCatch) { 2722 verifyFormat("__try {\n" 2723 " int a = b * c;\n" 2724 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2725 " // Do nothing.\n" 2726 "}"); 2727 2728 verifyFormat("__try {\n" 2729 " int a = b * c;\n" 2730 "} __finally {\n" 2731 " // Do nothing.\n" 2732 "}"); 2733 2734 verifyFormat("DEBUG({\n" 2735 " __try {\n" 2736 " } __finally {\n" 2737 " }\n" 2738 "});\n"); 2739 } 2740 2741 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2742 verifyFormat("try {\n" 2743 " f();\n" 2744 "} catch {\n" 2745 " g();\n" 2746 "}"); 2747 verifyFormat("try {\n" 2748 " f();\n" 2749 "} catch (A a) MACRO(x) {\n" 2750 " g();\n" 2751 "} catch (B b) MACRO(x) {\n" 2752 " g();\n" 2753 "}"); 2754 } 2755 2756 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2757 FormatStyle Style = getLLVMStyle(); 2758 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2759 FormatStyle::BS_WebKit}) { 2760 Style.BreakBeforeBraces = BraceStyle; 2761 verifyFormat("try {\n" 2762 " // something\n" 2763 "} catch (...) {\n" 2764 " // something\n" 2765 "}", 2766 Style); 2767 } 2768 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2769 verifyFormat("try {\n" 2770 " // something\n" 2771 "}\n" 2772 "catch (...) {\n" 2773 " // something\n" 2774 "}", 2775 Style); 2776 verifyFormat("__try {\n" 2777 " // something\n" 2778 "}\n" 2779 "__finally {\n" 2780 " // something\n" 2781 "}", 2782 Style); 2783 verifyFormat("@try {\n" 2784 " // something\n" 2785 "}\n" 2786 "@finally {\n" 2787 " // something\n" 2788 "}", 2789 Style); 2790 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2791 verifyFormat("try\n" 2792 "{\n" 2793 " // something\n" 2794 "}\n" 2795 "catch (...)\n" 2796 "{\n" 2797 " // something\n" 2798 "}", 2799 Style); 2800 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2801 verifyFormat("try\n" 2802 " {\n" 2803 " // something white\n" 2804 " }\n" 2805 "catch (...)\n" 2806 " {\n" 2807 " // something white\n" 2808 " }", 2809 Style); 2810 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2811 verifyFormat("try\n" 2812 " {\n" 2813 " // something\n" 2814 " }\n" 2815 "catch (...)\n" 2816 " {\n" 2817 " // something\n" 2818 " }", 2819 Style); 2820 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2821 Style.BraceWrapping.BeforeCatch = true; 2822 verifyFormat("try {\n" 2823 " // something\n" 2824 "}\n" 2825 "catch (...) {\n" 2826 " // something\n" 2827 "}", 2828 Style); 2829 } 2830 2831 TEST_F(FormatTest, StaticInitializers) { 2832 verifyFormat("static SomeClass SC = {1, 'a'};"); 2833 2834 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2835 " 100000000, " 2836 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2837 2838 // Here, everything other than the "}" would fit on a line. 2839 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2840 " 10000000000000000000000000};"); 2841 EXPECT_EQ("S s = {a,\n" 2842 "\n" 2843 " b};", 2844 format("S s = {\n" 2845 " a,\n" 2846 "\n" 2847 " b\n" 2848 "};")); 2849 2850 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2851 // line. However, the formatting looks a bit off and this probably doesn't 2852 // happen often in practice. 2853 verifyFormat("static int Variable[1] = {\n" 2854 " {1000000000000000000000000000000000000}};", 2855 getLLVMStyleWithColumns(40)); 2856 } 2857 2858 TEST_F(FormatTest, DesignatedInitializers) { 2859 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2860 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2861 " .bbbbbbbbbb = 2,\n" 2862 " .cccccccccc = 3,\n" 2863 " .dddddddddd = 4,\n" 2864 " .eeeeeeeeee = 5};"); 2865 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2866 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2867 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2868 " .ccccccccccccccccccccccccccc = 3,\n" 2869 " .ddddddddddddddddddddddddddd = 4,\n" 2870 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2871 2872 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2873 2874 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2875 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2876 " [2] = bbbbbbbbbb,\n" 2877 " [3] = cccccccccc,\n" 2878 " [4] = dddddddddd,\n" 2879 " [5] = eeeeeeeeee};"); 2880 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2881 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2882 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2883 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2884 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2885 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2886 } 2887 2888 TEST_F(FormatTest, NestedStaticInitializers) { 2889 verifyFormat("static A x = {{{}}};\n"); 2890 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2891 " {init1, init2, init3, init4}}};", 2892 getLLVMStyleWithColumns(50)); 2893 2894 verifyFormat("somes Status::global_reps[3] = {\n" 2895 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2896 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2897 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2898 getLLVMStyleWithColumns(60)); 2899 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2900 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2901 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2902 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2903 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2904 " {rect.fRight - rect.fLeft, rect.fBottom - " 2905 "rect.fTop}};"); 2906 2907 verifyFormat( 2908 "SomeArrayOfSomeType a = {\n" 2909 " {{1, 2, 3},\n" 2910 " {1, 2, 3},\n" 2911 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2912 " 333333333333333333333333333333},\n" 2913 " {1, 2, 3},\n" 2914 " {1, 2, 3}}};"); 2915 verifyFormat( 2916 "SomeArrayOfSomeType a = {\n" 2917 " {{1, 2, 3}},\n" 2918 " {{1, 2, 3}},\n" 2919 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2920 " 333333333333333333333333333333}},\n" 2921 " {{1, 2, 3}},\n" 2922 " {{1, 2, 3}}};"); 2923 2924 verifyFormat("struct {\n" 2925 " unsigned bit;\n" 2926 " const char *const name;\n" 2927 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2928 " {kOsWin, \"Windows\"},\n" 2929 " {kOsLinux, \"Linux\"},\n" 2930 " {kOsCrOS, \"Chrome OS\"}};"); 2931 verifyFormat("struct {\n" 2932 " unsigned bit;\n" 2933 " const char *const name;\n" 2934 "} kBitsToOs[] = {\n" 2935 " {kOsMac, \"Mac\"},\n" 2936 " {kOsWin, \"Windows\"},\n" 2937 " {kOsLinux, \"Linux\"},\n" 2938 " {kOsCrOS, \"Chrome OS\"},\n" 2939 "};"); 2940 } 2941 2942 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2943 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2944 " \\\n" 2945 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2946 } 2947 2948 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2949 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2950 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2951 2952 // Do break defaulted and deleted functions. 2953 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2954 " default;", 2955 getLLVMStyleWithColumns(40)); 2956 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2957 " delete;", 2958 getLLVMStyleWithColumns(40)); 2959 } 2960 2961 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2962 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2963 getLLVMStyleWithColumns(40)); 2964 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2965 getLLVMStyleWithColumns(40)); 2966 EXPECT_EQ("#define Q \\\n" 2967 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2968 " \"aaaaaaaa.cpp\"", 2969 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2970 getLLVMStyleWithColumns(40))); 2971 } 2972 2973 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2974 EXPECT_EQ("# 123 \"A string literal\"", 2975 format(" # 123 \"A string literal\"")); 2976 } 2977 2978 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2979 EXPECT_EQ("#;", format("#;")); 2980 verifyFormat("#\n;\n;\n;"); 2981 } 2982 2983 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2984 EXPECT_EQ("#line 42 \"test\"\n", 2985 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2986 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2987 getLLVMStyleWithColumns(12))); 2988 } 2989 2990 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2991 EXPECT_EQ("#line 42 \"test\"", 2992 format("# \\\n line \\\n 42 \\\n \"test\"")); 2993 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2994 } 2995 2996 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2997 verifyFormat("#define A \\x20"); 2998 verifyFormat("#define A \\ x20"); 2999 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 3000 verifyFormat("#define A ''"); 3001 verifyFormat("#define A ''qqq"); 3002 verifyFormat("#define A `qqq"); 3003 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 3004 EXPECT_EQ("const char *c = STRINGIFY(\n" 3005 "\\na : b);", 3006 format("const char * c = STRINGIFY(\n" 3007 "\\na : b);")); 3008 3009 verifyFormat("a\r\\"); 3010 verifyFormat("a\v\\"); 3011 verifyFormat("a\f\\"); 3012 } 3013 3014 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 3015 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 3016 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 3017 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 3018 // FIXME: We never break before the macro name. 3019 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 3020 3021 verifyFormat("#define A A\n#define A A"); 3022 verifyFormat("#define A(X) A\n#define A A"); 3023 3024 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 3025 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 3026 } 3027 3028 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 3029 EXPECT_EQ("// somecomment\n" 3030 "#include \"a.h\"\n" 3031 "#define A( \\\n" 3032 " A, B)\n" 3033 "#include \"b.h\"\n" 3034 "// somecomment\n", 3035 format(" // somecomment\n" 3036 " #include \"a.h\"\n" 3037 "#define A(A,\\\n" 3038 " B)\n" 3039 " #include \"b.h\"\n" 3040 " // somecomment\n", 3041 getLLVMStyleWithColumns(13))); 3042 } 3043 3044 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 3045 3046 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 3047 EXPECT_EQ("#define A \\\n" 3048 " c; \\\n" 3049 " e;\n" 3050 "f;", 3051 format("#define A c; e;\n" 3052 "f;", 3053 getLLVMStyleWithColumns(14))); 3054 } 3055 3056 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 3057 3058 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 3059 EXPECT_EQ("int x,\n" 3060 "#define A\n" 3061 " y;", 3062 format("int x,\n#define A\ny;")); 3063 } 3064 3065 TEST_F(FormatTest, HashInMacroDefinition) { 3066 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 3067 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 3068 verifyFormat("#define A \\\n" 3069 " { \\\n" 3070 " f(#c); \\\n" 3071 " }", 3072 getLLVMStyleWithColumns(11)); 3073 3074 verifyFormat("#define A(X) \\\n" 3075 " void function##X()", 3076 getLLVMStyleWithColumns(22)); 3077 3078 verifyFormat("#define A(a, b, c) \\\n" 3079 " void a##b##c()", 3080 getLLVMStyleWithColumns(22)); 3081 3082 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 3083 } 3084 3085 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 3086 EXPECT_EQ("#define A (x)", format("#define A (x)")); 3087 EXPECT_EQ("#define A(x)", format("#define A(x)")); 3088 3089 FormatStyle Style = getLLVMStyle(); 3090 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 3091 verifyFormat("#define true ((foo)1)", Style); 3092 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 3093 verifyFormat("#define false((foo)0)", Style); 3094 } 3095 3096 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 3097 EXPECT_EQ("#define A b;", format("#define A \\\n" 3098 " \\\n" 3099 " b;", 3100 getLLVMStyleWithColumns(25))); 3101 EXPECT_EQ("#define A \\\n" 3102 " \\\n" 3103 " a; \\\n" 3104 " b;", 3105 format("#define A \\\n" 3106 " \\\n" 3107 " a; \\\n" 3108 " b;", 3109 getLLVMStyleWithColumns(11))); 3110 EXPECT_EQ("#define A \\\n" 3111 " a; \\\n" 3112 " \\\n" 3113 " b;", 3114 format("#define A \\\n" 3115 " a; \\\n" 3116 " \\\n" 3117 " b;", 3118 getLLVMStyleWithColumns(11))); 3119 } 3120 3121 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 3122 verifyIncompleteFormat("#define A :"); 3123 verifyFormat("#define SOMECASES \\\n" 3124 " case 1: \\\n" 3125 " case 2\n", 3126 getLLVMStyleWithColumns(20)); 3127 verifyFormat("#define MACRO(a) \\\n" 3128 " if (a) \\\n" 3129 " f(); \\\n" 3130 " else \\\n" 3131 " g()", 3132 getLLVMStyleWithColumns(18)); 3133 verifyFormat("#define A template <typename T>"); 3134 verifyIncompleteFormat("#define STR(x) #x\n" 3135 "f(STR(this_is_a_string_literal{));"); 3136 verifyFormat("#pragma omp threadprivate( \\\n" 3137 " y)), // expected-warning", 3138 getLLVMStyleWithColumns(28)); 3139 verifyFormat("#d, = };"); 3140 verifyFormat("#if \"a"); 3141 verifyIncompleteFormat("({\n" 3142 "#define b \\\n" 3143 " } \\\n" 3144 " a\n" 3145 "a", 3146 getLLVMStyleWithColumns(15)); 3147 verifyFormat("#define A \\\n" 3148 " { \\\n" 3149 " {\n" 3150 "#define B \\\n" 3151 " } \\\n" 3152 " }", 3153 getLLVMStyleWithColumns(15)); 3154 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 3155 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 3156 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 3157 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 3158 } 3159 3160 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 3161 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 3162 EXPECT_EQ("class A : public QObject {\n" 3163 " Q_OBJECT\n" 3164 "\n" 3165 " A() {}\n" 3166 "};", 3167 format("class A : public QObject {\n" 3168 " Q_OBJECT\n" 3169 "\n" 3170 " A() {\n}\n" 3171 "} ;")); 3172 EXPECT_EQ("MACRO\n" 3173 "/*static*/ int i;", 3174 format("MACRO\n" 3175 " /*static*/ int i;")); 3176 EXPECT_EQ("SOME_MACRO\n" 3177 "namespace {\n" 3178 "void f();\n" 3179 "} // namespace", 3180 format("SOME_MACRO\n" 3181 " namespace {\n" 3182 "void f( );\n" 3183 "} // namespace")); 3184 // Only if the identifier contains at least 5 characters. 3185 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 3186 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 3187 // Only if everything is upper case. 3188 EXPECT_EQ("class A : public QObject {\n" 3189 " Q_Object A() {}\n" 3190 "};", 3191 format("class A : public QObject {\n" 3192 " Q_Object\n" 3193 " A() {\n}\n" 3194 "} ;")); 3195 3196 // Only if the next line can actually start an unwrapped line. 3197 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 3198 format("SOME_WEIRD_LOG_MACRO\n" 3199 "<< SomeThing;")); 3200 3201 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 3202 "(n, buffers))\n", 3203 getChromiumStyle(FormatStyle::LK_Cpp)); 3204 3205 // See PR41483 3206 EXPECT_EQ("/**/ FOO(a)\n" 3207 "FOO(b)", 3208 format("/**/ FOO(a)\n" 3209 "FOO(b)")); 3210 } 3211 3212 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 3213 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3214 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3215 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3216 "class X {};\n" 3217 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3218 "int *createScopDetectionPass() { return 0; }", 3219 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 3220 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 3221 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 3222 " class X {};\n" 3223 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 3224 " int *createScopDetectionPass() { return 0; }")); 3225 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 3226 // braces, so that inner block is indented one level more. 3227 EXPECT_EQ("int q() {\n" 3228 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3229 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3230 " IPC_END_MESSAGE_MAP()\n" 3231 "}", 3232 format("int q() {\n" 3233 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 3234 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 3235 " IPC_END_MESSAGE_MAP()\n" 3236 "}")); 3237 3238 // Same inside macros. 3239 EXPECT_EQ("#define LIST(L) \\\n" 3240 " L(A) \\\n" 3241 " L(B) \\\n" 3242 " L(C)", 3243 format("#define LIST(L) \\\n" 3244 " L(A) \\\n" 3245 " L(B) \\\n" 3246 " L(C)", 3247 getGoogleStyle())); 3248 3249 // These must not be recognized as macros. 3250 EXPECT_EQ("int q() {\n" 3251 " f(x);\n" 3252 " f(x) {}\n" 3253 " f(x)->g();\n" 3254 " f(x)->*g();\n" 3255 " f(x).g();\n" 3256 " f(x) = x;\n" 3257 " f(x) += x;\n" 3258 " f(x) -= x;\n" 3259 " f(x) *= x;\n" 3260 " f(x) /= x;\n" 3261 " f(x) %= x;\n" 3262 " f(x) &= x;\n" 3263 " f(x) |= x;\n" 3264 " f(x) ^= x;\n" 3265 " f(x) >>= x;\n" 3266 " f(x) <<= x;\n" 3267 " f(x)[y].z();\n" 3268 " LOG(INFO) << x;\n" 3269 " ifstream(x) >> x;\n" 3270 "}\n", 3271 format("int q() {\n" 3272 " f(x)\n;\n" 3273 " f(x)\n {}\n" 3274 " f(x)\n->g();\n" 3275 " f(x)\n->*g();\n" 3276 " f(x)\n.g();\n" 3277 " f(x)\n = x;\n" 3278 " f(x)\n += x;\n" 3279 " f(x)\n -= x;\n" 3280 " f(x)\n *= x;\n" 3281 " f(x)\n /= x;\n" 3282 " f(x)\n %= x;\n" 3283 " f(x)\n &= x;\n" 3284 " f(x)\n |= x;\n" 3285 " f(x)\n ^= x;\n" 3286 " f(x)\n >>= x;\n" 3287 " f(x)\n <<= x;\n" 3288 " f(x)\n[y].z();\n" 3289 " LOG(INFO)\n << x;\n" 3290 " ifstream(x)\n >> x;\n" 3291 "}\n")); 3292 EXPECT_EQ("int q() {\n" 3293 " F(x)\n" 3294 " if (1) {\n" 3295 " }\n" 3296 " F(x)\n" 3297 " while (1) {\n" 3298 " }\n" 3299 " F(x)\n" 3300 " G(x);\n" 3301 " F(x)\n" 3302 " try {\n" 3303 " Q();\n" 3304 " } catch (...) {\n" 3305 " }\n" 3306 "}\n", 3307 format("int q() {\n" 3308 "F(x)\n" 3309 "if (1) {}\n" 3310 "F(x)\n" 3311 "while (1) {}\n" 3312 "F(x)\n" 3313 "G(x);\n" 3314 "F(x)\n" 3315 "try { Q(); } catch (...) {}\n" 3316 "}\n")); 3317 EXPECT_EQ("class A {\n" 3318 " A() : t(0) {}\n" 3319 " A(int i) noexcept() : {}\n" 3320 " A(X x)\n" // FIXME: function-level try blocks are broken. 3321 " try : t(0) {\n" 3322 " } catch (...) {\n" 3323 " }\n" 3324 "};", 3325 format("class A {\n" 3326 " A()\n : t(0) {}\n" 3327 " A(int i)\n noexcept() : {}\n" 3328 " A(X x)\n" 3329 " try : t(0) {} catch (...) {}\n" 3330 "};")); 3331 FormatStyle Style = getLLVMStyle(); 3332 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 3333 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 3334 Style.BraceWrapping.AfterFunction = true; 3335 EXPECT_EQ("void f()\n" 3336 "try\n" 3337 "{\n" 3338 "}", 3339 format("void f() try {\n" 3340 "}", 3341 Style)); 3342 EXPECT_EQ("class SomeClass {\n" 3343 "public:\n" 3344 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3345 "};", 3346 format("class SomeClass {\n" 3347 "public:\n" 3348 " SomeClass()\n" 3349 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3350 "};")); 3351 EXPECT_EQ("class SomeClass {\n" 3352 "public:\n" 3353 " SomeClass()\n" 3354 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3355 "};", 3356 format("class SomeClass {\n" 3357 "public:\n" 3358 " SomeClass()\n" 3359 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 3360 "};", 3361 getLLVMStyleWithColumns(40))); 3362 3363 verifyFormat("MACRO(>)"); 3364 3365 // Some macros contain an implicit semicolon. 3366 Style = getLLVMStyle(); 3367 Style.StatementMacros.push_back("FOO"); 3368 verifyFormat("FOO(a) int b = 0;"); 3369 verifyFormat("FOO(a)\n" 3370 "int b = 0;", 3371 Style); 3372 verifyFormat("FOO(a);\n" 3373 "int b = 0;", 3374 Style); 3375 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 3376 "int b = 0;", 3377 Style); 3378 verifyFormat("FOO()\n" 3379 "int b = 0;", 3380 Style); 3381 verifyFormat("FOO\n" 3382 "int b = 0;", 3383 Style); 3384 verifyFormat("void f() {\n" 3385 " FOO(a)\n" 3386 " return a;\n" 3387 "}", 3388 Style); 3389 verifyFormat("FOO(a)\n" 3390 "FOO(b)", 3391 Style); 3392 verifyFormat("int a = 0;\n" 3393 "FOO(b)\n" 3394 "int c = 0;", 3395 Style); 3396 verifyFormat("int a = 0;\n" 3397 "int x = FOO(a)\n" 3398 "int b = 0;", 3399 Style); 3400 verifyFormat("void foo(int a) { FOO(a) }\n" 3401 "uint32_t bar() {}", 3402 Style); 3403 } 3404 3405 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3406 verifyFormat("#define A \\\n" 3407 " f({ \\\n" 3408 " g(); \\\n" 3409 " });", 3410 getLLVMStyleWithColumns(11)); 3411 } 3412 3413 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3414 FormatStyle Style = getLLVMStyle(); 3415 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3416 Style.ColumnLimit = 40; 3417 verifyFormat("#ifdef _WIN32\n" 3418 "#define A 0\n" 3419 "#ifdef VAR2\n" 3420 "#define B 1\n" 3421 "#include <someheader.h>\n" 3422 "#define MACRO \\\n" 3423 " some_very_long_func_aaaaaaaaaa();\n" 3424 "#endif\n" 3425 "#else\n" 3426 "#define A 1\n" 3427 "#endif", 3428 Style); 3429 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3430 verifyFormat("#ifdef _WIN32\n" 3431 "# define A 0\n" 3432 "# ifdef VAR2\n" 3433 "# define B 1\n" 3434 "# include <someheader.h>\n" 3435 "# define MACRO \\\n" 3436 " some_very_long_func_aaaaaaaaaa();\n" 3437 "# endif\n" 3438 "#else\n" 3439 "# define A 1\n" 3440 "#endif", 3441 Style); 3442 verifyFormat("#if A\n" 3443 "# define MACRO \\\n" 3444 " void a(int x) { \\\n" 3445 " b(); \\\n" 3446 " c(); \\\n" 3447 " d(); \\\n" 3448 " e(); \\\n" 3449 " f(); \\\n" 3450 " }\n" 3451 "#endif", 3452 Style); 3453 // Comments before include guard. 3454 verifyFormat("// file comment\n" 3455 "// file comment\n" 3456 "#ifndef HEADER_H\n" 3457 "#define HEADER_H\n" 3458 "code();\n" 3459 "#endif", 3460 Style); 3461 // Test with include guards. 3462 verifyFormat("#ifndef HEADER_H\n" 3463 "#define HEADER_H\n" 3464 "code();\n" 3465 "#endif", 3466 Style); 3467 // Include guards must have a #define with the same variable immediately 3468 // after #ifndef. 3469 verifyFormat("#ifndef NOT_GUARD\n" 3470 "# define FOO\n" 3471 "code();\n" 3472 "#endif", 3473 Style); 3474 3475 // Include guards must cover the entire file. 3476 verifyFormat("code();\n" 3477 "code();\n" 3478 "#ifndef NOT_GUARD\n" 3479 "# define NOT_GUARD\n" 3480 "code();\n" 3481 "#endif", 3482 Style); 3483 verifyFormat("#ifndef NOT_GUARD\n" 3484 "# define NOT_GUARD\n" 3485 "code();\n" 3486 "#endif\n" 3487 "code();", 3488 Style); 3489 // Test with trailing blank lines. 3490 verifyFormat("#ifndef HEADER_H\n" 3491 "#define HEADER_H\n" 3492 "code();\n" 3493 "#endif\n", 3494 Style); 3495 // Include guards don't have #else. 3496 verifyFormat("#ifndef NOT_GUARD\n" 3497 "# define NOT_GUARD\n" 3498 "code();\n" 3499 "#else\n" 3500 "#endif", 3501 Style); 3502 verifyFormat("#ifndef NOT_GUARD\n" 3503 "# define NOT_GUARD\n" 3504 "code();\n" 3505 "#elif FOO\n" 3506 "#endif", 3507 Style); 3508 // Non-identifier #define after potential include guard. 3509 verifyFormat("#ifndef FOO\n" 3510 "# define 1\n" 3511 "#endif\n", 3512 Style); 3513 // #if closes past last non-preprocessor line. 3514 verifyFormat("#ifndef FOO\n" 3515 "#define FOO\n" 3516 "#if 1\n" 3517 "int i;\n" 3518 "# define A 0\n" 3519 "#endif\n" 3520 "#endif\n", 3521 Style); 3522 // Don't crash if there is an #elif directive without a condition. 3523 verifyFormat("#if 1\n" 3524 "int x;\n" 3525 "#elif\n" 3526 "int y;\n" 3527 "#else\n" 3528 "int z;\n" 3529 "#endif", 3530 Style); 3531 // FIXME: This doesn't handle the case where there's code between the 3532 // #ifndef and #define but all other conditions hold. This is because when 3533 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3534 // previous code line yet, so we can't detect it. 3535 EXPECT_EQ("#ifndef NOT_GUARD\n" 3536 "code();\n" 3537 "#define NOT_GUARD\n" 3538 "code();\n" 3539 "#endif", 3540 format("#ifndef NOT_GUARD\n" 3541 "code();\n" 3542 "# define NOT_GUARD\n" 3543 "code();\n" 3544 "#endif", 3545 Style)); 3546 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3547 // be outside an include guard. Examples are #pragma once and 3548 // #pragma GCC diagnostic, or anything else that does not change the meaning 3549 // of the file if it's included multiple times. 3550 EXPECT_EQ("#ifdef WIN32\n" 3551 "# pragma once\n" 3552 "#endif\n" 3553 "#ifndef HEADER_H\n" 3554 "# define HEADER_H\n" 3555 "code();\n" 3556 "#endif", 3557 format("#ifdef WIN32\n" 3558 "# pragma once\n" 3559 "#endif\n" 3560 "#ifndef HEADER_H\n" 3561 "#define HEADER_H\n" 3562 "code();\n" 3563 "#endif", 3564 Style)); 3565 // FIXME: This does not detect when there is a single non-preprocessor line 3566 // in front of an include-guard-like structure where other conditions hold 3567 // because ScopedLineState hides the line. 3568 EXPECT_EQ("code();\n" 3569 "#ifndef HEADER_H\n" 3570 "#define HEADER_H\n" 3571 "code();\n" 3572 "#endif", 3573 format("code();\n" 3574 "#ifndef HEADER_H\n" 3575 "# define HEADER_H\n" 3576 "code();\n" 3577 "#endif", 3578 Style)); 3579 // Keep comments aligned with #, otherwise indent comments normally. These 3580 // tests cannot use verifyFormat because messUp manipulates leading 3581 // whitespace. 3582 { 3583 const char *Expected = "" 3584 "void f() {\n" 3585 "#if 1\n" 3586 "// Preprocessor aligned.\n" 3587 "# define A 0\n" 3588 " // Code. Separated by blank line.\n" 3589 "\n" 3590 "# define B 0\n" 3591 " // Code. Not aligned with #\n" 3592 "# define C 0\n" 3593 "#endif"; 3594 const char *ToFormat = "" 3595 "void f() {\n" 3596 "#if 1\n" 3597 "// Preprocessor aligned.\n" 3598 "# define A 0\n" 3599 "// Code. Separated by blank line.\n" 3600 "\n" 3601 "# define B 0\n" 3602 " // Code. Not aligned with #\n" 3603 "# define C 0\n" 3604 "#endif"; 3605 EXPECT_EQ(Expected, format(ToFormat, Style)); 3606 EXPECT_EQ(Expected, format(Expected, Style)); 3607 } 3608 // Keep block quotes aligned. 3609 { 3610 const char *Expected = "" 3611 "void f() {\n" 3612 "#if 1\n" 3613 "/* Preprocessor aligned. */\n" 3614 "# define A 0\n" 3615 " /* Code. Separated by blank line. */\n" 3616 "\n" 3617 "# define B 0\n" 3618 " /* Code. Not aligned with # */\n" 3619 "# define C 0\n" 3620 "#endif"; 3621 const char *ToFormat = "" 3622 "void f() {\n" 3623 "#if 1\n" 3624 "/* Preprocessor aligned. */\n" 3625 "# define A 0\n" 3626 "/* Code. Separated by blank line. */\n" 3627 "\n" 3628 "# define B 0\n" 3629 " /* Code. Not aligned with # */\n" 3630 "# define C 0\n" 3631 "#endif"; 3632 EXPECT_EQ(Expected, format(ToFormat, Style)); 3633 EXPECT_EQ(Expected, format(Expected, Style)); 3634 } 3635 // Keep comments aligned with un-indented directives. 3636 { 3637 const char *Expected = "" 3638 "void f() {\n" 3639 "// Preprocessor aligned.\n" 3640 "#define A 0\n" 3641 " // Code. Separated by blank line.\n" 3642 "\n" 3643 "#define B 0\n" 3644 " // Code. Not aligned with #\n" 3645 "#define C 0\n"; 3646 const char *ToFormat = "" 3647 "void f() {\n" 3648 "// Preprocessor aligned.\n" 3649 "#define A 0\n" 3650 "// Code. Separated by blank line.\n" 3651 "\n" 3652 "#define B 0\n" 3653 " // Code. Not aligned with #\n" 3654 "#define C 0\n"; 3655 EXPECT_EQ(Expected, format(ToFormat, Style)); 3656 EXPECT_EQ(Expected, format(Expected, Style)); 3657 } 3658 // Test AfterHash with tabs. 3659 { 3660 FormatStyle Tabbed = Style; 3661 Tabbed.UseTab = FormatStyle::UT_Always; 3662 Tabbed.IndentWidth = 8; 3663 Tabbed.TabWidth = 8; 3664 verifyFormat("#ifdef _WIN32\n" 3665 "#\tdefine A 0\n" 3666 "#\tifdef VAR2\n" 3667 "#\t\tdefine B 1\n" 3668 "#\t\tinclude <someheader.h>\n" 3669 "#\t\tdefine MACRO \\\n" 3670 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3671 "#\tendif\n" 3672 "#else\n" 3673 "#\tdefine A 1\n" 3674 "#endif", 3675 Tabbed); 3676 } 3677 3678 // Regression test: Multiline-macro inside include guards. 3679 verifyFormat("#ifndef HEADER_H\n" 3680 "#define HEADER_H\n" 3681 "#define A() \\\n" 3682 " int i; \\\n" 3683 " int j;\n" 3684 "#endif // HEADER_H", 3685 getLLVMStyleWithColumns(20)); 3686 3687 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3688 // Basic before hash indent tests 3689 verifyFormat("#ifdef _WIN32\n" 3690 " #define A 0\n" 3691 " #ifdef VAR2\n" 3692 " #define B 1\n" 3693 " #include <someheader.h>\n" 3694 " #define MACRO \\\n" 3695 " some_very_long_func_aaaaaaaaaa();\n" 3696 " #endif\n" 3697 "#else\n" 3698 " #define A 1\n" 3699 "#endif", 3700 Style); 3701 verifyFormat("#if A\n" 3702 " #define MACRO \\\n" 3703 " void a(int x) { \\\n" 3704 " b(); \\\n" 3705 " c(); \\\n" 3706 " d(); \\\n" 3707 " e(); \\\n" 3708 " f(); \\\n" 3709 " }\n" 3710 "#endif", 3711 Style); 3712 // Keep comments aligned with indented directives. These 3713 // tests cannot use verifyFormat because messUp manipulates leading 3714 // whitespace. 3715 { 3716 const char *Expected = "void f() {\n" 3717 "// Aligned to preprocessor.\n" 3718 "#if 1\n" 3719 " // Aligned to code.\n" 3720 " int a;\n" 3721 " #if 1\n" 3722 " // Aligned to preprocessor.\n" 3723 " #define A 0\n" 3724 " // Aligned to code.\n" 3725 " int b;\n" 3726 " #endif\n" 3727 "#endif\n" 3728 "}"; 3729 const char *ToFormat = "void f() {\n" 3730 "// Aligned to preprocessor.\n" 3731 "#if 1\n" 3732 "// Aligned to code.\n" 3733 "int a;\n" 3734 "#if 1\n" 3735 "// Aligned to preprocessor.\n" 3736 "#define A 0\n" 3737 "// Aligned to code.\n" 3738 "int b;\n" 3739 "#endif\n" 3740 "#endif\n" 3741 "}"; 3742 EXPECT_EQ(Expected, format(ToFormat, Style)); 3743 EXPECT_EQ(Expected, format(Expected, Style)); 3744 } 3745 { 3746 const char *Expected = "void f() {\n" 3747 "/* Aligned to preprocessor. */\n" 3748 "#if 1\n" 3749 " /* Aligned to code. */\n" 3750 " int a;\n" 3751 " #if 1\n" 3752 " /* Aligned to preprocessor. */\n" 3753 " #define A 0\n" 3754 " /* Aligned to code. */\n" 3755 " int b;\n" 3756 " #endif\n" 3757 "#endif\n" 3758 "}"; 3759 const char *ToFormat = "void f() {\n" 3760 "/* Aligned to preprocessor. */\n" 3761 "#if 1\n" 3762 "/* Aligned to code. */\n" 3763 "int a;\n" 3764 "#if 1\n" 3765 "/* Aligned to preprocessor. */\n" 3766 "#define A 0\n" 3767 "/* Aligned to code. */\n" 3768 "int b;\n" 3769 "#endif\n" 3770 "#endif\n" 3771 "}"; 3772 EXPECT_EQ(Expected, format(ToFormat, Style)); 3773 EXPECT_EQ(Expected, format(Expected, Style)); 3774 } 3775 3776 // Test single comment before preprocessor 3777 verifyFormat("// Comment\n" 3778 "\n" 3779 "#if 1\n" 3780 "#endif", 3781 Style); 3782 } 3783 3784 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3785 verifyFormat("{\n { a #c; }\n}"); 3786 } 3787 3788 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3789 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3790 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3791 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3792 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3793 } 3794 3795 TEST_F(FormatTest, EscapedNewlines) { 3796 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3797 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3798 format("#define A \\\nint i;\\\n int j;", Narrow)); 3799 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3800 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3801 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3802 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3803 3804 FormatStyle AlignLeft = getLLVMStyle(); 3805 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3806 EXPECT_EQ("#define MACRO(x) \\\n" 3807 "private: \\\n" 3808 " int x(int a);\n", 3809 format("#define MACRO(x) \\\n" 3810 "private: \\\n" 3811 " int x(int a);\n", 3812 AlignLeft)); 3813 3814 // CRLF line endings 3815 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3816 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3817 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3818 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3819 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3820 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3821 EXPECT_EQ("#define MACRO(x) \\\r\n" 3822 "private: \\\r\n" 3823 " int x(int a);\r\n", 3824 format("#define MACRO(x) \\\r\n" 3825 "private: \\\r\n" 3826 " int x(int a);\r\n", 3827 AlignLeft)); 3828 3829 FormatStyle DontAlign = getLLVMStyle(); 3830 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3831 DontAlign.MaxEmptyLinesToKeep = 3; 3832 // FIXME: can't use verifyFormat here because the newline before 3833 // "public:" is not inserted the first time it's reformatted 3834 EXPECT_EQ("#define A \\\n" 3835 " class Foo { \\\n" 3836 " void bar(); \\\n" 3837 "\\\n" 3838 "\\\n" 3839 "\\\n" 3840 " public: \\\n" 3841 " void baz(); \\\n" 3842 " };", 3843 format("#define A \\\n" 3844 " class Foo { \\\n" 3845 " void bar(); \\\n" 3846 "\\\n" 3847 "\\\n" 3848 "\\\n" 3849 " public: \\\n" 3850 " void baz(); \\\n" 3851 " };", 3852 DontAlign)); 3853 } 3854 3855 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3856 verifyFormat("#define A \\\n" 3857 " int v( \\\n" 3858 " a); \\\n" 3859 " int i;", 3860 getLLVMStyleWithColumns(11)); 3861 } 3862 3863 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3864 EXPECT_EQ( 3865 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3866 " \\\n" 3867 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3868 "\n" 3869 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3870 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3871 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3872 "\\\n" 3873 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3874 " \n" 3875 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3876 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3877 } 3878 3879 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3880 EXPECT_EQ("int\n" 3881 "#define A\n" 3882 " a;", 3883 format("int\n#define A\na;")); 3884 verifyFormat("functionCallTo(\n" 3885 " someOtherFunction(\n" 3886 " withSomeParameters, whichInSequence,\n" 3887 " areLongerThanALine(andAnotherCall,\n" 3888 "#define A B\n" 3889 " withMoreParamters,\n" 3890 " whichStronglyInfluenceTheLayout),\n" 3891 " andMoreParameters),\n" 3892 " trailing);", 3893 getLLVMStyleWithColumns(69)); 3894 verifyFormat("Foo::Foo()\n" 3895 "#ifdef BAR\n" 3896 " : baz(0)\n" 3897 "#endif\n" 3898 "{\n" 3899 "}"); 3900 verifyFormat("void f() {\n" 3901 " if (true)\n" 3902 "#ifdef A\n" 3903 " f(42);\n" 3904 " x();\n" 3905 "#else\n" 3906 " g();\n" 3907 " x();\n" 3908 "#endif\n" 3909 "}"); 3910 verifyFormat("void f(param1, param2,\n" 3911 " param3,\n" 3912 "#ifdef A\n" 3913 " param4(param5,\n" 3914 "#ifdef A1\n" 3915 " param6,\n" 3916 "#ifdef A2\n" 3917 " param7),\n" 3918 "#else\n" 3919 " param8),\n" 3920 " param9,\n" 3921 "#endif\n" 3922 " param10,\n" 3923 "#endif\n" 3924 " param11)\n" 3925 "#else\n" 3926 " param12)\n" 3927 "#endif\n" 3928 "{\n" 3929 " x();\n" 3930 "}", 3931 getLLVMStyleWithColumns(28)); 3932 verifyFormat("#if 1\n" 3933 "int i;"); 3934 verifyFormat("#if 1\n" 3935 "#endif\n" 3936 "#if 1\n" 3937 "#else\n" 3938 "#endif\n"); 3939 verifyFormat("DEBUG({\n" 3940 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3942 "});\n" 3943 "#if a\n" 3944 "#else\n" 3945 "#endif"); 3946 3947 verifyIncompleteFormat("void f(\n" 3948 "#if A\n" 3949 ");\n" 3950 "#else\n" 3951 "#endif"); 3952 } 3953 3954 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3955 verifyFormat("#endif\n" 3956 "#if B"); 3957 } 3958 3959 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3960 FormatStyle SingleLine = getLLVMStyle(); 3961 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3962 verifyFormat("#if 0\n" 3963 "#elif 1\n" 3964 "#endif\n" 3965 "void foo() {\n" 3966 " if (test) foo2();\n" 3967 "}", 3968 SingleLine); 3969 } 3970 3971 TEST_F(FormatTest, LayoutBlockInsideParens) { 3972 verifyFormat("functionCall({ int i; });"); 3973 verifyFormat("functionCall({\n" 3974 " int i;\n" 3975 " int j;\n" 3976 "});"); 3977 verifyFormat("functionCall(\n" 3978 " {\n" 3979 " int i;\n" 3980 " int j;\n" 3981 " },\n" 3982 " aaaa, bbbb, cccc);"); 3983 verifyFormat("functionA(functionB({\n" 3984 " int i;\n" 3985 " int j;\n" 3986 " }),\n" 3987 " aaaa, bbbb, cccc);"); 3988 verifyFormat("functionCall(\n" 3989 " {\n" 3990 " int i;\n" 3991 " int j;\n" 3992 " },\n" 3993 " aaaa, bbbb, // comment\n" 3994 " cccc);"); 3995 verifyFormat("functionA(functionB({\n" 3996 " int i;\n" 3997 " int j;\n" 3998 " }),\n" 3999 " aaaa, bbbb, // comment\n" 4000 " cccc);"); 4001 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 4002 verifyFormat("functionCall(aaaa, bbbb, {\n" 4003 " int i;\n" 4004 " int j;\n" 4005 "});"); 4006 verifyFormat( 4007 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 4008 " {\n" 4009 " int i; // break\n" 4010 " },\n" 4011 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 4012 " ccccccccccccccccc));"); 4013 verifyFormat("DEBUG({\n" 4014 " if (a)\n" 4015 " f();\n" 4016 "});"); 4017 } 4018 4019 TEST_F(FormatTest, LayoutBlockInsideStatement) { 4020 EXPECT_EQ("SOME_MACRO { int i; }\n" 4021 "int i;", 4022 format(" SOME_MACRO {int i;} int i;")); 4023 } 4024 4025 TEST_F(FormatTest, LayoutNestedBlocks) { 4026 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 4027 " struct s {\n" 4028 " int i;\n" 4029 " };\n" 4030 " s kBitsToOs[] = {{10}};\n" 4031 " for (int i = 0; i < 10; ++i)\n" 4032 " return;\n" 4033 "}"); 4034 verifyFormat("call(parameter, {\n" 4035 " something();\n" 4036 " // Comment using all columns.\n" 4037 " somethingelse();\n" 4038 "});", 4039 getLLVMStyleWithColumns(40)); 4040 verifyFormat("DEBUG( //\n" 4041 " { f(); }, a);"); 4042 verifyFormat("DEBUG( //\n" 4043 " {\n" 4044 " f(); //\n" 4045 " },\n" 4046 " a);"); 4047 4048 EXPECT_EQ("call(parameter, {\n" 4049 " something();\n" 4050 " // Comment too\n" 4051 " // looooooooooong.\n" 4052 " somethingElse();\n" 4053 "});", 4054 format("call(parameter, {\n" 4055 " something();\n" 4056 " // Comment too looooooooooong.\n" 4057 " somethingElse();\n" 4058 "});", 4059 getLLVMStyleWithColumns(29))); 4060 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 4061 EXPECT_EQ("DEBUG({ // comment\n" 4062 " int i;\n" 4063 "});", 4064 format("DEBUG({ // comment\n" 4065 "int i;\n" 4066 "});")); 4067 EXPECT_EQ("DEBUG({\n" 4068 " int i;\n" 4069 "\n" 4070 " // comment\n" 4071 " int j;\n" 4072 "});", 4073 format("DEBUG({\n" 4074 " int i;\n" 4075 "\n" 4076 " // comment\n" 4077 " int j;\n" 4078 "});")); 4079 4080 verifyFormat("DEBUG({\n" 4081 " if (a)\n" 4082 " return;\n" 4083 "});"); 4084 verifyGoogleFormat("DEBUG({\n" 4085 " if (a) return;\n" 4086 "});"); 4087 FormatStyle Style = getGoogleStyle(); 4088 Style.ColumnLimit = 45; 4089 verifyFormat("Debug(\n" 4090 " aaaaa,\n" 4091 " {\n" 4092 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 4093 " },\n" 4094 " a);", 4095 Style); 4096 4097 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 4098 4099 verifyNoCrash("^{v^{a}}"); 4100 } 4101 4102 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 4103 EXPECT_EQ("#define MACRO() \\\n" 4104 " Debug(aaa, /* force line break */ \\\n" 4105 " { \\\n" 4106 " int i; \\\n" 4107 " int j; \\\n" 4108 " })", 4109 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 4110 " { int i; int j; })", 4111 getGoogleStyle())); 4112 4113 EXPECT_EQ("#define A \\\n" 4114 " [] { \\\n" 4115 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4116 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 4117 " }", 4118 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 4119 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 4120 getGoogleStyle())); 4121 } 4122 4123 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 4124 EXPECT_EQ("{}", format("{}")); 4125 verifyFormat("enum E {};"); 4126 verifyFormat("enum E {}"); 4127 FormatStyle Style = getLLVMStyle(); 4128 Style.SpaceInEmptyBlock = true; 4129 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 4130 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 4131 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 4132 } 4133 4134 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 4135 FormatStyle Style = getLLVMStyle(); 4136 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 4137 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 4138 verifyFormat("FOO_BEGIN\n" 4139 " FOO_ENTRY\n" 4140 "FOO_END", 4141 Style); 4142 verifyFormat("FOO_BEGIN\n" 4143 " NESTED_FOO_BEGIN\n" 4144 " NESTED_FOO_ENTRY\n" 4145 " NESTED_FOO_END\n" 4146 "FOO_END", 4147 Style); 4148 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 4149 " int x;\n" 4150 " x = 1;\n" 4151 "FOO_END(Baz)", 4152 Style); 4153 } 4154 4155 //===----------------------------------------------------------------------===// 4156 // Line break tests. 4157 //===----------------------------------------------------------------------===// 4158 4159 TEST_F(FormatTest, PreventConfusingIndents) { 4160 verifyFormat( 4161 "void f() {\n" 4162 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 4163 " parameter, parameter, parameter)),\n" 4164 " SecondLongCall(parameter));\n" 4165 "}"); 4166 verifyFormat( 4167 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4168 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4169 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4170 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 4171 verifyFormat( 4172 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4173 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 4174 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 4175 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 4176 verifyFormat( 4177 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 4178 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 4179 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 4180 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 4181 verifyFormat("int a = bbbb && ccc &&\n" 4182 " fffff(\n" 4183 "#define A Just forcing a new line\n" 4184 " ddd);"); 4185 } 4186 4187 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 4188 verifyFormat( 4189 "bool aaaaaaa =\n" 4190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 4191 " bbbbbbbb();"); 4192 verifyFormat( 4193 "bool aaaaaaa =\n" 4194 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 4195 " bbbbbbbb();"); 4196 4197 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 4199 " ccccccccc == ddddddddddd;"); 4200 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 4201 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 4202 " ccccccccc == ddddddddddd;"); 4203 verifyFormat( 4204 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 4205 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 4206 " ccccccccc == ddddddddddd;"); 4207 4208 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4209 " aaaaaa) &&\n" 4210 " bbbbbb && cccccc;"); 4211 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 4212 " aaaaaa) >>\n" 4213 " bbbbbb;"); 4214 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 4215 " SourceMgr.getSpellingColumnNumber(\n" 4216 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 4217 " 1);"); 4218 4219 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4220 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 4221 " cccccc) {\n}"); 4222 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4223 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4224 " cccccc) {\n}"); 4225 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4226 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 4227 " cccccc) {\n}"); 4228 verifyFormat("b = a &&\n" 4229 " // Comment\n" 4230 " b.c && d;"); 4231 4232 // If the LHS of a comparison is not a binary expression itself, the 4233 // additional linebreak confuses many people. 4234 verifyFormat( 4235 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 4237 "}"); 4238 verifyFormat( 4239 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4240 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4241 "}"); 4242 verifyFormat( 4243 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 4244 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4245 "}"); 4246 verifyFormat( 4247 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 4249 "}"); 4250 // Even explicit parentheses stress the precedence enough to make the 4251 // additional break unnecessary. 4252 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4253 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 4254 "}"); 4255 // This cases is borderline, but with the indentation it is still readable. 4256 verifyFormat( 4257 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4258 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4259 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 4260 "}", 4261 getLLVMStyleWithColumns(75)); 4262 4263 // If the LHS is a binary expression, we should still use the additional break 4264 // as otherwise the formatting hides the operator precedence. 4265 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4267 " 5) {\n" 4268 "}"); 4269 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 4271 " 5) {\n" 4272 "}"); 4273 4274 FormatStyle OnePerLine = getLLVMStyle(); 4275 OnePerLine.BinPackParameters = false; 4276 verifyFormat( 4277 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 4280 OnePerLine); 4281 4282 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 4283 " .aaa(aaaaaaaaaaaaa) *\n" 4284 " aaaaaaa +\n" 4285 " aaaaaaa;", 4286 getLLVMStyleWithColumns(40)); 4287 } 4288 4289 TEST_F(FormatTest, ExpressionIndentation) { 4290 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4292 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4294 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 4295 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 4296 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 4298 " ccccccccccccccccccccccccccccccccccccccccc;"); 4299 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4301 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4302 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4303 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4305 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4306 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4307 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 4308 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 4309 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4310 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 4311 verifyFormat("if () {\n" 4312 "} else if (aaaaa && bbbbb > // break\n" 4313 " ccccc) {\n" 4314 "}"); 4315 verifyFormat("if () {\n" 4316 "} else if constexpr (aaaaa && bbbbb > // break\n" 4317 " ccccc) {\n" 4318 "}"); 4319 verifyFormat("if () {\n" 4320 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 4321 " ccccc) {\n" 4322 "}"); 4323 verifyFormat("if () {\n" 4324 "} else if (aaaaa &&\n" 4325 " bbbbb > // break\n" 4326 " ccccc &&\n" 4327 " ddddd) {\n" 4328 "}"); 4329 4330 // Presence of a trailing comment used to change indentation of b. 4331 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 4332 " b;\n" 4333 "return aaaaaaaaaaaaaaaaaaa +\n" 4334 " b; //", 4335 getLLVMStyleWithColumns(30)); 4336 } 4337 4338 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 4339 // Not sure what the best system is here. Like this, the LHS can be found 4340 // immediately above an operator (everything with the same or a higher 4341 // indent). The RHS is aligned right of the operator and so compasses 4342 // everything until something with the same indent as the operator is found. 4343 // FIXME: Is this a good system? 4344 FormatStyle Style = getLLVMStyle(); 4345 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4346 verifyFormat( 4347 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4348 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4349 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4350 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4351 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4352 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4353 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4354 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4355 " > ccccccccccccccccccccccccccccccccccccccccc;", 4356 Style); 4357 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4358 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4359 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4360 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4361 Style); 4362 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4363 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4364 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4365 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4366 Style); 4367 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4368 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4369 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4370 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4371 Style); 4372 verifyFormat("if () {\n" 4373 "} else if (aaaaa\n" 4374 " && bbbbb // break\n" 4375 " > ccccc) {\n" 4376 "}", 4377 Style); 4378 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4379 " && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4380 Style); 4381 verifyFormat("return (a)\n" 4382 " // comment\n" 4383 " + b;", 4384 Style); 4385 verifyFormat( 4386 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4387 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4388 " + cc;", 4389 Style); 4390 4391 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4392 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4393 Style); 4394 4395 // Forced by comments. 4396 verifyFormat( 4397 "unsigned ContentSize =\n" 4398 " sizeof(int16_t) // DWARF ARange version number\n" 4399 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4400 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4401 " + sizeof(int8_t); // Segment Size (in bytes)"); 4402 4403 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4404 " == boost::fusion::at_c<1>(iiii).second;", 4405 Style); 4406 4407 Style.ColumnLimit = 60; 4408 verifyFormat("zzzzzzzzzz\n" 4409 " = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4410 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4411 Style); 4412 4413 Style.ColumnLimit = 80; 4414 Style.IndentWidth = 4; 4415 Style.TabWidth = 4; 4416 Style.UseTab = FormatStyle::UT_Always; 4417 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4418 Style.AlignOperands = FormatStyle::OAS_DontAlign; 4419 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4420 "\t&& (someOtherLongishConditionPart1\n" 4421 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4422 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4423 "(someOtherLongishConditionPart1 || " 4424 "someOtherEvenLongerNestedConditionPart2);", 4425 Style)); 4426 } 4427 4428 TEST_F(FormatTest, ExpressionIndentationStrictAlign) { 4429 FormatStyle Style = getLLVMStyle(); 4430 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 4431 Style.AlignOperands = FormatStyle::OAS_AlignAfterOperator; 4432 4433 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4434 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4435 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4436 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4437 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4438 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4439 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4440 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4441 " > ccccccccccccccccccccccccccccccccccccccccc;", 4442 Style); 4443 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4444 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4445 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4446 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4447 Style); 4448 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4449 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4450 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4451 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4452 Style); 4453 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4454 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4455 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4456 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 4457 Style); 4458 verifyFormat("if () {\n" 4459 "} else if (aaaaa\n" 4460 " && bbbbb // break\n" 4461 " > ccccc) {\n" 4462 "}", 4463 Style); 4464 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4465 " && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4466 Style); 4467 verifyFormat("return (a)\n" 4468 " // comment\n" 4469 " + b;", 4470 Style); 4471 verifyFormat( 4472 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4473 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4474 " + cc;", 4475 Style); 4476 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 4477 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 4478 " : 3333333333333333;", 4479 Style); 4480 verifyFormat( 4481 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 4482 " : ccccccccccccccc ? dddddddddddddddddd\n" 4483 " : eeeeeeeeeeeeeeeeee)\n" 4484 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 4485 " : 3333333333333333;", 4486 Style); 4487 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4488 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4489 Style); 4490 4491 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4492 " == boost::fusion::at_c<1>(iiii).second;", 4493 Style); 4494 4495 Style.ColumnLimit = 60; 4496 verifyFormat("zzzzzzzzzzzzz\n" 4497 " = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4498 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4499 Style); 4500 4501 // Forced by comments. 4502 Style.ColumnLimit = 80; 4503 verifyFormat( 4504 "unsigned ContentSize\n" 4505 " = sizeof(int16_t) // DWARF ARange version number\n" 4506 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4507 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4508 " + sizeof(int8_t); // Segment Size (in bytes)", 4509 Style); 4510 4511 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4512 verifyFormat( 4513 "unsigned ContentSize =\n" 4514 " sizeof(int16_t) // DWARF ARange version number\n" 4515 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4516 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4517 " + sizeof(int8_t); // Segment Size (in bytes)", 4518 Style); 4519 4520 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4521 verifyFormat( 4522 "unsigned ContentSize =\n" 4523 " sizeof(int16_t) // DWARF ARange version number\n" 4524 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4525 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4526 " + sizeof(int8_t); // Segment Size (in bytes)", 4527 Style); 4528 } 4529 4530 TEST_F(FormatTest, EnforcedOperatorWraps) { 4531 // Here we'd like to wrap after the || operators, but a comment is forcing an 4532 // earlier wrap. 4533 verifyFormat("bool x = aaaaa //\n" 4534 " || bbbbb\n" 4535 " //\n" 4536 " || cccc;"); 4537 } 4538 4539 TEST_F(FormatTest, NoOperandAlignment) { 4540 FormatStyle Style = getLLVMStyle(); 4541 Style.AlignOperands = FormatStyle::OAS_DontAlign; 4542 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4544 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4545 Style); 4546 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4547 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4548 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4549 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4550 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4551 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4552 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4553 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4554 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4555 " > ccccccccccccccccccccccccccccccccccccccccc;", 4556 Style); 4557 4558 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4559 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4560 " + cc;", 4561 Style); 4562 verifyFormat("int a = aa\n" 4563 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4564 " * cccccccccccccccccccccccccccccccccccc;\n", 4565 Style); 4566 4567 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4568 verifyFormat("return (a > b\n" 4569 " // comment1\n" 4570 " // comment2\n" 4571 " || c);", 4572 Style); 4573 } 4574 4575 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4576 FormatStyle Style = getLLVMStyle(); 4577 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4578 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4580 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4581 Style); 4582 } 4583 4584 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4585 FormatStyle Style = getLLVMStyle(); 4586 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4587 Style.BinPackArguments = false; 4588 Style.ColumnLimit = 40; 4589 verifyFormat("void test() {\n" 4590 " someFunction(\n" 4591 " this + argument + is + quite\n" 4592 " + long + so + it + gets + wrapped\n" 4593 " + but + remains + bin - packed);\n" 4594 "}", 4595 Style); 4596 verifyFormat("void test() {\n" 4597 " someFunction(arg1,\n" 4598 " this + argument + is\n" 4599 " + quite + long + so\n" 4600 " + it + gets + wrapped\n" 4601 " + but + remains + bin\n" 4602 " - packed,\n" 4603 " arg3);\n" 4604 "}", 4605 Style); 4606 verifyFormat("void test() {\n" 4607 " someFunction(\n" 4608 " arg1,\n" 4609 " this + argument + has\n" 4610 " + anotherFunc(nested,\n" 4611 " calls + whose\n" 4612 " + arguments\n" 4613 " + are + also\n" 4614 " + wrapped,\n" 4615 " in + addition)\n" 4616 " + to + being + bin - packed,\n" 4617 " arg3);\n" 4618 "}", 4619 Style); 4620 4621 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4622 verifyFormat("void test() {\n" 4623 " someFunction(\n" 4624 " arg1,\n" 4625 " this + argument + has +\n" 4626 " anotherFunc(nested,\n" 4627 " calls + whose +\n" 4628 " arguments +\n" 4629 " are + also +\n" 4630 " wrapped,\n" 4631 " in + addition) +\n" 4632 " to + being + bin - packed,\n" 4633 " arg3);\n" 4634 "}", 4635 Style); 4636 } 4637 4638 TEST_F(FormatTest, ConstructorInitializers) { 4639 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4640 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4641 getLLVMStyleWithColumns(45)); 4642 verifyFormat("Constructor()\n" 4643 " : Inttializer(FitsOnTheLine) {}", 4644 getLLVMStyleWithColumns(44)); 4645 verifyFormat("Constructor()\n" 4646 " : Inttializer(FitsOnTheLine) {}", 4647 getLLVMStyleWithColumns(43)); 4648 4649 verifyFormat("template <typename T>\n" 4650 "Constructor() : Initializer(FitsOnTheLine) {}", 4651 getLLVMStyleWithColumns(45)); 4652 4653 verifyFormat( 4654 "SomeClass::Constructor()\n" 4655 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4656 4657 verifyFormat( 4658 "SomeClass::Constructor()\n" 4659 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4660 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4661 verifyFormat( 4662 "SomeClass::Constructor()\n" 4663 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4664 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4665 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4666 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4667 " : aaaaaaaaaa(aaaaaa) {}"); 4668 4669 verifyFormat("Constructor()\n" 4670 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4671 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4672 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4673 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4674 4675 verifyFormat("Constructor()\n" 4676 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4677 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4678 4679 verifyFormat("Constructor(int Parameter = 0)\n" 4680 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4681 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4682 verifyFormat("Constructor()\n" 4683 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4684 "}", 4685 getLLVMStyleWithColumns(60)); 4686 verifyFormat("Constructor()\n" 4687 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4688 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4689 4690 // Here a line could be saved by splitting the second initializer onto two 4691 // lines, but that is not desirable. 4692 verifyFormat("Constructor()\n" 4693 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4694 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4695 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4696 4697 FormatStyle OnePerLine = getLLVMStyle(); 4698 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4699 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4700 verifyFormat("SomeClass::Constructor()\n" 4701 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4702 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4703 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4704 OnePerLine); 4705 verifyFormat("SomeClass::Constructor()\n" 4706 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4707 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4708 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4709 OnePerLine); 4710 verifyFormat("MyClass::MyClass(int var)\n" 4711 " : some_var_(var), // 4 space indent\n" 4712 " some_other_var_(var + 1) { // lined up\n" 4713 "}", 4714 OnePerLine); 4715 verifyFormat("Constructor()\n" 4716 " : aaaaa(aaaaaa),\n" 4717 " aaaaa(aaaaaa),\n" 4718 " aaaaa(aaaaaa),\n" 4719 " aaaaa(aaaaaa),\n" 4720 " aaaaa(aaaaaa) {}", 4721 OnePerLine); 4722 verifyFormat("Constructor()\n" 4723 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4724 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4725 OnePerLine); 4726 OnePerLine.BinPackParameters = false; 4727 verifyFormat( 4728 "Constructor()\n" 4729 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4730 " aaaaaaaaaaa().aaa(),\n" 4731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4732 OnePerLine); 4733 OnePerLine.ColumnLimit = 60; 4734 verifyFormat("Constructor()\n" 4735 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4736 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4737 OnePerLine); 4738 4739 EXPECT_EQ("Constructor()\n" 4740 " : // Comment forcing unwanted break.\n" 4741 " aaaa(aaaa) {}", 4742 format("Constructor() :\n" 4743 " // Comment forcing unwanted break.\n" 4744 " aaaa(aaaa) {}")); 4745 } 4746 4747 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4748 FormatStyle Style = getLLVMStyle(); 4749 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4750 Style.ColumnLimit = 60; 4751 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4752 Style.AllowAllConstructorInitializersOnNextLine = true; 4753 Style.BinPackParameters = false; 4754 4755 for (int i = 0; i < 4; ++i) { 4756 // Test all combinations of parameters that should not have an effect. 4757 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4758 Style.AllowAllArgumentsOnNextLine = i & 2; 4759 4760 Style.AllowAllConstructorInitializersOnNextLine = true; 4761 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4762 verifyFormat("Constructor()\n" 4763 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4764 Style); 4765 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4766 4767 Style.AllowAllConstructorInitializersOnNextLine = false; 4768 verifyFormat("Constructor()\n" 4769 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4770 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4771 Style); 4772 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4773 4774 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4775 Style.AllowAllConstructorInitializersOnNextLine = true; 4776 verifyFormat("Constructor()\n" 4777 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4778 Style); 4779 4780 Style.AllowAllConstructorInitializersOnNextLine = false; 4781 verifyFormat("Constructor()\n" 4782 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4783 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4784 Style); 4785 4786 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4787 Style.AllowAllConstructorInitializersOnNextLine = true; 4788 verifyFormat("Constructor() :\n" 4789 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4790 Style); 4791 4792 Style.AllowAllConstructorInitializersOnNextLine = false; 4793 verifyFormat("Constructor() :\n" 4794 " aaaaaaaaaaaaaaaaaa(a),\n" 4795 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4796 Style); 4797 } 4798 4799 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4800 // AllowAllConstructorInitializersOnNextLine in all 4801 // BreakConstructorInitializers modes 4802 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4803 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4804 Style.AllowAllConstructorInitializersOnNextLine = false; 4805 verifyFormat("SomeClassWithALongName::Constructor(\n" 4806 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4807 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4808 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4809 Style); 4810 4811 Style.AllowAllConstructorInitializersOnNextLine = true; 4812 verifyFormat("SomeClassWithALongName::Constructor(\n" 4813 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4814 " int bbbbbbbbbbbbb,\n" 4815 " int cccccccccccccccc)\n" 4816 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4817 Style); 4818 4819 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4820 Style.AllowAllConstructorInitializersOnNextLine = false; 4821 verifyFormat("SomeClassWithALongName::Constructor(\n" 4822 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4823 " int bbbbbbbbbbbbb)\n" 4824 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4825 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4826 Style); 4827 4828 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4829 4830 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4831 verifyFormat("SomeClassWithALongName::Constructor(\n" 4832 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4833 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4834 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4835 Style); 4836 4837 Style.AllowAllConstructorInitializersOnNextLine = true; 4838 verifyFormat("SomeClassWithALongName::Constructor(\n" 4839 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4840 " int bbbbbbbbbbbbb,\n" 4841 " int cccccccccccccccc)\n" 4842 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4843 Style); 4844 4845 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4846 Style.AllowAllConstructorInitializersOnNextLine = false; 4847 verifyFormat("SomeClassWithALongName::Constructor(\n" 4848 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4849 " int bbbbbbbbbbbbb)\n" 4850 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4851 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4852 Style); 4853 4854 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4855 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4856 verifyFormat("SomeClassWithALongName::Constructor(\n" 4857 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4858 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4859 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4860 Style); 4861 4862 Style.AllowAllConstructorInitializersOnNextLine = true; 4863 verifyFormat("SomeClassWithALongName::Constructor(\n" 4864 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4865 " int bbbbbbbbbbbbb,\n" 4866 " int cccccccccccccccc) :\n" 4867 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4868 Style); 4869 4870 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4871 Style.AllowAllConstructorInitializersOnNextLine = false; 4872 verifyFormat("SomeClassWithALongName::Constructor(\n" 4873 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4874 " int bbbbbbbbbbbbb) :\n" 4875 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4876 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4877 Style); 4878 } 4879 4880 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4881 FormatStyle Style = getLLVMStyle(); 4882 Style.ColumnLimit = 60; 4883 Style.BinPackArguments = false; 4884 for (int i = 0; i < 4; ++i) { 4885 // Test all combinations of parameters that should not have an effect. 4886 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4887 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4888 4889 Style.AllowAllArgumentsOnNextLine = true; 4890 verifyFormat("void foo() {\n" 4891 " FunctionCallWithReallyLongName(\n" 4892 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4893 "}", 4894 Style); 4895 Style.AllowAllArgumentsOnNextLine = false; 4896 verifyFormat("void foo() {\n" 4897 " FunctionCallWithReallyLongName(\n" 4898 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4899 " bbbbbbbbbbbb);\n" 4900 "}", 4901 Style); 4902 4903 Style.AllowAllArgumentsOnNextLine = true; 4904 verifyFormat("void foo() {\n" 4905 " auto VariableWithReallyLongName = {\n" 4906 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4907 "}", 4908 Style); 4909 Style.AllowAllArgumentsOnNextLine = false; 4910 verifyFormat("void foo() {\n" 4911 " auto VariableWithReallyLongName = {\n" 4912 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4913 " bbbbbbbbbbbb};\n" 4914 "}", 4915 Style); 4916 } 4917 4918 // This parameter should not affect declarations. 4919 Style.BinPackParameters = false; 4920 Style.AllowAllArgumentsOnNextLine = false; 4921 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4922 verifyFormat("void FunctionCallWithReallyLongName(\n" 4923 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4924 Style); 4925 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4926 verifyFormat("void FunctionCallWithReallyLongName(\n" 4927 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4928 " int bbbbbbbbbbbb);", 4929 Style); 4930 } 4931 4932 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4933 FormatStyle Style = getLLVMStyle(); 4934 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4935 4936 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4937 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4938 getStyleWithColumns(Style, 45)); 4939 verifyFormat("Constructor() :\n" 4940 " Initializer(FitsOnTheLine) {}", 4941 getStyleWithColumns(Style, 44)); 4942 verifyFormat("Constructor() :\n" 4943 " Initializer(FitsOnTheLine) {}", 4944 getStyleWithColumns(Style, 43)); 4945 4946 verifyFormat("template <typename T>\n" 4947 "Constructor() : Initializer(FitsOnTheLine) {}", 4948 getStyleWithColumns(Style, 50)); 4949 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4950 verifyFormat( 4951 "SomeClass::Constructor() :\n" 4952 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4953 Style); 4954 4955 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4956 verifyFormat( 4957 "SomeClass::Constructor() :\n" 4958 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4959 Style); 4960 4961 verifyFormat( 4962 "SomeClass::Constructor() :\n" 4963 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4964 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4965 Style); 4966 verifyFormat( 4967 "SomeClass::Constructor() :\n" 4968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4969 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4970 Style); 4971 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4972 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4973 " aaaaaaaaaa(aaaaaa) {}", 4974 Style); 4975 4976 verifyFormat("Constructor() :\n" 4977 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4978 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4979 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4980 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4981 Style); 4982 4983 verifyFormat("Constructor() :\n" 4984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4986 Style); 4987 4988 verifyFormat("Constructor(int Parameter = 0) :\n" 4989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4990 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4991 Style); 4992 verifyFormat("Constructor() :\n" 4993 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4994 "}", 4995 getStyleWithColumns(Style, 60)); 4996 verifyFormat("Constructor() :\n" 4997 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4998 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4999 Style); 5000 5001 // Here a line could be saved by splitting the second initializer onto two 5002 // lines, but that is not desirable. 5003 verifyFormat("Constructor() :\n" 5004 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 5005 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 5006 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5007 Style); 5008 5009 FormatStyle OnePerLine = Style; 5010 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5011 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 5012 verifyFormat("SomeClass::Constructor() :\n" 5013 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5014 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5015 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5016 OnePerLine); 5017 verifyFormat("SomeClass::Constructor() :\n" 5018 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 5019 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 5020 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 5021 OnePerLine); 5022 verifyFormat("MyClass::MyClass(int var) :\n" 5023 " some_var_(var), // 4 space indent\n" 5024 " some_other_var_(var + 1) { // lined up\n" 5025 "}", 5026 OnePerLine); 5027 verifyFormat("Constructor() :\n" 5028 " aaaaa(aaaaaa),\n" 5029 " aaaaa(aaaaaa),\n" 5030 " aaaaa(aaaaaa),\n" 5031 " aaaaa(aaaaaa),\n" 5032 " aaaaa(aaaaaa) {}", 5033 OnePerLine); 5034 verifyFormat("Constructor() :\n" 5035 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 5036 " aaaaaaaaaaaaaaaaaaaaaa) {}", 5037 OnePerLine); 5038 OnePerLine.BinPackParameters = false; 5039 verifyFormat("Constructor() :\n" 5040 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5041 " aaaaaaaaaaa().aaa(),\n" 5042 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5043 OnePerLine); 5044 OnePerLine.ColumnLimit = 60; 5045 verifyFormat("Constructor() :\n" 5046 " aaaaaaaaaaaaaaaaaaaa(a),\n" 5047 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 5048 OnePerLine); 5049 5050 EXPECT_EQ("Constructor() :\n" 5051 " // Comment forcing unwanted break.\n" 5052 " aaaa(aaaa) {}", 5053 format("Constructor() :\n" 5054 " // Comment forcing unwanted break.\n" 5055 " aaaa(aaaa) {}", 5056 Style)); 5057 5058 Style.ColumnLimit = 0; 5059 verifyFormat("SomeClass::Constructor() :\n" 5060 " a(a) {}", 5061 Style); 5062 verifyFormat("SomeClass::Constructor() noexcept :\n" 5063 " a(a) {}", 5064 Style); 5065 verifyFormat("SomeClass::Constructor() :\n" 5066 " a(a), b(b), c(c) {}", 5067 Style); 5068 verifyFormat("SomeClass::Constructor() :\n" 5069 " a(a) {\n" 5070 " foo();\n" 5071 " bar();\n" 5072 "}", 5073 Style); 5074 5075 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 5076 verifyFormat("SomeClass::Constructor() :\n" 5077 " a(a), b(b), c(c) {\n" 5078 "}", 5079 Style); 5080 verifyFormat("SomeClass::Constructor() :\n" 5081 " a(a) {\n" 5082 "}", 5083 Style); 5084 5085 Style.ColumnLimit = 80; 5086 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 5087 Style.ConstructorInitializerIndentWidth = 2; 5088 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 5089 verifyFormat("SomeClass::Constructor() :\n" 5090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5091 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 5092 Style); 5093 5094 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 5095 // well 5096 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 5097 verifyFormat( 5098 "class SomeClass\n" 5099 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5100 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5101 Style); 5102 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 5103 verifyFormat( 5104 "class SomeClass\n" 5105 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5106 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5107 Style); 5108 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 5109 verifyFormat( 5110 "class SomeClass :\n" 5111 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5112 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 5113 Style); 5114 } 5115 5116 #ifndef EXPENSIVE_CHECKS 5117 // Expensive checks enables libstdc++ checking which includes validating the 5118 // state of ranges used in std::priority_queue - this blows out the 5119 // runtime/scalability of the function and makes this test unacceptably slow. 5120 TEST_F(FormatTest, MemoizationTests) { 5121 // This breaks if the memoization lookup does not take \c Indent and 5122 // \c LastSpace into account. 5123 verifyFormat( 5124 "extern CFRunLoopTimerRef\n" 5125 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 5126 " CFTimeInterval interval, CFOptionFlags flags,\n" 5127 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 5128 " CFRunLoopTimerContext *context) {}"); 5129 5130 // Deep nesting somewhat works around our memoization. 5131 verifyFormat( 5132 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5133 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5134 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5135 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 5136 " aaaaa())))))))))))))))))))))))))))))))))))))));", 5137 getLLVMStyleWithColumns(65)); 5138 verifyFormat( 5139 "aaaaa(\n" 5140 " aaaaa,\n" 5141 " aaaaa(\n" 5142 " aaaaa,\n" 5143 " aaaaa(\n" 5144 " aaaaa,\n" 5145 " aaaaa(\n" 5146 " aaaaa,\n" 5147 " aaaaa(\n" 5148 " aaaaa,\n" 5149 " aaaaa(\n" 5150 " aaaaa,\n" 5151 " aaaaa(\n" 5152 " aaaaa,\n" 5153 " aaaaa(\n" 5154 " aaaaa,\n" 5155 " aaaaa(\n" 5156 " aaaaa,\n" 5157 " aaaaa(\n" 5158 " aaaaa,\n" 5159 " aaaaa(\n" 5160 " aaaaa,\n" 5161 " aaaaa(\n" 5162 " aaaaa,\n" 5163 " aaaaa))))))))))));", 5164 getLLVMStyleWithColumns(65)); 5165 verifyFormat( 5166 "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" 5167 " a),\n" 5168 " a),\n" 5169 " a),\n" 5170 " a),\n" 5171 " a),\n" 5172 " a),\n" 5173 " a),\n" 5174 " a),\n" 5175 " a),\n" 5176 " a),\n" 5177 " a),\n" 5178 " a),\n" 5179 " a),\n" 5180 " a),\n" 5181 " a),\n" 5182 " a),\n" 5183 " a)", 5184 getLLVMStyleWithColumns(65)); 5185 5186 // This test takes VERY long when memoization is broken. 5187 FormatStyle OnePerLine = getLLVMStyle(); 5188 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 5189 OnePerLine.BinPackParameters = false; 5190 std::string input = "Constructor()\n" 5191 " : aaaa(a,\n"; 5192 for (unsigned i = 0, e = 80; i != e; ++i) { 5193 input += " a,\n"; 5194 } 5195 input += " a) {}"; 5196 verifyFormat(input, OnePerLine); 5197 } 5198 #endif 5199 5200 TEST_F(FormatTest, BreaksAsHighAsPossible) { 5201 verifyFormat( 5202 "void f() {\n" 5203 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 5204 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 5205 " f();\n" 5206 "}"); 5207 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 5208 " Intervals[i - 1].getRange().getLast()) {\n}"); 5209 } 5210 5211 TEST_F(FormatTest, BreaksFunctionDeclarations) { 5212 // Principially, we break function declarations in a certain order: 5213 // 1) break amongst arguments. 5214 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 5215 " Cccccccccccccc cccccccccccccc);"); 5216 verifyFormat("template <class TemplateIt>\n" 5217 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 5218 " TemplateIt *stop) {}"); 5219 5220 // 2) break after return type. 5221 verifyFormat( 5222 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5223 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 5224 getGoogleStyle()); 5225 5226 // 3) break after (. 5227 verifyFormat( 5228 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 5229 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 5230 getGoogleStyle()); 5231 5232 // 4) break before after nested name specifiers. 5233 verifyFormat( 5234 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5235 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 5236 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 5237 getGoogleStyle()); 5238 5239 // However, there are exceptions, if a sufficient amount of lines can be 5240 // saved. 5241 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 5242 // more adjusting. 5243 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5244 " Cccccccccccccc cccccccccc,\n" 5245 " Cccccccccccccc cccccccccc,\n" 5246 " Cccccccccccccc cccccccccc,\n" 5247 " Cccccccccccccc cccccccccc);"); 5248 verifyFormat( 5249 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5250 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5251 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5252 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 5253 getGoogleStyle()); 5254 verifyFormat( 5255 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 5256 " Cccccccccccccc cccccccccc,\n" 5257 " Cccccccccccccc cccccccccc,\n" 5258 " Cccccccccccccc cccccccccc,\n" 5259 " Cccccccccccccc cccccccccc,\n" 5260 " Cccccccccccccc cccccccccc,\n" 5261 " Cccccccccccccc cccccccccc);"); 5262 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5263 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5264 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5265 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 5266 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 5267 5268 // Break after multi-line parameters. 5269 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5271 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5272 " bbbb bbbb);"); 5273 verifyFormat("void SomeLoooooooooooongFunction(\n" 5274 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 5275 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5276 " int bbbbbbbbbbbbb);"); 5277 5278 // Treat overloaded operators like other functions. 5279 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5280 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 5281 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5282 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 5283 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 5284 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 5285 verifyGoogleFormat( 5286 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 5287 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5288 verifyGoogleFormat( 5289 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 5290 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 5291 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5292 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5293 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 5294 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 5295 verifyGoogleFormat( 5296 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 5297 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5298 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 5299 verifyGoogleFormat("template <typename T>\n" 5300 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5301 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 5302 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 5303 5304 FormatStyle Style = getLLVMStyle(); 5305 Style.PointerAlignment = FormatStyle::PAS_Left; 5306 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5307 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 5308 Style); 5309 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 5310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5311 Style); 5312 } 5313 5314 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 5315 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 5316 // Prefer keeping `::` followed by `operator` together. 5317 EXPECT_EQ("const aaaa::bbbbbbb &\n" 5318 "ccccccccc::operator++() {\n" 5319 " stuff();\n" 5320 "}", 5321 format("const aaaa::bbbbbbb\n" 5322 "&ccccccccc::operator++() { stuff(); }", 5323 getLLVMStyleWithColumns(40))); 5324 } 5325 5326 TEST_F(FormatTest, TrailingReturnType) { 5327 verifyFormat("auto foo() -> int;\n"); 5328 // correct trailing return type spacing 5329 verifyFormat("auto operator->() -> int;\n"); 5330 verifyFormat("auto operator++(int) -> int;\n"); 5331 5332 verifyFormat("struct S {\n" 5333 " auto bar() const -> int;\n" 5334 "};"); 5335 verifyFormat("template <size_t Order, typename T>\n" 5336 "auto load_img(const std::string &filename)\n" 5337 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 5338 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 5339 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 5340 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 5341 verifyFormat("template <typename T>\n" 5342 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 5343 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 5344 5345 // Not trailing return types. 5346 verifyFormat("void f() { auto a = b->c(); }"); 5347 } 5348 5349 TEST_F(FormatTest, DeductionGuides) { 5350 verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;"); 5351 verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;"); 5352 verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;"); 5353 verifyFormat( 5354 "template <class... T>\n" 5355 "array(T &&...t) -> array<std::common_type_t<T...>, sizeof...(T)>;"); 5356 verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;"); 5357 verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;"); 5358 verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;"); 5359 verifyFormat("template <class T> A() -> A<(3 < 2)>;"); 5360 verifyFormat("template <class T> A() -> A<((3) < (2))>;"); 5361 verifyFormat("template <class T> x() -> x<1>;"); 5362 verifyFormat("template <class T> explicit x(T &) -> x<1>;"); 5363 5364 // Ensure not deduction guides. 5365 verifyFormat("c()->f<int>();"); 5366 verifyFormat("x()->foo<1>;"); 5367 verifyFormat("x = p->foo<3>();"); 5368 verifyFormat("x()->x<1>();"); 5369 verifyFormat("x()->x<1>;"); 5370 } 5371 5372 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 5373 // Avoid breaking before trailing 'const' or other trailing annotations, if 5374 // they are not function-like. 5375 FormatStyle Style = getGoogleStyle(); 5376 Style.ColumnLimit = 47; 5377 verifyFormat("void someLongFunction(\n" 5378 " int someLoooooooooooooongParameter) const {\n}", 5379 getLLVMStyleWithColumns(47)); 5380 verifyFormat("LoooooongReturnType\n" 5381 "someLoooooooongFunction() const {}", 5382 getLLVMStyleWithColumns(47)); 5383 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 5384 " const {}", 5385 Style); 5386 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5387 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 5388 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5389 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 5390 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 5391 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 5392 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 5393 " aaaaaaaaaaa aaaaa) const override;"); 5394 verifyGoogleFormat( 5395 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5396 " const override;"); 5397 5398 // Even if the first parameter has to be wrapped. 5399 verifyFormat("void someLongFunction(\n" 5400 " int someLongParameter) const {}", 5401 getLLVMStyleWithColumns(46)); 5402 verifyFormat("void someLongFunction(\n" 5403 " int someLongParameter) const {}", 5404 Style); 5405 verifyFormat("void someLongFunction(\n" 5406 " int someLongParameter) override {}", 5407 Style); 5408 verifyFormat("void someLongFunction(\n" 5409 " int someLongParameter) OVERRIDE {}", 5410 Style); 5411 verifyFormat("void someLongFunction(\n" 5412 " int someLongParameter) final {}", 5413 Style); 5414 verifyFormat("void someLongFunction(\n" 5415 " int someLongParameter) FINAL {}", 5416 Style); 5417 verifyFormat("void someLongFunction(\n" 5418 " int parameter) const override {}", 5419 Style); 5420 5421 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 5422 verifyFormat("void someLongFunction(\n" 5423 " int someLongParameter) const\n" 5424 "{\n" 5425 "}", 5426 Style); 5427 5428 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 5429 verifyFormat("void someLongFunction(\n" 5430 " int someLongParameter) const\n" 5431 " {\n" 5432 " }", 5433 Style); 5434 5435 // Unless these are unknown annotations. 5436 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 5437 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5438 " LONG_AND_UGLY_ANNOTATION;"); 5439 5440 // Breaking before function-like trailing annotations is fine to keep them 5441 // close to their arguments. 5442 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5443 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5444 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5445 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 5446 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 5447 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 5448 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 5449 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 5450 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 5451 5452 verifyFormat( 5453 "void aaaaaaaaaaaaaaaaaa()\n" 5454 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 5455 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 5456 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5457 " __attribute__((unused));"); 5458 verifyGoogleFormat( 5459 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5460 " GUARDED_BY(aaaaaaaaaaaa);"); 5461 verifyGoogleFormat( 5462 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5463 " GUARDED_BY(aaaaaaaaaaaa);"); 5464 verifyGoogleFormat( 5465 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5466 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5467 verifyGoogleFormat( 5468 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 5469 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5470 } 5471 5472 TEST_F(FormatTest, FunctionAnnotations) { 5473 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5474 "int OldFunction(const string ¶meter) {}"); 5475 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5476 "string OldFunction(const string ¶meter) {}"); 5477 verifyFormat("template <typename T>\n" 5478 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 5479 "string OldFunction(const string ¶meter) {}"); 5480 5481 // Not function annotations. 5482 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5483 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 5484 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 5485 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 5486 verifyFormat("MACRO(abc).function() // wrap\n" 5487 " << abc;"); 5488 verifyFormat("MACRO(abc)->function() // wrap\n" 5489 " << abc;"); 5490 verifyFormat("MACRO(abc)::function() // wrap\n" 5491 " << abc;"); 5492 } 5493 5494 TEST_F(FormatTest, BreaksDesireably) { 5495 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5496 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 5497 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 5498 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 5500 "}"); 5501 5502 verifyFormat( 5503 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 5505 5506 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5507 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5509 5510 verifyFormat( 5511 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5512 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5514 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5515 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 5516 5517 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5518 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5519 5520 verifyFormat( 5521 "void f() {\n" 5522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5524 "}"); 5525 verifyFormat( 5526 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5528 verifyFormat( 5529 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5530 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5531 verifyFormat( 5532 "aaaaaa(aaa,\n" 5533 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5534 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5535 " aaaa);"); 5536 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5537 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5539 5540 // Indent consistently independent of call expression and unary operator. 5541 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5542 " dddddddddddddddddddddddddddddd));"); 5543 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5544 " dddddddddddddddddddddddddddddd));"); 5545 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5546 " dddddddddddddddddddddddddddddd));"); 5547 5548 // This test case breaks on an incorrect memoization, i.e. an optimization not 5549 // taking into account the StopAt value. 5550 verifyFormat( 5551 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5552 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5553 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5554 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5555 5556 verifyFormat("{\n {\n {\n" 5557 " Annotation.SpaceRequiredBefore =\n" 5558 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5559 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5560 " }\n }\n}"); 5561 5562 // Break on an outer level if there was a break on an inner level. 5563 EXPECT_EQ("f(g(h(a, // comment\n" 5564 " b, c),\n" 5565 " d, e),\n" 5566 " x, y);", 5567 format("f(g(h(a, // comment\n" 5568 " b, c), d, e), x, y);")); 5569 5570 // Prefer breaking similar line breaks. 5571 verifyFormat( 5572 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5573 " NSTrackingMouseEnteredAndExited |\n" 5574 " NSTrackingActiveAlways;"); 5575 } 5576 5577 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5578 FormatStyle NoBinPacking = getGoogleStyle(); 5579 NoBinPacking.BinPackParameters = false; 5580 NoBinPacking.BinPackArguments = true; 5581 verifyFormat("void f() {\n" 5582 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5584 "}", 5585 NoBinPacking); 5586 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5587 " int aaaaaaaaaaaaaaaaaaaa,\n" 5588 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5589 NoBinPacking); 5590 5591 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5592 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5593 " vector<int> bbbbbbbbbbbbbbb);", 5594 NoBinPacking); 5595 // FIXME: This behavior difference is probably not wanted. However, currently 5596 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5597 // template arguments from BreakBeforeParameter being set because of the 5598 // one-per-line formatting. 5599 verifyFormat( 5600 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5601 " aaaaaaaaaa> aaaaaaaaaa);", 5602 NoBinPacking); 5603 verifyFormat( 5604 "void fffffffffff(\n" 5605 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5606 " aaaaaaaaaa);"); 5607 } 5608 5609 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5610 FormatStyle NoBinPacking = getGoogleStyle(); 5611 NoBinPacking.BinPackParameters = false; 5612 NoBinPacking.BinPackArguments = false; 5613 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5614 " aaaaaaaaaaaaaaaaaaaa,\n" 5615 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5616 NoBinPacking); 5617 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5618 " aaaaaaaaaaaaa,\n" 5619 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5620 NoBinPacking); 5621 verifyFormat( 5622 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5623 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5625 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5627 NoBinPacking); 5628 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5629 " .aaaaaaaaaaaaaaaaaa();", 5630 NoBinPacking); 5631 verifyFormat("void f() {\n" 5632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5633 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5634 "}", 5635 NoBinPacking); 5636 5637 verifyFormat( 5638 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5639 " aaaaaaaaaaaa,\n" 5640 " aaaaaaaaaaaa);", 5641 NoBinPacking); 5642 verifyFormat( 5643 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5644 " ddddddddddddddddddddddddddddd),\n" 5645 " test);", 5646 NoBinPacking); 5647 5648 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5649 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5650 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5651 " aaaaaaaaaaaaaaaaaa;", 5652 NoBinPacking); 5653 verifyFormat("a(\"a\"\n" 5654 " \"a\",\n" 5655 " a);"); 5656 5657 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5658 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5659 " aaaaaaaaa,\n" 5660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5661 NoBinPacking); 5662 verifyFormat( 5663 "void f() {\n" 5664 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5665 " .aaaaaaa();\n" 5666 "}", 5667 NoBinPacking); 5668 verifyFormat( 5669 "template <class SomeType, class SomeOtherType>\n" 5670 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5671 NoBinPacking); 5672 } 5673 5674 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5675 FormatStyle Style = getLLVMStyleWithColumns(15); 5676 Style.ExperimentalAutoDetectBinPacking = true; 5677 EXPECT_EQ("aaa(aaaa,\n" 5678 " aaaa,\n" 5679 " aaaa);\n" 5680 "aaa(aaaa,\n" 5681 " aaaa,\n" 5682 " aaaa);", 5683 format("aaa(aaaa,\n" // one-per-line 5684 " aaaa,\n" 5685 " aaaa );\n" 5686 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5687 Style)); 5688 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5689 " aaaa);\n" 5690 "aaa(aaaa, aaaa,\n" 5691 " aaaa);", 5692 format("aaa(aaaa, aaaa,\n" // bin-packed 5693 " aaaa );\n" 5694 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5695 Style)); 5696 } 5697 5698 TEST_F(FormatTest, FormatsBuilderPattern) { 5699 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5700 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5701 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5702 " .StartsWith(\".init\", ORDER_INIT)\n" 5703 " .StartsWith(\".fini\", ORDER_FINI)\n" 5704 " .StartsWith(\".hash\", ORDER_HASH)\n" 5705 " .Default(ORDER_TEXT);\n"); 5706 5707 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5708 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5709 verifyFormat("aaaaaaa->aaaaaaa\n" 5710 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5712 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5713 verifyFormat( 5714 "aaaaaaa->aaaaaaa\n" 5715 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5716 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5717 verifyFormat( 5718 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5719 " aaaaaaaaaaaaaa);"); 5720 verifyFormat( 5721 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5722 " aaaaaa->aaaaaaaaaaaa()\n" 5723 " ->aaaaaaaaaaaaaaaa(\n" 5724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5725 " ->aaaaaaaaaaaaaaaaa();"); 5726 verifyGoogleFormat( 5727 "void f() {\n" 5728 " someo->Add((new util::filetools::Handler(dir))\n" 5729 " ->OnEvent1(NewPermanentCallback(\n" 5730 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5731 " ->OnEvent2(NewPermanentCallback(\n" 5732 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5733 " ->OnEvent3(NewPermanentCallback(\n" 5734 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5735 " ->OnEvent5(NewPermanentCallback(\n" 5736 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5737 " ->OnEvent6(NewPermanentCallback(\n" 5738 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5739 "}"); 5740 5741 verifyFormat( 5742 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5743 verifyFormat("aaaaaaaaaaaaaaa()\n" 5744 " .aaaaaaaaaaaaaaa()\n" 5745 " .aaaaaaaaaaaaaaa()\n" 5746 " .aaaaaaaaaaaaaaa()\n" 5747 " .aaaaaaaaaaaaaaa();"); 5748 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5749 " .aaaaaaaaaaaaaaa()\n" 5750 " .aaaaaaaaaaaaaaa()\n" 5751 " .aaaaaaaaaaaaaaa();"); 5752 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5753 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5754 " .aaaaaaaaaaaaaaa();"); 5755 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5756 " ->aaaaaaaaaaaaaae(0)\n" 5757 " ->aaaaaaaaaaaaaaa();"); 5758 5759 // Don't linewrap after very short segments. 5760 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5761 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5762 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5763 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5764 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5765 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5766 verifyFormat("aaa()\n" 5767 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5768 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5769 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5770 5771 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5772 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5773 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5774 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5775 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5776 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5777 5778 // Prefer not to break after empty parentheses. 5779 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5780 " First->LastNewlineOffset);"); 5781 5782 // Prefer not to create "hanging" indents. 5783 verifyFormat( 5784 "return !soooooooooooooome_map\n" 5785 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5786 " .second;"); 5787 verifyFormat( 5788 "return aaaaaaaaaaaaaaaa\n" 5789 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5790 " .aaaa(aaaaaaaaaaaaaa);"); 5791 // No hanging indent here. 5792 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5793 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5794 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5795 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5796 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5797 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5798 getLLVMStyleWithColumns(60)); 5799 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5800 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5801 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5802 getLLVMStyleWithColumns(59)); 5803 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5804 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5805 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5806 5807 // Dont break if only closing statements before member call 5808 verifyFormat("test() {\n" 5809 " ([]() -> {\n" 5810 " int b = 32;\n" 5811 " return 3;\n" 5812 " }).foo();\n" 5813 "}"); 5814 verifyFormat("test() {\n" 5815 " (\n" 5816 " []() -> {\n" 5817 " int b = 32;\n" 5818 " return 3;\n" 5819 " },\n" 5820 " foo, bar)\n" 5821 " .foo();\n" 5822 "}"); 5823 verifyFormat("test() {\n" 5824 " ([]() -> {\n" 5825 " int b = 32;\n" 5826 " return 3;\n" 5827 " })\n" 5828 " .foo()\n" 5829 " .bar();\n" 5830 "}"); 5831 verifyFormat("test() {\n" 5832 " ([]() -> {\n" 5833 " int b = 32;\n" 5834 " return 3;\n" 5835 " })\n" 5836 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5837 " \"bbbb\");\n" 5838 "}", 5839 getLLVMStyleWithColumns(30)); 5840 } 5841 5842 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5843 verifyFormat( 5844 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5845 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5846 verifyFormat( 5847 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5848 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5849 5850 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5851 " ccccccccccccccccccccccccc) {\n}"); 5852 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5853 " ccccccccccccccccccccccccc) {\n}"); 5854 5855 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5856 " ccccccccccccccccccccccccc) {\n}"); 5857 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5858 " ccccccccccccccccccccccccc) {\n}"); 5859 5860 verifyFormat( 5861 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5862 " ccccccccccccccccccccccccc) {\n}"); 5863 verifyFormat( 5864 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5865 " ccccccccccccccccccccccccc) {\n}"); 5866 5867 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5868 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5869 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5870 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5871 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5872 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5873 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5874 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5875 5876 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5877 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5878 " aaaaaaaaaaaaaaa != aa) {\n}"); 5879 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5880 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5881 " aaaaaaaaaaaaaaa != aa) {\n}"); 5882 } 5883 5884 TEST_F(FormatTest, BreaksAfterAssignments) { 5885 verifyFormat( 5886 "unsigned Cost =\n" 5887 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5888 " SI->getPointerAddressSpaceee());\n"); 5889 verifyFormat( 5890 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5891 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5892 5893 verifyFormat( 5894 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5895 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5896 verifyFormat("unsigned OriginalStartColumn =\n" 5897 " SourceMgr.getSpellingColumnNumber(\n" 5898 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5899 " 1;"); 5900 } 5901 5902 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5903 FormatStyle Style = getLLVMStyle(); 5904 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5905 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5906 Style); 5907 5908 Style.PenaltyBreakAssignment = 20; 5909 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5910 " cccccccccccccccccccccccccc;", 5911 Style); 5912 } 5913 5914 TEST_F(FormatTest, AlignsAfterAssignments) { 5915 verifyFormat( 5916 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5917 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5918 verifyFormat( 5919 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5920 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5921 verifyFormat( 5922 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5923 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5924 verifyFormat( 5925 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5926 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5927 verifyFormat( 5928 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5929 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5930 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5931 } 5932 5933 TEST_F(FormatTest, AlignsAfterReturn) { 5934 verifyFormat( 5935 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5936 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5937 verifyFormat( 5938 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5939 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5940 verifyFormat( 5941 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5942 " aaaaaaaaaaaaaaaaaaaaaa();"); 5943 verifyFormat( 5944 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5945 " aaaaaaaaaaaaaaaaaaaaaa());"); 5946 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5948 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5950 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5951 verifyFormat("return\n" 5952 " // true if code is one of a or b.\n" 5953 " code == a || code == b;"); 5954 } 5955 5956 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5957 verifyFormat( 5958 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5959 " aaaaaaaaa aaaaaaa) {}"); 5960 verifyFormat( 5961 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5962 " aaaaaaaaaaa aaaaaaaaa);"); 5963 verifyFormat( 5964 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5965 " aaaaaaaaaaaaaaaaaaaaa));"); 5966 FormatStyle Style = getLLVMStyle(); 5967 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5968 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5969 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5970 Style); 5971 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5972 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5973 Style); 5974 verifyFormat("SomeLongVariableName->someFunction(\n" 5975 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5976 Style); 5977 verifyFormat( 5978 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5979 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5980 Style); 5981 verifyFormat( 5982 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5983 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5984 Style); 5985 verifyFormat( 5986 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5987 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5988 Style); 5989 5990 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5991 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5992 " b));", 5993 Style); 5994 5995 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5996 Style.BinPackArguments = false; 5997 Style.BinPackParameters = false; 5998 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5999 " aaaaaaaaaaa aaaaaaaa,\n" 6000 " aaaaaaaaa aaaaaaa,\n" 6001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 6002 Style); 6003 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 6004 " aaaaaaaaaaa aaaaaaaaa,\n" 6005 " aaaaaaaaaaa aaaaaaaaa,\n" 6006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6007 Style); 6008 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 6009 " aaaaaaaaaaaaaaa,\n" 6010 " aaaaaaaaaaaaaaaaaaaaa,\n" 6011 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 6012 Style); 6013 verifyFormat( 6014 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 6015 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 6016 Style); 6017 verifyFormat( 6018 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 6019 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 6020 Style); 6021 verifyFormat( 6022 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 6023 " aaaaaaaaaaaaaaaaaaaaa(\n" 6024 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 6025 " aaaaaaaaaaaaaaaa);", 6026 Style); 6027 verifyFormat( 6028 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 6029 " aaaaaaaaaaaaaaaaaaaaa(\n" 6030 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 6031 " aaaaaaaaaaaaaaaa);", 6032 Style); 6033 } 6034 6035 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 6036 FormatStyle Style = getLLVMStyleWithColumns(40); 6037 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6038 " bbbbbbbbbbbbbbbbbbbbbb);", 6039 Style); 6040 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 6041 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6042 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6043 " bbbbbbbbbbbbbbbbbbbbbb);", 6044 Style); 6045 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6046 Style.AlignOperands = FormatStyle::OAS_Align; 6047 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6048 " bbbbbbbbbbbbbbbbbbbbbb);", 6049 Style); 6050 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6051 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6052 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 6053 " bbbbbbbbbbbbbbbbbbbbbb);", 6054 Style); 6055 } 6056 6057 TEST_F(FormatTest, BreaksConditionalExpressions) { 6058 verifyFormat( 6059 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6060 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6061 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6062 verifyFormat( 6063 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6064 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6065 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6066 verifyFormat( 6067 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6068 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6069 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 6070 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6071 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6072 verifyFormat( 6073 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 6074 " : aaaaaaaaaaaaa);"); 6075 verifyFormat( 6076 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6077 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6078 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6079 " aaaaaaaaaaaaa);"); 6080 verifyFormat( 6081 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6082 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6083 " aaaaaaaaaaaaa);"); 6084 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6085 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6087 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6089 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6091 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6093 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6095 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6096 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6097 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6098 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6099 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6100 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6101 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6102 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6103 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6104 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6106 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6107 " : aaaaaaaaaaaaaaaa;"); 6108 verifyFormat( 6109 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6110 " ? aaaaaaaaaaaaaaa\n" 6111 " : aaaaaaaaaaaaaaa;"); 6112 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6113 " aaaaaaaaa\n" 6114 " ? b\n" 6115 " : c);"); 6116 verifyFormat("return aaaa == bbbb\n" 6117 " // comment\n" 6118 " ? aaaa\n" 6119 " : bbbb;"); 6120 verifyFormat("unsigned Indent =\n" 6121 " format(TheLine.First,\n" 6122 " IndentForLevel[TheLine.Level] >= 0\n" 6123 " ? IndentForLevel[TheLine.Level]\n" 6124 " : TheLine * 2,\n" 6125 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6126 getLLVMStyleWithColumns(60)); 6127 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6128 " ? aaaaaaaaaaaaaaa\n" 6129 " : bbbbbbbbbbbbbbb //\n" 6130 " ? ccccccccccccccc\n" 6131 " : ddddddddddddddd;"); 6132 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 6133 " ? aaaaaaaaaaaaaaa\n" 6134 " : (bbbbbbbbbbbbbbb //\n" 6135 " ? ccccccccccccccc\n" 6136 " : ddddddddddddddd);"); 6137 verifyFormat( 6138 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6139 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 6140 " aaaaaaaaaaaaaaaaaaaaa +\n" 6141 " aaaaaaaaaaaaaaaaaaaaa\n" 6142 " : aaaaaaaaaa;"); 6143 verifyFormat( 6144 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6145 " : aaaaaaaaaaaaaaaaaaaaaa\n" 6146 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6147 6148 FormatStyle NoBinPacking = getLLVMStyle(); 6149 NoBinPacking.BinPackArguments = false; 6150 verifyFormat( 6151 "void f() {\n" 6152 " g(aaa,\n" 6153 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6154 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6155 " ? aaaaaaaaaaaaaaa\n" 6156 " : aaaaaaaaaaaaaaa);\n" 6157 "}", 6158 NoBinPacking); 6159 verifyFormat( 6160 "void f() {\n" 6161 " g(aaa,\n" 6162 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 6163 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6164 " ?: aaaaaaaaaaaaaaa);\n" 6165 "}", 6166 NoBinPacking); 6167 6168 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 6169 " // comment.\n" 6170 " ccccccccccccccccccccccccccccccccccccccc\n" 6171 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6172 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 6173 6174 // Assignments in conditional expressions. Apparently not uncommon :-(. 6175 verifyFormat("return a != b\n" 6176 " // comment\n" 6177 " ? a = b\n" 6178 " : a = b;"); 6179 verifyFormat("return a != b\n" 6180 " // comment\n" 6181 " ? a = a != b\n" 6182 " // comment\n" 6183 " ? a = b\n" 6184 " : a\n" 6185 " : a;\n"); 6186 verifyFormat("return a != b\n" 6187 " // comment\n" 6188 " ? a\n" 6189 " : a = a != b\n" 6190 " // comment\n" 6191 " ? a = b\n" 6192 " : a;"); 6193 6194 // Chained conditionals 6195 FormatStyle Style = getLLVMStyle(); 6196 Style.ColumnLimit = 70; 6197 Style.AlignOperands = FormatStyle::OAS_Align; 6198 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6199 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6200 " : 3333333333333333;", 6201 Style); 6202 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6203 " : bbbbbbbbbb ? 2222222222222222\n" 6204 " : 3333333333333333;", 6205 Style); 6206 verifyFormat("return aaaaaaaaaa ? 1111111111111111\n" 6207 " : bbbbbbbbbbbbbbbb ? 2222222222222222\n" 6208 " : 3333333333333333;", 6209 Style); 6210 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6211 " : bbbbbbbbbbbbbb ? 222222\n" 6212 " : 333333;", 6213 Style); 6214 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6215 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6216 " : cccccccccccccc ? 3333333333333333\n" 6217 " : 4444444444444444;", 6218 Style); 6219 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n" 6220 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6221 " : 3333333333333333;", 6222 Style); 6223 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6224 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6225 " : (aaa ? bbb : ccc);", 6226 Style); 6227 verifyFormat( 6228 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6229 " : cccccccccccccccccc)\n" 6230 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6231 " : 3333333333333333;", 6232 Style); 6233 verifyFormat( 6234 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6235 " : cccccccccccccccccc)\n" 6236 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6237 " : 3333333333333333;", 6238 Style); 6239 verifyFormat( 6240 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6241 " : dddddddddddddddddd)\n" 6242 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6243 " : 3333333333333333;", 6244 Style); 6245 verifyFormat( 6246 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6247 " : dddddddddddddddddd)\n" 6248 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6249 " : 3333333333333333;", 6250 Style); 6251 verifyFormat( 6252 "return aaaaaaaaa ? 1111111111111111\n" 6253 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6254 " : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6255 " : dddddddddddddddddd)\n", 6256 Style); 6257 verifyFormat( 6258 "return aaaaaaaaaaaaaaaa ? 1111111111111111\n" 6259 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6260 " : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6261 " : cccccccccccccccccc);", 6262 Style); 6263 verifyFormat( 6264 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6265 " : ccccccccccccccc ? dddddddddddddddddd\n" 6266 " : eeeeeeeeeeeeeeeeee)\n" 6267 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6268 " : 3333333333333333;", 6269 Style); 6270 verifyFormat( 6271 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6272 " : ccccccccccccccc ? dddddddddddddddddd\n" 6273 " : eeeeeeeeeeeeeeeeee)\n" 6274 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6275 " : 3333333333333333;", 6276 Style); 6277 verifyFormat( 6278 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6279 " : cccccccccccc ? dddddddddddddddddd\n" 6280 " : eeeeeeeeeeeeeeeeee)\n" 6281 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6282 " : 3333333333333333;", 6283 Style); 6284 verifyFormat( 6285 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6286 " : cccccccccccccccccc\n" 6287 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6288 " : 3333333333333333;", 6289 Style); 6290 verifyFormat( 6291 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6292 " : cccccccccccccccc ? dddddddddddddddddd\n" 6293 " : eeeeeeeeeeeeeeeeee\n" 6294 " : bbbbbbbbbbbbbb ? 2222222222222222\n" 6295 " : 3333333333333333;", 6296 Style); 6297 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n" 6298 " ? (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6299 " : cccccccccccccccccc ? dddddddddddddddddd\n" 6300 " : eeeeeeeeeeeeeeeeee)\n" 6301 " : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6302 " : 3333333333333333;", 6303 Style); 6304 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n" 6305 " ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n" 6306 " : cccccccccccccccc ? dddddddddddddddddd\n" 6307 " : eeeeeeeeeeeeeeeeee\n" 6308 " : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n" 6309 " : 3333333333333333;", 6310 Style); 6311 6312 Style.AlignOperands = FormatStyle::OAS_DontAlign; 6313 Style.BreakBeforeTernaryOperators = false; 6314 // FIXME: Aligning the question marks is weird given DontAlign. 6315 // Consider disabling this alignment in this case. Also check whether this 6316 // will render the adjustment from https://reviews.llvm.org/D82199 6317 // unnecessary. 6318 verifyFormat("int x = aaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa :\n" 6319 " bbbb ? cccccccccccccccccc :\n" 6320 " ddddd;\n", 6321 Style); 6322 } 6323 6324 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 6325 FormatStyle Style = getLLVMStyle(); 6326 Style.BreakBeforeTernaryOperators = false; 6327 Style.ColumnLimit = 70; 6328 verifyFormat( 6329 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6331 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6332 Style); 6333 verifyFormat( 6334 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 6335 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6336 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6337 Style); 6338 verifyFormat( 6339 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6341 Style); 6342 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 6343 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6345 Style); 6346 verifyFormat( 6347 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 6348 " aaaaaaaaaaaaa);", 6349 Style); 6350 verifyFormat( 6351 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6352 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6354 " aaaaaaaaaaaaa);", 6355 Style); 6356 verifyFormat( 6357 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6358 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6359 " aaaaaaaaaaaaa);", 6360 Style); 6361 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6362 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6363 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6366 Style); 6367 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 6371 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6373 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6374 Style); 6375 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 6377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6378 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 6379 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6380 Style); 6381 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6382 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6383 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6384 Style); 6385 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 6386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 6388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6389 Style); 6390 verifyFormat( 6391 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6392 " aaaaaaaaaaaaaaa :\n" 6393 " aaaaaaaaaaaaaaa;", 6394 Style); 6395 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 6396 " aaaaaaaaa ?\n" 6397 " b :\n" 6398 " c);", 6399 Style); 6400 verifyFormat("unsigned Indent =\n" 6401 " format(TheLine.First,\n" 6402 " IndentForLevel[TheLine.Level] >= 0 ?\n" 6403 " IndentForLevel[TheLine.Level] :\n" 6404 " TheLine * 2,\n" 6405 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 6406 Style); 6407 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6408 " aaaaaaaaaaaaaaa :\n" 6409 " bbbbbbbbbbbbbbb ? //\n" 6410 " ccccccccccccccc :\n" 6411 " ddddddddddddddd;", 6412 Style); 6413 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 6414 " aaaaaaaaaaaaaaa :\n" 6415 " (bbbbbbbbbbbbbbb ? //\n" 6416 " ccccccccccccccc :\n" 6417 " ddddddddddddddd);", 6418 Style); 6419 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6420 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 6421 " ccccccccccccccccccccccccccc;", 6422 Style); 6423 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 6424 " aaaaa :\n" 6425 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 6426 Style); 6427 6428 // Chained conditionals 6429 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6430 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6431 " 3333333333333333;", 6432 Style); 6433 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6434 " bbbbbbbbbb ? 2222222222222222 :\n" 6435 " 3333333333333333;", 6436 Style); 6437 verifyFormat("return aaaaaaaaaa ? 1111111111111111 :\n" 6438 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6439 " 3333333333333333;", 6440 Style); 6441 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6442 " bbbbbbbbbbbbbbbb ? 222222 :\n" 6443 " 333333;", 6444 Style); 6445 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6446 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6447 " cccccccccccccccc ? 3333333333333333 :\n" 6448 " 4444444444444444;", 6449 Style); 6450 verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n" 6451 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6452 " 3333333333333333;", 6453 Style); 6454 verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6455 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6456 " (aaa ? bbb : ccc);", 6457 Style); 6458 verifyFormat( 6459 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6460 " cccccccccccccccccc) :\n" 6461 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6462 " 3333333333333333;", 6463 Style); 6464 verifyFormat( 6465 "return aaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6466 " cccccccccccccccccc) :\n" 6467 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6468 " 3333333333333333;", 6469 Style); 6470 verifyFormat( 6471 "return aaaaaaaaa ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6472 " dddddddddddddddddd) :\n" 6473 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6474 " 3333333333333333;", 6475 Style); 6476 verifyFormat( 6477 "return aaaaaaaaa ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6478 " dddddddddddddddddd) :\n" 6479 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6480 " 3333333333333333;", 6481 Style); 6482 verifyFormat( 6483 "return aaaaaaaaa ? 1111111111111111 :\n" 6484 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6485 " a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6486 " dddddddddddddddddd)\n", 6487 Style); 6488 verifyFormat( 6489 "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n" 6490 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6491 " (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6492 " cccccccccccccccccc);", 6493 Style); 6494 verifyFormat( 6495 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6496 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6497 " eeeeeeeeeeeeeeeeee) :\n" 6498 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6499 " 3333333333333333;", 6500 Style); 6501 verifyFormat( 6502 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6503 " ccccccccccccc ? dddddddddddddddddd :\n" 6504 " eeeeeeeeeeeeeeeeee) :\n" 6505 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6506 " 3333333333333333;", 6507 Style); 6508 verifyFormat( 6509 "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6510 " ccccccccccccccccc ? dddddddddddddddddd :\n" 6511 " eeeeeeeeeeeeeeeeee) :\n" 6512 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6513 " 3333333333333333;", 6514 Style); 6515 verifyFormat( 6516 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6517 " cccccccccccccccccc :\n" 6518 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6519 " 3333333333333333;", 6520 Style); 6521 verifyFormat( 6522 "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6523 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6524 " eeeeeeeeeeeeeeeeee :\n" 6525 " bbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6526 " 3333333333333333;", 6527 Style); 6528 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6529 " (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6530 " cccccccccccccccccc ? dddddddddddddddddd :\n" 6531 " eeeeeeeeeeeeeeeeee) :\n" 6532 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6533 " 3333333333333333;", 6534 Style); 6535 verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n" 6536 " aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n" 6537 " cccccccccccccccccccc ? dddddddddddddddddd :\n" 6538 " eeeeeeeeeeeeeeeeee :\n" 6539 " bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n" 6540 " 3333333333333333;", 6541 Style); 6542 } 6543 6544 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 6545 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 6546 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 6547 verifyFormat("bool a = true, b = false;"); 6548 6549 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 6551 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 6552 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 6553 verifyFormat( 6554 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 6555 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 6556 " d = e && f;"); 6557 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 6558 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 6559 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6560 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 6561 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 6562 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 6563 6564 FormatStyle Style = getGoogleStyle(); 6565 Style.PointerAlignment = FormatStyle::PAS_Left; 6566 Style.DerivePointerAlignment = false; 6567 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6568 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 6569 " *b = bbbbbbbbbbbbbbbbbbb;", 6570 Style); 6571 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 6572 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 6573 Style); 6574 verifyFormat("vector<int*> a, b;", Style); 6575 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 6576 } 6577 6578 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 6579 verifyFormat("arr[foo ? bar : baz];"); 6580 verifyFormat("f()[foo ? bar : baz];"); 6581 verifyFormat("(a + b)[foo ? bar : baz];"); 6582 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 6583 } 6584 6585 TEST_F(FormatTest, AlignsStringLiterals) { 6586 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 6587 " \"short literal\");"); 6588 verifyFormat( 6589 "looooooooooooooooooooooooongFunction(\n" 6590 " \"short literal\"\n" 6591 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 6592 verifyFormat("someFunction(\"Always break between multi-line\"\n" 6593 " \" string literals\",\n" 6594 " and, other, parameters);"); 6595 EXPECT_EQ("fun + \"1243\" /* comment */\n" 6596 " \"5678\";", 6597 format("fun + \"1243\" /* comment */\n" 6598 " \"5678\";", 6599 getLLVMStyleWithColumns(28))); 6600 EXPECT_EQ( 6601 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 6602 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 6603 " \"aaaaaaaaaaaaaaaa\";", 6604 format("aaaaaa =" 6605 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 6606 "aaaaaaaaaaaaaaaaaaaaa\" " 6607 "\"aaaaaaaaaaaaaaaa\";")); 6608 verifyFormat("a = a + \"a\"\n" 6609 " \"a\"\n" 6610 " \"a\";"); 6611 verifyFormat("f(\"a\", \"b\"\n" 6612 " \"c\");"); 6613 6614 verifyFormat( 6615 "#define LL_FORMAT \"ll\"\n" 6616 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 6617 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 6618 6619 verifyFormat("#define A(X) \\\n" 6620 " \"aaaaa\" #X \"bbbbbb\" \\\n" 6621 " \"ccccc\"", 6622 getLLVMStyleWithColumns(23)); 6623 verifyFormat("#define A \"def\"\n" 6624 "f(\"abc\" A \"ghi\"\n" 6625 " \"jkl\");"); 6626 6627 verifyFormat("f(L\"a\"\n" 6628 " L\"b\");"); 6629 verifyFormat("#define A(X) \\\n" 6630 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 6631 " L\"ccccc\"", 6632 getLLVMStyleWithColumns(25)); 6633 6634 verifyFormat("f(@\"a\"\n" 6635 " @\"b\");"); 6636 verifyFormat("NSString s = @\"a\"\n" 6637 " @\"b\"\n" 6638 " @\"c\";"); 6639 verifyFormat("NSString s = @\"a\"\n" 6640 " \"b\"\n" 6641 " \"c\";"); 6642 } 6643 6644 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 6645 FormatStyle Style = getLLVMStyle(); 6646 // No declarations or definitions should be moved to own line. 6647 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 6648 verifyFormat("class A {\n" 6649 " int f() { return 1; }\n" 6650 " int g();\n" 6651 "};\n" 6652 "int f() { return 1; }\n" 6653 "int g();\n", 6654 Style); 6655 6656 // All declarations and definitions should have the return type moved to its 6657 // own 6658 // line. 6659 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 6660 verifyFormat("class E {\n" 6661 " int\n" 6662 " f() {\n" 6663 " return 1;\n" 6664 " }\n" 6665 " int\n" 6666 " g();\n" 6667 "};\n" 6668 "int\n" 6669 "f() {\n" 6670 " return 1;\n" 6671 "}\n" 6672 "int\n" 6673 "g();\n", 6674 Style); 6675 6676 // Top-level definitions, and no kinds of declarations should have the 6677 // return type moved to its own line. 6678 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 6679 verifyFormat("class B {\n" 6680 " int f() { return 1; }\n" 6681 " int g();\n" 6682 "};\n" 6683 "int\n" 6684 "f() {\n" 6685 " return 1;\n" 6686 "}\n" 6687 "int g();\n", 6688 Style); 6689 6690 // Top-level definitions and declarations should have the return type moved 6691 // to its own line. 6692 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 6693 verifyFormat("class C {\n" 6694 " int f() { return 1; }\n" 6695 " int g();\n" 6696 "};\n" 6697 "int\n" 6698 "f() {\n" 6699 " return 1;\n" 6700 "}\n" 6701 "int\n" 6702 "g();\n", 6703 Style); 6704 6705 // All definitions should have the return type moved to its own line, but no 6706 // kinds of declarations. 6707 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 6708 verifyFormat("class D {\n" 6709 " int\n" 6710 " f() {\n" 6711 " return 1;\n" 6712 " }\n" 6713 " int g();\n" 6714 "};\n" 6715 "int\n" 6716 "f() {\n" 6717 " return 1;\n" 6718 "}\n" 6719 "int g();\n", 6720 Style); 6721 verifyFormat("const char *\n" 6722 "f(void) {\n" // Break here. 6723 " return \"\";\n" 6724 "}\n" 6725 "const char *bar(void);\n", // No break here. 6726 Style); 6727 verifyFormat("template <class T>\n" 6728 "T *\n" 6729 "f(T &c) {\n" // Break here. 6730 " return NULL;\n" 6731 "}\n" 6732 "template <class T> T *f(T &c);\n", // No break here. 6733 Style); 6734 verifyFormat("class C {\n" 6735 " int\n" 6736 " operator+() {\n" 6737 " return 1;\n" 6738 " }\n" 6739 " int\n" 6740 " operator()() {\n" 6741 " return 1;\n" 6742 " }\n" 6743 "};\n", 6744 Style); 6745 verifyFormat("void\n" 6746 "A::operator()() {}\n" 6747 "void\n" 6748 "A::operator>>() {}\n" 6749 "void\n" 6750 "A::operator+() {}\n" 6751 "void\n" 6752 "A::operator*() {}\n" 6753 "void\n" 6754 "A::operator->() {}\n" 6755 "void\n" 6756 "A::operator void *() {}\n" 6757 "void\n" 6758 "A::operator void &() {}\n" 6759 "void\n" 6760 "A::operator void &&() {}\n" 6761 "void\n" 6762 "A::operator char *() {}\n" 6763 "void\n" 6764 "A::operator[]() {}\n" 6765 "void\n" 6766 "A::operator!() {}\n" 6767 "void\n" 6768 "A::operator**() {}\n" 6769 "void\n" 6770 "A::operator<Foo> *() {}\n" 6771 "void\n" 6772 "A::operator<Foo> **() {}\n" 6773 "void\n" 6774 "A::operator<Foo> &() {}\n" 6775 "void\n" 6776 "A::operator void **() {}\n", 6777 Style); 6778 verifyFormat("constexpr auto\n" 6779 "operator()() const -> reference {}\n" 6780 "constexpr auto\n" 6781 "operator>>() const -> reference {}\n" 6782 "constexpr auto\n" 6783 "operator+() const -> reference {}\n" 6784 "constexpr auto\n" 6785 "operator*() const -> reference {}\n" 6786 "constexpr auto\n" 6787 "operator->() const -> reference {}\n" 6788 "constexpr auto\n" 6789 "operator++() const -> reference {}\n" 6790 "constexpr auto\n" 6791 "operator void *() const -> reference {}\n" 6792 "constexpr auto\n" 6793 "operator void **() const -> reference {}\n" 6794 "constexpr auto\n" 6795 "operator void *() const -> reference {}\n" 6796 "constexpr auto\n" 6797 "operator void &() const -> reference {}\n" 6798 "constexpr auto\n" 6799 "operator void &&() const -> reference {}\n" 6800 "constexpr auto\n" 6801 "operator char *() const -> reference {}\n" 6802 "constexpr auto\n" 6803 "operator!() const -> reference {}\n" 6804 "constexpr auto\n" 6805 "operator[]() const -> reference {}\n", 6806 Style); 6807 verifyFormat("void *operator new(std::size_t s);", // No break here. 6808 Style); 6809 verifyFormat("void *\n" 6810 "operator new(std::size_t s) {}", 6811 Style); 6812 verifyFormat("void *\n" 6813 "operator delete[](void *ptr) {}", 6814 Style); 6815 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 6816 verifyFormat("const char *\n" 6817 "f(void)\n" // Break here. 6818 "{\n" 6819 " return \"\";\n" 6820 "}\n" 6821 "const char *bar(void);\n", // No break here. 6822 Style); 6823 verifyFormat("template <class T>\n" 6824 "T *\n" // Problem here: no line break 6825 "f(T &c)\n" // Break here. 6826 "{\n" 6827 " return NULL;\n" 6828 "}\n" 6829 "template <class T> T *f(T &c);\n", // No break here. 6830 Style); 6831 verifyFormat("int\n" 6832 "foo(A<bool> a)\n" 6833 "{\n" 6834 " return a;\n" 6835 "}\n", 6836 Style); 6837 verifyFormat("int\n" 6838 "foo(A<8> a)\n" 6839 "{\n" 6840 " return a;\n" 6841 "}\n", 6842 Style); 6843 verifyFormat("int\n" 6844 "foo(A<B<bool>, 8> a)\n" 6845 "{\n" 6846 " return a;\n" 6847 "}\n", 6848 Style); 6849 verifyFormat("int\n" 6850 "foo(A<B<8>, bool> a)\n" 6851 "{\n" 6852 " return a;\n" 6853 "}\n", 6854 Style); 6855 verifyFormat("int\n" 6856 "foo(A<B<bool>, bool> a)\n" 6857 "{\n" 6858 " return a;\n" 6859 "}\n", 6860 Style); 6861 verifyFormat("int\n" 6862 "foo(A<B<8>, 8> a)\n" 6863 "{\n" 6864 " return a;\n" 6865 "}\n", 6866 Style); 6867 6868 Style = getGNUStyle(); 6869 6870 // Test for comments at the end of function declarations. 6871 verifyFormat("void\n" 6872 "foo (int a, /*abc*/ int b) // def\n" 6873 "{\n" 6874 "}\n", 6875 Style); 6876 6877 verifyFormat("void\n" 6878 "foo (int a, /* abc */ int b) /* def */\n" 6879 "{\n" 6880 "}\n", 6881 Style); 6882 6883 // Definitions that should not break after return type 6884 verifyFormat("void foo (int a, int b); // def\n", Style); 6885 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6886 verifyFormat("void foo (int a, int b);\n", Style); 6887 } 6888 6889 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6890 FormatStyle NoBreak = getLLVMStyle(); 6891 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6892 FormatStyle Break = getLLVMStyle(); 6893 Break.AlwaysBreakBeforeMultilineStrings = true; 6894 verifyFormat("aaaa = \"bbbb\"\n" 6895 " \"cccc\";", 6896 NoBreak); 6897 verifyFormat("aaaa =\n" 6898 " \"bbbb\"\n" 6899 " \"cccc\";", 6900 Break); 6901 verifyFormat("aaaa(\"bbbb\"\n" 6902 " \"cccc\");", 6903 NoBreak); 6904 verifyFormat("aaaa(\n" 6905 " \"bbbb\"\n" 6906 " \"cccc\");", 6907 Break); 6908 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6909 " \"cccc\");", 6910 NoBreak); 6911 verifyFormat("aaaa(qqq,\n" 6912 " \"bbbb\"\n" 6913 " \"cccc\");", 6914 Break); 6915 verifyFormat("aaaa(qqq,\n" 6916 " L\"bbbb\"\n" 6917 " L\"cccc\");", 6918 Break); 6919 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6920 " \"bbbb\"));", 6921 Break); 6922 verifyFormat("string s = someFunction(\n" 6923 " \"abc\"\n" 6924 " \"abc\");", 6925 Break); 6926 6927 // As we break before unary operators, breaking right after them is bad. 6928 verifyFormat("string foo = abc ? \"x\"\n" 6929 " \"blah blah blah blah blah blah\"\n" 6930 " : \"y\";", 6931 Break); 6932 6933 // Don't break if there is no column gain. 6934 verifyFormat("f(\"aaaa\"\n" 6935 " \"bbbb\");", 6936 Break); 6937 6938 // Treat literals with escaped newlines like multi-line string literals. 6939 EXPECT_EQ("x = \"a\\\n" 6940 "b\\\n" 6941 "c\";", 6942 format("x = \"a\\\n" 6943 "b\\\n" 6944 "c\";", 6945 NoBreak)); 6946 EXPECT_EQ("xxxx =\n" 6947 " \"a\\\n" 6948 "b\\\n" 6949 "c\";", 6950 format("xxxx = \"a\\\n" 6951 "b\\\n" 6952 "c\";", 6953 Break)); 6954 6955 EXPECT_EQ("NSString *const kString =\n" 6956 " @\"aaaa\"\n" 6957 " @\"bbbb\";", 6958 format("NSString *const kString = @\"aaaa\"\n" 6959 "@\"bbbb\";", 6960 Break)); 6961 6962 Break.ColumnLimit = 0; 6963 verifyFormat("const char *hello = \"hello llvm\";", Break); 6964 } 6965 6966 TEST_F(FormatTest, AlignsPipes) { 6967 verifyFormat( 6968 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6969 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6970 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6971 verifyFormat( 6972 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6973 " << aaaaaaaaaaaaaaaaaaaa;"); 6974 verifyFormat( 6975 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6976 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6977 verifyFormat( 6978 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6979 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6980 verifyFormat( 6981 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6982 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6983 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6984 verifyFormat( 6985 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6986 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6987 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6988 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6990 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6991 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6992 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6993 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6994 verifyFormat( 6995 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6997 verifyFormat( 6998 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6999 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7000 7001 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 7002 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 7003 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7004 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7005 " aaaaaaaaaaaaaaaaaaaaa)\n" 7006 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7007 verifyFormat("LOG_IF(aaa == //\n" 7008 " bbb)\n" 7009 " << a << b;"); 7010 7011 // But sometimes, breaking before the first "<<" is desirable. 7012 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7013 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 7014 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 7015 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7016 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7017 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 7018 " << BEF << IsTemplate << Description << E->getType();"); 7019 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7020 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7021 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7022 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 7023 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7025 " << aaa;"); 7026 7027 verifyFormat( 7028 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7029 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7030 7031 // Incomplete string literal. 7032 EXPECT_EQ("llvm::errs() << \"\n" 7033 " << a;", 7034 format("llvm::errs() << \"\n<<a;")); 7035 7036 verifyFormat("void f() {\n" 7037 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 7038 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 7039 "}"); 7040 7041 // Handle 'endl'. 7042 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 7043 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 7044 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 7045 7046 // Handle '\n'. 7047 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 7048 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 7049 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 7050 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 7051 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 7052 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 7053 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 7054 } 7055 7056 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 7057 verifyFormat("return out << \"somepacket = {\\n\"\n" 7058 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 7059 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 7060 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 7061 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 7062 " << \"}\";"); 7063 7064 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 7065 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 7066 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 7067 verifyFormat( 7068 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 7069 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 7070 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 7071 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 7072 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 7073 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 7074 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7075 verifyFormat( 7076 "void f() {\n" 7077 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 7078 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 7079 "}"); 7080 7081 // Breaking before the first "<<" is generally not desirable. 7082 verifyFormat( 7083 "llvm::errs()\n" 7084 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7085 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7086 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7087 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 7088 getLLVMStyleWithColumns(70)); 7089 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7090 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7091 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7092 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7093 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 7094 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 7095 getLLVMStyleWithColumns(70)); 7096 7097 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 7098 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 7099 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 7100 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7101 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 7102 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 7103 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 7104 " (aaaa + aaaa);", 7105 getLLVMStyleWithColumns(40)); 7106 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 7107 " (aaaaaaa + aaaaa));", 7108 getLLVMStyleWithColumns(40)); 7109 verifyFormat( 7110 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 7111 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 7112 " bbbbbbbbbbbbbbbbbbbbbbb);"); 7113 } 7114 7115 TEST_F(FormatTest, UnderstandsEquals) { 7116 verifyFormat( 7117 "aaaaaaaaaaaaaaaaa =\n" 7118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7119 verifyFormat( 7120 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7122 verifyFormat( 7123 "if (a) {\n" 7124 " f();\n" 7125 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7126 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 7127 "}"); 7128 7129 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7130 " 100000000 + 10000000) {\n}"); 7131 } 7132 7133 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 7134 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7135 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 7136 7137 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 7138 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 7139 7140 verifyFormat( 7141 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 7142 " Parameter2);"); 7143 7144 verifyFormat( 7145 "ShortObject->shortFunction(\n" 7146 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 7147 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 7148 7149 verifyFormat("loooooooooooooongFunction(\n" 7150 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 7151 7152 verifyFormat( 7153 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 7154 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 7155 7156 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7157 " .WillRepeatedly(Return(SomeValue));"); 7158 verifyFormat("void f() {\n" 7159 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 7160 " .Times(2)\n" 7161 " .WillRepeatedly(Return(SomeValue));\n" 7162 "}"); 7163 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 7164 " ccccccccccccccccccccccc);"); 7165 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7167 " .aaaaa(aaaaa),\n" 7168 " aaaaaaaaaaaaaaaaaaaaa);"); 7169 verifyFormat("void f() {\n" 7170 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7171 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 7172 "}"); 7173 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7175 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7176 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7177 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7178 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7179 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7180 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7181 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 7182 "}"); 7183 7184 // Here, it is not necessary to wrap at "." or "->". 7185 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 7186 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 7187 verifyFormat( 7188 "aaaaaaaaaaa->aaaaaaaaa(\n" 7189 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7190 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 7191 7192 verifyFormat( 7193 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7194 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 7195 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 7196 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7197 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 7198 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 7199 7200 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7201 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7202 " .a();"); 7203 7204 FormatStyle NoBinPacking = getLLVMStyle(); 7205 NoBinPacking.BinPackParameters = false; 7206 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7207 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 7208 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 7209 " aaaaaaaaaaaaaaaaaaa,\n" 7210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 7211 NoBinPacking); 7212 7213 // If there is a subsequent call, change to hanging indentation. 7214 verifyFormat( 7215 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7216 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 7217 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7218 verifyFormat( 7219 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7220 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 7221 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7223 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7224 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 7226 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7227 } 7228 7229 TEST_F(FormatTest, WrapsTemplateDeclarations) { 7230 verifyFormat("template <typename T>\n" 7231 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7232 verifyFormat("template <typename T>\n" 7233 "// T should be one of {A, B}.\n" 7234 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 7235 verifyFormat( 7236 "template <typename T>\n" 7237 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 7238 verifyFormat("template <typename T>\n" 7239 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 7240 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 7241 verifyFormat( 7242 "template <typename T>\n" 7243 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 7244 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 7245 verifyFormat( 7246 "template <typename T>\n" 7247 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 7248 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 7249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7250 verifyFormat("template <typename T>\n" 7251 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7252 " int aaaaaaaaaaaaaaaaaaaaaa);"); 7253 verifyFormat( 7254 "template <typename T1, typename T2 = char, typename T3 = char,\n" 7255 " typename T4 = char>\n" 7256 "void f();"); 7257 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 7258 " template <typename> class cccccccccccccccccccccc,\n" 7259 " typename ddddddddddddd>\n" 7260 "class C {};"); 7261 verifyFormat( 7262 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 7263 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7264 7265 verifyFormat("void f() {\n" 7266 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 7267 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 7268 "}"); 7269 7270 verifyFormat("template <typename T> class C {};"); 7271 verifyFormat("template <typename T> void f();"); 7272 verifyFormat("template <typename T> void f() {}"); 7273 verifyFormat( 7274 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 7277 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 7278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 7280 " bbbbbbbbbbbbbbbbbbbbbbbb);", 7281 getLLVMStyleWithColumns(72)); 7282 EXPECT_EQ("static_cast<A< //\n" 7283 " B> *>(\n" 7284 "\n" 7285 ");", 7286 format("static_cast<A<//\n" 7287 " B>*>(\n" 7288 "\n" 7289 " );")); 7290 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7291 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 7292 7293 FormatStyle AlwaysBreak = getLLVMStyle(); 7294 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7295 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 7296 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 7297 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 7298 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7299 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7300 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 7301 verifyFormat("template <template <typename> class Fooooooo,\n" 7302 " template <typename> class Baaaaaaar>\n" 7303 "struct C {};", 7304 AlwaysBreak); 7305 verifyFormat("template <typename T> // T can be A, B or C.\n" 7306 "struct C {};", 7307 AlwaysBreak); 7308 verifyFormat("template <enum E> class A {\n" 7309 "public:\n" 7310 " E *f();\n" 7311 "};"); 7312 7313 FormatStyle NeverBreak = getLLVMStyle(); 7314 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 7315 verifyFormat("template <typename T> class C {};", NeverBreak); 7316 verifyFormat("template <typename T> void f();", NeverBreak); 7317 verifyFormat("template <typename T> void f() {}", NeverBreak); 7318 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7319 "bbbbbbbbbbbbbbbbbbbb) {}", 7320 NeverBreak); 7321 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7322 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 7323 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 7324 NeverBreak); 7325 verifyFormat("template <template <typename> class Fooooooo,\n" 7326 " template <typename> class Baaaaaaar>\n" 7327 "struct C {};", 7328 NeverBreak); 7329 verifyFormat("template <typename T> // T can be A, B or C.\n" 7330 "struct C {};", 7331 NeverBreak); 7332 verifyFormat("template <enum E> class A {\n" 7333 "public:\n" 7334 " E *f();\n" 7335 "};", 7336 NeverBreak); 7337 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 7338 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 7339 "bbbbbbbbbbbbbbbbbbbb) {}", 7340 NeverBreak); 7341 } 7342 7343 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 7344 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7345 Style.ColumnLimit = 60; 7346 EXPECT_EQ("// Baseline - no comments.\n" 7347 "template <\n" 7348 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7349 "void f() {}", 7350 format("// Baseline - no comments.\n" 7351 "template <\n" 7352 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 7353 "void f() {}", 7354 Style)); 7355 7356 EXPECT_EQ("template <\n" 7357 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7358 "void f() {}", 7359 format("template <\n" 7360 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7361 "void f() {}", 7362 Style)); 7363 7364 EXPECT_EQ( 7365 "template <\n" 7366 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7367 "void f() {}", 7368 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 7369 "void f() {}", 7370 Style)); 7371 7372 EXPECT_EQ( 7373 "template <\n" 7374 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7375 " // multiline\n" 7376 "void f() {}", 7377 format("template <\n" 7378 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 7379 " // multiline\n" 7380 "void f() {}", 7381 Style)); 7382 7383 EXPECT_EQ( 7384 "template <typename aaaaaaaaaa<\n" 7385 " bbbbbbbbbbbb>::value> // trailing loooong\n" 7386 "void f() {}", 7387 format( 7388 "template <\n" 7389 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 7390 "void f() {}", 7391 Style)); 7392 } 7393 7394 TEST_F(FormatTest, WrapsTemplateParameters) { 7395 FormatStyle Style = getLLVMStyle(); 7396 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7397 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7398 verifyFormat( 7399 "template <typename... a> struct q {};\n" 7400 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7401 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7402 " y;", 7403 Style); 7404 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 7405 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7406 verifyFormat( 7407 "template <typename... a> struct r {};\n" 7408 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 7409 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 7410 " y;", 7411 Style); 7412 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7413 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 7414 verifyFormat("template <typename... a> struct s {};\n" 7415 "extern s<\n" 7416 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7417 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7418 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7419 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7420 " y;", 7421 Style); 7422 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7423 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 7424 verifyFormat("template <typename... a> struct t {};\n" 7425 "extern t<\n" 7426 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7427 "aaaaaaaaaaaaaaaaaaaaaa,\n" 7428 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 7429 "aaaaaaaaaaaaaaaaaaaaaa>\n" 7430 " y;", 7431 Style); 7432 } 7433 7434 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 7435 verifyFormat( 7436 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7438 verifyFormat( 7439 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 7442 7443 // FIXME: Should we have the extra indent after the second break? 7444 verifyFormat( 7445 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7448 7449 verifyFormat( 7450 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 7451 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 7452 7453 // Breaking at nested name specifiers is generally not desirable. 7454 verifyFormat( 7455 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7456 " aaaaaaaaaaaaaaaaaaaaaaa);"); 7457 7458 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 7459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7461 " aaaaaaaaaaaaaaaaaaaaa);", 7462 getLLVMStyleWithColumns(74)); 7463 7464 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 7465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7466 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 7467 } 7468 7469 TEST_F(FormatTest, UnderstandsTemplateParameters) { 7470 verifyFormat("A<int> a;"); 7471 verifyFormat("A<A<A<int>>> a;"); 7472 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 7473 verifyFormat("bool x = a < 1 || 2 > a;"); 7474 verifyFormat("bool x = 5 < f<int>();"); 7475 verifyFormat("bool x = f<int>() > 5;"); 7476 verifyFormat("bool x = 5 < a<int>::x;"); 7477 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 7478 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 7479 7480 verifyGoogleFormat("A<A<int>> a;"); 7481 verifyGoogleFormat("A<A<A<int>>> a;"); 7482 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 7483 verifyGoogleFormat("A<A<int> > a;"); 7484 verifyGoogleFormat("A<A<A<int> > > a;"); 7485 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 7486 verifyGoogleFormat("A<::A<int>> a;"); 7487 verifyGoogleFormat("A<::A> a;"); 7488 verifyGoogleFormat("A< ::A> a;"); 7489 verifyGoogleFormat("A< ::A<int> > a;"); 7490 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 7491 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 7492 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 7493 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 7494 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 7495 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 7496 7497 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 7498 7499 // template closer followed by a token that starts with > or = 7500 verifyFormat("bool b = a<1> > 1;"); 7501 verifyFormat("bool b = a<1> >= 1;"); 7502 verifyFormat("int i = a<1> >> 1;"); 7503 FormatStyle Style = getLLVMStyle(); 7504 Style.SpaceBeforeAssignmentOperators = false; 7505 verifyFormat("bool b= a<1> == 1;", Style); 7506 verifyFormat("a<int> = 1;", Style); 7507 verifyFormat("a<int> >>= 1;", Style); 7508 7509 verifyFormat("test >> a >> b;"); 7510 verifyFormat("test << a >> b;"); 7511 7512 verifyFormat("f<int>();"); 7513 verifyFormat("template <typename T> void f() {}"); 7514 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 7515 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 7516 "sizeof(char)>::type>;"); 7517 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 7518 verifyFormat("f(a.operator()<A>());"); 7519 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7520 " .template operator()<A>());", 7521 getLLVMStyleWithColumns(35)); 7522 7523 // Not template parameters. 7524 verifyFormat("return a < b && c > d;"); 7525 verifyFormat("void f() {\n" 7526 " while (a < b && c > d) {\n" 7527 " }\n" 7528 "}"); 7529 verifyFormat("template <typename... Types>\n" 7530 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 7531 7532 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7533 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 7534 getLLVMStyleWithColumns(60)); 7535 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 7536 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 7537 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 7538 } 7539 7540 TEST_F(FormatTest, BitshiftOperatorWidth) { 7541 EXPECT_EQ("int a = 1 << 2; /* foo\n" 7542 " bar */", 7543 format("int a=1<<2; /* foo\n" 7544 " bar */")); 7545 7546 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 7547 " bar */", 7548 format("int b =256>>1 ; /* foo\n" 7549 " bar */")); 7550 } 7551 7552 TEST_F(FormatTest, UnderstandsBinaryOperators) { 7553 verifyFormat("COMPARE(a, ==, b);"); 7554 verifyFormat("auto s = sizeof...(Ts) - 1;"); 7555 } 7556 7557 TEST_F(FormatTest, UnderstandsPointersToMembers) { 7558 verifyFormat("int A::*x;"); 7559 verifyFormat("int (S::*func)(void *);"); 7560 verifyFormat("void f() { int (S::*func)(void *); }"); 7561 verifyFormat("typedef bool *(Class::*Member)() const;"); 7562 verifyFormat("void f() {\n" 7563 " (a->*f)();\n" 7564 " a->*x;\n" 7565 " (a.*f)();\n" 7566 " ((*a).*f)();\n" 7567 " a.*x;\n" 7568 "}"); 7569 verifyFormat("void f() {\n" 7570 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7571 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 7572 "}"); 7573 verifyFormat( 7574 "(aaaaaaaaaa->*bbbbbbb)(\n" 7575 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 7576 FormatStyle Style = getLLVMStyle(); 7577 Style.PointerAlignment = FormatStyle::PAS_Left; 7578 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 7579 } 7580 7581 TEST_F(FormatTest, UnderstandsUnaryOperators) { 7582 verifyFormat("int a = -2;"); 7583 verifyFormat("f(-1, -2, -3);"); 7584 verifyFormat("a[-1] = 5;"); 7585 verifyFormat("int a = 5 + -2;"); 7586 verifyFormat("if (i == -1) {\n}"); 7587 verifyFormat("if (i != -1) {\n}"); 7588 verifyFormat("if (i > -1) {\n}"); 7589 verifyFormat("if (i < -1) {\n}"); 7590 verifyFormat("++(a->f());"); 7591 verifyFormat("--(a->f());"); 7592 verifyFormat("(a->f())++;"); 7593 verifyFormat("a[42]++;"); 7594 verifyFormat("if (!(a->f())) {\n}"); 7595 verifyFormat("if (!+i) {\n}"); 7596 verifyFormat("~&a;"); 7597 7598 verifyFormat("a-- > b;"); 7599 verifyFormat("b ? -a : c;"); 7600 verifyFormat("n * sizeof char16;"); 7601 verifyFormat("n * alignof char16;", getGoogleStyle()); 7602 verifyFormat("sizeof(char);"); 7603 verifyFormat("alignof(char);", getGoogleStyle()); 7604 7605 verifyFormat("return -1;"); 7606 verifyFormat("throw -1;"); 7607 verifyFormat("switch (a) {\n" 7608 "case -1:\n" 7609 " break;\n" 7610 "}"); 7611 verifyFormat("#define X -1"); 7612 verifyFormat("#define X -kConstant"); 7613 7614 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 7615 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 7616 7617 verifyFormat("int a = /* confusing comment */ -1;"); 7618 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 7619 verifyFormat("int a = i /* confusing comment */++;"); 7620 7621 verifyFormat("co_yield -1;"); 7622 verifyFormat("co_return -1;"); 7623 } 7624 7625 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 7626 verifyFormat("if (!aaaaaaaaaa( // break\n" 7627 " aaaaa)) {\n" 7628 "}"); 7629 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 7630 " aaaaa));"); 7631 verifyFormat("*aaa = aaaaaaa( // break\n" 7632 " bbbbbb);"); 7633 } 7634 7635 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 7636 verifyFormat("bool operator<();"); 7637 verifyFormat("bool operator>();"); 7638 verifyFormat("bool operator=();"); 7639 verifyFormat("bool operator==();"); 7640 verifyFormat("bool operator!=();"); 7641 verifyFormat("int operator+();"); 7642 verifyFormat("int operator++();"); 7643 verifyFormat("int operator++(int) volatile noexcept;"); 7644 verifyFormat("bool operator,();"); 7645 verifyFormat("bool operator();"); 7646 verifyFormat("bool operator()();"); 7647 verifyFormat("bool operator[]();"); 7648 verifyFormat("operator bool();"); 7649 verifyFormat("operator int();"); 7650 verifyFormat("operator void *();"); 7651 verifyFormat("operator SomeType<int>();"); 7652 verifyFormat("operator SomeType<int, int>();"); 7653 verifyFormat("operator SomeType<SomeType<int>>();"); 7654 verifyFormat("void *operator new(std::size_t size);"); 7655 verifyFormat("void *operator new[](std::size_t size);"); 7656 verifyFormat("void operator delete(void *ptr);"); 7657 verifyFormat("void operator delete[](void *ptr);"); 7658 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 7659 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 7660 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 7661 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 7662 7663 verifyFormat( 7664 "ostream &operator<<(ostream &OutputStream,\n" 7665 " SomeReallyLongType WithSomeReallyLongValue);"); 7666 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 7667 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 7668 " return left.group < right.group;\n" 7669 "}"); 7670 verifyFormat("SomeType &operator=(const SomeType &S);"); 7671 verifyFormat("f.template operator()<int>();"); 7672 7673 verifyGoogleFormat("operator void*();"); 7674 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 7675 verifyGoogleFormat("operator ::A();"); 7676 7677 verifyFormat("using A::operator+;"); 7678 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 7679 "int i;"); 7680 } 7681 7682 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 7683 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 7684 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 7685 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 7686 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 7687 verifyFormat("Deleted &operator=(const Deleted &) &;"); 7688 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 7689 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 7690 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 7691 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 7692 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 7693 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 7694 verifyFormat("void Fn(T const &) const &;"); 7695 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 7696 verifyFormat("template <typename T>\n" 7697 "void F(T) && = delete;", 7698 getGoogleStyle()); 7699 7700 FormatStyle AlignLeft = getLLVMStyle(); 7701 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 7702 verifyFormat("void A::b() && {}", AlignLeft); 7703 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 7704 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 7705 AlignLeft); 7706 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 7707 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 7708 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 7709 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 7710 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 7711 verifyFormat("auto Function(T) & -> void;", AlignLeft); 7712 verifyFormat("void Fn(T const&) const&;", AlignLeft); 7713 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 7714 7715 FormatStyle Spaces = getLLVMStyle(); 7716 Spaces.SpacesInCStyleCastParentheses = true; 7717 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 7718 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 7719 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 7720 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 7721 7722 Spaces.SpacesInCStyleCastParentheses = false; 7723 Spaces.SpacesInParentheses = true; 7724 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 7725 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 7726 Spaces); 7727 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 7728 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 7729 7730 FormatStyle BreakTemplate = getLLVMStyle(); 7731 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 7732 7733 verifyFormat("struct f {\n" 7734 " template <class T>\n" 7735 " int &foo(const std::string &str) &noexcept {}\n" 7736 "};", 7737 BreakTemplate); 7738 7739 verifyFormat("struct f {\n" 7740 " template <class T>\n" 7741 " int &foo(const std::string &str) &&noexcept {}\n" 7742 "};", 7743 BreakTemplate); 7744 7745 verifyFormat("struct f {\n" 7746 " template <class T>\n" 7747 " int &foo(const std::string &str) const &noexcept {}\n" 7748 "};", 7749 BreakTemplate); 7750 7751 verifyFormat("struct f {\n" 7752 " template <class T>\n" 7753 " int &foo(const std::string &str) const &noexcept {}\n" 7754 "};", 7755 BreakTemplate); 7756 7757 verifyFormat("struct f {\n" 7758 " template <class T>\n" 7759 " auto foo(const std::string &str) &&noexcept -> int & {}\n" 7760 "};", 7761 BreakTemplate); 7762 7763 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 7764 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 7765 FormatStyle::BTDS_Yes; 7766 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 7767 7768 verifyFormat("struct f {\n" 7769 " template <class T>\n" 7770 " int& foo(const std::string& str) & noexcept {}\n" 7771 "};", 7772 AlignLeftBreakTemplate); 7773 7774 verifyFormat("struct f {\n" 7775 " template <class T>\n" 7776 " int& foo(const std::string& str) && noexcept {}\n" 7777 "};", 7778 AlignLeftBreakTemplate); 7779 7780 verifyFormat("struct f {\n" 7781 " template <class T>\n" 7782 " int& foo(const std::string& str) const& noexcept {}\n" 7783 "};", 7784 AlignLeftBreakTemplate); 7785 7786 verifyFormat("struct f {\n" 7787 " template <class T>\n" 7788 " int& foo(const std::string& str) const&& noexcept {}\n" 7789 "};", 7790 AlignLeftBreakTemplate); 7791 7792 verifyFormat("struct f {\n" 7793 " template <class T>\n" 7794 " auto foo(const std::string& str) && noexcept -> int& {}\n" 7795 "};", 7796 AlignLeftBreakTemplate); 7797 7798 // The `&` in `Type&` should not be confused with a trailing `&` of 7799 // DEPRECATED(reason) member function. 7800 verifyFormat("struct f {\n" 7801 " template <class T>\n" 7802 " DEPRECATED(reason)\n" 7803 " Type &foo(arguments) {}\n" 7804 "};", 7805 BreakTemplate); 7806 7807 verifyFormat("struct f {\n" 7808 " template <class T>\n" 7809 " DEPRECATED(reason)\n" 7810 " Type& foo(arguments) {}\n" 7811 "};", 7812 AlignLeftBreakTemplate); 7813 7814 verifyFormat("void (*foopt)(int) = &func;"); 7815 } 7816 7817 TEST_F(FormatTest, UnderstandsNewAndDelete) { 7818 verifyFormat("void f() {\n" 7819 " A *a = new A;\n" 7820 " A *a = new (placement) A;\n" 7821 " delete a;\n" 7822 " delete (A *)a;\n" 7823 "}"); 7824 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7825 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7826 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7827 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 7828 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 7829 verifyFormat("delete[] h->p;"); 7830 } 7831 7832 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 7833 verifyFormat("int *f(int *a) {}"); 7834 verifyFormat("int main(int argc, char **argv) {}"); 7835 verifyFormat("Test::Test(int b) : a(b * b) {}"); 7836 verifyIndependentOfContext("f(a, *a);"); 7837 verifyFormat("void g() { f(*a); }"); 7838 verifyIndependentOfContext("int a = b * 10;"); 7839 verifyIndependentOfContext("int a = 10 * b;"); 7840 verifyIndependentOfContext("int a = b * c;"); 7841 verifyIndependentOfContext("int a += b * c;"); 7842 verifyIndependentOfContext("int a -= b * c;"); 7843 verifyIndependentOfContext("int a *= b * c;"); 7844 verifyIndependentOfContext("int a /= b * c;"); 7845 verifyIndependentOfContext("int a = *b;"); 7846 verifyIndependentOfContext("int a = *b * c;"); 7847 verifyIndependentOfContext("int a = b * *c;"); 7848 verifyIndependentOfContext("int a = b * (10);"); 7849 verifyIndependentOfContext("S << b * (10);"); 7850 verifyIndependentOfContext("return 10 * b;"); 7851 verifyIndependentOfContext("return *b * *c;"); 7852 verifyIndependentOfContext("return a & ~b;"); 7853 verifyIndependentOfContext("f(b ? *c : *d);"); 7854 verifyIndependentOfContext("int a = b ? *c : *d;"); 7855 verifyIndependentOfContext("*b = a;"); 7856 verifyIndependentOfContext("a * ~b;"); 7857 verifyIndependentOfContext("a * !b;"); 7858 verifyIndependentOfContext("a * +b;"); 7859 verifyIndependentOfContext("a * -b;"); 7860 verifyIndependentOfContext("a * ++b;"); 7861 verifyIndependentOfContext("a * --b;"); 7862 verifyIndependentOfContext("a[4] * b;"); 7863 verifyIndependentOfContext("a[a * a] = 1;"); 7864 verifyIndependentOfContext("f() * b;"); 7865 verifyIndependentOfContext("a * [self dostuff];"); 7866 verifyIndependentOfContext("int x = a * (a + b);"); 7867 verifyIndependentOfContext("(a *)(a + b);"); 7868 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7869 verifyIndependentOfContext("int *pa = (int *)&a;"); 7870 verifyIndependentOfContext("return sizeof(int **);"); 7871 verifyIndependentOfContext("return sizeof(int ******);"); 7872 verifyIndependentOfContext("return (int **&)a;"); 7873 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7874 verifyFormat("void f(Type (*parameter)[10]) {}"); 7875 verifyFormat("void f(Type (¶meter)[10]) {}"); 7876 verifyGoogleFormat("return sizeof(int**);"); 7877 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7878 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7879 verifyFormat("auto a = [](int **&, int ***) {};"); 7880 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7881 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7882 verifyFormat("[](const decltype(*a) &value) {}"); 7883 verifyFormat("decltype(a * b) F();"); 7884 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7885 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7886 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7887 verifyIndependentOfContext("int i{a * b};"); 7888 verifyIndependentOfContext("aaa && aaa->f();"); 7889 verifyIndependentOfContext("int x = ~*p;"); 7890 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7891 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7892 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7893 verifyFormat("void f() { f(a, c * d); }"); 7894 verifyFormat("void f() { f(new a(), c * d); }"); 7895 verifyFormat("void f(const MyOverride &override);"); 7896 verifyFormat("void f(const MyFinal &final);"); 7897 verifyIndependentOfContext("bool a = f() && override.f();"); 7898 verifyIndependentOfContext("bool a = f() && final.f();"); 7899 7900 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7901 7902 verifyIndependentOfContext("A<int *> a;"); 7903 verifyIndependentOfContext("A<int **> a;"); 7904 verifyIndependentOfContext("A<int *, int *> a;"); 7905 verifyIndependentOfContext("A<int *[]> a;"); 7906 verifyIndependentOfContext( 7907 "const char *const p = reinterpret_cast<const char *const>(q);"); 7908 verifyIndependentOfContext("A<int **, int **> a;"); 7909 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7910 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7911 verifyFormat("for (; a && b;) {\n}"); 7912 verifyFormat("bool foo = true && [] { return false; }();"); 7913 7914 verifyFormat( 7915 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7916 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7917 7918 verifyGoogleFormat("int const* a = &b;"); 7919 verifyGoogleFormat("**outparam = 1;"); 7920 verifyGoogleFormat("*outparam = a * b;"); 7921 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7922 verifyGoogleFormat("A<int*> a;"); 7923 verifyGoogleFormat("A<int**> a;"); 7924 verifyGoogleFormat("A<int*, int*> a;"); 7925 verifyGoogleFormat("A<int**, int**> a;"); 7926 verifyGoogleFormat("f(b ? *c : *d);"); 7927 verifyGoogleFormat("int a = b ? *c : *d;"); 7928 verifyGoogleFormat("Type* t = **x;"); 7929 verifyGoogleFormat("Type* t = *++*x;"); 7930 verifyGoogleFormat("*++*x;"); 7931 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7932 verifyGoogleFormat("Type* t = x++ * y;"); 7933 verifyGoogleFormat( 7934 "const char* const p = reinterpret_cast<const char* const>(q);"); 7935 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7936 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7937 verifyGoogleFormat("template <typename T>\n" 7938 "void f(int i = 0, SomeType** temps = NULL);"); 7939 7940 FormatStyle Left = getLLVMStyle(); 7941 Left.PointerAlignment = FormatStyle::PAS_Left; 7942 verifyFormat("x = *a(x) = *a(y);", Left); 7943 verifyFormat("for (;; *a = b) {\n}", Left); 7944 verifyFormat("return *this += 1;", Left); 7945 verifyFormat("throw *x;", Left); 7946 verifyFormat("delete *x;", Left); 7947 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7948 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7949 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7950 verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left); 7951 verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left); 7952 verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left); 7953 7954 verifyIndependentOfContext("a = *(x + y);"); 7955 verifyIndependentOfContext("a = &(x + y);"); 7956 verifyIndependentOfContext("*(x + y).call();"); 7957 verifyIndependentOfContext("&(x + y)->call();"); 7958 verifyFormat("void f() { &(*I).first; }"); 7959 7960 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7961 verifyFormat( 7962 "int *MyValues = {\n" 7963 " *A, // Operator detection might be confused by the '{'\n" 7964 " *BB // Operator detection might be confused by previous comment\n" 7965 "};"); 7966 7967 verifyIndependentOfContext("if (int *a = &b)"); 7968 verifyIndependentOfContext("if (int &a = *b)"); 7969 verifyIndependentOfContext("if (a & b[i])"); 7970 verifyIndependentOfContext("if constexpr (a & b[i])"); 7971 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7972 verifyIndependentOfContext("if (a * (b * c))"); 7973 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7974 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7975 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7976 verifyIndependentOfContext("if (*b[i])"); 7977 verifyIndependentOfContext("if (int *a = (&b))"); 7978 verifyIndependentOfContext("while (int *a = &b)"); 7979 verifyIndependentOfContext("while (a * (b * c))"); 7980 verifyIndependentOfContext("size = sizeof *a;"); 7981 verifyIndependentOfContext("if (a && (b = c))"); 7982 verifyFormat("void f() {\n" 7983 " for (const int &v : Values) {\n" 7984 " }\n" 7985 "}"); 7986 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7987 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7988 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7989 7990 verifyFormat("#define A (!a * b)"); 7991 verifyFormat("#define MACRO \\\n" 7992 " int *i = a * b; \\\n" 7993 " void f(a *b);", 7994 getLLVMStyleWithColumns(19)); 7995 7996 verifyIndependentOfContext("A = new SomeType *[Length];"); 7997 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7998 verifyIndependentOfContext("T **t = new T *;"); 7999 verifyIndependentOfContext("T **t = new T *();"); 8000 verifyGoogleFormat("A = new SomeType*[Length]();"); 8001 verifyGoogleFormat("A = new SomeType*[Length];"); 8002 verifyGoogleFormat("T** t = new T*;"); 8003 verifyGoogleFormat("T** t = new T*();"); 8004 8005 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 8006 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 8007 verifyFormat("template <bool a, bool b> " 8008 "typename t::if<x && y>::type f() {}"); 8009 verifyFormat("template <int *y> f() {}"); 8010 verifyFormat("vector<int *> v;"); 8011 verifyFormat("vector<int *const> v;"); 8012 verifyFormat("vector<int *const **const *> v;"); 8013 verifyFormat("vector<int *volatile> v;"); 8014 verifyFormat("vector<a * b> v;"); 8015 verifyFormat("foo<b && false>();"); 8016 verifyFormat("foo<b & 1>();"); 8017 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 8018 verifyFormat( 8019 "template <class T, class = typename std::enable_if<\n" 8020 " std::is_integral<T>::value &&\n" 8021 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 8022 "void F();", 8023 getLLVMStyleWithColumns(70)); 8024 verifyFormat("template <class T,\n" 8025 " class = typename std::enable_if<\n" 8026 " std::is_integral<T>::value &&\n" 8027 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 8028 " class U>\n" 8029 "void F();", 8030 getLLVMStyleWithColumns(70)); 8031 verifyFormat( 8032 "template <class T,\n" 8033 " class = typename ::std::enable_if<\n" 8034 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 8035 "void F();", 8036 getGoogleStyleWithColumns(68)); 8037 8038 verifyIndependentOfContext("MACRO(int *i);"); 8039 verifyIndependentOfContext("MACRO(auto *a);"); 8040 verifyIndependentOfContext("MACRO(const A *a);"); 8041 verifyIndependentOfContext("MACRO(A *const a);"); 8042 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 8043 verifyFormat("void f() { f(float{1}, a * a); }"); 8044 // FIXME: Is there a way to make this work? 8045 // verifyIndependentOfContext("MACRO(A *a);"); 8046 8047 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 8048 verifyFormat("return options != nullptr && operator==(*options);"); 8049 8050 EXPECT_EQ("#define OP(x) \\\n" 8051 " ostream &operator<<(ostream &s, const A &a) { \\\n" 8052 " return s << a.DebugString(); \\\n" 8053 " }", 8054 format("#define OP(x) \\\n" 8055 " ostream &operator<<(ostream &s, const A &a) { \\\n" 8056 " return s << a.DebugString(); \\\n" 8057 " }", 8058 getLLVMStyleWithColumns(50))); 8059 8060 // FIXME: We cannot handle this case yet; we might be able to figure out that 8061 // foo<x> d > v; doesn't make sense. 8062 verifyFormat("foo<a<b && c> d> v;"); 8063 8064 FormatStyle PointerMiddle = getLLVMStyle(); 8065 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 8066 verifyFormat("delete *x;", PointerMiddle); 8067 verifyFormat("int * x;", PointerMiddle); 8068 verifyFormat("int *[] x;", PointerMiddle); 8069 verifyFormat("template <int * y> f() {}", PointerMiddle); 8070 verifyFormat("int * f(int * a) {}", PointerMiddle); 8071 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 8072 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 8073 verifyFormat("A<int *> a;", PointerMiddle); 8074 verifyFormat("A<int **> a;", PointerMiddle); 8075 verifyFormat("A<int *, int *> a;", PointerMiddle); 8076 verifyFormat("A<int *[]> a;", PointerMiddle); 8077 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 8078 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 8079 verifyFormat("T ** t = new T *;", PointerMiddle); 8080 8081 // Member function reference qualifiers aren't binary operators. 8082 verifyFormat("string // break\n" 8083 "operator()() & {}"); 8084 verifyFormat("string // break\n" 8085 "operator()() && {}"); 8086 verifyGoogleFormat("template <typename T>\n" 8087 "auto x() & -> int {}"); 8088 } 8089 8090 TEST_F(FormatTest, UnderstandsAttributes) { 8091 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 8092 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 8093 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8094 FormatStyle AfterType = getLLVMStyle(); 8095 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 8096 verifyFormat("__attribute__((nodebug)) void\n" 8097 "foo() {}\n", 8098 AfterType); 8099 } 8100 8101 TEST_F(FormatTest, UnderstandsSquareAttributes) { 8102 verifyFormat("SomeType s [[unused]] (InitValue);"); 8103 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 8104 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 8105 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 8106 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 8107 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8108 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 8109 verifyFormat("[[nodiscard]] bool f() { return false; }"); 8110 verifyFormat("class [[nodiscard]] f {\npublic:\n f() {}\n}"); 8111 verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n f() {}\n}"); 8112 verifyFormat("class [[gnu::unused]] f {\npublic:\n f() {}\n}"); 8113 8114 // Make sure we do not mistake attributes for array subscripts. 8115 verifyFormat("int a() {}\n" 8116 "[[unused]] int b() {}\n"); 8117 verifyFormat("NSArray *arr;\n" 8118 "arr[[Foo() bar]];"); 8119 8120 // On the other hand, we still need to correctly find array subscripts. 8121 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 8122 8123 // Make sure that we do not mistake Objective-C method inside array literals 8124 // as attributes, even if those method names are also keywords. 8125 verifyFormat("@[ [foo bar] ];"); 8126 verifyFormat("@[ [NSArray class] ];"); 8127 verifyFormat("@[ [foo enum] ];"); 8128 8129 verifyFormat("template <typename T> [[nodiscard]] int a() { return 1; }"); 8130 8131 // Make sure we do not parse attributes as lambda introducers. 8132 FormatStyle MultiLineFunctions = getLLVMStyle(); 8133 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8134 verifyFormat("[[unused]] int b() {\n" 8135 " return 42;\n" 8136 "}\n", 8137 MultiLineFunctions); 8138 } 8139 8140 TEST_F(FormatTest, AttributeClass) { 8141 FormatStyle Style = getChromiumStyle(FormatStyle::LK_Cpp); 8142 verifyFormat("class S {\n" 8143 " S(S&&) = default;\n" 8144 "};", 8145 Style); 8146 verifyFormat("class [[nodiscard]] S {\n" 8147 " S(S&&) = default;\n" 8148 "};", 8149 Style); 8150 verifyFormat("class __attribute((maybeunused)) S {\n" 8151 " S(S&&) = default;\n" 8152 "};", 8153 Style); 8154 verifyFormat("struct S {\n" 8155 " S(S&&) = default;\n" 8156 "};", 8157 Style); 8158 verifyFormat("struct [[nodiscard]] S {\n" 8159 " S(S&&) = default;\n" 8160 "};", 8161 Style); 8162 } 8163 8164 TEST_F(FormatTest, AttributesAfterMacro) { 8165 FormatStyle Style = getLLVMStyle(); 8166 verifyFormat("MACRO;\n" 8167 "__attribute__((maybe_unused)) int foo() {\n" 8168 " //...\n" 8169 "}"); 8170 8171 verifyFormat("MACRO;\n" 8172 "[[nodiscard]] int foo() {\n" 8173 " //...\n" 8174 "}"); 8175 8176 EXPECT_EQ("MACRO\n\n" 8177 "__attribute__((maybe_unused)) int foo() {\n" 8178 " //...\n" 8179 "}", 8180 format("MACRO\n\n" 8181 "__attribute__((maybe_unused)) int foo() {\n" 8182 " //...\n" 8183 "}")); 8184 8185 EXPECT_EQ("MACRO\n\n" 8186 "[[nodiscard]] int foo() {\n" 8187 " //...\n" 8188 "}", 8189 format("MACRO\n\n" 8190 "[[nodiscard]] int foo() {\n" 8191 " //...\n" 8192 "}")); 8193 } 8194 8195 TEST_F(FormatTest, AttributePenaltyBreaking) { 8196 FormatStyle Style = getLLVMStyle(); 8197 verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n" 8198 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8199 Style); 8200 verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n" 8201 " [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}", 8202 Style); 8203 verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const " 8204 "shared_ptr<ALongTypeName> &C d) {\n}", 8205 Style); 8206 } 8207 8208 TEST_F(FormatTest, UnderstandsEllipsis) { 8209 FormatStyle Style = getLLVMStyle(); 8210 verifyFormat("int printf(const char *fmt, ...);"); 8211 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 8212 verifyFormat("template <class... Ts> void Foo(Ts *...ts) {}"); 8213 8214 verifyFormat("template <int *...PP> a;", Style); 8215 8216 Style.PointerAlignment = FormatStyle::PAS_Left; 8217 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", Style); 8218 8219 verifyFormat("template <int*... PP> a;", Style); 8220 8221 Style.PointerAlignment = FormatStyle::PAS_Middle; 8222 verifyFormat("template <int *... PP> a;", Style); 8223 } 8224 8225 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 8226 EXPECT_EQ("int *a;\n" 8227 "int *a;\n" 8228 "int *a;", 8229 format("int *a;\n" 8230 "int* a;\n" 8231 "int *a;", 8232 getGoogleStyle())); 8233 EXPECT_EQ("int* a;\n" 8234 "int* a;\n" 8235 "int* a;", 8236 format("int* a;\n" 8237 "int* a;\n" 8238 "int *a;", 8239 getGoogleStyle())); 8240 EXPECT_EQ("int *a;\n" 8241 "int *a;\n" 8242 "int *a;", 8243 format("int *a;\n" 8244 "int * a;\n" 8245 "int * a;", 8246 getGoogleStyle())); 8247 EXPECT_EQ("auto x = [] {\n" 8248 " int *a;\n" 8249 " int *a;\n" 8250 " int *a;\n" 8251 "};", 8252 format("auto x=[]{int *a;\n" 8253 "int * a;\n" 8254 "int * a;};", 8255 getGoogleStyle())); 8256 } 8257 8258 TEST_F(FormatTest, UnderstandsRvalueReferences) { 8259 verifyFormat("int f(int &&a) {}"); 8260 verifyFormat("int f(int a, char &&b) {}"); 8261 verifyFormat("void f() { int &&a = b; }"); 8262 verifyGoogleFormat("int f(int a, char&& b) {}"); 8263 verifyGoogleFormat("void f() { int&& a = b; }"); 8264 8265 verifyIndependentOfContext("A<int &&> a;"); 8266 verifyIndependentOfContext("A<int &&, int &&> a;"); 8267 verifyGoogleFormat("A<int&&> a;"); 8268 verifyGoogleFormat("A<int&&, int&&> a;"); 8269 8270 // Not rvalue references: 8271 verifyFormat("template <bool B, bool C> class A {\n" 8272 " static_assert(B && C, \"Something is wrong\");\n" 8273 "};"); 8274 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 8275 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 8276 verifyFormat("#define A(a, b) (a && b)"); 8277 } 8278 8279 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 8280 verifyFormat("void f() {\n" 8281 " x[aaaaaaaaa -\n" 8282 " b] = 23;\n" 8283 "}", 8284 getLLVMStyleWithColumns(15)); 8285 } 8286 8287 TEST_F(FormatTest, FormatsCasts) { 8288 verifyFormat("Type *A = static_cast<Type *>(P);"); 8289 verifyFormat("Type *A = (Type *)P;"); 8290 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 8291 verifyFormat("int a = (int)(2.0f);"); 8292 verifyFormat("int a = (int)2.0f;"); 8293 verifyFormat("x[(int32)y];"); 8294 verifyFormat("x = (int32)y;"); 8295 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 8296 verifyFormat("int a = (int)*b;"); 8297 verifyFormat("int a = (int)2.0f;"); 8298 verifyFormat("int a = (int)~0;"); 8299 verifyFormat("int a = (int)++a;"); 8300 verifyFormat("int a = (int)sizeof(int);"); 8301 verifyFormat("int a = (int)+2;"); 8302 verifyFormat("my_int a = (my_int)2.0f;"); 8303 verifyFormat("my_int a = (my_int)sizeof(int);"); 8304 verifyFormat("return (my_int)aaa;"); 8305 verifyFormat("#define x ((int)-1)"); 8306 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 8307 verifyFormat("#define p(q) ((int *)&q)"); 8308 verifyFormat("fn(a)(b) + 1;"); 8309 8310 verifyFormat("void f() { my_int a = (my_int)*b; }"); 8311 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 8312 verifyFormat("my_int a = (my_int)~0;"); 8313 verifyFormat("my_int a = (my_int)++a;"); 8314 verifyFormat("my_int a = (my_int)-2;"); 8315 verifyFormat("my_int a = (my_int)1;"); 8316 verifyFormat("my_int a = (my_int *)1;"); 8317 verifyFormat("my_int a = (const my_int)-1;"); 8318 verifyFormat("my_int a = (const my_int *)-1;"); 8319 verifyFormat("my_int a = (my_int)(my_int)-1;"); 8320 verifyFormat("my_int a = (ns::my_int)-2;"); 8321 verifyFormat("case (my_int)ONE:"); 8322 verifyFormat("auto x = (X)this;"); 8323 // Casts in Obj-C style calls used to not be recognized as such. 8324 verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle()); 8325 8326 // FIXME: single value wrapped with paren will be treated as cast. 8327 verifyFormat("void f(int i = (kValue)*kMask) {}"); 8328 8329 verifyFormat("{ (void)F; }"); 8330 8331 // Don't break after a cast's 8332 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 8333 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 8334 " bbbbbbbbbbbbbbbbbbbbbb);"); 8335 8336 // These are not casts. 8337 verifyFormat("void f(int *) {}"); 8338 verifyFormat("f(foo)->b;"); 8339 verifyFormat("f(foo).b;"); 8340 verifyFormat("f(foo)(b);"); 8341 verifyFormat("f(foo)[b];"); 8342 verifyFormat("[](foo) { return 4; }(bar);"); 8343 verifyFormat("(*funptr)(foo)[4];"); 8344 verifyFormat("funptrs[4](foo)[4];"); 8345 verifyFormat("void f(int *);"); 8346 verifyFormat("void f(int *) = 0;"); 8347 verifyFormat("void f(SmallVector<int>) {}"); 8348 verifyFormat("void f(SmallVector<int>);"); 8349 verifyFormat("void f(SmallVector<int>) = 0;"); 8350 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 8351 verifyFormat("int a = sizeof(int) * b;"); 8352 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 8353 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 8354 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 8355 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 8356 8357 // These are not casts, but at some point were confused with casts. 8358 verifyFormat("virtual void foo(int *) override;"); 8359 verifyFormat("virtual void foo(char &) const;"); 8360 verifyFormat("virtual void foo(int *a, char *) const;"); 8361 verifyFormat("int a = sizeof(int *) + b;"); 8362 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 8363 verifyFormat("bool b = f(g<int>) && c;"); 8364 verifyFormat("typedef void (*f)(int i) func;"); 8365 verifyFormat("void operator++(int) noexcept;"); 8366 verifyFormat("void operator++(int &) noexcept;"); 8367 verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t " 8368 "&) noexcept;"); 8369 verifyFormat( 8370 "void operator delete(std::size_t, const std::nothrow_t &) noexcept;"); 8371 verifyFormat("void operator delete(const std::nothrow_t &) noexcept;"); 8372 verifyFormat("void operator delete(std::nothrow_t &) noexcept;"); 8373 verifyFormat("void operator delete(nothrow_t &) noexcept;"); 8374 verifyFormat("void operator delete(foo &) noexcept;"); 8375 verifyFormat("void operator delete(foo) noexcept;"); 8376 verifyFormat("void operator delete(int) noexcept;"); 8377 verifyFormat("void operator delete(int &) noexcept;"); 8378 verifyFormat("void operator delete(int &) volatile noexcept;"); 8379 verifyFormat("void operator delete(int &) const"); 8380 verifyFormat("void operator delete(int &) = default"); 8381 verifyFormat("void operator delete(int &) = delete"); 8382 verifyFormat("void operator delete(int &) [[noreturn]]"); 8383 verifyFormat("void operator delete(int &) throw();"); 8384 verifyFormat("void operator delete(int &) throw(int);"); 8385 verifyFormat("auto operator delete(int &) -> int;"); 8386 verifyFormat("auto operator delete(int &) override"); 8387 verifyFormat("auto operator delete(int &) final"); 8388 8389 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 8390 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 8391 // FIXME: The indentation here is not ideal. 8392 verifyFormat( 8393 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8394 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 8395 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 8396 } 8397 8398 TEST_F(FormatTest, FormatsFunctionTypes) { 8399 verifyFormat("A<bool()> a;"); 8400 verifyFormat("A<SomeType()> a;"); 8401 verifyFormat("A<void (*)(int, std::string)> a;"); 8402 verifyFormat("A<void *(int)>;"); 8403 verifyFormat("void *(*a)(int *, SomeType *);"); 8404 verifyFormat("int (*func)(void *);"); 8405 verifyFormat("void f() { int (*func)(void *); }"); 8406 verifyFormat("template <class CallbackClass>\n" 8407 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 8408 8409 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 8410 verifyGoogleFormat("void* (*a)(int);"); 8411 verifyGoogleFormat( 8412 "template <class CallbackClass>\n" 8413 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 8414 8415 // Other constructs can look somewhat like function types: 8416 verifyFormat("A<sizeof(*x)> a;"); 8417 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 8418 verifyFormat("some_var = function(*some_pointer_var)[0];"); 8419 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 8420 verifyFormat("int x = f(&h)();"); 8421 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 8422 verifyFormat("std::function<\n" 8423 " LooooooooooongTemplatedType<\n" 8424 " SomeType>*(\n" 8425 " LooooooooooooooooongType type)>\n" 8426 " function;", 8427 getGoogleStyleWithColumns(40)); 8428 } 8429 8430 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 8431 verifyFormat("A (*foo_)[6];"); 8432 verifyFormat("vector<int> (*foo_)[6];"); 8433 } 8434 8435 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 8436 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8437 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8438 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 8439 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8440 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8441 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 8442 8443 // Different ways of ()-initializiation. 8444 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8445 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 8446 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8447 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 8448 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8449 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 8450 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 8451 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 8452 8453 // Lambdas should not confuse the variable declaration heuristic. 8454 verifyFormat("LooooooooooooooooongType\n" 8455 " variable(nullptr, [](A *a) {});", 8456 getLLVMStyleWithColumns(40)); 8457 } 8458 8459 TEST_F(FormatTest, BreaksLongDeclarations) { 8460 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 8461 " AnotherNameForTheLongType;"); 8462 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 8463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 8464 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8465 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8466 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 8467 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 8468 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8469 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8470 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 8471 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8472 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8473 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8474 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8475 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 8476 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8477 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 8478 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8479 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 8480 FormatStyle Indented = getLLVMStyle(); 8481 Indented.IndentWrappedFunctionNames = true; 8482 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8483 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 8484 Indented); 8485 verifyFormat( 8486 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 8487 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8488 Indented); 8489 verifyFormat( 8490 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 8491 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8492 Indented); 8493 verifyFormat( 8494 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 8495 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 8496 Indented); 8497 8498 // FIXME: Without the comment, this breaks after "(". 8499 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 8500 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 8501 getGoogleStyle()); 8502 8503 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 8504 " int LoooooooooooooooooooongParam2) {}"); 8505 verifyFormat( 8506 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 8507 " SourceLocation L, IdentifierIn *II,\n" 8508 " Type *T) {}"); 8509 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 8510 "ReallyReaaallyLongFunctionName(\n" 8511 " const std::string &SomeParameter,\n" 8512 " const SomeType<string, SomeOtherTemplateParameter>\n" 8513 " &ReallyReallyLongParameterName,\n" 8514 " const SomeType<string, SomeOtherTemplateParameter>\n" 8515 " &AnotherLongParameterName) {}"); 8516 verifyFormat("template <typename A>\n" 8517 "SomeLoooooooooooooooooooooongType<\n" 8518 " typename some_namespace::SomeOtherType<A>::Type>\n" 8519 "Function() {}"); 8520 8521 verifyGoogleFormat( 8522 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 8523 " aaaaaaaaaaaaaaaaaaaaaaa;"); 8524 verifyGoogleFormat( 8525 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 8526 " SourceLocation L) {}"); 8527 verifyGoogleFormat( 8528 "some_namespace::LongReturnType\n" 8529 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 8530 " int first_long_parameter, int second_parameter) {}"); 8531 8532 verifyGoogleFormat("template <typename T>\n" 8533 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8534 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 8535 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8536 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 8537 8538 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 8539 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8540 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8541 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8542 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 8543 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 8544 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 8545 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 8546 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 8547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8548 8549 verifyFormat("template <typename T> // Templates on own line.\n" 8550 "static int // Some comment.\n" 8551 "MyFunction(int a);", 8552 getLLVMStyle()); 8553 } 8554 8555 TEST_F(FormatTest, FormatsArrays) { 8556 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8557 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 8558 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 8559 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 8560 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 8561 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 8562 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8563 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8564 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8565 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 8566 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 8567 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8568 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 8569 verifyFormat( 8570 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 8571 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 8572 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 8573 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 8574 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8575 8576 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 8577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 8578 verifyFormat( 8579 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 8580 " .aaaaaaa[0]\n" 8581 " .aaaaaaaaaaaaaaaaaaaaaa();"); 8582 verifyFormat("a[::b::c];"); 8583 8584 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 8585 8586 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 8587 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 8588 } 8589 8590 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 8591 verifyFormat("(a)->b();"); 8592 verifyFormat("--a;"); 8593 } 8594 8595 TEST_F(FormatTest, HandlesIncludeDirectives) { 8596 verifyFormat("#include <string>\n" 8597 "#include <a/b/c.h>\n" 8598 "#include \"a/b/string\"\n" 8599 "#include \"string.h\"\n" 8600 "#include \"string.h\"\n" 8601 "#include <a-a>\n" 8602 "#include < path with space >\n" 8603 "#include_next <test.h>" 8604 "#include \"abc.h\" // this is included for ABC\n" 8605 "#include \"some long include\" // with a comment\n" 8606 "#include \"some very long include path\"\n" 8607 "#include <some/very/long/include/path>\n", 8608 getLLVMStyleWithColumns(35)); 8609 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 8610 EXPECT_EQ("#include <a>", format("#include<a>")); 8611 8612 verifyFormat("#import <string>"); 8613 verifyFormat("#import <a/b/c.h>"); 8614 verifyFormat("#import \"a/b/string\""); 8615 verifyFormat("#import \"string.h\""); 8616 verifyFormat("#import \"string.h\""); 8617 verifyFormat("#if __has_include(<strstream>)\n" 8618 "#include <strstream>\n" 8619 "#endif"); 8620 8621 verifyFormat("#define MY_IMPORT <a/b>"); 8622 8623 verifyFormat("#if __has_include(<a/b>)"); 8624 verifyFormat("#if __has_include_next(<a/b>)"); 8625 verifyFormat("#define F __has_include(<a/b>)"); 8626 verifyFormat("#define F __has_include_next(<a/b>)"); 8627 8628 // Protocol buffer definition or missing "#". 8629 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 8630 getLLVMStyleWithColumns(30)); 8631 8632 FormatStyle Style = getLLVMStyle(); 8633 Style.AlwaysBreakBeforeMultilineStrings = true; 8634 Style.ColumnLimit = 0; 8635 verifyFormat("#import \"abc.h\"", Style); 8636 8637 // But 'import' might also be a regular C++ namespace. 8638 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 8640 } 8641 8642 //===----------------------------------------------------------------------===// 8643 // Error recovery tests. 8644 //===----------------------------------------------------------------------===// 8645 8646 TEST_F(FormatTest, IncompleteParameterLists) { 8647 FormatStyle NoBinPacking = getLLVMStyle(); 8648 NoBinPacking.BinPackParameters = false; 8649 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 8650 " double *min_x,\n" 8651 " double *max_x,\n" 8652 " double *min_y,\n" 8653 " double *max_y,\n" 8654 " double *min_z,\n" 8655 " double *max_z, ) {}", 8656 NoBinPacking); 8657 } 8658 8659 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 8660 verifyFormat("void f() { return; }\n42"); 8661 verifyFormat("void f() {\n" 8662 " if (0)\n" 8663 " return;\n" 8664 "}\n" 8665 "42"); 8666 verifyFormat("void f() { return }\n42"); 8667 verifyFormat("void f() {\n" 8668 " if (0)\n" 8669 " return\n" 8670 "}\n" 8671 "42"); 8672 } 8673 8674 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 8675 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 8676 EXPECT_EQ("void f() {\n" 8677 " if (a)\n" 8678 " return\n" 8679 "}", 8680 format("void f ( ) { if ( a ) return }")); 8681 EXPECT_EQ("namespace N {\n" 8682 "void f()\n" 8683 "}", 8684 format("namespace N { void f() }")); 8685 EXPECT_EQ("namespace N {\n" 8686 "void f() {}\n" 8687 "void g()\n" 8688 "} // namespace N", 8689 format("namespace N { void f( ) { } void g( ) }")); 8690 } 8691 8692 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 8693 verifyFormat("int aaaaaaaa =\n" 8694 " // Overlylongcomment\n" 8695 " b;", 8696 getLLVMStyleWithColumns(20)); 8697 verifyFormat("function(\n" 8698 " ShortArgument,\n" 8699 " LoooooooooooongArgument);\n", 8700 getLLVMStyleWithColumns(20)); 8701 } 8702 8703 TEST_F(FormatTest, IncorrectAccessSpecifier) { 8704 verifyFormat("public:"); 8705 verifyFormat("class A {\n" 8706 "public\n" 8707 " void f() {}\n" 8708 "};"); 8709 verifyFormat("public\n" 8710 "int qwerty;"); 8711 verifyFormat("public\n" 8712 "B {}"); 8713 verifyFormat("public\n" 8714 "{}"); 8715 verifyFormat("public\n" 8716 "B { int x; }"); 8717 } 8718 8719 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 8720 verifyFormat("{"); 8721 verifyFormat("#})"); 8722 verifyNoCrash("(/**/[:!] ?[)."); 8723 } 8724 8725 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 8726 // Found by oss-fuzz: 8727 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 8728 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 8729 Style.ColumnLimit = 60; 8730 verifyNoCrash( 8731 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 8732 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 8733 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 8734 Style); 8735 } 8736 8737 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 8738 verifyFormat("do {\n}"); 8739 verifyFormat("do {\n}\n" 8740 "f();"); 8741 verifyFormat("do {\n}\n" 8742 "wheeee(fun);"); 8743 verifyFormat("do {\n" 8744 " f();\n" 8745 "}"); 8746 } 8747 8748 TEST_F(FormatTest, IncorrectCodeMissingParens) { 8749 verifyFormat("if {\n foo;\n foo();\n}"); 8750 verifyFormat("switch {\n foo;\n foo();\n}"); 8751 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 8752 verifyFormat("while {\n foo;\n foo();\n}"); 8753 verifyFormat("do {\n foo;\n foo();\n} while;"); 8754 } 8755 8756 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 8757 verifyIncompleteFormat("namespace {\n" 8758 "class Foo { Foo (\n" 8759 "};\n" 8760 "} // namespace"); 8761 } 8762 8763 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 8764 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 8765 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 8766 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 8767 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 8768 8769 EXPECT_EQ("{\n" 8770 " {\n" 8771 " breakme(\n" 8772 " qwe);\n" 8773 " }\n", 8774 format("{\n" 8775 " {\n" 8776 " breakme(qwe);\n" 8777 "}\n", 8778 getLLVMStyleWithColumns(10))); 8779 } 8780 8781 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 8782 verifyFormat("int x = {\n" 8783 " avariable,\n" 8784 " b(alongervariable)};", 8785 getLLVMStyleWithColumns(25)); 8786 } 8787 8788 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 8789 verifyFormat("return (a)(b){1, 2, 3};"); 8790 } 8791 8792 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 8793 verifyFormat("vector<int> x{1, 2, 3, 4};"); 8794 verifyFormat("vector<int> x{\n" 8795 " 1,\n" 8796 " 2,\n" 8797 " 3,\n" 8798 " 4,\n" 8799 "};"); 8800 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 8801 verifyFormat("f({1, 2});"); 8802 verifyFormat("auto v = Foo{-1};"); 8803 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 8804 verifyFormat("Class::Class : member{1, 2, 3} {}"); 8805 verifyFormat("new vector<int>{1, 2, 3};"); 8806 verifyFormat("new int[3]{1, 2, 3};"); 8807 verifyFormat("new int{1};"); 8808 verifyFormat("return {arg1, arg2};"); 8809 verifyFormat("return {arg1, SomeType{parameter}};"); 8810 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 8811 verifyFormat("new T{arg1, arg2};"); 8812 verifyFormat("f(MyMap[{composite, key}]);"); 8813 verifyFormat("class Class {\n" 8814 " T member = {arg1, arg2};\n" 8815 "};"); 8816 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 8817 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 8818 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 8819 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 8820 verifyFormat("int a = std::is_integral<int>{} + 0;"); 8821 8822 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8823 verifyFormat("int foo(int i) { return fo1{}(i); }"); 8824 verifyFormat("auto i = decltype(x){};"); 8825 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 8826 verifyFormat("Node n{1, Node{1000}, //\n" 8827 " 2};"); 8828 verifyFormat("Aaaa aaaaaaa{\n" 8829 " {\n" 8830 " aaaa,\n" 8831 " },\n" 8832 "};"); 8833 verifyFormat("class C : public D {\n" 8834 " SomeClass SC{2};\n" 8835 "};"); 8836 verifyFormat("class C : public A {\n" 8837 " class D : public B {\n" 8838 " void f() { int i{2}; }\n" 8839 " };\n" 8840 "};"); 8841 verifyFormat("#define A {a, a},"); 8842 8843 // Avoid breaking between equal sign and opening brace 8844 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 8845 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 8846 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 8847 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 8848 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 8849 " {\"ccccccccccccccccccccc\", 2}};", 8850 AvoidBreakingFirstArgument); 8851 8852 // Binpacking only if there is no trailing comma 8853 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 8854 " cccccccccc, dddddddddd};", 8855 getLLVMStyleWithColumns(50)); 8856 verifyFormat("const Aaaaaa aaaaa = {\n" 8857 " aaaaaaaaaaa,\n" 8858 " bbbbbbbbbbb,\n" 8859 " ccccccccccc,\n" 8860 " ddddddddddd,\n" 8861 "};", 8862 getLLVMStyleWithColumns(50)); 8863 8864 // Cases where distinguising braced lists and blocks is hard. 8865 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 8866 verifyFormat("void f() {\n" 8867 " return; // comment\n" 8868 "}\n" 8869 "SomeType t;"); 8870 verifyFormat("void f() {\n" 8871 " if (a) {\n" 8872 " f();\n" 8873 " }\n" 8874 "}\n" 8875 "SomeType t;"); 8876 8877 // In combination with BinPackArguments = false. 8878 FormatStyle NoBinPacking = getLLVMStyle(); 8879 NoBinPacking.BinPackArguments = false; 8880 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 8881 " bbbbb,\n" 8882 " ccccc,\n" 8883 " ddddd,\n" 8884 " eeeee,\n" 8885 " ffffff,\n" 8886 " ggggg,\n" 8887 " hhhhhh,\n" 8888 " iiiiii,\n" 8889 " jjjjjj,\n" 8890 " kkkkkk};", 8891 NoBinPacking); 8892 verifyFormat("const Aaaaaa aaaaa = {\n" 8893 " aaaaa,\n" 8894 " bbbbb,\n" 8895 " ccccc,\n" 8896 " ddddd,\n" 8897 " eeeee,\n" 8898 " ffffff,\n" 8899 " ggggg,\n" 8900 " hhhhhh,\n" 8901 " iiiiii,\n" 8902 " jjjjjj,\n" 8903 " kkkkkk,\n" 8904 "};", 8905 NoBinPacking); 8906 verifyFormat( 8907 "const Aaaaaa aaaaa = {\n" 8908 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 8909 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 8910 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 8911 "};", 8912 NoBinPacking); 8913 8914 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 8915 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 8916 " CDDDP83848_BMCR_REGISTER,\n" 8917 " CDDDP83848_BMSR_REGISTER,\n" 8918 " CDDDP83848_RBR_REGISTER};", 8919 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 8920 " CDDDP83848_BMSR_REGISTER,\n" 8921 " CDDDP83848_RBR_REGISTER};", 8922 NoBinPacking)); 8923 8924 // FIXME: The alignment of these trailing comments might be bad. Then again, 8925 // this might be utterly useless in real code. 8926 verifyFormat("Constructor::Constructor()\n" 8927 " : some_value{ //\n" 8928 " aaaaaaa, //\n" 8929 " bbbbbbb} {}"); 8930 8931 // In braced lists, the first comment is always assumed to belong to the 8932 // first element. Thus, it can be moved to the next or previous line as 8933 // appropriate. 8934 EXPECT_EQ("function({// First element:\n" 8935 " 1,\n" 8936 " // Second element:\n" 8937 " 2});", 8938 format("function({\n" 8939 " // First element:\n" 8940 " 1,\n" 8941 " // Second element:\n" 8942 " 2});")); 8943 EXPECT_EQ("std::vector<int> MyNumbers{\n" 8944 " // First element:\n" 8945 " 1,\n" 8946 " // Second element:\n" 8947 " 2};", 8948 format("std::vector<int> MyNumbers{// First element:\n" 8949 " 1,\n" 8950 " // Second element:\n" 8951 " 2};", 8952 getLLVMStyleWithColumns(30))); 8953 // A trailing comma should still lead to an enforced line break and no 8954 // binpacking. 8955 EXPECT_EQ("vector<int> SomeVector = {\n" 8956 " // aaa\n" 8957 " 1,\n" 8958 " 2,\n" 8959 "};", 8960 format("vector<int> SomeVector = { // aaa\n" 8961 " 1, 2, };")); 8962 8963 // C++11 brace initializer list l-braces should not be treated any differently 8964 // when breaking before lambda bodies is enabled 8965 FormatStyle BreakBeforeLambdaBody = getLLVMStyle(); 8966 BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 8967 BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 8968 BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true; 8969 verifyFormat( 8970 "std::runtime_error{\n" 8971 " \"Long string which will force a break onto the next line...\"};", 8972 BreakBeforeLambdaBody); 8973 8974 FormatStyle ExtraSpaces = getLLVMStyle(); 8975 ExtraSpaces.Cpp11BracedListStyle = false; 8976 ExtraSpaces.ColumnLimit = 75; 8977 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8978 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8979 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8980 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8981 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8982 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8983 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8984 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8985 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8986 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8987 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8988 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8989 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8990 verifyFormat("class Class {\n" 8991 " T member = { arg1, arg2 };\n" 8992 "};", 8993 ExtraSpaces); 8994 verifyFormat( 8995 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8996 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8997 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8998 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8999 ExtraSpaces); 9000 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 9001 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 9002 ExtraSpaces); 9003 verifyFormat( 9004 "someFunction(OtherParam,\n" 9005 " BracedList{ // comment 1 (Forcing interesting break)\n" 9006 " param1, param2,\n" 9007 " // comment 2\n" 9008 " param3, param4 });", 9009 ExtraSpaces); 9010 verifyFormat( 9011 "std::this_thread::sleep_for(\n" 9012 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 9013 ExtraSpaces); 9014 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 9015 " aaaaaaa,\n" 9016 " aaaaaaaaaa,\n" 9017 " aaaaa,\n" 9018 " aaaaaaaaaaaaaaa,\n" 9019 " aaa,\n" 9020 " aaaaaaaaaa,\n" 9021 " a,\n" 9022 " aaaaaaaaaaaaaaaaaaaaa,\n" 9023 " aaaaaaaaaaaa,\n" 9024 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 9025 " aaaaaaa,\n" 9026 " a};"); 9027 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 9028 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 9029 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 9030 9031 // Avoid breaking between initializer/equal sign and opening brace 9032 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 9033 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 9034 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 9035 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 9036 " { \"ccccccccccccccccccccc\", 2 }\n" 9037 "};", 9038 ExtraSpaces); 9039 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 9040 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 9041 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 9042 " { \"ccccccccccccccccccccc\", 2 }\n" 9043 "};", 9044 ExtraSpaces); 9045 9046 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 9047 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 9048 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 9049 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 9050 9051 FormatStyle SpaceBetweenBraces = getLLVMStyle(); 9052 SpaceBetweenBraces.SpacesInAngles = true; 9053 SpaceBetweenBraces.SpacesInParentheses = true; 9054 SpaceBetweenBraces.SpacesInSquareBrackets = true; 9055 verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces); 9056 verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces); 9057 verifyFormat("vector< int > x{ // comment 1\n" 9058 " 1, 2, 3, 4 };", 9059 SpaceBetweenBraces); 9060 SpaceBetweenBraces.ColumnLimit = 20; 9061 EXPECT_EQ("vector< int > x{\n" 9062 " 1, 2, 3, 4 };", 9063 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 9064 SpaceBetweenBraces.ColumnLimit = 24; 9065 EXPECT_EQ("vector< int > x{ 1, 2,\n" 9066 " 3, 4 };", 9067 format("vector<int>x{1,2,3,4};", SpaceBetweenBraces)); 9068 EXPECT_EQ("vector< int > x{\n" 9069 " 1,\n" 9070 " 2,\n" 9071 " 3,\n" 9072 " 4,\n" 9073 "};", 9074 format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces)); 9075 verifyFormat("vector< int > x{};", SpaceBetweenBraces); 9076 SpaceBetweenBraces.SpaceInEmptyParentheses = true; 9077 verifyFormat("vector< int > x{ };", SpaceBetweenBraces); 9078 } 9079 9080 TEST_F(FormatTest, FormatSpacesInAngles) { 9081 FormatStyle SpaceInAngles = getLLVMStyle(); 9082 SpaceInAngles.SpacesInAngles = true; 9083 verifyFormat("vector< ::std::string > x1;", SpaceInAngles); 9084 verifyFormat("Foo< int, Bar > x2;", SpaceInAngles); 9085 verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles); 9086 9087 SpaceInAngles.SpacesInAngles = false; 9088 verifyFormat("vector<::std::string> x4;", SpaceInAngles); 9089 verifyFormat("vector<int> x5;", SpaceInAngles); 9090 verifyFormat("Foo<int, Bar> x6;", SpaceInAngles); 9091 verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles); 9092 } 9093 9094 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 9095 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9096 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9097 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9098 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9099 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9100 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 9101 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 9102 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9103 " 1, 22, 333, 4444, 55555, //\n" 9104 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9105 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 9106 verifyFormat( 9107 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9108 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9109 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 9110 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9111 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9112 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 9113 " 7777777};"); 9114 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9115 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9116 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9117 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9118 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9119 " // Separating comment.\n" 9120 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9121 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 9122 " // Leading comment\n" 9123 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 9124 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 9125 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9126 " 1, 1, 1, 1};", 9127 getLLVMStyleWithColumns(39)); 9128 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9129 " 1, 1, 1, 1};", 9130 getLLVMStyleWithColumns(38)); 9131 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 9132 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 9133 getLLVMStyleWithColumns(43)); 9134 verifyFormat( 9135 "static unsigned SomeValues[10][3] = {\n" 9136 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 9137 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 9138 verifyFormat("static auto fields = new vector<string>{\n" 9139 " \"aaaaaaaaaaaaa\",\n" 9140 " \"aaaaaaaaaaaaa\",\n" 9141 " \"aaaaaaaaaaaa\",\n" 9142 " \"aaaaaaaaaaaaaa\",\n" 9143 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9144 " \"aaaaaaaaaaaa\",\n" 9145 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 9146 "};"); 9147 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 9148 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 9149 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 9150 " 3, cccccccccccccccccccccc};", 9151 getLLVMStyleWithColumns(60)); 9152 9153 // Trailing commas. 9154 verifyFormat("vector<int> x = {\n" 9155 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 9156 "};", 9157 getLLVMStyleWithColumns(39)); 9158 verifyFormat("vector<int> x = {\n" 9159 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 9160 "};", 9161 getLLVMStyleWithColumns(39)); 9162 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 9163 " 1, 1, 1, 1,\n" 9164 " /**/ /**/};", 9165 getLLVMStyleWithColumns(39)); 9166 9167 // Trailing comment in the first line. 9168 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 9169 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 9170 " 111111111, 222222222, 3333333333, 444444444, //\n" 9171 " 11111111, 22222222, 333333333, 44444444};"); 9172 // Trailing comment in the last line. 9173 verifyFormat("int aaaaa[] = {\n" 9174 " 1, 2, 3, // comment\n" 9175 " 4, 5, 6 // comment\n" 9176 "};"); 9177 9178 // With nested lists, we should either format one item per line or all nested 9179 // lists one on line. 9180 // FIXME: For some nested lists, we can do better. 9181 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 9182 " {aaaaaaaaaaaaaaaaaaa},\n" 9183 " {aaaaaaaaaaaaaaaaaaaaa},\n" 9184 " {aaaaaaaaaaaaaaaaa}};", 9185 getLLVMStyleWithColumns(60)); 9186 verifyFormat( 9187 "SomeStruct my_struct_array = {\n" 9188 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 9189 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 9190 " {aaa, aaa},\n" 9191 " {aaa, aaa},\n" 9192 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 9193 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 9194 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 9195 9196 // No column layout should be used here. 9197 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 9198 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 9199 9200 verifyNoCrash("a<,"); 9201 9202 // No braced initializer here. 9203 verifyFormat("void f() {\n" 9204 " struct Dummy {};\n" 9205 " f(v);\n" 9206 "}"); 9207 9208 // Long lists should be formatted in columns even if they are nested. 9209 verifyFormat( 9210 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9211 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9212 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9213 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9214 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 9215 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 9216 9217 // Allow "single-column" layout even if that violates the column limit. There 9218 // isn't going to be a better way. 9219 verifyFormat("std::vector<int> a = {\n" 9220 " aaaaaaaa,\n" 9221 " aaaaaaaa,\n" 9222 " aaaaaaaa,\n" 9223 " aaaaaaaa,\n" 9224 " aaaaaaaaaa,\n" 9225 " aaaaaaaa,\n" 9226 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 9227 getLLVMStyleWithColumns(30)); 9228 verifyFormat("vector<int> aaaa = {\n" 9229 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9230 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 9231 " aaaaaa.aaaaaaa,\n" 9232 " aaaaaa.aaaaaaa,\n" 9233 " aaaaaa.aaaaaaa,\n" 9234 " aaaaaa.aaaaaaa,\n" 9235 "};"); 9236 9237 // Don't create hanging lists. 9238 verifyFormat("someFunction(Param, {List1, List2,\n" 9239 " List3});", 9240 getLLVMStyleWithColumns(35)); 9241 verifyFormat("someFunction(Param, Param,\n" 9242 " {List1, List2,\n" 9243 " List3});", 9244 getLLVMStyleWithColumns(35)); 9245 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 9246 " aaaaaaaaaaaaaaaaaaaaaaa);"); 9247 } 9248 9249 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 9250 FormatStyle DoNotMerge = getLLVMStyle(); 9251 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9252 9253 verifyFormat("void f() { return 42; }"); 9254 verifyFormat("void f() {\n" 9255 " return 42;\n" 9256 "}", 9257 DoNotMerge); 9258 verifyFormat("void f() {\n" 9259 " // Comment\n" 9260 "}"); 9261 verifyFormat("{\n" 9262 "#error {\n" 9263 " int a;\n" 9264 "}"); 9265 verifyFormat("{\n" 9266 " int a;\n" 9267 "#error {\n" 9268 "}"); 9269 verifyFormat("void f() {} // comment"); 9270 verifyFormat("void f() { int a; } // comment"); 9271 verifyFormat("void f() {\n" 9272 "} // comment", 9273 DoNotMerge); 9274 verifyFormat("void f() {\n" 9275 " int a;\n" 9276 "} // comment", 9277 DoNotMerge); 9278 verifyFormat("void f() {\n" 9279 "} // comment", 9280 getLLVMStyleWithColumns(15)); 9281 9282 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 9283 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 9284 9285 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 9286 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 9287 verifyFormat("class C {\n" 9288 " C()\n" 9289 " : iiiiiiii(nullptr),\n" 9290 " kkkkkkk(nullptr),\n" 9291 " mmmmmmm(nullptr),\n" 9292 " nnnnnnn(nullptr) {}\n" 9293 "};", 9294 getGoogleStyle()); 9295 9296 FormatStyle NoColumnLimit = getLLVMStyle(); 9297 NoColumnLimit.ColumnLimit = 0; 9298 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 9299 EXPECT_EQ("class C {\n" 9300 " A() : b(0) {}\n" 9301 "};", 9302 format("class C{A():b(0){}};", NoColumnLimit)); 9303 EXPECT_EQ("A()\n" 9304 " : b(0) {\n" 9305 "}", 9306 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 9307 9308 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 9309 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 9310 FormatStyle::SFS_None; 9311 EXPECT_EQ("A()\n" 9312 " : b(0) {\n" 9313 "}", 9314 format("A():b(0){}", DoNotMergeNoColumnLimit)); 9315 EXPECT_EQ("A()\n" 9316 " : b(0) {\n" 9317 "}", 9318 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 9319 9320 verifyFormat("#define A \\\n" 9321 " void f() { \\\n" 9322 " int i; \\\n" 9323 " }", 9324 getLLVMStyleWithColumns(20)); 9325 verifyFormat("#define A \\\n" 9326 " void f() { int i; }", 9327 getLLVMStyleWithColumns(21)); 9328 verifyFormat("#define A \\\n" 9329 " void f() { \\\n" 9330 " int i; \\\n" 9331 " } \\\n" 9332 " int j;", 9333 getLLVMStyleWithColumns(22)); 9334 verifyFormat("#define A \\\n" 9335 " void f() { int i; } \\\n" 9336 " int j;", 9337 getLLVMStyleWithColumns(23)); 9338 } 9339 9340 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 9341 FormatStyle MergeEmptyOnly = getLLVMStyle(); 9342 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9343 verifyFormat("class C {\n" 9344 " int f() {}\n" 9345 "};", 9346 MergeEmptyOnly); 9347 verifyFormat("class C {\n" 9348 " int f() {\n" 9349 " return 42;\n" 9350 " }\n" 9351 "};", 9352 MergeEmptyOnly); 9353 verifyFormat("int f() {}", MergeEmptyOnly); 9354 verifyFormat("int f() {\n" 9355 " return 42;\n" 9356 "}", 9357 MergeEmptyOnly); 9358 9359 // Also verify behavior when BraceWrapping.AfterFunction = true 9360 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9361 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 9362 verifyFormat("int f() {}", MergeEmptyOnly); 9363 verifyFormat("class C {\n" 9364 " int f() {}\n" 9365 "};", 9366 MergeEmptyOnly); 9367 } 9368 9369 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 9370 FormatStyle MergeInlineOnly = getLLVMStyle(); 9371 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9372 verifyFormat("class C {\n" 9373 " int f() { return 42; }\n" 9374 "};", 9375 MergeInlineOnly); 9376 verifyFormat("int f() {\n" 9377 " return 42;\n" 9378 "}", 9379 MergeInlineOnly); 9380 9381 // SFS_Inline implies SFS_Empty 9382 verifyFormat("class C {\n" 9383 " int f() {}\n" 9384 "};", 9385 MergeInlineOnly); 9386 verifyFormat("int f() {}", MergeInlineOnly); 9387 9388 // Also verify behavior when BraceWrapping.AfterFunction = true 9389 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9390 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9391 verifyFormat("class C {\n" 9392 " int f() { return 42; }\n" 9393 "};", 9394 MergeInlineOnly); 9395 verifyFormat("int f()\n" 9396 "{\n" 9397 " return 42;\n" 9398 "}", 9399 MergeInlineOnly); 9400 9401 // SFS_Inline implies SFS_Empty 9402 verifyFormat("int f() {}", MergeInlineOnly); 9403 verifyFormat("class C {\n" 9404 " int f() {}\n" 9405 "};", 9406 MergeInlineOnly); 9407 } 9408 9409 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 9410 FormatStyle MergeInlineOnly = getLLVMStyle(); 9411 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 9412 FormatStyle::SFS_InlineOnly; 9413 verifyFormat("class C {\n" 9414 " int f() { return 42; }\n" 9415 "};", 9416 MergeInlineOnly); 9417 verifyFormat("int f() {\n" 9418 " return 42;\n" 9419 "}", 9420 MergeInlineOnly); 9421 9422 // SFS_InlineOnly does not imply SFS_Empty 9423 verifyFormat("class C {\n" 9424 " int f() {}\n" 9425 "};", 9426 MergeInlineOnly); 9427 verifyFormat("int f() {\n" 9428 "}", 9429 MergeInlineOnly); 9430 9431 // Also verify behavior when BraceWrapping.AfterFunction = true 9432 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 9433 MergeInlineOnly.BraceWrapping.AfterFunction = true; 9434 verifyFormat("class C {\n" 9435 " int f() { return 42; }\n" 9436 "};", 9437 MergeInlineOnly); 9438 verifyFormat("int f()\n" 9439 "{\n" 9440 " return 42;\n" 9441 "}", 9442 MergeInlineOnly); 9443 9444 // SFS_InlineOnly does not imply SFS_Empty 9445 verifyFormat("int f()\n" 9446 "{\n" 9447 "}", 9448 MergeInlineOnly); 9449 verifyFormat("class C {\n" 9450 " int f() {}\n" 9451 "};", 9452 MergeInlineOnly); 9453 } 9454 9455 TEST_F(FormatTest, SplitEmptyFunction) { 9456 FormatStyle Style = getLLVMStyle(); 9457 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 9458 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9459 Style.BraceWrapping.AfterFunction = true; 9460 Style.BraceWrapping.SplitEmptyFunction = false; 9461 Style.ColumnLimit = 40; 9462 9463 verifyFormat("int f()\n" 9464 "{}", 9465 Style); 9466 verifyFormat("int f()\n" 9467 "{\n" 9468 " return 42;\n" 9469 "}", 9470 Style); 9471 verifyFormat("int f()\n" 9472 "{\n" 9473 " // some comment\n" 9474 "}", 9475 Style); 9476 9477 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 9478 verifyFormat("int f() {}", Style); 9479 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9480 "{}", 9481 Style); 9482 verifyFormat("int f()\n" 9483 "{\n" 9484 " return 0;\n" 9485 "}", 9486 Style); 9487 9488 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 9489 verifyFormat("class Foo {\n" 9490 " int f() {}\n" 9491 "};\n", 9492 Style); 9493 verifyFormat("class Foo {\n" 9494 " int f() { return 0; }\n" 9495 "};\n", 9496 Style); 9497 verifyFormat("class Foo {\n" 9498 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9499 " {}\n" 9500 "};\n", 9501 Style); 9502 verifyFormat("class Foo {\n" 9503 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9504 " {\n" 9505 " return 0;\n" 9506 " }\n" 9507 "};\n", 9508 Style); 9509 9510 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9511 verifyFormat("int f() {}", Style); 9512 verifyFormat("int f() { return 0; }", Style); 9513 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9514 "{}", 9515 Style); 9516 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 9517 "{\n" 9518 " return 0;\n" 9519 "}", 9520 Style); 9521 } 9522 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 9523 FormatStyle Style = getLLVMStyle(); 9524 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 9525 verifyFormat("#ifdef A\n" 9526 "int f() {}\n" 9527 "#else\n" 9528 "int g() {}\n" 9529 "#endif", 9530 Style); 9531 } 9532 9533 TEST_F(FormatTest, SplitEmptyClass) { 9534 FormatStyle Style = getLLVMStyle(); 9535 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9536 Style.BraceWrapping.AfterClass = true; 9537 Style.BraceWrapping.SplitEmptyRecord = false; 9538 9539 verifyFormat("class Foo\n" 9540 "{};", 9541 Style); 9542 verifyFormat("/* something */ class Foo\n" 9543 "{};", 9544 Style); 9545 verifyFormat("template <typename X> class Foo\n" 9546 "{};", 9547 Style); 9548 verifyFormat("class Foo\n" 9549 "{\n" 9550 " Foo();\n" 9551 "};", 9552 Style); 9553 verifyFormat("typedef class Foo\n" 9554 "{\n" 9555 "} Foo_t;", 9556 Style); 9557 } 9558 9559 TEST_F(FormatTest, SplitEmptyStruct) { 9560 FormatStyle Style = getLLVMStyle(); 9561 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9562 Style.BraceWrapping.AfterStruct = true; 9563 Style.BraceWrapping.SplitEmptyRecord = false; 9564 9565 verifyFormat("struct Foo\n" 9566 "{};", 9567 Style); 9568 verifyFormat("/* something */ struct Foo\n" 9569 "{};", 9570 Style); 9571 verifyFormat("template <typename X> struct Foo\n" 9572 "{};", 9573 Style); 9574 verifyFormat("struct Foo\n" 9575 "{\n" 9576 " Foo();\n" 9577 "};", 9578 Style); 9579 verifyFormat("typedef struct Foo\n" 9580 "{\n" 9581 "} Foo_t;", 9582 Style); 9583 // typedef struct Bar {} Bar_t; 9584 } 9585 9586 TEST_F(FormatTest, SplitEmptyUnion) { 9587 FormatStyle Style = getLLVMStyle(); 9588 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9589 Style.BraceWrapping.AfterUnion = true; 9590 Style.BraceWrapping.SplitEmptyRecord = false; 9591 9592 verifyFormat("union Foo\n" 9593 "{};", 9594 Style); 9595 verifyFormat("/* something */ union Foo\n" 9596 "{};", 9597 Style); 9598 verifyFormat("union Foo\n" 9599 "{\n" 9600 " A,\n" 9601 "};", 9602 Style); 9603 verifyFormat("typedef union Foo\n" 9604 "{\n" 9605 "} Foo_t;", 9606 Style); 9607 } 9608 9609 TEST_F(FormatTest, SplitEmptyNamespace) { 9610 FormatStyle Style = getLLVMStyle(); 9611 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9612 Style.BraceWrapping.AfterNamespace = true; 9613 Style.BraceWrapping.SplitEmptyNamespace = false; 9614 9615 verifyFormat("namespace Foo\n" 9616 "{};", 9617 Style); 9618 verifyFormat("/* something */ namespace Foo\n" 9619 "{};", 9620 Style); 9621 verifyFormat("inline namespace Foo\n" 9622 "{};", 9623 Style); 9624 verifyFormat("/* something */ inline namespace Foo\n" 9625 "{};", 9626 Style); 9627 verifyFormat("export namespace Foo\n" 9628 "{};", 9629 Style); 9630 verifyFormat("namespace Foo\n" 9631 "{\n" 9632 "void Bar();\n" 9633 "};", 9634 Style); 9635 } 9636 9637 TEST_F(FormatTest, NeverMergeShortRecords) { 9638 FormatStyle Style = getLLVMStyle(); 9639 9640 verifyFormat("class Foo {\n" 9641 " Foo();\n" 9642 "};", 9643 Style); 9644 verifyFormat("typedef class Foo {\n" 9645 " Foo();\n" 9646 "} Foo_t;", 9647 Style); 9648 verifyFormat("struct Foo {\n" 9649 " Foo();\n" 9650 "};", 9651 Style); 9652 verifyFormat("typedef struct Foo {\n" 9653 " Foo();\n" 9654 "} Foo_t;", 9655 Style); 9656 verifyFormat("union Foo {\n" 9657 " A,\n" 9658 "};", 9659 Style); 9660 verifyFormat("typedef union Foo {\n" 9661 " A,\n" 9662 "} Foo_t;", 9663 Style); 9664 verifyFormat("namespace Foo {\n" 9665 "void Bar();\n" 9666 "};", 9667 Style); 9668 9669 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 9670 Style.BraceWrapping.AfterClass = true; 9671 Style.BraceWrapping.AfterStruct = true; 9672 Style.BraceWrapping.AfterUnion = true; 9673 Style.BraceWrapping.AfterNamespace = true; 9674 verifyFormat("class Foo\n" 9675 "{\n" 9676 " Foo();\n" 9677 "};", 9678 Style); 9679 verifyFormat("typedef class Foo\n" 9680 "{\n" 9681 " Foo();\n" 9682 "} Foo_t;", 9683 Style); 9684 verifyFormat("struct Foo\n" 9685 "{\n" 9686 " Foo();\n" 9687 "};", 9688 Style); 9689 verifyFormat("typedef struct Foo\n" 9690 "{\n" 9691 " Foo();\n" 9692 "} Foo_t;", 9693 Style); 9694 verifyFormat("union Foo\n" 9695 "{\n" 9696 " A,\n" 9697 "};", 9698 Style); 9699 verifyFormat("typedef union Foo\n" 9700 "{\n" 9701 " A,\n" 9702 "} Foo_t;", 9703 Style); 9704 verifyFormat("namespace Foo\n" 9705 "{\n" 9706 "void Bar();\n" 9707 "};", 9708 Style); 9709 } 9710 9711 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 9712 // Elaborate type variable declarations. 9713 verifyFormat("struct foo a = {bar};\nint n;"); 9714 verifyFormat("class foo a = {bar};\nint n;"); 9715 verifyFormat("union foo a = {bar};\nint n;"); 9716 9717 // Elaborate types inside function definitions. 9718 verifyFormat("struct foo f() {}\nint n;"); 9719 verifyFormat("class foo f() {}\nint n;"); 9720 verifyFormat("union foo f() {}\nint n;"); 9721 9722 // Templates. 9723 verifyFormat("template <class X> void f() {}\nint n;"); 9724 verifyFormat("template <struct X> void f() {}\nint n;"); 9725 verifyFormat("template <union X> void f() {}\nint n;"); 9726 9727 // Actual definitions... 9728 verifyFormat("struct {\n} n;"); 9729 verifyFormat( 9730 "template <template <class T, class Y>, class Z> class X {\n} n;"); 9731 verifyFormat("union Z {\n int n;\n} x;"); 9732 verifyFormat("class MACRO Z {\n} n;"); 9733 verifyFormat("class MACRO(X) Z {\n} n;"); 9734 verifyFormat("class __attribute__(X) Z {\n} n;"); 9735 verifyFormat("class __declspec(X) Z {\n} n;"); 9736 verifyFormat("class A##B##C {\n} n;"); 9737 verifyFormat("class alignas(16) Z {\n} n;"); 9738 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 9739 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 9740 9741 // Redefinition from nested context: 9742 verifyFormat("class A::B::C {\n} n;"); 9743 9744 // Template definitions. 9745 verifyFormat( 9746 "template <typename F>\n" 9747 "Matcher(const Matcher<F> &Other,\n" 9748 " typename enable_if_c<is_base_of<F, T>::value &&\n" 9749 " !is_same<F, T>::value>::type * = 0)\n" 9750 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 9751 9752 // FIXME: This is still incorrectly handled at the formatter side. 9753 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 9754 verifyFormat("int i = SomeFunction(a<b, a> b);"); 9755 9756 // FIXME: 9757 // This now gets parsed incorrectly as class definition. 9758 // verifyFormat("class A<int> f() {\n}\nint n;"); 9759 9760 // Elaborate types where incorrectly parsing the structural element would 9761 // break the indent. 9762 verifyFormat("if (true)\n" 9763 " class X x;\n" 9764 "else\n" 9765 " f();\n"); 9766 9767 // This is simply incomplete. Formatting is not important, but must not crash. 9768 verifyFormat("class A:"); 9769 } 9770 9771 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 9772 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 9773 format("#error Leave all white!!!!! space* alone!\n")); 9774 EXPECT_EQ( 9775 "#warning Leave all white!!!!! space* alone!\n", 9776 format("#warning Leave all white!!!!! space* alone!\n")); 9777 EXPECT_EQ("#error 1", format(" # error 1")); 9778 EXPECT_EQ("#warning 1", format(" # warning 1")); 9779 } 9780 9781 TEST_F(FormatTest, FormatHashIfExpressions) { 9782 verifyFormat("#if AAAA && BBBB"); 9783 verifyFormat("#if (AAAA && BBBB)"); 9784 verifyFormat("#elif (AAAA && BBBB)"); 9785 // FIXME: Come up with a better indentation for #elif. 9786 verifyFormat( 9787 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 9788 " defined(BBBBBBBB)\n" 9789 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 9790 " defined(BBBBBBBB)\n" 9791 "#endif", 9792 getLLVMStyleWithColumns(65)); 9793 } 9794 9795 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 9796 FormatStyle AllowsMergedIf = getGoogleStyle(); 9797 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 9798 FormatStyle::SIS_WithoutElse; 9799 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 9800 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 9801 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 9802 EXPECT_EQ("if (true) return 42;", 9803 format("if (true)\nreturn 42;", AllowsMergedIf)); 9804 FormatStyle ShortMergedIf = AllowsMergedIf; 9805 ShortMergedIf.ColumnLimit = 25; 9806 verifyFormat("#define A \\\n" 9807 " if (true) return 42;", 9808 ShortMergedIf); 9809 verifyFormat("#define A \\\n" 9810 " f(); \\\n" 9811 " if (true)\n" 9812 "#define B", 9813 ShortMergedIf); 9814 verifyFormat("#define A \\\n" 9815 " f(); \\\n" 9816 " if (true)\n" 9817 "g();", 9818 ShortMergedIf); 9819 verifyFormat("{\n" 9820 "#ifdef A\n" 9821 " // Comment\n" 9822 " if (true) continue;\n" 9823 "#endif\n" 9824 " // Comment\n" 9825 " if (true) continue;\n" 9826 "}", 9827 ShortMergedIf); 9828 ShortMergedIf.ColumnLimit = 33; 9829 verifyFormat("#define A \\\n" 9830 " if constexpr (true) return 42;", 9831 ShortMergedIf); 9832 verifyFormat("#define A \\\n" 9833 " if CONSTEXPR (true) return 42;", 9834 ShortMergedIf); 9835 ShortMergedIf.ColumnLimit = 29; 9836 verifyFormat("#define A \\\n" 9837 " if (aaaaaaaaaa) return 1; \\\n" 9838 " return 2;", 9839 ShortMergedIf); 9840 ShortMergedIf.ColumnLimit = 28; 9841 verifyFormat("#define A \\\n" 9842 " if (aaaaaaaaaa) \\\n" 9843 " return 1; \\\n" 9844 " return 2;", 9845 ShortMergedIf); 9846 verifyFormat("#define A \\\n" 9847 " if constexpr (aaaaaaa) \\\n" 9848 " return 1; \\\n" 9849 " return 2;", 9850 ShortMergedIf); 9851 verifyFormat("#define A \\\n" 9852 " if CONSTEXPR (aaaaaaa) \\\n" 9853 " return 1; \\\n" 9854 " return 2;", 9855 ShortMergedIf); 9856 } 9857 9858 TEST_F(FormatTest, FormatStarDependingOnContext) { 9859 verifyFormat("void f(int *a);"); 9860 verifyFormat("void f() { f(fint * b); }"); 9861 verifyFormat("class A {\n void f(int *a);\n};"); 9862 verifyFormat("class A {\n int *a;\n};"); 9863 verifyFormat("namespace a {\n" 9864 "namespace b {\n" 9865 "class A {\n" 9866 " void f() {}\n" 9867 " int *a;\n" 9868 "};\n" 9869 "} // namespace b\n" 9870 "} // namespace a"); 9871 } 9872 9873 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 9874 verifyFormat("while"); 9875 verifyFormat("operator"); 9876 } 9877 9878 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 9879 // This code would be painfully slow to format if we didn't skip it. 9880 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 9881 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9882 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9883 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9884 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 9885 "A(1, 1)\n" 9886 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 9887 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9888 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9889 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9890 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9891 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9892 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9893 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9894 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 9895 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 9896 // Deeply nested part is untouched, rest is formatted. 9897 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 9898 format(std::string("int i;\n") + Code + "int j;\n", 9899 getLLVMStyle(), SC_ExpectIncomplete)); 9900 } 9901 9902 //===----------------------------------------------------------------------===// 9903 // Objective-C tests. 9904 //===----------------------------------------------------------------------===// 9905 9906 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 9907 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 9908 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 9909 format("-(NSUInteger)indexOfObject:(id)anObject;")); 9910 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 9911 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 9912 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 9913 format("-(NSInteger)Method3:(id)anObject;")); 9914 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 9915 format("-(NSInteger)Method4:(id)anObject;")); 9916 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 9917 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 9918 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 9919 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 9920 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9921 "forAllCells:(BOOL)flag;", 9922 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 9923 "forAllCells:(BOOL)flag;")); 9924 9925 // Very long objectiveC method declaration. 9926 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 9927 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 9928 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 9929 " inRange:(NSRange)range\n" 9930 " outRange:(NSRange)out_range\n" 9931 " outRange1:(NSRange)out_range1\n" 9932 " outRange2:(NSRange)out_range2\n" 9933 " outRange3:(NSRange)out_range3\n" 9934 " outRange4:(NSRange)out_range4\n" 9935 " outRange5:(NSRange)out_range5\n" 9936 " outRange6:(NSRange)out_range6\n" 9937 " outRange7:(NSRange)out_range7\n" 9938 " outRange8:(NSRange)out_range8\n" 9939 " outRange9:(NSRange)out_range9;"); 9940 9941 // When the function name has to be wrapped. 9942 FormatStyle Style = getLLVMStyle(); 9943 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 9944 // and always indents instead. 9945 Style.IndentWrappedFunctionNames = false; 9946 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9947 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 9948 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 9949 "}", 9950 Style); 9951 Style.IndentWrappedFunctionNames = true; 9952 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 9953 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 9954 " anotherName:(NSString)dddddddddddddd {\n" 9955 "}", 9956 Style); 9957 9958 verifyFormat("- (int)sum:(vector<int>)numbers;"); 9959 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 9960 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 9961 // protocol lists (but not for template classes): 9962 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 9963 9964 verifyFormat("- (int (*)())foo:(int (*)())f;"); 9965 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 9966 9967 // If there's no return type (very rare in practice!), LLVM and Google style 9968 // agree. 9969 verifyFormat("- foo;"); 9970 verifyFormat("- foo:(int)f;"); 9971 verifyGoogleFormat("- foo:(int)foo;"); 9972 } 9973 9974 TEST_F(FormatTest, BreaksStringLiterals) { 9975 EXPECT_EQ("\"some text \"\n" 9976 "\"other\";", 9977 format("\"some text other\";", getLLVMStyleWithColumns(12))); 9978 EXPECT_EQ("\"some text \"\n" 9979 "\"other\";", 9980 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 9981 EXPECT_EQ( 9982 "#define A \\\n" 9983 " \"some \" \\\n" 9984 " \"text \" \\\n" 9985 " \"other\";", 9986 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 9987 EXPECT_EQ( 9988 "#define A \\\n" 9989 " \"so \" \\\n" 9990 " \"text \" \\\n" 9991 " \"other\";", 9992 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 9993 9994 EXPECT_EQ("\"some text\"", 9995 format("\"some text\"", getLLVMStyleWithColumns(1))); 9996 EXPECT_EQ("\"some text\"", 9997 format("\"some text\"", getLLVMStyleWithColumns(11))); 9998 EXPECT_EQ("\"some \"\n" 9999 "\"text\"", 10000 format("\"some text\"", getLLVMStyleWithColumns(10))); 10001 EXPECT_EQ("\"some \"\n" 10002 "\"text\"", 10003 format("\"some text\"", getLLVMStyleWithColumns(7))); 10004 EXPECT_EQ("\"some\"\n" 10005 "\" tex\"\n" 10006 "\"t\"", 10007 format("\"some text\"", getLLVMStyleWithColumns(6))); 10008 EXPECT_EQ("\"some\"\n" 10009 "\" tex\"\n" 10010 "\" and\"", 10011 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 10012 EXPECT_EQ("\"some\"\n" 10013 "\"/tex\"\n" 10014 "\"/and\"", 10015 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 10016 10017 EXPECT_EQ("variable =\n" 10018 " \"long string \"\n" 10019 " \"literal\";", 10020 format("variable = \"long string literal\";", 10021 getLLVMStyleWithColumns(20))); 10022 10023 EXPECT_EQ("variable = f(\n" 10024 " \"long string \"\n" 10025 " \"literal\",\n" 10026 " short,\n" 10027 " loooooooooooooooooooong);", 10028 format("variable = f(\"long string literal\", short, " 10029 "loooooooooooooooooooong);", 10030 getLLVMStyleWithColumns(20))); 10031 10032 EXPECT_EQ( 10033 "f(g(\"long string \"\n" 10034 " \"literal\"),\n" 10035 " b);", 10036 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 10037 EXPECT_EQ("f(g(\"long string \"\n" 10038 " \"literal\",\n" 10039 " a),\n" 10040 " b);", 10041 format("f(g(\"long string literal\", a), b);", 10042 getLLVMStyleWithColumns(20))); 10043 EXPECT_EQ( 10044 "f(\"one two\".split(\n" 10045 " variable));", 10046 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 10047 EXPECT_EQ("f(\"one two three four five six \"\n" 10048 " \"seven\".split(\n" 10049 " really_looooong_variable));", 10050 format("f(\"one two three four five six seven\"." 10051 "split(really_looooong_variable));", 10052 getLLVMStyleWithColumns(33))); 10053 10054 EXPECT_EQ("f(\"some \"\n" 10055 " \"text\",\n" 10056 " other);", 10057 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 10058 10059 // Only break as a last resort. 10060 verifyFormat( 10061 "aaaaaaaaaaaaaaaaaaaa(\n" 10062 " aaaaaaaaaaaaaaaaaaaa,\n" 10063 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 10064 10065 EXPECT_EQ("\"splitmea\"\n" 10066 "\"trandomp\"\n" 10067 "\"oint\"", 10068 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 10069 10070 EXPECT_EQ("\"split/\"\n" 10071 "\"pathat/\"\n" 10072 "\"slashes\"", 10073 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 10074 10075 EXPECT_EQ("\"split/\"\n" 10076 "\"pathat/\"\n" 10077 "\"slashes\"", 10078 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 10079 EXPECT_EQ("\"split at \"\n" 10080 "\"spaces/at/\"\n" 10081 "\"slashes.at.any$\"\n" 10082 "\"non-alphanumeric%\"\n" 10083 "\"1111111111characte\"\n" 10084 "\"rs\"", 10085 format("\"split at " 10086 "spaces/at/" 10087 "slashes.at." 10088 "any$non-" 10089 "alphanumeric%" 10090 "1111111111characte" 10091 "rs\"", 10092 getLLVMStyleWithColumns(20))); 10093 10094 // Verify that splitting the strings understands 10095 // Style::AlwaysBreakBeforeMultilineStrings. 10096 EXPECT_EQ("aaaaaaaaaaaa(\n" 10097 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 10098 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 10099 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 10100 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 10101 "aaaaaaaaaaaaaaaaaaaaaa\");", 10102 getGoogleStyle())); 10103 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10104 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 10105 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 10106 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 10107 "aaaaaaaaaaaaaaaaaaaaaa\";", 10108 getGoogleStyle())); 10109 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10110 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10111 format("llvm::outs() << " 10112 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 10113 "aaaaaaaaaaaaaaaaaaa\";")); 10114 EXPECT_EQ("ffff(\n" 10115 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 10116 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10117 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 10118 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 10119 getGoogleStyle())); 10120 10121 FormatStyle Style = getLLVMStyleWithColumns(12); 10122 Style.BreakStringLiterals = false; 10123 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 10124 10125 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 10126 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10127 EXPECT_EQ("#define A \\\n" 10128 " \"some \" \\\n" 10129 " \"text \" \\\n" 10130 " \"other\";", 10131 format("#define A \"some text other\";", AlignLeft)); 10132 } 10133 10134 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 10135 EXPECT_EQ("C a = \"some more \"\n" 10136 " \"text\";", 10137 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 10138 } 10139 10140 TEST_F(FormatTest, FullyRemoveEmptyLines) { 10141 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 10142 NoEmptyLines.MaxEmptyLinesToKeep = 0; 10143 EXPECT_EQ("int i = a(b());", 10144 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 10145 } 10146 10147 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 10148 EXPECT_EQ( 10149 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10150 "(\n" 10151 " \"x\t\");", 10152 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 10153 "aaaaaaa(" 10154 "\"x\t\");")); 10155 } 10156 10157 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 10158 EXPECT_EQ( 10159 "u8\"utf8 string \"\n" 10160 "u8\"literal\";", 10161 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 10162 EXPECT_EQ( 10163 "u\"utf16 string \"\n" 10164 "u\"literal\";", 10165 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 10166 EXPECT_EQ( 10167 "U\"utf32 string \"\n" 10168 "U\"literal\";", 10169 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 10170 EXPECT_EQ("L\"wide string \"\n" 10171 "L\"literal\";", 10172 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 10173 EXPECT_EQ("@\"NSString \"\n" 10174 "@\"literal\";", 10175 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 10176 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 10177 10178 // This input makes clang-format try to split the incomplete unicode escape 10179 // sequence, which used to lead to a crasher. 10180 verifyNoCrash( 10181 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 10182 getLLVMStyleWithColumns(60)); 10183 } 10184 10185 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 10186 FormatStyle Style = getGoogleStyleWithColumns(15); 10187 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 10188 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 10189 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 10190 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 10191 EXPECT_EQ("u8R\"x(raw literal)x\";", 10192 format("u8R\"x(raw literal)x\";", Style)); 10193 } 10194 10195 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 10196 FormatStyle Style = getLLVMStyleWithColumns(20); 10197 EXPECT_EQ( 10198 "_T(\"aaaaaaaaaaaaaa\")\n" 10199 "_T(\"aaaaaaaaaaaaaa\")\n" 10200 "_T(\"aaaaaaaaaaaa\")", 10201 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 10202 EXPECT_EQ("f(x,\n" 10203 " _T(\"aaaaaaaaaaaa\")\n" 10204 " _T(\"aaa\"),\n" 10205 " z);", 10206 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 10207 10208 // FIXME: Handle embedded spaces in one iteration. 10209 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 10210 // "_T(\"aaaaaaaaaaaaa\")\n" 10211 // "_T(\"aaaaaaaaaaaaa\")\n" 10212 // "_T(\"a\")", 10213 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10214 // getLLVMStyleWithColumns(20))); 10215 EXPECT_EQ( 10216 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 10217 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 10218 EXPECT_EQ("f(\n" 10219 "#if !TEST\n" 10220 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10221 "#endif\n" 10222 ");", 10223 format("f(\n" 10224 "#if !TEST\n" 10225 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 10226 "#endif\n" 10227 ");")); 10228 EXPECT_EQ("f(\n" 10229 "\n" 10230 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 10231 format("f(\n" 10232 "\n" 10233 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 10234 } 10235 10236 TEST_F(FormatTest, BreaksStringLiteralOperands) { 10237 // In a function call with two operands, the second can be broken with no line 10238 // break before it. 10239 EXPECT_EQ( 10240 "func(a, \"long long \"\n" 10241 " \"long long\");", 10242 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 10243 // In a function call with three operands, the second must be broken with a 10244 // line break before it. 10245 EXPECT_EQ("func(a,\n" 10246 " \"long long long \"\n" 10247 " \"long\",\n" 10248 " c);", 10249 format("func(a, \"long long long long\", c);", 10250 getLLVMStyleWithColumns(24))); 10251 // In a function call with three operands, the third must be broken with a 10252 // line break before it. 10253 EXPECT_EQ("func(a, b,\n" 10254 " \"long long long \"\n" 10255 " \"long\");", 10256 format("func(a, b, \"long long long long\");", 10257 getLLVMStyleWithColumns(24))); 10258 // In a function call with three operands, both the second and the third must 10259 // be broken with a line break before them. 10260 EXPECT_EQ("func(a,\n" 10261 " \"long long long \"\n" 10262 " \"long\",\n" 10263 " \"long long long \"\n" 10264 " \"long\");", 10265 format("func(a, \"long long long long\", \"long long long long\");", 10266 getLLVMStyleWithColumns(24))); 10267 // In a chain of << with two operands, the second can be broken with no line 10268 // break before it. 10269 EXPECT_EQ("a << \"line line \"\n" 10270 " \"line\";", 10271 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 10272 // In a chain of << with three operands, the second can be broken with no line 10273 // break before it. 10274 EXPECT_EQ( 10275 "abcde << \"line \"\n" 10276 " \"line line\"\n" 10277 " << c;", 10278 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 10279 // In a chain of << with three operands, the third must be broken with a line 10280 // break before it. 10281 EXPECT_EQ( 10282 "a << b\n" 10283 " << \"line line \"\n" 10284 " \"line\";", 10285 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 10286 // In a chain of << with three operands, the second can be broken with no line 10287 // break before it and the third must be broken with a line break before it. 10288 EXPECT_EQ("abcd << \"line line \"\n" 10289 " \"line\"\n" 10290 " << \"line line \"\n" 10291 " \"line\";", 10292 format("abcd << \"line line line\" << \"line line line\";", 10293 getLLVMStyleWithColumns(20))); 10294 // In a chain of binary operators with two operands, the second can be broken 10295 // with no line break before it. 10296 EXPECT_EQ( 10297 "abcd + \"line line \"\n" 10298 " \"line line\";", 10299 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 10300 // In a chain of binary operators with three operands, the second must be 10301 // broken with a line break before it. 10302 EXPECT_EQ("abcd +\n" 10303 " \"line line \"\n" 10304 " \"line line\" +\n" 10305 " e;", 10306 format("abcd + \"line line line line\" + e;", 10307 getLLVMStyleWithColumns(20))); 10308 // In a function call with two operands, with AlignAfterOpenBracket enabled, 10309 // the first must be broken with a line break before it. 10310 FormatStyle Style = getLLVMStyleWithColumns(25); 10311 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 10312 EXPECT_EQ("someFunction(\n" 10313 " \"long long long \"\n" 10314 " \"long\",\n" 10315 " a);", 10316 format("someFunction(\"long long long long\", a);", Style)); 10317 } 10318 10319 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 10320 EXPECT_EQ( 10321 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10323 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 10324 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10325 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 10326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 10327 } 10328 10329 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 10330 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 10331 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 10332 EXPECT_EQ("fffffffffff(g(R\"x(\n" 10333 "multiline raw string literal xxxxxxxxxxxxxx\n" 10334 ")x\",\n" 10335 " a),\n" 10336 " b);", 10337 format("fffffffffff(g(R\"x(\n" 10338 "multiline raw string literal xxxxxxxxxxxxxx\n" 10339 ")x\", a), b);", 10340 getGoogleStyleWithColumns(20))); 10341 EXPECT_EQ("fffffffffff(\n" 10342 " g(R\"x(qqq\n" 10343 "multiline raw string literal xxxxxxxxxxxxxx\n" 10344 ")x\",\n" 10345 " a),\n" 10346 " b);", 10347 format("fffffffffff(g(R\"x(qqq\n" 10348 "multiline raw string literal xxxxxxxxxxxxxx\n" 10349 ")x\", a), b);", 10350 getGoogleStyleWithColumns(20))); 10351 10352 EXPECT_EQ("fffffffffff(R\"x(\n" 10353 "multiline raw string literal xxxxxxxxxxxxxx\n" 10354 ")x\");", 10355 format("fffffffffff(R\"x(\n" 10356 "multiline raw string literal xxxxxxxxxxxxxx\n" 10357 ")x\");", 10358 getGoogleStyleWithColumns(20))); 10359 EXPECT_EQ("fffffffffff(R\"x(\n" 10360 "multiline raw string literal xxxxxxxxxxxxxx\n" 10361 ")x\" + bbbbbb);", 10362 format("fffffffffff(R\"x(\n" 10363 "multiline raw string literal xxxxxxxxxxxxxx\n" 10364 ")x\" + bbbbbb);", 10365 getGoogleStyleWithColumns(20))); 10366 EXPECT_EQ("fffffffffff(\n" 10367 " R\"x(\n" 10368 "multiline raw string literal xxxxxxxxxxxxxx\n" 10369 ")x\" +\n" 10370 " bbbbbb);", 10371 format("fffffffffff(\n" 10372 " R\"x(\n" 10373 "multiline raw string literal xxxxxxxxxxxxxx\n" 10374 ")x\" + bbbbbb);", 10375 getGoogleStyleWithColumns(20))); 10376 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 10377 format("fffffffffff(\n" 10378 " R\"(single line raw string)\" + bbbbbb);")); 10379 } 10380 10381 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 10382 verifyFormat("string a = \"unterminated;"); 10383 EXPECT_EQ("function(\"unterminated,\n" 10384 " OtherParameter);", 10385 format("function( \"unterminated,\n" 10386 " OtherParameter);")); 10387 } 10388 10389 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 10390 FormatStyle Style = getLLVMStyle(); 10391 Style.Standard = FormatStyle::LS_Cpp03; 10392 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 10393 format("#define x(_a) printf(\"foo\"_a);", Style)); 10394 } 10395 10396 TEST_F(FormatTest, CppLexVersion) { 10397 FormatStyle Style = getLLVMStyle(); 10398 // Formatting of x * y differs if x is a type. 10399 verifyFormat("void foo() { MACRO(a * b); }", Style); 10400 verifyFormat("void foo() { MACRO(int *b); }", Style); 10401 10402 // LLVM style uses latest lexer. 10403 verifyFormat("void foo() { MACRO(char8_t *b); }", Style); 10404 Style.Standard = FormatStyle::LS_Cpp17; 10405 // But in c++17, char8_t isn't a keyword. 10406 verifyFormat("void foo() { MACRO(char8_t * b); }", Style); 10407 } 10408 10409 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 10410 10411 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 10412 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 10413 " \"ddeeefff\");", 10414 format("someFunction(\"aaabbbcccdddeeefff\");", 10415 getLLVMStyleWithColumns(25))); 10416 EXPECT_EQ("someFunction1234567890(\n" 10417 " \"aaabbbcccdddeeefff\");", 10418 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10419 getLLVMStyleWithColumns(26))); 10420 EXPECT_EQ("someFunction1234567890(\n" 10421 " \"aaabbbcccdddeeeff\"\n" 10422 " \"f\");", 10423 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10424 getLLVMStyleWithColumns(25))); 10425 EXPECT_EQ("someFunction1234567890(\n" 10426 " \"aaabbbcccdddeeeff\"\n" 10427 " \"f\");", 10428 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 10429 getLLVMStyleWithColumns(24))); 10430 EXPECT_EQ("someFunction(\n" 10431 " \"aaabbbcc ddde \"\n" 10432 " \"efff\");", 10433 format("someFunction(\"aaabbbcc ddde efff\");", 10434 getLLVMStyleWithColumns(25))); 10435 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 10436 " \"ddeeefff\");", 10437 format("someFunction(\"aaabbbccc ddeeefff\");", 10438 getLLVMStyleWithColumns(25))); 10439 EXPECT_EQ("someFunction1234567890(\n" 10440 " \"aaabb \"\n" 10441 " \"cccdddeeefff\");", 10442 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 10443 getLLVMStyleWithColumns(25))); 10444 EXPECT_EQ("#define A \\\n" 10445 " string s = \\\n" 10446 " \"123456789\" \\\n" 10447 " \"0\"; \\\n" 10448 " int i;", 10449 format("#define A string s = \"1234567890\"; int i;", 10450 getLLVMStyleWithColumns(20))); 10451 EXPECT_EQ("someFunction(\n" 10452 " \"aaabbbcc \"\n" 10453 " \"dddeeefff\");", 10454 format("someFunction(\"aaabbbcc dddeeefff\");", 10455 getLLVMStyleWithColumns(25))); 10456 } 10457 10458 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 10459 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 10460 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 10461 EXPECT_EQ("\"test\"\n" 10462 "\"\\n\"", 10463 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 10464 EXPECT_EQ("\"tes\\\\\"\n" 10465 "\"n\"", 10466 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 10467 EXPECT_EQ("\"\\\\\\\\\"\n" 10468 "\"\\n\"", 10469 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 10470 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 10471 EXPECT_EQ("\"\\uff01\"\n" 10472 "\"test\"", 10473 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 10474 EXPECT_EQ("\"\\Uff01ff02\"", 10475 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 10476 EXPECT_EQ("\"\\x000000000001\"\n" 10477 "\"next\"", 10478 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 10479 EXPECT_EQ("\"\\x000000000001next\"", 10480 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 10481 EXPECT_EQ("\"\\x000000000001\"", 10482 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 10483 EXPECT_EQ("\"test\"\n" 10484 "\"\\000000\"\n" 10485 "\"000001\"", 10486 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 10487 EXPECT_EQ("\"test\\000\"\n" 10488 "\"00000000\"\n" 10489 "\"1\"", 10490 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 10491 } 10492 10493 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 10494 verifyFormat("void f() {\n" 10495 " return g() {}\n" 10496 " void h() {}"); 10497 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 10498 "g();\n" 10499 "}"); 10500 } 10501 10502 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 10503 verifyFormat( 10504 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 10505 } 10506 10507 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 10508 verifyFormat("class X {\n" 10509 " void f() {\n" 10510 " }\n" 10511 "};", 10512 getLLVMStyleWithColumns(12)); 10513 } 10514 10515 TEST_F(FormatTest, ConfigurableIndentWidth) { 10516 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 10517 EightIndent.IndentWidth = 8; 10518 EightIndent.ContinuationIndentWidth = 8; 10519 verifyFormat("void f() {\n" 10520 " someFunction();\n" 10521 " if (true) {\n" 10522 " f();\n" 10523 " }\n" 10524 "}", 10525 EightIndent); 10526 verifyFormat("class X {\n" 10527 " void f() {\n" 10528 " }\n" 10529 "};", 10530 EightIndent); 10531 verifyFormat("int x[] = {\n" 10532 " call(),\n" 10533 " call()};", 10534 EightIndent); 10535 } 10536 10537 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 10538 verifyFormat("double\n" 10539 "f();", 10540 getLLVMStyleWithColumns(8)); 10541 } 10542 10543 TEST_F(FormatTest, ConfigurableUseOfTab) { 10544 FormatStyle Tab = getLLVMStyleWithColumns(42); 10545 Tab.IndentWidth = 8; 10546 Tab.UseTab = FormatStyle::UT_Always; 10547 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10548 10549 EXPECT_EQ("if (aaaaaaaa && // q\n" 10550 " bb)\t\t// w\n" 10551 "\t;", 10552 format("if (aaaaaaaa &&// q\n" 10553 "bb)// w\n" 10554 ";", 10555 Tab)); 10556 EXPECT_EQ("if (aaa && bbb) // w\n" 10557 "\t;", 10558 format("if(aaa&&bbb)// w\n" 10559 ";", 10560 Tab)); 10561 10562 verifyFormat("class X {\n" 10563 "\tvoid f() {\n" 10564 "\t\tsomeFunction(parameter1,\n" 10565 "\t\t\t parameter2);\n" 10566 "\t}\n" 10567 "};", 10568 Tab); 10569 verifyFormat("#define A \\\n" 10570 "\tvoid f() { \\\n" 10571 "\t\tsomeFunction( \\\n" 10572 "\t\t parameter1, \\\n" 10573 "\t\t parameter2); \\\n" 10574 "\t}", 10575 Tab); 10576 verifyFormat("int a;\t // x\n" 10577 "int bbbbbbbb; // x\n", 10578 Tab); 10579 10580 Tab.TabWidth = 4; 10581 Tab.IndentWidth = 8; 10582 verifyFormat("class TabWidth4Indent8 {\n" 10583 "\t\tvoid f() {\n" 10584 "\t\t\t\tsomeFunction(parameter1,\n" 10585 "\t\t\t\t\t\t\t parameter2);\n" 10586 "\t\t}\n" 10587 "};", 10588 Tab); 10589 10590 Tab.TabWidth = 4; 10591 Tab.IndentWidth = 4; 10592 verifyFormat("class TabWidth4Indent4 {\n" 10593 "\tvoid f() {\n" 10594 "\t\tsomeFunction(parameter1,\n" 10595 "\t\t\t\t\t parameter2);\n" 10596 "\t}\n" 10597 "};", 10598 Tab); 10599 10600 Tab.TabWidth = 8; 10601 Tab.IndentWidth = 4; 10602 verifyFormat("class TabWidth8Indent4 {\n" 10603 " void f() {\n" 10604 "\tsomeFunction(parameter1,\n" 10605 "\t\t parameter2);\n" 10606 " }\n" 10607 "};", 10608 Tab); 10609 10610 Tab.TabWidth = 8; 10611 Tab.IndentWidth = 8; 10612 EXPECT_EQ("/*\n" 10613 "\t a\t\tcomment\n" 10614 "\t in multiple lines\n" 10615 " */", 10616 format(" /*\t \t \n" 10617 " \t \t a\t\tcomment\t \t\n" 10618 " \t \t in multiple lines\t\n" 10619 " \t */", 10620 Tab)); 10621 10622 Tab.UseTab = FormatStyle::UT_ForIndentation; 10623 verifyFormat("{\n" 10624 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10625 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10626 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10627 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10628 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10629 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10630 "};", 10631 Tab); 10632 verifyFormat("enum AA {\n" 10633 "\ta1, // Force multiple lines\n" 10634 "\ta2,\n" 10635 "\ta3\n" 10636 "};", 10637 Tab); 10638 EXPECT_EQ("if (aaaaaaaa && // q\n" 10639 " bb) // w\n" 10640 "\t;", 10641 format("if (aaaaaaaa &&// q\n" 10642 "bb)// w\n" 10643 ";", 10644 Tab)); 10645 verifyFormat("class X {\n" 10646 "\tvoid f() {\n" 10647 "\t\tsomeFunction(parameter1,\n" 10648 "\t\t parameter2);\n" 10649 "\t}\n" 10650 "};", 10651 Tab); 10652 verifyFormat("{\n" 10653 "\tQ(\n" 10654 "\t {\n" 10655 "\t\t int a;\n" 10656 "\t\t someFunction(aaaaaaaa,\n" 10657 "\t\t bbbbbbb);\n" 10658 "\t },\n" 10659 "\t p);\n" 10660 "}", 10661 Tab); 10662 EXPECT_EQ("{\n" 10663 "\t/* aaaa\n" 10664 "\t bbbb */\n" 10665 "}", 10666 format("{\n" 10667 "/* aaaa\n" 10668 " bbbb */\n" 10669 "}", 10670 Tab)); 10671 EXPECT_EQ("{\n" 10672 "\t/*\n" 10673 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10674 "\t bbbbbbbbbbbbb\n" 10675 "\t*/\n" 10676 "}", 10677 format("{\n" 10678 "/*\n" 10679 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10680 "*/\n" 10681 "}", 10682 Tab)); 10683 EXPECT_EQ("{\n" 10684 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10685 "\t// bbbbbbbbbbbbb\n" 10686 "}", 10687 format("{\n" 10688 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10689 "}", 10690 Tab)); 10691 EXPECT_EQ("{\n" 10692 "\t/*\n" 10693 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10694 "\t bbbbbbbbbbbbb\n" 10695 "\t*/\n" 10696 "}", 10697 format("{\n" 10698 "\t/*\n" 10699 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10700 "\t*/\n" 10701 "}", 10702 Tab)); 10703 EXPECT_EQ("{\n" 10704 "\t/*\n" 10705 "\n" 10706 "\t*/\n" 10707 "}", 10708 format("{\n" 10709 "\t/*\n" 10710 "\n" 10711 "\t*/\n" 10712 "}", 10713 Tab)); 10714 EXPECT_EQ("{\n" 10715 "\t/*\n" 10716 " asdf\n" 10717 "\t*/\n" 10718 "}", 10719 format("{\n" 10720 "\t/*\n" 10721 " asdf\n" 10722 "\t*/\n" 10723 "}", 10724 Tab)); 10725 10726 Tab.UseTab = FormatStyle::UT_Never; 10727 EXPECT_EQ("/*\n" 10728 " a\t\tcomment\n" 10729 " in multiple lines\n" 10730 " */", 10731 format(" /*\t \t \n" 10732 " \t \t a\t\tcomment\t \t\n" 10733 " \t \t in multiple lines\t\n" 10734 " \t */", 10735 Tab)); 10736 EXPECT_EQ("/* some\n" 10737 " comment */", 10738 format(" \t \t /* some\n" 10739 " \t \t comment */", 10740 Tab)); 10741 EXPECT_EQ("int a; /* some\n" 10742 " comment */", 10743 format(" \t \t int a; /* some\n" 10744 " \t \t comment */", 10745 Tab)); 10746 10747 EXPECT_EQ("int a; /* some\n" 10748 "comment */", 10749 format(" \t \t int\ta; /* some\n" 10750 " \t \t comment */", 10751 Tab)); 10752 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10753 " comment */", 10754 format(" \t \t f(\"\t\t\"); /* some\n" 10755 " \t \t comment */", 10756 Tab)); 10757 EXPECT_EQ("{\n" 10758 " /*\n" 10759 " * Comment\n" 10760 " */\n" 10761 " int i;\n" 10762 "}", 10763 format("{\n" 10764 "\t/*\n" 10765 "\t * Comment\n" 10766 "\t */\n" 10767 "\t int i;\n" 10768 "}", 10769 Tab)); 10770 10771 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10772 Tab.TabWidth = 8; 10773 Tab.IndentWidth = 8; 10774 EXPECT_EQ("if (aaaaaaaa && // q\n" 10775 " bb) // w\n" 10776 "\t;", 10777 format("if (aaaaaaaa &&// q\n" 10778 "bb)// w\n" 10779 ";", 10780 Tab)); 10781 EXPECT_EQ("if (aaa && bbb) // w\n" 10782 "\t;", 10783 format("if(aaa&&bbb)// w\n" 10784 ";", 10785 Tab)); 10786 verifyFormat("class X {\n" 10787 "\tvoid f() {\n" 10788 "\t\tsomeFunction(parameter1,\n" 10789 "\t\t\t parameter2);\n" 10790 "\t}\n" 10791 "};", 10792 Tab); 10793 verifyFormat("#define A \\\n" 10794 "\tvoid f() { \\\n" 10795 "\t\tsomeFunction( \\\n" 10796 "\t\t parameter1, \\\n" 10797 "\t\t parameter2); \\\n" 10798 "\t}", 10799 Tab); 10800 Tab.TabWidth = 4; 10801 Tab.IndentWidth = 8; 10802 verifyFormat("class TabWidth4Indent8 {\n" 10803 "\t\tvoid f() {\n" 10804 "\t\t\t\tsomeFunction(parameter1,\n" 10805 "\t\t\t\t\t\t\t parameter2);\n" 10806 "\t\t}\n" 10807 "};", 10808 Tab); 10809 Tab.TabWidth = 4; 10810 Tab.IndentWidth = 4; 10811 verifyFormat("class TabWidth4Indent4 {\n" 10812 "\tvoid f() {\n" 10813 "\t\tsomeFunction(parameter1,\n" 10814 "\t\t\t\t\t parameter2);\n" 10815 "\t}\n" 10816 "};", 10817 Tab); 10818 Tab.TabWidth = 8; 10819 Tab.IndentWidth = 4; 10820 verifyFormat("class TabWidth8Indent4 {\n" 10821 " void f() {\n" 10822 "\tsomeFunction(parameter1,\n" 10823 "\t\t parameter2);\n" 10824 " }\n" 10825 "};", 10826 Tab); 10827 Tab.TabWidth = 8; 10828 Tab.IndentWidth = 8; 10829 EXPECT_EQ("/*\n" 10830 "\t a\t\tcomment\n" 10831 "\t in multiple lines\n" 10832 " */", 10833 format(" /*\t \t \n" 10834 " \t \t a\t\tcomment\t \t\n" 10835 " \t \t in multiple lines\t\n" 10836 " \t */", 10837 Tab)); 10838 verifyFormat("{\n" 10839 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10840 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10841 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10842 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10843 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10844 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 10845 "};", 10846 Tab); 10847 verifyFormat("enum AA {\n" 10848 "\ta1, // Force multiple lines\n" 10849 "\ta2,\n" 10850 "\ta3\n" 10851 "};", 10852 Tab); 10853 EXPECT_EQ("if (aaaaaaaa && // q\n" 10854 " bb) // w\n" 10855 "\t;", 10856 format("if (aaaaaaaa &&// q\n" 10857 "bb)// w\n" 10858 ";", 10859 Tab)); 10860 verifyFormat("class X {\n" 10861 "\tvoid f() {\n" 10862 "\t\tsomeFunction(parameter1,\n" 10863 "\t\t\t parameter2);\n" 10864 "\t}\n" 10865 "};", 10866 Tab); 10867 verifyFormat("{\n" 10868 "\tQ(\n" 10869 "\t {\n" 10870 "\t\t int a;\n" 10871 "\t\t someFunction(aaaaaaaa,\n" 10872 "\t\t\t\t bbbbbbb);\n" 10873 "\t },\n" 10874 "\t p);\n" 10875 "}", 10876 Tab); 10877 EXPECT_EQ("{\n" 10878 "\t/* aaaa\n" 10879 "\t bbbb */\n" 10880 "}", 10881 format("{\n" 10882 "/* aaaa\n" 10883 " bbbb */\n" 10884 "}", 10885 Tab)); 10886 EXPECT_EQ("{\n" 10887 "\t/*\n" 10888 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10889 "\t bbbbbbbbbbbbb\n" 10890 "\t*/\n" 10891 "}", 10892 format("{\n" 10893 "/*\n" 10894 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10895 "*/\n" 10896 "}", 10897 Tab)); 10898 EXPECT_EQ("{\n" 10899 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10900 "\t// bbbbbbbbbbbbb\n" 10901 "}", 10902 format("{\n" 10903 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10904 "}", 10905 Tab)); 10906 EXPECT_EQ("{\n" 10907 "\t/*\n" 10908 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10909 "\t bbbbbbbbbbbbb\n" 10910 "\t*/\n" 10911 "}", 10912 format("{\n" 10913 "\t/*\n" 10914 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10915 "\t*/\n" 10916 "}", 10917 Tab)); 10918 EXPECT_EQ("{\n" 10919 "\t/*\n" 10920 "\n" 10921 "\t*/\n" 10922 "}", 10923 format("{\n" 10924 "\t/*\n" 10925 "\n" 10926 "\t*/\n" 10927 "}", 10928 Tab)); 10929 EXPECT_EQ("{\n" 10930 "\t/*\n" 10931 " asdf\n" 10932 "\t*/\n" 10933 "}", 10934 format("{\n" 10935 "\t/*\n" 10936 " asdf\n" 10937 "\t*/\n" 10938 "}", 10939 Tab)); 10940 EXPECT_EQ("/* some\n" 10941 " comment */", 10942 format(" \t \t /* some\n" 10943 " \t \t comment */", 10944 Tab)); 10945 EXPECT_EQ("int a; /* some\n" 10946 " comment */", 10947 format(" \t \t int a; /* some\n" 10948 " \t \t comment */", 10949 Tab)); 10950 EXPECT_EQ("int a; /* some\n" 10951 "comment */", 10952 format(" \t \t int\ta; /* some\n" 10953 " \t \t comment */", 10954 Tab)); 10955 EXPECT_EQ("f(\"\t\t\"); /* some\n" 10956 " comment */", 10957 format(" \t \t f(\"\t\t\"); /* some\n" 10958 " \t \t comment */", 10959 Tab)); 10960 EXPECT_EQ("{\n" 10961 "\t/*\n" 10962 "\t * Comment\n" 10963 "\t */\n" 10964 "\tint i;\n" 10965 "}", 10966 format("{\n" 10967 "\t/*\n" 10968 "\t * Comment\n" 10969 "\t */\n" 10970 "\t int i;\n" 10971 "}", 10972 Tab)); 10973 Tab.TabWidth = 2; 10974 Tab.IndentWidth = 2; 10975 EXPECT_EQ("{\n" 10976 "\t/* aaaa\n" 10977 "\t\t bbbb */\n" 10978 "}", 10979 format("{\n" 10980 "/* aaaa\n" 10981 "\t bbbb */\n" 10982 "}", 10983 Tab)); 10984 EXPECT_EQ("{\n" 10985 "\t/*\n" 10986 "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n" 10987 "\t\tbbbbbbbbbbbbb\n" 10988 "\t*/\n" 10989 "}", 10990 format("{\n" 10991 "/*\n" 10992 "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 10993 "*/\n" 10994 "}", 10995 Tab)); 10996 Tab.AlignConsecutiveAssignments = true; 10997 Tab.AlignConsecutiveDeclarations = true; 10998 Tab.TabWidth = 4; 10999 Tab.IndentWidth = 4; 11000 verifyFormat("class Assign {\n" 11001 "\tvoid f() {\n" 11002 "\t\tint x = 123;\n" 11003 "\t\tint random = 4;\n" 11004 "\t\tstd::string alphabet =\n" 11005 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11006 "\t}\n" 11007 "};", 11008 Tab); 11009 11010 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11011 Tab.TabWidth = 8; 11012 Tab.IndentWidth = 8; 11013 EXPECT_EQ("if (aaaaaaaa && // q\n" 11014 " bb) // w\n" 11015 "\t;", 11016 format("if (aaaaaaaa &&// q\n" 11017 "bb)// w\n" 11018 ";", 11019 Tab)); 11020 EXPECT_EQ("if (aaa && bbb) // w\n" 11021 "\t;", 11022 format("if(aaa&&bbb)// w\n" 11023 ";", 11024 Tab)); 11025 verifyFormat("class X {\n" 11026 "\tvoid f() {\n" 11027 "\t\tsomeFunction(parameter1,\n" 11028 "\t\t parameter2);\n" 11029 "\t}\n" 11030 "};", 11031 Tab); 11032 verifyFormat("#define A \\\n" 11033 "\tvoid f() { \\\n" 11034 "\t\tsomeFunction( \\\n" 11035 "\t\t parameter1, \\\n" 11036 "\t\t parameter2); \\\n" 11037 "\t}", 11038 Tab); 11039 Tab.TabWidth = 4; 11040 Tab.IndentWidth = 8; 11041 verifyFormat("class TabWidth4Indent8 {\n" 11042 "\t\tvoid f() {\n" 11043 "\t\t\t\tsomeFunction(parameter1,\n" 11044 "\t\t\t\t parameter2);\n" 11045 "\t\t}\n" 11046 "};", 11047 Tab); 11048 Tab.TabWidth = 4; 11049 Tab.IndentWidth = 4; 11050 verifyFormat("class TabWidth4Indent4 {\n" 11051 "\tvoid f() {\n" 11052 "\t\tsomeFunction(parameter1,\n" 11053 "\t\t parameter2);\n" 11054 "\t}\n" 11055 "};", 11056 Tab); 11057 Tab.TabWidth = 8; 11058 Tab.IndentWidth = 4; 11059 verifyFormat("class TabWidth8Indent4 {\n" 11060 " void f() {\n" 11061 "\tsomeFunction(parameter1,\n" 11062 "\t parameter2);\n" 11063 " }\n" 11064 "};", 11065 Tab); 11066 Tab.TabWidth = 8; 11067 Tab.IndentWidth = 8; 11068 EXPECT_EQ("/*\n" 11069 " a\t\tcomment\n" 11070 " in multiple lines\n" 11071 " */", 11072 format(" /*\t \t \n" 11073 " \t \t a\t\tcomment\t \t\n" 11074 " \t \t in multiple lines\t\n" 11075 " \t */", 11076 Tab)); 11077 verifyFormat("{\n" 11078 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11079 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11080 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11081 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11082 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11083 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 11084 "};", 11085 Tab); 11086 verifyFormat("enum AA {\n" 11087 "\ta1, // Force multiple lines\n" 11088 "\ta2,\n" 11089 "\ta3\n" 11090 "};", 11091 Tab); 11092 EXPECT_EQ("if (aaaaaaaa && // q\n" 11093 " bb) // w\n" 11094 "\t;", 11095 format("if (aaaaaaaa &&// q\n" 11096 "bb)// w\n" 11097 ";", 11098 Tab)); 11099 verifyFormat("class X {\n" 11100 "\tvoid f() {\n" 11101 "\t\tsomeFunction(parameter1,\n" 11102 "\t\t parameter2);\n" 11103 "\t}\n" 11104 "};", 11105 Tab); 11106 verifyFormat("{\n" 11107 "\tQ(\n" 11108 "\t {\n" 11109 "\t\t int a;\n" 11110 "\t\t someFunction(aaaaaaaa,\n" 11111 "\t\t bbbbbbb);\n" 11112 "\t },\n" 11113 "\t p);\n" 11114 "}", 11115 Tab); 11116 EXPECT_EQ("{\n" 11117 "\t/* aaaa\n" 11118 "\t bbbb */\n" 11119 "}", 11120 format("{\n" 11121 "/* aaaa\n" 11122 " bbbb */\n" 11123 "}", 11124 Tab)); 11125 EXPECT_EQ("{\n" 11126 "\t/*\n" 11127 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11128 "\t bbbbbbbbbbbbb\n" 11129 "\t*/\n" 11130 "}", 11131 format("{\n" 11132 "/*\n" 11133 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11134 "*/\n" 11135 "}", 11136 Tab)); 11137 EXPECT_EQ("{\n" 11138 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11139 "\t// bbbbbbbbbbbbb\n" 11140 "}", 11141 format("{\n" 11142 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11143 "}", 11144 Tab)); 11145 EXPECT_EQ("{\n" 11146 "\t/*\n" 11147 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11148 "\t bbbbbbbbbbbbb\n" 11149 "\t*/\n" 11150 "}", 11151 format("{\n" 11152 "\t/*\n" 11153 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11154 "\t*/\n" 11155 "}", 11156 Tab)); 11157 EXPECT_EQ("{\n" 11158 "\t/*\n" 11159 "\n" 11160 "\t*/\n" 11161 "}", 11162 format("{\n" 11163 "\t/*\n" 11164 "\n" 11165 "\t*/\n" 11166 "}", 11167 Tab)); 11168 EXPECT_EQ("{\n" 11169 "\t/*\n" 11170 " asdf\n" 11171 "\t*/\n" 11172 "}", 11173 format("{\n" 11174 "\t/*\n" 11175 " asdf\n" 11176 "\t*/\n" 11177 "}", 11178 Tab)); 11179 EXPECT_EQ("/* some\n" 11180 " comment */", 11181 format(" \t \t /* some\n" 11182 " \t \t comment */", 11183 Tab)); 11184 EXPECT_EQ("int a; /* some\n" 11185 " comment */", 11186 format(" \t \t int a; /* some\n" 11187 " \t \t comment */", 11188 Tab)); 11189 EXPECT_EQ("int a; /* some\n" 11190 "comment */", 11191 format(" \t \t int\ta; /* some\n" 11192 " \t \t comment */", 11193 Tab)); 11194 EXPECT_EQ("f(\"\t\t\"); /* some\n" 11195 " comment */", 11196 format(" \t \t f(\"\t\t\"); /* some\n" 11197 " \t \t comment */", 11198 Tab)); 11199 EXPECT_EQ("{\n" 11200 "\t/*\n" 11201 "\t * Comment\n" 11202 "\t */\n" 11203 "\tint i;\n" 11204 "}", 11205 format("{\n" 11206 "\t/*\n" 11207 "\t * Comment\n" 11208 "\t */\n" 11209 "\t int i;\n" 11210 "}", 11211 Tab)); 11212 Tab.TabWidth = 2; 11213 Tab.IndentWidth = 2; 11214 EXPECT_EQ("{\n" 11215 "\t/* aaaa\n" 11216 "\t bbbb */\n" 11217 "}", 11218 format("{\n" 11219 "/* aaaa\n" 11220 " bbbb */\n" 11221 "}", 11222 Tab)); 11223 EXPECT_EQ("{\n" 11224 "\t/*\n" 11225 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 11226 "\t bbbbbbbbbbbbb\n" 11227 "\t*/\n" 11228 "}", 11229 format("{\n" 11230 "/*\n" 11231 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 11232 "*/\n" 11233 "}", 11234 Tab)); 11235 Tab.AlignConsecutiveAssignments = true; 11236 Tab.AlignConsecutiveDeclarations = true; 11237 Tab.TabWidth = 4; 11238 Tab.IndentWidth = 4; 11239 verifyFormat("class Assign {\n" 11240 "\tvoid f() {\n" 11241 "\t\tint x = 123;\n" 11242 "\t\tint random = 4;\n" 11243 "\t\tstd::string alphabet =\n" 11244 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 11245 "\t}\n" 11246 "};", 11247 Tab); 11248 } 11249 11250 TEST_F(FormatTest, ZeroTabWidth) { 11251 FormatStyle Tab = getLLVMStyleWithColumns(42); 11252 Tab.IndentWidth = 8; 11253 Tab.UseTab = FormatStyle::UT_Never; 11254 Tab.TabWidth = 0; 11255 EXPECT_EQ("void a(){\n" 11256 " // line starts with '\t'\n" 11257 "};", 11258 format("void a(){\n" 11259 "\t// line starts with '\t'\n" 11260 "};", 11261 Tab)); 11262 11263 EXPECT_EQ("void a(){\n" 11264 " // line starts with '\t'\n" 11265 "};", 11266 format("void a(){\n" 11267 "\t\t// line starts with '\t'\n" 11268 "};", 11269 Tab)); 11270 11271 Tab.UseTab = FormatStyle::UT_ForIndentation; 11272 EXPECT_EQ("void a(){\n" 11273 " // line starts with '\t'\n" 11274 "};", 11275 format("void a(){\n" 11276 "\t// line starts with '\t'\n" 11277 "};", 11278 Tab)); 11279 11280 EXPECT_EQ("void a(){\n" 11281 " // line starts with '\t'\n" 11282 "};", 11283 format("void a(){\n" 11284 "\t\t// line starts with '\t'\n" 11285 "};", 11286 Tab)); 11287 11288 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 11289 EXPECT_EQ("void a(){\n" 11290 " // line starts with '\t'\n" 11291 "};", 11292 format("void a(){\n" 11293 "\t// line starts with '\t'\n" 11294 "};", 11295 Tab)); 11296 11297 EXPECT_EQ("void a(){\n" 11298 " // line starts with '\t'\n" 11299 "};", 11300 format("void a(){\n" 11301 "\t\t// line starts with '\t'\n" 11302 "};", 11303 Tab)); 11304 11305 Tab.UseTab = FormatStyle::UT_AlignWithSpaces; 11306 EXPECT_EQ("void a(){\n" 11307 " // line starts with '\t'\n" 11308 "};", 11309 format("void a(){\n" 11310 "\t// line starts with '\t'\n" 11311 "};", 11312 Tab)); 11313 11314 EXPECT_EQ("void a(){\n" 11315 " // line starts with '\t'\n" 11316 "};", 11317 format("void a(){\n" 11318 "\t\t// line starts with '\t'\n" 11319 "};", 11320 Tab)); 11321 11322 Tab.UseTab = FormatStyle::UT_Always; 11323 EXPECT_EQ("void a(){\n" 11324 "// line starts with '\t'\n" 11325 "};", 11326 format("void a(){\n" 11327 "\t// line starts with '\t'\n" 11328 "};", 11329 Tab)); 11330 11331 EXPECT_EQ("void a(){\n" 11332 "// line starts with '\t'\n" 11333 "};", 11334 format("void a(){\n" 11335 "\t\t// line starts with '\t'\n" 11336 "};", 11337 Tab)); 11338 } 11339 11340 TEST_F(FormatTest, CalculatesOriginalColumn) { 11341 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11342 "q\"; /* some\n" 11343 " comment */", 11344 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11345 "q\"; /* some\n" 11346 " comment */", 11347 getLLVMStyle())); 11348 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11349 "/* some\n" 11350 " comment */", 11351 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 11352 " /* some\n" 11353 " comment */", 11354 getLLVMStyle())); 11355 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11356 "qqq\n" 11357 "/* some\n" 11358 " comment */", 11359 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11360 "qqq\n" 11361 " /* some\n" 11362 " comment */", 11363 getLLVMStyle())); 11364 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11365 "wwww; /* some\n" 11366 " comment */", 11367 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 11368 "wwww; /* some\n" 11369 " comment */", 11370 getLLVMStyle())); 11371 } 11372 11373 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 11374 FormatStyle NoSpace = getLLVMStyle(); 11375 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 11376 11377 verifyFormat("while(true)\n" 11378 " continue;", 11379 NoSpace); 11380 verifyFormat("for(;;)\n" 11381 " continue;", 11382 NoSpace); 11383 verifyFormat("if(true)\n" 11384 " f();\n" 11385 "else if(true)\n" 11386 " f();", 11387 NoSpace); 11388 verifyFormat("do {\n" 11389 " do_something();\n" 11390 "} while(something());", 11391 NoSpace); 11392 verifyFormat("switch(x) {\n" 11393 "default:\n" 11394 " break;\n" 11395 "}", 11396 NoSpace); 11397 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 11398 verifyFormat("size_t x = sizeof(x);", NoSpace); 11399 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 11400 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 11401 verifyFormat("alignas(128) char a[128];", NoSpace); 11402 verifyFormat("size_t x = alignof(MyType);", NoSpace); 11403 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 11404 verifyFormat("int f() throw(Deprecated);", NoSpace); 11405 verifyFormat("typedef void (*cb)(int);", NoSpace); 11406 verifyFormat("T A::operator()();", NoSpace); 11407 verifyFormat("X A::operator++(T);", NoSpace); 11408 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 11409 11410 FormatStyle Space = getLLVMStyle(); 11411 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 11412 11413 verifyFormat("int f ();", Space); 11414 verifyFormat("void f (int a, T b) {\n" 11415 " while (true)\n" 11416 " continue;\n" 11417 "}", 11418 Space); 11419 verifyFormat("if (true)\n" 11420 " f ();\n" 11421 "else if (true)\n" 11422 " f ();", 11423 Space); 11424 verifyFormat("do {\n" 11425 " do_something ();\n" 11426 "} while (something ());", 11427 Space); 11428 verifyFormat("switch (x) {\n" 11429 "default:\n" 11430 " break;\n" 11431 "}", 11432 Space); 11433 verifyFormat("A::A () : a (1) {}", Space); 11434 verifyFormat("void f () __attribute__ ((asdf));", Space); 11435 verifyFormat("*(&a + 1);\n" 11436 "&((&a)[1]);\n" 11437 "a[(b + c) * d];\n" 11438 "(((a + 1) * 2) + 3) * 4;", 11439 Space); 11440 verifyFormat("#define A(x) x", Space); 11441 verifyFormat("#define A (x) x", Space); 11442 verifyFormat("#if defined(x)\n" 11443 "#endif", 11444 Space); 11445 verifyFormat("auto i = std::make_unique<int> (5);", Space); 11446 verifyFormat("size_t x = sizeof (x);", Space); 11447 verifyFormat("auto f (int x) -> decltype (x);", Space); 11448 verifyFormat("int f (T x) noexcept (x.create ());", Space); 11449 verifyFormat("alignas (128) char a[128];", Space); 11450 verifyFormat("size_t x = alignof (MyType);", Space); 11451 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 11452 verifyFormat("int f () throw (Deprecated);", Space); 11453 verifyFormat("typedef void (*cb) (int);", Space); 11454 verifyFormat("T A::operator() ();", Space); 11455 verifyFormat("X A::operator++ (T);", Space); 11456 verifyFormat("auto lambda = [] () { return 0; };", Space); 11457 verifyFormat("int x = int (y);", Space); 11458 11459 FormatStyle SomeSpace = getLLVMStyle(); 11460 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 11461 11462 verifyFormat("[]() -> float {}", SomeSpace); 11463 verifyFormat("[] (auto foo) {}", SomeSpace); 11464 verifyFormat("[foo]() -> int {}", SomeSpace); 11465 verifyFormat("int f();", SomeSpace); 11466 verifyFormat("void f (int a, T b) {\n" 11467 " while (true)\n" 11468 " continue;\n" 11469 "}", 11470 SomeSpace); 11471 verifyFormat("if (true)\n" 11472 " f();\n" 11473 "else if (true)\n" 11474 " f();", 11475 SomeSpace); 11476 verifyFormat("do {\n" 11477 " do_something();\n" 11478 "} while (something());", 11479 SomeSpace); 11480 verifyFormat("switch (x) {\n" 11481 "default:\n" 11482 " break;\n" 11483 "}", 11484 SomeSpace); 11485 verifyFormat("A::A() : a (1) {}", SomeSpace); 11486 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 11487 verifyFormat("*(&a + 1);\n" 11488 "&((&a)[1]);\n" 11489 "a[(b + c) * d];\n" 11490 "(((a + 1) * 2) + 3) * 4;", 11491 SomeSpace); 11492 verifyFormat("#define A(x) x", SomeSpace); 11493 verifyFormat("#define A (x) x", SomeSpace); 11494 verifyFormat("#if defined(x)\n" 11495 "#endif", 11496 SomeSpace); 11497 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 11498 verifyFormat("size_t x = sizeof (x);", SomeSpace); 11499 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 11500 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 11501 verifyFormat("alignas (128) char a[128];", SomeSpace); 11502 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 11503 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 11504 SomeSpace); 11505 verifyFormat("int f() throw (Deprecated);", SomeSpace); 11506 verifyFormat("typedef void (*cb) (int);", SomeSpace); 11507 verifyFormat("T A::operator()();", SomeSpace); 11508 verifyFormat("X A::operator++ (T);", SomeSpace); 11509 verifyFormat("int x = int (y);", SomeSpace); 11510 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 11511 } 11512 11513 TEST_F(FormatTest, SpaceAfterLogicalNot) { 11514 FormatStyle Spaces = getLLVMStyle(); 11515 Spaces.SpaceAfterLogicalNot = true; 11516 11517 verifyFormat("bool x = ! y", Spaces); 11518 verifyFormat("if (! isFailure())", Spaces); 11519 verifyFormat("if (! (a && b))", Spaces); 11520 verifyFormat("\"Error!\"", Spaces); 11521 verifyFormat("! ! x", Spaces); 11522 } 11523 11524 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 11525 FormatStyle Spaces = getLLVMStyle(); 11526 11527 Spaces.SpacesInParentheses = true; 11528 verifyFormat("do_something( ::globalVar );", Spaces); 11529 verifyFormat("call( x, y, z );", Spaces); 11530 verifyFormat("call();", Spaces); 11531 verifyFormat("std::function<void( int, int )> callback;", Spaces); 11532 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 11533 Spaces); 11534 verifyFormat("while ( (bool)1 )\n" 11535 " continue;", 11536 Spaces); 11537 verifyFormat("for ( ;; )\n" 11538 " continue;", 11539 Spaces); 11540 verifyFormat("if ( true )\n" 11541 " f();\n" 11542 "else if ( true )\n" 11543 " f();", 11544 Spaces); 11545 verifyFormat("do {\n" 11546 " do_something( (int)i );\n" 11547 "} while ( something() );", 11548 Spaces); 11549 verifyFormat("switch ( x ) {\n" 11550 "default:\n" 11551 " break;\n" 11552 "}", 11553 Spaces); 11554 11555 Spaces.SpacesInParentheses = false; 11556 Spaces.SpacesInCStyleCastParentheses = true; 11557 verifyFormat("Type *A = ( Type * )P;", Spaces); 11558 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 11559 verifyFormat("x = ( int32 )y;", Spaces); 11560 verifyFormat("int a = ( int )(2.0f);", Spaces); 11561 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 11562 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 11563 verifyFormat("#define x (( int )-1)", Spaces); 11564 11565 // Run the first set of tests again with: 11566 Spaces.SpacesInParentheses = false; 11567 Spaces.SpaceInEmptyParentheses = true; 11568 Spaces.SpacesInCStyleCastParentheses = true; 11569 verifyFormat("call(x, y, z);", Spaces); 11570 verifyFormat("call( );", Spaces); 11571 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11572 verifyFormat("while (( bool )1)\n" 11573 " continue;", 11574 Spaces); 11575 verifyFormat("for (;;)\n" 11576 " continue;", 11577 Spaces); 11578 verifyFormat("if (true)\n" 11579 " f( );\n" 11580 "else if (true)\n" 11581 " f( );", 11582 Spaces); 11583 verifyFormat("do {\n" 11584 " do_something(( int )i);\n" 11585 "} while (something( ));", 11586 Spaces); 11587 verifyFormat("switch (x) {\n" 11588 "default:\n" 11589 " break;\n" 11590 "}", 11591 Spaces); 11592 11593 // Run the first set of tests again with: 11594 Spaces.SpaceAfterCStyleCast = true; 11595 verifyFormat("call(x, y, z);", Spaces); 11596 verifyFormat("call( );", Spaces); 11597 verifyFormat("std::function<void(int, int)> callback;", Spaces); 11598 verifyFormat("while (( bool ) 1)\n" 11599 " continue;", 11600 Spaces); 11601 verifyFormat("for (;;)\n" 11602 " continue;", 11603 Spaces); 11604 verifyFormat("if (true)\n" 11605 " f( );\n" 11606 "else if (true)\n" 11607 " f( );", 11608 Spaces); 11609 verifyFormat("do {\n" 11610 " do_something(( int ) i);\n" 11611 "} while (something( ));", 11612 Spaces); 11613 verifyFormat("switch (x) {\n" 11614 "default:\n" 11615 " break;\n" 11616 "}", 11617 Spaces); 11618 11619 // Run subset of tests again with: 11620 Spaces.SpacesInCStyleCastParentheses = false; 11621 Spaces.SpaceAfterCStyleCast = true; 11622 verifyFormat("while ((bool) 1)\n" 11623 " continue;", 11624 Spaces); 11625 verifyFormat("do {\n" 11626 " do_something((int) i);\n" 11627 "} while (something( ));", 11628 Spaces); 11629 } 11630 11631 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 11632 verifyFormat("int a[5];"); 11633 verifyFormat("a[3] += 42;"); 11634 11635 FormatStyle Spaces = getLLVMStyle(); 11636 Spaces.SpacesInSquareBrackets = true; 11637 // Not lambdas. 11638 verifyFormat("int a[ 5 ];", Spaces); 11639 verifyFormat("a[ 3 ] += 42;", Spaces); 11640 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 11641 verifyFormat("double &operator[](int i) { return 0; }\n" 11642 "int i;", 11643 Spaces); 11644 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 11645 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 11646 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 11647 // Lambdas. 11648 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 11649 verifyFormat("return [ i, args... ] {};", Spaces); 11650 verifyFormat("int foo = [ &bar ]() {};", Spaces); 11651 verifyFormat("int foo = [ = ]() {};", Spaces); 11652 verifyFormat("int foo = [ & ]() {};", Spaces); 11653 verifyFormat("int foo = [ =, &bar ]() {};", Spaces); 11654 verifyFormat("int foo = [ &bar, = ]() {};", Spaces); 11655 } 11656 11657 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) { 11658 FormatStyle NoSpaceStyle = getLLVMStyle(); 11659 verifyFormat("int a[5];", NoSpaceStyle); 11660 verifyFormat("a[3] += 42;", NoSpaceStyle); 11661 11662 verifyFormat("int a[1];", NoSpaceStyle); 11663 verifyFormat("int 1 [a];", NoSpaceStyle); 11664 verifyFormat("int a[1][2];", NoSpaceStyle); 11665 verifyFormat("a[7] = 5;", NoSpaceStyle); 11666 verifyFormat("int a = (f())[23];", NoSpaceStyle); 11667 verifyFormat("f([] {})", NoSpaceStyle); 11668 11669 FormatStyle Space = getLLVMStyle(); 11670 Space.SpaceBeforeSquareBrackets = true; 11671 verifyFormat("int c = []() -> int { return 2; }();\n", Space); 11672 verifyFormat("return [i, args...] {};", Space); 11673 11674 verifyFormat("int a [5];", Space); 11675 verifyFormat("a [3] += 42;", Space); 11676 verifyFormat("constexpr char hello []{\"hello\"};", Space); 11677 verifyFormat("double &operator[](int i) { return 0; }\n" 11678 "int i;", 11679 Space); 11680 verifyFormat("std::unique_ptr<int []> foo() {}", Space); 11681 verifyFormat("int i = a [a][a]->f();", Space); 11682 verifyFormat("int i = (*b) [a]->f();", Space); 11683 11684 verifyFormat("int a [1];", Space); 11685 verifyFormat("int 1 [a];", Space); 11686 verifyFormat("int a [1][2];", Space); 11687 verifyFormat("a [7] = 5;", Space); 11688 verifyFormat("int a = (f()) [23];", Space); 11689 verifyFormat("f([] {})", Space); 11690 } 11691 11692 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 11693 verifyFormat("int a = 5;"); 11694 verifyFormat("a += 42;"); 11695 verifyFormat("a or_eq 8;"); 11696 11697 FormatStyle Spaces = getLLVMStyle(); 11698 Spaces.SpaceBeforeAssignmentOperators = false; 11699 verifyFormat("int a= 5;", Spaces); 11700 verifyFormat("a+= 42;", Spaces); 11701 verifyFormat("a or_eq 8;", Spaces); 11702 } 11703 11704 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 11705 verifyFormat("class Foo : public Bar {};"); 11706 verifyFormat("Foo::Foo() : foo(1) {}"); 11707 verifyFormat("for (auto a : b) {\n}"); 11708 verifyFormat("int x = a ? b : c;"); 11709 verifyFormat("{\n" 11710 "label0:\n" 11711 " int x = 0;\n" 11712 "}"); 11713 verifyFormat("switch (x) {\n" 11714 "case 1:\n" 11715 "default:\n" 11716 "}"); 11717 11718 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 11719 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 11720 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 11721 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 11722 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 11723 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 11724 verifyFormat("{\n" 11725 "label1:\n" 11726 " int x = 0;\n" 11727 "}", 11728 CtorInitializerStyle); 11729 verifyFormat("switch (x) {\n" 11730 "case 1:\n" 11731 "default:\n" 11732 "}", 11733 CtorInitializerStyle); 11734 CtorInitializerStyle.BreakConstructorInitializers = 11735 FormatStyle::BCIS_AfterColon; 11736 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 11737 " aaaaaaaaaaaaaaaa(1),\n" 11738 " bbbbbbbbbbbbbbbb(2) {}", 11739 CtorInitializerStyle); 11740 CtorInitializerStyle.BreakConstructorInitializers = 11741 FormatStyle::BCIS_BeforeComma; 11742 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11743 " : aaaaaaaaaaaaaaaa(1)\n" 11744 " , bbbbbbbbbbbbbbbb(2) {}", 11745 CtorInitializerStyle); 11746 CtorInitializerStyle.BreakConstructorInitializers = 11747 FormatStyle::BCIS_BeforeColon; 11748 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11749 " : aaaaaaaaaaaaaaaa(1),\n" 11750 " bbbbbbbbbbbbbbbb(2) {}", 11751 CtorInitializerStyle); 11752 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 11753 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 11754 ": aaaaaaaaaaaaaaaa(1),\n" 11755 " bbbbbbbbbbbbbbbb(2) {}", 11756 CtorInitializerStyle); 11757 11758 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 11759 InheritanceStyle.SpaceBeforeInheritanceColon = false; 11760 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 11761 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 11762 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 11763 verifyFormat("int x = a ? b : c;", InheritanceStyle); 11764 verifyFormat("{\n" 11765 "label2:\n" 11766 " int x = 0;\n" 11767 "}", 11768 InheritanceStyle); 11769 verifyFormat("switch (x) {\n" 11770 "case 1:\n" 11771 "default:\n" 11772 "}", 11773 InheritanceStyle); 11774 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 11775 verifyFormat("class Foooooooooooooooooooooo:\n" 11776 " public aaaaaaaaaaaaaaaaaa,\n" 11777 " public bbbbbbbbbbbbbbbbbb {\n" 11778 "}", 11779 InheritanceStyle); 11780 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 11781 verifyFormat("class Foooooooooooooooooooooo\n" 11782 " : public aaaaaaaaaaaaaaaaaa\n" 11783 " , public bbbbbbbbbbbbbbbbbb {\n" 11784 "}", 11785 InheritanceStyle); 11786 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 11787 verifyFormat("class Foooooooooooooooooooooo\n" 11788 " : public aaaaaaaaaaaaaaaaaa,\n" 11789 " public bbbbbbbbbbbbbbbbbb {\n" 11790 "}", 11791 InheritanceStyle); 11792 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 11793 verifyFormat("class Foooooooooooooooooooooo\n" 11794 ": public aaaaaaaaaaaaaaaaaa,\n" 11795 " public bbbbbbbbbbbbbbbbbb {}", 11796 InheritanceStyle); 11797 11798 FormatStyle ForLoopStyle = getLLVMStyle(); 11799 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 11800 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 11801 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 11802 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 11803 verifyFormat("int x = a ? b : c;", ForLoopStyle); 11804 verifyFormat("{\n" 11805 "label2:\n" 11806 " int x = 0;\n" 11807 "}", 11808 ForLoopStyle); 11809 verifyFormat("switch (x) {\n" 11810 "case 1:\n" 11811 "default:\n" 11812 "}", 11813 ForLoopStyle); 11814 11815 FormatStyle NoSpaceStyle = getLLVMStyle(); 11816 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 11817 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 11818 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 11819 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 11820 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 11821 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 11822 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 11823 verifyFormat("{\n" 11824 "label3:\n" 11825 " int x = 0;\n" 11826 "}", 11827 NoSpaceStyle); 11828 verifyFormat("switch (x) {\n" 11829 "case 1:\n" 11830 "default:\n" 11831 "}", 11832 NoSpaceStyle); 11833 } 11834 11835 TEST_F(FormatTest, AlignConsecutiveMacros) { 11836 FormatStyle Style = getLLVMStyle(); 11837 Style.AlignConsecutiveAssignments = true; 11838 Style.AlignConsecutiveDeclarations = true; 11839 Style.AlignConsecutiveMacros = false; 11840 11841 verifyFormat("#define a 3\n" 11842 "#define bbbb 4\n" 11843 "#define ccc (5)", 11844 Style); 11845 11846 verifyFormat("#define f(x) (x * x)\n" 11847 "#define fff(x, y, z) (x * y + z)\n" 11848 "#define ffff(x, y) (x - y)", 11849 Style); 11850 11851 verifyFormat("#define foo(x, y) (x + y)\n" 11852 "#define bar (5, 6)(2 + 2)", 11853 Style); 11854 11855 verifyFormat("#define a 3\n" 11856 "#define bbbb 4\n" 11857 "#define ccc (5)\n" 11858 "#define f(x) (x * x)\n" 11859 "#define fff(x, y, z) (x * y + z)\n" 11860 "#define ffff(x, y) (x - y)", 11861 Style); 11862 11863 Style.AlignConsecutiveMacros = true; 11864 verifyFormat("#define a 3\n" 11865 "#define bbbb 4\n" 11866 "#define ccc (5)", 11867 Style); 11868 11869 verifyFormat("#define f(x) (x * x)\n" 11870 "#define fff(x, y, z) (x * y + z)\n" 11871 "#define ffff(x, y) (x - y)", 11872 Style); 11873 11874 verifyFormat("#define foo(x, y) (x + y)\n" 11875 "#define bar (5, 6)(2 + 2)", 11876 Style); 11877 11878 verifyFormat("#define a 3\n" 11879 "#define bbbb 4\n" 11880 "#define ccc (5)\n" 11881 "#define f(x) (x * x)\n" 11882 "#define fff(x, y, z) (x * y + z)\n" 11883 "#define ffff(x, y) (x - y)", 11884 Style); 11885 11886 verifyFormat("#define a 5\n" 11887 "#define foo(x, y) (x + y)\n" 11888 "#define CCC (6)\n" 11889 "auto lambda = []() {\n" 11890 " auto ii = 0;\n" 11891 " float j = 0;\n" 11892 " return 0;\n" 11893 "};\n" 11894 "int i = 0;\n" 11895 "float i2 = 0;\n" 11896 "auto v = type{\n" 11897 " i = 1, //\n" 11898 " (i = 2), //\n" 11899 " i = 3 //\n" 11900 "};", 11901 Style); 11902 11903 Style.AlignConsecutiveMacros = false; 11904 Style.ColumnLimit = 20; 11905 11906 verifyFormat("#define a \\\n" 11907 " \"aabbbbbbbbbbbb\"\n" 11908 "#define D \\\n" 11909 " \"aabbbbbbbbbbbb\" \\\n" 11910 " \"ccddeeeeeeeee\"\n" 11911 "#define B \\\n" 11912 " \"QQQQQQQQQQQQQ\" \\\n" 11913 " \"FFFFFFFFFFFFF\" \\\n" 11914 " \"LLLLLLLL\"\n", 11915 Style); 11916 11917 Style.AlignConsecutiveMacros = true; 11918 verifyFormat("#define a \\\n" 11919 " \"aabbbbbbbbbbbb\"\n" 11920 "#define D \\\n" 11921 " \"aabbbbbbbbbbbb\" \\\n" 11922 " \"ccddeeeeeeeee\"\n" 11923 "#define B \\\n" 11924 " \"QQQQQQQQQQQQQ\" \\\n" 11925 " \"FFFFFFFFFFFFF\" \\\n" 11926 " \"LLLLLLLL\"\n", 11927 Style); 11928 } 11929 11930 TEST_F(FormatTest, AlignConsecutiveAssignments) { 11931 FormatStyle Alignment = getLLVMStyle(); 11932 Alignment.AlignConsecutiveMacros = true; 11933 Alignment.AlignConsecutiveAssignments = false; 11934 verifyFormat("int a = 5;\n" 11935 "int oneTwoThree = 123;", 11936 Alignment); 11937 verifyFormat("int a = 5;\n" 11938 "int oneTwoThree = 123;", 11939 Alignment); 11940 11941 Alignment.AlignConsecutiveAssignments = true; 11942 verifyFormat("int a = 5;\n" 11943 "int oneTwoThree = 123;", 11944 Alignment); 11945 verifyFormat("int a = method();\n" 11946 "int oneTwoThree = 133;", 11947 Alignment); 11948 verifyFormat("a &= 5;\n" 11949 "bcd *= 5;\n" 11950 "ghtyf += 5;\n" 11951 "dvfvdb -= 5;\n" 11952 "a /= 5;\n" 11953 "vdsvsv %= 5;\n" 11954 "sfdbddfbdfbb ^= 5;\n" 11955 "dvsdsv |= 5;\n" 11956 "int dsvvdvsdvvv = 123;", 11957 Alignment); 11958 verifyFormat("int i = 1, j = 10;\n" 11959 "something = 2000;", 11960 Alignment); 11961 verifyFormat("something = 2000;\n" 11962 "int i = 1, j = 10;\n", 11963 Alignment); 11964 verifyFormat("something = 2000;\n" 11965 "another = 911;\n" 11966 "int i = 1, j = 10;\n" 11967 "oneMore = 1;\n" 11968 "i = 2;", 11969 Alignment); 11970 verifyFormat("int a = 5;\n" 11971 "int one = 1;\n" 11972 "method();\n" 11973 "int oneTwoThree = 123;\n" 11974 "int oneTwo = 12;", 11975 Alignment); 11976 verifyFormat("int oneTwoThree = 123;\n" 11977 "int oneTwo = 12;\n" 11978 "method();\n", 11979 Alignment); 11980 verifyFormat("int oneTwoThree = 123; // comment\n" 11981 "int oneTwo = 12; // comment", 11982 Alignment); 11983 11984 // Bug 25167 11985 verifyFormat("#if A\n" 11986 "#else\n" 11987 "int aaaaaaaa = 12;\n" 11988 "#endif\n" 11989 "#if B\n" 11990 "#else\n" 11991 "int a = 12;\n" 11992 "#endif\n", 11993 Alignment); 11994 verifyFormat("enum foo {\n" 11995 "#if A\n" 11996 "#else\n" 11997 " aaaaaaaa = 12;\n" 11998 "#endif\n" 11999 "#if B\n" 12000 "#else\n" 12001 " a = 12;\n" 12002 "#endif\n" 12003 "};\n", 12004 Alignment); 12005 12006 EXPECT_EQ("int a = 5;\n" 12007 "\n" 12008 "int oneTwoThree = 123;", 12009 format("int a = 5;\n" 12010 "\n" 12011 "int oneTwoThree= 123;", 12012 Alignment)); 12013 EXPECT_EQ("int a = 5;\n" 12014 "int one = 1;\n" 12015 "\n" 12016 "int oneTwoThree = 123;", 12017 format("int a = 5;\n" 12018 "int one = 1;\n" 12019 "\n" 12020 "int oneTwoThree = 123;", 12021 Alignment)); 12022 EXPECT_EQ("int a = 5;\n" 12023 "int one = 1;\n" 12024 "\n" 12025 "int oneTwoThree = 123;\n" 12026 "int oneTwo = 12;", 12027 format("int a = 5;\n" 12028 "int one = 1;\n" 12029 "\n" 12030 "int oneTwoThree = 123;\n" 12031 "int oneTwo = 12;", 12032 Alignment)); 12033 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12034 verifyFormat("#define A \\\n" 12035 " int aaaa = 12; \\\n" 12036 " int b = 23; \\\n" 12037 " int ccc = 234; \\\n" 12038 " int dddddddddd = 2345;", 12039 Alignment); 12040 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12041 verifyFormat("#define A \\\n" 12042 " int aaaa = 12; \\\n" 12043 " int b = 23; \\\n" 12044 " int ccc = 234; \\\n" 12045 " int dddddddddd = 2345;", 12046 Alignment); 12047 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12048 verifyFormat("#define A " 12049 " \\\n" 12050 " int aaaa = 12; " 12051 " \\\n" 12052 " int b = 23; " 12053 " \\\n" 12054 " int ccc = 234; " 12055 " \\\n" 12056 " int dddddddddd = 2345;", 12057 Alignment); 12058 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12059 "k = 4, int l = 5,\n" 12060 " int m = 6) {\n" 12061 " int j = 10;\n" 12062 " otherThing = 1;\n" 12063 "}", 12064 Alignment); 12065 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12066 " int i = 1;\n" 12067 " int j = 2;\n" 12068 " int big = 10000;\n" 12069 "}", 12070 Alignment); 12071 verifyFormat("class C {\n" 12072 "public:\n" 12073 " int i = 1;\n" 12074 " virtual void f() = 0;\n" 12075 "};", 12076 Alignment); 12077 verifyFormat("int i = 1;\n" 12078 "if (SomeType t = getSomething()) {\n" 12079 "}\n" 12080 "int j = 2;\n" 12081 "int big = 10000;", 12082 Alignment); 12083 verifyFormat("int j = 7;\n" 12084 "for (int k = 0; k < N; ++k) {\n" 12085 "}\n" 12086 "int j = 2;\n" 12087 "int big = 10000;\n" 12088 "}", 12089 Alignment); 12090 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12091 verifyFormat("int i = 1;\n" 12092 "LooooooooooongType loooooooooooooooooooooongVariable\n" 12093 " = someLooooooooooooooooongFunction();\n" 12094 "int j = 2;", 12095 Alignment); 12096 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 12097 verifyFormat("int i = 1;\n" 12098 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 12099 " someLooooooooooooooooongFunction();\n" 12100 "int j = 2;", 12101 Alignment); 12102 12103 verifyFormat("auto lambda = []() {\n" 12104 " auto i = 0;\n" 12105 " return 0;\n" 12106 "};\n" 12107 "int i = 0;\n" 12108 "auto v = type{\n" 12109 " i = 1, //\n" 12110 " (i = 2), //\n" 12111 " i = 3 //\n" 12112 "};", 12113 Alignment); 12114 12115 verifyFormat( 12116 "int i = 1;\n" 12117 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12118 " loooooooooooooooooooooongParameterB);\n" 12119 "int j = 2;", 12120 Alignment); 12121 12122 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 12123 " typename B = very_long_type_name_1,\n" 12124 " typename T_2 = very_long_type_name_2>\n" 12125 "auto foo() {}\n", 12126 Alignment); 12127 verifyFormat("int a, b = 1;\n" 12128 "int c = 2;\n" 12129 "int dd = 3;\n", 12130 Alignment); 12131 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12132 "float b[1][] = {{3.f}};\n", 12133 Alignment); 12134 verifyFormat("for (int i = 0; i < 1; i++)\n" 12135 " int x = 1;\n", 12136 Alignment); 12137 verifyFormat("for (i = 0; i < 1; i++)\n" 12138 " x = 1;\n" 12139 "y = 1;\n", 12140 Alignment); 12141 12142 Alignment.ReflowComments = true; 12143 Alignment.ColumnLimit = 50; 12144 EXPECT_EQ("int x = 0;\n" 12145 "int yy = 1; /// specificlennospace\n" 12146 "int zzz = 2;\n", 12147 format("int x = 0;\n" 12148 "int yy = 1; ///specificlennospace\n" 12149 "int zzz = 2;\n", 12150 Alignment)); 12151 } 12152 12153 TEST_F(FormatTest, AlignConsecutiveBitFields) { 12154 FormatStyle Alignment = getLLVMStyle(); 12155 Alignment.AlignConsecutiveBitFields = true; 12156 verifyFormat("int const a : 5;\n" 12157 "int oneTwoThree : 23;", 12158 Alignment); 12159 12160 // Initializers are allowed starting with c++2a 12161 verifyFormat("int const a : 5 = 1;\n" 12162 "int oneTwoThree : 23 = 0;", 12163 Alignment); 12164 12165 Alignment.AlignConsecutiveDeclarations = true; 12166 verifyFormat("int const a : 5;\n" 12167 "int oneTwoThree : 23;", 12168 Alignment); 12169 12170 verifyFormat("int const a : 5; // comment\n" 12171 "int oneTwoThree : 23; // comment", 12172 Alignment); 12173 12174 verifyFormat("int const a : 5 = 1;\n" 12175 "int oneTwoThree : 23 = 0;", 12176 Alignment); 12177 12178 Alignment.AlignConsecutiveAssignments = true; 12179 verifyFormat("int const a : 5 = 1;\n" 12180 "int oneTwoThree : 23 = 0;", 12181 Alignment); 12182 verifyFormat("int const a : 5 = {1};\n" 12183 "int oneTwoThree : 23 = 0;", 12184 Alignment); 12185 12186 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_None; 12187 verifyFormat("int const a :5;\n" 12188 "int oneTwoThree:23;", 12189 Alignment); 12190 12191 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_Before; 12192 verifyFormat("int const a :5;\n" 12193 "int oneTwoThree :23;", 12194 Alignment); 12195 12196 Alignment.BitFieldColonSpacing = FormatStyle::BFCS_After; 12197 verifyFormat("int const a : 5;\n" 12198 "int oneTwoThree: 23;", 12199 Alignment); 12200 12201 // Known limitations: ':' is only recognized as a bitfield colon when 12202 // followed by a number. 12203 /* 12204 verifyFormat("int oneTwoThree : SOME_CONSTANT;\n" 12205 "int a : 5;", 12206 Alignment); 12207 */ 12208 } 12209 12210 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 12211 FormatStyle Alignment = getLLVMStyle(); 12212 Alignment.AlignConsecutiveMacros = true; 12213 Alignment.AlignConsecutiveDeclarations = false; 12214 verifyFormat("float const a = 5;\n" 12215 "int oneTwoThree = 123;", 12216 Alignment); 12217 verifyFormat("int a = 5;\n" 12218 "float const oneTwoThree = 123;", 12219 Alignment); 12220 12221 Alignment.AlignConsecutiveDeclarations = true; 12222 verifyFormat("float const a = 5;\n" 12223 "int oneTwoThree = 123;", 12224 Alignment); 12225 verifyFormat("int a = method();\n" 12226 "float const oneTwoThree = 133;", 12227 Alignment); 12228 verifyFormat("int i = 1, j = 10;\n" 12229 "something = 2000;", 12230 Alignment); 12231 verifyFormat("something = 2000;\n" 12232 "int i = 1, j = 10;\n", 12233 Alignment); 12234 verifyFormat("float something = 2000;\n" 12235 "double another = 911;\n" 12236 "int i = 1, j = 10;\n" 12237 "const int *oneMore = 1;\n" 12238 "unsigned i = 2;", 12239 Alignment); 12240 verifyFormat("float a = 5;\n" 12241 "int one = 1;\n" 12242 "method();\n" 12243 "const double oneTwoThree = 123;\n" 12244 "const unsigned int oneTwo = 12;", 12245 Alignment); 12246 verifyFormat("int oneTwoThree{0}; // comment\n" 12247 "unsigned oneTwo; // comment", 12248 Alignment); 12249 EXPECT_EQ("float const a = 5;\n" 12250 "\n" 12251 "int oneTwoThree = 123;", 12252 format("float const a = 5;\n" 12253 "\n" 12254 "int oneTwoThree= 123;", 12255 Alignment)); 12256 EXPECT_EQ("float a = 5;\n" 12257 "int one = 1;\n" 12258 "\n" 12259 "unsigned oneTwoThree = 123;", 12260 format("float a = 5;\n" 12261 "int one = 1;\n" 12262 "\n" 12263 "unsigned oneTwoThree = 123;", 12264 Alignment)); 12265 EXPECT_EQ("float a = 5;\n" 12266 "int one = 1;\n" 12267 "\n" 12268 "unsigned oneTwoThree = 123;\n" 12269 "int oneTwo = 12;", 12270 format("float a = 5;\n" 12271 "int one = 1;\n" 12272 "\n" 12273 "unsigned oneTwoThree = 123;\n" 12274 "int oneTwo = 12;", 12275 Alignment)); 12276 // Function prototype alignment 12277 verifyFormat("int a();\n" 12278 "double b();", 12279 Alignment); 12280 verifyFormat("int a(int x);\n" 12281 "double b();", 12282 Alignment); 12283 unsigned OldColumnLimit = Alignment.ColumnLimit; 12284 // We need to set ColumnLimit to zero, in order to stress nested alignments, 12285 // otherwise the function parameters will be re-flowed onto a single line. 12286 Alignment.ColumnLimit = 0; 12287 EXPECT_EQ("int a(int x,\n" 12288 " float y);\n" 12289 "double b(int x,\n" 12290 " double y);", 12291 format("int a(int x,\n" 12292 " float y);\n" 12293 "double b(int x,\n" 12294 " double y);", 12295 Alignment)); 12296 // This ensures that function parameters of function declarations are 12297 // correctly indented when their owning functions are indented. 12298 // The failure case here is for 'double y' to not be indented enough. 12299 EXPECT_EQ("double a(int x);\n" 12300 "int b(int y,\n" 12301 " double z);", 12302 format("double a(int x);\n" 12303 "int b(int y,\n" 12304 " double z);", 12305 Alignment)); 12306 // Set ColumnLimit low so that we induce wrapping immediately after 12307 // the function name and opening paren. 12308 Alignment.ColumnLimit = 13; 12309 verifyFormat("int function(\n" 12310 " int x,\n" 12311 " bool y);", 12312 Alignment); 12313 Alignment.ColumnLimit = OldColumnLimit; 12314 // Ensure function pointers don't screw up recursive alignment 12315 verifyFormat("int a(int x, void (*fp)(int y));\n" 12316 "double b();", 12317 Alignment); 12318 Alignment.AlignConsecutiveAssignments = true; 12319 // Ensure recursive alignment is broken by function braces, so that the 12320 // "a = 1" does not align with subsequent assignments inside the function 12321 // body. 12322 verifyFormat("int func(int a = 1) {\n" 12323 " int b = 2;\n" 12324 " int cc = 3;\n" 12325 "}", 12326 Alignment); 12327 verifyFormat("float something = 2000;\n" 12328 "double another = 911;\n" 12329 "int i = 1, j = 10;\n" 12330 "const int *oneMore = 1;\n" 12331 "unsigned i = 2;", 12332 Alignment); 12333 verifyFormat("int oneTwoThree = {0}; // comment\n" 12334 "unsigned oneTwo = 0; // comment", 12335 Alignment); 12336 // Make sure that scope is correctly tracked, in the absence of braces 12337 verifyFormat("for (int i = 0; i < n; i++)\n" 12338 " j = i;\n" 12339 "double x = 1;\n", 12340 Alignment); 12341 verifyFormat("if (int i = 0)\n" 12342 " j = i;\n" 12343 "double x = 1;\n", 12344 Alignment); 12345 // Ensure operator[] and operator() are comprehended 12346 verifyFormat("struct test {\n" 12347 " long long int foo();\n" 12348 " int operator[](int a);\n" 12349 " double bar();\n" 12350 "};\n", 12351 Alignment); 12352 verifyFormat("struct test {\n" 12353 " long long int foo();\n" 12354 " int operator()(int a);\n" 12355 " double bar();\n" 12356 "};\n", 12357 Alignment); 12358 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 12359 " int const i = 1;\n" 12360 " int * j = 2;\n" 12361 " int big = 10000;\n" 12362 "\n" 12363 " unsigned oneTwoThree = 123;\n" 12364 " int oneTwo = 12;\n" 12365 " method();\n" 12366 " float k = 2;\n" 12367 " int ll = 10000;\n" 12368 "}", 12369 format("void SomeFunction(int parameter= 0) {\n" 12370 " int const i= 1;\n" 12371 " int *j=2;\n" 12372 " int big = 10000;\n" 12373 "\n" 12374 "unsigned oneTwoThree =123;\n" 12375 "int oneTwo = 12;\n" 12376 " method();\n" 12377 "float k= 2;\n" 12378 "int ll=10000;\n" 12379 "}", 12380 Alignment)); 12381 Alignment.AlignConsecutiveAssignments = false; 12382 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 12383 verifyFormat("#define A \\\n" 12384 " int aaaa = 12; \\\n" 12385 " float b = 23; \\\n" 12386 " const int ccc = 234; \\\n" 12387 " unsigned dddddddddd = 2345;", 12388 Alignment); 12389 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12390 verifyFormat("#define A \\\n" 12391 " int aaaa = 12; \\\n" 12392 " float b = 23; \\\n" 12393 " const int ccc = 234; \\\n" 12394 " unsigned dddddddddd = 2345;", 12395 Alignment); 12396 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 12397 Alignment.ColumnLimit = 30; 12398 verifyFormat("#define A \\\n" 12399 " int aaaa = 12; \\\n" 12400 " float b = 23; \\\n" 12401 " const int ccc = 234; \\\n" 12402 " int dddddddddd = 2345;", 12403 Alignment); 12404 Alignment.ColumnLimit = 80; 12405 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 12406 "k = 4, int l = 5,\n" 12407 " int m = 6) {\n" 12408 " const int j = 10;\n" 12409 " otherThing = 1;\n" 12410 "}", 12411 Alignment); 12412 verifyFormat("void SomeFunction(int parameter = 0) {\n" 12413 " int const i = 1;\n" 12414 " int * j = 2;\n" 12415 " int big = 10000;\n" 12416 "}", 12417 Alignment); 12418 verifyFormat("class C {\n" 12419 "public:\n" 12420 " int i = 1;\n" 12421 " virtual void f() = 0;\n" 12422 "};", 12423 Alignment); 12424 verifyFormat("float i = 1;\n" 12425 "if (SomeType t = getSomething()) {\n" 12426 "}\n" 12427 "const unsigned j = 2;\n" 12428 "int big = 10000;", 12429 Alignment); 12430 verifyFormat("float j = 7;\n" 12431 "for (int k = 0; k < N; ++k) {\n" 12432 "}\n" 12433 "unsigned j = 2;\n" 12434 "int big = 10000;\n" 12435 "}", 12436 Alignment); 12437 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12438 verifyFormat("float i = 1;\n" 12439 "LooooooooooongType loooooooooooooooooooooongVariable\n" 12440 " = someLooooooooooooooooongFunction();\n" 12441 "int j = 2;", 12442 Alignment); 12443 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 12444 verifyFormat("int i = 1;\n" 12445 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 12446 " someLooooooooooooooooongFunction();\n" 12447 "int j = 2;", 12448 Alignment); 12449 12450 Alignment.AlignConsecutiveAssignments = true; 12451 verifyFormat("auto lambda = []() {\n" 12452 " auto ii = 0;\n" 12453 " float j = 0;\n" 12454 " return 0;\n" 12455 "};\n" 12456 "int i = 0;\n" 12457 "float i2 = 0;\n" 12458 "auto v = type{\n" 12459 " i = 1, //\n" 12460 " (i = 2), //\n" 12461 " i = 3 //\n" 12462 "};", 12463 Alignment); 12464 Alignment.AlignConsecutiveAssignments = false; 12465 12466 verifyFormat( 12467 "int i = 1;\n" 12468 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 12469 " loooooooooooooooooooooongParameterB);\n" 12470 "int j = 2;", 12471 Alignment); 12472 12473 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 12474 // We expect declarations and assignments to align, as long as it doesn't 12475 // exceed the column limit, starting a new alignment sequence whenever it 12476 // happens. 12477 Alignment.AlignConsecutiveAssignments = true; 12478 Alignment.ColumnLimit = 30; 12479 verifyFormat("float ii = 1;\n" 12480 "unsigned j = 2;\n" 12481 "int someVerylongVariable = 1;\n" 12482 "AnotherLongType ll = 123456;\n" 12483 "VeryVeryLongType k = 2;\n" 12484 "int myvar = 1;", 12485 Alignment); 12486 Alignment.ColumnLimit = 80; 12487 Alignment.AlignConsecutiveAssignments = false; 12488 12489 verifyFormat( 12490 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 12491 " typename LongType, typename B>\n" 12492 "auto foo() {}\n", 12493 Alignment); 12494 verifyFormat("float a, b = 1;\n" 12495 "int c = 2;\n" 12496 "int dd = 3;\n", 12497 Alignment); 12498 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12499 "float b[1][] = {{3.f}};\n", 12500 Alignment); 12501 Alignment.AlignConsecutiveAssignments = true; 12502 verifyFormat("float a, b = 1;\n" 12503 "int c = 2;\n" 12504 "int dd = 3;\n", 12505 Alignment); 12506 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 12507 "float b[1][] = {{3.f}};\n", 12508 Alignment); 12509 Alignment.AlignConsecutiveAssignments = false; 12510 12511 Alignment.ColumnLimit = 30; 12512 Alignment.BinPackParameters = false; 12513 verifyFormat("void foo(float a,\n" 12514 " float b,\n" 12515 " int c,\n" 12516 " uint32_t *d) {\n" 12517 " int * e = 0;\n" 12518 " float f = 0;\n" 12519 " double g = 0;\n" 12520 "}\n" 12521 "void bar(ino_t a,\n" 12522 " int b,\n" 12523 " uint32_t *c,\n" 12524 " bool d) {}\n", 12525 Alignment); 12526 Alignment.BinPackParameters = true; 12527 Alignment.ColumnLimit = 80; 12528 12529 // Bug 33507 12530 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 12531 verifyFormat( 12532 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 12533 " static const Version verVs2017;\n" 12534 " return true;\n" 12535 "});\n", 12536 Alignment); 12537 Alignment.PointerAlignment = FormatStyle::PAS_Right; 12538 12539 // See llvm.org/PR35641 12540 Alignment.AlignConsecutiveDeclarations = true; 12541 verifyFormat("int func() { //\n" 12542 " int b;\n" 12543 " unsigned c;\n" 12544 "}", 12545 Alignment); 12546 12547 // See PR37175 12548 FormatStyle Style = getMozillaStyle(); 12549 Style.AlignConsecutiveDeclarations = true; 12550 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 12551 "foo(int a);", 12552 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 12553 } 12554 12555 TEST_F(FormatTest, LinuxBraceBreaking) { 12556 FormatStyle LinuxBraceStyle = getLLVMStyle(); 12557 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 12558 verifyFormat("namespace a\n" 12559 "{\n" 12560 "class A\n" 12561 "{\n" 12562 " void f()\n" 12563 " {\n" 12564 " if (true) {\n" 12565 " a();\n" 12566 " b();\n" 12567 " } else {\n" 12568 " a();\n" 12569 " }\n" 12570 " }\n" 12571 " void g() { return; }\n" 12572 "};\n" 12573 "struct B {\n" 12574 " int x;\n" 12575 "};\n" 12576 "} // namespace a\n", 12577 LinuxBraceStyle); 12578 verifyFormat("enum X {\n" 12579 " Y = 0,\n" 12580 "}\n", 12581 LinuxBraceStyle); 12582 verifyFormat("struct S {\n" 12583 " int Type;\n" 12584 " union {\n" 12585 " int x;\n" 12586 " double y;\n" 12587 " } Value;\n" 12588 " class C\n" 12589 " {\n" 12590 " MyFavoriteType Value;\n" 12591 " } Class;\n" 12592 "}\n", 12593 LinuxBraceStyle); 12594 } 12595 12596 TEST_F(FormatTest, MozillaBraceBreaking) { 12597 FormatStyle MozillaBraceStyle = getLLVMStyle(); 12598 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 12599 MozillaBraceStyle.FixNamespaceComments = false; 12600 verifyFormat("namespace a {\n" 12601 "class A\n" 12602 "{\n" 12603 " void f()\n" 12604 " {\n" 12605 " if (true) {\n" 12606 " a();\n" 12607 " b();\n" 12608 " }\n" 12609 " }\n" 12610 " void g() { return; }\n" 12611 "};\n" 12612 "enum E\n" 12613 "{\n" 12614 " A,\n" 12615 " // foo\n" 12616 " B,\n" 12617 " C\n" 12618 "};\n" 12619 "struct B\n" 12620 "{\n" 12621 " int x;\n" 12622 "};\n" 12623 "}\n", 12624 MozillaBraceStyle); 12625 verifyFormat("struct S\n" 12626 "{\n" 12627 " int Type;\n" 12628 " union\n" 12629 " {\n" 12630 " int x;\n" 12631 " double y;\n" 12632 " } Value;\n" 12633 " class C\n" 12634 " {\n" 12635 " MyFavoriteType Value;\n" 12636 " } Class;\n" 12637 "}\n", 12638 MozillaBraceStyle); 12639 } 12640 12641 TEST_F(FormatTest, StroustrupBraceBreaking) { 12642 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 12643 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12644 verifyFormat("namespace a {\n" 12645 "class A {\n" 12646 " void f()\n" 12647 " {\n" 12648 " if (true) {\n" 12649 " a();\n" 12650 " b();\n" 12651 " }\n" 12652 " }\n" 12653 " void g() { return; }\n" 12654 "};\n" 12655 "struct B {\n" 12656 " int x;\n" 12657 "};\n" 12658 "} // namespace a\n", 12659 StroustrupBraceStyle); 12660 12661 verifyFormat("void foo()\n" 12662 "{\n" 12663 " if (a) {\n" 12664 " a();\n" 12665 " }\n" 12666 " else {\n" 12667 " b();\n" 12668 " }\n" 12669 "}\n", 12670 StroustrupBraceStyle); 12671 12672 verifyFormat("#ifdef _DEBUG\n" 12673 "int foo(int i = 0)\n" 12674 "#else\n" 12675 "int foo(int i = 5)\n" 12676 "#endif\n" 12677 "{\n" 12678 " return i;\n" 12679 "}", 12680 StroustrupBraceStyle); 12681 12682 verifyFormat("void foo() {}\n" 12683 "void bar()\n" 12684 "#ifdef _DEBUG\n" 12685 "{\n" 12686 " foo();\n" 12687 "}\n" 12688 "#else\n" 12689 "{\n" 12690 "}\n" 12691 "#endif", 12692 StroustrupBraceStyle); 12693 12694 verifyFormat("void foobar() { int i = 5; }\n" 12695 "#ifdef _DEBUG\n" 12696 "void bar() {}\n" 12697 "#else\n" 12698 "void bar() { foobar(); }\n" 12699 "#endif", 12700 StroustrupBraceStyle); 12701 } 12702 12703 TEST_F(FormatTest, AllmanBraceBreaking) { 12704 FormatStyle AllmanBraceStyle = getLLVMStyle(); 12705 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 12706 12707 EXPECT_EQ("namespace a\n" 12708 "{\n" 12709 "void f();\n" 12710 "void g();\n" 12711 "} // namespace a\n", 12712 format("namespace a\n" 12713 "{\n" 12714 "void f();\n" 12715 "void g();\n" 12716 "}\n", 12717 AllmanBraceStyle)); 12718 12719 verifyFormat("namespace a\n" 12720 "{\n" 12721 "class A\n" 12722 "{\n" 12723 " void f()\n" 12724 " {\n" 12725 " if (true)\n" 12726 " {\n" 12727 " a();\n" 12728 " b();\n" 12729 " }\n" 12730 " }\n" 12731 " void g() { return; }\n" 12732 "};\n" 12733 "struct B\n" 12734 "{\n" 12735 " int x;\n" 12736 "};\n" 12737 "union C\n" 12738 "{\n" 12739 "};\n" 12740 "} // namespace a", 12741 AllmanBraceStyle); 12742 12743 verifyFormat("void f()\n" 12744 "{\n" 12745 " if (true)\n" 12746 " {\n" 12747 " a();\n" 12748 " }\n" 12749 " else if (false)\n" 12750 " {\n" 12751 " b();\n" 12752 " }\n" 12753 " else\n" 12754 " {\n" 12755 " c();\n" 12756 " }\n" 12757 "}\n", 12758 AllmanBraceStyle); 12759 12760 verifyFormat("void f()\n" 12761 "{\n" 12762 " for (int i = 0; i < 10; ++i)\n" 12763 " {\n" 12764 " a();\n" 12765 " }\n" 12766 " while (false)\n" 12767 " {\n" 12768 " b();\n" 12769 " }\n" 12770 " do\n" 12771 " {\n" 12772 " c();\n" 12773 " } while (false)\n" 12774 "}\n", 12775 AllmanBraceStyle); 12776 12777 verifyFormat("void f(int a)\n" 12778 "{\n" 12779 " switch (a)\n" 12780 " {\n" 12781 " case 0:\n" 12782 " break;\n" 12783 " case 1:\n" 12784 " {\n" 12785 " break;\n" 12786 " }\n" 12787 " case 2:\n" 12788 " {\n" 12789 " }\n" 12790 " break;\n" 12791 " default:\n" 12792 " break;\n" 12793 " }\n" 12794 "}\n", 12795 AllmanBraceStyle); 12796 12797 verifyFormat("enum X\n" 12798 "{\n" 12799 " Y = 0,\n" 12800 "}\n", 12801 AllmanBraceStyle); 12802 verifyFormat("enum X\n" 12803 "{\n" 12804 " Y = 0\n" 12805 "}\n", 12806 AllmanBraceStyle); 12807 12808 verifyFormat("@interface BSApplicationController ()\n" 12809 "{\n" 12810 "@private\n" 12811 " id _extraIvar;\n" 12812 "}\n" 12813 "@end\n", 12814 AllmanBraceStyle); 12815 12816 verifyFormat("#ifdef _DEBUG\n" 12817 "int foo(int i = 0)\n" 12818 "#else\n" 12819 "int foo(int i = 5)\n" 12820 "#endif\n" 12821 "{\n" 12822 " return i;\n" 12823 "}", 12824 AllmanBraceStyle); 12825 12826 verifyFormat("void foo() {}\n" 12827 "void bar()\n" 12828 "#ifdef _DEBUG\n" 12829 "{\n" 12830 " foo();\n" 12831 "}\n" 12832 "#else\n" 12833 "{\n" 12834 "}\n" 12835 "#endif", 12836 AllmanBraceStyle); 12837 12838 verifyFormat("void foobar() { int i = 5; }\n" 12839 "#ifdef _DEBUG\n" 12840 "void bar() {}\n" 12841 "#else\n" 12842 "void bar() { foobar(); }\n" 12843 "#endif", 12844 AllmanBraceStyle); 12845 12846 // This shouldn't affect ObjC blocks.. 12847 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 12848 " // ...\n" 12849 " int i;\n" 12850 "}];", 12851 AllmanBraceStyle); 12852 verifyFormat("void (^block)(void) = ^{\n" 12853 " // ...\n" 12854 " int i;\n" 12855 "};", 12856 AllmanBraceStyle); 12857 // .. or dict literals. 12858 verifyFormat("void f()\n" 12859 "{\n" 12860 " // ...\n" 12861 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 12862 "}", 12863 AllmanBraceStyle); 12864 verifyFormat("void f()\n" 12865 "{\n" 12866 " // ...\n" 12867 " [object someMethod:@{a : @\"b\"}];\n" 12868 "}", 12869 AllmanBraceStyle); 12870 verifyFormat("int f()\n" 12871 "{ // comment\n" 12872 " return 42;\n" 12873 "}", 12874 AllmanBraceStyle); 12875 12876 AllmanBraceStyle.ColumnLimit = 19; 12877 verifyFormat("void f() { int i; }", AllmanBraceStyle); 12878 AllmanBraceStyle.ColumnLimit = 18; 12879 verifyFormat("void f()\n" 12880 "{\n" 12881 " int i;\n" 12882 "}", 12883 AllmanBraceStyle); 12884 AllmanBraceStyle.ColumnLimit = 80; 12885 12886 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 12887 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 12888 FormatStyle::SIS_WithoutElse; 12889 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 12890 verifyFormat("void f(bool b)\n" 12891 "{\n" 12892 " if (b)\n" 12893 " {\n" 12894 " return;\n" 12895 " }\n" 12896 "}\n", 12897 BreakBeforeBraceShortIfs); 12898 verifyFormat("void f(bool b)\n" 12899 "{\n" 12900 " if constexpr (b)\n" 12901 " {\n" 12902 " return;\n" 12903 " }\n" 12904 "}\n", 12905 BreakBeforeBraceShortIfs); 12906 verifyFormat("void f(bool b)\n" 12907 "{\n" 12908 " if CONSTEXPR (b)\n" 12909 " {\n" 12910 " return;\n" 12911 " }\n" 12912 "}\n", 12913 BreakBeforeBraceShortIfs); 12914 verifyFormat("void f(bool b)\n" 12915 "{\n" 12916 " if (b) return;\n" 12917 "}\n", 12918 BreakBeforeBraceShortIfs); 12919 verifyFormat("void f(bool b)\n" 12920 "{\n" 12921 " if constexpr (b) return;\n" 12922 "}\n", 12923 BreakBeforeBraceShortIfs); 12924 verifyFormat("void f(bool b)\n" 12925 "{\n" 12926 " if CONSTEXPR (b) return;\n" 12927 "}\n", 12928 BreakBeforeBraceShortIfs); 12929 verifyFormat("void f(bool b)\n" 12930 "{\n" 12931 " while (b)\n" 12932 " {\n" 12933 " return;\n" 12934 " }\n" 12935 "}\n", 12936 BreakBeforeBraceShortIfs); 12937 } 12938 12939 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 12940 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 12941 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 12942 12943 // Make a few changes to the style for testing purposes 12944 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 12945 FormatStyle::SFS_Empty; 12946 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 12947 WhitesmithsBraceStyle.ColumnLimit = 0; 12948 12949 // FIXME: this test case can't decide whether there should be a blank line 12950 // after the ~D() line or not. It adds one if one doesn't exist in the test 12951 // and it removes the line if one exists. 12952 /* 12953 verifyFormat("class A;\n" 12954 "namespace B\n" 12955 " {\n" 12956 "class C;\n" 12957 "// Comment\n" 12958 "class D\n" 12959 " {\n" 12960 "public:\n" 12961 " D();\n" 12962 " ~D() {}\n" 12963 "private:\n" 12964 " enum E\n" 12965 " {\n" 12966 " F\n" 12967 " }\n" 12968 " };\n" 12969 " } // namespace B\n", 12970 WhitesmithsBraceStyle); 12971 */ 12972 12973 verifyFormat("namespace a\n" 12974 " {\n" 12975 "class A\n" 12976 " {\n" 12977 " void f()\n" 12978 " {\n" 12979 " if (true)\n" 12980 " {\n" 12981 " a();\n" 12982 " b();\n" 12983 " }\n" 12984 " }\n" 12985 " void g()\n" 12986 " {\n" 12987 " return;\n" 12988 " }\n" 12989 " };\n" 12990 "struct B\n" 12991 " {\n" 12992 " int x;\n" 12993 " };\n" 12994 " } // namespace a", 12995 WhitesmithsBraceStyle); 12996 12997 verifyFormat("void f()\n" 12998 " {\n" 12999 " if (true)\n" 13000 " {\n" 13001 " a();\n" 13002 " }\n" 13003 " else if (false)\n" 13004 " {\n" 13005 " b();\n" 13006 " }\n" 13007 " else\n" 13008 " {\n" 13009 " c();\n" 13010 " }\n" 13011 " }\n", 13012 WhitesmithsBraceStyle); 13013 13014 verifyFormat("void f()\n" 13015 " {\n" 13016 " for (int i = 0; i < 10; ++i)\n" 13017 " {\n" 13018 " a();\n" 13019 " }\n" 13020 " while (false)\n" 13021 " {\n" 13022 " b();\n" 13023 " }\n" 13024 " do\n" 13025 " {\n" 13026 " c();\n" 13027 " } while (false)\n" 13028 " }\n", 13029 WhitesmithsBraceStyle); 13030 13031 WhitesmithsBraceStyle.IndentCaseBlocks = true; 13032 verifyFormat("void switchTest1(int a)\n" 13033 " {\n" 13034 " switch (a)\n" 13035 " {\n" 13036 " case 2:\n" 13037 " {\n" 13038 " }\n" 13039 " break;\n" 13040 " }\n" 13041 " }\n", 13042 WhitesmithsBraceStyle); 13043 13044 verifyFormat("void switchTest2(int a)\n" 13045 " {\n" 13046 " switch (a)\n" 13047 " {\n" 13048 " case 0:\n" 13049 " break;\n" 13050 " case 1:\n" 13051 " {\n" 13052 " break;\n" 13053 " }\n" 13054 " case 2:\n" 13055 " {\n" 13056 " }\n" 13057 " break;\n" 13058 " default:\n" 13059 " break;\n" 13060 " }\n" 13061 " }\n", 13062 WhitesmithsBraceStyle); 13063 13064 verifyFormat("void switchTest3(int a)\n" 13065 " {\n" 13066 " switch (a)\n" 13067 " {\n" 13068 " case 0:\n" 13069 " {\n" 13070 " foo(x);\n" 13071 " }\n" 13072 " break;\n" 13073 " default:\n" 13074 " {\n" 13075 " foo(1);\n" 13076 " }\n" 13077 " break;\n" 13078 " }\n" 13079 " }\n", 13080 WhitesmithsBraceStyle); 13081 13082 WhitesmithsBraceStyle.IndentCaseBlocks = false; 13083 13084 verifyFormat("void switchTest4(int a)\n" 13085 " {\n" 13086 " switch (a)\n" 13087 " {\n" 13088 " case 2:\n" 13089 " {\n" 13090 " }\n" 13091 " break;\n" 13092 " }\n" 13093 " }\n", 13094 WhitesmithsBraceStyle); 13095 13096 verifyFormat("void switchTest5(int a)\n" 13097 " {\n" 13098 " switch (a)\n" 13099 " {\n" 13100 " case 0:\n" 13101 " break;\n" 13102 " case 1:\n" 13103 " {\n" 13104 " foo();\n" 13105 " break;\n" 13106 " }\n" 13107 " case 2:\n" 13108 " {\n" 13109 " }\n" 13110 " break;\n" 13111 " default:\n" 13112 " break;\n" 13113 " }\n" 13114 " }\n", 13115 WhitesmithsBraceStyle); 13116 13117 verifyFormat("void switchTest6(int a)\n" 13118 " {\n" 13119 " switch (a)\n" 13120 " {\n" 13121 " case 0:\n" 13122 " {\n" 13123 " foo(x);\n" 13124 " }\n" 13125 " break;\n" 13126 " default:\n" 13127 " {\n" 13128 " foo(1);\n" 13129 " }\n" 13130 " break;\n" 13131 " }\n" 13132 " }\n", 13133 WhitesmithsBraceStyle); 13134 13135 verifyFormat("enum X\n" 13136 " {\n" 13137 " Y = 0, // testing\n" 13138 " }\n", 13139 WhitesmithsBraceStyle); 13140 13141 verifyFormat("enum X\n" 13142 " {\n" 13143 " Y = 0\n" 13144 " }\n", 13145 WhitesmithsBraceStyle); 13146 verifyFormat("enum X\n" 13147 " {\n" 13148 " Y = 0,\n" 13149 " Z = 1\n" 13150 " };\n", 13151 WhitesmithsBraceStyle); 13152 13153 verifyFormat("@interface BSApplicationController ()\n" 13154 " {\n" 13155 "@private\n" 13156 " id _extraIvar;\n" 13157 " }\n" 13158 "@end\n", 13159 WhitesmithsBraceStyle); 13160 13161 verifyFormat("#ifdef _DEBUG\n" 13162 "int foo(int i = 0)\n" 13163 "#else\n" 13164 "int foo(int i = 5)\n" 13165 "#endif\n" 13166 " {\n" 13167 " return i;\n" 13168 " }", 13169 WhitesmithsBraceStyle); 13170 13171 verifyFormat("void foo() {}\n" 13172 "void bar()\n" 13173 "#ifdef _DEBUG\n" 13174 " {\n" 13175 " foo();\n" 13176 " }\n" 13177 "#else\n" 13178 " {\n" 13179 " }\n" 13180 "#endif", 13181 WhitesmithsBraceStyle); 13182 13183 verifyFormat("void foobar()\n" 13184 " {\n" 13185 " int i = 5;\n" 13186 " }\n" 13187 "#ifdef _DEBUG\n" 13188 "void bar()\n" 13189 " {\n" 13190 " }\n" 13191 "#else\n" 13192 "void bar()\n" 13193 " {\n" 13194 " foobar();\n" 13195 " }\n" 13196 "#endif", 13197 WhitesmithsBraceStyle); 13198 13199 // This shouldn't affect ObjC blocks.. 13200 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 13201 " // ...\n" 13202 " int i;\n" 13203 "}];", 13204 WhitesmithsBraceStyle); 13205 verifyFormat("void (^block)(void) = ^{\n" 13206 " // ...\n" 13207 " int i;\n" 13208 "};", 13209 WhitesmithsBraceStyle); 13210 // .. or dict literals. 13211 verifyFormat("void f()\n" 13212 " {\n" 13213 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 13214 " }", 13215 WhitesmithsBraceStyle); 13216 13217 verifyFormat("int f()\n" 13218 " { // comment\n" 13219 " return 42;\n" 13220 " }", 13221 WhitesmithsBraceStyle); 13222 13223 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 13224 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 13225 FormatStyle::SIS_Always; 13226 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 13227 verifyFormat("void f(bool b)\n" 13228 " {\n" 13229 " if (b)\n" 13230 " {\n" 13231 " return;\n" 13232 " }\n" 13233 " }\n", 13234 BreakBeforeBraceShortIfs); 13235 verifyFormat("void f(bool b)\n" 13236 " {\n" 13237 " if (b) return;\n" 13238 " }\n", 13239 BreakBeforeBraceShortIfs); 13240 verifyFormat("void f(bool b)\n" 13241 " {\n" 13242 " while (b)\n" 13243 " {\n" 13244 " return;\n" 13245 " }\n" 13246 " }\n", 13247 BreakBeforeBraceShortIfs); 13248 } 13249 13250 TEST_F(FormatTest, GNUBraceBreaking) { 13251 FormatStyle GNUBraceStyle = getLLVMStyle(); 13252 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 13253 verifyFormat("namespace a\n" 13254 "{\n" 13255 "class A\n" 13256 "{\n" 13257 " void f()\n" 13258 " {\n" 13259 " int a;\n" 13260 " {\n" 13261 " int b;\n" 13262 " }\n" 13263 " if (true)\n" 13264 " {\n" 13265 " a();\n" 13266 " b();\n" 13267 " }\n" 13268 " }\n" 13269 " void g() { return; }\n" 13270 "}\n" 13271 "} // namespace a", 13272 GNUBraceStyle); 13273 13274 verifyFormat("void f()\n" 13275 "{\n" 13276 " if (true)\n" 13277 " {\n" 13278 " a();\n" 13279 " }\n" 13280 " else if (false)\n" 13281 " {\n" 13282 " b();\n" 13283 " }\n" 13284 " else\n" 13285 " {\n" 13286 " c();\n" 13287 " }\n" 13288 "}\n", 13289 GNUBraceStyle); 13290 13291 verifyFormat("void f()\n" 13292 "{\n" 13293 " for (int i = 0; i < 10; ++i)\n" 13294 " {\n" 13295 " a();\n" 13296 " }\n" 13297 " while (false)\n" 13298 " {\n" 13299 " b();\n" 13300 " }\n" 13301 " do\n" 13302 " {\n" 13303 " c();\n" 13304 " }\n" 13305 " while (false);\n" 13306 "}\n", 13307 GNUBraceStyle); 13308 13309 verifyFormat("void f(int a)\n" 13310 "{\n" 13311 " switch (a)\n" 13312 " {\n" 13313 " case 0:\n" 13314 " break;\n" 13315 " case 1:\n" 13316 " {\n" 13317 " break;\n" 13318 " }\n" 13319 " case 2:\n" 13320 " {\n" 13321 " }\n" 13322 " break;\n" 13323 " default:\n" 13324 " break;\n" 13325 " }\n" 13326 "}\n", 13327 GNUBraceStyle); 13328 13329 verifyFormat("enum X\n" 13330 "{\n" 13331 " Y = 0,\n" 13332 "}\n", 13333 GNUBraceStyle); 13334 13335 verifyFormat("@interface BSApplicationController ()\n" 13336 "{\n" 13337 "@private\n" 13338 " id _extraIvar;\n" 13339 "}\n" 13340 "@end\n", 13341 GNUBraceStyle); 13342 13343 verifyFormat("#ifdef _DEBUG\n" 13344 "int foo(int i = 0)\n" 13345 "#else\n" 13346 "int foo(int i = 5)\n" 13347 "#endif\n" 13348 "{\n" 13349 " return i;\n" 13350 "}", 13351 GNUBraceStyle); 13352 13353 verifyFormat("void foo() {}\n" 13354 "void bar()\n" 13355 "#ifdef _DEBUG\n" 13356 "{\n" 13357 " foo();\n" 13358 "}\n" 13359 "#else\n" 13360 "{\n" 13361 "}\n" 13362 "#endif", 13363 GNUBraceStyle); 13364 13365 verifyFormat("void foobar() { int i = 5; }\n" 13366 "#ifdef _DEBUG\n" 13367 "void bar() {}\n" 13368 "#else\n" 13369 "void bar() { foobar(); }\n" 13370 "#endif", 13371 GNUBraceStyle); 13372 } 13373 13374 TEST_F(FormatTest, WebKitBraceBreaking) { 13375 FormatStyle WebKitBraceStyle = getLLVMStyle(); 13376 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 13377 WebKitBraceStyle.FixNamespaceComments = false; 13378 verifyFormat("namespace a {\n" 13379 "class A {\n" 13380 " void f()\n" 13381 " {\n" 13382 " if (true) {\n" 13383 " a();\n" 13384 " b();\n" 13385 " }\n" 13386 " }\n" 13387 " void g() { return; }\n" 13388 "};\n" 13389 "enum E {\n" 13390 " A,\n" 13391 " // foo\n" 13392 " B,\n" 13393 " C\n" 13394 "};\n" 13395 "struct B {\n" 13396 " int x;\n" 13397 "};\n" 13398 "}\n", 13399 WebKitBraceStyle); 13400 verifyFormat("struct S {\n" 13401 " int Type;\n" 13402 " union {\n" 13403 " int x;\n" 13404 " double y;\n" 13405 " } Value;\n" 13406 " class C {\n" 13407 " MyFavoriteType Value;\n" 13408 " } Class;\n" 13409 "};\n", 13410 WebKitBraceStyle); 13411 } 13412 13413 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 13414 verifyFormat("void f() {\n" 13415 " try {\n" 13416 " } catch (const Exception &e) {\n" 13417 " }\n" 13418 "}\n", 13419 getLLVMStyle()); 13420 } 13421 13422 TEST_F(FormatTest, UnderstandsPragmas) { 13423 verifyFormat("#pragma omp reduction(| : var)"); 13424 verifyFormat("#pragma omp reduction(+ : var)"); 13425 13426 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 13427 "(including parentheses).", 13428 format("#pragma mark Any non-hyphenated or hyphenated string " 13429 "(including parentheses).")); 13430 } 13431 13432 TEST_F(FormatTest, UnderstandPragmaOption) { 13433 verifyFormat("#pragma option -C -A"); 13434 13435 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 13436 } 13437 13438 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 13439 FormatStyle Style = getLLVMStyle(); 13440 Style.ColumnLimit = 20; 13441 13442 // See PR41213 13443 EXPECT_EQ("/*\n" 13444 " *\t9012345\n" 13445 " * /8901\n" 13446 " */", 13447 format("/*\n" 13448 " *\t9012345 /8901\n" 13449 " */", 13450 Style)); 13451 EXPECT_EQ("/*\n" 13452 " *345678\n" 13453 " *\t/8901\n" 13454 " */", 13455 format("/*\n" 13456 " *345678\t/8901\n" 13457 " */", 13458 Style)); 13459 13460 verifyFormat("int a; // the\n" 13461 " // comment", 13462 Style); 13463 EXPECT_EQ("int a; /* first line\n" 13464 " * second\n" 13465 " * line third\n" 13466 " * line\n" 13467 " */", 13468 format("int a; /* first line\n" 13469 " * second\n" 13470 " * line third\n" 13471 " * line\n" 13472 " */", 13473 Style)); 13474 EXPECT_EQ("int a; // first line\n" 13475 " // second\n" 13476 " // line third\n" 13477 " // line", 13478 format("int a; // first line\n" 13479 " // second line\n" 13480 " // third line", 13481 Style)); 13482 13483 Style.PenaltyExcessCharacter = 90; 13484 verifyFormat("int a; // the comment", Style); 13485 EXPECT_EQ("int a; // the comment\n" 13486 " // aaa", 13487 format("int a; // the comment aaa", Style)); 13488 EXPECT_EQ("int a; /* first line\n" 13489 " * second line\n" 13490 " * third line\n" 13491 " */", 13492 format("int a; /* first line\n" 13493 " * second line\n" 13494 " * third line\n" 13495 " */", 13496 Style)); 13497 EXPECT_EQ("int a; // first line\n" 13498 " // second line\n" 13499 " // third line", 13500 format("int a; // first line\n" 13501 " // second line\n" 13502 " // third line", 13503 Style)); 13504 // FIXME: Investigate why this is not getting the same layout as the test 13505 // above. 13506 EXPECT_EQ("int a; /* first line\n" 13507 " * second line\n" 13508 " * third line\n" 13509 " */", 13510 format("int a; /* first line second line third line" 13511 "\n*/", 13512 Style)); 13513 13514 EXPECT_EQ("// foo bar baz bazfoo\n" 13515 "// foo bar foo bar\n", 13516 format("// foo bar baz bazfoo\n" 13517 "// foo bar foo bar\n", 13518 Style)); 13519 EXPECT_EQ("// foo bar baz bazfoo\n" 13520 "// foo bar foo bar\n", 13521 format("// foo bar baz bazfoo\n" 13522 "// foo bar foo bar\n", 13523 Style)); 13524 13525 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 13526 // next one. 13527 EXPECT_EQ("// foo bar baz bazfoo\n" 13528 "// bar foo bar\n", 13529 format("// foo bar baz bazfoo bar\n" 13530 "// foo bar\n", 13531 Style)); 13532 13533 EXPECT_EQ("// foo bar baz bazfoo\n" 13534 "// foo bar baz bazfoo\n" 13535 "// bar foo bar\n", 13536 format("// foo bar baz bazfoo\n" 13537 "// foo bar baz bazfoo bar\n" 13538 "// foo bar\n", 13539 Style)); 13540 13541 EXPECT_EQ("// foo bar baz bazfoo\n" 13542 "// foo bar baz bazfoo\n" 13543 "// bar foo bar\n", 13544 format("// foo bar baz bazfoo\n" 13545 "// foo bar baz bazfoo bar\n" 13546 "// foo bar\n", 13547 Style)); 13548 13549 // Make sure we do not keep protruding characters if strict mode reflow is 13550 // cheaper than keeping protruding characters. 13551 Style.ColumnLimit = 21; 13552 EXPECT_EQ( 13553 "// foo foo foo foo\n" 13554 "// foo foo foo foo\n" 13555 "// foo foo foo foo\n", 13556 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 13557 13558 EXPECT_EQ("int a = /* long block\n" 13559 " comment */\n" 13560 " 42;", 13561 format("int a = /* long block comment */ 42;", Style)); 13562 } 13563 13564 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 13565 for (size_t i = 1; i < Styles.size(); ++i) \ 13566 EXPECT_EQ(Styles[0], Styles[i]) \ 13567 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 13568 13569 TEST_F(FormatTest, GetsPredefinedStyleByName) { 13570 SmallVector<FormatStyle, 3> Styles; 13571 Styles.resize(3); 13572 13573 Styles[0] = getLLVMStyle(); 13574 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 13575 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 13576 EXPECT_ALL_STYLES_EQUAL(Styles); 13577 13578 Styles[0] = getGoogleStyle(); 13579 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 13580 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 13581 EXPECT_ALL_STYLES_EQUAL(Styles); 13582 13583 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 13584 EXPECT_TRUE( 13585 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 13586 EXPECT_TRUE( 13587 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 13588 EXPECT_ALL_STYLES_EQUAL(Styles); 13589 13590 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 13591 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 13592 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 13593 EXPECT_ALL_STYLES_EQUAL(Styles); 13594 13595 Styles[0] = getMozillaStyle(); 13596 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 13597 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 13598 EXPECT_ALL_STYLES_EQUAL(Styles); 13599 13600 Styles[0] = getWebKitStyle(); 13601 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 13602 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 13603 EXPECT_ALL_STYLES_EQUAL(Styles); 13604 13605 Styles[0] = getGNUStyle(); 13606 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 13607 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 13608 EXPECT_ALL_STYLES_EQUAL(Styles); 13609 13610 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 13611 } 13612 13613 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 13614 SmallVector<FormatStyle, 8> Styles; 13615 Styles.resize(2); 13616 13617 Styles[0] = getGoogleStyle(); 13618 Styles[1] = getLLVMStyle(); 13619 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 13620 EXPECT_ALL_STYLES_EQUAL(Styles); 13621 13622 Styles.resize(5); 13623 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 13624 Styles[1] = getLLVMStyle(); 13625 Styles[1].Language = FormatStyle::LK_JavaScript; 13626 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 13627 13628 Styles[2] = getLLVMStyle(); 13629 Styles[2].Language = FormatStyle::LK_JavaScript; 13630 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 13631 "BasedOnStyle: Google", 13632 &Styles[2]) 13633 .value()); 13634 13635 Styles[3] = getLLVMStyle(); 13636 Styles[3].Language = FormatStyle::LK_JavaScript; 13637 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 13638 "Language: JavaScript", 13639 &Styles[3]) 13640 .value()); 13641 13642 Styles[4] = getLLVMStyle(); 13643 Styles[4].Language = FormatStyle::LK_JavaScript; 13644 EXPECT_EQ(0, parseConfiguration("---\n" 13645 "BasedOnStyle: LLVM\n" 13646 "IndentWidth: 123\n" 13647 "---\n" 13648 "BasedOnStyle: Google\n" 13649 "Language: JavaScript", 13650 &Styles[4]) 13651 .value()); 13652 EXPECT_ALL_STYLES_EQUAL(Styles); 13653 } 13654 13655 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 13656 Style.FIELD = false; \ 13657 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 13658 EXPECT_TRUE(Style.FIELD); \ 13659 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 13660 EXPECT_FALSE(Style.FIELD); 13661 13662 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 13663 13664 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 13665 Style.STRUCT.FIELD = false; \ 13666 EXPECT_EQ(0, \ 13667 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 13668 .value()); \ 13669 EXPECT_TRUE(Style.STRUCT.FIELD); \ 13670 EXPECT_EQ(0, \ 13671 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 13672 .value()); \ 13673 EXPECT_FALSE(Style.STRUCT.FIELD); 13674 13675 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 13676 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 13677 13678 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 13679 EXPECT_NE(VALUE, Style.FIELD); \ 13680 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 13681 EXPECT_EQ(VALUE, Style.FIELD) 13682 13683 TEST_F(FormatTest, ParsesConfigurationBools) { 13684 FormatStyle Style = {}; 13685 Style.Language = FormatStyle::LK_Cpp; 13686 CHECK_PARSE_BOOL(AlignTrailingComments); 13687 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 13688 CHECK_PARSE_BOOL(AlignConsecutiveBitFields); 13689 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 13690 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 13691 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 13692 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 13693 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 13694 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 13695 CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine); 13696 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 13697 CHECK_PARSE_BOOL(BinPackArguments); 13698 CHECK_PARSE_BOOL(BinPackParameters); 13699 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 13700 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 13701 CHECK_PARSE_BOOL(BreakStringLiterals); 13702 CHECK_PARSE_BOOL(CompactNamespaces); 13703 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 13704 CHECK_PARSE_BOOL(DeriveLineEnding); 13705 CHECK_PARSE_BOOL(DerivePointerAlignment); 13706 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 13707 CHECK_PARSE_BOOL(DisableFormat); 13708 CHECK_PARSE_BOOL(IndentCaseLabels); 13709 CHECK_PARSE_BOOL(IndentCaseBlocks); 13710 CHECK_PARSE_BOOL(IndentGotoLabels); 13711 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 13712 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 13713 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 13714 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 13715 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 13716 CHECK_PARSE_BOOL(ReflowComments); 13717 CHECK_PARSE_BOOL(SortIncludes); 13718 CHECK_PARSE_BOOL(SortUsingDeclarations); 13719 CHECK_PARSE_BOOL(SpacesInParentheses); 13720 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 13721 CHECK_PARSE_BOOL(SpacesInAngles); 13722 CHECK_PARSE_BOOL(SpacesInConditionalStatement); 13723 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 13724 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 13725 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 13726 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 13727 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 13728 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 13729 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 13730 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 13731 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 13732 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 13733 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 13734 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 13735 CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets); 13736 CHECK_PARSE_BOOL(UseCRLF); 13737 13738 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 13739 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 13740 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 13741 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 13742 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 13743 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 13744 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 13745 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 13746 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 13747 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 13748 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 13749 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody); 13750 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile); 13751 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 13752 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 13753 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 13754 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 13755 } 13756 13757 #undef CHECK_PARSE_BOOL 13758 13759 TEST_F(FormatTest, ParsesConfiguration) { 13760 FormatStyle Style = {}; 13761 Style.Language = FormatStyle::LK_Cpp; 13762 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 13763 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 13764 ConstructorInitializerIndentWidth, 1234u); 13765 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 13766 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 13767 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 13768 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 13769 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 13770 PenaltyBreakBeforeFirstCallParameter, 1234u); 13771 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 13772 PenaltyBreakTemplateDeclaration, 1234u); 13773 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 13774 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 13775 PenaltyReturnTypeOnItsOwnLine, 1234u); 13776 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 13777 SpacesBeforeTrailingComments, 1234u); 13778 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 13779 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 13780 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 13781 13782 Style.PointerAlignment = FormatStyle::PAS_Middle; 13783 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 13784 FormatStyle::PAS_Left); 13785 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 13786 FormatStyle::PAS_Right); 13787 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 13788 FormatStyle::PAS_Middle); 13789 // For backward compatibility: 13790 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 13791 FormatStyle::PAS_Left); 13792 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 13793 FormatStyle::PAS_Right); 13794 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 13795 FormatStyle::PAS_Middle); 13796 13797 Style.Standard = FormatStyle::LS_Auto; 13798 CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03); 13799 CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11); 13800 CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14); 13801 CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17); 13802 CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20); 13803 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 13804 CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest); 13805 // Legacy aliases: 13806 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 13807 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest); 13808 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 13809 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 13810 13811 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 13812 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 13813 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 13814 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 13815 FormatStyle::BOS_None); 13816 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 13817 FormatStyle::BOS_All); 13818 // For backward compatibility: 13819 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 13820 FormatStyle::BOS_None); 13821 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 13822 FormatStyle::BOS_All); 13823 13824 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 13825 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 13826 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 13827 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 13828 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 13829 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 13830 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 13831 // For backward compatibility: 13832 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 13833 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 13834 13835 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 13836 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 13837 FormatStyle::BILS_BeforeComma); 13838 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 13839 FormatStyle::BILS_AfterColon); 13840 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 13841 FormatStyle::BILS_BeforeColon); 13842 // For backward compatibility: 13843 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 13844 FormatStyle::BILS_BeforeComma); 13845 13846 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 13847 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 13848 FormatStyle::BAS_Align); 13849 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 13850 FormatStyle::BAS_DontAlign); 13851 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 13852 FormatStyle::BAS_AlwaysBreak); 13853 // For backward compatibility: 13854 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 13855 FormatStyle::BAS_DontAlign); 13856 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 13857 FormatStyle::BAS_Align); 13858 13859 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 13860 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 13861 FormatStyle::ENAS_DontAlign); 13862 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 13863 FormatStyle::ENAS_Left); 13864 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 13865 FormatStyle::ENAS_Right); 13866 // For backward compatibility: 13867 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 13868 FormatStyle::ENAS_Left); 13869 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 13870 FormatStyle::ENAS_Right); 13871 13872 Style.AlignOperands = FormatStyle::OAS_Align; 13873 CHECK_PARSE("AlignOperands: DontAlign", AlignOperands, 13874 FormatStyle::OAS_DontAlign); 13875 CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align); 13876 CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands, 13877 FormatStyle::OAS_AlignAfterOperator); 13878 // For backward compatibility: 13879 CHECK_PARSE("AlignOperands: false", AlignOperands, 13880 FormatStyle::OAS_DontAlign); 13881 CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align); 13882 13883 Style.UseTab = FormatStyle::UT_ForIndentation; 13884 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 13885 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 13886 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 13887 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 13888 FormatStyle::UT_ForContinuationAndIndentation); 13889 CHECK_PARSE("UseTab: AlignWithSpaces", UseTab, 13890 FormatStyle::UT_AlignWithSpaces); 13891 // For backward compatibility: 13892 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 13893 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 13894 13895 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 13896 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 13897 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 13898 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 13899 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 13900 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 13901 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 13902 // For backward compatibility: 13903 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 13904 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 13905 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 13906 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 13907 13908 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 13909 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 13910 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 13911 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 13912 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 13913 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 13914 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 13915 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 13916 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 13917 // For backward compatibility: 13918 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 13919 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 13920 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 13921 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 13922 13923 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 13924 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 13925 FormatStyle::SBPO_Never); 13926 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 13927 FormatStyle::SBPO_Always); 13928 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 13929 FormatStyle::SBPO_ControlStatements); 13930 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 13931 FormatStyle::SBPO_NonEmptyParentheses); 13932 // For backward compatibility: 13933 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 13934 FormatStyle::SBPO_Never); 13935 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 13936 FormatStyle::SBPO_ControlStatements); 13937 13938 Style.ColumnLimit = 123; 13939 FormatStyle BaseStyle = getLLVMStyle(); 13940 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 13941 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 13942 13943 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 13944 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 13945 FormatStyle::BS_Attach); 13946 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 13947 FormatStyle::BS_Linux); 13948 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 13949 FormatStyle::BS_Mozilla); 13950 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 13951 FormatStyle::BS_Stroustrup); 13952 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 13953 FormatStyle::BS_Allman); 13954 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 13955 FormatStyle::BS_Whitesmiths); 13956 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 13957 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 13958 FormatStyle::BS_WebKit); 13959 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 13960 FormatStyle::BS_Custom); 13961 13962 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never; 13963 CHECK_PARSE("BraceWrapping:\n" 13964 " AfterControlStatement: MultiLine", 13965 BraceWrapping.AfterControlStatement, 13966 FormatStyle::BWACS_MultiLine); 13967 CHECK_PARSE("BraceWrapping:\n" 13968 " AfterControlStatement: Always", 13969 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 13970 CHECK_PARSE("BraceWrapping:\n" 13971 " AfterControlStatement: Never", 13972 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 13973 // For backward compatibility: 13974 CHECK_PARSE("BraceWrapping:\n" 13975 " AfterControlStatement: true", 13976 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always); 13977 CHECK_PARSE("BraceWrapping:\n" 13978 " AfterControlStatement: false", 13979 BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never); 13980 13981 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 13982 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 13983 FormatStyle::RTBS_None); 13984 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 13985 FormatStyle::RTBS_All); 13986 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 13987 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 13988 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 13989 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 13990 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 13991 AlwaysBreakAfterReturnType, 13992 FormatStyle::RTBS_TopLevelDefinitions); 13993 13994 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 13995 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 13996 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 13997 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 13998 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 13999 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 14000 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 14001 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 14002 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 14003 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 14004 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 14005 14006 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 14007 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 14008 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 14009 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 14010 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 14011 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 14012 AlwaysBreakAfterDefinitionReturnType, 14013 FormatStyle::DRTBS_TopLevel); 14014 14015 Style.NamespaceIndentation = FormatStyle::NI_All; 14016 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 14017 FormatStyle::NI_None); 14018 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 14019 FormatStyle::NI_Inner); 14020 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 14021 FormatStyle::NI_All); 14022 14023 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 14024 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 14025 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 14026 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 14027 AllowShortIfStatementsOnASingleLine, 14028 FormatStyle::SIS_WithoutElse); 14029 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 14030 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 14031 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 14032 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 14033 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 14034 AllowShortIfStatementsOnASingleLine, 14035 FormatStyle::SIS_WithoutElse); 14036 14037 Style.IndentExternBlock = FormatStyle::IEBS_NoIndent; 14038 CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock, 14039 FormatStyle::IEBS_AfterExternBlock); 14040 CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock, 14041 FormatStyle::IEBS_Indent); 14042 CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock, 14043 FormatStyle::IEBS_NoIndent); 14044 CHECK_PARSE("IndentExternBlock: true", IndentExternBlock, 14045 FormatStyle::IEBS_Indent); 14046 CHECK_PARSE("IndentExternBlock: false", IndentExternBlock, 14047 FormatStyle::IEBS_NoIndent); 14048 14049 Style.BitFieldColonSpacing = FormatStyle::BFCS_None; 14050 CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing, 14051 FormatStyle::BFCS_Both); 14052 CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing, 14053 FormatStyle::BFCS_None); 14054 CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing, 14055 FormatStyle::BFCS_Before); 14056 CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing, 14057 FormatStyle::BFCS_After); 14058 14059 // FIXME: This is required because parsing a configuration simply overwrites 14060 // the first N elements of the list instead of resetting it. 14061 Style.ForEachMacros.clear(); 14062 std::vector<std::string> BoostForeach; 14063 BoostForeach.push_back("BOOST_FOREACH"); 14064 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 14065 std::vector<std::string> BoostAndQForeach; 14066 BoostAndQForeach.push_back("BOOST_FOREACH"); 14067 BoostAndQForeach.push_back("Q_FOREACH"); 14068 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 14069 BoostAndQForeach); 14070 14071 Style.StatementMacros.clear(); 14072 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 14073 std::vector<std::string>{"QUNUSED"}); 14074 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 14075 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 14076 14077 Style.NamespaceMacros.clear(); 14078 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 14079 std::vector<std::string>{"TESTSUITE"}); 14080 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 14081 std::vector<std::string>({"TESTSUITE", "SUITE"})); 14082 14083 Style.WhitespaceSensitiveMacros.clear(); 14084 CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]", 14085 WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"}); 14086 CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]", 14087 WhitespaceSensitiveMacros, 14088 std::vector<std::string>({"STRINGIZE", "ASSERT"})); 14089 Style.WhitespaceSensitiveMacros.clear(); 14090 CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']", 14091 WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"}); 14092 CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']", 14093 WhitespaceSensitiveMacros, 14094 std::vector<std::string>({"STRINGIZE", "ASSERT"})); 14095 14096 Style.IncludeStyle.IncludeCategories.clear(); 14097 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 14098 {"abc/.*", 2, 0}, {".*", 1, 0}}; 14099 CHECK_PARSE("IncludeCategories:\n" 14100 " - Regex: abc/.*\n" 14101 " Priority: 2\n" 14102 " - Regex: .*\n" 14103 " Priority: 1", 14104 IncludeStyle.IncludeCategories, ExpectedCategories); 14105 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 14106 "abc$"); 14107 CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'", 14108 IncludeStyle.IncludeIsMainSourceRegex, "abc$"); 14109 14110 Style.RawStringFormats.clear(); 14111 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 14112 { 14113 FormatStyle::LK_TextProto, 14114 {"pb", "proto"}, 14115 {"PARSE_TEXT_PROTO"}, 14116 /*CanonicalDelimiter=*/"", 14117 "llvm", 14118 }, 14119 { 14120 FormatStyle::LK_Cpp, 14121 {"cc", "cpp"}, 14122 {"C_CODEBLOCK", "CPPEVAL"}, 14123 /*CanonicalDelimiter=*/"cc", 14124 /*BasedOnStyle=*/"", 14125 }, 14126 }; 14127 14128 CHECK_PARSE("RawStringFormats:\n" 14129 " - Language: TextProto\n" 14130 " Delimiters:\n" 14131 " - 'pb'\n" 14132 " - 'proto'\n" 14133 " EnclosingFunctions:\n" 14134 " - 'PARSE_TEXT_PROTO'\n" 14135 " BasedOnStyle: llvm\n" 14136 " - Language: Cpp\n" 14137 " Delimiters:\n" 14138 " - 'cc'\n" 14139 " - 'cpp'\n" 14140 " EnclosingFunctions:\n" 14141 " - 'C_CODEBLOCK'\n" 14142 " - 'CPPEVAL'\n" 14143 " CanonicalDelimiter: 'cc'", 14144 RawStringFormats, ExpectedRawStringFormats); 14145 } 14146 14147 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 14148 FormatStyle Style = {}; 14149 Style.Language = FormatStyle::LK_Cpp; 14150 CHECK_PARSE("Language: Cpp\n" 14151 "IndentWidth: 12", 14152 IndentWidth, 12u); 14153 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 14154 "IndentWidth: 34", 14155 &Style), 14156 ParseError::Unsuitable); 14157 FormatStyle BinPackedTCS = {}; 14158 BinPackedTCS.Language = FormatStyle::LK_JavaScript; 14159 EXPECT_EQ(parseConfiguration("BinPackArguments: true\n" 14160 "InsertTrailingCommas: Wrapped", 14161 &BinPackedTCS), 14162 ParseError::BinPackTrailingCommaConflict); 14163 EXPECT_EQ(12u, Style.IndentWidth); 14164 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 14165 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14166 14167 Style.Language = FormatStyle::LK_JavaScript; 14168 CHECK_PARSE("Language: JavaScript\n" 14169 "IndentWidth: 12", 14170 IndentWidth, 12u); 14171 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 14172 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 14173 "IndentWidth: 34", 14174 &Style), 14175 ParseError::Unsuitable); 14176 EXPECT_EQ(23u, Style.IndentWidth); 14177 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 14178 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14179 14180 CHECK_PARSE("BasedOnStyle: LLVM\n" 14181 "IndentWidth: 67", 14182 IndentWidth, 67u); 14183 14184 CHECK_PARSE("---\n" 14185 "Language: JavaScript\n" 14186 "IndentWidth: 12\n" 14187 "---\n" 14188 "Language: Cpp\n" 14189 "IndentWidth: 34\n" 14190 "...\n", 14191 IndentWidth, 12u); 14192 14193 Style.Language = FormatStyle::LK_Cpp; 14194 CHECK_PARSE("---\n" 14195 "Language: JavaScript\n" 14196 "IndentWidth: 12\n" 14197 "---\n" 14198 "Language: Cpp\n" 14199 "IndentWidth: 34\n" 14200 "...\n", 14201 IndentWidth, 34u); 14202 CHECK_PARSE("---\n" 14203 "IndentWidth: 78\n" 14204 "---\n" 14205 "Language: JavaScript\n" 14206 "IndentWidth: 56\n" 14207 "...\n", 14208 IndentWidth, 78u); 14209 14210 Style.ColumnLimit = 123; 14211 Style.IndentWidth = 234; 14212 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 14213 Style.TabWidth = 345; 14214 EXPECT_FALSE(parseConfiguration("---\n" 14215 "IndentWidth: 456\n" 14216 "BreakBeforeBraces: Allman\n" 14217 "---\n" 14218 "Language: JavaScript\n" 14219 "IndentWidth: 111\n" 14220 "TabWidth: 111\n" 14221 "---\n" 14222 "Language: Cpp\n" 14223 "BreakBeforeBraces: Stroustrup\n" 14224 "TabWidth: 789\n" 14225 "...\n", 14226 &Style)); 14227 EXPECT_EQ(123u, Style.ColumnLimit); 14228 EXPECT_EQ(456u, Style.IndentWidth); 14229 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 14230 EXPECT_EQ(789u, Style.TabWidth); 14231 14232 EXPECT_EQ(parseConfiguration("---\n" 14233 "Language: JavaScript\n" 14234 "IndentWidth: 56\n" 14235 "---\n" 14236 "IndentWidth: 78\n" 14237 "...\n", 14238 &Style), 14239 ParseError::Error); 14240 EXPECT_EQ(parseConfiguration("---\n" 14241 "Language: JavaScript\n" 14242 "IndentWidth: 56\n" 14243 "---\n" 14244 "Language: JavaScript\n" 14245 "IndentWidth: 78\n" 14246 "...\n", 14247 &Style), 14248 ParseError::Error); 14249 14250 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 14251 } 14252 14253 #undef CHECK_PARSE 14254 14255 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 14256 FormatStyle Style = {}; 14257 Style.Language = FormatStyle::LK_JavaScript; 14258 Style.BreakBeforeTernaryOperators = true; 14259 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 14260 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14261 14262 Style.BreakBeforeTernaryOperators = true; 14263 EXPECT_EQ(0, parseConfiguration("---\n" 14264 "BasedOnStyle: Google\n" 14265 "---\n" 14266 "Language: JavaScript\n" 14267 "IndentWidth: 76\n" 14268 "...\n", 14269 &Style) 14270 .value()); 14271 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 14272 EXPECT_EQ(76u, Style.IndentWidth); 14273 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 14274 } 14275 14276 TEST_F(FormatTest, ConfigurationRoundTripTest) { 14277 FormatStyle Style = getLLVMStyle(); 14278 std::string YAML = configurationAsText(Style); 14279 FormatStyle ParsedStyle = {}; 14280 ParsedStyle.Language = FormatStyle::LK_Cpp; 14281 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 14282 EXPECT_EQ(Style, ParsedStyle); 14283 } 14284 14285 TEST_F(FormatTest, WorksFor8bitEncodings) { 14286 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 14287 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 14288 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 14289 "\"\xef\xee\xf0\xf3...\"", 14290 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 14291 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 14292 "\xef\xee\xf0\xf3...\"", 14293 getLLVMStyleWithColumns(12))); 14294 } 14295 14296 TEST_F(FormatTest, HandlesUTF8BOM) { 14297 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 14298 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 14299 format("\xef\xbb\xbf#include <iostream>")); 14300 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 14301 format("\xef\xbb\xbf\n#include <iostream>")); 14302 } 14303 14304 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 14305 #if !defined(_MSC_VER) 14306 14307 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 14308 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 14309 getLLVMStyleWithColumns(35)); 14310 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 14311 getLLVMStyleWithColumns(31)); 14312 verifyFormat("// Однажды в студёную зимнюю пору...", 14313 getLLVMStyleWithColumns(36)); 14314 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 14315 verifyFormat("/* Однажды в студёную зимнюю пору... */", 14316 getLLVMStyleWithColumns(39)); 14317 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 14318 getLLVMStyleWithColumns(35)); 14319 } 14320 14321 TEST_F(FormatTest, SplitsUTF8Strings) { 14322 // Non-printable characters' width is currently considered to be the length in 14323 // bytes in UTF8. The characters can be displayed in very different manner 14324 // (zero-width, single width with a substitution glyph, expanded to their code 14325 // (e.g. "<8d>"), so there's no single correct way to handle them. 14326 EXPECT_EQ("\"aaaaÄ\"\n" 14327 "\"\xc2\x8d\";", 14328 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14329 EXPECT_EQ("\"aaaaaaaÄ\"\n" 14330 "\"\xc2\x8d\";", 14331 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 14332 EXPECT_EQ("\"Однажды, в \"\n" 14333 "\"студёную \"\n" 14334 "\"зимнюю \"\n" 14335 "\"пору,\"", 14336 format("\"Однажды, в студёную зимнюю пору,\"", 14337 getLLVMStyleWithColumns(13))); 14338 EXPECT_EQ( 14339 "\"一 二 三 \"\n" 14340 "\"四 五六 \"\n" 14341 "\"七 八 九 \"\n" 14342 "\"十\"", 14343 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 14344 EXPECT_EQ("\"一\t\"\n" 14345 "\"二 \t\"\n" 14346 "\"三 四 \"\n" 14347 "\"五\t\"\n" 14348 "\"六 \t\"\n" 14349 "\"七 \"\n" 14350 "\"八九十\tqq\"", 14351 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 14352 getLLVMStyleWithColumns(11))); 14353 14354 // UTF8 character in an escape sequence. 14355 EXPECT_EQ("\"aaaaaa\"\n" 14356 "\"\\\xC2\x8D\"", 14357 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 14358 } 14359 14360 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 14361 EXPECT_EQ("const char *sssss =\n" 14362 " \"一二三四五六七八\\\n" 14363 " 九 十\";", 14364 format("const char *sssss = \"一二三四五六七八\\\n" 14365 " 九 十\";", 14366 getLLVMStyleWithColumns(30))); 14367 } 14368 14369 TEST_F(FormatTest, SplitsUTF8LineComments) { 14370 EXPECT_EQ("// aaaaÄ\xc2\x8d", 14371 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 14372 EXPECT_EQ("// Я из лесу\n" 14373 "// вышел; был\n" 14374 "// сильный\n" 14375 "// мороз.", 14376 format("// Я из лесу вышел; был сильный мороз.", 14377 getLLVMStyleWithColumns(13))); 14378 EXPECT_EQ("// 一二三\n" 14379 "// 四五六七\n" 14380 "// 八 九\n" 14381 "// 十", 14382 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 14383 } 14384 14385 TEST_F(FormatTest, SplitsUTF8BlockComments) { 14386 EXPECT_EQ("/* Гляжу,\n" 14387 " * поднимается\n" 14388 " * медленно в\n" 14389 " * гору\n" 14390 " * Лошадка,\n" 14391 " * везущая\n" 14392 " * хворосту\n" 14393 " * воз. */", 14394 format("/* Гляжу, поднимается медленно в гору\n" 14395 " * Лошадка, везущая хворосту воз. */", 14396 getLLVMStyleWithColumns(13))); 14397 EXPECT_EQ( 14398 "/* 一二三\n" 14399 " * 四五六七\n" 14400 " * 八 九\n" 14401 " * 十 */", 14402 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 14403 EXPECT_EQ("/* \n" 14404 " * \n" 14405 " * - */", 14406 format("/* - */", getLLVMStyleWithColumns(12))); 14407 } 14408 14409 #endif // _MSC_VER 14410 14411 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 14412 FormatStyle Style = getLLVMStyle(); 14413 14414 Style.ConstructorInitializerIndentWidth = 4; 14415 verifyFormat( 14416 "SomeClass::Constructor()\n" 14417 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14418 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14419 Style); 14420 14421 Style.ConstructorInitializerIndentWidth = 2; 14422 verifyFormat( 14423 "SomeClass::Constructor()\n" 14424 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14425 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14426 Style); 14427 14428 Style.ConstructorInitializerIndentWidth = 0; 14429 verifyFormat( 14430 "SomeClass::Constructor()\n" 14431 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 14432 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 14433 Style); 14434 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 14435 verifyFormat( 14436 "SomeLongTemplateVariableName<\n" 14437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 14438 Style); 14439 verifyFormat("bool smaller = 1 < " 14440 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 14441 " " 14442 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 14443 Style); 14444 14445 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 14446 verifyFormat("SomeClass::Constructor() :\n" 14447 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 14448 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 14449 Style); 14450 } 14451 14452 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 14453 FormatStyle Style = getLLVMStyle(); 14454 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 14455 Style.ConstructorInitializerIndentWidth = 4; 14456 verifyFormat("SomeClass::Constructor()\n" 14457 " : a(a)\n" 14458 " , b(b)\n" 14459 " , c(c) {}", 14460 Style); 14461 verifyFormat("SomeClass::Constructor()\n" 14462 " : a(a) {}", 14463 Style); 14464 14465 Style.ColumnLimit = 0; 14466 verifyFormat("SomeClass::Constructor()\n" 14467 " : a(a) {}", 14468 Style); 14469 verifyFormat("SomeClass::Constructor() noexcept\n" 14470 " : a(a) {}", 14471 Style); 14472 verifyFormat("SomeClass::Constructor()\n" 14473 " : a(a)\n" 14474 " , b(b)\n" 14475 " , c(c) {}", 14476 Style); 14477 verifyFormat("SomeClass::Constructor()\n" 14478 " : a(a) {\n" 14479 " foo();\n" 14480 " bar();\n" 14481 "}", 14482 Style); 14483 14484 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 14485 verifyFormat("SomeClass::Constructor()\n" 14486 " : a(a)\n" 14487 " , b(b)\n" 14488 " , c(c) {\n}", 14489 Style); 14490 verifyFormat("SomeClass::Constructor()\n" 14491 " : a(a) {\n}", 14492 Style); 14493 14494 Style.ColumnLimit = 80; 14495 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 14496 Style.ConstructorInitializerIndentWidth = 2; 14497 verifyFormat("SomeClass::Constructor()\n" 14498 " : a(a)\n" 14499 " , b(b)\n" 14500 " , c(c) {}", 14501 Style); 14502 14503 Style.ConstructorInitializerIndentWidth = 0; 14504 verifyFormat("SomeClass::Constructor()\n" 14505 ": a(a)\n" 14506 ", b(b)\n" 14507 ", c(c) {}", 14508 Style); 14509 14510 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 14511 Style.ConstructorInitializerIndentWidth = 4; 14512 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 14513 verifyFormat( 14514 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 14515 Style); 14516 verifyFormat( 14517 "SomeClass::Constructor()\n" 14518 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 14519 Style); 14520 Style.ConstructorInitializerIndentWidth = 4; 14521 Style.ColumnLimit = 60; 14522 verifyFormat("SomeClass::Constructor()\n" 14523 " : aaaaaaaa(aaaaaaaa)\n" 14524 " , aaaaaaaa(aaaaaaaa)\n" 14525 " , aaaaaaaa(aaaaaaaa) {}", 14526 Style); 14527 } 14528 14529 TEST_F(FormatTest, Destructors) { 14530 verifyFormat("void F(int &i) { i.~int(); }"); 14531 verifyFormat("void F(int &i) { i->~int(); }"); 14532 } 14533 14534 TEST_F(FormatTest, FormatsWithWebKitStyle) { 14535 FormatStyle Style = getWebKitStyle(); 14536 14537 // Don't indent in outer namespaces. 14538 verifyFormat("namespace outer {\n" 14539 "int i;\n" 14540 "namespace inner {\n" 14541 " int i;\n" 14542 "} // namespace inner\n" 14543 "} // namespace outer\n" 14544 "namespace other_outer {\n" 14545 "int i;\n" 14546 "}", 14547 Style); 14548 14549 // Don't indent case labels. 14550 verifyFormat("switch (variable) {\n" 14551 "case 1:\n" 14552 "case 2:\n" 14553 " doSomething();\n" 14554 " break;\n" 14555 "default:\n" 14556 " ++variable;\n" 14557 "}", 14558 Style); 14559 14560 // Wrap before binary operators. 14561 EXPECT_EQ("void f()\n" 14562 "{\n" 14563 " if (aaaaaaaaaaaaaaaa\n" 14564 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 14565 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 14566 " return;\n" 14567 "}", 14568 format("void f() {\n" 14569 "if (aaaaaaaaaaaaaaaa\n" 14570 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 14571 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 14572 "return;\n" 14573 "}", 14574 Style)); 14575 14576 // Allow functions on a single line. 14577 verifyFormat("void f() { return; }", Style); 14578 14579 // Allow empty blocks on a single line and insert a space in empty blocks. 14580 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 14581 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 14582 // However, don't merge non-empty short loops. 14583 EXPECT_EQ("while (true) {\n" 14584 " continue;\n" 14585 "}", 14586 format("while (true) { continue; }", Style)); 14587 14588 // Constructor initializers are formatted one per line with the "," on the 14589 // new line. 14590 verifyFormat("Constructor()\n" 14591 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 14592 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 14593 " aaaaaaaaaaaaaa)\n" 14594 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 14595 "{\n" 14596 "}", 14597 Style); 14598 verifyFormat("SomeClass::Constructor()\n" 14599 " : a(a)\n" 14600 "{\n" 14601 "}", 14602 Style); 14603 EXPECT_EQ("SomeClass::Constructor()\n" 14604 " : a(a)\n" 14605 "{\n" 14606 "}", 14607 format("SomeClass::Constructor():a(a){}", Style)); 14608 verifyFormat("SomeClass::Constructor()\n" 14609 " : a(a)\n" 14610 " , b(b)\n" 14611 " , c(c)\n" 14612 "{\n" 14613 "}", 14614 Style); 14615 verifyFormat("SomeClass::Constructor()\n" 14616 " : a(a)\n" 14617 "{\n" 14618 " foo();\n" 14619 " bar();\n" 14620 "}", 14621 Style); 14622 14623 // Access specifiers should be aligned left. 14624 verifyFormat("class C {\n" 14625 "public:\n" 14626 " int i;\n" 14627 "};", 14628 Style); 14629 14630 // Do not align comments. 14631 verifyFormat("int a; // Do not\n" 14632 "double b; // align comments.", 14633 Style); 14634 14635 // Do not align operands. 14636 EXPECT_EQ("ASSERT(aaaa\n" 14637 " || bbbb);", 14638 format("ASSERT ( aaaa\n||bbbb);", Style)); 14639 14640 // Accept input's line breaks. 14641 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 14642 " || bbbbbbbbbbbbbbb) {\n" 14643 " i++;\n" 14644 "}", 14645 format("if (aaaaaaaaaaaaaaa\n" 14646 "|| bbbbbbbbbbbbbbb) { i++; }", 14647 Style)); 14648 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 14649 " i++;\n" 14650 "}", 14651 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 14652 14653 // Don't automatically break all macro definitions (llvm.org/PR17842). 14654 verifyFormat("#define aNumber 10", Style); 14655 // However, generally keep the line breaks that the user authored. 14656 EXPECT_EQ("#define aNumber \\\n" 14657 " 10", 14658 format("#define aNumber \\\n" 14659 " 10", 14660 Style)); 14661 14662 // Keep empty and one-element array literals on a single line. 14663 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 14664 " copyItems:YES];", 14665 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 14666 "copyItems:YES];", 14667 Style)); 14668 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 14669 " copyItems:YES];", 14670 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 14671 " copyItems:YES];", 14672 Style)); 14673 // FIXME: This does not seem right, there should be more indentation before 14674 // the array literal's entries. Nested blocks have the same problem. 14675 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 14676 " @\"a\",\n" 14677 " @\"a\"\n" 14678 "]\n" 14679 " copyItems:YES];", 14680 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 14681 " @\"a\",\n" 14682 " @\"a\"\n" 14683 " ]\n" 14684 " copyItems:YES];", 14685 Style)); 14686 EXPECT_EQ( 14687 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 14688 " copyItems:YES];", 14689 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 14690 " copyItems:YES];", 14691 Style)); 14692 14693 verifyFormat("[self.a b:c c:d];", Style); 14694 EXPECT_EQ("[self.a b:c\n" 14695 " c:d];", 14696 format("[self.a b:c\n" 14697 "c:d];", 14698 Style)); 14699 } 14700 14701 TEST_F(FormatTest, FormatsLambdas) { 14702 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 14703 verifyFormat( 14704 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 14705 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 14706 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 14707 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 14708 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 14709 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 14710 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 14711 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 14712 verifyFormat("int x = f(*+[] {});"); 14713 verifyFormat("void f() {\n" 14714 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 14715 "}\n"); 14716 verifyFormat("void f() {\n" 14717 " other(x.begin(), //\n" 14718 " x.end(), //\n" 14719 " [&](int, int) { return 1; });\n" 14720 "}\n"); 14721 verifyFormat("void f() {\n" 14722 " other.other.other.other.other(\n" 14723 " x.begin(), x.end(),\n" 14724 " [something, rather](int, int, int, int, int, int, int) { " 14725 "return 1; });\n" 14726 "}\n"); 14727 verifyFormat( 14728 "void f() {\n" 14729 " other.other.other.other.other(\n" 14730 " x.begin(), x.end(),\n" 14731 " [something, rather](int, int, int, int, int, int, int) {\n" 14732 " //\n" 14733 " });\n" 14734 "}\n"); 14735 verifyFormat("SomeFunction([]() { // A cool function...\n" 14736 " return 43;\n" 14737 "});"); 14738 EXPECT_EQ("SomeFunction([]() {\n" 14739 "#define A a\n" 14740 " return 43;\n" 14741 "});", 14742 format("SomeFunction([](){\n" 14743 "#define A a\n" 14744 "return 43;\n" 14745 "});")); 14746 verifyFormat("void f() {\n" 14747 " SomeFunction([](decltype(x), A *a) {});\n" 14748 "}"); 14749 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14750 " [](const aaaaaaaaaa &a) { return a; });"); 14751 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 14752 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 14753 "});"); 14754 verifyFormat("Constructor()\n" 14755 " : Field([] { // comment\n" 14756 " int i;\n" 14757 " }) {}"); 14758 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 14759 " return some_parameter.size();\n" 14760 "};"); 14761 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 14762 " [](const string &s) { return s; };"); 14763 verifyFormat("int i = aaaaaa ? 1 //\n" 14764 " : [] {\n" 14765 " return 2; //\n" 14766 " }();"); 14767 verifyFormat("llvm::errs() << \"number of twos is \"\n" 14768 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 14769 " return x == 2; // force break\n" 14770 " });"); 14771 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 14772 " [=](int iiiiiiiiiiii) {\n" 14773 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 14774 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 14775 " });", 14776 getLLVMStyleWithColumns(60)); 14777 verifyFormat("SomeFunction({[&] {\n" 14778 " // comment\n" 14779 " },\n" 14780 " [&] {\n" 14781 " // comment\n" 14782 " }});"); 14783 verifyFormat("SomeFunction({[&] {\n" 14784 " // comment\n" 14785 "}});"); 14786 verifyFormat( 14787 "virtual aaaaaaaaaaaaaaaa(\n" 14788 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 14789 " aaaaa aaaaaaaaa);"); 14790 14791 // Lambdas with return types. 14792 verifyFormat("int c = []() -> int { return 2; }();\n"); 14793 verifyFormat("int c = []() -> int * { return 2; }();\n"); 14794 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 14795 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 14796 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 14797 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 14798 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 14799 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 14800 verifyFormat("[a, a]() -> a<1> {};"); 14801 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 14802 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 14803 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 14804 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 14805 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 14806 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 14807 verifyFormat("[]() -> foo<!5> { return {}; };"); 14808 verifyFormat("[]() -> foo<~5> { return {}; };"); 14809 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 14810 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 14811 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 14812 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 14813 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 14814 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 14815 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 14816 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 14817 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 14818 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 14819 verifyFormat("namespace bar {\n" 14820 "// broken:\n" 14821 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 14822 "} // namespace bar"); 14823 verifyFormat("namespace bar {\n" 14824 "// broken:\n" 14825 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 14826 "} // namespace bar"); 14827 verifyFormat("namespace bar {\n" 14828 "// broken:\n" 14829 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 14830 "} // namespace bar"); 14831 verifyFormat("namespace bar {\n" 14832 "// broken:\n" 14833 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 14834 "} // namespace bar"); 14835 verifyFormat("namespace bar {\n" 14836 "// broken:\n" 14837 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 14838 "} // namespace bar"); 14839 verifyFormat("namespace bar {\n" 14840 "// broken:\n" 14841 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 14842 "} // namespace bar"); 14843 verifyFormat("namespace bar {\n" 14844 "// broken:\n" 14845 "auto foo{[]() -> foo<!5> { return {}; }};\n" 14846 "} // namespace bar"); 14847 verifyFormat("namespace bar {\n" 14848 "// broken:\n" 14849 "auto foo{[]() -> foo<~5> { return {}; }};\n" 14850 "} // namespace bar"); 14851 verifyFormat("namespace bar {\n" 14852 "// broken:\n" 14853 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 14854 "} // namespace bar"); 14855 verifyFormat("namespace bar {\n" 14856 "// broken:\n" 14857 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 14858 "} // namespace bar"); 14859 verifyFormat("namespace bar {\n" 14860 "// broken:\n" 14861 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 14862 "} // namespace bar"); 14863 verifyFormat("namespace bar {\n" 14864 "// broken:\n" 14865 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 14866 "} // namespace bar"); 14867 verifyFormat("namespace bar {\n" 14868 "// broken:\n" 14869 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 14870 "} // namespace bar"); 14871 verifyFormat("namespace bar {\n" 14872 "// broken:\n" 14873 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 14874 "} // namespace bar"); 14875 verifyFormat("namespace bar {\n" 14876 "// broken:\n" 14877 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 14878 "} // namespace bar"); 14879 verifyFormat("namespace bar {\n" 14880 "// broken:\n" 14881 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 14882 "} // namespace bar"); 14883 verifyFormat("namespace bar {\n" 14884 "// broken:\n" 14885 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 14886 "} // namespace bar"); 14887 verifyFormat("namespace bar {\n" 14888 "// broken:\n" 14889 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 14890 "} // namespace bar"); 14891 verifyFormat("[]() -> a<1> {};"); 14892 verifyFormat("[]() -> a<1> { ; };"); 14893 verifyFormat("[]() -> a<1> { ; }();"); 14894 verifyFormat("[a, a]() -> a<true> {};"); 14895 verifyFormat("[]() -> a<true> {};"); 14896 verifyFormat("[]() -> a<true> { ; };"); 14897 verifyFormat("[]() -> a<true> { ; }();"); 14898 verifyFormat("[a, a]() -> a<false> {};"); 14899 verifyFormat("[]() -> a<false> {};"); 14900 verifyFormat("[]() -> a<false> { ; };"); 14901 verifyFormat("[]() -> a<false> { ; }();"); 14902 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 14903 verifyFormat("namespace bar {\n" 14904 "auto foo{[]() -> foo<false> { ; }};\n" 14905 "} // namespace bar"); 14906 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 14907 " int j) -> int {\n" 14908 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 14909 "};"); 14910 verifyFormat( 14911 "aaaaaaaaaaaaaaaaaaaaaa(\n" 14912 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 14913 " return aaaaaaaaaaaaaaaaa;\n" 14914 " });", 14915 getLLVMStyleWithColumns(70)); 14916 verifyFormat("[]() //\n" 14917 " -> int {\n" 14918 " return 1; //\n" 14919 "};"); 14920 verifyFormat("[]() -> Void<T...> {};"); 14921 verifyFormat("[a, b]() -> Tuple<T...> { return {}; };"); 14922 14923 // Lambdas with explicit template argument lists. 14924 verifyFormat( 14925 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 14926 14927 // Multiple lambdas in the same parentheses change indentation rules. These 14928 // lambdas are forced to start on new lines. 14929 verifyFormat("SomeFunction(\n" 14930 " []() {\n" 14931 " //\n" 14932 " },\n" 14933 " []() {\n" 14934 " //\n" 14935 " });"); 14936 14937 // A lambda passed as arg0 is always pushed to the next line. 14938 verifyFormat("SomeFunction(\n" 14939 " [this] {\n" 14940 " //\n" 14941 " },\n" 14942 " 1);\n"); 14943 14944 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 14945 // the arg0 case above. 14946 auto Style = getGoogleStyle(); 14947 Style.BinPackArguments = false; 14948 verifyFormat("SomeFunction(\n" 14949 " a,\n" 14950 " [this] {\n" 14951 " //\n" 14952 " },\n" 14953 " b);\n", 14954 Style); 14955 verifyFormat("SomeFunction(\n" 14956 " a,\n" 14957 " [this] {\n" 14958 " //\n" 14959 " },\n" 14960 " b);\n"); 14961 14962 // A lambda with a very long line forces arg0 to be pushed out irrespective of 14963 // the BinPackArguments value (as long as the code is wide enough). 14964 verifyFormat( 14965 "something->SomeFunction(\n" 14966 " a,\n" 14967 " [this] {\n" 14968 " " 14969 "D0000000000000000000000000000000000000000000000000000000000001();\n" 14970 " },\n" 14971 " b);\n"); 14972 14973 // A multi-line lambda is pulled up as long as the introducer fits on the 14974 // previous line and there are no further args. 14975 verifyFormat("function(1, [this, that] {\n" 14976 " //\n" 14977 "});\n"); 14978 verifyFormat("function([this, that] {\n" 14979 " //\n" 14980 "});\n"); 14981 // FIXME: this format is not ideal and we should consider forcing the first 14982 // arg onto its own line. 14983 verifyFormat("function(a, b, c, //\n" 14984 " d, [this, that] {\n" 14985 " //\n" 14986 " });\n"); 14987 14988 // Multiple lambdas are treated correctly even when there is a short arg0. 14989 verifyFormat("SomeFunction(\n" 14990 " 1,\n" 14991 " [this] {\n" 14992 " //\n" 14993 " },\n" 14994 " [this] {\n" 14995 " //\n" 14996 " },\n" 14997 " 1);\n"); 14998 14999 // More complex introducers. 15000 verifyFormat("return [i, args...] {};"); 15001 15002 // Not lambdas. 15003 verifyFormat("constexpr char hello[]{\"hello\"};"); 15004 verifyFormat("double &operator[](int i) { return 0; }\n" 15005 "int i;"); 15006 verifyFormat("std::unique_ptr<int[]> foo() {}"); 15007 verifyFormat("int i = a[a][a]->f();"); 15008 verifyFormat("int i = (*b)[a]->f();"); 15009 15010 // Other corner cases. 15011 verifyFormat("void f() {\n" 15012 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 15013 " );\n" 15014 "}"); 15015 15016 // Lambdas created through weird macros. 15017 verifyFormat("void f() {\n" 15018 " MACRO((const AA &a) { return 1; });\n" 15019 " MACRO((AA &a) { return 1; });\n" 15020 "}"); 15021 15022 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 15023 " doo_dah();\n" 15024 " doo_dah();\n" 15025 " })) {\n" 15026 "}"); 15027 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 15028 " doo_dah();\n" 15029 " doo_dah();\n" 15030 " })) {\n" 15031 "}"); 15032 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 15033 " doo_dah();\n" 15034 " doo_dah();\n" 15035 " })) {\n" 15036 "}"); 15037 verifyFormat("auto lambda = []() {\n" 15038 " int a = 2\n" 15039 "#if A\n" 15040 " + 2\n" 15041 "#endif\n" 15042 " ;\n" 15043 "};"); 15044 15045 // Lambdas with complex multiline introducers. 15046 verifyFormat( 15047 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 15048 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 15049 " -> ::std::unordered_set<\n" 15050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 15051 " //\n" 15052 " });"); 15053 15054 FormatStyle DoNotMerge = getLLVMStyle(); 15055 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 15056 verifyFormat("auto c = []() {\n" 15057 " return b;\n" 15058 "};", 15059 "auto c = []() { return b; };", DoNotMerge); 15060 verifyFormat("auto c = []() {\n" 15061 "};", 15062 " auto c = []() {};", DoNotMerge); 15063 15064 FormatStyle MergeEmptyOnly = getLLVMStyle(); 15065 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 15066 verifyFormat("auto c = []() {\n" 15067 " return b;\n" 15068 "};", 15069 "auto c = []() {\n" 15070 " return b;\n" 15071 " };", 15072 MergeEmptyOnly); 15073 verifyFormat("auto c = []() {};", 15074 "auto c = []() {\n" 15075 "};", 15076 MergeEmptyOnly); 15077 15078 FormatStyle MergeInline = getLLVMStyle(); 15079 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 15080 verifyFormat("auto c = []() {\n" 15081 " return b;\n" 15082 "};", 15083 "auto c = []() { return b; };", MergeInline); 15084 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 15085 MergeInline); 15086 verifyFormat("function([]() { return b; }, a)", 15087 "function([]() { return b; }, a)", MergeInline); 15088 verifyFormat("function(a, []() { return b; })", 15089 "function(a, []() { return b; })", MergeInline); 15090 15091 // Check option "BraceWrapping.BeforeLambdaBody" and different state of 15092 // AllowShortLambdasOnASingleLine 15093 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15094 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15095 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15096 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15097 FormatStyle::ShortLambdaStyle::SLS_None; 15098 verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n" 15099 " []()\n" 15100 " {\n" 15101 " return 17;\n" 15102 " });", 15103 LLVMWithBeforeLambdaBody); 15104 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n" 15105 " []()\n" 15106 " {\n" 15107 " });", 15108 LLVMWithBeforeLambdaBody); 15109 verifyFormat("auto fct_SLS_None = []()\n" 15110 "{\n" 15111 " return 17;\n" 15112 "};", 15113 LLVMWithBeforeLambdaBody); 15114 verifyFormat("TwoNestedLambdas_SLS_None(\n" 15115 " []()\n" 15116 " {\n" 15117 " return Call(\n" 15118 " []()\n" 15119 " {\n" 15120 " return 17;\n" 15121 " });\n" 15122 " });", 15123 LLVMWithBeforeLambdaBody); 15124 verifyFormat("void Fct()\n" 15125 "{\n" 15126 " return {[]()\n" 15127 " {\n" 15128 " return 17;\n" 15129 " }};\n" 15130 "}", 15131 LLVMWithBeforeLambdaBody); 15132 15133 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15134 FormatStyle::ShortLambdaStyle::SLS_Empty; 15135 verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n" 15136 " []()\n" 15137 " {\n" 15138 " return 17;\n" 15139 " });", 15140 LLVMWithBeforeLambdaBody); 15141 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});", 15142 LLVMWithBeforeLambdaBody); 15143 verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL" 15144 "ongFunctionName_SLS_Empty(\n" 15145 " []() {});", 15146 LLVMWithBeforeLambdaBody); 15147 verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n" 15148 " []()\n" 15149 " {\n" 15150 " return 17;\n" 15151 " });", 15152 LLVMWithBeforeLambdaBody); 15153 verifyFormat("auto fct_SLS_Empty = []()\n" 15154 "{\n" 15155 " return 17;\n" 15156 "};", 15157 LLVMWithBeforeLambdaBody); 15158 verifyFormat("TwoNestedLambdas_SLS_Empty(\n" 15159 " []()\n" 15160 " {\n" 15161 " return Call([]() {});\n" 15162 " });", 15163 LLVMWithBeforeLambdaBody); 15164 verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n" 15165 " []()\n" 15166 " {\n" 15167 " return Call([]() {});\n" 15168 " });", 15169 LLVMWithBeforeLambdaBody); 15170 verifyFormat( 15171 "FctWithLongLineInLambda_SLS_Empty(\n" 15172 " []()\n" 15173 " {\n" 15174 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15175 " AndShouldNotBeConsiderAsInline,\n" 15176 " LambdaBodyMustBeBreak);\n" 15177 " });", 15178 LLVMWithBeforeLambdaBody); 15179 15180 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15181 FormatStyle::ShortLambdaStyle::SLS_Inline; 15182 verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });", 15183 LLVMWithBeforeLambdaBody); 15184 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});", 15185 LLVMWithBeforeLambdaBody); 15186 verifyFormat("auto fct_SLS_Inline = []()\n" 15187 "{\n" 15188 " return 17;\n" 15189 "};", 15190 LLVMWithBeforeLambdaBody); 15191 verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return " 15192 "17; }); });", 15193 LLVMWithBeforeLambdaBody); 15194 verifyFormat( 15195 "FctWithLongLineInLambda_SLS_Inline(\n" 15196 " []()\n" 15197 " {\n" 15198 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15199 " AndShouldNotBeConsiderAsInline,\n" 15200 " LambdaBodyMustBeBreak);\n" 15201 " });", 15202 LLVMWithBeforeLambdaBody); 15203 verifyFormat("FctWithMultipleParams_SLS_Inline(" 15204 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15205 " []() { return 17; });", 15206 LLVMWithBeforeLambdaBody); 15207 verifyFormat( 15208 "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });", 15209 LLVMWithBeforeLambdaBody); 15210 15211 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15212 FormatStyle::ShortLambdaStyle::SLS_All; 15213 verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });", 15214 LLVMWithBeforeLambdaBody); 15215 verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});", 15216 LLVMWithBeforeLambdaBody); 15217 verifyFormat("auto fct_SLS_All = []() { return 17; };", 15218 LLVMWithBeforeLambdaBody); 15219 verifyFormat("FctWithOneParam_SLS_All(\n" 15220 " []()\n" 15221 " {\n" 15222 " // A cool function...\n" 15223 " return 43;\n" 15224 " });", 15225 LLVMWithBeforeLambdaBody); 15226 verifyFormat("FctWithMultipleParams_SLS_All(" 15227 "VeryLongParameterThatShouldAskToBeOnMultiLine,\n" 15228 " []() { return 17; });", 15229 LLVMWithBeforeLambdaBody); 15230 verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });", 15231 LLVMWithBeforeLambdaBody); 15232 verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });", 15233 LLVMWithBeforeLambdaBody); 15234 verifyFormat( 15235 "FctWithLongLineInLambda_SLS_All(\n" 15236 " []()\n" 15237 " {\n" 15238 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15239 " AndShouldNotBeConsiderAsInline,\n" 15240 " LambdaBodyMustBeBreak);\n" 15241 " });", 15242 LLVMWithBeforeLambdaBody); 15243 verifyFormat( 15244 "auto fct_SLS_All = []()\n" 15245 "{\n" 15246 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15247 " AndShouldNotBeConsiderAsInline,\n" 15248 " LambdaBodyMustBeBreak);\n" 15249 "};", 15250 LLVMWithBeforeLambdaBody); 15251 LLVMWithBeforeLambdaBody.BinPackParameters = false; 15252 verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);", 15253 LLVMWithBeforeLambdaBody); 15254 verifyFormat( 15255 "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n" 15256 " FirstParam,\n" 15257 " SecondParam,\n" 15258 " ThirdParam,\n" 15259 " FourthParam);", 15260 LLVMWithBeforeLambdaBody); 15261 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15262 " []() { return " 15263 "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n" 15264 " FirstParam,\n" 15265 " SecondParam,\n" 15266 " ThirdParam,\n" 15267 " FourthParam);", 15268 LLVMWithBeforeLambdaBody); 15269 verifyFormat( 15270 "FctWithLongLineInLambda_SLS_All(FirstParam,\n" 15271 " SecondParam,\n" 15272 " ThirdParam,\n" 15273 " FourthParam,\n" 15274 " []() { return SomeValueNotSoLong; });", 15275 LLVMWithBeforeLambdaBody); 15276 verifyFormat("FctWithLongLineInLambda_SLS_All(\n" 15277 " []()\n" 15278 " {\n" 15279 " return " 15280 "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB" 15281 "eConsiderAsInline;\n" 15282 " });", 15283 LLVMWithBeforeLambdaBody); 15284 verifyFormat( 15285 "FctWithLongLineInLambda_SLS_All(\n" 15286 " []()\n" 15287 " {\n" 15288 " return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n" 15289 " AndShouldNotBeConsiderAsInline,\n" 15290 " LambdaBodyMustBeBreak);\n" 15291 " });", 15292 LLVMWithBeforeLambdaBody); 15293 verifyFormat("FctWithTwoParams_SLS_All(\n" 15294 " []()\n" 15295 " {\n" 15296 " // A cool function...\n" 15297 " return 43;\n" 15298 " },\n" 15299 " 87);", 15300 LLVMWithBeforeLambdaBody); 15301 verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);", 15302 LLVMWithBeforeLambdaBody); 15303 verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });", 15304 LLVMWithBeforeLambdaBody); 15305 verifyFormat( 15306 "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });", 15307 LLVMWithBeforeLambdaBody); 15308 verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; " 15309 "}); }, x);", 15310 LLVMWithBeforeLambdaBody); 15311 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15312 " []()\n" 15313 " {\n" 15314 " // A cool function...\n" 15315 " return Call([]() { return 17; });\n" 15316 " });", 15317 LLVMWithBeforeLambdaBody); 15318 verifyFormat("TwoNestedLambdas_SLS_All(\n" 15319 " []()\n" 15320 " {\n" 15321 " return Call(\n" 15322 " []()\n" 15323 " {\n" 15324 " // A cool function...\n" 15325 " return 17;\n" 15326 " });\n" 15327 " });", 15328 LLVMWithBeforeLambdaBody); 15329 } 15330 15331 TEST_F(FormatTest, LambdaWithLineComments) { 15332 FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle(); 15333 LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom; 15334 LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true; 15335 LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine = 15336 FormatStyle::ShortLambdaStyle::SLS_All; 15337 15338 verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody); 15339 verifyFormat("auto k = []() // comment\n" 15340 "{ return; }", 15341 LLVMWithBeforeLambdaBody); 15342 verifyFormat("auto k = []() /* comment */ { return; }", 15343 LLVMWithBeforeLambdaBody); 15344 verifyFormat("auto k = []() /* comment */ /* comment */ { return; }", 15345 LLVMWithBeforeLambdaBody); 15346 verifyFormat("auto k = []() // X\n" 15347 "{ return; }", 15348 LLVMWithBeforeLambdaBody); 15349 verifyFormat( 15350 "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" 15351 "{ return; }", 15352 LLVMWithBeforeLambdaBody); 15353 } 15354 15355 TEST_F(FormatTest, EmptyLinesInLambdas) { 15356 verifyFormat("auto lambda = []() {\n" 15357 " x(); //\n" 15358 "};", 15359 "auto lambda = []() {\n" 15360 "\n" 15361 " x(); //\n" 15362 "\n" 15363 "};"); 15364 } 15365 15366 TEST_F(FormatTest, FormatsBlocks) { 15367 FormatStyle ShortBlocks = getLLVMStyle(); 15368 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15369 verifyFormat("int (^Block)(int, int);", ShortBlocks); 15370 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 15371 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 15372 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 15373 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 15374 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 15375 15376 verifyFormat("foo(^{ bar(); });", ShortBlocks); 15377 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 15378 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 15379 15380 verifyFormat("[operation setCompletionBlock:^{\n" 15381 " [self onOperationDone];\n" 15382 "}];"); 15383 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 15384 " [self onOperationDone];\n" 15385 "}]};"); 15386 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 15387 " f();\n" 15388 "}];"); 15389 verifyFormat("int a = [operation block:^int(int *i) {\n" 15390 " return 1;\n" 15391 "}];"); 15392 verifyFormat("[myObject doSomethingWith:arg1\n" 15393 " aaa:^int(int *a) {\n" 15394 " return 1;\n" 15395 " }\n" 15396 " bbb:f(a * bbbbbbbb)];"); 15397 15398 verifyFormat("[operation setCompletionBlock:^{\n" 15399 " [self.delegate newDataAvailable];\n" 15400 "}];", 15401 getLLVMStyleWithColumns(60)); 15402 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 15403 " NSString *path = [self sessionFilePath];\n" 15404 " if (path) {\n" 15405 " // ...\n" 15406 " }\n" 15407 "});"); 15408 verifyFormat("[[SessionService sharedService]\n" 15409 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15410 " if (window) {\n" 15411 " [self windowDidLoad:window];\n" 15412 " } else {\n" 15413 " [self errorLoadingWindow];\n" 15414 " }\n" 15415 " }];"); 15416 verifyFormat("void (^largeBlock)(void) = ^{\n" 15417 " // ...\n" 15418 "};\n", 15419 getLLVMStyleWithColumns(40)); 15420 verifyFormat("[[SessionService sharedService]\n" 15421 " loadWindowWithCompletionBlock: //\n" 15422 " ^(SessionWindow *window) {\n" 15423 " if (window) {\n" 15424 " [self windowDidLoad:window];\n" 15425 " } else {\n" 15426 " [self errorLoadingWindow];\n" 15427 " }\n" 15428 " }];", 15429 getLLVMStyleWithColumns(60)); 15430 verifyFormat("[myObject doSomethingWith:arg1\n" 15431 " firstBlock:^(Foo *a) {\n" 15432 " // ...\n" 15433 " int i;\n" 15434 " }\n" 15435 " secondBlock:^(Bar *b) {\n" 15436 " // ...\n" 15437 " int i;\n" 15438 " }\n" 15439 " thirdBlock:^Foo(Bar *b) {\n" 15440 " // ...\n" 15441 " int i;\n" 15442 " }];"); 15443 verifyFormat("[myObject doSomethingWith:arg1\n" 15444 " firstBlock:-1\n" 15445 " secondBlock:^(Bar *b) {\n" 15446 " // ...\n" 15447 " int i;\n" 15448 " }];"); 15449 15450 verifyFormat("f(^{\n" 15451 " @autoreleasepool {\n" 15452 " if (a) {\n" 15453 " g();\n" 15454 " }\n" 15455 " }\n" 15456 "});"); 15457 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 15458 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 15459 "};"); 15460 15461 FormatStyle FourIndent = getLLVMStyle(); 15462 FourIndent.ObjCBlockIndentWidth = 4; 15463 verifyFormat("[operation setCompletionBlock:^{\n" 15464 " [self onOperationDone];\n" 15465 "}];", 15466 FourIndent); 15467 } 15468 15469 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 15470 FormatStyle ZeroColumn = getLLVMStyle(); 15471 ZeroColumn.ColumnLimit = 0; 15472 15473 verifyFormat("[[SessionService sharedService] " 15474 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15475 " if (window) {\n" 15476 " [self windowDidLoad:window];\n" 15477 " } else {\n" 15478 " [self errorLoadingWindow];\n" 15479 " }\n" 15480 "}];", 15481 ZeroColumn); 15482 EXPECT_EQ("[[SessionService sharedService]\n" 15483 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15484 " if (window) {\n" 15485 " [self windowDidLoad:window];\n" 15486 " } else {\n" 15487 " [self errorLoadingWindow];\n" 15488 " }\n" 15489 " }];", 15490 format("[[SessionService sharedService]\n" 15491 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 15492 " if (window) {\n" 15493 " [self windowDidLoad:window];\n" 15494 " } else {\n" 15495 " [self errorLoadingWindow];\n" 15496 " }\n" 15497 "}];", 15498 ZeroColumn)); 15499 verifyFormat("[myObject doSomethingWith:arg1\n" 15500 " firstBlock:^(Foo *a) {\n" 15501 " // ...\n" 15502 " int i;\n" 15503 " }\n" 15504 " secondBlock:^(Bar *b) {\n" 15505 " // ...\n" 15506 " int i;\n" 15507 " }\n" 15508 " thirdBlock:^Foo(Bar *b) {\n" 15509 " // ...\n" 15510 " int i;\n" 15511 " }];", 15512 ZeroColumn); 15513 verifyFormat("f(^{\n" 15514 " @autoreleasepool {\n" 15515 " if (a) {\n" 15516 " g();\n" 15517 " }\n" 15518 " }\n" 15519 "});", 15520 ZeroColumn); 15521 verifyFormat("void (^largeBlock)(void) = ^{\n" 15522 " // ...\n" 15523 "};", 15524 ZeroColumn); 15525 15526 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 15527 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 15528 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 15529 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 15530 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 15531 " int i;\n" 15532 "};", 15533 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 15534 } 15535 15536 TEST_F(FormatTest, SupportsCRLF) { 15537 EXPECT_EQ("int a;\r\n" 15538 "int b;\r\n" 15539 "int c;\r\n", 15540 format("int a;\r\n" 15541 " int b;\r\n" 15542 " int c;\r\n", 15543 getLLVMStyle())); 15544 EXPECT_EQ("int a;\r\n" 15545 "int b;\r\n" 15546 "int c;\r\n", 15547 format("int a;\r\n" 15548 " int b;\n" 15549 " int c;\r\n", 15550 getLLVMStyle())); 15551 EXPECT_EQ("int a;\n" 15552 "int b;\n" 15553 "int c;\n", 15554 format("int a;\r\n" 15555 " int b;\n" 15556 " int c;\n", 15557 getLLVMStyle())); 15558 EXPECT_EQ("\"aaaaaaa \"\r\n" 15559 "\"bbbbbbb\";\r\n", 15560 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 15561 EXPECT_EQ("#define A \\\r\n" 15562 " b; \\\r\n" 15563 " c; \\\r\n" 15564 " d;\r\n", 15565 format("#define A \\\r\n" 15566 " b; \\\r\n" 15567 " c; d; \r\n", 15568 getGoogleStyle())); 15569 15570 EXPECT_EQ("/*\r\n" 15571 "multi line block comments\r\n" 15572 "should not introduce\r\n" 15573 "an extra carriage return\r\n" 15574 "*/\r\n", 15575 format("/*\r\n" 15576 "multi line block comments\r\n" 15577 "should not introduce\r\n" 15578 "an extra carriage return\r\n" 15579 "*/\r\n")); 15580 EXPECT_EQ("/*\r\n" 15581 "\r\n" 15582 "*/", 15583 format("/*\r\n" 15584 " \r\r\r\n" 15585 "*/")); 15586 15587 FormatStyle style = getLLVMStyle(); 15588 15589 style.DeriveLineEnding = true; 15590 style.UseCRLF = false; 15591 EXPECT_EQ("union FooBarBazQux {\n" 15592 " int foo;\n" 15593 " int bar;\n" 15594 " int baz;\n" 15595 "};", 15596 format("union FooBarBazQux {\r\n" 15597 " int foo;\n" 15598 " int bar;\r\n" 15599 " int baz;\n" 15600 "};", 15601 style)); 15602 style.UseCRLF = true; 15603 EXPECT_EQ("union FooBarBazQux {\r\n" 15604 " int foo;\r\n" 15605 " int bar;\r\n" 15606 " int baz;\r\n" 15607 "};", 15608 format("union FooBarBazQux {\r\n" 15609 " int foo;\n" 15610 " int bar;\r\n" 15611 " int baz;\n" 15612 "};", 15613 style)); 15614 15615 style.DeriveLineEnding = false; 15616 style.UseCRLF = false; 15617 EXPECT_EQ("union FooBarBazQux {\n" 15618 " int foo;\n" 15619 " int bar;\n" 15620 " int baz;\n" 15621 " int qux;\n" 15622 "};", 15623 format("union FooBarBazQux {\r\n" 15624 " int foo;\n" 15625 " int bar;\r\n" 15626 " int baz;\n" 15627 " int qux;\r\n" 15628 "};", 15629 style)); 15630 style.UseCRLF = true; 15631 EXPECT_EQ("union FooBarBazQux {\r\n" 15632 " int foo;\r\n" 15633 " int bar;\r\n" 15634 " int baz;\r\n" 15635 " int qux;\r\n" 15636 "};", 15637 format("union FooBarBazQux {\r\n" 15638 " int foo;\n" 15639 " int bar;\r\n" 15640 " int baz;\n" 15641 " int qux;\n" 15642 "};", 15643 style)); 15644 15645 style.DeriveLineEnding = true; 15646 style.UseCRLF = false; 15647 EXPECT_EQ("union FooBarBazQux {\r\n" 15648 " int foo;\r\n" 15649 " int bar;\r\n" 15650 " int baz;\r\n" 15651 " int qux;\r\n" 15652 "};", 15653 format("union FooBarBazQux {\r\n" 15654 " int foo;\n" 15655 " int bar;\r\n" 15656 " int baz;\n" 15657 " int qux;\r\n" 15658 "};", 15659 style)); 15660 style.UseCRLF = true; 15661 EXPECT_EQ("union FooBarBazQux {\n" 15662 " int foo;\n" 15663 " int bar;\n" 15664 " int baz;\n" 15665 " int qux;\n" 15666 "};", 15667 format("union FooBarBazQux {\r\n" 15668 " int foo;\n" 15669 " int bar;\r\n" 15670 " int baz;\n" 15671 " int qux;\n" 15672 "};", 15673 style)); 15674 } 15675 15676 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 15677 verifyFormat("MY_CLASS(C) {\n" 15678 " int i;\n" 15679 " int j;\n" 15680 "};"); 15681 } 15682 15683 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 15684 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 15685 TwoIndent.ContinuationIndentWidth = 2; 15686 15687 EXPECT_EQ("int i =\n" 15688 " longFunction(\n" 15689 " arg);", 15690 format("int i = longFunction(arg);", TwoIndent)); 15691 15692 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 15693 SixIndent.ContinuationIndentWidth = 6; 15694 15695 EXPECT_EQ("int i =\n" 15696 " longFunction(\n" 15697 " arg);", 15698 format("int i = longFunction(arg);", SixIndent)); 15699 } 15700 15701 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 15702 FormatStyle Style = getLLVMStyle(); 15703 verifyFormat("int Foo::getter(\n" 15704 " //\n" 15705 ") const {\n" 15706 " return foo;\n" 15707 "}", 15708 Style); 15709 verifyFormat("void Foo::setter(\n" 15710 " //\n" 15711 ") {\n" 15712 " foo = 1;\n" 15713 "}", 15714 Style); 15715 } 15716 15717 TEST_F(FormatTest, SpacesInAngles) { 15718 FormatStyle Spaces = getLLVMStyle(); 15719 Spaces.SpacesInAngles = true; 15720 15721 verifyFormat("static_cast< int >(arg);", Spaces); 15722 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 15723 verifyFormat("f< int, float >();", Spaces); 15724 verifyFormat("template <> g() {}", Spaces); 15725 verifyFormat("template < std::vector< int > > f() {}", Spaces); 15726 verifyFormat("std::function< void(int, int) > fct;", Spaces); 15727 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 15728 Spaces); 15729 15730 Spaces.Standard = FormatStyle::LS_Cpp03; 15731 Spaces.SpacesInAngles = true; 15732 verifyFormat("A< A< int > >();", Spaces); 15733 15734 Spaces.SpacesInAngles = false; 15735 verifyFormat("A<A<int> >();", Spaces); 15736 15737 Spaces.Standard = FormatStyle::LS_Cpp11; 15738 Spaces.SpacesInAngles = true; 15739 verifyFormat("A< A< int > >();", Spaces); 15740 15741 Spaces.SpacesInAngles = false; 15742 verifyFormat("A<A<int>>();", Spaces); 15743 } 15744 15745 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 15746 FormatStyle Style = getLLVMStyle(); 15747 Style.SpaceAfterTemplateKeyword = false; 15748 verifyFormat("template<int> void foo();", Style); 15749 } 15750 15751 TEST_F(FormatTest, TripleAngleBrackets) { 15752 verifyFormat("f<<<1, 1>>>();"); 15753 verifyFormat("f<<<1, 1, 1, s>>>();"); 15754 verifyFormat("f<<<a, b, c, d>>>();"); 15755 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 15756 verifyFormat("f<param><<<1, 1>>>();"); 15757 verifyFormat("f<1><<<1, 1>>>();"); 15758 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 15759 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 15760 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 15761 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 15762 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 15763 } 15764 15765 TEST_F(FormatTest, MergeLessLessAtEnd) { 15766 verifyFormat("<<"); 15767 EXPECT_EQ("< < <", format("\\\n<<<")); 15768 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 15769 "aaallvm::outs() <<"); 15770 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 15771 "aaaallvm::outs()\n <<"); 15772 } 15773 15774 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 15775 std::string code = "#if A\n" 15776 "#if B\n" 15777 "a.\n" 15778 "#endif\n" 15779 " a = 1;\n" 15780 "#else\n" 15781 "#endif\n" 15782 "#if C\n" 15783 "#else\n" 15784 "#endif\n"; 15785 EXPECT_EQ(code, format(code)); 15786 } 15787 15788 TEST_F(FormatTest, HandleConflictMarkers) { 15789 // Git/SVN conflict markers. 15790 EXPECT_EQ("int a;\n" 15791 "void f() {\n" 15792 " callme(some(parameter1,\n" 15793 "<<<<<<< text by the vcs\n" 15794 " parameter2),\n" 15795 "||||||| text by the vcs\n" 15796 " parameter2),\n" 15797 " parameter3,\n" 15798 "======= text by the vcs\n" 15799 " parameter2, parameter3),\n" 15800 ">>>>>>> text by the vcs\n" 15801 " otherparameter);\n", 15802 format("int a;\n" 15803 "void f() {\n" 15804 " callme(some(parameter1,\n" 15805 "<<<<<<< text by the vcs\n" 15806 " parameter2),\n" 15807 "||||||| text by the vcs\n" 15808 " parameter2),\n" 15809 " parameter3,\n" 15810 "======= text by the vcs\n" 15811 " parameter2,\n" 15812 " parameter3),\n" 15813 ">>>>>>> text by the vcs\n" 15814 " otherparameter);\n")); 15815 15816 // Perforce markers. 15817 EXPECT_EQ("void f() {\n" 15818 " function(\n" 15819 ">>>> text by the vcs\n" 15820 " parameter,\n" 15821 "==== text by the vcs\n" 15822 " parameter,\n" 15823 "==== text by the vcs\n" 15824 " parameter,\n" 15825 "<<<< text by the vcs\n" 15826 " parameter);\n", 15827 format("void f() {\n" 15828 " function(\n" 15829 ">>>> text by the vcs\n" 15830 " parameter,\n" 15831 "==== text by the vcs\n" 15832 " parameter,\n" 15833 "==== text by the vcs\n" 15834 " parameter,\n" 15835 "<<<< text by the vcs\n" 15836 " parameter);\n")); 15837 15838 EXPECT_EQ("<<<<<<<\n" 15839 "|||||||\n" 15840 "=======\n" 15841 ">>>>>>>", 15842 format("<<<<<<<\n" 15843 "|||||||\n" 15844 "=======\n" 15845 ">>>>>>>")); 15846 15847 EXPECT_EQ("<<<<<<<\n" 15848 "|||||||\n" 15849 "int i;\n" 15850 "=======\n" 15851 ">>>>>>>", 15852 format("<<<<<<<\n" 15853 "|||||||\n" 15854 "int i;\n" 15855 "=======\n" 15856 ">>>>>>>")); 15857 15858 // FIXME: Handle parsing of macros around conflict markers correctly: 15859 EXPECT_EQ("#define Macro \\\n" 15860 "<<<<<<<\n" 15861 "Something \\\n" 15862 "|||||||\n" 15863 "Else \\\n" 15864 "=======\n" 15865 "Other \\\n" 15866 ">>>>>>>\n" 15867 " End int i;\n", 15868 format("#define Macro \\\n" 15869 "<<<<<<<\n" 15870 " Something \\\n" 15871 "|||||||\n" 15872 " Else \\\n" 15873 "=======\n" 15874 " Other \\\n" 15875 ">>>>>>>\n" 15876 " End\n" 15877 "int i;\n")); 15878 } 15879 15880 TEST_F(FormatTest, DisableRegions) { 15881 EXPECT_EQ("int i;\n" 15882 "// clang-format off\n" 15883 " int j;\n" 15884 "// clang-format on\n" 15885 "int k;", 15886 format(" int i;\n" 15887 " // clang-format off\n" 15888 " int j;\n" 15889 " // clang-format on\n" 15890 " int k;")); 15891 EXPECT_EQ("int i;\n" 15892 "/* clang-format off */\n" 15893 " int j;\n" 15894 "/* clang-format on */\n" 15895 "int k;", 15896 format(" int i;\n" 15897 " /* clang-format off */\n" 15898 " int j;\n" 15899 " /* clang-format on */\n" 15900 " int k;")); 15901 15902 // Don't reflow comments within disabled regions. 15903 EXPECT_EQ("// clang-format off\n" 15904 "// long long long long long long line\n" 15905 "/* clang-format on */\n" 15906 "/* long long long\n" 15907 " * long long long\n" 15908 " * line */\n" 15909 "int i;\n" 15910 "/* clang-format off */\n" 15911 "/* long long long long long long line */\n", 15912 format("// clang-format off\n" 15913 "// long long long long long long line\n" 15914 "/* clang-format on */\n" 15915 "/* long long long long long long line */\n" 15916 "int i;\n" 15917 "/* clang-format off */\n" 15918 "/* long long long long long long line */\n", 15919 getLLVMStyleWithColumns(20))); 15920 } 15921 15922 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 15923 format("? ) ="); 15924 verifyNoCrash("#define a\\\n /**/}"); 15925 } 15926 15927 TEST_F(FormatTest, FormatsTableGenCode) { 15928 FormatStyle Style = getLLVMStyle(); 15929 Style.Language = FormatStyle::LK_TableGen; 15930 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 15931 } 15932 15933 TEST_F(FormatTest, ArrayOfTemplates) { 15934 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 15935 format("auto a = new unique_ptr<int > [ 10];")); 15936 15937 FormatStyle Spaces = getLLVMStyle(); 15938 Spaces.SpacesInSquareBrackets = true; 15939 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 15940 format("auto a = new unique_ptr<int > [10];", Spaces)); 15941 } 15942 15943 TEST_F(FormatTest, ArrayAsTemplateType) { 15944 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 15945 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 15946 15947 FormatStyle Spaces = getLLVMStyle(); 15948 Spaces.SpacesInSquareBrackets = true; 15949 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 15950 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 15951 } 15952 15953 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 15954 15955 TEST(FormatStyle, GetStyleWithEmptyFileName) { 15956 llvm::vfs::InMemoryFileSystem FS; 15957 auto Style1 = getStyle("file", "", "Google", "", &FS); 15958 ASSERT_TRUE((bool)Style1); 15959 ASSERT_EQ(*Style1, getGoogleStyle()); 15960 } 15961 15962 TEST(FormatStyle, GetStyleOfFile) { 15963 llvm::vfs::InMemoryFileSystem FS; 15964 // Test 1: format file in the same directory. 15965 ASSERT_TRUE( 15966 FS.addFile("/a/.clang-format", 0, 15967 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 15968 ASSERT_TRUE( 15969 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15970 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 15971 ASSERT_TRUE((bool)Style1); 15972 ASSERT_EQ(*Style1, getLLVMStyle()); 15973 15974 // Test 2.1: fallback to default. 15975 ASSERT_TRUE( 15976 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 15977 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 15978 ASSERT_TRUE((bool)Style2); 15979 ASSERT_EQ(*Style2, getMozillaStyle()); 15980 15981 // Test 2.2: no format on 'none' fallback style. 15982 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 15983 ASSERT_TRUE((bool)Style2); 15984 ASSERT_EQ(*Style2, getNoStyle()); 15985 15986 // Test 2.3: format if config is found with no based style while fallback is 15987 // 'none'. 15988 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 15989 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 15990 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 15991 ASSERT_TRUE((bool)Style2); 15992 ASSERT_EQ(*Style2, getLLVMStyle()); 15993 15994 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 15995 Style2 = getStyle("{}", "a.h", "none", "", &FS); 15996 ASSERT_TRUE((bool)Style2); 15997 ASSERT_EQ(*Style2, getLLVMStyle()); 15998 15999 // Test 3: format file in parent directory. 16000 ASSERT_TRUE( 16001 FS.addFile("/c/.clang-format", 0, 16002 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 16003 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 16004 llvm::MemoryBuffer::getMemBuffer("int i;"))); 16005 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 16006 ASSERT_TRUE((bool)Style3); 16007 ASSERT_EQ(*Style3, getGoogleStyle()); 16008 16009 // Test 4: error on invalid fallback style 16010 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 16011 ASSERT_FALSE((bool)Style4); 16012 llvm::consumeError(Style4.takeError()); 16013 16014 // Test 5: error on invalid yaml on command line 16015 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 16016 ASSERT_FALSE((bool)Style5); 16017 llvm::consumeError(Style5.takeError()); 16018 16019 // Test 6: error on invalid style 16020 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 16021 ASSERT_FALSE((bool)Style6); 16022 llvm::consumeError(Style6.takeError()); 16023 16024 // Test 7: found config file, error on parsing it 16025 ASSERT_TRUE( 16026 FS.addFile("/d/.clang-format", 0, 16027 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 16028 "InvalidKey: InvalidValue"))); 16029 ASSERT_TRUE( 16030 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 16031 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 16032 ASSERT_FALSE((bool)Style7); 16033 llvm::consumeError(Style7.takeError()); 16034 16035 // Test 8: inferred per-language defaults apply. 16036 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 16037 ASSERT_TRUE((bool)StyleTd); 16038 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 16039 } 16040 16041 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 16042 // Column limit is 20. 16043 std::string Code = "Type *a =\n" 16044 " new Type();\n" 16045 "g(iiiii, 0, jjjjj,\n" 16046 " 0, kkkkk, 0, mm);\n" 16047 "int bad = format ;"; 16048 std::string Expected = "auto a = new Type();\n" 16049 "g(iiiii, nullptr,\n" 16050 " jjjjj, nullptr,\n" 16051 " kkkkk, nullptr,\n" 16052 " mm);\n" 16053 "int bad = format ;"; 16054 FileID ID = Context.createInMemoryFile("format.cpp", Code); 16055 tooling::Replacements Replaces = toReplacements( 16056 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 16057 "auto "), 16058 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 16059 "nullptr"), 16060 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 16061 "nullptr"), 16062 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 16063 "nullptr")}); 16064 16065 format::FormatStyle Style = format::getLLVMStyle(); 16066 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 16067 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 16068 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 16069 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 16070 auto Result = applyAllReplacements(Code, *FormattedReplaces); 16071 EXPECT_TRUE(static_cast<bool>(Result)); 16072 EXPECT_EQ(Expected, *Result); 16073 } 16074 16075 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 16076 std::string Code = "#include \"a.h\"\n" 16077 "#include \"c.h\"\n" 16078 "\n" 16079 "int main() {\n" 16080 " return 0;\n" 16081 "}"; 16082 std::string Expected = "#include \"a.h\"\n" 16083 "#include \"b.h\"\n" 16084 "#include \"c.h\"\n" 16085 "\n" 16086 "int main() {\n" 16087 " return 0;\n" 16088 "}"; 16089 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 16090 tooling::Replacements Replaces = toReplacements( 16091 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 16092 "#include \"b.h\"\n")}); 16093 16094 format::FormatStyle Style = format::getLLVMStyle(); 16095 Style.SortIncludes = true; 16096 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 16097 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 16098 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 16099 auto Result = applyAllReplacements(Code, *FormattedReplaces); 16100 EXPECT_TRUE(static_cast<bool>(Result)); 16101 EXPECT_EQ(Expected, *Result); 16102 } 16103 16104 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 16105 EXPECT_EQ("using std::cin;\n" 16106 "using std::cout;", 16107 format("using std::cout;\n" 16108 "using std::cin;", 16109 getGoogleStyle())); 16110 } 16111 16112 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 16113 format::FormatStyle Style = format::getLLVMStyle(); 16114 Style.Standard = FormatStyle::LS_Cpp03; 16115 // cpp03 recognize this string as identifier u8 and literal character 'a' 16116 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 16117 } 16118 16119 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 16120 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 16121 // all modes, including C++11, C++14 and C++17 16122 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 16123 } 16124 16125 TEST_F(FormatTest, DoNotFormatLikelyXml) { 16126 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 16127 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 16128 } 16129 16130 TEST_F(FormatTest, StructuredBindings) { 16131 // Structured bindings is a C++17 feature. 16132 // all modes, including C++11, C++14 and C++17 16133 verifyFormat("auto [a, b] = f();"); 16134 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 16135 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 16136 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 16137 EXPECT_EQ("auto const volatile [a, b] = f();", 16138 format("auto const volatile[a, b] = f();")); 16139 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 16140 EXPECT_EQ("auto &[a, b, c] = f();", 16141 format("auto &[ a , b,c ] = f();")); 16142 EXPECT_EQ("auto &&[a, b, c] = f();", 16143 format("auto &&[ a , b,c ] = f();")); 16144 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 16145 EXPECT_EQ("auto const volatile &&[a, b] = f();", 16146 format("auto const volatile &&[a, b] = f();")); 16147 EXPECT_EQ("auto const &&[a, b] = f();", 16148 format("auto const && [a, b] = f();")); 16149 EXPECT_EQ("const auto &[a, b] = f();", 16150 format("const auto & [a, b] = f();")); 16151 EXPECT_EQ("const auto volatile &&[a, b] = f();", 16152 format("const auto volatile &&[a, b] = f();")); 16153 EXPECT_EQ("volatile const auto &&[a, b] = f();", 16154 format("volatile const auto &&[a, b] = f();")); 16155 EXPECT_EQ("const auto &&[a, b] = f();", 16156 format("const auto && [a, b] = f();")); 16157 16158 // Make sure we don't mistake structured bindings for lambdas. 16159 FormatStyle PointerMiddle = getLLVMStyle(); 16160 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 16161 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 16162 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 16163 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 16164 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 16165 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 16166 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 16167 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 16168 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 16169 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 16170 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 16171 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 16172 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 16173 16174 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 16175 format("for (const auto && [a, b] : some_range) {\n}")); 16176 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 16177 format("for (const auto & [a, b] : some_range) {\n}")); 16178 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 16179 format("for (const auto[a, b] : some_range) {\n}")); 16180 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 16181 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 16182 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 16183 EXPECT_EQ("auto const &[x, y](expr);", 16184 format("auto const & [x,y] (expr);")); 16185 EXPECT_EQ("auto const &&[x, y](expr);", 16186 format("auto const && [x,y] (expr);")); 16187 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 16188 EXPECT_EQ("auto const &[x, y]{expr};", 16189 format("auto const & [x,y] {expr};")); 16190 EXPECT_EQ("auto const &&[x, y]{expr};", 16191 format("auto const && [x,y] {expr};")); 16192 16193 format::FormatStyle Spaces = format::getLLVMStyle(); 16194 Spaces.SpacesInSquareBrackets = true; 16195 verifyFormat("auto [ a, b ] = f();", Spaces); 16196 verifyFormat("auto &&[ a, b ] = f();", Spaces); 16197 verifyFormat("auto &[ a, b ] = f();", Spaces); 16198 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 16199 verifyFormat("auto const &[ a, b ] = f();", Spaces); 16200 } 16201 16202 TEST_F(FormatTest, FileAndCode) { 16203 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 16204 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 16205 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 16206 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 16207 EXPECT_EQ(FormatStyle::LK_ObjC, 16208 guessLanguage("foo.h", "@interface Foo\n@end\n")); 16209 EXPECT_EQ( 16210 FormatStyle::LK_ObjC, 16211 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 16212 EXPECT_EQ(FormatStyle::LK_ObjC, 16213 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 16214 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 16215 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 16216 EXPECT_EQ(FormatStyle::LK_ObjC, 16217 guessLanguage("foo", "@interface Foo\n@end\n")); 16218 EXPECT_EQ(FormatStyle::LK_ObjC, 16219 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 16220 EXPECT_EQ( 16221 FormatStyle::LK_ObjC, 16222 guessLanguage("foo.h", 16223 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 16224 EXPECT_EQ( 16225 FormatStyle::LK_Cpp, 16226 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 16227 } 16228 16229 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 16230 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 16231 EXPECT_EQ(FormatStyle::LK_ObjC, 16232 guessLanguage("foo.h", "array[[calculator getIndex]];")); 16233 EXPECT_EQ(FormatStyle::LK_Cpp, 16234 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 16235 EXPECT_EQ( 16236 FormatStyle::LK_Cpp, 16237 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 16238 EXPECT_EQ(FormatStyle::LK_ObjC, 16239 guessLanguage("foo.h", "[[noreturn foo] bar];")); 16240 EXPECT_EQ(FormatStyle::LK_Cpp, 16241 guessLanguage("foo.h", "[[clang::fallthrough]];")); 16242 EXPECT_EQ(FormatStyle::LK_ObjC, 16243 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 16244 EXPECT_EQ(FormatStyle::LK_Cpp, 16245 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 16246 EXPECT_EQ(FormatStyle::LK_Cpp, 16247 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 16248 EXPECT_EQ(FormatStyle::LK_ObjC, 16249 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 16250 EXPECT_EQ(FormatStyle::LK_Cpp, 16251 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 16252 EXPECT_EQ( 16253 FormatStyle::LK_Cpp, 16254 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 16255 EXPECT_EQ( 16256 FormatStyle::LK_Cpp, 16257 guessLanguage("foo.h", 16258 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 16259 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 16260 } 16261 16262 TEST_F(FormatTest, GuessLanguageWithCaret) { 16263 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 16264 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 16265 EXPECT_EQ(FormatStyle::LK_ObjC, 16266 guessLanguage("foo.h", "int(^)(char, float);")); 16267 EXPECT_EQ(FormatStyle::LK_ObjC, 16268 guessLanguage("foo.h", "int(^foo)(char, float);")); 16269 EXPECT_EQ(FormatStyle::LK_ObjC, 16270 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 16271 EXPECT_EQ(FormatStyle::LK_ObjC, 16272 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 16273 EXPECT_EQ( 16274 FormatStyle::LK_ObjC, 16275 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 16276 } 16277 16278 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) { 16279 // ASM symbolic names are identifiers that must be surrounded by [] without 16280 // space in between: 16281 // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands 16282 16283 // Example from https://bugs.llvm.org/show_bug.cgi?id=45108. 16284 verifyFormat(R"(// 16285 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result)); 16286 )"); 16287 16288 // A list of several ASM symbolic names. 16289 verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)"); 16290 16291 // ASM symbolic names in inline ASM with inputs and outputs. 16292 verifyFormat(R"(// 16293 asm("cmoveq %1, %2, %[result]" 16294 : [result] "=r"(result) 16295 : "r"(test), "r"(new), "[result]"(old)); 16296 )"); 16297 16298 // ASM symbolic names in inline ASM with no outputs. 16299 verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)"); 16300 } 16301 16302 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 16303 EXPECT_EQ(FormatStyle::LK_Cpp, 16304 guessLanguage("foo.h", "void f() {\n" 16305 " asm (\"mov %[e], %[d]\"\n" 16306 " : [d] \"=rm\" (d)\n" 16307 " [e] \"rm\" (*e));\n" 16308 "}")); 16309 EXPECT_EQ(FormatStyle::LK_Cpp, 16310 guessLanguage("foo.h", "void f() {\n" 16311 " _asm (\"mov %[e], %[d]\"\n" 16312 " : [d] \"=rm\" (d)\n" 16313 " [e] \"rm\" (*e));\n" 16314 "}")); 16315 EXPECT_EQ(FormatStyle::LK_Cpp, 16316 guessLanguage("foo.h", "void f() {\n" 16317 " __asm (\"mov %[e], %[d]\"\n" 16318 " : [d] \"=rm\" (d)\n" 16319 " [e] \"rm\" (*e));\n" 16320 "}")); 16321 EXPECT_EQ(FormatStyle::LK_Cpp, 16322 guessLanguage("foo.h", "void f() {\n" 16323 " __asm__ (\"mov %[e], %[d]\"\n" 16324 " : [d] \"=rm\" (d)\n" 16325 " [e] \"rm\" (*e));\n" 16326 "}")); 16327 EXPECT_EQ(FormatStyle::LK_Cpp, 16328 guessLanguage("foo.h", "void f() {\n" 16329 " asm (\"mov %[e], %[d]\"\n" 16330 " : [d] \"=rm\" (d),\n" 16331 " [e] \"rm\" (*e));\n" 16332 "}")); 16333 EXPECT_EQ(FormatStyle::LK_Cpp, 16334 guessLanguage("foo.h", "void f() {\n" 16335 " asm volatile (\"mov %[e], %[d]\"\n" 16336 " : [d] \"=rm\" (d)\n" 16337 " [e] \"rm\" (*e));\n" 16338 "}")); 16339 } 16340 16341 TEST_F(FormatTest, GuessLanguageWithChildLines) { 16342 EXPECT_EQ(FormatStyle::LK_Cpp, 16343 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 16344 EXPECT_EQ(FormatStyle::LK_ObjC, 16345 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 16346 EXPECT_EQ( 16347 FormatStyle::LK_Cpp, 16348 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 16349 EXPECT_EQ( 16350 FormatStyle::LK_ObjC, 16351 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 16352 } 16353 16354 TEST_F(FormatTest, TypenameMacros) { 16355 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 16356 16357 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 16358 FormatStyle Google = getGoogleStyleWithColumns(0); 16359 Google.TypenameMacros = TypenameMacros; 16360 verifyFormat("struct foo {\n" 16361 " int bar;\n" 16362 " TAILQ_ENTRY(a) bleh;\n" 16363 "};", 16364 Google); 16365 16366 FormatStyle Macros = getLLVMStyle(); 16367 Macros.TypenameMacros = TypenameMacros; 16368 16369 verifyFormat("STACK_OF(int) a;", Macros); 16370 verifyFormat("STACK_OF(int) *a;", Macros); 16371 verifyFormat("STACK_OF(int const *) *a;", Macros); 16372 verifyFormat("STACK_OF(int *const) *a;", Macros); 16373 verifyFormat("STACK_OF(int, string) a;", Macros); 16374 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 16375 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 16376 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 16377 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 16378 16379 Macros.PointerAlignment = FormatStyle::PAS_Left; 16380 verifyFormat("STACK_OF(int)* a;", Macros); 16381 verifyFormat("STACK_OF(int*)* a;", Macros); 16382 } 16383 16384 TEST_F(FormatTest, AmbersandInLamda) { 16385 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 16386 FormatStyle AlignStyle = getLLVMStyle(); 16387 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 16388 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 16389 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 16390 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 16391 } 16392 16393 TEST_F(FormatTest, SpacesInConditionalStatement) { 16394 FormatStyle Spaces = getLLVMStyle(); 16395 Spaces.SpacesInConditionalStatement = true; 16396 verifyFormat("for ( int i = 0; i; i++ )\n continue;", Spaces); 16397 verifyFormat("if ( !a )\n return;", Spaces); 16398 verifyFormat("if ( a )\n return;", Spaces); 16399 verifyFormat("if constexpr ( a )\n return;", Spaces); 16400 verifyFormat("switch ( a )\ncase 1:\n return;", Spaces); 16401 verifyFormat("while ( a )\n return;", Spaces); 16402 verifyFormat("while ( (a && b) )\n return;", Spaces); 16403 verifyFormat("do {\n} while ( 1 != 0 );", Spaces); 16404 verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces); 16405 // Check that space on the left of "::" is inserted as expected at beginning 16406 // of condition. 16407 verifyFormat("while ( ::func() )\n return;", Spaces); 16408 } 16409 16410 TEST_F(FormatTest, AlternativeOperators) { 16411 // Test case for ensuring alternate operators are not 16412 // combined with their right most neighbour. 16413 verifyFormat("int a and b;"); 16414 verifyFormat("int a and_eq b;"); 16415 verifyFormat("int a bitand b;"); 16416 verifyFormat("int a bitor b;"); 16417 verifyFormat("int a compl b;"); 16418 verifyFormat("int a not b;"); 16419 verifyFormat("int a not_eq b;"); 16420 verifyFormat("int a or b;"); 16421 verifyFormat("int a xor b;"); 16422 verifyFormat("int a xor_eq b;"); 16423 verifyFormat("return this not_eq bitand other;"); 16424 verifyFormat("bool operator not_eq(const X bitand other)"); 16425 16426 verifyFormat("int a and 5;"); 16427 verifyFormat("int a and_eq 5;"); 16428 verifyFormat("int a bitand 5;"); 16429 verifyFormat("int a bitor 5;"); 16430 verifyFormat("int a compl 5;"); 16431 verifyFormat("int a not 5;"); 16432 verifyFormat("int a not_eq 5;"); 16433 verifyFormat("int a or 5;"); 16434 verifyFormat("int a xor 5;"); 16435 verifyFormat("int a xor_eq 5;"); 16436 16437 verifyFormat("int a compl(5);"); 16438 verifyFormat("int a not(5);"); 16439 16440 /* FIXME handle alternate tokens 16441 * https://en.cppreference.com/w/cpp/language/operator_alternative 16442 // alternative tokens 16443 verifyFormat("compl foo();"); // ~foo(); 16444 verifyFormat("foo() <%%>;"); // foo(); 16445 verifyFormat("void foo() <%%>;"); // void foo(){} 16446 verifyFormat("int a <:1:>;"); // int a[1];[ 16447 verifyFormat("%:define ABC abc"); // #define ABC abc 16448 verifyFormat("%:%:"); // ## 16449 */ 16450 } 16451 16452 TEST_F(FormatTest, STLWhileNotDefineChed) { 16453 verifyFormat("#if defined(while)\n" 16454 "#define while EMIT WARNING C4005\n" 16455 "#endif // while"); 16456 } 16457 16458 TEST_F(FormatTest, OperatorSpacing) { 16459 FormatStyle Style = getLLVMStyle(); 16460 Style.PointerAlignment = FormatStyle::PAS_Right; 16461 verifyFormat("Foo::operator*();", Style); 16462 verifyFormat("Foo::operator void *();", Style); 16463 verifyFormat("Foo::operator void **();", Style); 16464 verifyFormat("Foo::operator void *&();", Style); 16465 verifyFormat("Foo::operator void *&&();", Style); 16466 verifyFormat("Foo::operator()(void *);", Style); 16467 verifyFormat("Foo::operator*(void *);", Style); 16468 verifyFormat("Foo::operator*();", Style); 16469 verifyFormat("Foo::operator**();", Style); 16470 verifyFormat("Foo::operator&();", Style); 16471 verifyFormat("Foo::operator<int> *();", Style); 16472 verifyFormat("Foo::operator<Foo> *();", Style); 16473 verifyFormat("Foo::operator<int> **();", Style); 16474 verifyFormat("Foo::operator<Foo> **();", Style); 16475 verifyFormat("Foo::operator<int> &();", Style); 16476 verifyFormat("Foo::operator<Foo> &();", Style); 16477 verifyFormat("Foo::operator<int> &&();", Style); 16478 verifyFormat("Foo::operator<Foo> &&();", Style); 16479 verifyFormat("Foo::operator<int> *&();", Style); 16480 verifyFormat("Foo::operator<Foo> *&();", Style); 16481 verifyFormat("Foo::operator<int> *&&();", Style); 16482 verifyFormat("Foo::operator<Foo> *&&();", Style); 16483 verifyFormat("operator*(int (*)(), class Foo);", Style); 16484 16485 verifyFormat("Foo::operator&();", Style); 16486 verifyFormat("Foo::operator void &();", Style); 16487 verifyFormat("Foo::operator()(void &);", Style); 16488 verifyFormat("Foo::operator&(void &);", Style); 16489 verifyFormat("Foo::operator&();", Style); 16490 verifyFormat("operator&(int (&)(), class Foo);", Style); 16491 16492 verifyFormat("Foo::operator&&();", Style); 16493 verifyFormat("Foo::operator**();", Style); 16494 verifyFormat("Foo::operator void &&();", Style); 16495 verifyFormat("Foo::operator()(void &&);", Style); 16496 verifyFormat("Foo::operator&&(void &&);", Style); 16497 verifyFormat("Foo::operator&&();", Style); 16498 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 16499 verifyFormat("operator const nsTArrayRight<E> &()", Style); 16500 verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()", 16501 Style); 16502 verifyFormat("operator void **()", Style); 16503 verifyFormat("operator const FooRight<Object> &()", Style); 16504 verifyFormat("operator const FooRight<Object> *()", Style); 16505 verifyFormat("operator const FooRight<Object> **()", Style); 16506 verifyFormat("operator const FooRight<Object> *&()", Style); 16507 verifyFormat("operator const FooRight<Object> *&&()", Style); 16508 16509 Style.PointerAlignment = FormatStyle::PAS_Left; 16510 verifyFormat("Foo::operator*();", Style); 16511 verifyFormat("Foo::operator**();", Style); 16512 verifyFormat("Foo::operator void*();", Style); 16513 verifyFormat("Foo::operator void**();", Style); 16514 verifyFormat("Foo::operator void*&();", Style); 16515 verifyFormat("Foo::operator/*comment*/ void*();", Style); 16516 verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style); 16517 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style); 16518 verifyFormat("Foo::operator()(void*);", Style); 16519 verifyFormat("Foo::operator*(void*);", Style); 16520 verifyFormat("Foo::operator*();", Style); 16521 verifyFormat("Foo::operator<int>*();", Style); 16522 verifyFormat("Foo::operator<Foo>*();", Style); 16523 verifyFormat("Foo::operator<int>**();", Style); 16524 verifyFormat("Foo::operator<Foo>**();", Style); 16525 verifyFormat("Foo::operator<Foo>*&();", Style); 16526 verifyFormat("Foo::operator<int>&();", Style); 16527 verifyFormat("Foo::operator<Foo>&();", Style); 16528 verifyFormat("Foo::operator<int>&&();", Style); 16529 verifyFormat("Foo::operator<Foo>&&();", Style); 16530 verifyFormat("Foo::operator<int>*&();", Style); 16531 verifyFormat("Foo::operator<Foo>*&();", Style); 16532 verifyFormat("operator*(int (*)(), class Foo);", Style); 16533 16534 verifyFormat("Foo::operator&();", Style); 16535 verifyFormat("Foo::operator void&();", Style); 16536 verifyFormat("Foo::operator/*comment*/ void&();", Style); 16537 verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style); 16538 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style); 16539 verifyFormat("Foo::operator()(void&);", Style); 16540 verifyFormat("Foo::operator&(void&);", Style); 16541 verifyFormat("Foo::operator&();", Style); 16542 verifyFormat("operator&(int (&)(), class Foo);", Style); 16543 16544 verifyFormat("Foo::operator&&();", Style); 16545 verifyFormat("Foo::operator void&&();", Style); 16546 verifyFormat("Foo::operator/*comment*/ void&&();", Style); 16547 verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style); 16548 verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style); 16549 verifyFormat("Foo::operator()(void&&);", Style); 16550 verifyFormat("Foo::operator&&(void&&);", Style); 16551 verifyFormat("Foo::operator&&();", Style); 16552 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 16553 verifyFormat("operator const nsTArrayLeft<E>&()", Style); 16554 verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()", 16555 Style); 16556 verifyFormat("operator void**()", Style); 16557 verifyFormat("operator const FooLeft<Object>&()", Style); 16558 verifyFormat("operator const FooLeft<Object>*()", Style); 16559 verifyFormat("operator const FooLeft<Object>**()", Style); 16560 verifyFormat("operator const FooLeft<Object>*&()", Style); 16561 verifyFormat("operator const FooLeft<Object>*&&()", Style); 16562 16563 // PR45107 16564 verifyFormat("operator Vector<String>&();", Style); 16565 verifyFormat("operator const Vector<String>&();", Style); 16566 verifyFormat("operator foo::Bar*();", Style); 16567 verifyFormat("operator const Foo<X>::Bar<Y>*();", Style); 16568 verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();", 16569 Style); 16570 16571 Style.PointerAlignment = FormatStyle::PAS_Middle; 16572 verifyFormat("Foo::operator*();", Style); 16573 verifyFormat("Foo::operator void *();", Style); 16574 verifyFormat("Foo::operator()(void *);", Style); 16575 verifyFormat("Foo::operator*(void *);", Style); 16576 verifyFormat("Foo::operator*();", Style); 16577 verifyFormat("operator*(int (*)(), class Foo);", Style); 16578 16579 verifyFormat("Foo::operator&();", Style); 16580 verifyFormat("Foo::operator void &();", Style); 16581 verifyFormat("Foo::operator()(void &);", Style); 16582 verifyFormat("Foo::operator&(void &);", Style); 16583 verifyFormat("Foo::operator&();", Style); 16584 verifyFormat("operator&(int (&)(), class Foo);", Style); 16585 16586 verifyFormat("Foo::operator&&();", Style); 16587 verifyFormat("Foo::operator void &&();", Style); 16588 verifyFormat("Foo::operator()(void &&);", Style); 16589 verifyFormat("Foo::operator&&(void &&);", Style); 16590 verifyFormat("Foo::operator&&();", Style); 16591 verifyFormat("operator&&(int(&&)(), class Foo);", Style); 16592 } 16593 16594 TEST_F(FormatTest, OperatorPassedAsAFunctionPtr) { 16595 FormatStyle Style = getLLVMStyle(); 16596 // PR46157 16597 verifyFormat("foo(operator+, -42);", Style); 16598 verifyFormat("foo(operator++, -42);", Style); 16599 verifyFormat("foo(operator--, -42);", Style); 16600 verifyFormat("foo(-42, operator--);", Style); 16601 verifyFormat("foo(-42, operator, );", Style); 16602 verifyFormat("foo(operator, , -42);", Style); 16603 } 16604 16605 TEST_F(FormatTest, WhitespaceSensitiveMacros) { 16606 FormatStyle Style = getLLVMStyle(); 16607 Style.WhitespaceSensitiveMacros.push_back("FOO"); 16608 16609 // Don't use the helpers here, since 'mess up' will change the whitespace 16610 // and these are all whitespace sensitive by definition 16611 EXPECT_EQ("FOO(String-ized&Messy+But(: :Still)=Intentional);", 16612 format("FOO(String-ized&Messy+But(: :Still)=Intentional);", Style)); 16613 EXPECT_EQ( 16614 "FOO(String-ized&Messy+But\\(: :Still)=Intentional);", 16615 format("FOO(String-ized&Messy+But\\(: :Still)=Intentional);", Style)); 16616 EXPECT_EQ("FOO(String-ized&Messy+But,: :Still=Intentional);", 16617 format("FOO(String-ized&Messy+But,: :Still=Intentional);", Style)); 16618 EXPECT_EQ("FOO(String-ized&Messy+But,: :\n" 16619 " Still=Intentional);", 16620 format("FOO(String-ized&Messy+But,: :\n" 16621 " Still=Intentional);", 16622 Style)); 16623 Style.AlignConsecutiveAssignments = true; 16624 EXPECT_EQ("FOO(String-ized=&Messy+But,: :\n" 16625 " Still=Intentional);", 16626 format("FOO(String-ized=&Messy+But,: :\n" 16627 " Still=Intentional);", 16628 Style)); 16629 16630 Style.ColumnLimit = 21; 16631 EXPECT_EQ("FOO(String-ized&Messy+But: :Still=Intentional);", 16632 format("FOO(String-ized&Messy+But: :Still=Intentional);", Style)); 16633 } 16634 16635 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) { 16636 // These tests are not in NamespaceFixer because that doesn't 16637 // test its interaction with line wrapping 16638 FormatStyle Style = getLLVMStyle(); 16639 Style.ColumnLimit = 80; 16640 verifyFormat("namespace {\n" 16641 "int i;\n" 16642 "int j;\n" 16643 "} // namespace", 16644 Style); 16645 16646 verifyFormat("namespace AAA {\n" 16647 "int i;\n" 16648 "int j;\n" 16649 "} // namespace AAA", 16650 Style); 16651 16652 EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n" 16653 "int i;\n" 16654 "int j;\n" 16655 "} // namespace Averyveryveryverylongnamespace", 16656 format("namespace Averyveryveryverylongnamespace {\n" 16657 "int i;\n" 16658 "int j;\n" 16659 "}", 16660 Style)); 16661 16662 EXPECT_EQ( 16663 "namespace " 16664 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 16665 " went::mad::now {\n" 16666 "int i;\n" 16667 "int j;\n" 16668 "} // namespace\n" 16669 " // " 16670 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 16671 "went::mad::now", 16672 format("namespace " 16673 "would::it::save::you::a::lot::of::time::if_::i::" 16674 "just::gave::up::and_::went::mad::now {\n" 16675 "int i;\n" 16676 "int j;\n" 16677 "}", 16678 Style)); 16679 16680 // This used to duplicate the comment again and again on subsequent runs 16681 EXPECT_EQ( 16682 "namespace " 16683 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n" 16684 " went::mad::now {\n" 16685 "int i;\n" 16686 "int j;\n" 16687 "} // namespace\n" 16688 " // " 16689 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::" 16690 "went::mad::now", 16691 format("namespace " 16692 "would::it::save::you::a::lot::of::time::if_::i::" 16693 "just::gave::up::and_::went::mad::now {\n" 16694 "int i;\n" 16695 "int j;\n" 16696 "} // namespace\n" 16697 " // " 16698 "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::" 16699 "and_::went::mad::now", 16700 Style)); 16701 } 16702 16703 TEST_F(FormatTest, LikelyUnlikely) { 16704 FormatStyle Style = getLLVMStyle(); 16705 16706 verifyFormat("if (argc > 5) [[unlikely]] {\n" 16707 " return 29;\n" 16708 "}", 16709 Style); 16710 16711 verifyFormat("if (argc > 5) [[likely]] {\n" 16712 " return 29;\n" 16713 "}", 16714 Style); 16715 16716 verifyFormat("if (argc > 5) [[unlikely]] {\n" 16717 " return 29;\n" 16718 "} else [[likely]] {\n" 16719 " return 42;\n" 16720 "}\n", 16721 Style); 16722 16723 verifyFormat("if (argc > 5) [[unlikely]] {\n" 16724 " return 29;\n" 16725 "} else if (argc > 10) [[likely]] {\n" 16726 " return 99;\n" 16727 "} else {\n" 16728 " return 42;\n" 16729 "}\n", 16730 Style); 16731 16732 verifyFormat("if (argc > 5) [[gnu::unused]] {\n" 16733 " return 29;\n" 16734 "}", 16735 Style); 16736 } 16737 16738 TEST_F(FormatTest, LLVMDefaultStyle) { 16739 FormatStyle Style = getLLVMStyle(); 16740 verifyFormat("extern \"C\" {\n" 16741 "int foo();\n" 16742 "}", 16743 Style); 16744 } 16745 TEST_F(FormatTest, GNUDefaultStyle) { 16746 FormatStyle Style = getGNUStyle(); 16747 verifyFormat("extern \"C\"\n" 16748 "{\n" 16749 " int foo ();\n" 16750 "}", 16751 Style); 16752 } 16753 TEST_F(FormatTest, MozillaDefaultStyle) { 16754 FormatStyle Style = getMozillaStyle(); 16755 verifyFormat("extern \"C\"\n" 16756 "{\n" 16757 " int foo();\n" 16758 "}", 16759 Style); 16760 } 16761 TEST_F(FormatTest, GoogleDefaultStyle) { 16762 FormatStyle Style = getGoogleStyle(); 16763 verifyFormat("extern \"C\" {\n" 16764 "int foo();\n" 16765 "}", 16766 Style); 16767 } 16768 TEST_F(FormatTest, ChromiumDefaultStyle) { 16769 FormatStyle Style = getChromiumStyle(FormatStyle::LanguageKind::LK_Cpp); 16770 verifyFormat("extern \"C\" {\n" 16771 "int foo();\n" 16772 "}", 16773 Style); 16774 } 16775 TEST_F(FormatTest, MicrosoftDefaultStyle) { 16776 FormatStyle Style = getMicrosoftStyle(FormatStyle::LanguageKind::LK_Cpp); 16777 verifyFormat("extern \"C\"\n" 16778 "{\n" 16779 " int foo();\n" 16780 "}", 16781 Style); 16782 } 16783 TEST_F(FormatTest, WebKitDefaultStyle) { 16784 FormatStyle Style = getWebKitStyle(); 16785 verifyFormat("extern \"C\" {\n" 16786 "int foo();\n" 16787 "}", 16788 Style); 16789 } 16790 } // namespace 16791 } // namespace format 16792 } // namespace clang 16793