1 //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "clang/Format/Format.h" 10 11 #include "../Tooling/ReplacementTest.h" 12 #include "FormatTestUtils.h" 13 14 #include "clang/Frontend/TextDiagnosticPrinter.h" 15 #include "llvm/Support/Debug.h" 16 #include "llvm/Support/MemoryBuffer.h" 17 #include "gtest/gtest.h" 18 19 #define DEBUG_TYPE "format-test" 20 21 using clang::tooling::ReplacementTest; 22 using clang::tooling::toReplacements; 23 24 namespace clang { 25 namespace format { 26 namespace { 27 28 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); } 29 30 class FormatTest : public ::testing::Test { 31 protected: 32 enum StatusCheck { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck }; 33 34 std::string format(llvm::StringRef Code, 35 const FormatStyle &Style = getLLVMStyle(), 36 StatusCheck CheckComplete = SC_ExpectComplete) { 37 LLVM_DEBUG(llvm::errs() << "---\n"); 38 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 39 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size())); 40 FormattingAttemptStatus Status; 41 tooling::Replacements Replaces = 42 reformat(Style, Code, Ranges, "<stdin>", &Status); 43 if (CheckComplete != SC_DoNotCheck) { 44 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete; 45 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete) 46 << Code << "\n\n"; 47 } 48 ReplacementCount = Replaces.size(); 49 auto Result = applyAllReplacements(Code, Replaces); 50 EXPECT_TRUE(static_cast<bool>(Result)); 51 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 52 return *Result; 53 } 54 55 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) { 56 Style.ColumnLimit = ColumnLimit; 57 return Style; 58 } 59 60 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) { 61 return getStyleWithColumns(getLLVMStyle(), ColumnLimit); 62 } 63 64 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) { 65 return getStyleWithColumns(getGoogleStyle(), ColumnLimit); 66 } 67 68 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code, 69 const FormatStyle &Style = getLLVMStyle()) { 70 EXPECT_EQ(Expected.str(), format(Expected, Style)) 71 << "Expected code is not stable"; 72 EXPECT_EQ(Expected.str(), format(Code, Style)); 73 if (Style.Language == FormatStyle::LK_Cpp) { 74 // Objective-C++ is a superset of C++, so everything checked for C++ 75 // needs to be checked for Objective-C++ as well. 76 FormatStyle ObjCStyle = Style; 77 ObjCStyle.Language = FormatStyle::LK_ObjC; 78 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle)); 79 } 80 } 81 82 void verifyFormat(llvm::StringRef Code, 83 const FormatStyle &Style = getLLVMStyle()) { 84 verifyFormat(Code, test::messUp(Code), Style); 85 } 86 87 void verifyIncompleteFormat(llvm::StringRef Code, 88 const FormatStyle &Style = getLLVMStyle()) { 89 EXPECT_EQ(Code.str(), 90 format(test::messUp(Code), Style, SC_ExpectIncomplete)); 91 } 92 93 void verifyGoogleFormat(llvm::StringRef Code) { 94 verifyFormat(Code, getGoogleStyle()); 95 } 96 97 void verifyIndependentOfContext(llvm::StringRef text) { 98 verifyFormat(text); 99 verifyFormat(llvm::Twine("void f() { " + text + " }").str()); 100 } 101 102 /// \brief Verify that clang-format does not crash on the given input. 103 void verifyNoCrash(llvm::StringRef Code, 104 const FormatStyle &Style = getLLVMStyle()) { 105 format(Code, Style, SC_DoNotCheck); 106 } 107 108 int ReplacementCount; 109 }; 110 111 TEST_F(FormatTest, MessUp) { 112 EXPECT_EQ("1 2 3", test::messUp("1 2 3")); 113 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n")); 114 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc")); 115 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc")); 116 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne")); 117 } 118 119 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) { 120 EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language); 121 } 122 123 TEST_F(FormatTest, LLVMStyleOverride) { 124 EXPECT_EQ(FormatStyle::LK_Proto, 125 getLLVMStyle(FormatStyle::LK_Proto).Language); 126 } 127 128 //===----------------------------------------------------------------------===// 129 // Basic function tests. 130 //===----------------------------------------------------------------------===// 131 132 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) { 133 EXPECT_EQ(";", format(";")); 134 } 135 136 TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 137 EXPECT_EQ("int i;", format(" int i;")); 138 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;")); 139 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 140 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 141 } 142 143 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 144 EXPECT_EQ("int i;", format("int\ni;")); 145 } 146 147 TEST_F(FormatTest, FormatsNestedBlockStatements) { 148 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}")); 149 } 150 151 TEST_F(FormatTest, FormatsNestedCall) { 152 verifyFormat("Method(f1, f2(f3));"); 153 verifyFormat("Method(f1(f2, f3()));"); 154 verifyFormat("Method(f1(f2, (f3())));"); 155 } 156 157 TEST_F(FormatTest, NestedNameSpecifiers) { 158 verifyFormat("vector<::Type> v;"); 159 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); 160 verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); 161 verifyFormat("bool a = 2 < ::SomeFunction();"); 162 verifyFormat("ALWAYS_INLINE ::std::string getName();"); 163 verifyFormat("some::string getName();"); 164 } 165 166 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { 167 EXPECT_EQ("if (a) {\n" 168 " f();\n" 169 "}", 170 format("if(a){f();}")); 171 EXPECT_EQ(4, ReplacementCount); 172 EXPECT_EQ("if (a) {\n" 173 " f();\n" 174 "}", 175 format("if (a) {\n" 176 " f();\n" 177 "}")); 178 EXPECT_EQ(0, ReplacementCount); 179 EXPECT_EQ("/*\r\n" 180 "\r\n" 181 "*/\r\n", 182 format("/*\r\n" 183 "\r\n" 184 "*/\r\n")); 185 EXPECT_EQ(0, ReplacementCount); 186 } 187 188 TEST_F(FormatTest, RemovesEmptyLines) { 189 EXPECT_EQ("class C {\n" 190 " int i;\n" 191 "};", 192 format("class C {\n" 193 " int i;\n" 194 "\n" 195 "};")); 196 197 // Don't remove empty lines at the start of namespaces or extern "C" blocks. 198 EXPECT_EQ("namespace N {\n" 199 "\n" 200 "int i;\n" 201 "}", 202 format("namespace N {\n" 203 "\n" 204 "int i;\n" 205 "}", 206 getGoogleStyle())); 207 EXPECT_EQ("/* something */ namespace N {\n" 208 "\n" 209 "int i;\n" 210 "}", 211 format("/* something */ namespace N {\n" 212 "\n" 213 "int i;\n" 214 "}", 215 getGoogleStyle())); 216 EXPECT_EQ("inline namespace N {\n" 217 "\n" 218 "int i;\n" 219 "}", 220 format("inline namespace N {\n" 221 "\n" 222 "int i;\n" 223 "}", 224 getGoogleStyle())); 225 EXPECT_EQ("/* something */ inline namespace N {\n" 226 "\n" 227 "int i;\n" 228 "}", 229 format("/* something */ inline namespace N {\n" 230 "\n" 231 "int i;\n" 232 "}", 233 getGoogleStyle())); 234 EXPECT_EQ("export namespace N {\n" 235 "\n" 236 "int i;\n" 237 "}", 238 format("export namespace N {\n" 239 "\n" 240 "int i;\n" 241 "}", 242 getGoogleStyle())); 243 EXPECT_EQ("extern /**/ \"C\" /**/ {\n" 244 "\n" 245 "int i;\n" 246 "}", 247 format("extern /**/ \"C\" /**/ {\n" 248 "\n" 249 "int i;\n" 250 "}", 251 getGoogleStyle())); 252 253 // ...but do keep inlining and removing empty lines for non-block extern "C" 254 // functions. 255 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); 256 EXPECT_EQ("extern \"C\" int f() {\n" 257 " int i = 42;\n" 258 " return i;\n" 259 "}", 260 format("extern \"C\" int f() {\n" 261 "\n" 262 " int i = 42;\n" 263 " return i;\n" 264 "}", 265 getGoogleStyle())); 266 267 // Remove empty lines at the beginning and end of blocks. 268 EXPECT_EQ("void f() {\n" 269 "\n" 270 " if (a) {\n" 271 "\n" 272 " f();\n" 273 " }\n" 274 "}", 275 format("void f() {\n" 276 "\n" 277 " if (a) {\n" 278 "\n" 279 " f();\n" 280 "\n" 281 " }\n" 282 "\n" 283 "}", 284 getLLVMStyle())); 285 EXPECT_EQ("void f() {\n" 286 " if (a) {\n" 287 " f();\n" 288 " }\n" 289 "}", 290 format("void f() {\n" 291 "\n" 292 " if (a) {\n" 293 "\n" 294 " f();\n" 295 "\n" 296 " }\n" 297 "\n" 298 "}", 299 getGoogleStyle())); 300 301 // Don't remove empty lines in more complex control statements. 302 EXPECT_EQ("void f() {\n" 303 " if (a) {\n" 304 " f();\n" 305 "\n" 306 " } else if (b) {\n" 307 " f();\n" 308 " }\n" 309 "}", 310 format("void f() {\n" 311 " if (a) {\n" 312 " f();\n" 313 "\n" 314 " } else if (b) {\n" 315 " f();\n" 316 "\n" 317 " }\n" 318 "\n" 319 "}")); 320 321 // Don't remove empty lines before namespace endings. 322 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 323 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 324 EXPECT_EQ("namespace {\n" 325 "int i;\n" 326 "\n" 327 "}", 328 format("namespace {\n" 329 "int i;\n" 330 "\n" 331 "}", 332 LLVMWithNoNamespaceFix)); 333 EXPECT_EQ("namespace {\n" 334 "int i;\n" 335 "}", 336 format("namespace {\n" 337 "int i;\n" 338 "}", 339 LLVMWithNoNamespaceFix)); 340 EXPECT_EQ("namespace {\n" 341 "int i;\n" 342 "\n" 343 "};", 344 format("namespace {\n" 345 "int i;\n" 346 "\n" 347 "};", 348 LLVMWithNoNamespaceFix)); 349 EXPECT_EQ("namespace {\n" 350 "int i;\n" 351 "};", 352 format("namespace {\n" 353 "int i;\n" 354 "};", 355 LLVMWithNoNamespaceFix)); 356 EXPECT_EQ("namespace {\n" 357 "int i;\n" 358 "\n" 359 "}", 360 format("namespace {\n" 361 "int i;\n" 362 "\n" 363 "}")); 364 EXPECT_EQ("namespace {\n" 365 "int i;\n" 366 "\n" 367 "} // namespace", 368 format("namespace {\n" 369 "int i;\n" 370 "\n" 371 "} // namespace")); 372 373 FormatStyle Style = getLLVMStyle(); 374 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 375 Style.MaxEmptyLinesToKeep = 2; 376 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 377 Style.BraceWrapping.AfterClass = true; 378 Style.BraceWrapping.AfterFunction = true; 379 Style.KeepEmptyLinesAtTheStartOfBlocks = false; 380 381 EXPECT_EQ("class Foo\n" 382 "{\n" 383 " Foo() {}\n" 384 "\n" 385 " void funk() {}\n" 386 "};", 387 format("class Foo\n" 388 "{\n" 389 " Foo()\n" 390 " {\n" 391 " }\n" 392 "\n" 393 " void funk() {}\n" 394 "};", 395 Style)); 396 } 397 398 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) { 399 verifyFormat("x = (a) and (b);"); 400 verifyFormat("x = (a) or (b);"); 401 verifyFormat("x = (a) bitand (b);"); 402 verifyFormat("x = (a) bitor (b);"); 403 verifyFormat("x = (a) not_eq (b);"); 404 verifyFormat("x = (a) and_eq (b);"); 405 verifyFormat("x = (a) or_eq (b);"); 406 verifyFormat("x = (a) xor (b);"); 407 } 408 409 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) { 410 verifyFormat("x = compl(a);"); 411 verifyFormat("x = not(a);"); 412 verifyFormat("x = bitand(a);"); 413 // Unary operator must not be merged with the next identifier 414 verifyFormat("x = compl a;"); 415 verifyFormat("x = not a;"); 416 verifyFormat("x = bitand a;"); 417 } 418 419 //===----------------------------------------------------------------------===// 420 // Tests for control statements. 421 //===----------------------------------------------------------------------===// 422 423 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) { 424 verifyFormat("if (true)\n f();\ng();"); 425 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();"); 426 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();"); 427 verifyFormat("if constexpr (true)\n" 428 " f();\ng();"); 429 verifyFormat("if CONSTEXPR (true)\n" 430 " f();\ng();"); 431 verifyFormat("if constexpr (a)\n" 432 " if constexpr (b)\n" 433 " if constexpr (c)\n" 434 " g();\n" 435 "h();"); 436 verifyFormat("if CONSTEXPR (a)\n" 437 " if CONSTEXPR (b)\n" 438 " if CONSTEXPR (c)\n" 439 " g();\n" 440 "h();"); 441 verifyFormat("if constexpr (a)\n" 442 " if constexpr (b) {\n" 443 " f();\n" 444 " }\n" 445 "g();"); 446 verifyFormat("if CONSTEXPR (a)\n" 447 " if CONSTEXPR (b) {\n" 448 " f();\n" 449 " }\n" 450 "g();"); 451 452 FormatStyle AllowsMergedIf = getLLVMStyle(); 453 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 454 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 455 FormatStyle::SIS_WithoutElse; 456 verifyFormat("if (a)\n" 457 " // comment\n" 458 " f();", 459 AllowsMergedIf); 460 verifyFormat("{\n" 461 " if (a)\n" 462 " label:\n" 463 " f();\n" 464 "}", 465 AllowsMergedIf); 466 verifyFormat("#define A \\\n" 467 " if (a) \\\n" 468 " label: \\\n" 469 " f()", 470 AllowsMergedIf); 471 verifyFormat("if (a)\n" 472 " ;", 473 AllowsMergedIf); 474 verifyFormat("if (a)\n" 475 " if (b) return;", 476 AllowsMergedIf); 477 478 verifyFormat("if (a) // Can't merge this\n" 479 " f();\n", 480 AllowsMergedIf); 481 verifyFormat("if (a) /* still don't merge */\n" 482 " f();", 483 AllowsMergedIf); 484 verifyFormat("if (a) { // Never merge this\n" 485 " f();\n" 486 "}", 487 AllowsMergedIf); 488 verifyFormat("if (a) { /* Never merge this */\n" 489 " f();\n" 490 "}", 491 AllowsMergedIf); 492 493 AllowsMergedIf.ColumnLimit = 14; 494 verifyFormat("if (a) return;", AllowsMergedIf); 495 verifyFormat("if (aaaaaaaaa)\n" 496 " return;", 497 AllowsMergedIf); 498 499 AllowsMergedIf.ColumnLimit = 13; 500 verifyFormat("if (a)\n return;", AllowsMergedIf); 501 } 502 503 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) { 504 FormatStyle AllowsMergedIf = getLLVMStyle(); 505 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left; 506 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 507 FormatStyle::SIS_WithoutElse; 508 verifyFormat("if (a)\n" 509 " f();\n" 510 "else {\n" 511 " g();\n" 512 "}", 513 AllowsMergedIf); 514 verifyFormat("if (a)\n" 515 " f();\n" 516 "else\n" 517 " g();\n", 518 AllowsMergedIf); 519 520 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 521 522 verifyFormat("if (a) f();\n" 523 "else {\n" 524 " g();\n" 525 "}", 526 AllowsMergedIf); 527 verifyFormat("if (a) f();\n" 528 "else {\n" 529 " if (a) f();\n" 530 " else {\n" 531 " g();\n" 532 " }\n" 533 " g();\n" 534 "}", 535 AllowsMergedIf); 536 } 537 538 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) { 539 FormatStyle AllowsMergedLoops = getLLVMStyle(); 540 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true; 541 verifyFormat("while (true) continue;", AllowsMergedLoops); 542 verifyFormat("for (;;) continue;", AllowsMergedLoops); 543 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops); 544 verifyFormat("while (true)\n" 545 " ;", 546 AllowsMergedLoops); 547 verifyFormat("for (;;)\n" 548 " ;", 549 AllowsMergedLoops); 550 verifyFormat("for (;;)\n" 551 " for (;;) continue;", 552 AllowsMergedLoops); 553 verifyFormat("for (;;) // Can't merge this\n" 554 " continue;", 555 AllowsMergedLoops); 556 verifyFormat("for (;;) /* still don't merge */\n" 557 " continue;", 558 AllowsMergedLoops); 559 } 560 561 TEST_F(FormatTest, FormatShortBracedStatements) { 562 FormatStyle AllowSimpleBracedStatements = getLLVMStyle(); 563 AllowSimpleBracedStatements.ColumnLimit = 40; 564 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = 565 FormatStyle::SBS_Always; 566 567 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 568 FormatStyle::SIS_WithoutElse; 569 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 570 571 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom; 572 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true; 573 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false; 574 575 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 576 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 577 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 578 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 579 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 580 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 581 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 582 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 583 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 584 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 585 verifyFormat("if (true) {\n" 586 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 587 "}", 588 AllowSimpleBracedStatements); 589 verifyFormat("if (true) { //\n" 590 " f();\n" 591 "}", 592 AllowSimpleBracedStatements); 593 verifyFormat("if (true) {\n" 594 " f();\n" 595 " f();\n" 596 "}", 597 AllowSimpleBracedStatements); 598 verifyFormat("if (true) {\n" 599 " f();\n" 600 "} else {\n" 601 " f();\n" 602 "}", 603 AllowSimpleBracedStatements); 604 605 verifyFormat("struct A2 {\n" 606 " int X;\n" 607 "};", 608 AllowSimpleBracedStatements); 609 verifyFormat("typedef struct A2 {\n" 610 " int X;\n" 611 "} A2_t;", 612 AllowSimpleBracedStatements); 613 verifyFormat("template <int> struct A2 {\n" 614 " struct B {};\n" 615 "};", 616 AllowSimpleBracedStatements); 617 618 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 619 FormatStyle::SIS_Never; 620 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 621 verifyFormat("if (true) {\n" 622 " f();\n" 623 "}", 624 AllowSimpleBracedStatements); 625 verifyFormat("if (true) {\n" 626 " f();\n" 627 "} else {\n" 628 " f();\n" 629 "}", 630 AllowSimpleBracedStatements); 631 632 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 633 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 634 verifyFormat("while (true) {\n" 635 " f();\n" 636 "}", 637 AllowSimpleBracedStatements); 638 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 639 verifyFormat("for (;;) {\n" 640 " f();\n" 641 "}", 642 AllowSimpleBracedStatements); 643 644 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 645 FormatStyle::SIS_WithoutElse; 646 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true; 647 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true; 648 649 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 650 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements); 651 verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements); 652 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 653 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 654 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements); 655 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements); 656 verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements); 657 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements); 658 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements); 659 verifyFormat("if (true)\n" 660 "{\n" 661 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n" 662 "}", 663 AllowSimpleBracedStatements); 664 verifyFormat("if (true)\n" 665 "{ //\n" 666 " f();\n" 667 "}", 668 AllowSimpleBracedStatements); 669 verifyFormat("if (true)\n" 670 "{\n" 671 " f();\n" 672 " f();\n" 673 "}", 674 AllowSimpleBracedStatements); 675 verifyFormat("if (true)\n" 676 "{\n" 677 " f();\n" 678 "} else\n" 679 "{\n" 680 " f();\n" 681 "}", 682 AllowSimpleBracedStatements); 683 684 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = 685 FormatStyle::SIS_Never; 686 verifyFormat("if (true) {}", AllowSimpleBracedStatements); 687 verifyFormat("if (true)\n" 688 "{\n" 689 " f();\n" 690 "}", 691 AllowSimpleBracedStatements); 692 verifyFormat("if (true)\n" 693 "{\n" 694 " f();\n" 695 "} else\n" 696 "{\n" 697 " f();\n" 698 "}", 699 AllowSimpleBracedStatements); 700 701 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false; 702 verifyFormat("while (true) {}", AllowSimpleBracedStatements); 703 verifyFormat("while (true)\n" 704 "{\n" 705 " f();\n" 706 "}", 707 AllowSimpleBracedStatements); 708 verifyFormat("for (;;) {}", AllowSimpleBracedStatements); 709 verifyFormat("for (;;)\n" 710 "{\n" 711 " f();\n" 712 "}", 713 AllowSimpleBracedStatements); 714 } 715 716 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) { 717 FormatStyle Style = getLLVMStyleWithColumns(60); 718 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 719 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 720 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 721 EXPECT_EQ("#define A \\\n" 722 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n" 723 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n" 724 "X;", 725 format("#define A \\\n" 726 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n" 727 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n" 728 " }\n" 729 "X;", 730 Style)); 731 } 732 733 TEST_F(FormatTest, ParseIfElse) { 734 verifyFormat("if (true)\n" 735 " if (true)\n" 736 " if (true)\n" 737 " f();\n" 738 " else\n" 739 " g();\n" 740 " else\n" 741 " h();\n" 742 "else\n" 743 " i();"); 744 verifyFormat("if (true)\n" 745 " if (true)\n" 746 " if (true) {\n" 747 " if (true)\n" 748 " f();\n" 749 " } else {\n" 750 " g();\n" 751 " }\n" 752 " else\n" 753 " h();\n" 754 "else {\n" 755 " i();\n" 756 "}"); 757 verifyFormat("if (true)\n" 758 " if constexpr (true)\n" 759 " if (true) {\n" 760 " if constexpr (true)\n" 761 " f();\n" 762 " } else {\n" 763 " g();\n" 764 " }\n" 765 " else\n" 766 " h();\n" 767 "else {\n" 768 " i();\n" 769 "}"); 770 verifyFormat("if (true)\n" 771 " if CONSTEXPR (true)\n" 772 " if (true) {\n" 773 " if CONSTEXPR (true)\n" 774 " f();\n" 775 " } else {\n" 776 " g();\n" 777 " }\n" 778 " else\n" 779 " h();\n" 780 "else {\n" 781 " i();\n" 782 "}"); 783 verifyFormat("void f() {\n" 784 " if (a) {\n" 785 " } else {\n" 786 " }\n" 787 "}"); 788 } 789 790 TEST_F(FormatTest, ElseIf) { 791 verifyFormat("if (a) {\n} else if (b) {\n}"); 792 verifyFormat("if (a)\n" 793 " f();\n" 794 "else if (b)\n" 795 " g();\n" 796 "else\n" 797 " h();"); 798 verifyFormat("if constexpr (a)\n" 799 " f();\n" 800 "else if constexpr (b)\n" 801 " g();\n" 802 "else\n" 803 " h();"); 804 verifyFormat("if CONSTEXPR (a)\n" 805 " f();\n" 806 "else if CONSTEXPR (b)\n" 807 " g();\n" 808 "else\n" 809 " h();"); 810 verifyFormat("if (a) {\n" 811 " f();\n" 812 "}\n" 813 "// or else ..\n" 814 "else {\n" 815 " g()\n" 816 "}"); 817 818 verifyFormat("if (a) {\n" 819 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 821 "}"); 822 verifyFormat("if (a) {\n" 823 "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 824 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 825 "}"); 826 verifyFormat("if (a) {\n" 827 "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 829 "}"); 830 verifyFormat("if (a) {\n" 831 "} else if (\n" 832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 833 "}", 834 getLLVMStyleWithColumns(62)); 835 verifyFormat("if (a) {\n" 836 "} else if constexpr (\n" 837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 838 "}", 839 getLLVMStyleWithColumns(62)); 840 verifyFormat("if (a) {\n" 841 "} else if CONSTEXPR (\n" 842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 843 "}", 844 getLLVMStyleWithColumns(62)); 845 } 846 847 TEST_F(FormatTest, FormatsForLoop) { 848 verifyFormat( 849 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 850 " ++VeryVeryLongLoopVariable)\n" 851 " ;"); 852 verifyFormat("for (;;)\n" 853 " f();"); 854 verifyFormat("for (;;) {\n}"); 855 verifyFormat("for (;;) {\n" 856 " f();\n" 857 "}"); 858 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}"); 859 860 verifyFormat( 861 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 862 " E = UnwrappedLines.end();\n" 863 " I != E; ++I) {\n}"); 864 865 verifyFormat( 866 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n" 867 " ++IIIII) {\n}"); 868 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n" 869 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n" 870 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}"); 871 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n" 872 " I = FD->getDeclsInPrototypeScope().begin(),\n" 873 " E = FD->getDeclsInPrototypeScope().end();\n" 874 " I != E; ++I) {\n}"); 875 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n" 876 " I = Container.begin(),\n" 877 " E = Container.end();\n" 878 " I != E; ++I) {\n}", 879 getLLVMStyleWithColumns(76)); 880 881 verifyFormat( 882 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 883 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n" 884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 886 " ++aaaaaaaaaaa) {\n}"); 887 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 888 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n" 889 " ++i) {\n}"); 890 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n" 891 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 892 "}"); 893 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n" 894 " aaaaaaaaaa);\n" 895 " iter; ++iter) {\n" 896 "}"); 897 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 899 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n" 900 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {"); 901 902 // These should not be formatted as Objective-C for-in loops. 903 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}"); 904 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}"); 905 verifyFormat("Foo *x;\nfor (x in y) {\n}"); 906 verifyFormat( 907 "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}"); 908 909 FormatStyle NoBinPacking = getLLVMStyle(); 910 NoBinPacking.BinPackParameters = false; 911 verifyFormat("for (int aaaaaaaaaaa = 1;\n" 912 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n" 913 " aaaaaaaaaaaaaaaa,\n" 914 " aaaaaaaaaaaaaaaa,\n" 915 " aaaaaaaaaaaaaaaa);\n" 916 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n" 917 "}", 918 NoBinPacking); 919 verifyFormat( 920 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n" 921 " E = UnwrappedLines.end();\n" 922 " I != E;\n" 923 " ++I) {\n}", 924 NoBinPacking); 925 926 FormatStyle AlignLeft = getLLVMStyle(); 927 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 928 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft); 929 } 930 931 TEST_F(FormatTest, RangeBasedForLoops) { 932 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 934 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n" 935 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}"); 936 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n" 937 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 938 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n" 939 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}"); 940 } 941 942 TEST_F(FormatTest, ForEachLoops) { 943 verifyFormat("void f() {\n" 944 " foreach (Item *item, itemlist) {}\n" 945 " Q_FOREACH (Item *item, itemlist) {}\n" 946 " BOOST_FOREACH (Item *item, itemlist) {}\n" 947 " UNKNOWN_FORACH(Item * item, itemlist) {}\n" 948 "}"); 949 950 // As function-like macros. 951 verifyFormat("#define foreach(x, y)\n" 952 "#define Q_FOREACH(x, y)\n" 953 "#define BOOST_FOREACH(x, y)\n" 954 "#define UNKNOWN_FOREACH(x, y)\n"); 955 956 // Not as function-like macros. 957 verifyFormat("#define foreach (x, y)\n" 958 "#define Q_FOREACH (x, y)\n" 959 "#define BOOST_FOREACH (x, y)\n" 960 "#define UNKNOWN_FOREACH (x, y)\n"); 961 } 962 963 TEST_F(FormatTest, FormatsWhileLoop) { 964 verifyFormat("while (true) {\n}"); 965 verifyFormat("while (true)\n" 966 " f();"); 967 verifyFormat("while () {\n}"); 968 verifyFormat("while () {\n" 969 " f();\n" 970 "}"); 971 } 972 973 TEST_F(FormatTest, FormatsDoWhile) { 974 verifyFormat("do {\n" 975 " do_something();\n" 976 "} while (something());"); 977 verifyFormat("do\n" 978 " do_something();\n" 979 "while (something());"); 980 } 981 982 TEST_F(FormatTest, FormatsSwitchStatement) { 983 verifyFormat("switch (x) {\n" 984 "case 1:\n" 985 " f();\n" 986 " break;\n" 987 "case kFoo:\n" 988 "case ns::kBar:\n" 989 "case kBaz:\n" 990 " break;\n" 991 "default:\n" 992 " g();\n" 993 " break;\n" 994 "}"); 995 verifyFormat("switch (x) {\n" 996 "case 1: {\n" 997 " f();\n" 998 " break;\n" 999 "}\n" 1000 "case 2: {\n" 1001 " break;\n" 1002 "}\n" 1003 "}"); 1004 verifyFormat("switch (x) {\n" 1005 "case 1: {\n" 1006 " f();\n" 1007 " {\n" 1008 " g();\n" 1009 " h();\n" 1010 " }\n" 1011 " break;\n" 1012 "}\n" 1013 "}"); 1014 verifyFormat("switch (x) {\n" 1015 "case 1: {\n" 1016 " f();\n" 1017 " if (foo) {\n" 1018 " g();\n" 1019 " h();\n" 1020 " }\n" 1021 " break;\n" 1022 "}\n" 1023 "}"); 1024 verifyFormat("switch (x) {\n" 1025 "case 1: {\n" 1026 " f();\n" 1027 " g();\n" 1028 "} break;\n" 1029 "}"); 1030 verifyFormat("switch (test)\n" 1031 " ;"); 1032 verifyFormat("switch (x) {\n" 1033 "default: {\n" 1034 " // Do nothing.\n" 1035 "}\n" 1036 "}"); 1037 verifyFormat("switch (x) {\n" 1038 "// comment\n" 1039 "// if 1, do f()\n" 1040 "case 1:\n" 1041 " f();\n" 1042 "}"); 1043 verifyFormat("switch (x) {\n" 1044 "case 1:\n" 1045 " // Do amazing stuff\n" 1046 " {\n" 1047 " f();\n" 1048 " g();\n" 1049 " }\n" 1050 " break;\n" 1051 "}"); 1052 verifyFormat("#define A \\\n" 1053 " switch (x) { \\\n" 1054 " case a: \\\n" 1055 " foo = b; \\\n" 1056 " }", 1057 getLLVMStyleWithColumns(20)); 1058 verifyFormat("#define OPERATION_CASE(name) \\\n" 1059 " case OP_name: \\\n" 1060 " return operations::Operation##name\n", 1061 getLLVMStyleWithColumns(40)); 1062 verifyFormat("switch (x) {\n" 1063 "case 1:;\n" 1064 "default:;\n" 1065 " int i;\n" 1066 "}"); 1067 1068 verifyGoogleFormat("switch (x) {\n" 1069 " case 1:\n" 1070 " f();\n" 1071 " break;\n" 1072 " case kFoo:\n" 1073 " case ns::kBar:\n" 1074 " case kBaz:\n" 1075 " break;\n" 1076 " default:\n" 1077 " g();\n" 1078 " break;\n" 1079 "}"); 1080 verifyGoogleFormat("switch (x) {\n" 1081 " case 1: {\n" 1082 " f();\n" 1083 " break;\n" 1084 " }\n" 1085 "}"); 1086 verifyGoogleFormat("switch (test)\n" 1087 " ;"); 1088 1089 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n" 1090 " case OP_name: \\\n" 1091 " return operations::Operation##name\n"); 1092 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n" 1093 " // Get the correction operation class.\n" 1094 " switch (OpCode) {\n" 1095 " CASE(Add);\n" 1096 " CASE(Subtract);\n" 1097 " default:\n" 1098 " return operations::Unknown;\n" 1099 " }\n" 1100 "#undef OPERATION_CASE\n" 1101 "}"); 1102 verifyFormat("DEBUG({\n" 1103 " switch (x) {\n" 1104 " case A:\n" 1105 " f();\n" 1106 " break;\n" 1107 " // fallthrough\n" 1108 " case B:\n" 1109 " g();\n" 1110 " break;\n" 1111 " }\n" 1112 "});"); 1113 EXPECT_EQ("DEBUG({\n" 1114 " switch (x) {\n" 1115 " case A:\n" 1116 " f();\n" 1117 " break;\n" 1118 " // On B:\n" 1119 " case B:\n" 1120 " g();\n" 1121 " break;\n" 1122 " }\n" 1123 "});", 1124 format("DEBUG({\n" 1125 " switch (x) {\n" 1126 " case A:\n" 1127 " f();\n" 1128 " break;\n" 1129 " // On B:\n" 1130 " case B:\n" 1131 " g();\n" 1132 " break;\n" 1133 " }\n" 1134 "});", 1135 getLLVMStyle())); 1136 EXPECT_EQ("switch (n) {\n" 1137 "case 0: {\n" 1138 " return false;\n" 1139 "}\n" 1140 "default: {\n" 1141 " return true;\n" 1142 "}\n" 1143 "}", 1144 format("switch (n)\n" 1145 "{\n" 1146 "case 0: {\n" 1147 " return false;\n" 1148 "}\n" 1149 "default: {\n" 1150 " return true;\n" 1151 "}\n" 1152 "}", 1153 getLLVMStyle())); 1154 verifyFormat("switch (a) {\n" 1155 "case (b):\n" 1156 " return;\n" 1157 "}"); 1158 1159 verifyFormat("switch (a) {\n" 1160 "case some_namespace::\n" 1161 " some_constant:\n" 1162 " return;\n" 1163 "}", 1164 getLLVMStyleWithColumns(34)); 1165 1166 FormatStyle Style = getLLVMStyle(); 1167 Style.IndentCaseLabels = true; 1168 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 1169 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1170 Style.BraceWrapping.AfterCaseLabel = true; 1171 Style.BraceWrapping.AfterControlStatement = true; 1172 EXPECT_EQ("switch (n)\n" 1173 "{\n" 1174 " case 0:\n" 1175 " {\n" 1176 " return false;\n" 1177 " }\n" 1178 " default:\n" 1179 " {\n" 1180 " return true;\n" 1181 " }\n" 1182 "}", 1183 format("switch (n) {\n" 1184 " case 0: {\n" 1185 " return false;\n" 1186 " }\n" 1187 " default: {\n" 1188 " return true;\n" 1189 " }\n" 1190 "}", 1191 Style)); 1192 Style.BraceWrapping.AfterCaseLabel = false; 1193 EXPECT_EQ("switch (n)\n" 1194 "{\n" 1195 " case 0: {\n" 1196 " return false;\n" 1197 " }\n" 1198 " default: {\n" 1199 " return true;\n" 1200 " }\n" 1201 "}", 1202 format("switch (n) {\n" 1203 " case 0:\n" 1204 " {\n" 1205 " return false;\n" 1206 " }\n" 1207 " default:\n" 1208 " {\n" 1209 " return true;\n" 1210 " }\n" 1211 "}", 1212 Style)); 1213 } 1214 1215 TEST_F(FormatTest, CaseRanges) { 1216 verifyFormat("switch (x) {\n" 1217 "case 'A' ... 'Z':\n" 1218 "case 1 ... 5:\n" 1219 "case a ... b:\n" 1220 " break;\n" 1221 "}"); 1222 } 1223 1224 TEST_F(FormatTest, ShortCaseLabels) { 1225 FormatStyle Style = getLLVMStyle(); 1226 Style.AllowShortCaseLabelsOnASingleLine = true; 1227 verifyFormat("switch (a) {\n" 1228 "case 1: x = 1; break;\n" 1229 "case 2: return;\n" 1230 "case 3:\n" 1231 "case 4:\n" 1232 "case 5: return;\n" 1233 "case 6: // comment\n" 1234 " return;\n" 1235 "case 7:\n" 1236 " // comment\n" 1237 " return;\n" 1238 "case 8:\n" 1239 " x = 8; // comment\n" 1240 " break;\n" 1241 "default: y = 1; break;\n" 1242 "}", 1243 Style); 1244 verifyFormat("switch (a) {\n" 1245 "case 0: return; // comment\n" 1246 "case 1: break; // comment\n" 1247 "case 2: return;\n" 1248 "// comment\n" 1249 "case 3: return;\n" 1250 "// comment 1\n" 1251 "// comment 2\n" 1252 "// comment 3\n" 1253 "case 4: break; /* comment */\n" 1254 "case 5:\n" 1255 " // comment\n" 1256 " break;\n" 1257 "case 6: /* comment */ x = 1; break;\n" 1258 "case 7: x = /* comment */ 1; break;\n" 1259 "case 8:\n" 1260 " x = 1; /* comment */\n" 1261 " break;\n" 1262 "case 9:\n" 1263 " break; // comment line 1\n" 1264 " // comment line 2\n" 1265 "}", 1266 Style); 1267 EXPECT_EQ("switch (a) {\n" 1268 "case 1:\n" 1269 " x = 8;\n" 1270 " // fall through\n" 1271 "case 2: x = 8;\n" 1272 "// comment\n" 1273 "case 3:\n" 1274 " return; /* comment line 1\n" 1275 " * comment line 2 */\n" 1276 "case 4: i = 8;\n" 1277 "// something else\n" 1278 "#if FOO\n" 1279 "case 5: break;\n" 1280 "#endif\n" 1281 "}", 1282 format("switch (a) {\n" 1283 "case 1: x = 8;\n" 1284 " // fall through\n" 1285 "case 2:\n" 1286 " x = 8;\n" 1287 "// comment\n" 1288 "case 3:\n" 1289 " return; /* comment line 1\n" 1290 " * comment line 2 */\n" 1291 "case 4:\n" 1292 " i = 8;\n" 1293 "// something else\n" 1294 "#if FOO\n" 1295 "case 5: break;\n" 1296 "#endif\n" 1297 "}", 1298 Style)); 1299 EXPECT_EQ("switch (a) {\n" 1300 "case 0:\n" 1301 " return; // long long long long long long long long long long " 1302 "long long comment\n" 1303 " // line\n" 1304 "}", 1305 format("switch (a) {\n" 1306 "case 0: return; // long long long long long long long long " 1307 "long long long long comment line\n" 1308 "}", 1309 Style)); 1310 EXPECT_EQ("switch (a) {\n" 1311 "case 0:\n" 1312 " return; /* long long long long long long long long long long " 1313 "long long comment\n" 1314 " line */\n" 1315 "}", 1316 format("switch (a) {\n" 1317 "case 0: return; /* long long long long long long long long " 1318 "long long long long comment line */\n" 1319 "}", 1320 Style)); 1321 verifyFormat("switch (a) {\n" 1322 "#if FOO\n" 1323 "case 0: return 0;\n" 1324 "#endif\n" 1325 "}", 1326 Style); 1327 verifyFormat("switch (a) {\n" 1328 "case 1: {\n" 1329 "}\n" 1330 "case 2: {\n" 1331 " return;\n" 1332 "}\n" 1333 "case 3: {\n" 1334 " x = 1;\n" 1335 " return;\n" 1336 "}\n" 1337 "case 4:\n" 1338 " if (x)\n" 1339 " return;\n" 1340 "}", 1341 Style); 1342 Style.ColumnLimit = 21; 1343 verifyFormat("switch (a) {\n" 1344 "case 1: x = 1; break;\n" 1345 "case 2: return;\n" 1346 "case 3:\n" 1347 "case 4:\n" 1348 "case 5: return;\n" 1349 "default:\n" 1350 " y = 1;\n" 1351 " break;\n" 1352 "}", 1353 Style); 1354 Style.ColumnLimit = 80; 1355 Style.AllowShortCaseLabelsOnASingleLine = false; 1356 Style.IndentCaseLabels = true; 1357 EXPECT_EQ("switch (n) {\n" 1358 " default /*comments*/:\n" 1359 " return true;\n" 1360 " case 0:\n" 1361 " return false;\n" 1362 "}", 1363 format("switch (n) {\n" 1364 "default/*comments*/:\n" 1365 " return true;\n" 1366 "case 0:\n" 1367 " return false;\n" 1368 "}", 1369 Style)); 1370 Style.AllowShortCaseLabelsOnASingleLine = true; 1371 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1372 Style.BraceWrapping.AfterCaseLabel = true; 1373 Style.BraceWrapping.AfterControlStatement = true; 1374 EXPECT_EQ("switch (n)\n" 1375 "{\n" 1376 " case 0:\n" 1377 " {\n" 1378 " return false;\n" 1379 " }\n" 1380 " default:\n" 1381 " {\n" 1382 " return true;\n" 1383 " }\n" 1384 "}", 1385 format("switch (n) {\n" 1386 " case 0: {\n" 1387 " return false;\n" 1388 " }\n" 1389 " default:\n" 1390 " {\n" 1391 " return true;\n" 1392 " }\n" 1393 "}", 1394 Style)); 1395 } 1396 1397 TEST_F(FormatTest, FormatsLabels) { 1398 verifyFormat("void f() {\n" 1399 " some_code();\n" 1400 "test_label:\n" 1401 " some_other_code();\n" 1402 " {\n" 1403 " some_more_code();\n" 1404 " another_label:\n" 1405 " some_more_code();\n" 1406 " }\n" 1407 "}"); 1408 verifyFormat("{\n" 1409 " some_code();\n" 1410 "test_label:\n" 1411 " some_other_code();\n" 1412 "}"); 1413 verifyFormat("{\n" 1414 " some_code();\n" 1415 "test_label:;\n" 1416 " int i = 0;\n" 1417 "}"); 1418 FormatStyle Style = getLLVMStyle(); 1419 Style.IndentGotoLabels = false; 1420 verifyFormat("void f() {\n" 1421 " some_code();\n" 1422 "test_label:\n" 1423 " some_other_code();\n" 1424 " {\n" 1425 " some_more_code();\n" 1426 "another_label:\n" 1427 " some_more_code();\n" 1428 " }\n" 1429 "}", 1430 Style); 1431 verifyFormat("{\n" 1432 " some_code();\n" 1433 "test_label:\n" 1434 " some_other_code();\n" 1435 "}", 1436 Style); 1437 verifyFormat("{\n" 1438 " some_code();\n" 1439 "test_label:;\n" 1440 " int i = 0;\n" 1441 "}"); 1442 } 1443 1444 //===----------------------------------------------------------------------===// 1445 // Tests for classes, namespaces, etc. 1446 //===----------------------------------------------------------------------===// 1447 1448 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1449 verifyFormat("class A {};"); 1450 } 1451 1452 TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1453 verifyFormat("class A {\n" 1454 "public:\n" 1455 "public: // comment\n" 1456 "protected:\n" 1457 "private:\n" 1458 " void f() {}\n" 1459 "};"); 1460 verifyFormat("export class A {\n" 1461 "public:\n" 1462 "public: // comment\n" 1463 "protected:\n" 1464 "private:\n" 1465 " void f() {}\n" 1466 "};"); 1467 verifyGoogleFormat("class A {\n" 1468 " public:\n" 1469 " protected:\n" 1470 " private:\n" 1471 " void f() {}\n" 1472 "};"); 1473 verifyGoogleFormat("export class A {\n" 1474 " public:\n" 1475 " protected:\n" 1476 " private:\n" 1477 " void f() {}\n" 1478 "};"); 1479 verifyFormat("class A {\n" 1480 "public slots:\n" 1481 " void f1() {}\n" 1482 "public Q_SLOTS:\n" 1483 " void f2() {}\n" 1484 "protected slots:\n" 1485 " void f3() {}\n" 1486 "protected Q_SLOTS:\n" 1487 " void f4() {}\n" 1488 "private slots:\n" 1489 " void f5() {}\n" 1490 "private Q_SLOTS:\n" 1491 " void f6() {}\n" 1492 "signals:\n" 1493 " void g1();\n" 1494 "Q_SIGNALS:\n" 1495 " void g2();\n" 1496 "};"); 1497 1498 // Don't interpret 'signals' the wrong way. 1499 verifyFormat("signals.set();"); 1500 verifyFormat("for (Signals signals : f()) {\n}"); 1501 verifyFormat("{\n" 1502 " signals.set(); // This needs indentation.\n" 1503 "}"); 1504 verifyFormat("void f() {\n" 1505 "label:\n" 1506 " signals.baz();\n" 1507 "}"); 1508 } 1509 1510 TEST_F(FormatTest, SeparatesLogicalBlocks) { 1511 EXPECT_EQ("class A {\n" 1512 "public:\n" 1513 " void f();\n" 1514 "\n" 1515 "private:\n" 1516 " void g() {}\n" 1517 " // test\n" 1518 "protected:\n" 1519 " int h;\n" 1520 "};", 1521 format("class A {\n" 1522 "public:\n" 1523 "void f();\n" 1524 "private:\n" 1525 "void g() {}\n" 1526 "// test\n" 1527 "protected:\n" 1528 "int h;\n" 1529 "};")); 1530 EXPECT_EQ("class A {\n" 1531 "protected:\n" 1532 "public:\n" 1533 " void f();\n" 1534 "};", 1535 format("class A {\n" 1536 "protected:\n" 1537 "\n" 1538 "public:\n" 1539 "\n" 1540 " void f();\n" 1541 "};")); 1542 1543 // Even ensure proper spacing inside macros. 1544 EXPECT_EQ("#define B \\\n" 1545 " class A { \\\n" 1546 " protected: \\\n" 1547 " public: \\\n" 1548 " void f(); \\\n" 1549 " };", 1550 format("#define B \\\n" 1551 " class A { \\\n" 1552 " protected: \\\n" 1553 " \\\n" 1554 " public: \\\n" 1555 " \\\n" 1556 " void f(); \\\n" 1557 " };", 1558 getGoogleStyle())); 1559 // But don't remove empty lines after macros ending in access specifiers. 1560 EXPECT_EQ("#define A private:\n" 1561 "\n" 1562 "int i;", 1563 format("#define A private:\n" 1564 "\n" 1565 "int i;")); 1566 } 1567 1568 TEST_F(FormatTest, FormatsClasses) { 1569 verifyFormat("class A : public B {};"); 1570 verifyFormat("class A : public ::B {};"); 1571 1572 verifyFormat( 1573 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1574 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1575 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" 1576 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1577 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};"); 1578 verifyFormat( 1579 "class A : public B, public C, public D, public E, public F {};"); 1580 verifyFormat("class AAAAAAAAAAAA : public B,\n" 1581 " public C,\n" 1582 " public D,\n" 1583 " public E,\n" 1584 " public F,\n" 1585 " public G {};"); 1586 1587 verifyFormat("class\n" 1588 " ReallyReallyLongClassName {\n" 1589 " int i;\n" 1590 "};", 1591 getLLVMStyleWithColumns(32)); 1592 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n" 1593 " aaaaaaaaaaaaaaaa> {};"); 1594 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n" 1595 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n" 1596 " aaaaaaaaaaaaaaaaaaaaaa> {};"); 1597 verifyFormat("template <class R, class C>\n" 1598 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" 1599 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); 1600 verifyFormat("class ::A::B {};"); 1601 } 1602 1603 TEST_F(FormatTest, BreakInheritanceStyle) { 1604 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle(); 1605 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList = 1606 FormatStyle::BILS_BeforeComma; 1607 verifyFormat("class MyClass : public X {};", 1608 StyleWithInheritanceBreakBeforeComma); 1609 verifyFormat("class MyClass\n" 1610 " : public X\n" 1611 " , public Y {};", 1612 StyleWithInheritanceBreakBeforeComma); 1613 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n" 1614 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n" 1615 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1616 StyleWithInheritanceBreakBeforeComma); 1617 verifyFormat("struct aaaaaaaaaaaaa\n" 1618 " : public aaaaaaaaaaaaaaaaaaa< // break\n" 1619 " aaaaaaaaaaaaaaaa> {};", 1620 StyleWithInheritanceBreakBeforeComma); 1621 1622 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle(); 1623 StyleWithInheritanceBreakAfterColon.BreakInheritanceList = 1624 FormatStyle::BILS_AfterColon; 1625 verifyFormat("class MyClass : public X {};", 1626 StyleWithInheritanceBreakAfterColon); 1627 verifyFormat("class MyClass : public X, public Y {};", 1628 StyleWithInheritanceBreakAfterColon); 1629 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n" 1630 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" 1631 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};", 1632 StyleWithInheritanceBreakAfterColon); 1633 verifyFormat("struct aaaaaaaaaaaaa :\n" 1634 " public aaaaaaaaaaaaaaaaaaa< // break\n" 1635 " aaaaaaaaaaaaaaaa> {};", 1636 StyleWithInheritanceBreakAfterColon); 1637 } 1638 1639 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { 1640 verifyFormat("class A {\n} a, b;"); 1641 verifyFormat("struct A {\n} a, b;"); 1642 verifyFormat("union A {\n} a;"); 1643 } 1644 1645 TEST_F(FormatTest, FormatsEnum) { 1646 verifyFormat("enum {\n" 1647 " Zero,\n" 1648 " One = 1,\n" 1649 " Two = One + 1,\n" 1650 " Three = (One + Two),\n" 1651 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1652 " Five = (One, Two, Three, Four, 5)\n" 1653 "};"); 1654 verifyGoogleFormat("enum {\n" 1655 " Zero,\n" 1656 " One = 1,\n" 1657 " Two = One + 1,\n" 1658 " Three = (One + Two),\n" 1659 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1660 " Five = (One, Two, Three, Four, 5)\n" 1661 "};"); 1662 verifyFormat("enum Enum {};"); 1663 verifyFormat("enum {};"); 1664 verifyFormat("enum X E {} d;"); 1665 verifyFormat("enum __attribute__((...)) E {} d;"); 1666 verifyFormat("enum __declspec__((...)) E {} d;"); 1667 verifyFormat("enum {\n" 1668 " Bar = Foo<int, int>::value\n" 1669 "};", 1670 getLLVMStyleWithColumns(30)); 1671 1672 verifyFormat("enum ShortEnum { A, B, C };"); 1673 verifyGoogleFormat("enum ShortEnum { A, B, C };"); 1674 1675 EXPECT_EQ("enum KeepEmptyLines {\n" 1676 " ONE,\n" 1677 "\n" 1678 " TWO,\n" 1679 "\n" 1680 " THREE\n" 1681 "}", 1682 format("enum KeepEmptyLines {\n" 1683 " ONE,\n" 1684 "\n" 1685 " TWO,\n" 1686 "\n" 1687 "\n" 1688 " THREE\n" 1689 "}")); 1690 verifyFormat("enum E { // comment\n" 1691 " ONE,\n" 1692 " TWO\n" 1693 "};\n" 1694 "int i;"); 1695 // Not enums. 1696 verifyFormat("enum X f() {\n" 1697 " a();\n" 1698 " return 42;\n" 1699 "}"); 1700 verifyFormat("enum X Type::f() {\n" 1701 " a();\n" 1702 " return 42;\n" 1703 "}"); 1704 verifyFormat("enum ::X f() {\n" 1705 " a();\n" 1706 " return 42;\n" 1707 "}"); 1708 verifyFormat("enum ns::X f() {\n" 1709 " a();\n" 1710 " return 42;\n" 1711 "}"); 1712 } 1713 1714 TEST_F(FormatTest, FormatsEnumsWithErrors) { 1715 verifyFormat("enum Type {\n" 1716 " One = 0; // These semicolons should be commas.\n" 1717 " Two = 1;\n" 1718 "};"); 1719 verifyFormat("namespace n {\n" 1720 "enum Type {\n" 1721 " One,\n" 1722 " Two, // missing };\n" 1723 " int i;\n" 1724 "}\n" 1725 "void g() {}"); 1726 } 1727 1728 TEST_F(FormatTest, FormatsEnumStruct) { 1729 verifyFormat("enum struct {\n" 1730 " Zero,\n" 1731 " One = 1,\n" 1732 " Two = One + 1,\n" 1733 " Three = (One + Two),\n" 1734 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1735 " Five = (One, Two, Three, Four, 5)\n" 1736 "};"); 1737 verifyFormat("enum struct Enum {};"); 1738 verifyFormat("enum struct {};"); 1739 verifyFormat("enum struct X E {} d;"); 1740 verifyFormat("enum struct __attribute__((...)) E {} d;"); 1741 verifyFormat("enum struct __declspec__((...)) E {} d;"); 1742 verifyFormat("enum struct X f() {\n a();\n return 42;\n}"); 1743 } 1744 1745 TEST_F(FormatTest, FormatsEnumClass) { 1746 verifyFormat("enum class {\n" 1747 " Zero,\n" 1748 " One = 1,\n" 1749 " Two = One + 1,\n" 1750 " Three = (One + Two),\n" 1751 " Four = (Zero && (One ^ Two)) | (One << Two),\n" 1752 " Five = (One, Two, Three, Four, 5)\n" 1753 "};"); 1754 verifyFormat("enum class Enum {};"); 1755 verifyFormat("enum class {};"); 1756 verifyFormat("enum class X E {} d;"); 1757 verifyFormat("enum class __attribute__((...)) E {} d;"); 1758 verifyFormat("enum class __declspec__((...)) E {} d;"); 1759 verifyFormat("enum class X f() {\n a();\n return 42;\n}"); 1760 } 1761 1762 TEST_F(FormatTest, FormatsEnumTypes) { 1763 verifyFormat("enum X : int {\n" 1764 " A, // Force multiple lines.\n" 1765 " B\n" 1766 "};"); 1767 verifyFormat("enum X : int { A, B };"); 1768 verifyFormat("enum X : std::uint32_t { A, B };"); 1769 } 1770 1771 TEST_F(FormatTest, FormatsTypedefEnum) { 1772 FormatStyle Style = getLLVMStyle(); 1773 Style.ColumnLimit = 40; 1774 verifyFormat("typedef enum {} EmptyEnum;"); 1775 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1776 verifyFormat("typedef enum {\n" 1777 " ZERO = 0,\n" 1778 " ONE = 1,\n" 1779 " TWO = 2,\n" 1780 " THREE = 3\n" 1781 "} LongEnum;", 1782 Style); 1783 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 1784 Style.BraceWrapping.AfterEnum = true; 1785 verifyFormat("typedef enum {} EmptyEnum;"); 1786 verifyFormat("typedef enum { A, B, C } ShortEnum;"); 1787 verifyFormat("typedef enum\n" 1788 "{\n" 1789 " ZERO = 0,\n" 1790 " ONE = 1,\n" 1791 " TWO = 2,\n" 1792 " THREE = 3\n" 1793 "} LongEnum;", 1794 Style); 1795 } 1796 1797 TEST_F(FormatTest, FormatsNSEnums) { 1798 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1799 verifyGoogleFormat( 1800 "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }"); 1801 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n" 1802 " // Information about someDecentlyLongValue.\n" 1803 " someDecentlyLongValue,\n" 1804 " // Information about anotherDecentlyLongValue.\n" 1805 " anotherDecentlyLongValue,\n" 1806 " // Information about aThirdDecentlyLongValue.\n" 1807 " aThirdDecentlyLongValue\n" 1808 "};"); 1809 verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n" 1810 " // Information about someDecentlyLongValue.\n" 1811 " someDecentlyLongValue,\n" 1812 " // Information about anotherDecentlyLongValue.\n" 1813 " anotherDecentlyLongValue,\n" 1814 " // Information about aThirdDecentlyLongValue.\n" 1815 " aThirdDecentlyLongValue\n" 1816 "};"); 1817 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" 1818 " a = 1,\n" 1819 " b = 2,\n" 1820 " c = 3,\n" 1821 "};"); 1822 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" 1823 " a = 1,\n" 1824 " b = 2,\n" 1825 " c = 3,\n" 1826 "};"); 1827 verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n" 1828 " a = 1,\n" 1829 " b = 2,\n" 1830 " c = 3,\n" 1831 "};"); 1832 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" 1833 " a = 1,\n" 1834 " b = 2,\n" 1835 " c = 3,\n" 1836 "};"); 1837 } 1838 1839 TEST_F(FormatTest, FormatsBitfields) { 1840 verifyFormat("struct Bitfields {\n" 1841 " unsigned sClass : 8;\n" 1842 " unsigned ValueKind : 2;\n" 1843 "};"); 1844 verifyFormat("struct A {\n" 1845 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n" 1846 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n" 1847 "};"); 1848 verifyFormat("struct MyStruct {\n" 1849 " uchar data;\n" 1850 " uchar : 8;\n" 1851 " uchar : 8;\n" 1852 " uchar other;\n" 1853 "};"); 1854 } 1855 1856 TEST_F(FormatTest, FormatsNamespaces) { 1857 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle(); 1858 LLVMWithNoNamespaceFix.FixNamespaceComments = false; 1859 1860 verifyFormat("namespace some_namespace {\n" 1861 "class A {};\n" 1862 "void f() { f(); }\n" 1863 "}", 1864 LLVMWithNoNamespaceFix); 1865 verifyFormat("namespace N::inline D {\n" 1866 "class A {};\n" 1867 "void f() { f(); }\n" 1868 "}", 1869 LLVMWithNoNamespaceFix); 1870 verifyFormat("namespace N::inline D::E {\n" 1871 "class A {};\n" 1872 "void f() { f(); }\n" 1873 "}", 1874 LLVMWithNoNamespaceFix); 1875 verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n" 1876 "class A {};\n" 1877 "void f() { f(); }\n" 1878 "}", 1879 LLVMWithNoNamespaceFix); 1880 verifyFormat("/* something */ namespace some_namespace {\n" 1881 "class A {};\n" 1882 "void f() { f(); }\n" 1883 "}", 1884 LLVMWithNoNamespaceFix); 1885 verifyFormat("namespace {\n" 1886 "class A {};\n" 1887 "void f() { f(); }\n" 1888 "}", 1889 LLVMWithNoNamespaceFix); 1890 verifyFormat("/* something */ namespace {\n" 1891 "class A {};\n" 1892 "void f() { f(); }\n" 1893 "}", 1894 LLVMWithNoNamespaceFix); 1895 verifyFormat("inline namespace X {\n" 1896 "class A {};\n" 1897 "void f() { f(); }\n" 1898 "}", 1899 LLVMWithNoNamespaceFix); 1900 verifyFormat("/* something */ inline namespace X {\n" 1901 "class A {};\n" 1902 "void f() { f(); }\n" 1903 "}", 1904 LLVMWithNoNamespaceFix); 1905 verifyFormat("export namespace X {\n" 1906 "class A {};\n" 1907 "void f() { f(); }\n" 1908 "}", 1909 LLVMWithNoNamespaceFix); 1910 verifyFormat("using namespace some_namespace;\n" 1911 "class A {};\n" 1912 "void f() { f(); }", 1913 LLVMWithNoNamespaceFix); 1914 1915 // This code is more common than we thought; if we 1916 // layout this correctly the semicolon will go into 1917 // its own line, which is undesirable. 1918 verifyFormat("namespace {};", LLVMWithNoNamespaceFix); 1919 verifyFormat("namespace {\n" 1920 "class A {};\n" 1921 "};", 1922 LLVMWithNoNamespaceFix); 1923 1924 verifyFormat("namespace {\n" 1925 "int SomeVariable = 0; // comment\n" 1926 "} // namespace", 1927 LLVMWithNoNamespaceFix); 1928 EXPECT_EQ("#ifndef HEADER_GUARD\n" 1929 "#define HEADER_GUARD\n" 1930 "namespace my_namespace {\n" 1931 "int i;\n" 1932 "} // my_namespace\n" 1933 "#endif // HEADER_GUARD", 1934 format("#ifndef HEADER_GUARD\n" 1935 " #define HEADER_GUARD\n" 1936 " namespace my_namespace {\n" 1937 "int i;\n" 1938 "} // my_namespace\n" 1939 "#endif // HEADER_GUARD", 1940 LLVMWithNoNamespaceFix)); 1941 1942 EXPECT_EQ("namespace A::B {\n" 1943 "class C {};\n" 1944 "}", 1945 format("namespace A::B {\n" 1946 "class C {};\n" 1947 "}", 1948 LLVMWithNoNamespaceFix)); 1949 1950 FormatStyle Style = getLLVMStyle(); 1951 Style.NamespaceIndentation = FormatStyle::NI_All; 1952 EXPECT_EQ("namespace out {\n" 1953 " int i;\n" 1954 " namespace in {\n" 1955 " int i;\n" 1956 " } // namespace in\n" 1957 "} // namespace out", 1958 format("namespace out {\n" 1959 "int i;\n" 1960 "namespace in {\n" 1961 "int i;\n" 1962 "} // namespace in\n" 1963 "} // namespace out", 1964 Style)); 1965 1966 Style.NamespaceIndentation = FormatStyle::NI_Inner; 1967 EXPECT_EQ("namespace out {\n" 1968 "int i;\n" 1969 "namespace in {\n" 1970 " int i;\n" 1971 "} // namespace in\n" 1972 "} // namespace out", 1973 format("namespace out {\n" 1974 "int i;\n" 1975 "namespace in {\n" 1976 "int i;\n" 1977 "} // namespace in\n" 1978 "} // namespace out", 1979 Style)); 1980 } 1981 1982 TEST_F(FormatTest, NamespaceMacros) { 1983 FormatStyle Style = getLLVMStyle(); 1984 Style.NamespaceMacros.push_back("TESTSUITE"); 1985 1986 verifyFormat("TESTSUITE(A) {\n" 1987 "int foo();\n" 1988 "} // TESTSUITE(A)", 1989 Style); 1990 1991 verifyFormat("TESTSUITE(A, B) {\n" 1992 "int foo();\n" 1993 "} // TESTSUITE(A)", 1994 Style); 1995 1996 // Properly indent according to NamespaceIndentation style 1997 Style.NamespaceIndentation = FormatStyle::NI_All; 1998 verifyFormat("TESTSUITE(A) {\n" 1999 " int foo();\n" 2000 "} // TESTSUITE(A)", 2001 Style); 2002 verifyFormat("TESTSUITE(A) {\n" 2003 " namespace B {\n" 2004 " int foo();\n" 2005 " } // namespace B\n" 2006 "} // TESTSUITE(A)", 2007 Style); 2008 verifyFormat("namespace A {\n" 2009 " TESTSUITE(B) {\n" 2010 " int foo();\n" 2011 " } // TESTSUITE(B)\n" 2012 "} // namespace A", 2013 Style); 2014 2015 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2016 verifyFormat("TESTSUITE(A) {\n" 2017 "TESTSUITE(B) {\n" 2018 " int foo();\n" 2019 "} // TESTSUITE(B)\n" 2020 "} // TESTSUITE(A)", 2021 Style); 2022 verifyFormat("TESTSUITE(A) {\n" 2023 "namespace B {\n" 2024 " int foo();\n" 2025 "} // namespace B\n" 2026 "} // TESTSUITE(A)", 2027 Style); 2028 verifyFormat("namespace A {\n" 2029 "TESTSUITE(B) {\n" 2030 " int foo();\n" 2031 "} // TESTSUITE(B)\n" 2032 "} // namespace A", 2033 Style); 2034 2035 // Properly merge namespace-macros blocks in CompactNamespaces mode 2036 Style.NamespaceIndentation = FormatStyle::NI_None; 2037 Style.CompactNamespaces = true; 2038 verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n" 2039 "}} // TESTSUITE(A::B)", 2040 Style); 2041 2042 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2043 "}} // TESTSUITE(out::in)", 2044 format("TESTSUITE(out) {\n" 2045 "TESTSUITE(in) {\n" 2046 "} // TESTSUITE(in)\n" 2047 "} // TESTSUITE(out)", 2048 Style)); 2049 2050 EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n" 2051 "}} // TESTSUITE(out::in)", 2052 format("TESTSUITE(out) {\n" 2053 "TESTSUITE(in) {\n" 2054 "} // TESTSUITE(in)\n" 2055 "} // TESTSUITE(out)", 2056 Style)); 2057 2058 // Do not merge different namespaces/macros 2059 EXPECT_EQ("namespace out {\n" 2060 "TESTSUITE(in) {\n" 2061 "} // TESTSUITE(in)\n" 2062 "} // namespace out", 2063 format("namespace out {\n" 2064 "TESTSUITE(in) {\n" 2065 "} // TESTSUITE(in)\n" 2066 "} // namespace out", 2067 Style)); 2068 EXPECT_EQ("TESTSUITE(out) {\n" 2069 "namespace in {\n" 2070 "} // namespace in\n" 2071 "} // TESTSUITE(out)", 2072 format("TESTSUITE(out) {\n" 2073 "namespace in {\n" 2074 "} // namespace in\n" 2075 "} // TESTSUITE(out)", 2076 Style)); 2077 Style.NamespaceMacros.push_back("FOOBAR"); 2078 EXPECT_EQ("TESTSUITE(out) {\n" 2079 "FOOBAR(in) {\n" 2080 "} // FOOBAR(in)\n" 2081 "} // TESTSUITE(out)", 2082 format("TESTSUITE(out) {\n" 2083 "FOOBAR(in) {\n" 2084 "} // FOOBAR(in)\n" 2085 "} // TESTSUITE(out)", 2086 Style)); 2087 } 2088 2089 TEST_F(FormatTest, FormatsCompactNamespaces) { 2090 FormatStyle Style = getLLVMStyle(); 2091 Style.CompactNamespaces = true; 2092 Style.NamespaceMacros.push_back("TESTSUITE"); 2093 2094 verifyFormat("namespace A { namespace B {\n" 2095 "}} // namespace A::B", 2096 Style); 2097 2098 EXPECT_EQ("namespace out { namespace in {\n" 2099 "}} // namespace out::in", 2100 format("namespace out {\n" 2101 "namespace in {\n" 2102 "} // namespace in\n" 2103 "} // namespace out", 2104 Style)); 2105 2106 // Only namespaces which have both consecutive opening and end get compacted 2107 EXPECT_EQ("namespace out {\n" 2108 "namespace in1 {\n" 2109 "} // namespace in1\n" 2110 "namespace in2 {\n" 2111 "} // namespace in2\n" 2112 "} // namespace out", 2113 format("namespace out {\n" 2114 "namespace in1 {\n" 2115 "} // namespace in1\n" 2116 "namespace in2 {\n" 2117 "} // namespace in2\n" 2118 "} // namespace out", 2119 Style)); 2120 2121 EXPECT_EQ("namespace out {\n" 2122 "int i;\n" 2123 "namespace in {\n" 2124 "int j;\n" 2125 "} // namespace in\n" 2126 "int k;\n" 2127 "} // namespace out", 2128 format("namespace out { int i;\n" 2129 "namespace in { int j; } // namespace in\n" 2130 "int k; } // namespace out", 2131 Style)); 2132 2133 EXPECT_EQ("namespace A { namespace B { namespace C {\n" 2134 "}}} // namespace A::B::C\n", 2135 format("namespace A { namespace B {\n" 2136 "namespace C {\n" 2137 "}} // namespace B::C\n" 2138 "} // namespace A\n", 2139 Style)); 2140 2141 Style.ColumnLimit = 40; 2142 EXPECT_EQ("namespace aaaaaaaaaa {\n" 2143 "namespace bbbbbbbbbb {\n" 2144 "}} // namespace aaaaaaaaaa::bbbbbbbbbb", 2145 format("namespace aaaaaaaaaa {\n" 2146 "namespace bbbbbbbbbb {\n" 2147 "} // namespace bbbbbbbbbb\n" 2148 "} // namespace aaaaaaaaaa", 2149 Style)); 2150 2151 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n" 2152 "namespace cccccc {\n" 2153 "}}} // namespace aaaaaa::bbbbbb::cccccc", 2154 format("namespace aaaaaa {\n" 2155 "namespace bbbbbb {\n" 2156 "namespace cccccc {\n" 2157 "} // namespace cccccc\n" 2158 "} // namespace bbbbbb\n" 2159 "} // namespace aaaaaa", 2160 Style)); 2161 Style.ColumnLimit = 80; 2162 2163 // Extra semicolon after 'inner' closing brace prevents merging 2164 EXPECT_EQ("namespace out { namespace in {\n" 2165 "}; } // namespace out::in", 2166 format("namespace out {\n" 2167 "namespace in {\n" 2168 "}; // namespace in\n" 2169 "} // namespace out", 2170 Style)); 2171 2172 // Extra semicolon after 'outer' closing brace is conserved 2173 EXPECT_EQ("namespace out { namespace in {\n" 2174 "}}; // namespace out::in", 2175 format("namespace out {\n" 2176 "namespace in {\n" 2177 "} // namespace in\n" 2178 "}; // namespace out", 2179 Style)); 2180 2181 Style.NamespaceIndentation = FormatStyle::NI_All; 2182 EXPECT_EQ("namespace out { namespace in {\n" 2183 " int i;\n" 2184 "}} // namespace out::in", 2185 format("namespace out {\n" 2186 "namespace in {\n" 2187 "int i;\n" 2188 "} // namespace in\n" 2189 "} // namespace out", 2190 Style)); 2191 EXPECT_EQ("namespace out { namespace mid {\n" 2192 " namespace in {\n" 2193 " int j;\n" 2194 " } // namespace in\n" 2195 " int k;\n" 2196 "}} // namespace out::mid", 2197 format("namespace out { namespace mid {\n" 2198 "namespace in { int j; } // namespace in\n" 2199 "int k; }} // namespace out::mid", 2200 Style)); 2201 2202 Style.NamespaceIndentation = FormatStyle::NI_Inner; 2203 EXPECT_EQ("namespace out { namespace in {\n" 2204 " int i;\n" 2205 "}} // namespace out::in", 2206 format("namespace out {\n" 2207 "namespace in {\n" 2208 "int i;\n" 2209 "} // namespace in\n" 2210 "} // namespace out", 2211 Style)); 2212 EXPECT_EQ("namespace out { namespace mid { namespace in {\n" 2213 " int i;\n" 2214 "}}} // namespace out::mid::in", 2215 format("namespace out {\n" 2216 "namespace mid {\n" 2217 "namespace in {\n" 2218 "int i;\n" 2219 "} // namespace in\n" 2220 "} // namespace mid\n" 2221 "} // namespace out", 2222 Style)); 2223 } 2224 2225 TEST_F(FormatTest, FormatsExternC) { 2226 verifyFormat("extern \"C\" {\nint a;"); 2227 verifyFormat("extern \"C\" {}"); 2228 verifyFormat("extern \"C\" {\n" 2229 "int foo();\n" 2230 "}"); 2231 verifyFormat("extern \"C\" int foo() {}"); 2232 verifyFormat("extern \"C\" int foo();"); 2233 verifyFormat("extern \"C\" int foo() {\n" 2234 " int i = 42;\n" 2235 " return i;\n" 2236 "}"); 2237 2238 FormatStyle Style = getLLVMStyle(); 2239 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2240 Style.BraceWrapping.AfterFunction = true; 2241 verifyFormat("extern \"C\" int foo() {}", Style); 2242 verifyFormat("extern \"C\" int foo();", Style); 2243 verifyFormat("extern \"C\" int foo()\n" 2244 "{\n" 2245 " int i = 42;\n" 2246 " return i;\n" 2247 "}", 2248 Style); 2249 2250 Style.BraceWrapping.AfterExternBlock = true; 2251 Style.BraceWrapping.SplitEmptyRecord = false; 2252 verifyFormat("extern \"C\"\n" 2253 "{}", 2254 Style); 2255 verifyFormat("extern \"C\"\n" 2256 "{\n" 2257 " int foo();\n" 2258 "}", 2259 Style); 2260 } 2261 2262 TEST_F(FormatTest, FormatsInlineASM) { 2263 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); 2264 verifyFormat("asm(\"nop\" ::: \"memory\");"); 2265 verifyFormat( 2266 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" 2267 " \"cpuid\\n\\t\"\n" 2268 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" 2269 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" 2270 " : \"a\"(value));"); 2271 EXPECT_EQ( 2272 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2273 " __asm {\n" 2274 " mov edx,[that] // vtable in edx\n" 2275 " mov eax,methodIndex\n" 2276 " call [edx][eax*4] // stdcall\n" 2277 " }\n" 2278 "}", 2279 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" 2280 " __asm {\n" 2281 " mov edx,[that] // vtable in edx\n" 2282 " mov eax,methodIndex\n" 2283 " call [edx][eax*4] // stdcall\n" 2284 " }\n" 2285 "}")); 2286 EXPECT_EQ("_asm {\n" 2287 " xor eax, eax;\n" 2288 " cpuid;\n" 2289 "}", 2290 format("_asm {\n" 2291 " xor eax, eax;\n" 2292 " cpuid;\n" 2293 "}")); 2294 verifyFormat("void function() {\n" 2295 " // comment\n" 2296 " asm(\"\");\n" 2297 "}"); 2298 EXPECT_EQ("__asm {\n" 2299 "}\n" 2300 "int i;", 2301 format("__asm {\n" 2302 "}\n" 2303 "int i;")); 2304 } 2305 2306 TEST_F(FormatTest, FormatTryCatch) { 2307 verifyFormat("try {\n" 2308 " throw a * b;\n" 2309 "} catch (int a) {\n" 2310 " // Do nothing.\n" 2311 "} catch (...) {\n" 2312 " exit(42);\n" 2313 "}"); 2314 2315 // Function-level try statements. 2316 verifyFormat("int f() try { return 4; } catch (...) {\n" 2317 " return 5;\n" 2318 "}"); 2319 verifyFormat("class A {\n" 2320 " int a;\n" 2321 " A() try : a(0) {\n" 2322 " } catch (...) {\n" 2323 " throw;\n" 2324 " }\n" 2325 "};\n"); 2326 2327 // Incomplete try-catch blocks. 2328 verifyIncompleteFormat("try {} catch ("); 2329 } 2330 2331 TEST_F(FormatTest, FormatSEHTryCatch) { 2332 verifyFormat("__try {\n" 2333 " int a = b * c;\n" 2334 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n" 2335 " // Do nothing.\n" 2336 "}"); 2337 2338 verifyFormat("__try {\n" 2339 " int a = b * c;\n" 2340 "} __finally {\n" 2341 " // Do nothing.\n" 2342 "}"); 2343 2344 verifyFormat("DEBUG({\n" 2345 " __try {\n" 2346 " } __finally {\n" 2347 " }\n" 2348 "});\n"); 2349 } 2350 2351 TEST_F(FormatTest, IncompleteTryCatchBlocks) { 2352 verifyFormat("try {\n" 2353 " f();\n" 2354 "} catch {\n" 2355 " g();\n" 2356 "}"); 2357 verifyFormat("try {\n" 2358 " f();\n" 2359 "} catch (A a) MACRO(x) {\n" 2360 " g();\n" 2361 "} catch (B b) MACRO(x) {\n" 2362 " g();\n" 2363 "}"); 2364 } 2365 2366 TEST_F(FormatTest, FormatTryCatchBraceStyles) { 2367 FormatStyle Style = getLLVMStyle(); 2368 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla, 2369 FormatStyle::BS_WebKit}) { 2370 Style.BreakBeforeBraces = BraceStyle; 2371 verifyFormat("try {\n" 2372 " // something\n" 2373 "} catch (...) {\n" 2374 " // something\n" 2375 "}", 2376 Style); 2377 } 2378 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 2379 verifyFormat("try {\n" 2380 " // something\n" 2381 "}\n" 2382 "catch (...) {\n" 2383 " // something\n" 2384 "}", 2385 Style); 2386 verifyFormat("__try {\n" 2387 " // something\n" 2388 "}\n" 2389 "__finally {\n" 2390 " // something\n" 2391 "}", 2392 Style); 2393 verifyFormat("@try {\n" 2394 " // something\n" 2395 "}\n" 2396 "@finally {\n" 2397 " // something\n" 2398 "}", 2399 Style); 2400 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 2401 verifyFormat("try\n" 2402 "{\n" 2403 " // something\n" 2404 "}\n" 2405 "catch (...)\n" 2406 "{\n" 2407 " // something\n" 2408 "}", 2409 Style); 2410 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 2411 verifyFormat("try\n" 2412 " {\n" 2413 " // something white\n" 2414 " }\n" 2415 "catch (...)\n" 2416 " {\n" 2417 " // something white\n" 2418 " }", 2419 Style); 2420 Style.BreakBeforeBraces = FormatStyle::BS_GNU; 2421 verifyFormat("try\n" 2422 " {\n" 2423 " // something\n" 2424 " }\n" 2425 "catch (...)\n" 2426 " {\n" 2427 " // something\n" 2428 " }", 2429 Style); 2430 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2431 Style.BraceWrapping.BeforeCatch = true; 2432 verifyFormat("try {\n" 2433 " // something\n" 2434 "}\n" 2435 "catch (...) {\n" 2436 " // something\n" 2437 "}", 2438 Style); 2439 } 2440 2441 TEST_F(FormatTest, StaticInitializers) { 2442 verifyFormat("static SomeClass SC = {1, 'a'};"); 2443 2444 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n" 2445 " 100000000, " 2446 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};"); 2447 2448 // Here, everything other than the "}" would fit on a line. 2449 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" 2450 " 10000000000000000000000000};"); 2451 EXPECT_EQ("S s = {a,\n" 2452 "\n" 2453 " b};", 2454 format("S s = {\n" 2455 " a,\n" 2456 "\n" 2457 " b\n" 2458 "};")); 2459 2460 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first 2461 // line. However, the formatting looks a bit off and this probably doesn't 2462 // happen often in practice. 2463 verifyFormat("static int Variable[1] = {\n" 2464 " {1000000000000000000000000000000000000}};", 2465 getLLVMStyleWithColumns(40)); 2466 } 2467 2468 TEST_F(FormatTest, DesignatedInitializers) { 2469 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 2470 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n" 2471 " .bbbbbbbbbb = 2,\n" 2472 " .cccccccccc = 3,\n" 2473 " .dddddddddd = 4,\n" 2474 " .eeeeeeeeee = 5};"); 2475 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2476 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n" 2477 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n" 2478 " .ccccccccccccccccccccccccccc = 3,\n" 2479 " .ddddddddddddddddddddddddddd = 4,\n" 2480 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};"); 2481 2482 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};"); 2483 2484 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 2485 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n" 2486 " [2] = bbbbbbbbbb,\n" 2487 " [3] = cccccccccc,\n" 2488 " [4] = dddddddddd,\n" 2489 " [5] = eeeeeeeeee};"); 2490 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n" 2491 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2492 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 2493 " [3] = cccccccccccccccccccccccccccccccccccccc,\n" 2494 " [4] = dddddddddddddddddddddddddddddddddddddd,\n" 2495 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};"); 2496 } 2497 2498 TEST_F(FormatTest, NestedStaticInitializers) { 2499 verifyFormat("static A x = {{{}}};\n"); 2500 verifyFormat("static A x = {{{init1, init2, init3, init4},\n" 2501 " {init1, init2, init3, init4}}};", 2502 getLLVMStyleWithColumns(50)); 2503 2504 verifyFormat("somes Status::global_reps[3] = {\n" 2505 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2506 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2507 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};", 2508 getLLVMStyleWithColumns(60)); 2509 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n" 2510 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n" 2511 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n" 2512 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};"); 2513 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n" 2514 " {rect.fRight - rect.fLeft, rect.fBottom - " 2515 "rect.fTop}};"); 2516 2517 verifyFormat( 2518 "SomeArrayOfSomeType a = {\n" 2519 " {{1, 2, 3},\n" 2520 " {1, 2, 3},\n" 2521 " {111111111111111111111111111111, 222222222222222222222222222222,\n" 2522 " 333333333333333333333333333333},\n" 2523 " {1, 2, 3},\n" 2524 " {1, 2, 3}}};"); 2525 verifyFormat( 2526 "SomeArrayOfSomeType a = {\n" 2527 " {{1, 2, 3}},\n" 2528 " {{1, 2, 3}},\n" 2529 " {{111111111111111111111111111111, 222222222222222222222222222222,\n" 2530 " 333333333333333333333333333333}},\n" 2531 " {{1, 2, 3}},\n" 2532 " {{1, 2, 3}}};"); 2533 2534 verifyFormat("struct {\n" 2535 " unsigned bit;\n" 2536 " const char *const name;\n" 2537 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n" 2538 " {kOsWin, \"Windows\"},\n" 2539 " {kOsLinux, \"Linux\"},\n" 2540 " {kOsCrOS, \"Chrome OS\"}};"); 2541 verifyFormat("struct {\n" 2542 " unsigned bit;\n" 2543 " const char *const name;\n" 2544 "} kBitsToOs[] = {\n" 2545 " {kOsMac, \"Mac\"},\n" 2546 " {kOsWin, \"Windows\"},\n" 2547 " {kOsLinux, \"Linux\"},\n" 2548 " {kOsCrOS, \"Chrome OS\"},\n" 2549 "};"); 2550 } 2551 2552 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { 2553 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 2554 " \\\n" 2555 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)"); 2556 } 2557 2558 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) { 2559 verifyFormat("virtual void write(ELFWriter *writerrr,\n" 2560 " OwningPtr<FileOutputBuffer> &buffer) = 0;"); 2561 2562 // Do break defaulted and deleted functions. 2563 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2564 " default;", 2565 getLLVMStyleWithColumns(40)); 2566 verifyFormat("virtual void ~Deeeeeeeestructor() =\n" 2567 " delete;", 2568 getLLVMStyleWithColumns(40)); 2569 } 2570 2571 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) { 2572 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3", 2573 getLLVMStyleWithColumns(40)); 2574 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2575 getLLVMStyleWithColumns(40)); 2576 EXPECT_EQ("#define Q \\\n" 2577 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n" 2578 " \"aaaaaaaa.cpp\"", 2579 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"", 2580 getLLVMStyleWithColumns(40))); 2581 } 2582 2583 TEST_F(FormatTest, UnderstandsLinePPDirective) { 2584 EXPECT_EQ("# 123 \"A string literal\"", 2585 format(" # 123 \"A string literal\"")); 2586 } 2587 2588 TEST_F(FormatTest, LayoutUnknownPPDirective) { 2589 EXPECT_EQ("#;", format("#;")); 2590 verifyFormat("#\n;\n;\n;"); 2591 } 2592 2593 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) { 2594 EXPECT_EQ("#line 42 \"test\"\n", 2595 format("# \\\n line \\\n 42 \\\n \"test\"\n")); 2596 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n", 2597 getLLVMStyleWithColumns(12))); 2598 } 2599 2600 TEST_F(FormatTest, EndOfFileEndsPPDirective) { 2601 EXPECT_EQ("#line 42 \"test\"", 2602 format("# \\\n line \\\n 42 \\\n \"test\"")); 2603 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B")); 2604 } 2605 2606 TEST_F(FormatTest, DoesntRemoveUnknownTokens) { 2607 verifyFormat("#define A \\x20"); 2608 verifyFormat("#define A \\ x20"); 2609 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20")); 2610 verifyFormat("#define A ''"); 2611 verifyFormat("#define A ''qqq"); 2612 verifyFormat("#define A `qqq"); 2613 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");"); 2614 EXPECT_EQ("const char *c = STRINGIFY(\n" 2615 "\\na : b);", 2616 format("const char * c = STRINGIFY(\n" 2617 "\\na : b);")); 2618 2619 verifyFormat("a\r\\"); 2620 verifyFormat("a\v\\"); 2621 verifyFormat("a\f\\"); 2622 } 2623 2624 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) { 2625 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13)); 2626 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12)); 2627 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12)); 2628 // FIXME: We never break before the macro name. 2629 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12)); 2630 2631 verifyFormat("#define A A\n#define A A"); 2632 verifyFormat("#define A(X) A\n#define A A"); 2633 2634 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23)); 2635 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22)); 2636 } 2637 2638 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) { 2639 EXPECT_EQ("// somecomment\n" 2640 "#include \"a.h\"\n" 2641 "#define A( \\\n" 2642 " A, B)\n" 2643 "#include \"b.h\"\n" 2644 "// somecomment\n", 2645 format(" // somecomment\n" 2646 " #include \"a.h\"\n" 2647 "#define A(A,\\\n" 2648 " B)\n" 2649 " #include \"b.h\"\n" 2650 " // somecomment\n", 2651 getLLVMStyleWithColumns(13))); 2652 } 2653 2654 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); } 2655 2656 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) { 2657 EXPECT_EQ("#define A \\\n" 2658 " c; \\\n" 2659 " e;\n" 2660 "f;", 2661 format("#define A c; e;\n" 2662 "f;", 2663 getLLVMStyleWithColumns(14))); 2664 } 2665 2666 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); } 2667 2668 TEST_F(FormatTest, MacroDefinitionInsideStatement) { 2669 EXPECT_EQ("int x,\n" 2670 "#define A\n" 2671 " y;", 2672 format("int x,\n#define A\ny;")); 2673 } 2674 2675 TEST_F(FormatTest, HashInMacroDefinition) { 2676 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle())); 2677 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11)); 2678 verifyFormat("#define A \\\n" 2679 " { \\\n" 2680 " f(#c); \\\n" 2681 " }", 2682 getLLVMStyleWithColumns(11)); 2683 2684 verifyFormat("#define A(X) \\\n" 2685 " void function##X()", 2686 getLLVMStyleWithColumns(22)); 2687 2688 verifyFormat("#define A(a, b, c) \\\n" 2689 " void a##b##c()", 2690 getLLVMStyleWithColumns(22)); 2691 2692 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22)); 2693 } 2694 2695 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) { 2696 EXPECT_EQ("#define A (x)", format("#define A (x)")); 2697 EXPECT_EQ("#define A(x)", format("#define A(x)")); 2698 2699 FormatStyle Style = getLLVMStyle(); 2700 Style.SpaceBeforeParens = FormatStyle::SBPO_Never; 2701 verifyFormat("#define true ((foo)1)", Style); 2702 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 2703 verifyFormat("#define false((foo)0)", Style); 2704 } 2705 2706 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) { 2707 EXPECT_EQ("#define A b;", format("#define A \\\n" 2708 " \\\n" 2709 " b;", 2710 getLLVMStyleWithColumns(25))); 2711 EXPECT_EQ("#define A \\\n" 2712 " \\\n" 2713 " a; \\\n" 2714 " b;", 2715 format("#define A \\\n" 2716 " \\\n" 2717 " a; \\\n" 2718 " b;", 2719 getLLVMStyleWithColumns(11))); 2720 EXPECT_EQ("#define A \\\n" 2721 " a; \\\n" 2722 " \\\n" 2723 " b;", 2724 format("#define A \\\n" 2725 " a; \\\n" 2726 " \\\n" 2727 " b;", 2728 getLLVMStyleWithColumns(11))); 2729 } 2730 2731 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) { 2732 verifyIncompleteFormat("#define A :"); 2733 verifyFormat("#define SOMECASES \\\n" 2734 " case 1: \\\n" 2735 " case 2\n", 2736 getLLVMStyleWithColumns(20)); 2737 verifyFormat("#define MACRO(a) \\\n" 2738 " if (a) \\\n" 2739 " f(); \\\n" 2740 " else \\\n" 2741 " g()", 2742 getLLVMStyleWithColumns(18)); 2743 verifyFormat("#define A template <typename T>"); 2744 verifyIncompleteFormat("#define STR(x) #x\n" 2745 "f(STR(this_is_a_string_literal{));"); 2746 verifyFormat("#pragma omp threadprivate( \\\n" 2747 " y)), // expected-warning", 2748 getLLVMStyleWithColumns(28)); 2749 verifyFormat("#d, = };"); 2750 verifyFormat("#if \"a"); 2751 verifyIncompleteFormat("({\n" 2752 "#define b \\\n" 2753 " } \\\n" 2754 " a\n" 2755 "a", 2756 getLLVMStyleWithColumns(15)); 2757 verifyFormat("#define A \\\n" 2758 " { \\\n" 2759 " {\n" 2760 "#define B \\\n" 2761 " } \\\n" 2762 " }", 2763 getLLVMStyleWithColumns(15)); 2764 verifyNoCrash("#if a\na(\n#else\n#endif\n{a"); 2765 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}"); 2766 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};"); 2767 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}"); 2768 } 2769 2770 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { 2771 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline. 2772 EXPECT_EQ("class A : public QObject {\n" 2773 " Q_OBJECT\n" 2774 "\n" 2775 " A() {}\n" 2776 "};", 2777 format("class A : public QObject {\n" 2778 " Q_OBJECT\n" 2779 "\n" 2780 " A() {\n}\n" 2781 "} ;")); 2782 EXPECT_EQ("MACRO\n" 2783 "/*static*/ int i;", 2784 format("MACRO\n" 2785 " /*static*/ int i;")); 2786 EXPECT_EQ("SOME_MACRO\n" 2787 "namespace {\n" 2788 "void f();\n" 2789 "} // namespace", 2790 format("SOME_MACRO\n" 2791 " namespace {\n" 2792 "void f( );\n" 2793 "} // namespace")); 2794 // Only if the identifier contains at least 5 characters. 2795 EXPECT_EQ("HTTP f();", format("HTTP\nf();")); 2796 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();")); 2797 // Only if everything is upper case. 2798 EXPECT_EQ("class A : public QObject {\n" 2799 " Q_Object A() {}\n" 2800 "};", 2801 format("class A : public QObject {\n" 2802 " Q_Object\n" 2803 " A() {\n}\n" 2804 "} ;")); 2805 2806 // Only if the next line can actually start an unwrapped line. 2807 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", 2808 format("SOME_WEIRD_LOG_MACRO\n" 2809 "<< SomeThing;")); 2810 2811 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " 2812 "(n, buffers))\n", 2813 getChromiumStyle(FormatStyle::LK_Cpp)); 2814 2815 // See PR41483 2816 EXPECT_EQ("/**/ FOO(a)\n" 2817 "FOO(b)", 2818 format("/**/ FOO(a)\n" 2819 "FOO(b)")); 2820 } 2821 2822 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { 2823 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2824 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2825 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2826 "class X {};\n" 2827 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2828 "int *createScopDetectionPass() { return 0; }", 2829 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n" 2830 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n" 2831 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n" 2832 " class X {};\n" 2833 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n" 2834 " int *createScopDetectionPass() { return 0; }")); 2835 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as 2836 // braces, so that inner block is indented one level more. 2837 EXPECT_EQ("int q() {\n" 2838 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2839 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2840 " IPC_END_MESSAGE_MAP()\n" 2841 "}", 2842 format("int q() {\n" 2843 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n" 2844 " IPC_MESSAGE_HANDLER(xxx, qqq)\n" 2845 " IPC_END_MESSAGE_MAP()\n" 2846 "}")); 2847 2848 // Same inside macros. 2849 EXPECT_EQ("#define LIST(L) \\\n" 2850 " L(A) \\\n" 2851 " L(B) \\\n" 2852 " L(C)", 2853 format("#define LIST(L) \\\n" 2854 " L(A) \\\n" 2855 " L(B) \\\n" 2856 " L(C)", 2857 getGoogleStyle())); 2858 2859 // These must not be recognized as macros. 2860 EXPECT_EQ("int q() {\n" 2861 " f(x);\n" 2862 " f(x) {}\n" 2863 " f(x)->g();\n" 2864 " f(x)->*g();\n" 2865 " f(x).g();\n" 2866 " f(x) = x;\n" 2867 " f(x) += x;\n" 2868 " f(x) -= x;\n" 2869 " f(x) *= x;\n" 2870 " f(x) /= x;\n" 2871 " f(x) %= x;\n" 2872 " f(x) &= x;\n" 2873 " f(x) |= x;\n" 2874 " f(x) ^= x;\n" 2875 " f(x) >>= x;\n" 2876 " f(x) <<= x;\n" 2877 " f(x)[y].z();\n" 2878 " LOG(INFO) << x;\n" 2879 " ifstream(x) >> x;\n" 2880 "}\n", 2881 format("int q() {\n" 2882 " f(x)\n;\n" 2883 " f(x)\n {}\n" 2884 " f(x)\n->g();\n" 2885 " f(x)\n->*g();\n" 2886 " f(x)\n.g();\n" 2887 " f(x)\n = x;\n" 2888 " f(x)\n += x;\n" 2889 " f(x)\n -= x;\n" 2890 " f(x)\n *= x;\n" 2891 " f(x)\n /= x;\n" 2892 " f(x)\n %= x;\n" 2893 " f(x)\n &= x;\n" 2894 " f(x)\n |= x;\n" 2895 " f(x)\n ^= x;\n" 2896 " f(x)\n >>= x;\n" 2897 " f(x)\n <<= x;\n" 2898 " f(x)\n[y].z();\n" 2899 " LOG(INFO)\n << x;\n" 2900 " ifstream(x)\n >> x;\n" 2901 "}\n")); 2902 EXPECT_EQ("int q() {\n" 2903 " F(x)\n" 2904 " if (1) {\n" 2905 " }\n" 2906 " F(x)\n" 2907 " while (1) {\n" 2908 " }\n" 2909 " F(x)\n" 2910 " G(x);\n" 2911 " F(x)\n" 2912 " try {\n" 2913 " Q();\n" 2914 " } catch (...) {\n" 2915 " }\n" 2916 "}\n", 2917 format("int q() {\n" 2918 "F(x)\n" 2919 "if (1) {}\n" 2920 "F(x)\n" 2921 "while (1) {}\n" 2922 "F(x)\n" 2923 "G(x);\n" 2924 "F(x)\n" 2925 "try { Q(); } catch (...) {}\n" 2926 "}\n")); 2927 EXPECT_EQ("class A {\n" 2928 " A() : t(0) {}\n" 2929 " A(int i) noexcept() : {}\n" 2930 " A(X x)\n" // FIXME: function-level try blocks are broken. 2931 " try : t(0) {\n" 2932 " } catch (...) {\n" 2933 " }\n" 2934 "};", 2935 format("class A {\n" 2936 " A()\n : t(0) {}\n" 2937 " A(int i)\n noexcept() : {}\n" 2938 " A(X x)\n" 2939 " try : t(0) {} catch (...) {}\n" 2940 "};")); 2941 FormatStyle Style = getLLVMStyle(); 2942 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 2943 Style.BraceWrapping.AfterControlStatement = true; 2944 Style.BraceWrapping.AfterFunction = true; 2945 EXPECT_EQ("void f()\n" 2946 "try\n" 2947 "{\n" 2948 "}", 2949 format("void f() try {\n" 2950 "}", 2951 Style)); 2952 EXPECT_EQ("class SomeClass {\n" 2953 "public:\n" 2954 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2955 "};", 2956 format("class SomeClass {\n" 2957 "public:\n" 2958 " SomeClass()\n" 2959 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2960 "};")); 2961 EXPECT_EQ("class SomeClass {\n" 2962 "public:\n" 2963 " SomeClass()\n" 2964 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2965 "};", 2966 format("class SomeClass {\n" 2967 "public:\n" 2968 " SomeClass()\n" 2969 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n" 2970 "};", 2971 getLLVMStyleWithColumns(40))); 2972 2973 verifyFormat("MACRO(>)"); 2974 2975 // Some macros contain an implicit semicolon. 2976 Style = getLLVMStyle(); 2977 Style.StatementMacros.push_back("FOO"); 2978 verifyFormat("FOO(a) int b = 0;"); 2979 verifyFormat("FOO(a)\n" 2980 "int b = 0;", 2981 Style); 2982 verifyFormat("FOO(a);\n" 2983 "int b = 0;", 2984 Style); 2985 verifyFormat("FOO(argc, argv, \"4.0.2\")\n" 2986 "int b = 0;", 2987 Style); 2988 verifyFormat("FOO()\n" 2989 "int b = 0;", 2990 Style); 2991 verifyFormat("FOO\n" 2992 "int b = 0;", 2993 Style); 2994 verifyFormat("void f() {\n" 2995 " FOO(a)\n" 2996 " return a;\n" 2997 "}", 2998 Style); 2999 verifyFormat("FOO(a)\n" 3000 "FOO(b)", 3001 Style); 3002 verifyFormat("int a = 0;\n" 3003 "FOO(b)\n" 3004 "int c = 0;", 3005 Style); 3006 verifyFormat("int a = 0;\n" 3007 "int x = FOO(a)\n" 3008 "int b = 0;", 3009 Style); 3010 verifyFormat("void foo(int a) { FOO(a) }\n" 3011 "uint32_t bar() {}", 3012 Style); 3013 } 3014 3015 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) { 3016 verifyFormat("#define A \\\n" 3017 " f({ \\\n" 3018 " g(); \\\n" 3019 " });", 3020 getLLVMStyleWithColumns(11)); 3021 } 3022 3023 TEST_F(FormatTest, IndentPreprocessorDirectives) { 3024 FormatStyle Style = getLLVMStyle(); 3025 Style.IndentPPDirectives = FormatStyle::PPDIS_None; 3026 Style.ColumnLimit = 40; 3027 verifyFormat("#ifdef _WIN32\n" 3028 "#define A 0\n" 3029 "#ifdef VAR2\n" 3030 "#define B 1\n" 3031 "#include <someheader.h>\n" 3032 "#define MACRO \\\n" 3033 " some_very_long_func_aaaaaaaaaa();\n" 3034 "#endif\n" 3035 "#else\n" 3036 "#define A 1\n" 3037 "#endif", 3038 Style); 3039 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash; 3040 verifyFormat("#ifdef _WIN32\n" 3041 "# define A 0\n" 3042 "# ifdef VAR2\n" 3043 "# define B 1\n" 3044 "# include <someheader.h>\n" 3045 "# define MACRO \\\n" 3046 " some_very_long_func_aaaaaaaaaa();\n" 3047 "# endif\n" 3048 "#else\n" 3049 "# define A 1\n" 3050 "#endif", 3051 Style); 3052 verifyFormat("#if A\n" 3053 "# define MACRO \\\n" 3054 " void a(int x) { \\\n" 3055 " b(); \\\n" 3056 " c(); \\\n" 3057 " d(); \\\n" 3058 " e(); \\\n" 3059 " f(); \\\n" 3060 " }\n" 3061 "#endif", 3062 Style); 3063 // Comments before include guard. 3064 verifyFormat("// file comment\n" 3065 "// file comment\n" 3066 "#ifndef HEADER_H\n" 3067 "#define HEADER_H\n" 3068 "code();\n" 3069 "#endif", 3070 Style); 3071 // Test with include guards. 3072 verifyFormat("#ifndef HEADER_H\n" 3073 "#define HEADER_H\n" 3074 "code();\n" 3075 "#endif", 3076 Style); 3077 // Include guards must have a #define with the same variable immediately 3078 // after #ifndef. 3079 verifyFormat("#ifndef NOT_GUARD\n" 3080 "# define FOO\n" 3081 "code();\n" 3082 "#endif", 3083 Style); 3084 3085 // Include guards must cover the entire file. 3086 verifyFormat("code();\n" 3087 "code();\n" 3088 "#ifndef NOT_GUARD\n" 3089 "# define NOT_GUARD\n" 3090 "code();\n" 3091 "#endif", 3092 Style); 3093 verifyFormat("#ifndef NOT_GUARD\n" 3094 "# define NOT_GUARD\n" 3095 "code();\n" 3096 "#endif\n" 3097 "code();", 3098 Style); 3099 // Test with trailing blank lines. 3100 verifyFormat("#ifndef HEADER_H\n" 3101 "#define HEADER_H\n" 3102 "code();\n" 3103 "#endif\n", 3104 Style); 3105 // Include guards don't have #else. 3106 verifyFormat("#ifndef NOT_GUARD\n" 3107 "# define NOT_GUARD\n" 3108 "code();\n" 3109 "#else\n" 3110 "#endif", 3111 Style); 3112 verifyFormat("#ifndef NOT_GUARD\n" 3113 "# define NOT_GUARD\n" 3114 "code();\n" 3115 "#elif FOO\n" 3116 "#endif", 3117 Style); 3118 // Non-identifier #define after potential include guard. 3119 verifyFormat("#ifndef FOO\n" 3120 "# define 1\n" 3121 "#endif\n", 3122 Style); 3123 // #if closes past last non-preprocessor line. 3124 verifyFormat("#ifndef FOO\n" 3125 "#define FOO\n" 3126 "#if 1\n" 3127 "int i;\n" 3128 "# define A 0\n" 3129 "#endif\n" 3130 "#endif\n", 3131 Style); 3132 // Don't crash if there is an #elif directive without a condition. 3133 verifyFormat("#if 1\n" 3134 "int x;\n" 3135 "#elif\n" 3136 "int y;\n" 3137 "#else\n" 3138 "int z;\n" 3139 "#endif", 3140 Style); 3141 // FIXME: This doesn't handle the case where there's code between the 3142 // #ifndef and #define but all other conditions hold. This is because when 3143 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the 3144 // previous code line yet, so we can't detect it. 3145 EXPECT_EQ("#ifndef NOT_GUARD\n" 3146 "code();\n" 3147 "#define NOT_GUARD\n" 3148 "code();\n" 3149 "#endif", 3150 format("#ifndef NOT_GUARD\n" 3151 "code();\n" 3152 "# define NOT_GUARD\n" 3153 "code();\n" 3154 "#endif", 3155 Style)); 3156 // FIXME: This doesn't handle cases where legitimate preprocessor lines may 3157 // be outside an include guard. Examples are #pragma once and 3158 // #pragma GCC diagnostic, or anything else that does not change the meaning 3159 // of the file if it's included multiple times. 3160 EXPECT_EQ("#ifdef WIN32\n" 3161 "# pragma once\n" 3162 "#endif\n" 3163 "#ifndef HEADER_H\n" 3164 "# define HEADER_H\n" 3165 "code();\n" 3166 "#endif", 3167 format("#ifdef WIN32\n" 3168 "# pragma once\n" 3169 "#endif\n" 3170 "#ifndef HEADER_H\n" 3171 "#define HEADER_H\n" 3172 "code();\n" 3173 "#endif", 3174 Style)); 3175 // FIXME: This does not detect when there is a single non-preprocessor line 3176 // in front of an include-guard-like structure where other conditions hold 3177 // because ScopedLineState hides the line. 3178 EXPECT_EQ("code();\n" 3179 "#ifndef HEADER_H\n" 3180 "#define HEADER_H\n" 3181 "code();\n" 3182 "#endif", 3183 format("code();\n" 3184 "#ifndef HEADER_H\n" 3185 "# define HEADER_H\n" 3186 "code();\n" 3187 "#endif", 3188 Style)); 3189 // Keep comments aligned with #, otherwise indent comments normally. These 3190 // tests cannot use verifyFormat because messUp manipulates leading 3191 // whitespace. 3192 { 3193 const char *Expected = "" 3194 "void f() {\n" 3195 "#if 1\n" 3196 "// Preprocessor aligned.\n" 3197 "# define A 0\n" 3198 " // Code. Separated by blank line.\n" 3199 "\n" 3200 "# define B 0\n" 3201 " // Code. Not aligned with #\n" 3202 "# define C 0\n" 3203 "#endif"; 3204 const char *ToFormat = "" 3205 "void f() {\n" 3206 "#if 1\n" 3207 "// Preprocessor aligned.\n" 3208 "# define A 0\n" 3209 "// Code. Separated by blank line.\n" 3210 "\n" 3211 "# define B 0\n" 3212 " // Code. Not aligned with #\n" 3213 "# define C 0\n" 3214 "#endif"; 3215 EXPECT_EQ(Expected, format(ToFormat, Style)); 3216 EXPECT_EQ(Expected, format(Expected, Style)); 3217 } 3218 // Keep block quotes aligned. 3219 { 3220 const char *Expected = "" 3221 "void f() {\n" 3222 "#if 1\n" 3223 "/* Preprocessor aligned. */\n" 3224 "# define A 0\n" 3225 " /* Code. Separated by blank line. */\n" 3226 "\n" 3227 "# define B 0\n" 3228 " /* Code. Not aligned with # */\n" 3229 "# define C 0\n" 3230 "#endif"; 3231 const char *ToFormat = "" 3232 "void f() {\n" 3233 "#if 1\n" 3234 "/* Preprocessor aligned. */\n" 3235 "# define A 0\n" 3236 "/* Code. Separated by blank line. */\n" 3237 "\n" 3238 "# define B 0\n" 3239 " /* Code. Not aligned with # */\n" 3240 "# define C 0\n" 3241 "#endif"; 3242 EXPECT_EQ(Expected, format(ToFormat, Style)); 3243 EXPECT_EQ(Expected, format(Expected, Style)); 3244 } 3245 // Keep comments aligned with un-indented directives. 3246 { 3247 const char *Expected = "" 3248 "void f() {\n" 3249 "// Preprocessor aligned.\n" 3250 "#define A 0\n" 3251 " // Code. Separated by blank line.\n" 3252 "\n" 3253 "#define B 0\n" 3254 " // Code. Not aligned with #\n" 3255 "#define C 0\n"; 3256 const char *ToFormat = "" 3257 "void f() {\n" 3258 "// Preprocessor aligned.\n" 3259 "#define A 0\n" 3260 "// Code. Separated by blank line.\n" 3261 "\n" 3262 "#define B 0\n" 3263 " // Code. Not aligned with #\n" 3264 "#define C 0\n"; 3265 EXPECT_EQ(Expected, format(ToFormat, Style)); 3266 EXPECT_EQ(Expected, format(Expected, Style)); 3267 } 3268 // Test AfterHash with tabs. 3269 { 3270 FormatStyle Tabbed = Style; 3271 Tabbed.UseTab = FormatStyle::UT_Always; 3272 Tabbed.IndentWidth = 8; 3273 Tabbed.TabWidth = 8; 3274 verifyFormat("#ifdef _WIN32\n" 3275 "#\tdefine A 0\n" 3276 "#\tifdef VAR2\n" 3277 "#\t\tdefine B 1\n" 3278 "#\t\tinclude <someheader.h>\n" 3279 "#\t\tdefine MACRO \\\n" 3280 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n" 3281 "#\tendif\n" 3282 "#else\n" 3283 "#\tdefine A 1\n" 3284 "#endif", 3285 Tabbed); 3286 } 3287 3288 // Regression test: Multiline-macro inside include guards. 3289 verifyFormat("#ifndef HEADER_H\n" 3290 "#define HEADER_H\n" 3291 "#define A() \\\n" 3292 " int i; \\\n" 3293 " int j;\n" 3294 "#endif // HEADER_H", 3295 getLLVMStyleWithColumns(20)); 3296 3297 Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash; 3298 // Basic before hash indent tests 3299 verifyFormat("#ifdef _WIN32\n" 3300 " #define A 0\n" 3301 " #ifdef VAR2\n" 3302 " #define B 1\n" 3303 " #include <someheader.h>\n" 3304 " #define MACRO \\\n" 3305 " some_very_long_func_aaaaaaaaaa();\n" 3306 " #endif\n" 3307 "#else\n" 3308 " #define A 1\n" 3309 "#endif", 3310 Style); 3311 verifyFormat("#if A\n" 3312 " #define MACRO \\\n" 3313 " void a(int x) { \\\n" 3314 " b(); \\\n" 3315 " c(); \\\n" 3316 " d(); \\\n" 3317 " e(); \\\n" 3318 " f(); \\\n" 3319 " }\n" 3320 "#endif", 3321 Style); 3322 // Keep comments aligned with indented directives. These 3323 // tests cannot use verifyFormat because messUp manipulates leading 3324 // whitespace. 3325 { 3326 const char *Expected = "void f() {\n" 3327 "// Aligned to preprocessor.\n" 3328 "#if 1\n" 3329 " // Aligned to code.\n" 3330 " int a;\n" 3331 " #if 1\n" 3332 " // Aligned to preprocessor.\n" 3333 " #define A 0\n" 3334 " // Aligned to code.\n" 3335 " int b;\n" 3336 " #endif\n" 3337 "#endif\n" 3338 "}"; 3339 const char *ToFormat = "void f() {\n" 3340 "// Aligned to preprocessor.\n" 3341 "#if 1\n" 3342 "// Aligned to code.\n" 3343 "int a;\n" 3344 "#if 1\n" 3345 "// Aligned to preprocessor.\n" 3346 "#define A 0\n" 3347 "// Aligned to code.\n" 3348 "int b;\n" 3349 "#endif\n" 3350 "#endif\n" 3351 "}"; 3352 EXPECT_EQ(Expected, format(ToFormat, Style)); 3353 EXPECT_EQ(Expected, format(Expected, Style)); 3354 } 3355 { 3356 const char *Expected = "void f() {\n" 3357 "/* Aligned to preprocessor. */\n" 3358 "#if 1\n" 3359 " /* Aligned to code. */\n" 3360 " int a;\n" 3361 " #if 1\n" 3362 " /* Aligned to preprocessor. */\n" 3363 " #define A 0\n" 3364 " /* Aligned to code. */\n" 3365 " int b;\n" 3366 " #endif\n" 3367 "#endif\n" 3368 "}"; 3369 const char *ToFormat = "void f() {\n" 3370 "/* Aligned to preprocessor. */\n" 3371 "#if 1\n" 3372 "/* Aligned to code. */\n" 3373 "int a;\n" 3374 "#if 1\n" 3375 "/* Aligned to preprocessor. */\n" 3376 "#define A 0\n" 3377 "/* Aligned to code. */\n" 3378 "int b;\n" 3379 "#endif\n" 3380 "#endif\n" 3381 "}"; 3382 EXPECT_EQ(Expected, format(ToFormat, Style)); 3383 EXPECT_EQ(Expected, format(Expected, Style)); 3384 } 3385 3386 // Test single comment before preprocessor 3387 verifyFormat("// Comment\n" 3388 "\n" 3389 "#if 1\n" 3390 "#endif", 3391 Style); 3392 } 3393 3394 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) { 3395 verifyFormat("{\n { a #c; }\n}"); 3396 } 3397 3398 TEST_F(FormatTest, FormatUnbalancedStructuralElements) { 3399 EXPECT_EQ("#define A \\\n { \\\n {\nint i;", 3400 format("#define A { {\nint i;", getLLVMStyleWithColumns(11))); 3401 EXPECT_EQ("#define A \\\n } \\\n }\nint i;", 3402 format("#define A } }\nint i;", getLLVMStyleWithColumns(11))); 3403 } 3404 3405 TEST_F(FormatTest, EscapedNewlines) { 3406 FormatStyle Narrow = getLLVMStyleWithColumns(11); 3407 EXPECT_EQ("#define A \\\n int i; \\\n int j;", 3408 format("#define A \\\nint i;\\\n int j;", Narrow)); 3409 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;")); 3410 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3411 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */")); 3412 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>")); 3413 3414 FormatStyle AlignLeft = getLLVMStyle(); 3415 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 3416 EXPECT_EQ("#define MACRO(x) \\\n" 3417 "private: \\\n" 3418 " int x(int a);\n", 3419 format("#define MACRO(x) \\\n" 3420 "private: \\\n" 3421 " int x(int a);\n", 3422 AlignLeft)); 3423 3424 // CRLF line endings 3425 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;", 3426 format("#define A \\\r\nint i;\\\r\n int j;", Narrow)); 3427 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;")); 3428 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();")); 3429 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */")); 3430 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>")); 3431 EXPECT_EQ("#define MACRO(x) \\\r\n" 3432 "private: \\\r\n" 3433 " int x(int a);\r\n", 3434 format("#define MACRO(x) \\\r\n" 3435 "private: \\\r\n" 3436 " int x(int a);\r\n", 3437 AlignLeft)); 3438 3439 FormatStyle DontAlign = getLLVMStyle(); 3440 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 3441 DontAlign.MaxEmptyLinesToKeep = 3; 3442 // FIXME: can't use verifyFormat here because the newline before 3443 // "public:" is not inserted the first time it's reformatted 3444 EXPECT_EQ("#define A \\\n" 3445 " class Foo { \\\n" 3446 " void bar(); \\\n" 3447 "\\\n" 3448 "\\\n" 3449 "\\\n" 3450 " public: \\\n" 3451 " void baz(); \\\n" 3452 " };", 3453 format("#define A \\\n" 3454 " class Foo { \\\n" 3455 " void bar(); \\\n" 3456 "\\\n" 3457 "\\\n" 3458 "\\\n" 3459 " public: \\\n" 3460 " void baz(); \\\n" 3461 " };", 3462 DontAlign)); 3463 } 3464 3465 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { 3466 verifyFormat("#define A \\\n" 3467 " int v( \\\n" 3468 " a); \\\n" 3469 " int i;", 3470 getLLVMStyleWithColumns(11)); 3471 } 3472 3473 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) { 3474 EXPECT_EQ( 3475 "#define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3476 " \\\n" 3477 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3478 "\n" 3479 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3480 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n", 3481 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro(" 3482 "\\\n" 3483 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n" 3484 " \n" 3485 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n" 3486 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n")); 3487 } 3488 3489 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) { 3490 EXPECT_EQ("int\n" 3491 "#define A\n" 3492 " a;", 3493 format("int\n#define A\na;")); 3494 verifyFormat("functionCallTo(\n" 3495 " someOtherFunction(\n" 3496 " withSomeParameters, whichInSequence,\n" 3497 " areLongerThanALine(andAnotherCall,\n" 3498 "#define A B\n" 3499 " withMoreParamters,\n" 3500 " whichStronglyInfluenceTheLayout),\n" 3501 " andMoreParameters),\n" 3502 " trailing);", 3503 getLLVMStyleWithColumns(69)); 3504 verifyFormat("Foo::Foo()\n" 3505 "#ifdef BAR\n" 3506 " : baz(0)\n" 3507 "#endif\n" 3508 "{\n" 3509 "}"); 3510 verifyFormat("void f() {\n" 3511 " if (true)\n" 3512 "#ifdef A\n" 3513 " f(42);\n" 3514 " x();\n" 3515 "#else\n" 3516 " g();\n" 3517 " x();\n" 3518 "#endif\n" 3519 "}"); 3520 verifyFormat("void f(param1, param2,\n" 3521 " param3,\n" 3522 "#ifdef A\n" 3523 " param4(param5,\n" 3524 "#ifdef A1\n" 3525 " param6,\n" 3526 "#ifdef A2\n" 3527 " param7),\n" 3528 "#else\n" 3529 " param8),\n" 3530 " param9,\n" 3531 "#endif\n" 3532 " param10,\n" 3533 "#endif\n" 3534 " param11)\n" 3535 "#else\n" 3536 " param12)\n" 3537 "#endif\n" 3538 "{\n" 3539 " x();\n" 3540 "}", 3541 getLLVMStyleWithColumns(28)); 3542 verifyFormat("#if 1\n" 3543 "int i;"); 3544 verifyFormat("#if 1\n" 3545 "#endif\n" 3546 "#if 1\n" 3547 "#else\n" 3548 "#endif\n"); 3549 verifyFormat("DEBUG({\n" 3550 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n" 3552 "});\n" 3553 "#if a\n" 3554 "#else\n" 3555 "#endif"); 3556 3557 verifyIncompleteFormat("void f(\n" 3558 "#if A\n" 3559 ");\n" 3560 "#else\n" 3561 "#endif"); 3562 } 3563 3564 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) { 3565 verifyFormat("#endif\n" 3566 "#if B"); 3567 } 3568 3569 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) { 3570 FormatStyle SingleLine = getLLVMStyle(); 3571 SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse; 3572 verifyFormat("#if 0\n" 3573 "#elif 1\n" 3574 "#endif\n" 3575 "void foo() {\n" 3576 " if (test) foo2();\n" 3577 "}", 3578 SingleLine); 3579 } 3580 3581 TEST_F(FormatTest, LayoutBlockInsideParens) { 3582 verifyFormat("functionCall({ int i; });"); 3583 verifyFormat("functionCall({\n" 3584 " int i;\n" 3585 " int j;\n" 3586 "});"); 3587 verifyFormat("functionCall(\n" 3588 " {\n" 3589 " int i;\n" 3590 " int j;\n" 3591 " },\n" 3592 " aaaa, bbbb, cccc);"); 3593 verifyFormat("functionA(functionB({\n" 3594 " int i;\n" 3595 " int j;\n" 3596 " }),\n" 3597 " aaaa, bbbb, cccc);"); 3598 verifyFormat("functionCall(\n" 3599 " {\n" 3600 " int i;\n" 3601 " int j;\n" 3602 " },\n" 3603 " aaaa, bbbb, // comment\n" 3604 " cccc);"); 3605 verifyFormat("functionA(functionB({\n" 3606 " int i;\n" 3607 " int j;\n" 3608 " }),\n" 3609 " aaaa, bbbb, // comment\n" 3610 " cccc);"); 3611 verifyFormat("functionCall(aaaa, bbbb, { int i; });"); 3612 verifyFormat("functionCall(aaaa, bbbb, {\n" 3613 " int i;\n" 3614 " int j;\n" 3615 "});"); 3616 verifyFormat( 3617 "Aaa(\n" // FIXME: There shouldn't be a linebreak here. 3618 " {\n" 3619 " int i; // break\n" 3620 " },\n" 3621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 3622 " ccccccccccccccccc));"); 3623 verifyFormat("DEBUG({\n" 3624 " if (a)\n" 3625 " f();\n" 3626 "});"); 3627 } 3628 3629 TEST_F(FormatTest, LayoutBlockInsideStatement) { 3630 EXPECT_EQ("SOME_MACRO { int i; }\n" 3631 "int i;", 3632 format(" SOME_MACRO {int i;} int i;")); 3633 } 3634 3635 TEST_F(FormatTest, LayoutNestedBlocks) { 3636 verifyFormat("void AddOsStrings(unsigned bitmask) {\n" 3637 " struct s {\n" 3638 " int i;\n" 3639 " };\n" 3640 " s kBitsToOs[] = {{10}};\n" 3641 " for (int i = 0; i < 10; ++i)\n" 3642 " return;\n" 3643 "}"); 3644 verifyFormat("call(parameter, {\n" 3645 " something();\n" 3646 " // Comment using all columns.\n" 3647 " somethingelse();\n" 3648 "});", 3649 getLLVMStyleWithColumns(40)); 3650 verifyFormat("DEBUG( //\n" 3651 " { f(); }, a);"); 3652 verifyFormat("DEBUG( //\n" 3653 " {\n" 3654 " f(); //\n" 3655 " },\n" 3656 " a);"); 3657 3658 EXPECT_EQ("call(parameter, {\n" 3659 " something();\n" 3660 " // Comment too\n" 3661 " // looooooooooong.\n" 3662 " somethingElse();\n" 3663 "});", 3664 format("call(parameter, {\n" 3665 " something();\n" 3666 " // Comment too looooooooooong.\n" 3667 " somethingElse();\n" 3668 "});", 3669 getLLVMStyleWithColumns(29))); 3670 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });")); 3671 EXPECT_EQ("DEBUG({ // comment\n" 3672 " int i;\n" 3673 "});", 3674 format("DEBUG({ // comment\n" 3675 "int i;\n" 3676 "});")); 3677 EXPECT_EQ("DEBUG({\n" 3678 " int i;\n" 3679 "\n" 3680 " // comment\n" 3681 " int j;\n" 3682 "});", 3683 format("DEBUG({\n" 3684 " int i;\n" 3685 "\n" 3686 " // comment\n" 3687 " int j;\n" 3688 "});")); 3689 3690 verifyFormat("DEBUG({\n" 3691 " if (a)\n" 3692 " return;\n" 3693 "});"); 3694 verifyGoogleFormat("DEBUG({\n" 3695 " if (a) return;\n" 3696 "});"); 3697 FormatStyle Style = getGoogleStyle(); 3698 Style.ColumnLimit = 45; 3699 verifyFormat("Debug(\n" 3700 " aaaaa,\n" 3701 " {\n" 3702 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" 3703 " },\n" 3704 " a);", 3705 Style); 3706 3707 verifyFormat("SomeFunction({MACRO({ return output; }), b});"); 3708 3709 verifyNoCrash("^{v^{a}}"); 3710 } 3711 3712 TEST_F(FormatTest, FormatNestedBlocksInMacros) { 3713 EXPECT_EQ("#define MACRO() \\\n" 3714 " Debug(aaa, /* force line break */ \\\n" 3715 " { \\\n" 3716 " int i; \\\n" 3717 " int j; \\\n" 3718 " })", 3719 format("#define MACRO() Debug(aaa, /* force line break */ \\\n" 3720 " { int i; int j; })", 3721 getGoogleStyle())); 3722 3723 EXPECT_EQ("#define A \\\n" 3724 " [] { \\\n" 3725 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3726 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n" 3727 " }", 3728 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n" 3729 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }", 3730 getGoogleStyle())); 3731 } 3732 3733 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) { 3734 EXPECT_EQ("{}", format("{}")); 3735 verifyFormat("enum E {};"); 3736 verifyFormat("enum E {}"); 3737 FormatStyle Style = getLLVMStyle(); 3738 Style.SpaceInEmptyBlock = true; 3739 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 3740 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 3741 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 3742 } 3743 3744 TEST_F(FormatTest, FormatBeginBlockEndMacros) { 3745 FormatStyle Style = getLLVMStyle(); 3746 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$"; 3747 Style.MacroBlockEnd = "^[A-Z_]+_END$"; 3748 verifyFormat("FOO_BEGIN\n" 3749 " FOO_ENTRY\n" 3750 "FOO_END", 3751 Style); 3752 verifyFormat("FOO_BEGIN\n" 3753 " NESTED_FOO_BEGIN\n" 3754 " NESTED_FOO_ENTRY\n" 3755 " NESTED_FOO_END\n" 3756 "FOO_END", 3757 Style); 3758 verifyFormat("FOO_BEGIN(Foo, Bar)\n" 3759 " int x;\n" 3760 " x = 1;\n" 3761 "FOO_END(Baz)", 3762 Style); 3763 } 3764 3765 //===----------------------------------------------------------------------===// 3766 // Line break tests. 3767 //===----------------------------------------------------------------------===// 3768 3769 TEST_F(FormatTest, PreventConfusingIndents) { 3770 verifyFormat( 3771 "void f() {\n" 3772 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 3773 " parameter, parameter, parameter)),\n" 3774 " SecondLongCall(parameter));\n" 3775 "}"); 3776 verifyFormat( 3777 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3778 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 3779 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 3780 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 3781 verifyFormat( 3782 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3783 " [aaaaaaaaaaaaaaaaaaaaaaaa\n" 3784 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 3785 " [aaaaaaaaaaaaaaaaaaaaaaaa]];"); 3786 verifyFormat( 3787 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 3788 " aaaaaaaaaaaaaaaaaaaaaaaa<\n" 3789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n" 3790 " aaaaaaaaaaaaaaaaaaaaaaaa>;"); 3791 verifyFormat("int a = bbbb && ccc &&\n" 3792 " fffff(\n" 3793 "#define A Just forcing a new line\n" 3794 " ddd);"); 3795 } 3796 3797 TEST_F(FormatTest, LineBreakingInBinaryExpressions) { 3798 verifyFormat( 3799 "bool aaaaaaa =\n" 3800 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n" 3801 " bbbbbbbb();"); 3802 verifyFormat( 3803 "bool aaaaaaa =\n" 3804 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n" 3805 " bbbbbbbb();"); 3806 3807 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3808 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n" 3809 " ccccccccc == ddddddddddd;"); 3810 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n" 3811 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n" 3812 " ccccccccc == ddddddddddd;"); 3813 verifyFormat( 3814 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 3815 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n" 3816 " ccccccccc == ddddddddddd;"); 3817 3818 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3819 " aaaaaa) &&\n" 3820 " bbbbbb && cccccc;"); 3821 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n" 3822 " aaaaaa) >>\n" 3823 " bbbbbb;"); 3824 verifyFormat("aa = Whitespaces.addUntouchableComment(\n" 3825 " SourceMgr.getSpellingColumnNumber(\n" 3826 " TheLine.Last->FormatTok.Tok.getLocation()) -\n" 3827 " 1);"); 3828 3829 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3830 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" 3831 " cccccc) {\n}"); 3832 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3833 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3834 " cccccc) {\n}"); 3835 verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3836 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n" 3837 " cccccc) {\n}"); 3838 verifyFormat("b = a &&\n" 3839 " // Comment\n" 3840 " b.c && d;"); 3841 3842 // If the LHS of a comparison is not a binary expression itself, the 3843 // additional linebreak confuses many people. 3844 verifyFormat( 3845 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3846 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n" 3847 "}"); 3848 verifyFormat( 3849 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3851 "}"); 3852 verifyFormat( 3853 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n" 3854 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3855 "}"); 3856 verifyFormat( 3857 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n" 3859 "}"); 3860 // Even explicit parentheses stress the precedence enough to make the 3861 // additional break unnecessary. 3862 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n" 3864 "}"); 3865 // This cases is borderline, but with the indentation it is still readable. 3866 verifyFormat( 3867 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 3868 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3869 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 3870 "}", 3871 getLLVMStyleWithColumns(75)); 3872 3873 // If the LHS is a binary expression, we should still use the additional break 3874 // as otherwise the formatting hides the operator precedence. 3875 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3877 " 5) {\n" 3878 "}"); 3879 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3880 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n" 3881 " 5) {\n" 3882 "}"); 3883 3884 FormatStyle OnePerLine = getLLVMStyle(); 3885 OnePerLine.BinPackParameters = false; 3886 verifyFormat( 3887 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 3889 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}", 3890 OnePerLine); 3891 3892 verifyFormat("int i = someFunction(aaaaaaa, 0)\n" 3893 " .aaa(aaaaaaaaaaaaa) *\n" 3894 " aaaaaaa +\n" 3895 " aaaaaaa;", 3896 getLLVMStyleWithColumns(40)); 3897 } 3898 3899 TEST_F(FormatTest, ExpressionIndentation) { 3900 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3901 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3902 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3903 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3904 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 3905 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n" 3906 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3907 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n" 3908 " ccccccccccccccccccccccccccccccccccccccccc;"); 3909 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3911 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3912 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3913 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3914 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3916 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3917 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n" 3918 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" 3919 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 3920 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}"); 3921 verifyFormat("if () {\n" 3922 "} else if (aaaaa && bbbbb > // break\n" 3923 " ccccc) {\n" 3924 "}"); 3925 verifyFormat("if () {\n" 3926 "} else if constexpr (aaaaa && bbbbb > // break\n" 3927 " ccccc) {\n" 3928 "}"); 3929 verifyFormat("if () {\n" 3930 "} else if CONSTEXPR (aaaaa && bbbbb > // break\n" 3931 " ccccc) {\n" 3932 "}"); 3933 verifyFormat("if () {\n" 3934 "} else if (aaaaa &&\n" 3935 " bbbbb > // break\n" 3936 " ccccc &&\n" 3937 " ddddd) {\n" 3938 "}"); 3939 3940 // Presence of a trailing comment used to change indentation of b. 3941 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n" 3942 " b;\n" 3943 "return aaaaaaaaaaaaaaaaaaa +\n" 3944 " b; //", 3945 getLLVMStyleWithColumns(30)); 3946 } 3947 3948 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { 3949 // Not sure what the best system is here. Like this, the LHS can be found 3950 // immediately above an operator (everything with the same or a higher 3951 // indent). The RHS is aligned right of the operator and so compasses 3952 // everything until something with the same indent as the operator is found. 3953 // FIXME: Is this a good system? 3954 FormatStyle Style = getLLVMStyle(); 3955 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 3956 verifyFormat( 3957 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3958 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3959 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3960 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3961 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3962 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3963 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3964 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3965 " > ccccccccccccccccccccccccccccccccccccccccc;", 3966 Style); 3967 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3968 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3969 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3970 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3971 Style); 3972 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3973 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3974 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3975 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3976 Style); 3977 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3978 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3979 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3980 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", 3981 Style); 3982 verifyFormat("if () {\n" 3983 "} else if (aaaaa\n" 3984 " && bbbbb // break\n" 3985 " > ccccc) {\n" 3986 "}", 3987 Style); 3988 verifyFormat("return (a)\n" 3989 " // comment\n" 3990 " + b;", 3991 Style); 3992 verifyFormat( 3993 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3994 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 3995 " + cc;", 3996 Style); 3997 3998 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 3999 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 4000 Style); 4001 4002 // Forced by comments. 4003 verifyFormat( 4004 "unsigned ContentSize =\n" 4005 " sizeof(int16_t) // DWARF ARange version number\n" 4006 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n" 4007 " + sizeof(int8_t) // Pointer Size (in bytes)\n" 4008 " + sizeof(int8_t); // Segment Size (in bytes)"); 4009 4010 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n" 4011 " == boost::fusion::at_c<1>(iiii).second;", 4012 Style); 4013 4014 Style.ColumnLimit = 60; 4015 verifyFormat("zzzzzzzzzz\n" 4016 " = bbbbbbbbbbbbbbbbb\n" 4017 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);", 4018 Style); 4019 4020 Style.ColumnLimit = 80; 4021 Style.IndentWidth = 4; 4022 Style.TabWidth = 4; 4023 Style.UseTab = FormatStyle::UT_Always; 4024 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4025 Style.AlignOperands = false; 4026 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n" 4027 "\t&& (someOtherLongishConditionPart1\n" 4028 "\t\t|| someOtherEvenLongerNestedConditionPart2);", 4029 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && " 4030 "(someOtherLongishConditionPart1 || " 4031 "someOtherEvenLongerNestedConditionPart2);", 4032 Style)); 4033 } 4034 4035 TEST_F(FormatTest, EnforcedOperatorWraps) { 4036 // Here we'd like to wrap after the || operators, but a comment is forcing an 4037 // earlier wrap. 4038 verifyFormat("bool x = aaaaa //\n" 4039 " || bbbbb\n" 4040 " //\n" 4041 " || cccc;"); 4042 } 4043 4044 TEST_F(FormatTest, NoOperandAlignment) { 4045 FormatStyle Style = getLLVMStyle(); 4046 Style.AlignOperands = false; 4047 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n" 4048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 4049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 4050 Style); 4051 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4052 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4053 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4054 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4055 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4056 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4057 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4058 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4059 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4060 " > ccccccccccccccccccccccccccccccccccccccccc;", 4061 Style); 4062 4063 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4064 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4065 " + cc;", 4066 Style); 4067 verifyFormat("int a = aa\n" 4068 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" 4069 " * cccccccccccccccccccccccccccccccccccc;\n", 4070 Style); 4071 4072 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 4073 verifyFormat("return (a > b\n" 4074 " // comment1\n" 4075 " // comment2\n" 4076 " || c);", 4077 Style); 4078 } 4079 4080 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { 4081 FormatStyle Style = getLLVMStyle(); 4082 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4083 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 4084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4085 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 4086 Style); 4087 } 4088 4089 TEST_F(FormatTest, AllowBinPackingInsideArguments) { 4090 FormatStyle Style = getLLVMStyle(); 4091 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; 4092 Style.BinPackArguments = false; 4093 Style.ColumnLimit = 40; 4094 verifyFormat("void test() {\n" 4095 " someFunction(\n" 4096 " this + argument + is + quite\n" 4097 " + long + so + it + gets + wrapped\n" 4098 " + but + remains + bin - packed);\n" 4099 "}", 4100 Style); 4101 verifyFormat("void test() {\n" 4102 " someFunction(arg1,\n" 4103 " this + argument + is\n" 4104 " + quite + long + so\n" 4105 " + it + gets + wrapped\n" 4106 " + but + remains + bin\n" 4107 " - packed,\n" 4108 " arg3);\n" 4109 "}", 4110 Style); 4111 verifyFormat("void test() {\n" 4112 " someFunction(\n" 4113 " arg1,\n" 4114 " this + argument + has\n" 4115 " + anotherFunc(nested,\n" 4116 " calls + whose\n" 4117 " + arguments\n" 4118 " + are + also\n" 4119 " + wrapped,\n" 4120 " in + addition)\n" 4121 " + to + being + bin - packed,\n" 4122 " arg3);\n" 4123 "}", 4124 Style); 4125 4126 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 4127 verifyFormat("void test() {\n" 4128 " someFunction(\n" 4129 " arg1,\n" 4130 " this + argument + has +\n" 4131 " anotherFunc(nested,\n" 4132 " calls + whose +\n" 4133 " arguments +\n" 4134 " are + also +\n" 4135 " wrapped,\n" 4136 " in + addition) +\n" 4137 " to + being + bin - packed,\n" 4138 " arg3);\n" 4139 "}", 4140 Style); 4141 } 4142 4143 TEST_F(FormatTest, ConstructorInitializers) { 4144 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4145 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", 4146 getLLVMStyleWithColumns(45)); 4147 verifyFormat("Constructor()\n" 4148 " : Inttializer(FitsOnTheLine) {}", 4149 getLLVMStyleWithColumns(44)); 4150 verifyFormat("Constructor()\n" 4151 " : Inttializer(FitsOnTheLine) {}", 4152 getLLVMStyleWithColumns(43)); 4153 4154 verifyFormat("template <typename T>\n" 4155 "Constructor() : Initializer(FitsOnTheLine) {}", 4156 getLLVMStyleWithColumns(45)); 4157 4158 verifyFormat( 4159 "SomeClass::Constructor()\n" 4160 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4161 4162 verifyFormat( 4163 "SomeClass::Constructor()\n" 4164 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4165 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}"); 4166 verifyFormat( 4167 "SomeClass::Constructor()\n" 4168 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4169 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}"); 4170 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4171 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4172 " : aaaaaaaaaa(aaaaaa) {}"); 4173 4174 verifyFormat("Constructor()\n" 4175 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4176 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4177 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4178 " aaaaaaaaaaaaaaaaaaaaaaa() {}"); 4179 4180 verifyFormat("Constructor()\n" 4181 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4182 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4183 4184 verifyFormat("Constructor(int Parameter = 0)\n" 4185 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4186 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}"); 4187 verifyFormat("Constructor()\n" 4188 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4189 "}", 4190 getLLVMStyleWithColumns(60)); 4191 verifyFormat("Constructor()\n" 4192 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4193 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}"); 4194 4195 // Here a line could be saved by splitting the second initializer onto two 4196 // lines, but that is not desirable. 4197 verifyFormat("Constructor()\n" 4198 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4199 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4200 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4201 4202 FormatStyle OnePerLine = getLLVMStyle(); 4203 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4204 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false; 4205 verifyFormat("SomeClass::Constructor()\n" 4206 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4207 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4208 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4209 OnePerLine); 4210 verifyFormat("SomeClass::Constructor()\n" 4211 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4212 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4213 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4214 OnePerLine); 4215 verifyFormat("MyClass::MyClass(int var)\n" 4216 " : some_var_(var), // 4 space indent\n" 4217 " some_other_var_(var + 1) { // lined up\n" 4218 "}", 4219 OnePerLine); 4220 verifyFormat("Constructor()\n" 4221 " : aaaaa(aaaaaa),\n" 4222 " aaaaa(aaaaaa),\n" 4223 " aaaaa(aaaaaa),\n" 4224 " aaaaa(aaaaaa),\n" 4225 " aaaaa(aaaaaa) {}", 4226 OnePerLine); 4227 verifyFormat("Constructor()\n" 4228 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4229 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4230 OnePerLine); 4231 OnePerLine.BinPackParameters = false; 4232 verifyFormat( 4233 "Constructor()\n" 4234 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4235 " aaaaaaaaaaa().aaa(),\n" 4236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4237 OnePerLine); 4238 OnePerLine.ColumnLimit = 60; 4239 verifyFormat("Constructor()\n" 4240 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4241 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4242 OnePerLine); 4243 4244 EXPECT_EQ("Constructor()\n" 4245 " : // Comment forcing unwanted break.\n" 4246 " aaaa(aaaa) {}", 4247 format("Constructor() :\n" 4248 " // Comment forcing unwanted break.\n" 4249 " aaaa(aaaa) {}")); 4250 } 4251 4252 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) { 4253 FormatStyle Style = getLLVMStyle(); 4254 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4255 Style.ColumnLimit = 60; 4256 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4257 Style.AllowAllConstructorInitializersOnNextLine = true; 4258 Style.BinPackParameters = false; 4259 4260 for (int i = 0; i < 4; ++i) { 4261 // Test all combinations of parameters that should not have an effect. 4262 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4263 Style.AllowAllArgumentsOnNextLine = i & 2; 4264 4265 Style.AllowAllConstructorInitializersOnNextLine = true; 4266 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4267 verifyFormat("Constructor()\n" 4268 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4269 Style); 4270 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4271 4272 Style.AllowAllConstructorInitializersOnNextLine = false; 4273 verifyFormat("Constructor()\n" 4274 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4275 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4276 Style); 4277 verifyFormat("Constructor() : a(a), b(b) {}", Style); 4278 4279 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4280 Style.AllowAllConstructorInitializersOnNextLine = true; 4281 verifyFormat("Constructor()\n" 4282 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4283 Style); 4284 4285 Style.AllowAllConstructorInitializersOnNextLine = false; 4286 verifyFormat("Constructor()\n" 4287 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4288 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4289 Style); 4290 4291 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4292 Style.AllowAllConstructorInitializersOnNextLine = true; 4293 verifyFormat("Constructor() :\n" 4294 " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4295 Style); 4296 4297 Style.AllowAllConstructorInitializersOnNextLine = false; 4298 verifyFormat("Constructor() :\n" 4299 " aaaaaaaaaaaaaaaaaa(a),\n" 4300 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4301 Style); 4302 } 4303 4304 // Test interactions between AllowAllParametersOfDeclarationOnNextLine and 4305 // AllowAllConstructorInitializersOnNextLine in all 4306 // BreakConstructorInitializers modes 4307 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 4308 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4309 Style.AllowAllConstructorInitializersOnNextLine = false; 4310 verifyFormat("SomeClassWithALongName::Constructor(\n" 4311 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4312 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4313 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4314 Style); 4315 4316 Style.AllowAllConstructorInitializersOnNextLine = true; 4317 verifyFormat("SomeClassWithALongName::Constructor(\n" 4318 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4319 " int bbbbbbbbbbbbb,\n" 4320 " int cccccccccccccccc)\n" 4321 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4322 Style); 4323 4324 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4325 Style.AllowAllConstructorInitializersOnNextLine = false; 4326 verifyFormat("SomeClassWithALongName::Constructor(\n" 4327 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4328 " int bbbbbbbbbbbbb)\n" 4329 " : aaaaaaaaaaaaaaaaaaaa(a)\n" 4330 " , bbbbbbbbbbbbbbbbbbbbb(b) {}", 4331 Style); 4332 4333 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 4334 4335 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4336 verifyFormat("SomeClassWithALongName::Constructor(\n" 4337 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n" 4338 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4339 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4340 Style); 4341 4342 Style.AllowAllConstructorInitializersOnNextLine = true; 4343 verifyFormat("SomeClassWithALongName::Constructor(\n" 4344 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4345 " int bbbbbbbbbbbbb,\n" 4346 " int cccccccccccccccc)\n" 4347 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4348 Style); 4349 4350 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4351 Style.AllowAllConstructorInitializersOnNextLine = false; 4352 verifyFormat("SomeClassWithALongName::Constructor(\n" 4353 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4354 " int bbbbbbbbbbbbb)\n" 4355 " : aaaaaaaaaaaaaaaaaaaa(a),\n" 4356 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4357 Style); 4358 4359 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4360 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4361 verifyFormat("SomeClassWithALongName::Constructor(\n" 4362 " int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n" 4363 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4364 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4365 Style); 4366 4367 Style.AllowAllConstructorInitializersOnNextLine = true; 4368 verifyFormat("SomeClassWithALongName::Constructor(\n" 4369 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4370 " int bbbbbbbbbbbbb,\n" 4371 " int cccccccccccccccc) :\n" 4372 " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}", 4373 Style); 4374 4375 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4376 Style.AllowAllConstructorInitializersOnNextLine = false; 4377 verifyFormat("SomeClassWithALongName::Constructor(\n" 4378 " int aaaaaaaaaaaaaaaaaaaaaaaa,\n" 4379 " int bbbbbbbbbbbbb) :\n" 4380 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4381 " bbbbbbbbbbbbbbbbbbbbb(b) {}", 4382 Style); 4383 } 4384 4385 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) { 4386 FormatStyle Style = getLLVMStyle(); 4387 Style.ColumnLimit = 60; 4388 Style.BinPackArguments = false; 4389 for (int i = 0; i < 4; ++i) { 4390 // Test all combinations of parameters that should not have an effect. 4391 Style.AllowAllParametersOfDeclarationOnNextLine = i & 1; 4392 Style.AllowAllConstructorInitializersOnNextLine = i & 2; 4393 4394 Style.AllowAllArgumentsOnNextLine = true; 4395 verifyFormat("void foo() {\n" 4396 " FunctionCallWithReallyLongName(\n" 4397 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n" 4398 "}", 4399 Style); 4400 Style.AllowAllArgumentsOnNextLine = false; 4401 verifyFormat("void foo() {\n" 4402 " FunctionCallWithReallyLongName(\n" 4403 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4404 " bbbbbbbbbbbb);\n" 4405 "}", 4406 Style); 4407 4408 Style.AllowAllArgumentsOnNextLine = true; 4409 verifyFormat("void foo() {\n" 4410 " auto VariableWithReallyLongName = {\n" 4411 " aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n" 4412 "}", 4413 Style); 4414 Style.AllowAllArgumentsOnNextLine = false; 4415 verifyFormat("void foo() {\n" 4416 " auto VariableWithReallyLongName = {\n" 4417 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4418 " bbbbbbbbbbbb};\n" 4419 "}", 4420 Style); 4421 } 4422 4423 // This parameter should not affect declarations. 4424 Style.BinPackParameters = false; 4425 Style.AllowAllArgumentsOnNextLine = false; 4426 Style.AllowAllParametersOfDeclarationOnNextLine = true; 4427 verifyFormat("void FunctionCallWithReallyLongName(\n" 4428 " int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);", 4429 Style); 4430 Style.AllowAllParametersOfDeclarationOnNextLine = false; 4431 verifyFormat("void FunctionCallWithReallyLongName(\n" 4432 " int aaaaaaaaaaaaaaaaaaaaaaa,\n" 4433 " int bbbbbbbbbbbb);", 4434 Style); 4435 } 4436 4437 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) { 4438 FormatStyle Style = getLLVMStyle(); 4439 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 4440 4441 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); 4442 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}", 4443 getStyleWithColumns(Style, 45)); 4444 verifyFormat("Constructor() :\n" 4445 " Initializer(FitsOnTheLine) {}", 4446 getStyleWithColumns(Style, 44)); 4447 verifyFormat("Constructor() :\n" 4448 " Initializer(FitsOnTheLine) {}", 4449 getStyleWithColumns(Style, 43)); 4450 4451 verifyFormat("template <typename T>\n" 4452 "Constructor() : Initializer(FitsOnTheLine) {}", 4453 getStyleWithColumns(Style, 50)); 4454 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4455 verifyFormat( 4456 "SomeClass::Constructor() :\n" 4457 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4458 Style); 4459 4460 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false; 4461 verifyFormat( 4462 "SomeClass::Constructor() :\n" 4463 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4464 Style); 4465 4466 verifyFormat( 4467 "SomeClass::Constructor() :\n" 4468 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4469 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4470 Style); 4471 verifyFormat( 4472 "SomeClass::Constructor() :\n" 4473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4474 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}", 4475 Style); 4476 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4477 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 4478 " aaaaaaaaaa(aaaaaa) {}", 4479 Style); 4480 4481 verifyFormat("Constructor() :\n" 4482 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4483 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4484 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 4485 " aaaaaaaaaaaaaaaaaaaaaaa() {}", 4486 Style); 4487 4488 verifyFormat("Constructor() :\n" 4489 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4490 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4491 Style); 4492 4493 verifyFormat("Constructor(int Parameter = 0) :\n" 4494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n" 4495 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}", 4496 Style); 4497 verifyFormat("Constructor() :\n" 4498 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n" 4499 "}", 4500 getStyleWithColumns(Style, 60)); 4501 verifyFormat("Constructor() :\n" 4502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4503 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}", 4504 Style); 4505 4506 // Here a line could be saved by splitting the second initializer onto two 4507 // lines, but that is not desirable. 4508 verifyFormat("Constructor() :\n" 4509 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n" 4510 " aaaaaaaaaaa(aaaaaaaaaaa),\n" 4511 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4512 Style); 4513 4514 FormatStyle OnePerLine = Style; 4515 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4516 OnePerLine.AllowAllConstructorInitializersOnNextLine = false; 4517 verifyFormat("SomeClass::Constructor() :\n" 4518 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4519 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4520 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4521 OnePerLine); 4522 verifyFormat("SomeClass::Constructor() :\n" 4523 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n" 4524 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 4525 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 4526 OnePerLine); 4527 verifyFormat("MyClass::MyClass(int var) :\n" 4528 " some_var_(var), // 4 space indent\n" 4529 " some_other_var_(var + 1) { // lined up\n" 4530 "}", 4531 OnePerLine); 4532 verifyFormat("Constructor() :\n" 4533 " aaaaa(aaaaaa),\n" 4534 " aaaaa(aaaaaa),\n" 4535 " aaaaa(aaaaaa),\n" 4536 " aaaaa(aaaaaa),\n" 4537 " aaaaa(aaaaaa) {}", 4538 OnePerLine); 4539 verifyFormat("Constructor() :\n" 4540 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n" 4541 " aaaaaaaaaaaaaaaaaaaaaa) {}", 4542 OnePerLine); 4543 OnePerLine.BinPackParameters = false; 4544 verifyFormat("Constructor() :\n" 4545 " aaaaaaaaaaaaaaaaaaaaaaaa(\n" 4546 " aaaaaaaaaaa().aaa(),\n" 4547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4548 OnePerLine); 4549 OnePerLine.ColumnLimit = 60; 4550 verifyFormat("Constructor() :\n" 4551 " aaaaaaaaaaaaaaaaaaaa(a),\n" 4552 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}", 4553 OnePerLine); 4554 4555 EXPECT_EQ("Constructor() :\n" 4556 " // Comment forcing unwanted break.\n" 4557 " aaaa(aaaa) {}", 4558 format("Constructor() :\n" 4559 " // Comment forcing unwanted break.\n" 4560 " aaaa(aaaa) {}", 4561 Style)); 4562 4563 Style.ColumnLimit = 0; 4564 verifyFormat("SomeClass::Constructor() :\n" 4565 " a(a) {}", 4566 Style); 4567 verifyFormat("SomeClass::Constructor() noexcept :\n" 4568 " a(a) {}", 4569 Style); 4570 verifyFormat("SomeClass::Constructor() :\n" 4571 " a(a), b(b), c(c) {}", 4572 Style); 4573 verifyFormat("SomeClass::Constructor() :\n" 4574 " a(a) {\n" 4575 " foo();\n" 4576 " bar();\n" 4577 "}", 4578 Style); 4579 4580 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 4581 verifyFormat("SomeClass::Constructor() :\n" 4582 " a(a), b(b), c(c) {\n" 4583 "}", 4584 Style); 4585 verifyFormat("SomeClass::Constructor() :\n" 4586 " a(a) {\n" 4587 "}", 4588 Style); 4589 4590 Style.ColumnLimit = 80; 4591 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 4592 Style.ConstructorInitializerIndentWidth = 2; 4593 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style); 4594 verifyFormat("SomeClass::Constructor() :\n" 4595 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4596 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}", 4597 Style); 4598 4599 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as 4600 // well 4601 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 4602 verifyFormat( 4603 "class SomeClass\n" 4604 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4605 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4606 Style); 4607 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 4608 verifyFormat( 4609 "class SomeClass\n" 4610 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4611 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4612 Style); 4613 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon; 4614 verifyFormat( 4615 "class SomeClass :\n" 4616 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4617 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};", 4618 Style); 4619 } 4620 4621 #ifndef EXPENSIVE_CHECKS 4622 // Expensive checks enables libstdc++ checking which includes validating the 4623 // state of ranges used in std::priority_queue - this blows out the 4624 // runtime/scalability of the function and makes this test unacceptably slow. 4625 TEST_F(FormatTest, MemoizationTests) { 4626 // This breaks if the memoization lookup does not take \c Indent and 4627 // \c LastSpace into account. 4628 verifyFormat( 4629 "extern CFRunLoopTimerRef\n" 4630 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n" 4631 " CFTimeInterval interval, CFOptionFlags flags,\n" 4632 " CFIndex order, CFRunLoopTimerCallBack callout,\n" 4633 " CFRunLoopTimerContext *context) {}"); 4634 4635 // Deep nesting somewhat works around our memoization. 4636 verifyFormat( 4637 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4638 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4639 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4640 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n" 4641 " aaaaa())))))))))))))))))))))))))))))))))))))));", 4642 getLLVMStyleWithColumns(65)); 4643 verifyFormat( 4644 "aaaaa(\n" 4645 " aaaaa,\n" 4646 " aaaaa(\n" 4647 " aaaaa,\n" 4648 " aaaaa(\n" 4649 " aaaaa,\n" 4650 " aaaaa(\n" 4651 " aaaaa,\n" 4652 " aaaaa(\n" 4653 " aaaaa,\n" 4654 " aaaaa(\n" 4655 " aaaaa,\n" 4656 " aaaaa(\n" 4657 " aaaaa,\n" 4658 " aaaaa(\n" 4659 " aaaaa,\n" 4660 " aaaaa(\n" 4661 " aaaaa,\n" 4662 " aaaaa(\n" 4663 " aaaaa,\n" 4664 " aaaaa(\n" 4665 " aaaaa,\n" 4666 " aaaaa(\n" 4667 " aaaaa,\n" 4668 " aaaaa))))))))))));", 4669 getLLVMStyleWithColumns(65)); 4670 verifyFormat( 4671 "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" 4672 " a),\n" 4673 " a),\n" 4674 " a),\n" 4675 " a),\n" 4676 " a),\n" 4677 " a),\n" 4678 " a),\n" 4679 " a),\n" 4680 " a),\n" 4681 " a),\n" 4682 " a),\n" 4683 " a),\n" 4684 " a),\n" 4685 " a),\n" 4686 " a),\n" 4687 " a),\n" 4688 " a)", 4689 getLLVMStyleWithColumns(65)); 4690 4691 // This test takes VERY long when memoization is broken. 4692 FormatStyle OnePerLine = getLLVMStyle(); 4693 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 4694 OnePerLine.BinPackParameters = false; 4695 std::string input = "Constructor()\n" 4696 " : aaaa(a,\n"; 4697 for (unsigned i = 0, e = 80; i != e; ++i) { 4698 input += " a,\n"; 4699 } 4700 input += " a) {}"; 4701 verifyFormat(input, OnePerLine); 4702 } 4703 #endif 4704 4705 TEST_F(FormatTest, BreaksAsHighAsPossible) { 4706 verifyFormat( 4707 "void f() {\n" 4708 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 4709 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 4710 " f();\n" 4711 "}"); 4712 verifyFormat("if (Intervals[i].getRange().getFirst() <\n" 4713 " Intervals[i - 1].getRange().getLast()) {\n}"); 4714 } 4715 4716 TEST_F(FormatTest, BreaksFunctionDeclarations) { 4717 // Principially, we break function declarations in a certain order: 4718 // 1) break amongst arguments. 4719 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n" 4720 " Cccccccccccccc cccccccccccccc);"); 4721 verifyFormat("template <class TemplateIt>\n" 4722 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n" 4723 " TemplateIt *stop) {}"); 4724 4725 // 2) break after return type. 4726 verifyFormat( 4727 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4728 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);", 4729 getGoogleStyle()); 4730 4731 // 3) break after (. 4732 verifyFormat( 4733 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n" 4734 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);", 4735 getGoogleStyle()); 4736 4737 // 4) break before after nested name specifiers. 4738 verifyFormat( 4739 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4740 "SomeClasssssssssssssssssssssssssssssssssssssss::\n" 4741 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);", 4742 getGoogleStyle()); 4743 4744 // However, there are exceptions, if a sufficient amount of lines can be 4745 // saved. 4746 // FIXME: The precise cut-offs wrt. the number of saved lines might need some 4747 // more adjusting. 4748 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4749 " Cccccccccccccc cccccccccc,\n" 4750 " Cccccccccccccc cccccccccc,\n" 4751 " Cccccccccccccc cccccccccc,\n" 4752 " Cccccccccccccc cccccccccc);"); 4753 verifyFormat( 4754 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4755 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4756 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4757 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);", 4758 getGoogleStyle()); 4759 verifyFormat( 4760 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n" 4761 " Cccccccccccccc cccccccccc,\n" 4762 " Cccccccccccccc cccccccccc,\n" 4763 " Cccccccccccccc cccccccccc,\n" 4764 " Cccccccccccccc cccccccccc,\n" 4765 " Cccccccccccccc cccccccccc,\n" 4766 " Cccccccccccccc cccccccccc);"); 4767 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 4768 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4769 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4770 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n" 4771 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);"); 4772 4773 // Break after multi-line parameters. 4774 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4776 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4777 " bbbb bbbb);"); 4778 verifyFormat("void SomeLoooooooooooongFunction(\n" 4779 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 4780 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4781 " int bbbbbbbbbbbbb);"); 4782 4783 // Treat overloaded operators like other functions. 4784 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4785 "operator>(const SomeLoooooooooooooooooooooooooogType &other);"); 4786 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4787 "operator>>(const SomeLooooooooooooooooooooooooogType &other);"); 4788 verifyFormat("SomeLoooooooooooooooooooooooooogType\n" 4789 "operator<<(const SomeLooooooooooooooooooooooooogType &other);"); 4790 verifyGoogleFormat( 4791 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n" 4792 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4793 verifyGoogleFormat( 4794 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n" 4795 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);"); 4796 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4797 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4798 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" 4799 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); 4800 verifyGoogleFormat( 4801 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" 4802 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4803 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); 4804 verifyGoogleFormat("template <typename T>\n" 4805 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4806 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n" 4807 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);"); 4808 4809 FormatStyle Style = getLLVMStyle(); 4810 Style.PointerAlignment = FormatStyle::PAS_Left; 4811 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4812 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}", 4813 Style); 4814 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" 4815 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 4816 Style); 4817 } 4818 4819 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) { 4820 // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516: 4821 // Prefer keeping `::` followed by `operator` together. 4822 EXPECT_EQ("const aaaa::bbbbbbb &\n" 4823 "ccccccccc::operator++() {\n" 4824 " stuff();\n" 4825 "}", 4826 format("const aaaa::bbbbbbb\n" 4827 "&ccccccccc::operator++() { stuff(); }", 4828 getLLVMStyleWithColumns(40))); 4829 } 4830 4831 TEST_F(FormatTest, TrailingReturnType) { 4832 verifyFormat("auto foo() -> int;\n"); 4833 verifyFormat("struct S {\n" 4834 " auto bar() const -> int;\n" 4835 "};"); 4836 verifyFormat("template <size_t Order, typename T>\n" 4837 "auto load_img(const std::string &filename)\n" 4838 " -> alias::tensor<Order, T, mem::tag::cpu> {}"); 4839 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" 4840 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); 4841 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); 4842 verifyFormat("template <typename T>\n" 4843 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n" 4844 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());"); 4845 4846 // Not trailing return types. 4847 verifyFormat("void f() { auto a = b->c(); }"); 4848 } 4849 4850 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { 4851 // Avoid breaking before trailing 'const' or other trailing annotations, if 4852 // they are not function-like. 4853 FormatStyle Style = getGoogleStyle(); 4854 Style.ColumnLimit = 47; 4855 verifyFormat("void someLongFunction(\n" 4856 " int someLoooooooooooooongParameter) const {\n}", 4857 getLLVMStyleWithColumns(47)); 4858 verifyFormat("LoooooongReturnType\n" 4859 "someLoooooooongFunction() const {}", 4860 getLLVMStyleWithColumns(47)); 4861 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n" 4862 " const {}", 4863 Style); 4864 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4865 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;"); 4866 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4867 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;"); 4868 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n" 4869 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;"); 4870 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n" 4871 " aaaaaaaaaaa aaaaa) const override;"); 4872 verifyGoogleFormat( 4873 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 4874 " const override;"); 4875 4876 // Even if the first parameter has to be wrapped. 4877 verifyFormat("void someLongFunction(\n" 4878 " int someLongParameter) const {}", 4879 getLLVMStyleWithColumns(46)); 4880 verifyFormat("void someLongFunction(\n" 4881 " int someLongParameter) const {}", 4882 Style); 4883 verifyFormat("void someLongFunction(\n" 4884 " int someLongParameter) override {}", 4885 Style); 4886 verifyFormat("void someLongFunction(\n" 4887 " int someLongParameter) OVERRIDE {}", 4888 Style); 4889 verifyFormat("void someLongFunction(\n" 4890 " int someLongParameter) final {}", 4891 Style); 4892 verifyFormat("void someLongFunction(\n" 4893 " int someLongParameter) FINAL {}", 4894 Style); 4895 verifyFormat("void someLongFunction(\n" 4896 " int parameter) const override {}", 4897 Style); 4898 4899 Style.BreakBeforeBraces = FormatStyle::BS_Allman; 4900 verifyFormat("void someLongFunction(\n" 4901 " int someLongParameter) const\n" 4902 "{\n" 4903 "}", 4904 Style); 4905 4906 Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 4907 verifyFormat("void someLongFunction(\n" 4908 " int someLongParameter) const\n" 4909 " {\n" 4910 " }", 4911 Style); 4912 4913 // Unless these are unknown annotations. 4914 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n" 4915 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4916 " LONG_AND_UGLY_ANNOTATION;"); 4917 4918 // Breaking before function-like trailing annotations is fine to keep them 4919 // close to their arguments. 4920 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 4921 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4922 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4923 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);"); 4924 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n" 4925 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); 4926 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" 4927 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); 4928 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); 4929 4930 verifyFormat( 4931 "void aaaaaaaaaaaaaaaaaa()\n" 4932 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n" 4933 " aaaaaaaaaaaaaaaaaaaaaaaaa));"); 4934 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4935 " __attribute__((unused));"); 4936 verifyGoogleFormat( 4937 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4938 " GUARDED_BY(aaaaaaaaaaaa);"); 4939 verifyGoogleFormat( 4940 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4941 " GUARDED_BY(aaaaaaaaaaaa);"); 4942 verifyGoogleFormat( 4943 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4944 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 4945 verifyGoogleFormat( 4946 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n" 4947 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 4948 } 4949 4950 TEST_F(FormatTest, FunctionAnnotations) { 4951 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4952 "int OldFunction(const string ¶meter) {}"); 4953 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4954 "string OldFunction(const string ¶meter) {}"); 4955 verifyFormat("template <typename T>\n" 4956 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" 4957 "string OldFunction(const string ¶meter) {}"); 4958 4959 // Not function annotations. 4960 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 4961 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); 4962 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n" 4963 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}"); 4964 verifyFormat("MACRO(abc).function() // wrap\n" 4965 " << abc;"); 4966 verifyFormat("MACRO(abc)->function() // wrap\n" 4967 " << abc;"); 4968 verifyFormat("MACRO(abc)::function() // wrap\n" 4969 " << abc;"); 4970 } 4971 4972 TEST_F(FormatTest, BreaksDesireably) { 4973 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4974 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 4975 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}"); 4976 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4977 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n" 4978 "}"); 4979 4980 verifyFormat( 4981 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 4982 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}"); 4983 4984 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4986 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 4987 4988 verifyFormat( 4989 "aaaaaaaa(aaaaaaaaaaaaa,\n" 4990 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4991 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 4992 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 4993 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 4994 4995 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 4996 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 4997 4998 verifyFormat( 4999 "void f() {\n" 5000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n" 5001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5002 "}"); 5003 verifyFormat( 5004 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5005 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5006 verifyFormat( 5007 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 5009 verifyFormat( 5010 "aaaaaa(aaa,\n" 5011 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5012 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5013 " aaaa);"); 5014 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5016 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5017 5018 // Indent consistently independent of call expression and unary operator. 5019 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5020 " dddddddddddddddddddddddddddddd));"); 5021 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 5022 " dddddddddddddddddddddddddddddd));"); 5023 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n" 5024 " dddddddddddddddddddddddddddddd));"); 5025 5026 // This test case breaks on an incorrect memoization, i.e. an optimization not 5027 // taking into account the StopAt value. 5028 verifyFormat( 5029 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5030 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5031 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n" 5032 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5033 5034 verifyFormat("{\n {\n {\n" 5035 " Annotation.SpaceRequiredBefore =\n" 5036 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n" 5037 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n" 5038 " }\n }\n}"); 5039 5040 // Break on an outer level if there was a break on an inner level. 5041 EXPECT_EQ("f(g(h(a, // comment\n" 5042 " b, c),\n" 5043 " d, e),\n" 5044 " x, y);", 5045 format("f(g(h(a, // comment\n" 5046 " b, c), d, e), x, y);")); 5047 5048 // Prefer breaking similar line breaks. 5049 verifyFormat( 5050 "const int kTrackingOptions = NSTrackingMouseMoved |\n" 5051 " NSTrackingMouseEnteredAndExited |\n" 5052 " NSTrackingActiveAlways;"); 5053 } 5054 5055 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { 5056 FormatStyle NoBinPacking = getGoogleStyle(); 5057 NoBinPacking.BinPackParameters = false; 5058 NoBinPacking.BinPackArguments = true; 5059 verifyFormat("void f() {\n" 5060 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" 5061 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 5062 "}", 5063 NoBinPacking); 5064 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" 5065 " int aaaaaaaaaaaaaaaaaaaa,\n" 5066 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5067 NoBinPacking); 5068 5069 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5070 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5071 " vector<int> bbbbbbbbbbbbbbb);", 5072 NoBinPacking); 5073 // FIXME: This behavior difference is probably not wanted. However, currently 5074 // we cannot distinguish BreakBeforeParameter being set because of the wrapped 5075 // template arguments from BreakBeforeParameter being set because of the 5076 // one-per-line formatting. 5077 verifyFormat( 5078 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5079 " aaaaaaaaaa> aaaaaaaaaa);", 5080 NoBinPacking); 5081 verifyFormat( 5082 "void fffffffffff(\n" 5083 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n" 5084 " aaaaaaaaaa);"); 5085 } 5086 5087 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { 5088 FormatStyle NoBinPacking = getGoogleStyle(); 5089 NoBinPacking.BinPackParameters = false; 5090 NoBinPacking.BinPackArguments = false; 5091 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" 5092 " aaaaaaaaaaaaaaaaaaaa,\n" 5093 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", 5094 NoBinPacking); 5095 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n" 5096 " aaaaaaaaaaaaa,\n" 5097 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));", 5098 NoBinPacking); 5099 verifyFormat( 5100 "aaaaaaaa(aaaaaaaaaaaaa,\n" 5101 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5102 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 5103 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));", 5105 NoBinPacking); 5106 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5107 " .aaaaaaaaaaaaaaaaaa();", 5108 NoBinPacking); 5109 verifyFormat("void f() {\n" 5110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5111 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n" 5112 "}", 5113 NoBinPacking); 5114 5115 verifyFormat( 5116 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5117 " aaaaaaaaaaaa,\n" 5118 " aaaaaaaaaaaa);", 5119 NoBinPacking); 5120 verifyFormat( 5121 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n" 5122 " ddddddddddddddddddddddddddddd),\n" 5123 " test);", 5124 NoBinPacking); 5125 5126 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n" 5127 " aaaaaaaaaaaaaaaaaaaaaaa,\n" 5128 " aaaaaaaaaaaaaaaaaaaaaaa>\n" 5129 " aaaaaaaaaaaaaaaaaa;", 5130 NoBinPacking); 5131 verifyFormat("a(\"a\"\n" 5132 " \"a\",\n" 5133 " a);"); 5134 5135 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false; 5136 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n" 5137 " aaaaaaaaa,\n" 5138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5139 NoBinPacking); 5140 verifyFormat( 5141 "void f() {\n" 5142 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n" 5143 " .aaaaaaa();\n" 5144 "}", 5145 NoBinPacking); 5146 verifyFormat( 5147 "template <class SomeType, class SomeOtherType>\n" 5148 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}", 5149 NoBinPacking); 5150 } 5151 5152 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) { 5153 FormatStyle Style = getLLVMStyleWithColumns(15); 5154 Style.ExperimentalAutoDetectBinPacking = true; 5155 EXPECT_EQ("aaa(aaaa,\n" 5156 " aaaa,\n" 5157 " aaaa);\n" 5158 "aaa(aaaa,\n" 5159 " aaaa,\n" 5160 " aaaa);", 5161 format("aaa(aaaa,\n" // one-per-line 5162 " aaaa,\n" 5163 " aaaa );\n" 5164 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5165 Style)); 5166 EXPECT_EQ("aaa(aaaa, aaaa,\n" 5167 " aaaa);\n" 5168 "aaa(aaaa, aaaa,\n" 5169 " aaaa);", 5170 format("aaa(aaaa, aaaa,\n" // bin-packed 5171 " aaaa );\n" 5172 "aaa(aaaa, aaaa, aaaa);", // inconclusive 5173 Style)); 5174 } 5175 5176 TEST_F(FormatTest, FormatsBuilderPattern) { 5177 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n" 5178 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n" 5179 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n" 5180 " .StartsWith(\".init\", ORDER_INIT)\n" 5181 " .StartsWith(\".fini\", ORDER_FINI)\n" 5182 " .StartsWith(\".hash\", ORDER_HASH)\n" 5183 " .Default(ORDER_TEXT);\n"); 5184 5185 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n" 5186 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();"); 5187 verifyFormat("aaaaaaa->aaaaaaa\n" 5188 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5189 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5190 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5191 verifyFormat( 5192 "aaaaaaa->aaaaaaa\n" 5193 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5194 " ->aaaaaaaa(aaaaaaaaaaaaaaa);"); 5195 verifyFormat( 5196 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n" 5197 " aaaaaaaaaaaaaa);"); 5198 verifyFormat( 5199 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n" 5200 " aaaaaa->aaaaaaaaaaaa()\n" 5201 " ->aaaaaaaaaaaaaaaa(\n" 5202 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5203 " ->aaaaaaaaaaaaaaaaa();"); 5204 verifyGoogleFormat( 5205 "void f() {\n" 5206 " someo->Add((new util::filetools::Handler(dir))\n" 5207 " ->OnEvent1(NewPermanentCallback(\n" 5208 " this, &HandlerHolderClass::EventHandlerCBA))\n" 5209 " ->OnEvent2(NewPermanentCallback(\n" 5210 " this, &HandlerHolderClass::EventHandlerCBB))\n" 5211 " ->OnEvent3(NewPermanentCallback(\n" 5212 " this, &HandlerHolderClass::EventHandlerCBC))\n" 5213 " ->OnEvent5(NewPermanentCallback(\n" 5214 " this, &HandlerHolderClass::EventHandlerCBD))\n" 5215 " ->OnEvent6(NewPermanentCallback(\n" 5216 " this, &HandlerHolderClass::EventHandlerCBE)));\n" 5217 "}"); 5218 5219 verifyFormat( 5220 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();"); 5221 verifyFormat("aaaaaaaaaaaaaaa()\n" 5222 " .aaaaaaaaaaaaaaa()\n" 5223 " .aaaaaaaaaaaaaaa()\n" 5224 " .aaaaaaaaaaaaaaa()\n" 5225 " .aaaaaaaaaaaaaaa();"); 5226 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5227 " .aaaaaaaaaaaaaaa()\n" 5228 " .aaaaaaaaaaaaaaa()\n" 5229 " .aaaaaaaaaaaaaaa();"); 5230 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5231 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n" 5232 " .aaaaaaaaaaaaaaa();"); 5233 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n" 5234 " ->aaaaaaaaaaaaaae(0)\n" 5235 " ->aaaaaaaaaaaaaaa();"); 5236 5237 // Don't linewrap after very short segments. 5238 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5239 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5240 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5241 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5242 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5243 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5244 verifyFormat("aaa()\n" 5245 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5246 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5247 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 5248 5249 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5250 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 5251 " .has<bbbbbbbbbbbbbbbbbbbbb>();"); 5252 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n" 5253 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 5254 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();"); 5255 5256 // Prefer not to break after empty parentheses. 5257 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n" 5258 " First->LastNewlineOffset);"); 5259 5260 // Prefer not to create "hanging" indents. 5261 verifyFormat( 5262 "return !soooooooooooooome_map\n" 5263 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5264 " .second;"); 5265 verifyFormat( 5266 "return aaaaaaaaaaaaaaaa\n" 5267 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n" 5268 " .aaaa(aaaaaaaaaaaaaa);"); 5269 // No hanging indent here. 5270 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n" 5271 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5272 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n" 5273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5274 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5275 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5276 getLLVMStyleWithColumns(60)); 5277 verifyFormat("aaaaaaaaaaaaaaaaaa\n" 5278 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n" 5279 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5280 getLLVMStyleWithColumns(59)); 5281 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5282 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5283 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5284 5285 // Dont break if only closing statements before member call 5286 verifyFormat("test() {\n" 5287 " ([]() -> {\n" 5288 " int b = 32;\n" 5289 " return 3;\n" 5290 " }).foo();\n" 5291 "}"); 5292 verifyFormat("test() {\n" 5293 " (\n" 5294 " []() -> {\n" 5295 " int b = 32;\n" 5296 " return 3;\n" 5297 " },\n" 5298 " foo, bar)\n" 5299 " .foo();\n" 5300 "}"); 5301 verifyFormat("test() {\n" 5302 " ([]() -> {\n" 5303 " int b = 32;\n" 5304 " return 3;\n" 5305 " })\n" 5306 " .foo()\n" 5307 " .bar();\n" 5308 "}"); 5309 verifyFormat("test() {\n" 5310 " ([]() -> {\n" 5311 " int b = 32;\n" 5312 " return 3;\n" 5313 " })\n" 5314 " .foo(\"aaaaaaaaaaaaaaaaa\"\n" 5315 " \"bbbb\");\n" 5316 "}", 5317 getLLVMStyleWithColumns(30)); 5318 } 5319 5320 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) { 5321 verifyFormat( 5322 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n" 5323 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}"); 5324 verifyFormat( 5325 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n" 5326 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}"); 5327 5328 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5329 " ccccccccccccccccccccccccc) {\n}"); 5330 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n" 5331 " ccccccccccccccccccccccccc) {\n}"); 5332 5333 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n" 5334 " ccccccccccccccccccccccccc) {\n}"); 5335 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n" 5336 " ccccccccccccccccccccccccc) {\n}"); 5337 5338 verifyFormat( 5339 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n" 5340 " ccccccccccccccccccccccccc) {\n}"); 5341 verifyFormat( 5342 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n" 5343 " ccccccccccccccccccccccccc) {\n}"); 5344 5345 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n" 5346 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n" 5347 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n" 5348 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5349 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n" 5350 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n" 5351 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n" 5352 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;"); 5353 5354 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n" 5355 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n" 5356 " aaaaaaaaaaaaaaa != aa) {\n}"); 5357 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n" 5358 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n" 5359 " aaaaaaaaaaaaaaa != aa) {\n}"); 5360 } 5361 5362 TEST_F(FormatTest, BreaksAfterAssignments) { 5363 verifyFormat( 5364 "unsigned Cost =\n" 5365 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n" 5366 " SI->getPointerAddressSpaceee());\n"); 5367 verifyFormat( 5368 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n" 5369 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());"); 5370 5371 verifyFormat( 5372 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n" 5373 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);"); 5374 verifyFormat("unsigned OriginalStartColumn =\n" 5375 " SourceMgr.getSpellingColumnNumber(\n" 5376 " Current.FormatTok.getStartOfNonWhitespace()) -\n" 5377 " 1;"); 5378 } 5379 5380 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) { 5381 FormatStyle Style = getLLVMStyle(); 5382 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5383 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;", 5384 Style); 5385 5386 Style.PenaltyBreakAssignment = 20; 5387 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n" 5388 " cccccccccccccccccccccccccc;", 5389 Style); 5390 } 5391 5392 TEST_F(FormatTest, AlignsAfterAssignments) { 5393 verifyFormat( 5394 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5395 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5396 verifyFormat( 5397 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5398 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5399 verifyFormat( 5400 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5401 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5402 verifyFormat( 5403 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5404 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5405 verifyFormat( 5406 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5407 " aaaaaaaaaaaaaaaaaaaaaaaa +\n" 5408 " aaaaaaaaaaaaaaaaaaaaaaaa;"); 5409 } 5410 5411 TEST_F(FormatTest, AlignsAfterReturn) { 5412 verifyFormat( 5413 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5414 " aaaaaaaaaaaaaaaaaaaaaaaaa;"); 5415 verifyFormat( 5416 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5417 " aaaaaaaaaaaaaaaaaaaaaaaaa);"); 5418 verifyFormat( 5419 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5420 " aaaaaaaaaaaaaaaaaaaaaa();"); 5421 verifyFormat( 5422 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n" 5423 " aaaaaaaaaaaaaaaaaaaaaa());"); 5424 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5425 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5426 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n" 5428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5429 verifyFormat("return\n" 5430 " // true if code is one of a or b.\n" 5431 " code == a || code == b;"); 5432 } 5433 5434 TEST_F(FormatTest, AlignsAfterOpenBracket) { 5435 verifyFormat( 5436 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5437 " aaaaaaaaa aaaaaaa) {}"); 5438 verifyFormat( 5439 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5440 " aaaaaaaaaaa aaaaaaaaa);"); 5441 verifyFormat( 5442 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5443 " aaaaaaaaaaaaaaaaaaaaa));"); 5444 FormatStyle Style = getLLVMStyle(); 5445 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5446 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5447 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", 5448 Style); 5449 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5450 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", 5451 Style); 5452 verifyFormat("SomeLongVariableName->someFunction(\n" 5453 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", 5454 Style); 5455 verifyFormat( 5456 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" 5457 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5458 Style); 5459 verifyFormat( 5460 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" 5461 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5462 Style); 5463 verifyFormat( 5464 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" 5465 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5466 Style); 5467 5468 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n" 5469 " ccccccc(aaaaaaaaaaaaaaaaa, //\n" 5470 " b));", 5471 Style); 5472 5473 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 5474 Style.BinPackArguments = false; 5475 Style.BinPackParameters = false; 5476 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5477 " aaaaaaaaaaa aaaaaaaa,\n" 5478 " aaaaaaaaa aaaaaaa,\n" 5479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", 5480 Style); 5481 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n" 5482 " aaaaaaaaaaa aaaaaaaaa,\n" 5483 " aaaaaaaaaaa aaaaaaaaa,\n" 5484 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5485 Style); 5486 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n" 5487 " aaaaaaaaaaaaaaa,\n" 5488 " aaaaaaaaaaaaaaaaaaaaa,\n" 5489 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", 5490 Style); 5491 verifyFormat( 5492 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n" 5493 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5494 Style); 5495 verifyFormat( 5496 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n" 5497 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));", 5498 Style); 5499 verifyFormat( 5500 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5501 " aaaaaaaaaaaaaaaaaaaaa(\n" 5502 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n" 5503 " aaaaaaaaaaaaaaaa);", 5504 Style); 5505 verifyFormat( 5506 "aaaaaaaaaaaaaaaaaaaaaaaa(\n" 5507 " aaaaaaaaaaaaaaaaaaaaa(\n" 5508 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n" 5509 " aaaaaaaaaaaaaaaa);", 5510 Style); 5511 } 5512 5513 TEST_F(FormatTest, ParenthesesAndOperandAlignment) { 5514 FormatStyle Style = getLLVMStyleWithColumns(40); 5515 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5516 " bbbbbbbbbbbbbbbbbbbbbb);", 5517 Style); 5518 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; 5519 Style.AlignOperands = false; 5520 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5521 " bbbbbbbbbbbbbbbbbbbbbb);", 5522 Style); 5523 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5524 Style.AlignOperands = true; 5525 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5526 " bbbbbbbbbbbbbbbbbbbbbb);", 5527 Style); 5528 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 5529 Style.AlignOperands = false; 5530 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" 5531 " bbbbbbbbbbbbbbbbbbbbbb);", 5532 Style); 5533 } 5534 5535 TEST_F(FormatTest, BreaksConditionalExpressions) { 5536 verifyFormat( 5537 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5538 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5539 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5540 verifyFormat( 5541 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5542 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5543 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5544 verifyFormat( 5545 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5546 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5547 verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n" 5548 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5549 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5550 verifyFormat( 5551 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n" 5552 " : aaaaaaaaaaaaa);"); 5553 verifyFormat( 5554 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5555 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5556 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5557 " aaaaaaaaaaaaa);"); 5558 verifyFormat( 5559 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5560 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5561 " aaaaaaaaaaaaa);"); 5562 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5563 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5565 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5566 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5567 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5569 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 5571 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5573 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5574 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5576 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5578 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 5579 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5580 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5581 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5582 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5584 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5585 " : aaaaaaaaaaaaaaaa;"); 5586 verifyFormat( 5587 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5588 " ? aaaaaaaaaaaaaaa\n" 5589 " : aaaaaaaaaaaaaaa;"); 5590 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5591 " aaaaaaaaa\n" 5592 " ? b\n" 5593 " : c);"); 5594 verifyFormat("return aaaa == bbbb\n" 5595 " // comment\n" 5596 " ? aaaa\n" 5597 " : bbbb;"); 5598 verifyFormat("unsigned Indent =\n" 5599 " format(TheLine.First,\n" 5600 " IndentForLevel[TheLine.Level] >= 0\n" 5601 " ? IndentForLevel[TheLine.Level]\n" 5602 " : TheLine * 2,\n" 5603 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5604 getLLVMStyleWithColumns(60)); 5605 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5606 " ? aaaaaaaaaaaaaaa\n" 5607 " : bbbbbbbbbbbbbbb //\n" 5608 " ? ccccccccccccccc\n" 5609 " : ddddddddddddddd;"); 5610 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n" 5611 " ? aaaaaaaaaaaaaaa\n" 5612 " : (bbbbbbbbbbbbbbb //\n" 5613 " ? ccccccccccccccc\n" 5614 " : ddddddddddddddd);"); 5615 verifyFormat( 5616 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5617 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n" 5618 " aaaaaaaaaaaaaaaaaaaaa +\n" 5619 " aaaaaaaaaaaaaaaaaaaaa\n" 5620 " : aaaaaaaaaa;"); 5621 verifyFormat( 5622 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5623 " : aaaaaaaaaaaaaaaaaaaaaa\n" 5624 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 5625 5626 FormatStyle NoBinPacking = getLLVMStyle(); 5627 NoBinPacking.BinPackArguments = false; 5628 verifyFormat( 5629 "void f() {\n" 5630 " g(aaa,\n" 5631 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5633 " ? aaaaaaaaaaaaaaa\n" 5634 " : aaaaaaaaaaaaaaa);\n" 5635 "}", 5636 NoBinPacking); 5637 verifyFormat( 5638 "void f() {\n" 5639 " g(aaa,\n" 5640 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n" 5641 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5642 " ?: aaaaaaaaaaaaaaa);\n" 5643 "}", 5644 NoBinPacking); 5645 5646 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" 5647 " // comment.\n" 5648 " ccccccccccccccccccccccccccccccccccccccc\n" 5649 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5650 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); 5651 5652 // Assignments in conditional expressions. Apparently not uncommon :-(. 5653 verifyFormat("return a != b\n" 5654 " // comment\n" 5655 " ? a = b\n" 5656 " : a = b;"); 5657 verifyFormat("return a != b\n" 5658 " // comment\n" 5659 " ? a = a != b\n" 5660 " // comment\n" 5661 " ? a = b\n" 5662 " : a\n" 5663 " : a;\n"); 5664 verifyFormat("return a != b\n" 5665 " // comment\n" 5666 " ? a\n" 5667 " : a = a != b\n" 5668 " // comment\n" 5669 " ? a = b\n" 5670 " : a;"); 5671 } 5672 5673 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { 5674 FormatStyle Style = getLLVMStyle(); 5675 Style.BreakBeforeTernaryOperators = false; 5676 Style.ColumnLimit = 70; 5677 verifyFormat( 5678 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5681 Style); 5682 verifyFormat( 5683 "aaaa(aaaaaaaaaa, aaaaaaaa,\n" 5684 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5686 Style); 5687 verifyFormat( 5688 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5690 Style); 5691 verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n" 5692 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5694 Style); 5695 verifyFormat( 5696 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n" 5697 " aaaaaaaaaaaaa);", 5698 Style); 5699 verifyFormat( 5700 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5701 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5703 " aaaaaaaaaaaaa);", 5704 Style); 5705 verifyFormat( 5706 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5707 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5708 " aaaaaaaaaaaaa);", 5709 Style); 5710 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5715 Style); 5716 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n" 5720 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5722 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5723 Style); 5724 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 5725 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n" 5726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 5727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n" 5728 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);", 5729 Style); 5730 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5731 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5732 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5733 Style); 5734 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n" 5735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n" 5737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 5738 Style); 5739 verifyFormat( 5740 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5741 " aaaaaaaaaaaaaaa :\n" 5742 " aaaaaaaaaaaaaaa;", 5743 Style); 5744 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n" 5745 " aaaaaaaaa ?\n" 5746 " b :\n" 5747 " c);", 5748 Style); 5749 verifyFormat("unsigned Indent =\n" 5750 " format(TheLine.First,\n" 5751 " IndentForLevel[TheLine.Level] >= 0 ?\n" 5752 " IndentForLevel[TheLine.Level] :\n" 5753 " TheLine * 2,\n" 5754 " TheLine.InPPDirective, PreviousEndOfLineColumn);", 5755 Style); 5756 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5757 " aaaaaaaaaaaaaaa :\n" 5758 " bbbbbbbbbbbbbbb ? //\n" 5759 " ccccccccccccccc :\n" 5760 " ddddddddddddddd;", 5761 Style); 5762 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n" 5763 " aaaaaaaaaaaaaaa :\n" 5764 " (bbbbbbbbbbbbbbb ? //\n" 5765 " ccccccccccccccc :\n" 5766 " ddddddddddddddd);", 5767 Style); 5768 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5769 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n" 5770 " ccccccccccccccccccccccccccc;", 5771 Style); 5772 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n" 5773 " aaaaa :\n" 5774 " bbbbbbbbbbbbbbb + cccccccccccccccc;", 5775 Style); 5776 } 5777 5778 TEST_F(FormatTest, DeclarationsOfMultipleVariables) { 5779 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n" 5780 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();"); 5781 verifyFormat("bool a = true, b = false;"); 5782 5783 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n" 5784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n" 5785 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n" 5786 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);"); 5787 verifyFormat( 5788 "bool aaaaaaaaaaaaaaaaaaaaa =\n" 5789 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n" 5790 " d = e && f;"); 5791 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n" 5792 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;"); 5793 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5794 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;"); 5795 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n" 5796 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;"); 5797 5798 FormatStyle Style = getGoogleStyle(); 5799 Style.PointerAlignment = FormatStyle::PAS_Left; 5800 Style.DerivePointerAlignment = false; 5801 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 5802 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" 5803 " *b = bbbbbbbbbbbbbbbbbbb;", 5804 Style); 5805 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" 5806 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;", 5807 Style); 5808 verifyFormat("vector<int*> a, b;", Style); 5809 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style); 5810 } 5811 5812 TEST_F(FormatTest, ConditionalExpressionsInBrackets) { 5813 verifyFormat("arr[foo ? bar : baz];"); 5814 verifyFormat("f()[foo ? bar : baz];"); 5815 verifyFormat("(a + b)[foo ? bar : baz];"); 5816 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];"); 5817 } 5818 5819 TEST_F(FormatTest, AlignsStringLiterals) { 5820 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 5821 " \"short literal\");"); 5822 verifyFormat( 5823 "looooooooooooooooooooooooongFunction(\n" 5824 " \"short literal\"\n" 5825 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 5826 verifyFormat("someFunction(\"Always break between multi-line\"\n" 5827 " \" string literals\",\n" 5828 " and, other, parameters);"); 5829 EXPECT_EQ("fun + \"1243\" /* comment */\n" 5830 " \"5678\";", 5831 format("fun + \"1243\" /* comment */\n" 5832 " \"5678\";", 5833 getLLVMStyleWithColumns(28))); 5834 EXPECT_EQ( 5835 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 5836 " \"aaaaaaaaaaaaaaaaaaaaa\"\n" 5837 " \"aaaaaaaaaaaaaaaa\";", 5838 format("aaaaaa =" 5839 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " 5840 "aaaaaaaaaaaaaaaaaaaaa\" " 5841 "\"aaaaaaaaaaaaaaaa\";")); 5842 verifyFormat("a = a + \"a\"\n" 5843 " \"a\"\n" 5844 " \"a\";"); 5845 verifyFormat("f(\"a\", \"b\"\n" 5846 " \"c\");"); 5847 5848 verifyFormat( 5849 "#define LL_FORMAT \"ll\"\n" 5850 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n" 5851 " \"d, ddddddddd: %\" LL_FORMAT \"d\");"); 5852 5853 verifyFormat("#define A(X) \\\n" 5854 " \"aaaaa\" #X \"bbbbbb\" \\\n" 5855 " \"ccccc\"", 5856 getLLVMStyleWithColumns(23)); 5857 verifyFormat("#define A \"def\"\n" 5858 "f(\"abc\" A \"ghi\"\n" 5859 " \"jkl\");"); 5860 5861 verifyFormat("f(L\"a\"\n" 5862 " L\"b\");"); 5863 verifyFormat("#define A(X) \\\n" 5864 " L\"aaaaa\" #X L\"bbbbbb\" \\\n" 5865 " L\"ccccc\"", 5866 getLLVMStyleWithColumns(25)); 5867 5868 verifyFormat("f(@\"a\"\n" 5869 " @\"b\");"); 5870 verifyFormat("NSString s = @\"a\"\n" 5871 " @\"b\"\n" 5872 " @\"c\";"); 5873 verifyFormat("NSString s = @\"a\"\n" 5874 " \"b\"\n" 5875 " \"c\";"); 5876 } 5877 5878 TEST_F(FormatTest, ReturnTypeBreakingStyle) { 5879 FormatStyle Style = getLLVMStyle(); 5880 // No declarations or definitions should be moved to own line. 5881 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; 5882 verifyFormat("class A {\n" 5883 " int f() { return 1; }\n" 5884 " int g();\n" 5885 "};\n" 5886 "int f() { return 1; }\n" 5887 "int g();\n", 5888 Style); 5889 5890 // All declarations and definitions should have the return type moved to its 5891 // own 5892 // line. 5893 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 5894 verifyFormat("class E {\n" 5895 " int\n" 5896 " f() {\n" 5897 " return 1;\n" 5898 " }\n" 5899 " int\n" 5900 " g();\n" 5901 "};\n" 5902 "int\n" 5903 "f() {\n" 5904 " return 1;\n" 5905 "}\n" 5906 "int\n" 5907 "g();\n", 5908 Style); 5909 5910 // Top-level definitions, and no kinds of declarations should have the 5911 // return type moved to its own line. 5912 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions; 5913 verifyFormat("class B {\n" 5914 " int f() { return 1; }\n" 5915 " int g();\n" 5916 "};\n" 5917 "int\n" 5918 "f() {\n" 5919 " return 1;\n" 5920 "}\n" 5921 "int g();\n", 5922 Style); 5923 5924 // Top-level definitions and declarations should have the return type moved 5925 // to its own line. 5926 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel; 5927 verifyFormat("class C {\n" 5928 " int f() { return 1; }\n" 5929 " int g();\n" 5930 "};\n" 5931 "int\n" 5932 "f() {\n" 5933 " return 1;\n" 5934 "}\n" 5935 "int\n" 5936 "g();\n", 5937 Style); 5938 5939 // All definitions should have the return type moved to its own line, but no 5940 // kinds of declarations. 5941 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 5942 verifyFormat("class D {\n" 5943 " int\n" 5944 " f() {\n" 5945 " return 1;\n" 5946 " }\n" 5947 " int g();\n" 5948 "};\n" 5949 "int\n" 5950 "f() {\n" 5951 " return 1;\n" 5952 "}\n" 5953 "int g();\n", 5954 Style); 5955 verifyFormat("const char *\n" 5956 "f(void) {\n" // Break here. 5957 " return \"\";\n" 5958 "}\n" 5959 "const char *bar(void);\n", // No break here. 5960 Style); 5961 verifyFormat("template <class T>\n" 5962 "T *\n" 5963 "f(T &c) {\n" // Break here. 5964 " return NULL;\n" 5965 "}\n" 5966 "template <class T> T *f(T &c);\n", // No break here. 5967 Style); 5968 verifyFormat("class C {\n" 5969 " int\n" 5970 " operator+() {\n" 5971 " return 1;\n" 5972 " }\n" 5973 " int\n" 5974 " operator()() {\n" 5975 " return 1;\n" 5976 " }\n" 5977 "};\n", 5978 Style); 5979 verifyFormat("void\n" 5980 "A::operator()() {}\n" 5981 "void\n" 5982 "A::operator>>() {}\n" 5983 "void\n" 5984 "A::operator+() {}\n", 5985 Style); 5986 verifyFormat("void *operator new(std::size_t s);", // No break here. 5987 Style); 5988 verifyFormat("void *\n" 5989 "operator new(std::size_t s) {}", 5990 Style); 5991 verifyFormat("void *\n" 5992 "operator delete[](void *ptr) {}", 5993 Style); 5994 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 5995 verifyFormat("const char *\n" 5996 "f(void)\n" // Break here. 5997 "{\n" 5998 " return \"\";\n" 5999 "}\n" 6000 "const char *bar(void);\n", // No break here. 6001 Style); 6002 verifyFormat("template <class T>\n" 6003 "T *\n" // Problem here: no line break 6004 "f(T &c)\n" // Break here. 6005 "{\n" 6006 " return NULL;\n" 6007 "}\n" 6008 "template <class T> T *f(T &c);\n", // No break here. 6009 Style); 6010 verifyFormat("int\n" 6011 "foo(A<bool> a)\n" 6012 "{\n" 6013 " return a;\n" 6014 "}\n", 6015 Style); 6016 verifyFormat("int\n" 6017 "foo(A<8> a)\n" 6018 "{\n" 6019 " return a;\n" 6020 "}\n", 6021 Style); 6022 verifyFormat("int\n" 6023 "foo(A<B<bool>, 8> a)\n" 6024 "{\n" 6025 " return a;\n" 6026 "}\n", 6027 Style); 6028 verifyFormat("int\n" 6029 "foo(A<B<8>, bool> a)\n" 6030 "{\n" 6031 " return a;\n" 6032 "}\n", 6033 Style); 6034 verifyFormat("int\n" 6035 "foo(A<B<bool>, bool> a)\n" 6036 "{\n" 6037 " return a;\n" 6038 "}\n", 6039 Style); 6040 verifyFormat("int\n" 6041 "foo(A<B<8>, 8> a)\n" 6042 "{\n" 6043 " return a;\n" 6044 "}\n", 6045 Style); 6046 6047 Style = getGNUStyle(); 6048 6049 // Test for comments at the end of function declarations. 6050 verifyFormat("void\n" 6051 "foo (int a, /*abc*/ int b) // def\n" 6052 "{\n" 6053 "}\n", 6054 Style); 6055 6056 verifyFormat("void\n" 6057 "foo (int a, /* abc */ int b) /* def */\n" 6058 "{\n" 6059 "}\n", 6060 Style); 6061 6062 // Definitions that should not break after return type 6063 verifyFormat("void foo (int a, int b); // def\n", Style); 6064 verifyFormat("void foo (int a, int b); /* def */\n", Style); 6065 verifyFormat("void foo (int a, int b);\n", Style); 6066 } 6067 6068 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { 6069 FormatStyle NoBreak = getLLVMStyle(); 6070 NoBreak.AlwaysBreakBeforeMultilineStrings = false; 6071 FormatStyle Break = getLLVMStyle(); 6072 Break.AlwaysBreakBeforeMultilineStrings = true; 6073 verifyFormat("aaaa = \"bbbb\"\n" 6074 " \"cccc\";", 6075 NoBreak); 6076 verifyFormat("aaaa =\n" 6077 " \"bbbb\"\n" 6078 " \"cccc\";", 6079 Break); 6080 verifyFormat("aaaa(\"bbbb\"\n" 6081 " \"cccc\");", 6082 NoBreak); 6083 verifyFormat("aaaa(\n" 6084 " \"bbbb\"\n" 6085 " \"cccc\");", 6086 Break); 6087 verifyFormat("aaaa(qqq, \"bbbb\"\n" 6088 " \"cccc\");", 6089 NoBreak); 6090 verifyFormat("aaaa(qqq,\n" 6091 " \"bbbb\"\n" 6092 " \"cccc\");", 6093 Break); 6094 verifyFormat("aaaa(qqq,\n" 6095 " L\"bbbb\"\n" 6096 " L\"cccc\");", 6097 Break); 6098 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n" 6099 " \"bbbb\"));", 6100 Break); 6101 verifyFormat("string s = someFunction(\n" 6102 " \"abc\"\n" 6103 " \"abc\");", 6104 Break); 6105 6106 // As we break before unary operators, breaking right after them is bad. 6107 verifyFormat("string foo = abc ? \"x\"\n" 6108 " \"blah blah blah blah blah blah\"\n" 6109 " : \"y\";", 6110 Break); 6111 6112 // Don't break if there is no column gain. 6113 verifyFormat("f(\"aaaa\"\n" 6114 " \"bbbb\");", 6115 Break); 6116 6117 // Treat literals with escaped newlines like multi-line string literals. 6118 EXPECT_EQ("x = \"a\\\n" 6119 "b\\\n" 6120 "c\";", 6121 format("x = \"a\\\n" 6122 "b\\\n" 6123 "c\";", 6124 NoBreak)); 6125 EXPECT_EQ("xxxx =\n" 6126 " \"a\\\n" 6127 "b\\\n" 6128 "c\";", 6129 format("xxxx = \"a\\\n" 6130 "b\\\n" 6131 "c\";", 6132 Break)); 6133 6134 EXPECT_EQ("NSString *const kString =\n" 6135 " @\"aaaa\"\n" 6136 " @\"bbbb\";", 6137 format("NSString *const kString = @\"aaaa\"\n" 6138 "@\"bbbb\";", 6139 Break)); 6140 6141 Break.ColumnLimit = 0; 6142 verifyFormat("const char *hello = \"hello llvm\";", Break); 6143 } 6144 6145 TEST_F(FormatTest, AlignsPipes) { 6146 verifyFormat( 6147 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6148 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6149 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6150 verifyFormat( 6151 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n" 6152 " << aaaaaaaaaaaaaaaaaaaa;"); 6153 verifyFormat( 6154 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6155 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6156 verifyFormat( 6157 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n" 6158 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6159 verifyFormat( 6160 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n" 6161 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n" 6162 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";"); 6163 verifyFormat( 6164 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6165 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6166 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6167 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6169 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6170 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6171 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n" 6172 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);"); 6173 verifyFormat( 6174 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6176 verifyFormat( 6177 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n" 6178 " aaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6179 6180 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n" 6181 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();"); 6182 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6184 " aaaaaaaaaaaaaaaaaaaaa)\n" 6185 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6186 verifyFormat("LOG_IF(aaa == //\n" 6187 " bbb)\n" 6188 " << a << b;"); 6189 6190 // But sometimes, breaking before the first "<<" is desirable. 6191 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6192 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);"); 6193 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n" 6194 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6195 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6196 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n" 6197 " << BEF << IsTemplate << Description << E->getType();"); 6198 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6199 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6201 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n" 6202 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6203 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6204 " << aaa;"); 6205 6206 verifyFormat( 6207 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6208 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6209 6210 // Incomplete string literal. 6211 EXPECT_EQ("llvm::errs() << \"\n" 6212 " << a;", 6213 format("llvm::errs() << \"\n<<a;")); 6214 6215 verifyFormat("void f() {\n" 6216 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" 6217 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" 6218 "}"); 6219 6220 // Handle 'endl'. 6221 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n" 6222 " << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6223 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;"); 6224 6225 // Handle '\n'. 6226 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n" 6227 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6228 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n" 6229 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';"); 6230 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n" 6231 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";"); 6232 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";"); 6233 } 6234 6235 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) { 6236 verifyFormat("return out << \"somepacket = {\\n\"\n" 6237 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n" 6238 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n" 6239 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n" 6240 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n" 6241 " << \"}\";"); 6242 6243 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6244 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n" 6245 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;"); 6246 verifyFormat( 6247 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n" 6248 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n" 6249 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n" 6250 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n" 6251 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;"); 6252 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n" 6253 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 6254 verifyFormat( 6255 "void f() {\n" 6256 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n" 6257 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" 6258 "}"); 6259 6260 // Breaking before the first "<<" is generally not desirable. 6261 verifyFormat( 6262 "llvm::errs()\n" 6263 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6264 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6265 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6266 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6267 getLLVMStyleWithColumns(70)); 6268 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6269 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6270 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6271 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6272 " << \"aaaaaaaaaaaaaaaaaaa: \"\n" 6273 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 6274 getLLVMStyleWithColumns(70)); 6275 6276 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6277 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n" 6278 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;"); 6279 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6280 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n" 6281 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);"); 6282 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n" 6283 " (aaaa + aaaa);", 6284 getLLVMStyleWithColumns(40)); 6285 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n" 6286 " (aaaaaaa + aaaaa));", 6287 getLLVMStyleWithColumns(40)); 6288 verifyFormat( 6289 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n" 6290 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n" 6291 " bbbbbbbbbbbbbbbbbbbbbbb);"); 6292 } 6293 6294 TEST_F(FormatTest, UnderstandsEquals) { 6295 verifyFormat( 6296 "aaaaaaaaaaaaaaaaa =\n" 6297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 6298 verifyFormat( 6299 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6301 verifyFormat( 6302 "if (a) {\n" 6303 " f();\n" 6304 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6305 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 6306 "}"); 6307 6308 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6309 " 100000000 + 10000000) {\n}"); 6310 } 6311 6312 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { 6313 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6314 " .looooooooooooooooooooooooooooooooooooooongFunction();"); 6315 6316 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n" 6317 " ->looooooooooooooooooooooooooooooooooooooongFunction();"); 6318 6319 verifyFormat( 6320 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n" 6321 " Parameter2);"); 6322 6323 verifyFormat( 6324 "ShortObject->shortFunction(\n" 6325 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n" 6326 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);"); 6327 6328 verifyFormat("loooooooooooooongFunction(\n" 6329 " LoooooooooooooongObject->looooooooooooooooongFunction());"); 6330 6331 verifyFormat( 6332 "function(LoooooooooooooooooooooooooooooooooooongObject\n" 6333 " ->loooooooooooooooooooooooooooooooooooooooongFunction());"); 6334 6335 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6336 " .WillRepeatedly(Return(SomeValue));"); 6337 verifyFormat("void f() {\n" 6338 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" 6339 " .Times(2)\n" 6340 " .WillRepeatedly(Return(SomeValue));\n" 6341 "}"); 6342 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" 6343 " ccccccccccccccccccccccc);"); 6344 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6346 " .aaaaa(aaaaa),\n" 6347 " aaaaaaaaaaaaaaaaaaaaa);"); 6348 verifyFormat("void f() {\n" 6349 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6350 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n" 6351 "}"); 6352 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6354 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6355 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6356 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6357 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6358 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6359 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6360 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n" 6361 "}"); 6362 6363 // Here, it is not necessary to wrap at "." or "->". 6364 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" 6365 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 6366 verifyFormat( 6367 "aaaaaaaaaaa->aaaaaaaaa(\n" 6368 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6369 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n"); 6370 6371 verifyFormat( 6372 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());"); 6374 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n" 6375 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6376 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n" 6377 " aaaaaaaaa()->aaaaaa()->aaaaa());"); 6378 6379 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6380 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6381 " .a();"); 6382 6383 FormatStyle NoBinPacking = getLLVMStyle(); 6384 NoBinPacking.BinPackParameters = false; 6385 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6386 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 6387 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" 6388 " aaaaaaaaaaaaaaaaaaa,\n" 6389 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 6390 NoBinPacking); 6391 6392 // If there is a subsequent call, change to hanging indentation. 6393 verifyFormat( 6394 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6395 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n" 6396 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6397 verifyFormat( 6398 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6399 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));"); 6400 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6402 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6403 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 6405 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6406 } 6407 6408 TEST_F(FormatTest, WrapsTemplateDeclarations) { 6409 verifyFormat("template <typename T>\n" 6410 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6411 verifyFormat("template <typename T>\n" 6412 "// T should be one of {A, B}.\n" 6413 "virtual void loooooooooooongFunction(int Param1, int Param2);"); 6414 verifyFormat( 6415 "template <typename T>\n" 6416 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;"); 6417 verifyFormat("template <typename T>\n" 6418 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" 6419 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); 6420 verifyFormat( 6421 "template <typename T>\n" 6422 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" 6423 " int Paaaaaaaaaaaaaaaaaaaaram2);"); 6424 verifyFormat( 6425 "template <typename T>\n" 6426 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n" 6427 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n" 6428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6429 verifyFormat("template <typename T>\n" 6430 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6431 " int aaaaaaaaaaaaaaaaaaaaaa);"); 6432 verifyFormat( 6433 "template <typename T1, typename T2 = char, typename T3 = char,\n" 6434 " typename T4 = char>\n" 6435 "void f();"); 6436 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n" 6437 " template <typename> class cccccccccccccccccccccc,\n" 6438 " typename ddddddddddddd>\n" 6439 "class C {};"); 6440 verifyFormat( 6441 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n" 6442 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 6443 6444 verifyFormat("void f() {\n" 6445 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n" 6446 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n" 6447 "}"); 6448 6449 verifyFormat("template <typename T> class C {};"); 6450 verifyFormat("template <typename T> void f();"); 6451 verifyFormat("template <typename T> void f() {}"); 6452 verifyFormat( 6453 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6455 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n" 6456 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n" 6457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n" 6459 " bbbbbbbbbbbbbbbbbbbbbbbb);", 6460 getLLVMStyleWithColumns(72)); 6461 EXPECT_EQ("static_cast<A< //\n" 6462 " B> *>(\n" 6463 "\n" 6464 ");", 6465 format("static_cast<A<//\n" 6466 " B>*>(\n" 6467 "\n" 6468 " );")); 6469 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6470 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); 6471 6472 FormatStyle AlwaysBreak = getLLVMStyle(); 6473 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6474 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak); 6475 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak); 6476 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak); 6477 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6478 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6479 " ccccccccccccccccccccccccccccccccccccccccccccccc);"); 6480 verifyFormat("template <template <typename> class Fooooooo,\n" 6481 " template <typename> class Baaaaaaar>\n" 6482 "struct C {};", 6483 AlwaysBreak); 6484 verifyFormat("template <typename T> // T can be A, B or C.\n" 6485 "struct C {};", 6486 AlwaysBreak); 6487 verifyFormat("template <enum E> class A {\n" 6488 "public:\n" 6489 " E *f();\n" 6490 "};"); 6491 6492 FormatStyle NeverBreak = getLLVMStyle(); 6493 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No; 6494 verifyFormat("template <typename T> class C {};", NeverBreak); 6495 verifyFormat("template <typename T> void f();", NeverBreak); 6496 verifyFormat("template <typename T> void f() {}", NeverBreak); 6497 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6498 "bbbbbbbbbbbbbbbbbbbb) {}", 6499 NeverBreak); 6500 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6501 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n" 6502 " ccccccccccccccccccccccccccccccccccccccccccccccc);", 6503 NeverBreak); 6504 verifyFormat("template <template <typename> class Fooooooo,\n" 6505 " template <typename> class Baaaaaaar>\n" 6506 "struct C {};", 6507 NeverBreak); 6508 verifyFormat("template <typename T> // T can be A, B or C.\n" 6509 "struct C {};", 6510 NeverBreak); 6511 verifyFormat("template <enum E> class A {\n" 6512 "public:\n" 6513 " E *f();\n" 6514 "};", 6515 NeverBreak); 6516 NeverBreak.PenaltyBreakTemplateDeclaration = 100; 6517 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa " 6518 "bbbbbbbbbbbbbbbbbbbb) {}", 6519 NeverBreak); 6520 } 6521 6522 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) { 6523 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 6524 Style.ColumnLimit = 60; 6525 EXPECT_EQ("// Baseline - no comments.\n" 6526 "template <\n" 6527 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6528 "void f() {}", 6529 format("// Baseline - no comments.\n" 6530 "template <\n" 6531 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n" 6532 "void f() {}", 6533 Style)); 6534 6535 EXPECT_EQ("template <\n" 6536 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6537 "void f() {}", 6538 format("template <\n" 6539 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6540 "void f() {}", 6541 Style)); 6542 6543 EXPECT_EQ( 6544 "template <\n" 6545 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6546 "void f() {}", 6547 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n" 6548 "void f() {}", 6549 Style)); 6550 6551 EXPECT_EQ( 6552 "template <\n" 6553 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6554 " // multiline\n" 6555 "void f() {}", 6556 format("template <\n" 6557 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n" 6558 " // multiline\n" 6559 "void f() {}", 6560 Style)); 6561 6562 EXPECT_EQ( 6563 "template <typename aaaaaaaaaa<\n" 6564 " bbbbbbbbbbbb>::value> // trailing loooong\n" 6565 "void f() {}", 6566 format( 6567 "template <\n" 6568 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n" 6569 "void f() {}", 6570 Style)); 6571 } 6572 6573 TEST_F(FormatTest, WrapsTemplateParameters) { 6574 FormatStyle Style = getLLVMStyle(); 6575 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6576 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6577 verifyFormat( 6578 "template <typename... a> struct q {};\n" 6579 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6580 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6581 " y;", 6582 Style); 6583 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; 6584 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6585 verifyFormat( 6586 "template <typename... a> struct r {};\n" 6587 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n" 6588 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n" 6589 " y;", 6590 Style); 6591 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6592 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 6593 verifyFormat("template <typename... a> struct s {};\n" 6594 "extern s<\n" 6595 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6596 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6597 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6598 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6599 " y;", 6600 Style); 6601 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 6602 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 6603 verifyFormat("template <typename... a> struct t {};\n" 6604 "extern t<\n" 6605 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6606 "aaaaaaaaaaaaaaaaaaaaaa,\n" 6607 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, " 6608 "aaaaaaaaaaaaaaaaaaaaaa>\n" 6609 " y;", 6610 Style); 6611 } 6612 6613 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) { 6614 verifyFormat( 6615 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6616 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6617 verifyFormat( 6618 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6619 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());"); 6621 6622 // FIXME: Should we have the extra indent after the second break? 6623 verifyFormat( 6624 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6625 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6627 6628 verifyFormat( 6629 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n" 6630 " cccccccccccccccccccccccccccccccccccccccccccccc());"); 6631 6632 // Breaking at nested name specifiers is generally not desirable. 6633 verifyFormat( 6634 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6635 " aaaaaaaaaaaaaaaaaaaaaaa);"); 6636 6637 verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n" 6638 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 6640 " aaaaaaaaaaaaaaaaaaaaa);", 6641 getLLVMStyleWithColumns(74)); 6642 6643 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n" 6644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6645 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 6646 } 6647 6648 TEST_F(FormatTest, UnderstandsTemplateParameters) { 6649 verifyFormat("A<int> a;"); 6650 verifyFormat("A<A<A<int>>> a;"); 6651 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 6652 verifyFormat("bool x = a < 1 || 2 > a;"); 6653 verifyFormat("bool x = 5 < f<int>();"); 6654 verifyFormat("bool x = f<int>() > 5;"); 6655 verifyFormat("bool x = 5 < a<int>::x;"); 6656 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 6657 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 6658 6659 verifyGoogleFormat("A<A<int>> a;"); 6660 verifyGoogleFormat("A<A<A<int>>> a;"); 6661 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 6662 verifyGoogleFormat("A<A<int> > a;"); 6663 verifyGoogleFormat("A<A<A<int> > > a;"); 6664 verifyGoogleFormat("A<A<A<A<int> > > > a;"); 6665 verifyGoogleFormat("A<::A<int>> a;"); 6666 verifyGoogleFormat("A<::A> a;"); 6667 verifyGoogleFormat("A< ::A> a;"); 6668 verifyGoogleFormat("A< ::A<int> > a;"); 6669 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle())); 6670 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle())); 6671 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); 6672 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); 6673 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };", 6674 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle())); 6675 6676 verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); 6677 6678 // template closer followed by a token that starts with > or = 6679 verifyFormat("bool b = a<1> > 1;"); 6680 verifyFormat("bool b = a<1> >= 1;"); 6681 verifyFormat("int i = a<1> >> 1;"); 6682 FormatStyle Style = getLLVMStyle(); 6683 Style.SpaceBeforeAssignmentOperators = false; 6684 verifyFormat("bool b= a<1> == 1;", Style); 6685 verifyFormat("a<int> = 1;", Style); 6686 verifyFormat("a<int> >>= 1;", Style); 6687 6688 verifyFormat("test >> a >> b;"); 6689 verifyFormat("test << a >> b;"); 6690 6691 verifyFormat("f<int>();"); 6692 verifyFormat("template <typename T> void f() {}"); 6693 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); 6694 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : " 6695 "sizeof(char)>::type>;"); 6696 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};"); 6697 verifyFormat("f(a.operator()<A>());"); 6698 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 6699 " .template operator()<A>());", 6700 getLLVMStyleWithColumns(35)); 6701 6702 // Not template parameters. 6703 verifyFormat("return a < b && c > d;"); 6704 verifyFormat("void f() {\n" 6705 " while (a < b && c > d) {\n" 6706 " }\n" 6707 "}"); 6708 verifyFormat("template <typename... Types>\n" 6709 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}"); 6710 6711 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 6712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", 6713 getLLVMStyleWithColumns(60)); 6714 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); 6715 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); 6716 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"); 6717 } 6718 6719 TEST_F(FormatTest, BitshiftOperatorWidth) { 6720 EXPECT_EQ("int a = 1 << 2; /* foo\n" 6721 " bar */", 6722 format("int a=1<<2; /* foo\n" 6723 " bar */")); 6724 6725 EXPECT_EQ("int b = 256 >> 1; /* foo\n" 6726 " bar */", 6727 format("int b =256>>1 ; /* foo\n" 6728 " bar */")); 6729 } 6730 6731 TEST_F(FormatTest, UnderstandsBinaryOperators) { 6732 verifyFormat("COMPARE(a, ==, b);"); 6733 verifyFormat("auto s = sizeof...(Ts) - 1;"); 6734 } 6735 6736 TEST_F(FormatTest, UnderstandsPointersToMembers) { 6737 verifyFormat("int A::*x;"); 6738 verifyFormat("int (S::*func)(void *);"); 6739 verifyFormat("void f() { int (S::*func)(void *); }"); 6740 verifyFormat("typedef bool *(Class::*Member)() const;"); 6741 verifyFormat("void f() {\n" 6742 " (a->*f)();\n" 6743 " a->*x;\n" 6744 " (a.*f)();\n" 6745 " ((*a).*f)();\n" 6746 " a.*x;\n" 6747 "}"); 6748 verifyFormat("void f() {\n" 6749 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 6750 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n" 6751 "}"); 6752 verifyFormat( 6753 "(aaaaaaaaaa->*bbbbbbb)(\n" 6754 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 6755 FormatStyle Style = getLLVMStyle(); 6756 Style.PointerAlignment = FormatStyle::PAS_Left; 6757 verifyFormat("typedef bool* (Class::*Member)() const;", Style); 6758 } 6759 6760 TEST_F(FormatTest, UnderstandsUnaryOperators) { 6761 verifyFormat("int a = -2;"); 6762 verifyFormat("f(-1, -2, -3);"); 6763 verifyFormat("a[-1] = 5;"); 6764 verifyFormat("int a = 5 + -2;"); 6765 verifyFormat("if (i == -1) {\n}"); 6766 verifyFormat("if (i != -1) {\n}"); 6767 verifyFormat("if (i > -1) {\n}"); 6768 verifyFormat("if (i < -1) {\n}"); 6769 verifyFormat("++(a->f());"); 6770 verifyFormat("--(a->f());"); 6771 verifyFormat("(a->f())++;"); 6772 verifyFormat("a[42]++;"); 6773 verifyFormat("if (!(a->f())) {\n}"); 6774 verifyFormat("if (!+i) {\n}"); 6775 verifyFormat("~&a;"); 6776 6777 verifyFormat("a-- > b;"); 6778 verifyFormat("b ? -a : c;"); 6779 verifyFormat("n * sizeof char16;"); 6780 verifyFormat("n * alignof char16;", getGoogleStyle()); 6781 verifyFormat("sizeof(char);"); 6782 verifyFormat("alignof(char);", getGoogleStyle()); 6783 6784 verifyFormat("return -1;"); 6785 verifyFormat("switch (a) {\n" 6786 "case -1:\n" 6787 " break;\n" 6788 "}"); 6789 verifyFormat("#define X -1"); 6790 verifyFormat("#define X -kConstant"); 6791 6792 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};"); 6793 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};"); 6794 6795 verifyFormat("int a = /* confusing comment */ -1;"); 6796 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case. 6797 verifyFormat("int a = i /* confusing comment */++;"); 6798 } 6799 6800 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { 6801 verifyFormat("if (!aaaaaaaaaa( // break\n" 6802 " aaaaa)) {\n" 6803 "}"); 6804 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n" 6805 " aaaaa));"); 6806 verifyFormat("*aaa = aaaaaaa( // break\n" 6807 " bbbbbb);"); 6808 } 6809 6810 TEST_F(FormatTest, UnderstandsOverloadedOperators) { 6811 verifyFormat("bool operator<();"); 6812 verifyFormat("bool operator>();"); 6813 verifyFormat("bool operator=();"); 6814 verifyFormat("bool operator==();"); 6815 verifyFormat("bool operator!=();"); 6816 verifyFormat("int operator+();"); 6817 verifyFormat("int operator++();"); 6818 verifyFormat("int operator++(int) volatile noexcept;"); 6819 verifyFormat("bool operator,();"); 6820 verifyFormat("bool operator();"); 6821 verifyFormat("bool operator()();"); 6822 verifyFormat("bool operator[]();"); 6823 verifyFormat("operator bool();"); 6824 verifyFormat("operator int();"); 6825 verifyFormat("operator void *();"); 6826 verifyFormat("operator SomeType<int>();"); 6827 verifyFormat("operator SomeType<int, int>();"); 6828 verifyFormat("operator SomeType<SomeType<int>>();"); 6829 verifyFormat("void *operator new(std::size_t size);"); 6830 verifyFormat("void *operator new[](std::size_t size);"); 6831 verifyFormat("void operator delete(void *ptr);"); 6832 verifyFormat("void operator delete[](void *ptr);"); 6833 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n" 6834 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);"); 6835 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n" 6836 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;"); 6837 6838 verifyFormat( 6839 "ostream &operator<<(ostream &OutputStream,\n" 6840 " SomeReallyLongType WithSomeReallyLongValue);"); 6841 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n" 6842 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n" 6843 " return left.group < right.group;\n" 6844 "}"); 6845 verifyFormat("SomeType &operator=(const SomeType &S);"); 6846 verifyFormat("f.template operator()<int>();"); 6847 6848 verifyGoogleFormat("operator void*();"); 6849 verifyGoogleFormat("operator SomeType<SomeType<int>>();"); 6850 verifyGoogleFormat("operator ::A();"); 6851 6852 verifyFormat("using A::operator+;"); 6853 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n" 6854 "int i;"); 6855 } 6856 6857 TEST_F(FormatTest, UnderstandsFunctionRefQualification) { 6858 verifyFormat("Deleted &operator=(const Deleted &) & = default;"); 6859 verifyFormat("Deleted &operator=(const Deleted &) && = delete;"); 6860 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;"); 6861 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;"); 6862 verifyFormat("Deleted &operator=(const Deleted &) &;"); 6863 verifyFormat("Deleted &operator=(const Deleted &) &&;"); 6864 verifyFormat("SomeType MemberFunction(const Deleted &) &;"); 6865 verifyFormat("SomeType MemberFunction(const Deleted &) &&;"); 6866 verifyFormat("SomeType MemberFunction(const Deleted &) && {}"); 6867 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}"); 6868 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}"); 6869 verifyFormat("void Fn(T const &) const &;"); 6870 verifyFormat("void Fn(T const volatile &&) const volatile &&;"); 6871 verifyFormat("template <typename T>\n" 6872 "void F(T) && = delete;", 6873 getGoogleStyle()); 6874 6875 FormatStyle AlignLeft = getLLVMStyle(); 6876 AlignLeft.PointerAlignment = FormatStyle::PAS_Left; 6877 verifyFormat("void A::b() && {}", AlignLeft); 6878 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft); 6879 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;", 6880 AlignLeft); 6881 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft); 6882 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft); 6883 verifyFormat("auto Function(T t) & -> void {}", AlignLeft); 6884 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft); 6885 verifyFormat("auto Function(T) & -> void {}", AlignLeft); 6886 verifyFormat("auto Function(T) & -> void;", AlignLeft); 6887 verifyFormat("void Fn(T const&) const&;", AlignLeft); 6888 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft); 6889 6890 FormatStyle Spaces = getLLVMStyle(); 6891 Spaces.SpacesInCStyleCastParentheses = true; 6892 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces); 6893 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces); 6894 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces); 6895 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces); 6896 6897 Spaces.SpacesInCStyleCastParentheses = false; 6898 Spaces.SpacesInParentheses = true; 6899 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces); 6900 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", 6901 Spaces); 6902 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces); 6903 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces); 6904 6905 FormatStyle BreakTemplate = getLLVMStyle(); 6906 BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 6907 6908 verifyFormat("struct f {\n" 6909 " template <class T>\n" 6910 " int &foo(const std::string &str) & noexcept {}\n" 6911 "};", 6912 BreakTemplate); 6913 6914 verifyFormat("struct f {\n" 6915 " template <class T>\n" 6916 " int &foo(const std::string &str) && noexcept {}\n" 6917 "};", 6918 BreakTemplate); 6919 6920 verifyFormat("struct f {\n" 6921 " template <class T>\n" 6922 " int &foo(const std::string &str) const & noexcept {}\n" 6923 "};", 6924 BreakTemplate); 6925 6926 verifyFormat("struct f {\n" 6927 " template <class T>\n" 6928 " int &foo(const std::string &str) const & noexcept {}\n" 6929 "};", 6930 BreakTemplate); 6931 6932 verifyFormat("struct f {\n" 6933 " template <class T>\n" 6934 " auto foo(const std::string &str) && noexcept -> int & {}\n" 6935 "};", 6936 BreakTemplate); 6937 6938 FormatStyle AlignLeftBreakTemplate = getLLVMStyle(); 6939 AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations = 6940 FormatStyle::BTDS_Yes; 6941 AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left; 6942 6943 verifyFormat("struct f {\n" 6944 " template <class T>\n" 6945 " int& foo(const std::string& str) & noexcept {}\n" 6946 "};", 6947 AlignLeftBreakTemplate); 6948 6949 verifyFormat("struct f {\n" 6950 " template <class T>\n" 6951 " int& foo(const std::string& str) && noexcept {}\n" 6952 "};", 6953 AlignLeftBreakTemplate); 6954 6955 verifyFormat("struct f {\n" 6956 " template <class T>\n" 6957 " int& foo(const std::string& str) const & noexcept {}\n" 6958 "};", 6959 AlignLeftBreakTemplate); 6960 6961 verifyFormat("struct f {\n" 6962 " template <class T>\n" 6963 " int& foo(const std::string& str) const & noexcept {}\n" 6964 "};", 6965 AlignLeftBreakTemplate); 6966 6967 verifyFormat("struct f {\n" 6968 " template <class T>\n" 6969 " auto foo(const std::string& str) && noexcept -> int& {}\n" 6970 "};", 6971 AlignLeftBreakTemplate); 6972 } 6973 6974 TEST_F(FormatTest, UnderstandsNewAndDelete) { 6975 verifyFormat("void f() {\n" 6976 " A *a = new A;\n" 6977 " A *a = new (placement) A;\n" 6978 " delete a;\n" 6979 " delete (A *)a;\n" 6980 "}"); 6981 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 6982 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 6983 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 6984 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" 6985 " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); 6986 verifyFormat("delete[] h->p;"); 6987 } 6988 6989 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { 6990 verifyFormat("int *f(int *a) {}"); 6991 verifyFormat("int main(int argc, char **argv) {}"); 6992 verifyFormat("Test::Test(int b) : a(b * b) {}"); 6993 verifyIndependentOfContext("f(a, *a);"); 6994 verifyFormat("void g() { f(*a); }"); 6995 verifyIndependentOfContext("int a = b * 10;"); 6996 verifyIndependentOfContext("int a = 10 * b;"); 6997 verifyIndependentOfContext("int a = b * c;"); 6998 verifyIndependentOfContext("int a += b * c;"); 6999 verifyIndependentOfContext("int a -= b * c;"); 7000 verifyIndependentOfContext("int a *= b * c;"); 7001 verifyIndependentOfContext("int a /= b * c;"); 7002 verifyIndependentOfContext("int a = *b;"); 7003 verifyIndependentOfContext("int a = *b * c;"); 7004 verifyIndependentOfContext("int a = b * *c;"); 7005 verifyIndependentOfContext("int a = b * (10);"); 7006 verifyIndependentOfContext("S << b * (10);"); 7007 verifyIndependentOfContext("return 10 * b;"); 7008 verifyIndependentOfContext("return *b * *c;"); 7009 verifyIndependentOfContext("return a & ~b;"); 7010 verifyIndependentOfContext("f(b ? *c : *d);"); 7011 verifyIndependentOfContext("int a = b ? *c : *d;"); 7012 verifyIndependentOfContext("*b = a;"); 7013 verifyIndependentOfContext("a * ~b;"); 7014 verifyIndependentOfContext("a * !b;"); 7015 verifyIndependentOfContext("a * +b;"); 7016 verifyIndependentOfContext("a * -b;"); 7017 verifyIndependentOfContext("a * ++b;"); 7018 verifyIndependentOfContext("a * --b;"); 7019 verifyIndependentOfContext("a[4] * b;"); 7020 verifyIndependentOfContext("a[a * a] = 1;"); 7021 verifyIndependentOfContext("f() * b;"); 7022 verifyIndependentOfContext("a * [self dostuff];"); 7023 verifyIndependentOfContext("int x = a * (a + b);"); 7024 verifyIndependentOfContext("(a *)(a + b);"); 7025 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;"); 7026 verifyIndependentOfContext("int *pa = (int *)&a;"); 7027 verifyIndependentOfContext("return sizeof(int **);"); 7028 verifyIndependentOfContext("return sizeof(int ******);"); 7029 verifyIndependentOfContext("return (int **&)a;"); 7030 verifyIndependentOfContext("f((*PointerToArray)[10]);"); 7031 verifyFormat("void f(Type (*parameter)[10]) {}"); 7032 verifyFormat("void f(Type (¶meter)[10]) {}"); 7033 verifyGoogleFormat("return sizeof(int**);"); 7034 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);"); 7035 verifyGoogleFormat("Type** A = static_cast<Type**>(P);"); 7036 verifyFormat("auto a = [](int **&, int ***) {};"); 7037 verifyFormat("auto PointerBinding = [](const char *S) {};"); 7038 verifyFormat("typedef typeof(int(int, int)) *MyFunc;"); 7039 verifyFormat("[](const decltype(*a) &value) {}"); 7040 verifyFormat("decltype(a * b) F();"); 7041 verifyFormat("#define MACRO() [](A *a) { return 1; }"); 7042 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}"); 7043 verifyIndependentOfContext("typedef void (*f)(int *a);"); 7044 verifyIndependentOfContext("int i{a * b};"); 7045 verifyIndependentOfContext("aaa && aaa->f();"); 7046 verifyIndependentOfContext("int x = ~*p;"); 7047 verifyFormat("Constructor() : a(a), area(width * height) {}"); 7048 verifyFormat("Constructor() : a(a), area(a, width * height) {}"); 7049 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}"); 7050 verifyFormat("void f() { f(a, c * d); }"); 7051 verifyFormat("void f() { f(new a(), c * d); }"); 7052 verifyFormat("void f(const MyOverride &override);"); 7053 verifyFormat("void f(const MyFinal &final);"); 7054 verifyIndependentOfContext("bool a = f() && override.f();"); 7055 verifyIndependentOfContext("bool a = f() && final.f();"); 7056 7057 verifyIndependentOfContext("InvalidRegions[*R] = 0;"); 7058 7059 verifyIndependentOfContext("A<int *> a;"); 7060 verifyIndependentOfContext("A<int **> a;"); 7061 verifyIndependentOfContext("A<int *, int *> a;"); 7062 verifyIndependentOfContext("A<int *[]> a;"); 7063 verifyIndependentOfContext( 7064 "const char *const p = reinterpret_cast<const char *const>(q);"); 7065 verifyIndependentOfContext("A<int **, int **> a;"); 7066 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);"); 7067 verifyFormat("for (char **a = b; *a; ++a) {\n}"); 7068 verifyFormat("for (; a && b;) {\n}"); 7069 verifyFormat("bool foo = true && [] { return false; }();"); 7070 7071 verifyFormat( 7072 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7074 7075 verifyGoogleFormat("int const* a = &b;"); 7076 verifyGoogleFormat("**outparam = 1;"); 7077 verifyGoogleFormat("*outparam = a * b;"); 7078 verifyGoogleFormat("int main(int argc, char** argv) {}"); 7079 verifyGoogleFormat("A<int*> a;"); 7080 verifyGoogleFormat("A<int**> a;"); 7081 verifyGoogleFormat("A<int*, int*> a;"); 7082 verifyGoogleFormat("A<int**, int**> a;"); 7083 verifyGoogleFormat("f(b ? *c : *d);"); 7084 verifyGoogleFormat("int a = b ? *c : *d;"); 7085 verifyGoogleFormat("Type* t = **x;"); 7086 verifyGoogleFormat("Type* t = *++*x;"); 7087 verifyGoogleFormat("*++*x;"); 7088 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);"); 7089 verifyGoogleFormat("Type* t = x++ * y;"); 7090 verifyGoogleFormat( 7091 "const char* const p = reinterpret_cast<const char* const>(q);"); 7092 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); 7093 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); 7094 verifyGoogleFormat("template <typename T>\n" 7095 "void f(int i = 0, SomeType** temps = NULL);"); 7096 7097 FormatStyle Left = getLLVMStyle(); 7098 Left.PointerAlignment = FormatStyle::PAS_Left; 7099 verifyFormat("x = *a(x) = *a(y);", Left); 7100 verifyFormat("for (;; *a = b) {\n}", Left); 7101 verifyFormat("return *this += 1;", Left); 7102 verifyFormat("throw *x;", Left); 7103 verifyFormat("delete *x;", Left); 7104 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left); 7105 verifyFormat("[](const decltype(*a)* ptr) {}", Left); 7106 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left); 7107 7108 verifyIndependentOfContext("a = *(x + y);"); 7109 verifyIndependentOfContext("a = &(x + y);"); 7110 verifyIndependentOfContext("*(x + y).call();"); 7111 verifyIndependentOfContext("&(x + y)->call();"); 7112 verifyFormat("void f() { &(*I).first; }"); 7113 7114 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); 7115 verifyFormat( 7116 "int *MyValues = {\n" 7117 " *A, // Operator detection might be confused by the '{'\n" 7118 " *BB // Operator detection might be confused by previous comment\n" 7119 "};"); 7120 7121 verifyIndependentOfContext("if (int *a = &b)"); 7122 verifyIndependentOfContext("if (int &a = *b)"); 7123 verifyIndependentOfContext("if (a & b[i])"); 7124 verifyIndependentOfContext("if constexpr (a & b[i])"); 7125 verifyIndependentOfContext("if CONSTEXPR (a & b[i])"); 7126 verifyIndependentOfContext("if (a * (b * c))"); 7127 verifyIndependentOfContext("if constexpr (a * (b * c))"); 7128 verifyIndependentOfContext("if CONSTEXPR (a * (b * c))"); 7129 verifyIndependentOfContext("if (a::b::c::d & b[i])"); 7130 verifyIndependentOfContext("if (*b[i])"); 7131 verifyIndependentOfContext("if (int *a = (&b))"); 7132 verifyIndependentOfContext("while (int *a = &b)"); 7133 verifyIndependentOfContext("while (a * (b * c))"); 7134 verifyIndependentOfContext("size = sizeof *a;"); 7135 verifyIndependentOfContext("if (a && (b = c))"); 7136 verifyFormat("void f() {\n" 7137 " for (const int &v : Values) {\n" 7138 " }\n" 7139 "}"); 7140 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}"); 7141 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}"); 7142 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}"); 7143 7144 verifyFormat("#define A (!a * b)"); 7145 verifyFormat("#define MACRO \\\n" 7146 " int *i = a * b; \\\n" 7147 " void f(a *b);", 7148 getLLVMStyleWithColumns(19)); 7149 7150 verifyIndependentOfContext("A = new SomeType *[Length];"); 7151 verifyIndependentOfContext("A = new SomeType *[Length]();"); 7152 verifyIndependentOfContext("T **t = new T *;"); 7153 verifyIndependentOfContext("T **t = new T *();"); 7154 verifyGoogleFormat("A = new SomeType*[Length]();"); 7155 verifyGoogleFormat("A = new SomeType*[Length];"); 7156 verifyGoogleFormat("T** t = new T*;"); 7157 verifyGoogleFormat("T** t = new T*();"); 7158 7159 verifyFormat("STATIC_ASSERT((a & b) == 0);"); 7160 verifyFormat("STATIC_ASSERT(0 == (a & b));"); 7161 verifyFormat("template <bool a, bool b> " 7162 "typename t::if<x && y>::type f() {}"); 7163 verifyFormat("template <int *y> f() {}"); 7164 verifyFormat("vector<int *> v;"); 7165 verifyFormat("vector<int *const> v;"); 7166 verifyFormat("vector<int *const **const *> v;"); 7167 verifyFormat("vector<int *volatile> v;"); 7168 verifyFormat("vector<a * b> v;"); 7169 verifyFormat("foo<b && false>();"); 7170 verifyFormat("foo<b & 1>();"); 7171 verifyFormat("decltype(*::std::declval<const T &>()) void F();"); 7172 verifyFormat( 7173 "template <class T, class = typename std::enable_if<\n" 7174 " std::is_integral<T>::value &&\n" 7175 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" 7176 "void F();", 7177 getLLVMStyleWithColumns(70)); 7178 verifyFormat("template <class T,\n" 7179 " class = typename std::enable_if<\n" 7180 " std::is_integral<T>::value &&\n" 7181 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n" 7182 " class U>\n" 7183 "void F();", 7184 getLLVMStyleWithColumns(70)); 7185 verifyFormat( 7186 "template <class T,\n" 7187 " class = typename ::std::enable_if<\n" 7188 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" 7189 "void F();", 7190 getGoogleStyleWithColumns(68)); 7191 7192 verifyIndependentOfContext("MACRO(int *i);"); 7193 verifyIndependentOfContext("MACRO(auto *a);"); 7194 verifyIndependentOfContext("MACRO(const A *a);"); 7195 verifyIndependentOfContext("MACRO(A *const a);"); 7196 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); 7197 verifyFormat("void f() { f(float{1}, a * a); }"); 7198 // FIXME: Is there a way to make this work? 7199 // verifyIndependentOfContext("MACRO(A *a);"); 7200 7201 verifyFormat("DatumHandle const *operator->() const { return input_; }"); 7202 verifyFormat("return options != nullptr && operator==(*options);"); 7203 7204 EXPECT_EQ("#define OP(x) \\\n" 7205 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7206 " return s << a.DebugString(); \\\n" 7207 " }", 7208 format("#define OP(x) \\\n" 7209 " ostream &operator<<(ostream &s, const A &a) { \\\n" 7210 " return s << a.DebugString(); \\\n" 7211 " }", 7212 getLLVMStyleWithColumns(50))); 7213 7214 // FIXME: We cannot handle this case yet; we might be able to figure out that 7215 // foo<x> d > v; doesn't make sense. 7216 verifyFormat("foo<a<b && c> d> v;"); 7217 7218 FormatStyle PointerMiddle = getLLVMStyle(); 7219 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 7220 verifyFormat("delete *x;", PointerMiddle); 7221 verifyFormat("int * x;", PointerMiddle); 7222 verifyFormat("int *[] x;", PointerMiddle); 7223 verifyFormat("template <int * y> f() {}", PointerMiddle); 7224 verifyFormat("int * f(int * a) {}", PointerMiddle); 7225 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle); 7226 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle); 7227 verifyFormat("A<int *> a;", PointerMiddle); 7228 verifyFormat("A<int **> a;", PointerMiddle); 7229 verifyFormat("A<int *, int *> a;", PointerMiddle); 7230 verifyFormat("A<int *[]> a;", PointerMiddle); 7231 verifyFormat("A = new SomeType *[Length]();", PointerMiddle); 7232 verifyFormat("A = new SomeType *[Length];", PointerMiddle); 7233 verifyFormat("T ** t = new T *;", PointerMiddle); 7234 7235 // Member function reference qualifiers aren't binary operators. 7236 verifyFormat("string // break\n" 7237 "operator()() & {}"); 7238 verifyFormat("string // break\n" 7239 "operator()() && {}"); 7240 verifyGoogleFormat("template <typename T>\n" 7241 "auto x() & -> int {}"); 7242 } 7243 7244 TEST_F(FormatTest, UnderstandsAttributes) { 7245 verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); 7246 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" 7247 "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7248 FormatStyle AfterType = getLLVMStyle(); 7249 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions; 7250 verifyFormat("__attribute__((nodebug)) void\n" 7251 "foo() {}\n", 7252 AfterType); 7253 } 7254 7255 TEST_F(FormatTest, UnderstandsSquareAttributes) { 7256 verifyFormat("SomeType s [[unused]] (InitValue);"); 7257 verifyFormat("SomeType s [[gnu::unused]] (InitValue);"); 7258 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);"); 7259 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}"); 7260 verifyFormat("void f() [[deprecated(\"so sorry\")]];"); 7261 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7262 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); 7263 7264 // Make sure we do not mistake attributes for array subscripts. 7265 verifyFormat("int a() {}\n" 7266 "[[unused]] int b() {}\n"); 7267 verifyFormat("NSArray *arr;\n" 7268 "arr[[Foo() bar]];"); 7269 7270 // On the other hand, we still need to correctly find array subscripts. 7271 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];"); 7272 7273 // Make sure that we do not mistake Objective-C method inside array literals 7274 // as attributes, even if those method names are also keywords. 7275 verifyFormat("@[ [foo bar] ];"); 7276 verifyFormat("@[ [NSArray class] ];"); 7277 verifyFormat("@[ [foo enum] ];"); 7278 7279 // Make sure we do not parse attributes as lambda introducers. 7280 FormatStyle MultiLineFunctions = getLLVMStyle(); 7281 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 7282 verifyFormat("[[unused]] int b() {\n" 7283 " return 42;\n" 7284 "}\n", 7285 MultiLineFunctions); 7286 } 7287 7288 TEST_F(FormatTest, UnderstandsEllipsis) { 7289 verifyFormat("int printf(const char *fmt, ...);"); 7290 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }"); 7291 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}"); 7292 7293 FormatStyle PointersLeft = getLLVMStyle(); 7294 PointersLeft.PointerAlignment = FormatStyle::PAS_Left; 7295 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft); 7296 } 7297 7298 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { 7299 EXPECT_EQ("int *a;\n" 7300 "int *a;\n" 7301 "int *a;", 7302 format("int *a;\n" 7303 "int* a;\n" 7304 "int *a;", 7305 getGoogleStyle())); 7306 EXPECT_EQ("int* a;\n" 7307 "int* a;\n" 7308 "int* a;", 7309 format("int* a;\n" 7310 "int* a;\n" 7311 "int *a;", 7312 getGoogleStyle())); 7313 EXPECT_EQ("int *a;\n" 7314 "int *a;\n" 7315 "int *a;", 7316 format("int *a;\n" 7317 "int * a;\n" 7318 "int * a;", 7319 getGoogleStyle())); 7320 EXPECT_EQ("auto x = [] {\n" 7321 " int *a;\n" 7322 " int *a;\n" 7323 " int *a;\n" 7324 "};", 7325 format("auto x=[]{int *a;\n" 7326 "int * a;\n" 7327 "int * a;};", 7328 getGoogleStyle())); 7329 } 7330 7331 TEST_F(FormatTest, UnderstandsRvalueReferences) { 7332 verifyFormat("int f(int &&a) {}"); 7333 verifyFormat("int f(int a, char &&b) {}"); 7334 verifyFormat("void f() { int &&a = b; }"); 7335 verifyGoogleFormat("int f(int a, char&& b) {}"); 7336 verifyGoogleFormat("void f() { int&& a = b; }"); 7337 7338 verifyIndependentOfContext("A<int &&> a;"); 7339 verifyIndependentOfContext("A<int &&, int &&> a;"); 7340 verifyGoogleFormat("A<int&&> a;"); 7341 verifyGoogleFormat("A<int&&, int&&> a;"); 7342 7343 // Not rvalue references: 7344 verifyFormat("template <bool B, bool C> class A {\n" 7345 " static_assert(B && C, \"Something is wrong\");\n" 7346 "};"); 7347 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))"); 7348 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))"); 7349 verifyFormat("#define A(a, b) (a && b)"); 7350 } 7351 7352 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) { 7353 verifyFormat("void f() {\n" 7354 " x[aaaaaaaaa -\n" 7355 " b] = 23;\n" 7356 "}", 7357 getLLVMStyleWithColumns(15)); 7358 } 7359 7360 TEST_F(FormatTest, FormatsCasts) { 7361 verifyFormat("Type *A = static_cast<Type *>(P);"); 7362 verifyFormat("Type *A = (Type *)P;"); 7363 verifyFormat("Type *A = (vector<Type *, int *>)P;"); 7364 verifyFormat("int a = (int)(2.0f);"); 7365 verifyFormat("int a = (int)2.0f;"); 7366 verifyFormat("x[(int32)y];"); 7367 verifyFormat("x = (int32)y;"); 7368 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)"); 7369 verifyFormat("int a = (int)*b;"); 7370 verifyFormat("int a = (int)2.0f;"); 7371 verifyFormat("int a = (int)~0;"); 7372 verifyFormat("int a = (int)++a;"); 7373 verifyFormat("int a = (int)sizeof(int);"); 7374 verifyFormat("int a = (int)+2;"); 7375 verifyFormat("my_int a = (my_int)2.0f;"); 7376 verifyFormat("my_int a = (my_int)sizeof(int);"); 7377 verifyFormat("return (my_int)aaa;"); 7378 verifyFormat("#define x ((int)-1)"); 7379 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); 7380 verifyFormat("#define p(q) ((int *)&q)"); 7381 verifyFormat("fn(a)(b) + 1;"); 7382 7383 verifyFormat("void f() { my_int a = (my_int)*b; }"); 7384 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); 7385 verifyFormat("my_int a = (my_int)~0;"); 7386 verifyFormat("my_int a = (my_int)++a;"); 7387 verifyFormat("my_int a = (my_int)-2;"); 7388 verifyFormat("my_int a = (my_int)1;"); 7389 verifyFormat("my_int a = (my_int *)1;"); 7390 verifyFormat("my_int a = (const my_int)-1;"); 7391 verifyFormat("my_int a = (const my_int *)-1;"); 7392 verifyFormat("my_int a = (my_int)(my_int)-1;"); 7393 verifyFormat("my_int a = (ns::my_int)-2;"); 7394 verifyFormat("case (my_int)ONE:"); 7395 verifyFormat("auto x = (X)this;"); 7396 7397 // FIXME: single value wrapped with paren will be treated as cast. 7398 verifyFormat("void f(int i = (kValue)*kMask) {}"); 7399 7400 verifyFormat("{ (void)F; }"); 7401 7402 // Don't break after a cast's 7403 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 7404 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n" 7405 " bbbbbbbbbbbbbbbbbbbbbb);"); 7406 7407 // These are not casts. 7408 verifyFormat("void f(int *) {}"); 7409 verifyFormat("f(foo)->b;"); 7410 verifyFormat("f(foo).b;"); 7411 verifyFormat("f(foo)(b);"); 7412 verifyFormat("f(foo)[b];"); 7413 verifyFormat("[](foo) { return 4; }(bar);"); 7414 verifyFormat("(*funptr)(foo)[4];"); 7415 verifyFormat("funptrs[4](foo)[4];"); 7416 verifyFormat("void f(int *);"); 7417 verifyFormat("void f(int *) = 0;"); 7418 verifyFormat("void f(SmallVector<int>) {}"); 7419 verifyFormat("void f(SmallVector<int>);"); 7420 verifyFormat("void f(SmallVector<int>) = 0;"); 7421 verifyFormat("void f(int i = (kA * kB) & kMask) {}"); 7422 verifyFormat("int a = sizeof(int) * b;"); 7423 verifyFormat("int a = alignof(int) * b;", getGoogleStyle()); 7424 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;"); 7425 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");"); 7426 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;"); 7427 7428 // These are not casts, but at some point were confused with casts. 7429 verifyFormat("virtual void foo(int *) override;"); 7430 verifyFormat("virtual void foo(char &) const;"); 7431 verifyFormat("virtual void foo(int *a, char *) const;"); 7432 verifyFormat("int a = sizeof(int *) + b;"); 7433 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle()); 7434 verifyFormat("bool b = f(g<int>) && c;"); 7435 verifyFormat("typedef void (*f)(int i) func;"); 7436 7437 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n" 7438 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); 7439 // FIXME: The indentation here is not ideal. 7440 verifyFormat( 7441 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7442 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n" 7443 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];"); 7444 } 7445 7446 TEST_F(FormatTest, FormatsFunctionTypes) { 7447 verifyFormat("A<bool()> a;"); 7448 verifyFormat("A<SomeType()> a;"); 7449 verifyFormat("A<void (*)(int, std::string)> a;"); 7450 verifyFormat("A<void *(int)>;"); 7451 verifyFormat("void *(*a)(int *, SomeType *);"); 7452 verifyFormat("int (*func)(void *);"); 7453 verifyFormat("void f() { int (*func)(void *); }"); 7454 verifyFormat("template <class CallbackClass>\n" 7455 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);"); 7456 7457 verifyGoogleFormat("A<void*(int*, SomeType*)>;"); 7458 verifyGoogleFormat("void* (*a)(int);"); 7459 verifyGoogleFormat( 7460 "template <class CallbackClass>\n" 7461 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);"); 7462 7463 // Other constructs can look somewhat like function types: 7464 verifyFormat("A<sizeof(*x)> a;"); 7465 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)"); 7466 verifyFormat("some_var = function(*some_pointer_var)[0];"); 7467 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }"); 7468 verifyFormat("int x = f(&h)();"); 7469 verifyFormat("returnsFunction(¶m1, ¶m2)(param);"); 7470 verifyFormat("std::function<\n" 7471 " LooooooooooongTemplatedType<\n" 7472 " SomeType>*(\n" 7473 " LooooooooooooooooongType type)>\n" 7474 " function;", 7475 getGoogleStyleWithColumns(40)); 7476 } 7477 7478 TEST_F(FormatTest, FormatsPointersToArrayTypes) { 7479 verifyFormat("A (*foo_)[6];"); 7480 verifyFormat("vector<int> (*foo_)[6];"); 7481 } 7482 7483 TEST_F(FormatTest, BreaksLongVariableDeclarations) { 7484 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7485 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7486 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n" 7487 " LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7488 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7489 " *LoooooooooooooooooooooooooooooooooooooooongVariable;"); 7490 7491 // Different ways of ()-initializiation. 7492 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7493 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);"); 7494 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7495 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);"); 7496 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7497 " LoooooooooooooooooooooooooooooooooooooooongVariable({});"); 7498 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n" 7499 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);"); 7500 7501 // Lambdas should not confuse the variable declaration heuristic. 7502 verifyFormat("LooooooooooooooooongType\n" 7503 " variable(nullptr, [](A *a) {});", 7504 getLLVMStyleWithColumns(40)); 7505 } 7506 7507 TEST_F(FormatTest, BreaksLongDeclarations) { 7508 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n" 7509 " AnotherNameForTheLongType;"); 7510 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n" 7511 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 7512 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7513 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7514 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n" 7515 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); 7516 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7517 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7518 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" 7519 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7520 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7521 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7522 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7523 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); 7524 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7525 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);"); 7526 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7527 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}"); 7528 FormatStyle Indented = getLLVMStyle(); 7529 Indented.IndentWrappedFunctionNames = true; 7530 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7531 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", 7532 Indented); 7533 verifyFormat( 7534 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" 7535 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7536 Indented); 7537 verifyFormat( 7538 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" 7539 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7540 Indented); 7541 verifyFormat( 7542 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" 7543 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", 7544 Indented); 7545 7546 // FIXME: Without the comment, this breaks after "(". 7547 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" 7548 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();", 7549 getGoogleStyle()); 7550 7551 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n" 7552 " int LoooooooooooooooooooongParam2) {}"); 7553 verifyFormat( 7554 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n" 7555 " SourceLocation L, IdentifierIn *II,\n" 7556 " Type *T) {}"); 7557 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n" 7558 "ReallyReaaallyLongFunctionName(\n" 7559 " const std::string &SomeParameter,\n" 7560 " const SomeType<string, SomeOtherTemplateParameter>\n" 7561 " &ReallyReallyLongParameterName,\n" 7562 " const SomeType<string, SomeOtherTemplateParameter>\n" 7563 " &AnotherLongParameterName) {}"); 7564 verifyFormat("template <typename A>\n" 7565 "SomeLoooooooooooooooooooooongType<\n" 7566 " typename some_namespace::SomeOtherType<A>::Type>\n" 7567 "Function() {}"); 7568 7569 verifyGoogleFormat( 7570 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n" 7571 " aaaaaaaaaaaaaaaaaaaaaaa;"); 7572 verifyGoogleFormat( 7573 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n" 7574 " SourceLocation L) {}"); 7575 verifyGoogleFormat( 7576 "some_namespace::LongReturnType\n" 7577 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n" 7578 " int first_long_parameter, int second_parameter) {}"); 7579 7580 verifyGoogleFormat("template <typename T>\n" 7581 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7582 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); 7583 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7584 " int aaaaaaaaaaaaaaaaaaaaaaa);"); 7585 7586 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" 7587 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7588 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7589 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7590 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" 7591 " aaaaaaaaaaaaaaaaaaaaaaaa);"); 7592 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 7593 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n" 7594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n" 7595 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7596 7597 verifyFormat("template <typename T> // Templates on own line.\n" 7598 "static int // Some comment.\n" 7599 "MyFunction(int a);", 7600 getLLVMStyle()); 7601 } 7602 7603 TEST_F(FormatTest, FormatsArrays) { 7604 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7605 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;"); 7606 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n" 7607 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;"); 7608 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n" 7609 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}"); 7610 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7611 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7612 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7613 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;"); 7614 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 7615 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7616 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;"); 7617 verifyFormat( 7618 "llvm::outs() << \"aaaaaaaaaaaa: \"\n" 7619 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n" 7620 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];"); 7621 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n" 7622 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7623 7624 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n" 7625 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];"); 7626 verifyFormat( 7627 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n" 7628 " .aaaaaaa[0]\n" 7629 " .aaaaaaaaaaaaaaaaaaaaaa();"); 7630 verifyFormat("a[::b::c];"); 7631 7632 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10)); 7633 7634 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0); 7635 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit); 7636 } 7637 7638 TEST_F(FormatTest, LineStartsWithSpecialCharacter) { 7639 verifyFormat("(a)->b();"); 7640 verifyFormat("--a;"); 7641 } 7642 7643 TEST_F(FormatTest, HandlesIncludeDirectives) { 7644 verifyFormat("#include <string>\n" 7645 "#include <a/b/c.h>\n" 7646 "#include \"a/b/string\"\n" 7647 "#include \"string.h\"\n" 7648 "#include \"string.h\"\n" 7649 "#include <a-a>\n" 7650 "#include < path with space >\n" 7651 "#include_next <test.h>" 7652 "#include \"abc.h\" // this is included for ABC\n" 7653 "#include \"some long include\" // with a comment\n" 7654 "#include \"some very long include path\"\n" 7655 "#include <some/very/long/include/path>\n", 7656 getLLVMStyleWithColumns(35)); 7657 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); 7658 EXPECT_EQ("#include <a>", format("#include<a>")); 7659 7660 verifyFormat("#import <string>"); 7661 verifyFormat("#import <a/b/c.h>"); 7662 verifyFormat("#import \"a/b/string\""); 7663 verifyFormat("#import \"string.h\""); 7664 verifyFormat("#import \"string.h\""); 7665 verifyFormat("#if __has_include(<strstream>)\n" 7666 "#include <strstream>\n" 7667 "#endif"); 7668 7669 verifyFormat("#define MY_IMPORT <a/b>"); 7670 7671 verifyFormat("#if __has_include(<a/b>)"); 7672 verifyFormat("#if __has_include_next(<a/b>)"); 7673 verifyFormat("#define F __has_include(<a/b>)"); 7674 verifyFormat("#define F __has_include_next(<a/b>)"); 7675 7676 // Protocol buffer definition or missing "#". 7677 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", 7678 getLLVMStyleWithColumns(30)); 7679 7680 FormatStyle Style = getLLVMStyle(); 7681 Style.AlwaysBreakBeforeMultilineStrings = true; 7682 Style.ColumnLimit = 0; 7683 verifyFormat("#import \"abc.h\"", Style); 7684 7685 // But 'import' might also be a regular C++ namespace. 7686 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 7687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); 7688 } 7689 7690 //===----------------------------------------------------------------------===// 7691 // Error recovery tests. 7692 //===----------------------------------------------------------------------===// 7693 7694 TEST_F(FormatTest, IncompleteParameterLists) { 7695 FormatStyle NoBinPacking = getLLVMStyle(); 7696 NoBinPacking.BinPackParameters = false; 7697 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n" 7698 " double *min_x,\n" 7699 " double *max_x,\n" 7700 " double *min_y,\n" 7701 " double *max_y,\n" 7702 " double *min_z,\n" 7703 " double *max_z, ) {}", 7704 NoBinPacking); 7705 } 7706 7707 TEST_F(FormatTest, IncorrectCodeTrailingStuff) { 7708 verifyFormat("void f() { return; }\n42"); 7709 verifyFormat("void f() {\n" 7710 " if (0)\n" 7711 " return;\n" 7712 "}\n" 7713 "42"); 7714 verifyFormat("void f() { return }\n42"); 7715 verifyFormat("void f() {\n" 7716 " if (0)\n" 7717 " return\n" 7718 "}\n" 7719 "42"); 7720 } 7721 7722 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) { 7723 EXPECT_EQ("void f() { return }", format("void f ( ) { return }")); 7724 EXPECT_EQ("void f() {\n" 7725 " if (a)\n" 7726 " return\n" 7727 "}", 7728 format("void f ( ) { if ( a ) return }")); 7729 EXPECT_EQ("namespace N {\n" 7730 "void f()\n" 7731 "}", 7732 format("namespace N { void f() }")); 7733 EXPECT_EQ("namespace N {\n" 7734 "void f() {}\n" 7735 "void g()\n" 7736 "} // namespace N", 7737 format("namespace N { void f( ) { } void g( ) }")); 7738 } 7739 7740 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) { 7741 verifyFormat("int aaaaaaaa =\n" 7742 " // Overlylongcomment\n" 7743 " b;", 7744 getLLVMStyleWithColumns(20)); 7745 verifyFormat("function(\n" 7746 " ShortArgument,\n" 7747 " LoooooooooooongArgument);\n", 7748 getLLVMStyleWithColumns(20)); 7749 } 7750 7751 TEST_F(FormatTest, IncorrectAccessSpecifier) { 7752 verifyFormat("public:"); 7753 verifyFormat("class A {\n" 7754 "public\n" 7755 " void f() {}\n" 7756 "};"); 7757 verifyFormat("public\n" 7758 "int qwerty;"); 7759 verifyFormat("public\n" 7760 "B {}"); 7761 verifyFormat("public\n" 7762 "{}"); 7763 verifyFormat("public\n" 7764 "B { int x; }"); 7765 } 7766 7767 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 7768 verifyFormat("{"); 7769 verifyFormat("#})"); 7770 verifyNoCrash("(/**/[:!] ?[)."); 7771 } 7772 7773 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) { 7774 // Found by oss-fuzz: 7775 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212 7776 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); 7777 Style.ColumnLimit = 60; 7778 verifyNoCrash( 7779 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20" 7780 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20" 7781 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a", 7782 Style); 7783 } 7784 7785 TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 7786 verifyFormat("do {\n}"); 7787 verifyFormat("do {\n}\n" 7788 "f();"); 7789 verifyFormat("do {\n}\n" 7790 "wheeee(fun);"); 7791 verifyFormat("do {\n" 7792 " f();\n" 7793 "}"); 7794 } 7795 7796 TEST_F(FormatTest, IncorrectCodeMissingParens) { 7797 verifyFormat("if {\n foo;\n foo();\n}"); 7798 verifyFormat("switch {\n foo;\n foo();\n}"); 7799 verifyIncompleteFormat("for {\n foo;\n foo();\n}"); 7800 verifyFormat("while {\n foo;\n foo();\n}"); 7801 verifyFormat("do {\n foo;\n foo();\n} while;"); 7802 } 7803 7804 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) { 7805 verifyIncompleteFormat("namespace {\n" 7806 "class Foo { Foo (\n" 7807 "};\n" 7808 "} // namespace"); 7809 } 7810 7811 TEST_F(FormatTest, IncorrectCodeErrorDetection) { 7812 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n")); 7813 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n")); 7814 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); 7815 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n")); 7816 7817 EXPECT_EQ("{\n" 7818 " {\n" 7819 " breakme(\n" 7820 " qwe);\n" 7821 " }\n", 7822 format("{\n" 7823 " {\n" 7824 " breakme(qwe);\n" 7825 "}\n", 7826 getLLVMStyleWithColumns(10))); 7827 } 7828 7829 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) { 7830 verifyFormat("int x = {\n" 7831 " avariable,\n" 7832 " b(alongervariable)};", 7833 getLLVMStyleWithColumns(25)); 7834 } 7835 7836 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) { 7837 verifyFormat("return (a)(b){1, 2, 3};"); 7838 } 7839 7840 TEST_F(FormatTest, LayoutCxx11BraceInitializers) { 7841 verifyFormat("vector<int> x{1, 2, 3, 4};"); 7842 verifyFormat("vector<int> x{\n" 7843 " 1,\n" 7844 " 2,\n" 7845 " 3,\n" 7846 " 4,\n" 7847 "};"); 7848 verifyFormat("vector<T> x{{}, {}, {}, {}};"); 7849 verifyFormat("f({1, 2});"); 7850 verifyFormat("auto v = Foo{-1};"); 7851 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});"); 7852 verifyFormat("Class::Class : member{1, 2, 3} {}"); 7853 verifyFormat("new vector<int>{1, 2, 3};"); 7854 verifyFormat("new int[3]{1, 2, 3};"); 7855 verifyFormat("new int{1};"); 7856 verifyFormat("return {arg1, arg2};"); 7857 verifyFormat("return {arg1, SomeType{parameter}};"); 7858 verifyFormat("int count = set<int>{f(), g(), h()}.size();"); 7859 verifyFormat("new T{arg1, arg2};"); 7860 verifyFormat("f(MyMap[{composite, key}]);"); 7861 verifyFormat("class Class {\n" 7862 " T member = {arg1, arg2};\n" 7863 "};"); 7864 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};"); 7865 verifyFormat("const struct A a = {.a = 1, .b = 2};"); 7866 verifyFormat("const struct A a = {[0] = 1, [1] = 2};"); 7867 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");"); 7868 verifyFormat("int a = std::is_integral<int>{} + 0;"); 7869 7870 verifyFormat("int foo(int i) { return fo1{}(i); }"); 7871 verifyFormat("int foo(int i) { return fo1{}(i); }"); 7872 verifyFormat("auto i = decltype(x){};"); 7873 verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); 7874 verifyFormat("Node n{1, Node{1000}, //\n" 7875 " 2};"); 7876 verifyFormat("Aaaa aaaaaaa{\n" 7877 " {\n" 7878 " aaaa,\n" 7879 " },\n" 7880 "};"); 7881 verifyFormat("class C : public D {\n" 7882 " SomeClass SC{2};\n" 7883 "};"); 7884 verifyFormat("class C : public A {\n" 7885 " class D : public B {\n" 7886 " void f() { int i{2}; }\n" 7887 " };\n" 7888 "};"); 7889 verifyFormat("#define A {a, a},"); 7890 7891 // Avoid breaking between equal sign and opening brace 7892 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle(); 7893 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200; 7894 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n" 7895 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n" 7896 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n" 7897 " {\"ccccccccccccccccccccc\", 2}};", 7898 AvoidBreakingFirstArgument); 7899 7900 // Binpacking only if there is no trailing comma 7901 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n" 7902 " cccccccccc, dddddddddd};", 7903 getLLVMStyleWithColumns(50)); 7904 verifyFormat("const Aaaaaa aaaaa = {\n" 7905 " aaaaaaaaaaa,\n" 7906 " bbbbbbbbbbb,\n" 7907 " ccccccccccc,\n" 7908 " ddddddddddd,\n" 7909 "};", 7910 getLLVMStyleWithColumns(50)); 7911 7912 // Cases where distinguising braced lists and blocks is hard. 7913 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);"); 7914 verifyFormat("void f() {\n" 7915 " return; // comment\n" 7916 "}\n" 7917 "SomeType t;"); 7918 verifyFormat("void f() {\n" 7919 " if (a) {\n" 7920 " f();\n" 7921 " }\n" 7922 "}\n" 7923 "SomeType t;"); 7924 7925 // In combination with BinPackArguments = false. 7926 FormatStyle NoBinPacking = getLLVMStyle(); 7927 NoBinPacking.BinPackArguments = false; 7928 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n" 7929 " bbbbb,\n" 7930 " ccccc,\n" 7931 " ddddd,\n" 7932 " eeeee,\n" 7933 " ffffff,\n" 7934 " ggggg,\n" 7935 " hhhhhh,\n" 7936 " iiiiii,\n" 7937 " jjjjjj,\n" 7938 " kkkkkk};", 7939 NoBinPacking); 7940 verifyFormat("const Aaaaaa aaaaa = {\n" 7941 " aaaaa,\n" 7942 " bbbbb,\n" 7943 " ccccc,\n" 7944 " ddddd,\n" 7945 " eeeee,\n" 7946 " ffffff,\n" 7947 " ggggg,\n" 7948 " hhhhhh,\n" 7949 " iiiiii,\n" 7950 " jjjjjj,\n" 7951 " kkkkkk,\n" 7952 "};", 7953 NoBinPacking); 7954 verifyFormat( 7955 "const Aaaaaa aaaaa = {\n" 7956 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" 7957 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" 7958 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" 7959 "};", 7960 NoBinPacking); 7961 7962 NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 7963 EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n" 7964 " CDDDP83848_BMCR_REGISTER,\n" 7965 " CDDDP83848_BMSR_REGISTER,\n" 7966 " CDDDP83848_RBR_REGISTER};", 7967 format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n" 7968 " CDDDP83848_BMSR_REGISTER,\n" 7969 " CDDDP83848_RBR_REGISTER};", 7970 NoBinPacking)); 7971 7972 // FIXME: The alignment of these trailing comments might be bad. Then again, 7973 // this might be utterly useless in real code. 7974 verifyFormat("Constructor::Constructor()\n" 7975 " : some_value{ //\n" 7976 " aaaaaaa, //\n" 7977 " bbbbbbb} {}"); 7978 7979 // In braced lists, the first comment is always assumed to belong to the 7980 // first element. Thus, it can be moved to the next or previous line as 7981 // appropriate. 7982 EXPECT_EQ("function({// First element:\n" 7983 " 1,\n" 7984 " // Second element:\n" 7985 " 2});", 7986 format("function({\n" 7987 " // First element:\n" 7988 " 1,\n" 7989 " // Second element:\n" 7990 " 2});")); 7991 EXPECT_EQ("std::vector<int> MyNumbers{\n" 7992 " // First element:\n" 7993 " 1,\n" 7994 " // Second element:\n" 7995 " 2};", 7996 format("std::vector<int> MyNumbers{// First element:\n" 7997 " 1,\n" 7998 " // Second element:\n" 7999 " 2};", 8000 getLLVMStyleWithColumns(30))); 8001 // A trailing comma should still lead to an enforced line break and no 8002 // binpacking. 8003 EXPECT_EQ("vector<int> SomeVector = {\n" 8004 " // aaa\n" 8005 " 1,\n" 8006 " 2,\n" 8007 "};", 8008 format("vector<int> SomeVector = { // aaa\n" 8009 " 1, 2, };")); 8010 8011 FormatStyle ExtraSpaces = getLLVMStyle(); 8012 ExtraSpaces.Cpp11BracedListStyle = false; 8013 ExtraSpaces.ColumnLimit = 75; 8014 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces); 8015 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces); 8016 verifyFormat("f({ 1, 2 });", ExtraSpaces); 8017 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces); 8018 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces); 8019 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces); 8020 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces); 8021 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces); 8022 verifyFormat("return { arg1, arg2 };", ExtraSpaces); 8023 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces); 8024 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces); 8025 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces); 8026 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces); 8027 verifyFormat("class Class {\n" 8028 " T member = { arg1, arg2 };\n" 8029 "};", 8030 ExtraSpaces); 8031 verifyFormat( 8032 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8033 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n" 8034 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" 8035 " bbbbbbbbbbbbbbbbbbbb, bbbbb };", 8036 ExtraSpaces); 8037 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); 8038 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", 8039 ExtraSpaces); 8040 verifyFormat( 8041 "someFunction(OtherParam,\n" 8042 " BracedList{ // comment 1 (Forcing interesting break)\n" 8043 " param1, param2,\n" 8044 " // comment 2\n" 8045 " param3, param4 });", 8046 ExtraSpaces); 8047 verifyFormat( 8048 "std::this_thread::sleep_for(\n" 8049 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", 8050 ExtraSpaces); 8051 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n" 8052 " aaaaaaa,\n" 8053 " aaaaaaaaaa,\n" 8054 " aaaaa,\n" 8055 " aaaaaaaaaaaaaaa,\n" 8056 " aaa,\n" 8057 " aaaaaaaaaa,\n" 8058 " a,\n" 8059 " aaaaaaaaaaaaaaaaaaaaa,\n" 8060 " aaaaaaaaaaaa,\n" 8061 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" 8062 " aaaaaaa,\n" 8063 " a};"); 8064 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); 8065 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces); 8066 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces); 8067 8068 // Avoid breaking between initializer/equal sign and opening brace 8069 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200; 8070 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n" 8071 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8072 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8073 " { \"ccccccccccccccccccccc\", 2 }\n" 8074 "};", 8075 ExtraSpaces); 8076 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n" 8077 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n" 8078 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n" 8079 " { \"ccccccccccccccccccccc\", 2 }\n" 8080 "};", 8081 ExtraSpaces); 8082 8083 FormatStyle SpaceBeforeBrace = getLLVMStyle(); 8084 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true; 8085 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace); 8086 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace); 8087 } 8088 8089 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { 8090 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8091 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8092 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8093 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8094 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8095 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8096 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n" 8097 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8098 " 1, 22, 333, 4444, 55555, //\n" 8099 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8100 " 1, 22, 333, 4444, 55555, 666666, 7777777};"); 8101 verifyFormat( 8102 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8103 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8104 " 1, 22, 333, 4444, 55555, 666666, // comment\n" 8105 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8106 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8107 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n" 8108 " 7777777};"); 8109 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8110 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8111 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8112 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8113 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8114 " // Separating comment.\n" 8115 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8116 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n" 8117 " // Leading comment\n" 8118 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n" 8119 " X86::R8, X86::R9, X86::R10, X86::R11, 0};"); 8120 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8121 " 1, 1, 1, 1};", 8122 getLLVMStyleWithColumns(39)); 8123 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8124 " 1, 1, 1, 1};", 8125 getLLVMStyleWithColumns(38)); 8126 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n" 8127 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};", 8128 getLLVMStyleWithColumns(43)); 8129 verifyFormat( 8130 "static unsigned SomeValues[10][3] = {\n" 8131 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n" 8132 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};"); 8133 verifyFormat("static auto fields = new vector<string>{\n" 8134 " \"aaaaaaaaaaaaa\",\n" 8135 " \"aaaaaaaaaaaaa\",\n" 8136 " \"aaaaaaaaaaaa\",\n" 8137 " \"aaaaaaaaaaaaaa\",\n" 8138 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8139 " \"aaaaaaaaaaaa\",\n" 8140 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n" 8141 "};"); 8142 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};"); 8143 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n" 8144 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n" 8145 " 3, cccccccccccccccccccccc};", 8146 getLLVMStyleWithColumns(60)); 8147 8148 // Trailing commas. 8149 verifyFormat("vector<int> x = {\n" 8150 " 1, 1, 1, 1, 1, 1, 1, 1,\n" 8151 "};", 8152 getLLVMStyleWithColumns(39)); 8153 verifyFormat("vector<int> x = {\n" 8154 " 1, 1, 1, 1, 1, 1, 1, 1, //\n" 8155 "};", 8156 getLLVMStyleWithColumns(39)); 8157 verifyFormat("vector<int> x = {1, 1, 1, 1,\n" 8158 " 1, 1, 1, 1,\n" 8159 " /**/ /**/};", 8160 getLLVMStyleWithColumns(39)); 8161 8162 // Trailing comment in the first line. 8163 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n" 8164 " 1111111111, 2222222222, 33333333333, 4444444444, //\n" 8165 " 111111111, 222222222, 3333333333, 444444444, //\n" 8166 " 11111111, 22222222, 333333333, 44444444};"); 8167 // Trailing comment in the last line. 8168 verifyFormat("int aaaaa[] = {\n" 8169 " 1, 2, 3, // comment\n" 8170 " 4, 5, 6 // comment\n" 8171 "};"); 8172 8173 // With nested lists, we should either format one item per line or all nested 8174 // lists one on line. 8175 // FIXME: For some nested lists, we can do better. 8176 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" 8177 " {aaaaaaaaaaaaaaaaaaa},\n" 8178 " {aaaaaaaaaaaaaaaaaaaaa},\n" 8179 " {aaaaaaaaaaaaaaaaa}};", 8180 getLLVMStyleWithColumns(60)); 8181 verifyFormat( 8182 "SomeStruct my_struct_array = {\n" 8183 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" 8184 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n" 8185 " {aaa, aaa},\n" 8186 " {aaa, aaa},\n" 8187 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n" 8188 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" 8189 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};"); 8190 8191 // No column layout should be used here. 8192 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n" 8193 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};"); 8194 8195 verifyNoCrash("a<,"); 8196 8197 // No braced initializer here. 8198 verifyFormat("void f() {\n" 8199 " struct Dummy {};\n" 8200 " f(v);\n" 8201 "}"); 8202 8203 // Long lists should be formatted in columns even if they are nested. 8204 verifyFormat( 8205 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8206 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8207 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8208 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8209 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n" 8210 " 1, 22, 333, 4444, 55555, 666666, 7777777});"); 8211 8212 // Allow "single-column" layout even if that violates the column limit. There 8213 // isn't going to be a better way. 8214 verifyFormat("std::vector<int> a = {\n" 8215 " aaaaaaaa,\n" 8216 " aaaaaaaa,\n" 8217 " aaaaaaaa,\n" 8218 " aaaaaaaa,\n" 8219 " aaaaaaaaaa,\n" 8220 " aaaaaaaa,\n" 8221 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};", 8222 getLLVMStyleWithColumns(30)); 8223 verifyFormat("vector<int> aaaa = {\n" 8224 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8225 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 8226 " aaaaaa.aaaaaaa,\n" 8227 " aaaaaa.aaaaaaa,\n" 8228 " aaaaaa.aaaaaaa,\n" 8229 " aaaaaa.aaaaaaa,\n" 8230 "};"); 8231 8232 // Don't create hanging lists. 8233 verifyFormat("someFunction(Param, {List1, List2,\n" 8234 " List3});", 8235 getLLVMStyleWithColumns(35)); 8236 verifyFormat("someFunction(Param, Param,\n" 8237 " {List1, List2,\n" 8238 " List3});", 8239 getLLVMStyleWithColumns(35)); 8240 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n" 8241 " aaaaaaaaaaaaaaaaaaaaaaa);"); 8242 } 8243 8244 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { 8245 FormatStyle DoNotMerge = getLLVMStyle(); 8246 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8247 8248 verifyFormat("void f() { return 42; }"); 8249 verifyFormat("void f() {\n" 8250 " return 42;\n" 8251 "}", 8252 DoNotMerge); 8253 verifyFormat("void f() {\n" 8254 " // Comment\n" 8255 "}"); 8256 verifyFormat("{\n" 8257 "#error {\n" 8258 " int a;\n" 8259 "}"); 8260 verifyFormat("{\n" 8261 " int a;\n" 8262 "#error {\n" 8263 "}"); 8264 verifyFormat("void f() {} // comment"); 8265 verifyFormat("void f() { int a; } // comment"); 8266 verifyFormat("void f() {\n" 8267 "} // comment", 8268 DoNotMerge); 8269 verifyFormat("void f() {\n" 8270 " int a;\n" 8271 "} // comment", 8272 DoNotMerge); 8273 verifyFormat("void f() {\n" 8274 "} // comment", 8275 getLLVMStyleWithColumns(15)); 8276 8277 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23)); 8278 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22)); 8279 8280 verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); 8281 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); 8282 verifyFormat("class C {\n" 8283 " C()\n" 8284 " : iiiiiiii(nullptr),\n" 8285 " kkkkkkk(nullptr),\n" 8286 " mmmmmmm(nullptr),\n" 8287 " nnnnnnn(nullptr) {}\n" 8288 "};", 8289 getGoogleStyle()); 8290 8291 FormatStyle NoColumnLimit = getLLVMStyle(); 8292 NoColumnLimit.ColumnLimit = 0; 8293 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); 8294 EXPECT_EQ("class C {\n" 8295 " A() : b(0) {}\n" 8296 "};", 8297 format("class C{A():b(0){}};", NoColumnLimit)); 8298 EXPECT_EQ("A()\n" 8299 " : b(0) {\n" 8300 "}", 8301 format("A()\n:b(0)\n{\n}", NoColumnLimit)); 8302 8303 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; 8304 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = 8305 FormatStyle::SFS_None; 8306 EXPECT_EQ("A()\n" 8307 " : b(0) {\n" 8308 "}", 8309 format("A():b(0){}", DoNotMergeNoColumnLimit)); 8310 EXPECT_EQ("A()\n" 8311 " : b(0) {\n" 8312 "}", 8313 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); 8314 8315 verifyFormat("#define A \\\n" 8316 " void f() { \\\n" 8317 " int i; \\\n" 8318 " }", 8319 getLLVMStyleWithColumns(20)); 8320 verifyFormat("#define A \\\n" 8321 " void f() { int i; }", 8322 getLLVMStyleWithColumns(21)); 8323 verifyFormat("#define A \\\n" 8324 " void f() { \\\n" 8325 " int i; \\\n" 8326 " } \\\n" 8327 " int j;", 8328 getLLVMStyleWithColumns(22)); 8329 verifyFormat("#define A \\\n" 8330 " void f() { int i; } \\\n" 8331 " int j;", 8332 getLLVMStyleWithColumns(23)); 8333 } 8334 8335 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) { 8336 FormatStyle MergeEmptyOnly = getLLVMStyle(); 8337 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8338 verifyFormat("class C {\n" 8339 " int f() {}\n" 8340 "};", 8341 MergeEmptyOnly); 8342 verifyFormat("class C {\n" 8343 " int f() {\n" 8344 " return 42;\n" 8345 " }\n" 8346 "};", 8347 MergeEmptyOnly); 8348 verifyFormat("int f() {}", MergeEmptyOnly); 8349 verifyFormat("int f() {\n" 8350 " return 42;\n" 8351 "}", 8352 MergeEmptyOnly); 8353 8354 // Also verify behavior when BraceWrapping.AfterFunction = true 8355 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8356 MergeEmptyOnly.BraceWrapping.AfterFunction = true; 8357 verifyFormat("int f() {}", MergeEmptyOnly); 8358 verifyFormat("class C {\n" 8359 " int f() {}\n" 8360 "};", 8361 MergeEmptyOnly); 8362 } 8363 8364 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) { 8365 FormatStyle MergeInlineOnly = getLLVMStyle(); 8366 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8367 verifyFormat("class C {\n" 8368 " int f() { return 42; }\n" 8369 "};", 8370 MergeInlineOnly); 8371 verifyFormat("int f() {\n" 8372 " return 42;\n" 8373 "}", 8374 MergeInlineOnly); 8375 8376 // SFS_Inline implies SFS_Empty 8377 verifyFormat("class C {\n" 8378 " int f() {}\n" 8379 "};", 8380 MergeInlineOnly); 8381 verifyFormat("int f() {}", MergeInlineOnly); 8382 8383 // Also verify behavior when BraceWrapping.AfterFunction = true 8384 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8385 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8386 verifyFormat("class C {\n" 8387 " int f() { return 42; }\n" 8388 "};", 8389 MergeInlineOnly); 8390 verifyFormat("int f()\n" 8391 "{\n" 8392 " return 42;\n" 8393 "}", 8394 MergeInlineOnly); 8395 8396 // SFS_Inline implies SFS_Empty 8397 verifyFormat("int f() {}", MergeInlineOnly); 8398 verifyFormat("class C {\n" 8399 " int f() {}\n" 8400 "};", 8401 MergeInlineOnly); 8402 } 8403 8404 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) { 8405 FormatStyle MergeInlineOnly = getLLVMStyle(); 8406 MergeInlineOnly.AllowShortFunctionsOnASingleLine = 8407 FormatStyle::SFS_InlineOnly; 8408 verifyFormat("class C {\n" 8409 " int f() { return 42; }\n" 8410 "};", 8411 MergeInlineOnly); 8412 verifyFormat("int f() {\n" 8413 " return 42;\n" 8414 "}", 8415 MergeInlineOnly); 8416 8417 // SFS_InlineOnly does not imply SFS_Empty 8418 verifyFormat("class C {\n" 8419 " int f() {}\n" 8420 "};", 8421 MergeInlineOnly); 8422 verifyFormat("int f() {\n" 8423 "}", 8424 MergeInlineOnly); 8425 8426 // Also verify behavior when BraceWrapping.AfterFunction = true 8427 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom; 8428 MergeInlineOnly.BraceWrapping.AfterFunction = true; 8429 verifyFormat("class C {\n" 8430 " int f() { return 42; }\n" 8431 "};", 8432 MergeInlineOnly); 8433 verifyFormat("int f()\n" 8434 "{\n" 8435 " return 42;\n" 8436 "}", 8437 MergeInlineOnly); 8438 8439 // SFS_InlineOnly does not imply SFS_Empty 8440 verifyFormat("int f()\n" 8441 "{\n" 8442 "}", 8443 MergeInlineOnly); 8444 verifyFormat("class C {\n" 8445 " int f() {}\n" 8446 "};", 8447 MergeInlineOnly); 8448 } 8449 8450 TEST_F(FormatTest, SplitEmptyFunction) { 8451 FormatStyle Style = getLLVMStyle(); 8452 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 8453 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8454 Style.BraceWrapping.AfterFunction = true; 8455 Style.BraceWrapping.SplitEmptyFunction = false; 8456 Style.ColumnLimit = 40; 8457 8458 verifyFormat("int f()\n" 8459 "{}", 8460 Style); 8461 verifyFormat("int f()\n" 8462 "{\n" 8463 " return 42;\n" 8464 "}", 8465 Style); 8466 verifyFormat("int f()\n" 8467 "{\n" 8468 " // some comment\n" 8469 "}", 8470 Style); 8471 8472 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty; 8473 verifyFormat("int f() {}", Style); 8474 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8475 "{}", 8476 Style); 8477 verifyFormat("int f()\n" 8478 "{\n" 8479 " return 0;\n" 8480 "}", 8481 Style); 8482 8483 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 8484 verifyFormat("class Foo {\n" 8485 " int f() {}\n" 8486 "};\n", 8487 Style); 8488 verifyFormat("class Foo {\n" 8489 " int f() { return 0; }\n" 8490 "};\n", 8491 Style); 8492 verifyFormat("class Foo {\n" 8493 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8494 " {}\n" 8495 "};\n", 8496 Style); 8497 verifyFormat("class Foo {\n" 8498 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8499 " {\n" 8500 " return 0;\n" 8501 " }\n" 8502 "};\n", 8503 Style); 8504 8505 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8506 verifyFormat("int f() {}", Style); 8507 verifyFormat("int f() { return 0; }", Style); 8508 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8509 "{}", 8510 Style); 8511 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n" 8512 "{\n" 8513 " return 0;\n" 8514 "}", 8515 Style); 8516 } 8517 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) { 8518 FormatStyle Style = getLLVMStyle(); 8519 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 8520 verifyFormat("#ifdef A\n" 8521 "int f() {}\n" 8522 "#else\n" 8523 "int g() {}\n" 8524 "#endif", 8525 Style); 8526 } 8527 8528 TEST_F(FormatTest, SplitEmptyClass) { 8529 FormatStyle Style = getLLVMStyle(); 8530 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8531 Style.BraceWrapping.AfterClass = true; 8532 Style.BraceWrapping.SplitEmptyRecord = false; 8533 8534 verifyFormat("class Foo\n" 8535 "{};", 8536 Style); 8537 verifyFormat("/* something */ class Foo\n" 8538 "{};", 8539 Style); 8540 verifyFormat("template <typename X> class Foo\n" 8541 "{};", 8542 Style); 8543 verifyFormat("class Foo\n" 8544 "{\n" 8545 " Foo();\n" 8546 "};", 8547 Style); 8548 verifyFormat("typedef class Foo\n" 8549 "{\n" 8550 "} Foo_t;", 8551 Style); 8552 } 8553 8554 TEST_F(FormatTest, SplitEmptyStruct) { 8555 FormatStyle Style = getLLVMStyle(); 8556 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8557 Style.BraceWrapping.AfterStruct = true; 8558 Style.BraceWrapping.SplitEmptyRecord = false; 8559 8560 verifyFormat("struct Foo\n" 8561 "{};", 8562 Style); 8563 verifyFormat("/* something */ struct Foo\n" 8564 "{};", 8565 Style); 8566 verifyFormat("template <typename X> struct Foo\n" 8567 "{};", 8568 Style); 8569 verifyFormat("struct Foo\n" 8570 "{\n" 8571 " Foo();\n" 8572 "};", 8573 Style); 8574 verifyFormat("typedef struct Foo\n" 8575 "{\n" 8576 "} Foo_t;", 8577 Style); 8578 // typedef struct Bar {} Bar_t; 8579 } 8580 8581 TEST_F(FormatTest, SplitEmptyUnion) { 8582 FormatStyle Style = getLLVMStyle(); 8583 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8584 Style.BraceWrapping.AfterUnion = true; 8585 Style.BraceWrapping.SplitEmptyRecord = false; 8586 8587 verifyFormat("union Foo\n" 8588 "{};", 8589 Style); 8590 verifyFormat("/* something */ union Foo\n" 8591 "{};", 8592 Style); 8593 verifyFormat("union Foo\n" 8594 "{\n" 8595 " A,\n" 8596 "};", 8597 Style); 8598 verifyFormat("typedef union Foo\n" 8599 "{\n" 8600 "} Foo_t;", 8601 Style); 8602 } 8603 8604 TEST_F(FormatTest, SplitEmptyNamespace) { 8605 FormatStyle Style = getLLVMStyle(); 8606 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8607 Style.BraceWrapping.AfterNamespace = true; 8608 Style.BraceWrapping.SplitEmptyNamespace = false; 8609 8610 verifyFormat("namespace Foo\n" 8611 "{};", 8612 Style); 8613 verifyFormat("/* something */ namespace Foo\n" 8614 "{};", 8615 Style); 8616 verifyFormat("inline namespace Foo\n" 8617 "{};", 8618 Style); 8619 verifyFormat("/* something */ inline namespace Foo\n" 8620 "{};", 8621 Style); 8622 verifyFormat("export namespace Foo\n" 8623 "{};", 8624 Style); 8625 verifyFormat("namespace Foo\n" 8626 "{\n" 8627 "void Bar();\n" 8628 "};", 8629 Style); 8630 } 8631 8632 TEST_F(FormatTest, NeverMergeShortRecords) { 8633 FormatStyle Style = getLLVMStyle(); 8634 8635 verifyFormat("class Foo {\n" 8636 " Foo();\n" 8637 "};", 8638 Style); 8639 verifyFormat("typedef class Foo {\n" 8640 " Foo();\n" 8641 "} Foo_t;", 8642 Style); 8643 verifyFormat("struct Foo {\n" 8644 " Foo();\n" 8645 "};", 8646 Style); 8647 verifyFormat("typedef struct Foo {\n" 8648 " Foo();\n" 8649 "} Foo_t;", 8650 Style); 8651 verifyFormat("union Foo {\n" 8652 " A,\n" 8653 "};", 8654 Style); 8655 verifyFormat("typedef union Foo {\n" 8656 " A,\n" 8657 "} Foo_t;", 8658 Style); 8659 verifyFormat("namespace Foo {\n" 8660 "void Bar();\n" 8661 "};", 8662 Style); 8663 8664 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 8665 Style.BraceWrapping.AfterClass = true; 8666 Style.BraceWrapping.AfterStruct = true; 8667 Style.BraceWrapping.AfterUnion = true; 8668 Style.BraceWrapping.AfterNamespace = true; 8669 verifyFormat("class Foo\n" 8670 "{\n" 8671 " Foo();\n" 8672 "};", 8673 Style); 8674 verifyFormat("typedef class Foo\n" 8675 "{\n" 8676 " Foo();\n" 8677 "} Foo_t;", 8678 Style); 8679 verifyFormat("struct Foo\n" 8680 "{\n" 8681 " Foo();\n" 8682 "};", 8683 Style); 8684 verifyFormat("typedef struct Foo\n" 8685 "{\n" 8686 " Foo();\n" 8687 "} Foo_t;", 8688 Style); 8689 verifyFormat("union Foo\n" 8690 "{\n" 8691 " A,\n" 8692 "};", 8693 Style); 8694 verifyFormat("typedef union Foo\n" 8695 "{\n" 8696 " A,\n" 8697 "} Foo_t;", 8698 Style); 8699 verifyFormat("namespace Foo\n" 8700 "{\n" 8701 "void Bar();\n" 8702 "};", 8703 Style); 8704 } 8705 8706 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { 8707 // Elaborate type variable declarations. 8708 verifyFormat("struct foo a = {bar};\nint n;"); 8709 verifyFormat("class foo a = {bar};\nint n;"); 8710 verifyFormat("union foo a = {bar};\nint n;"); 8711 8712 // Elaborate types inside function definitions. 8713 verifyFormat("struct foo f() {}\nint n;"); 8714 verifyFormat("class foo f() {}\nint n;"); 8715 verifyFormat("union foo f() {}\nint n;"); 8716 8717 // Templates. 8718 verifyFormat("template <class X> void f() {}\nint n;"); 8719 verifyFormat("template <struct X> void f() {}\nint n;"); 8720 verifyFormat("template <union X> void f() {}\nint n;"); 8721 8722 // Actual definitions... 8723 verifyFormat("struct {\n} n;"); 8724 verifyFormat( 8725 "template <template <class T, class Y>, class Z> class X {\n} n;"); 8726 verifyFormat("union Z {\n int n;\n} x;"); 8727 verifyFormat("class MACRO Z {\n} n;"); 8728 verifyFormat("class MACRO(X) Z {\n} n;"); 8729 verifyFormat("class __attribute__(X) Z {\n} n;"); 8730 verifyFormat("class __declspec(X) Z {\n} n;"); 8731 verifyFormat("class A##B##C {\n} n;"); 8732 verifyFormat("class alignas(16) Z {\n} n;"); 8733 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;"); 8734 verifyFormat("class MACROA MACRO(X) Z {\n} n;"); 8735 8736 // Redefinition from nested context: 8737 verifyFormat("class A::B::C {\n} n;"); 8738 8739 // Template definitions. 8740 verifyFormat( 8741 "template <typename F>\n" 8742 "Matcher(const Matcher<F> &Other,\n" 8743 " typename enable_if_c<is_base_of<F, T>::value &&\n" 8744 " !is_same<F, T>::value>::type * = 0)\n" 8745 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}"); 8746 8747 // FIXME: This is still incorrectly handled at the formatter side. 8748 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};"); 8749 verifyFormat("int i = SomeFunction(a<b, a> b);"); 8750 8751 // FIXME: 8752 // This now gets parsed incorrectly as class definition. 8753 // verifyFormat("class A<int> f() {\n}\nint n;"); 8754 8755 // Elaborate types where incorrectly parsing the structural element would 8756 // break the indent. 8757 verifyFormat("if (true)\n" 8758 " class X x;\n" 8759 "else\n" 8760 " f();\n"); 8761 8762 // This is simply incomplete. Formatting is not important, but must not crash. 8763 verifyFormat("class A:"); 8764 } 8765 8766 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) { 8767 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n", 8768 format("#error Leave all white!!!!! space* alone!\n")); 8769 EXPECT_EQ( 8770 "#warning Leave all white!!!!! space* alone!\n", 8771 format("#warning Leave all white!!!!! space* alone!\n")); 8772 EXPECT_EQ("#error 1", format(" # error 1")); 8773 EXPECT_EQ("#warning 1", format(" # warning 1")); 8774 } 8775 8776 TEST_F(FormatTest, FormatHashIfExpressions) { 8777 verifyFormat("#if AAAA && BBBB"); 8778 verifyFormat("#if (AAAA && BBBB)"); 8779 verifyFormat("#elif (AAAA && BBBB)"); 8780 // FIXME: Come up with a better indentation for #elif. 8781 verifyFormat( 8782 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n" 8783 " defined(BBBBBBBB)\n" 8784 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n" 8785 " defined(BBBBBBBB)\n" 8786 "#endif", 8787 getLLVMStyleWithColumns(65)); 8788 } 8789 8790 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) { 8791 FormatStyle AllowsMergedIf = getGoogleStyle(); 8792 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = 8793 FormatStyle::SIS_WithoutElse; 8794 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf); 8795 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf); 8796 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf); 8797 EXPECT_EQ("if (true) return 42;", 8798 format("if (true)\nreturn 42;", AllowsMergedIf)); 8799 FormatStyle ShortMergedIf = AllowsMergedIf; 8800 ShortMergedIf.ColumnLimit = 25; 8801 verifyFormat("#define A \\\n" 8802 " if (true) return 42;", 8803 ShortMergedIf); 8804 verifyFormat("#define A \\\n" 8805 " f(); \\\n" 8806 " if (true)\n" 8807 "#define B", 8808 ShortMergedIf); 8809 verifyFormat("#define A \\\n" 8810 " f(); \\\n" 8811 " if (true)\n" 8812 "g();", 8813 ShortMergedIf); 8814 verifyFormat("{\n" 8815 "#ifdef A\n" 8816 " // Comment\n" 8817 " if (true) continue;\n" 8818 "#endif\n" 8819 " // Comment\n" 8820 " if (true) continue;\n" 8821 "}", 8822 ShortMergedIf); 8823 ShortMergedIf.ColumnLimit = 33; 8824 verifyFormat("#define A \\\n" 8825 " if constexpr (true) return 42;", 8826 ShortMergedIf); 8827 verifyFormat("#define A \\\n" 8828 " if CONSTEXPR (true) return 42;", 8829 ShortMergedIf); 8830 ShortMergedIf.ColumnLimit = 29; 8831 verifyFormat("#define A \\\n" 8832 " if (aaaaaaaaaa) return 1; \\\n" 8833 " return 2;", 8834 ShortMergedIf); 8835 ShortMergedIf.ColumnLimit = 28; 8836 verifyFormat("#define A \\\n" 8837 " if (aaaaaaaaaa) \\\n" 8838 " return 1; \\\n" 8839 " return 2;", 8840 ShortMergedIf); 8841 verifyFormat("#define A \\\n" 8842 " if constexpr (aaaaaaa) \\\n" 8843 " return 1; \\\n" 8844 " return 2;", 8845 ShortMergedIf); 8846 verifyFormat("#define A \\\n" 8847 " if CONSTEXPR (aaaaaaa) \\\n" 8848 " return 1; \\\n" 8849 " return 2;", 8850 ShortMergedIf); 8851 } 8852 8853 TEST_F(FormatTest, FormatStarDependingOnContext) { 8854 verifyFormat("void f(int *a);"); 8855 verifyFormat("void f() { f(fint * b); }"); 8856 verifyFormat("class A {\n void f(int *a);\n};"); 8857 verifyFormat("class A {\n int *a;\n};"); 8858 verifyFormat("namespace a {\n" 8859 "namespace b {\n" 8860 "class A {\n" 8861 " void f() {}\n" 8862 " int *a;\n" 8863 "};\n" 8864 "} // namespace b\n" 8865 "} // namespace a"); 8866 } 8867 8868 TEST_F(FormatTest, SpecialTokensAtEndOfLine) { 8869 verifyFormat("while"); 8870 verifyFormat("operator"); 8871 } 8872 8873 TEST_F(FormatTest, SkipsDeeplyNestedLines) { 8874 // This code would be painfully slow to format if we didn't skip it. 8875 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 8876 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8877 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8878 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8879 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" 8880 "A(1, 1)\n" 8881 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x 8882 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8883 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8884 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8885 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8886 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8887 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8888 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8889 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" 8890 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n"); 8891 // Deeply nested part is untouched, rest is formatted. 8892 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n", 8893 format(std::string("int i;\n") + Code + "int j;\n", 8894 getLLVMStyle(), SC_ExpectIncomplete)); 8895 } 8896 8897 //===----------------------------------------------------------------------===// 8898 // Objective-C tests. 8899 //===----------------------------------------------------------------------===// 8900 8901 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { 8902 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;"); 8903 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;", 8904 format("-(NSUInteger)indexOfObject:(id)anObject;")); 8905 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;")); 8906 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;")); 8907 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;", 8908 format("-(NSInteger)Method3:(id)anObject;")); 8909 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;", 8910 format("-(NSInteger)Method4:(id)anObject;")); 8911 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;", 8912 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;")); 8913 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;", 8914 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;")); 8915 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject " 8916 "forAllCells:(BOOL)flag;", 8917 format("- (void)sendAction:(SEL)aSelector to:(id)anObject " 8918 "forAllCells:(BOOL)flag;")); 8919 8920 // Very long objectiveC method declaration. 8921 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n" 8922 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;"); 8923 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n" 8924 " inRange:(NSRange)range\n" 8925 " outRange:(NSRange)out_range\n" 8926 " outRange1:(NSRange)out_range1\n" 8927 " outRange2:(NSRange)out_range2\n" 8928 " outRange3:(NSRange)out_range3\n" 8929 " outRange4:(NSRange)out_range4\n" 8930 " outRange5:(NSRange)out_range5\n" 8931 " outRange6:(NSRange)out_range6\n" 8932 " outRange7:(NSRange)out_range7\n" 8933 " outRange8:(NSRange)out_range8\n" 8934 " outRange9:(NSRange)out_range9;"); 8935 8936 // When the function name has to be wrapped. 8937 FormatStyle Style = getLLVMStyle(); 8938 // ObjC ignores IndentWrappedFunctionNames when wrapping methods 8939 // and always indents instead. 8940 Style.IndentWrappedFunctionNames = false; 8941 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 8942 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n" 8943 " anotherName:(NSString)bbbbbbbbbbbbbb {\n" 8944 "}", 8945 Style); 8946 Style.IndentWrappedFunctionNames = true; 8947 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n" 8948 " veryLooooooooooongName:(NSString)cccccccccccccc\n" 8949 " anotherName:(NSString)dddddddddddddd {\n" 8950 "}", 8951 Style); 8952 8953 verifyFormat("- (int)sum:(vector<int>)numbers;"); 8954 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;"); 8955 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC 8956 // protocol lists (but not for template classes): 8957 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); 8958 8959 verifyFormat("- (int (*)())foo:(int (*)())f;"); 8960 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); 8961 8962 // If there's no return type (very rare in practice!), LLVM and Google style 8963 // agree. 8964 verifyFormat("- foo;"); 8965 verifyFormat("- foo:(int)f;"); 8966 verifyGoogleFormat("- foo:(int)foo;"); 8967 } 8968 8969 TEST_F(FormatTest, BreaksStringLiterals) { 8970 EXPECT_EQ("\"some text \"\n" 8971 "\"other\";", 8972 format("\"some text other\";", getLLVMStyleWithColumns(12))); 8973 EXPECT_EQ("\"some text \"\n" 8974 "\"other\";", 8975 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12))); 8976 EXPECT_EQ( 8977 "#define A \\\n" 8978 " \"some \" \\\n" 8979 " \"text \" \\\n" 8980 " \"other\";", 8981 format("#define A \"some text other\";", getLLVMStyleWithColumns(12))); 8982 EXPECT_EQ( 8983 "#define A \\\n" 8984 " \"so \" \\\n" 8985 " \"text \" \\\n" 8986 " \"other\";", 8987 format("#define A \"so text other\";", getLLVMStyleWithColumns(12))); 8988 8989 EXPECT_EQ("\"some text\"", 8990 format("\"some text\"", getLLVMStyleWithColumns(1))); 8991 EXPECT_EQ("\"some text\"", 8992 format("\"some text\"", getLLVMStyleWithColumns(11))); 8993 EXPECT_EQ("\"some \"\n" 8994 "\"text\"", 8995 format("\"some text\"", getLLVMStyleWithColumns(10))); 8996 EXPECT_EQ("\"some \"\n" 8997 "\"text\"", 8998 format("\"some text\"", getLLVMStyleWithColumns(7))); 8999 EXPECT_EQ("\"some\"\n" 9000 "\" tex\"\n" 9001 "\"t\"", 9002 format("\"some text\"", getLLVMStyleWithColumns(6))); 9003 EXPECT_EQ("\"some\"\n" 9004 "\" tex\"\n" 9005 "\" and\"", 9006 format("\"some tex and\"", getLLVMStyleWithColumns(6))); 9007 EXPECT_EQ("\"some\"\n" 9008 "\"/tex\"\n" 9009 "\"/and\"", 9010 format("\"some/tex/and\"", getLLVMStyleWithColumns(6))); 9011 9012 EXPECT_EQ("variable =\n" 9013 " \"long string \"\n" 9014 " \"literal\";", 9015 format("variable = \"long string literal\";", 9016 getLLVMStyleWithColumns(20))); 9017 9018 EXPECT_EQ("variable = f(\n" 9019 " \"long string \"\n" 9020 " \"literal\",\n" 9021 " short,\n" 9022 " loooooooooooooooooooong);", 9023 format("variable = f(\"long string literal\", short, " 9024 "loooooooooooooooooooong);", 9025 getLLVMStyleWithColumns(20))); 9026 9027 EXPECT_EQ( 9028 "f(g(\"long string \"\n" 9029 " \"literal\"),\n" 9030 " b);", 9031 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20))); 9032 EXPECT_EQ("f(g(\"long string \"\n" 9033 " \"literal\",\n" 9034 " a),\n" 9035 " b);", 9036 format("f(g(\"long string literal\", a), b);", 9037 getLLVMStyleWithColumns(20))); 9038 EXPECT_EQ( 9039 "f(\"one two\".split(\n" 9040 " variable));", 9041 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20))); 9042 EXPECT_EQ("f(\"one two three four five six \"\n" 9043 " \"seven\".split(\n" 9044 " really_looooong_variable));", 9045 format("f(\"one two three four five six seven\"." 9046 "split(really_looooong_variable));", 9047 getLLVMStyleWithColumns(33))); 9048 9049 EXPECT_EQ("f(\"some \"\n" 9050 " \"text\",\n" 9051 " other);", 9052 format("f(\"some text\", other);", getLLVMStyleWithColumns(10))); 9053 9054 // Only break as a last resort. 9055 verifyFormat( 9056 "aaaaaaaaaaaaaaaaaaaa(\n" 9057 " aaaaaaaaaaaaaaaaaaaa,\n" 9058 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));"); 9059 9060 EXPECT_EQ("\"splitmea\"\n" 9061 "\"trandomp\"\n" 9062 "\"oint\"", 9063 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10))); 9064 9065 EXPECT_EQ("\"split/\"\n" 9066 "\"pathat/\"\n" 9067 "\"slashes\"", 9068 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9069 9070 EXPECT_EQ("\"split/\"\n" 9071 "\"pathat/\"\n" 9072 "\"slashes\"", 9073 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10))); 9074 EXPECT_EQ("\"split at \"\n" 9075 "\"spaces/at/\"\n" 9076 "\"slashes.at.any$\"\n" 9077 "\"non-alphanumeric%\"\n" 9078 "\"1111111111characte\"\n" 9079 "\"rs\"", 9080 format("\"split at " 9081 "spaces/at/" 9082 "slashes.at." 9083 "any$non-" 9084 "alphanumeric%" 9085 "1111111111characte" 9086 "rs\"", 9087 getLLVMStyleWithColumns(20))); 9088 9089 // Verify that splitting the strings understands 9090 // Style::AlwaysBreakBeforeMultilineStrings. 9091 EXPECT_EQ("aaaaaaaaaaaa(\n" 9092 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n" 9093 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");", 9094 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa " 9095 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9096 "aaaaaaaaaaaaaaaaaaaaaa\");", 9097 getGoogleStyle())); 9098 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9099 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";", 9100 format("return \"aaaaaaaaaaaaaaaaaaaaaa " 9101 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa " 9102 "aaaaaaaaaaaaaaaaaaaaaa\";", 9103 getGoogleStyle())); 9104 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9105 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9106 format("llvm::outs() << " 9107 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa" 9108 "aaaaaaaaaaaaaaaaaaa\";")); 9109 EXPECT_EQ("ffff(\n" 9110 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" 9111 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9112 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 9113 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});", 9114 getGoogleStyle())); 9115 9116 FormatStyle Style = getLLVMStyleWithColumns(12); 9117 Style.BreakStringLiterals = false; 9118 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style)); 9119 9120 FormatStyle AlignLeft = getLLVMStyleWithColumns(12); 9121 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9122 EXPECT_EQ("#define A \\\n" 9123 " \"some \" \\\n" 9124 " \"text \" \\\n" 9125 " \"other\";", 9126 format("#define A \"some text other\";", AlignLeft)); 9127 } 9128 9129 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) { 9130 EXPECT_EQ("C a = \"some more \"\n" 9131 " \"text\";", 9132 format("C a = \"some more text\";", getLLVMStyleWithColumns(18))); 9133 } 9134 9135 TEST_F(FormatTest, FullyRemoveEmptyLines) { 9136 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80); 9137 NoEmptyLines.MaxEmptyLinesToKeep = 0; 9138 EXPECT_EQ("int i = a(b());", 9139 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines)); 9140 } 9141 9142 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) { 9143 EXPECT_EQ( 9144 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9145 "(\n" 9146 " \"x\t\");", 9147 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 9148 "aaaaaaa(" 9149 "\"x\t\");")); 9150 } 9151 9152 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { 9153 EXPECT_EQ( 9154 "u8\"utf8 string \"\n" 9155 "u8\"literal\";", 9156 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16))); 9157 EXPECT_EQ( 9158 "u\"utf16 string \"\n" 9159 "u\"literal\";", 9160 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16))); 9161 EXPECT_EQ( 9162 "U\"utf32 string \"\n" 9163 "U\"literal\";", 9164 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16))); 9165 EXPECT_EQ("L\"wide string \"\n" 9166 "L\"literal\";", 9167 format("L\"wide string literal\";", getGoogleStyleWithColumns(16))); 9168 EXPECT_EQ("@\"NSString \"\n" 9169 "@\"literal\";", 9170 format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); 9171 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26)); 9172 9173 // This input makes clang-format try to split the incomplete unicode escape 9174 // sequence, which used to lead to a crasher. 9175 verifyNoCrash( 9176 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9177 getLLVMStyleWithColumns(60)); 9178 } 9179 9180 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { 9181 FormatStyle Style = getGoogleStyleWithColumns(15); 9182 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); 9183 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); 9184 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); 9185 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); 9186 EXPECT_EQ("u8R\"x(raw literal)x\";", 9187 format("u8R\"x(raw literal)x\";", Style)); 9188 } 9189 9190 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { 9191 FormatStyle Style = getLLVMStyleWithColumns(20); 9192 EXPECT_EQ( 9193 "_T(\"aaaaaaaaaaaaaa\")\n" 9194 "_T(\"aaaaaaaaaaaaaa\")\n" 9195 "_T(\"aaaaaaaaaaaa\")", 9196 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style)); 9197 EXPECT_EQ("f(x,\n" 9198 " _T(\"aaaaaaaaaaaa\")\n" 9199 " _T(\"aaa\"),\n" 9200 " z);", 9201 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style)); 9202 9203 // FIXME: Handle embedded spaces in one iteration. 9204 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n" 9205 // "_T(\"aaaaaaaaaaaaa\")\n" 9206 // "_T(\"aaaaaaaaaaaaa\")\n" 9207 // "_T(\"a\")", 9208 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9209 // getLLVMStyleWithColumns(20))); 9210 EXPECT_EQ( 9211 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", 9212 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style)); 9213 EXPECT_EQ("f(\n" 9214 "#if !TEST\n" 9215 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9216 "#endif\n" 9217 ");", 9218 format("f(\n" 9219 "#if !TEST\n" 9220 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n" 9221 "#endif\n" 9222 ");")); 9223 EXPECT_EQ("f(\n" 9224 "\n" 9225 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));", 9226 format("f(\n" 9227 "\n" 9228 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));")); 9229 } 9230 9231 TEST_F(FormatTest, BreaksStringLiteralOperands) { 9232 // In a function call with two operands, the second can be broken with no line 9233 // break before it. 9234 EXPECT_EQ( 9235 "func(a, \"long long \"\n" 9236 " \"long long\");", 9237 format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24))); 9238 // In a function call with three operands, the second must be broken with a 9239 // line break before it. 9240 EXPECT_EQ("func(a,\n" 9241 " \"long long long \"\n" 9242 " \"long\",\n" 9243 " c);", 9244 format("func(a, \"long long long long\", c);", 9245 getLLVMStyleWithColumns(24))); 9246 // In a function call with three operands, the third must be broken with a 9247 // line break before it. 9248 EXPECT_EQ("func(a, b,\n" 9249 " \"long long long \"\n" 9250 " \"long\");", 9251 format("func(a, b, \"long long long long\");", 9252 getLLVMStyleWithColumns(24))); 9253 // In a function call with three operands, both the second and the third must 9254 // be broken with a line break before them. 9255 EXPECT_EQ("func(a,\n" 9256 " \"long long long \"\n" 9257 " \"long\",\n" 9258 " \"long long long \"\n" 9259 " \"long\");", 9260 format("func(a, \"long long long long\", \"long long long long\");", 9261 getLLVMStyleWithColumns(24))); 9262 // In a chain of << with two operands, the second can be broken with no line 9263 // break before it. 9264 EXPECT_EQ("a << \"line line \"\n" 9265 " \"line\";", 9266 format("a << \"line line line\";", getLLVMStyleWithColumns(20))); 9267 // In a chain of << with three operands, the second can be broken with no line 9268 // break before it. 9269 EXPECT_EQ( 9270 "abcde << \"line \"\n" 9271 " \"line line\"\n" 9272 " << c;", 9273 format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20))); 9274 // In a chain of << with three operands, the third must be broken with a line 9275 // break before it. 9276 EXPECT_EQ( 9277 "a << b\n" 9278 " << \"line line \"\n" 9279 " \"line\";", 9280 format("a << b << \"line line line\";", getLLVMStyleWithColumns(20))); 9281 // In a chain of << with three operands, the second can be broken with no line 9282 // break before it and the third must be broken with a line break before it. 9283 EXPECT_EQ("abcd << \"line line \"\n" 9284 " \"line\"\n" 9285 " << \"line line \"\n" 9286 " \"line\";", 9287 format("abcd << \"line line line\" << \"line line line\";", 9288 getLLVMStyleWithColumns(20))); 9289 // In a chain of binary operators with two operands, the second can be broken 9290 // with no line break before it. 9291 EXPECT_EQ( 9292 "abcd + \"line line \"\n" 9293 " \"line line\";", 9294 format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20))); 9295 // In a chain of binary operators with three operands, the second must be 9296 // broken with a line break before it. 9297 EXPECT_EQ("abcd +\n" 9298 " \"line line \"\n" 9299 " \"line line\" +\n" 9300 " e;", 9301 format("abcd + \"line line line line\" + e;", 9302 getLLVMStyleWithColumns(20))); 9303 // In a function call with two operands, with AlignAfterOpenBracket enabled, 9304 // the first must be broken with a line break before it. 9305 FormatStyle Style = getLLVMStyleWithColumns(25); 9306 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 9307 EXPECT_EQ("someFunction(\n" 9308 " \"long long long \"\n" 9309 " \"long\",\n" 9310 " a);", 9311 format("someFunction(\"long long long long\", a);", Style)); 9312 } 9313 9314 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) { 9315 EXPECT_EQ( 9316 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9317 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9318 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";", 9319 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9320 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" 9321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";")); 9322 } 9323 9324 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) { 9325 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);", 9326 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle())); 9327 EXPECT_EQ("fffffffffff(g(R\"x(\n" 9328 "multiline raw string literal xxxxxxxxxxxxxx\n" 9329 ")x\",\n" 9330 " a),\n" 9331 " b);", 9332 format("fffffffffff(g(R\"x(\n" 9333 "multiline raw string literal xxxxxxxxxxxxxx\n" 9334 ")x\", a), b);", 9335 getGoogleStyleWithColumns(20))); 9336 EXPECT_EQ("fffffffffff(\n" 9337 " g(R\"x(qqq\n" 9338 "multiline raw string literal xxxxxxxxxxxxxx\n" 9339 ")x\",\n" 9340 " a),\n" 9341 " b);", 9342 format("fffffffffff(g(R\"x(qqq\n" 9343 "multiline raw string literal xxxxxxxxxxxxxx\n" 9344 ")x\", a), b);", 9345 getGoogleStyleWithColumns(20))); 9346 9347 EXPECT_EQ("fffffffffff(R\"x(\n" 9348 "multiline raw string literal xxxxxxxxxxxxxx\n" 9349 ")x\");", 9350 format("fffffffffff(R\"x(\n" 9351 "multiline raw string literal xxxxxxxxxxxxxx\n" 9352 ")x\");", 9353 getGoogleStyleWithColumns(20))); 9354 EXPECT_EQ("fffffffffff(R\"x(\n" 9355 "multiline raw string literal xxxxxxxxxxxxxx\n" 9356 ")x\" + bbbbbb);", 9357 format("fffffffffff(R\"x(\n" 9358 "multiline raw string literal xxxxxxxxxxxxxx\n" 9359 ")x\" + bbbbbb);", 9360 getGoogleStyleWithColumns(20))); 9361 EXPECT_EQ("fffffffffff(\n" 9362 " R\"x(\n" 9363 "multiline raw string literal xxxxxxxxxxxxxx\n" 9364 ")x\" +\n" 9365 " bbbbbb);", 9366 format("fffffffffff(\n" 9367 " R\"x(\n" 9368 "multiline raw string literal xxxxxxxxxxxxxx\n" 9369 ")x\" + bbbbbb);", 9370 getGoogleStyleWithColumns(20))); 9371 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);", 9372 format("fffffffffff(\n" 9373 " R\"(single line raw string)\" + bbbbbb);")); 9374 } 9375 9376 TEST_F(FormatTest, SkipsUnknownStringLiterals) { 9377 verifyFormat("string a = \"unterminated;"); 9378 EXPECT_EQ("function(\"unterminated,\n" 9379 " OtherParameter);", 9380 format("function( \"unterminated,\n" 9381 " OtherParameter);")); 9382 } 9383 9384 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) { 9385 FormatStyle Style = getLLVMStyle(); 9386 Style.Standard = FormatStyle::LS_Cpp03; 9387 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);", 9388 format("#define x(_a) printf(\"foo\"_a);", Style)); 9389 } 9390 9391 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); } 9392 9393 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) { 9394 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n" 9395 " \"ddeeefff\");", 9396 format("someFunction(\"aaabbbcccdddeeefff\");", 9397 getLLVMStyleWithColumns(25))); 9398 EXPECT_EQ("someFunction1234567890(\n" 9399 " \"aaabbbcccdddeeefff\");", 9400 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9401 getLLVMStyleWithColumns(26))); 9402 EXPECT_EQ("someFunction1234567890(\n" 9403 " \"aaabbbcccdddeeeff\"\n" 9404 " \"f\");", 9405 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9406 getLLVMStyleWithColumns(25))); 9407 EXPECT_EQ("someFunction1234567890(\n" 9408 " \"aaabbbcccdddeeeff\"\n" 9409 " \"f\");", 9410 format("someFunction1234567890(\"aaabbbcccdddeeefff\");", 9411 getLLVMStyleWithColumns(24))); 9412 EXPECT_EQ("someFunction(\n" 9413 " \"aaabbbcc ddde \"\n" 9414 " \"efff\");", 9415 format("someFunction(\"aaabbbcc ddde efff\");", 9416 getLLVMStyleWithColumns(25))); 9417 EXPECT_EQ("someFunction(\"aaabbbccc \"\n" 9418 " \"ddeeefff\");", 9419 format("someFunction(\"aaabbbccc ddeeefff\");", 9420 getLLVMStyleWithColumns(25))); 9421 EXPECT_EQ("someFunction1234567890(\n" 9422 " \"aaabb \"\n" 9423 " \"cccdddeeefff\");", 9424 format("someFunction1234567890(\"aaabb cccdddeeefff\");", 9425 getLLVMStyleWithColumns(25))); 9426 EXPECT_EQ("#define A \\\n" 9427 " string s = \\\n" 9428 " \"123456789\" \\\n" 9429 " \"0\"; \\\n" 9430 " int i;", 9431 format("#define A string s = \"1234567890\"; int i;", 9432 getLLVMStyleWithColumns(20))); 9433 EXPECT_EQ("someFunction(\n" 9434 " \"aaabbbcc \"\n" 9435 " \"dddeeefff\");", 9436 format("someFunction(\"aaabbbcc dddeeefff\");", 9437 getLLVMStyleWithColumns(25))); 9438 } 9439 9440 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { 9441 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3))); 9442 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2))); 9443 EXPECT_EQ("\"test\"\n" 9444 "\"\\n\"", 9445 format("\"test\\n\"", getLLVMStyleWithColumns(7))); 9446 EXPECT_EQ("\"tes\\\\\"\n" 9447 "\"n\"", 9448 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7))); 9449 EXPECT_EQ("\"\\\\\\\\\"\n" 9450 "\"\\n\"", 9451 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7))); 9452 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7))); 9453 EXPECT_EQ("\"\\uff01\"\n" 9454 "\"test\"", 9455 format("\"\\uff01test\"", getLLVMStyleWithColumns(8))); 9456 EXPECT_EQ("\"\\Uff01ff02\"", 9457 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11))); 9458 EXPECT_EQ("\"\\x000000000001\"\n" 9459 "\"next\"", 9460 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16))); 9461 EXPECT_EQ("\"\\x000000000001next\"", 9462 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15))); 9463 EXPECT_EQ("\"\\x000000000001\"", 9464 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7))); 9465 EXPECT_EQ("\"test\"\n" 9466 "\"\\000000\"\n" 9467 "\"000001\"", 9468 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9))); 9469 EXPECT_EQ("\"test\\000\"\n" 9470 "\"00000000\"\n" 9471 "\"1\"", 9472 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); 9473 } 9474 9475 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { 9476 verifyFormat("void f() {\n" 9477 " return g() {}\n" 9478 " void h() {}"); 9479 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n" 9480 "g();\n" 9481 "}"); 9482 } 9483 9484 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) { 9485 verifyFormat( 9486 "void f() { return C{param1, param2}.SomeCall(param1, param2); }"); 9487 } 9488 9489 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) { 9490 verifyFormat("class X {\n" 9491 " void f() {\n" 9492 " }\n" 9493 "};", 9494 getLLVMStyleWithColumns(12)); 9495 } 9496 9497 TEST_F(FormatTest, ConfigurableIndentWidth) { 9498 FormatStyle EightIndent = getLLVMStyleWithColumns(18); 9499 EightIndent.IndentWidth = 8; 9500 EightIndent.ContinuationIndentWidth = 8; 9501 verifyFormat("void f() {\n" 9502 " someFunction();\n" 9503 " if (true) {\n" 9504 " f();\n" 9505 " }\n" 9506 "}", 9507 EightIndent); 9508 verifyFormat("class X {\n" 9509 " void f() {\n" 9510 " }\n" 9511 "};", 9512 EightIndent); 9513 verifyFormat("int x[] = {\n" 9514 " call(),\n" 9515 " call()};", 9516 EightIndent); 9517 } 9518 9519 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { 9520 verifyFormat("double\n" 9521 "f();", 9522 getLLVMStyleWithColumns(8)); 9523 } 9524 9525 TEST_F(FormatTest, ConfigurableUseOfTab) { 9526 FormatStyle Tab = getLLVMStyleWithColumns(42); 9527 Tab.IndentWidth = 8; 9528 Tab.UseTab = FormatStyle::UT_Always; 9529 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left; 9530 9531 EXPECT_EQ("if (aaaaaaaa && // q\n" 9532 " bb)\t\t// w\n" 9533 "\t;", 9534 format("if (aaaaaaaa &&// q\n" 9535 "bb)// w\n" 9536 ";", 9537 Tab)); 9538 EXPECT_EQ("if (aaa && bbb) // w\n" 9539 "\t;", 9540 format("if(aaa&&bbb)// w\n" 9541 ";", 9542 Tab)); 9543 9544 verifyFormat("class X {\n" 9545 "\tvoid f() {\n" 9546 "\t\tsomeFunction(parameter1,\n" 9547 "\t\t\t parameter2);\n" 9548 "\t}\n" 9549 "};", 9550 Tab); 9551 verifyFormat("#define A \\\n" 9552 "\tvoid f() { \\\n" 9553 "\t\tsomeFunction( \\\n" 9554 "\t\t parameter1, \\\n" 9555 "\t\t parameter2); \\\n" 9556 "\t}", 9557 Tab); 9558 verifyFormat("int a;\t // x\n" 9559 "int bbbbbbbb; // x\n", 9560 Tab); 9561 9562 Tab.TabWidth = 4; 9563 Tab.IndentWidth = 8; 9564 verifyFormat("class TabWidth4Indent8 {\n" 9565 "\t\tvoid f() {\n" 9566 "\t\t\t\tsomeFunction(parameter1,\n" 9567 "\t\t\t\t\t\t\t parameter2);\n" 9568 "\t\t}\n" 9569 "};", 9570 Tab); 9571 9572 Tab.TabWidth = 4; 9573 Tab.IndentWidth = 4; 9574 verifyFormat("class TabWidth4Indent4 {\n" 9575 "\tvoid f() {\n" 9576 "\t\tsomeFunction(parameter1,\n" 9577 "\t\t\t\t\t parameter2);\n" 9578 "\t}\n" 9579 "};", 9580 Tab); 9581 9582 Tab.TabWidth = 8; 9583 Tab.IndentWidth = 4; 9584 verifyFormat("class TabWidth8Indent4 {\n" 9585 " void f() {\n" 9586 "\tsomeFunction(parameter1,\n" 9587 "\t\t parameter2);\n" 9588 " }\n" 9589 "};", 9590 Tab); 9591 9592 Tab.TabWidth = 8; 9593 Tab.IndentWidth = 8; 9594 EXPECT_EQ("/*\n" 9595 "\t a\t\tcomment\n" 9596 "\t in multiple lines\n" 9597 " */", 9598 format(" /*\t \t \n" 9599 " \t \t a\t\tcomment\t \t\n" 9600 " \t \t in multiple lines\t\n" 9601 " \t */", 9602 Tab)); 9603 9604 Tab.UseTab = FormatStyle::UT_ForIndentation; 9605 verifyFormat("{\n" 9606 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9607 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9608 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9609 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9610 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9611 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9612 "};", 9613 Tab); 9614 verifyFormat("enum AA {\n" 9615 "\ta1, // Force multiple lines\n" 9616 "\ta2,\n" 9617 "\ta3\n" 9618 "};", 9619 Tab); 9620 EXPECT_EQ("if (aaaaaaaa && // q\n" 9621 " bb) // w\n" 9622 "\t;", 9623 format("if (aaaaaaaa &&// q\n" 9624 "bb)// w\n" 9625 ";", 9626 Tab)); 9627 verifyFormat("class X {\n" 9628 "\tvoid f() {\n" 9629 "\t\tsomeFunction(parameter1,\n" 9630 "\t\t parameter2);\n" 9631 "\t}\n" 9632 "};", 9633 Tab); 9634 verifyFormat("{\n" 9635 "\tQ(\n" 9636 "\t {\n" 9637 "\t\t int a;\n" 9638 "\t\t someFunction(aaaaaaaa,\n" 9639 "\t\t bbbbbbb);\n" 9640 "\t },\n" 9641 "\t p);\n" 9642 "}", 9643 Tab); 9644 EXPECT_EQ("{\n" 9645 "\t/* aaaa\n" 9646 "\t bbbb */\n" 9647 "}", 9648 format("{\n" 9649 "/* aaaa\n" 9650 " bbbb */\n" 9651 "}", 9652 Tab)); 9653 EXPECT_EQ("{\n" 9654 "\t/*\n" 9655 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9656 "\t bbbbbbbbbbbbb\n" 9657 "\t*/\n" 9658 "}", 9659 format("{\n" 9660 "/*\n" 9661 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9662 "*/\n" 9663 "}", 9664 Tab)); 9665 EXPECT_EQ("{\n" 9666 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9667 "\t// bbbbbbbbbbbbb\n" 9668 "}", 9669 format("{\n" 9670 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9671 "}", 9672 Tab)); 9673 EXPECT_EQ("{\n" 9674 "\t/*\n" 9675 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9676 "\t bbbbbbbbbbbbb\n" 9677 "\t*/\n" 9678 "}", 9679 format("{\n" 9680 "\t/*\n" 9681 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9682 "\t*/\n" 9683 "}", 9684 Tab)); 9685 EXPECT_EQ("{\n" 9686 "\t/*\n" 9687 "\n" 9688 "\t*/\n" 9689 "}", 9690 format("{\n" 9691 "\t/*\n" 9692 "\n" 9693 "\t*/\n" 9694 "}", 9695 Tab)); 9696 EXPECT_EQ("{\n" 9697 "\t/*\n" 9698 " asdf\n" 9699 "\t*/\n" 9700 "}", 9701 format("{\n" 9702 "\t/*\n" 9703 " asdf\n" 9704 "\t*/\n" 9705 "}", 9706 Tab)); 9707 9708 Tab.UseTab = FormatStyle::UT_Never; 9709 EXPECT_EQ("/*\n" 9710 " a\t\tcomment\n" 9711 " in multiple lines\n" 9712 " */", 9713 format(" /*\t \t \n" 9714 " \t \t a\t\tcomment\t \t\n" 9715 " \t \t in multiple lines\t\n" 9716 " \t */", 9717 Tab)); 9718 EXPECT_EQ("/* some\n" 9719 " comment */", 9720 format(" \t \t /* some\n" 9721 " \t \t comment */", 9722 Tab)); 9723 EXPECT_EQ("int a; /* some\n" 9724 " comment */", 9725 format(" \t \t int a; /* some\n" 9726 " \t \t comment */", 9727 Tab)); 9728 9729 EXPECT_EQ("int a; /* some\n" 9730 "comment */", 9731 format(" \t \t int\ta; /* some\n" 9732 " \t \t comment */", 9733 Tab)); 9734 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9735 " comment */", 9736 format(" \t \t f(\"\t\t\"); /* some\n" 9737 " \t \t comment */", 9738 Tab)); 9739 EXPECT_EQ("{\n" 9740 " /*\n" 9741 " * Comment\n" 9742 " */\n" 9743 " int i;\n" 9744 "}", 9745 format("{\n" 9746 "\t/*\n" 9747 "\t * Comment\n" 9748 "\t */\n" 9749 "\t int i;\n" 9750 "}")); 9751 9752 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 9753 Tab.TabWidth = 8; 9754 Tab.IndentWidth = 8; 9755 EXPECT_EQ("if (aaaaaaaa && // q\n" 9756 " bb) // w\n" 9757 "\t;", 9758 format("if (aaaaaaaa &&// q\n" 9759 "bb)// w\n" 9760 ";", 9761 Tab)); 9762 EXPECT_EQ("if (aaa && bbb) // w\n" 9763 "\t;", 9764 format("if(aaa&&bbb)// w\n" 9765 ";", 9766 Tab)); 9767 verifyFormat("class X {\n" 9768 "\tvoid f() {\n" 9769 "\t\tsomeFunction(parameter1,\n" 9770 "\t\t\t parameter2);\n" 9771 "\t}\n" 9772 "};", 9773 Tab); 9774 verifyFormat("#define A \\\n" 9775 "\tvoid f() { \\\n" 9776 "\t\tsomeFunction( \\\n" 9777 "\t\t parameter1, \\\n" 9778 "\t\t parameter2); \\\n" 9779 "\t}", 9780 Tab); 9781 Tab.TabWidth = 4; 9782 Tab.IndentWidth = 8; 9783 verifyFormat("class TabWidth4Indent8 {\n" 9784 "\t\tvoid f() {\n" 9785 "\t\t\t\tsomeFunction(parameter1,\n" 9786 "\t\t\t\t\t\t\t parameter2);\n" 9787 "\t\t}\n" 9788 "};", 9789 Tab); 9790 Tab.TabWidth = 4; 9791 Tab.IndentWidth = 4; 9792 verifyFormat("class TabWidth4Indent4 {\n" 9793 "\tvoid f() {\n" 9794 "\t\tsomeFunction(parameter1,\n" 9795 "\t\t\t\t\t parameter2);\n" 9796 "\t}\n" 9797 "};", 9798 Tab); 9799 Tab.TabWidth = 8; 9800 Tab.IndentWidth = 4; 9801 verifyFormat("class TabWidth8Indent4 {\n" 9802 " void f() {\n" 9803 "\tsomeFunction(parameter1,\n" 9804 "\t\t parameter2);\n" 9805 " }\n" 9806 "};", 9807 Tab); 9808 Tab.TabWidth = 8; 9809 Tab.IndentWidth = 8; 9810 EXPECT_EQ("/*\n" 9811 "\t a\t\tcomment\n" 9812 "\t in multiple lines\n" 9813 " */", 9814 format(" /*\t \t \n" 9815 " \t \t a\t\tcomment\t \t\n" 9816 " \t \t in multiple lines\t\n" 9817 " \t */", 9818 Tab)); 9819 verifyFormat("{\n" 9820 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9821 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9822 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9823 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9824 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9825 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n" 9826 "};", 9827 Tab); 9828 verifyFormat("enum AA {\n" 9829 "\ta1, // Force multiple lines\n" 9830 "\ta2,\n" 9831 "\ta3\n" 9832 "};", 9833 Tab); 9834 EXPECT_EQ("if (aaaaaaaa && // q\n" 9835 " bb) // w\n" 9836 "\t;", 9837 format("if (aaaaaaaa &&// q\n" 9838 "bb)// w\n" 9839 ";", 9840 Tab)); 9841 verifyFormat("class X {\n" 9842 "\tvoid f() {\n" 9843 "\t\tsomeFunction(parameter1,\n" 9844 "\t\t\t parameter2);\n" 9845 "\t}\n" 9846 "};", 9847 Tab); 9848 verifyFormat("{\n" 9849 "\tQ(\n" 9850 "\t {\n" 9851 "\t\t int a;\n" 9852 "\t\t someFunction(aaaaaaaa,\n" 9853 "\t\t\t\t bbbbbbb);\n" 9854 "\t },\n" 9855 "\t p);\n" 9856 "}", 9857 Tab); 9858 EXPECT_EQ("{\n" 9859 "\t/* aaaa\n" 9860 "\t bbbb */\n" 9861 "}", 9862 format("{\n" 9863 "/* aaaa\n" 9864 " bbbb */\n" 9865 "}", 9866 Tab)); 9867 EXPECT_EQ("{\n" 9868 "\t/*\n" 9869 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9870 "\t bbbbbbbbbbbbb\n" 9871 "\t*/\n" 9872 "}", 9873 format("{\n" 9874 "/*\n" 9875 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9876 "*/\n" 9877 "}", 9878 Tab)); 9879 EXPECT_EQ("{\n" 9880 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9881 "\t// bbbbbbbbbbbbb\n" 9882 "}", 9883 format("{\n" 9884 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9885 "}", 9886 Tab)); 9887 EXPECT_EQ("{\n" 9888 "\t/*\n" 9889 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n" 9890 "\t bbbbbbbbbbbbb\n" 9891 "\t*/\n" 9892 "}", 9893 format("{\n" 9894 "\t/*\n" 9895 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n" 9896 "\t*/\n" 9897 "}", 9898 Tab)); 9899 EXPECT_EQ("{\n" 9900 "\t/*\n" 9901 "\n" 9902 "\t*/\n" 9903 "}", 9904 format("{\n" 9905 "\t/*\n" 9906 "\n" 9907 "\t*/\n" 9908 "}", 9909 Tab)); 9910 EXPECT_EQ("{\n" 9911 "\t/*\n" 9912 " asdf\n" 9913 "\t*/\n" 9914 "}", 9915 format("{\n" 9916 "\t/*\n" 9917 " asdf\n" 9918 "\t*/\n" 9919 "}", 9920 Tab)); 9921 EXPECT_EQ("/*\n" 9922 "\t a\t\tcomment\n" 9923 "\t in multiple lines\n" 9924 " */", 9925 format(" /*\t \t \n" 9926 " \t \t a\t\tcomment\t \t\n" 9927 " \t \t in multiple lines\t\n" 9928 " \t */", 9929 Tab)); 9930 EXPECT_EQ("/* some\n" 9931 " comment */", 9932 format(" \t \t /* some\n" 9933 " \t \t comment */", 9934 Tab)); 9935 EXPECT_EQ("int a; /* some\n" 9936 " comment */", 9937 format(" \t \t int a; /* some\n" 9938 " \t \t comment */", 9939 Tab)); 9940 EXPECT_EQ("int a; /* some\n" 9941 "comment */", 9942 format(" \t \t int\ta; /* some\n" 9943 " \t \t comment */", 9944 Tab)); 9945 EXPECT_EQ("f(\"\t\t\"); /* some\n" 9946 " comment */", 9947 format(" \t \t f(\"\t\t\"); /* some\n" 9948 " \t \t comment */", 9949 Tab)); 9950 EXPECT_EQ("{\n" 9951 " /*\n" 9952 " * Comment\n" 9953 " */\n" 9954 " int i;\n" 9955 "}", 9956 format("{\n" 9957 "\t/*\n" 9958 "\t * Comment\n" 9959 "\t */\n" 9960 "\t int i;\n" 9961 "}")); 9962 Tab.AlignConsecutiveAssignments = true; 9963 Tab.AlignConsecutiveDeclarations = true; 9964 Tab.TabWidth = 4; 9965 Tab.IndentWidth = 4; 9966 verifyFormat("class Assign {\n" 9967 "\tvoid f() {\n" 9968 "\t\tint x = 123;\n" 9969 "\t\tint random = 4;\n" 9970 "\t\tstd::string alphabet =\n" 9971 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n" 9972 "\t}\n" 9973 "};", 9974 Tab); 9975 } 9976 9977 TEST_F(FormatTest, ZeroTabWidth) { 9978 FormatStyle Tab = getLLVMStyleWithColumns(42); 9979 Tab.IndentWidth = 8; 9980 Tab.UseTab = FormatStyle::UT_Never; 9981 Tab.TabWidth = 0; 9982 EXPECT_EQ("void a(){\n" 9983 " // line starts with '\t'\n" 9984 "};", 9985 format("void a(){\n" 9986 "\t// line starts with '\t'\n" 9987 "};", 9988 Tab)); 9989 9990 EXPECT_EQ("void a(){\n" 9991 " // line starts with '\t'\n" 9992 "};", 9993 format("void a(){\n" 9994 "\t\t// line starts with '\t'\n" 9995 "};", 9996 Tab)); 9997 9998 Tab.UseTab = FormatStyle::UT_ForIndentation; 9999 EXPECT_EQ("void a(){\n" 10000 " // line starts with '\t'\n" 10001 "};", 10002 format("void a(){\n" 10003 "\t// line starts with '\t'\n" 10004 "};", 10005 Tab)); 10006 10007 EXPECT_EQ("void a(){\n" 10008 " // line starts with '\t'\n" 10009 "};", 10010 format("void a(){\n" 10011 "\t\t// line starts with '\t'\n" 10012 "};", 10013 Tab)); 10014 10015 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation; 10016 EXPECT_EQ("void a(){\n" 10017 " // line starts with '\t'\n" 10018 "};", 10019 format("void a(){\n" 10020 "\t// line starts with '\t'\n" 10021 "};", 10022 Tab)); 10023 10024 EXPECT_EQ("void a(){\n" 10025 " // line starts with '\t'\n" 10026 "};", 10027 format("void a(){\n" 10028 "\t\t// line starts with '\t'\n" 10029 "};", 10030 Tab)); 10031 10032 Tab.UseTab = FormatStyle::UT_Always; 10033 EXPECT_EQ("void a(){\n" 10034 "// line starts with '\t'\n" 10035 "};", 10036 format("void a(){\n" 10037 "\t// line starts with '\t'\n" 10038 "};", 10039 Tab)); 10040 10041 EXPECT_EQ("void a(){\n" 10042 "// line starts with '\t'\n" 10043 "};", 10044 format("void a(){\n" 10045 "\t\t// line starts with '\t'\n" 10046 "};", 10047 Tab)); 10048 } 10049 10050 TEST_F(FormatTest, CalculatesOriginalColumn) { 10051 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10052 "q\"; /* some\n" 10053 " comment */", 10054 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10055 "q\"; /* some\n" 10056 " comment */", 10057 getLLVMStyle())); 10058 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10059 "/* some\n" 10060 " comment */", 10061 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n" 10062 " /* some\n" 10063 " comment */", 10064 getLLVMStyle())); 10065 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10066 "qqq\n" 10067 "/* some\n" 10068 " comment */", 10069 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10070 "qqq\n" 10071 " /* some\n" 10072 " comment */", 10073 getLLVMStyle())); 10074 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10075 "wwww; /* some\n" 10076 " comment */", 10077 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n" 10078 "wwww; /* some\n" 10079 " comment */", 10080 getLLVMStyle())); 10081 } 10082 10083 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { 10084 FormatStyle NoSpace = getLLVMStyle(); 10085 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never; 10086 10087 verifyFormat("while(true)\n" 10088 " continue;", 10089 NoSpace); 10090 verifyFormat("for(;;)\n" 10091 " continue;", 10092 NoSpace); 10093 verifyFormat("if(true)\n" 10094 " f();\n" 10095 "else if(true)\n" 10096 " f();", 10097 NoSpace); 10098 verifyFormat("do {\n" 10099 " do_something();\n" 10100 "} while(something());", 10101 NoSpace); 10102 verifyFormat("switch(x) {\n" 10103 "default:\n" 10104 " break;\n" 10105 "}", 10106 NoSpace); 10107 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); 10108 verifyFormat("size_t x = sizeof(x);", NoSpace); 10109 verifyFormat("auto f(int x) -> decltype(x);", NoSpace); 10110 verifyFormat("int f(T x) noexcept(x.create());", NoSpace); 10111 verifyFormat("alignas(128) char a[128];", NoSpace); 10112 verifyFormat("size_t x = alignof(MyType);", NoSpace); 10113 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); 10114 verifyFormat("int f() throw(Deprecated);", NoSpace); 10115 verifyFormat("typedef void (*cb)(int);", NoSpace); 10116 verifyFormat("T A::operator()();", NoSpace); 10117 verifyFormat("X A::operator++(T);", NoSpace); 10118 verifyFormat("auto lambda = []() { return 0; };", NoSpace); 10119 10120 FormatStyle Space = getLLVMStyle(); 10121 Space.SpaceBeforeParens = FormatStyle::SBPO_Always; 10122 10123 verifyFormat("int f ();", Space); 10124 verifyFormat("void f (int a, T b) {\n" 10125 " while (true)\n" 10126 " continue;\n" 10127 "}", 10128 Space); 10129 verifyFormat("if (true)\n" 10130 " f ();\n" 10131 "else if (true)\n" 10132 " f ();", 10133 Space); 10134 verifyFormat("do {\n" 10135 " do_something ();\n" 10136 "} while (something ());", 10137 Space); 10138 verifyFormat("switch (x) {\n" 10139 "default:\n" 10140 " break;\n" 10141 "}", 10142 Space); 10143 verifyFormat("A::A () : a (1) {}", Space); 10144 verifyFormat("void f () __attribute__ ((asdf));", Space); 10145 verifyFormat("*(&a + 1);\n" 10146 "&((&a)[1]);\n" 10147 "a[(b + c) * d];\n" 10148 "(((a + 1) * 2) + 3) * 4;", 10149 Space); 10150 verifyFormat("#define A(x) x", Space); 10151 verifyFormat("#define A (x) x", Space); 10152 verifyFormat("#if defined(x)\n" 10153 "#endif", 10154 Space); 10155 verifyFormat("auto i = std::make_unique<int> (5);", Space); 10156 verifyFormat("size_t x = sizeof (x);", Space); 10157 verifyFormat("auto f (int x) -> decltype (x);", Space); 10158 verifyFormat("int f (T x) noexcept (x.create ());", Space); 10159 verifyFormat("alignas (128) char a[128];", Space); 10160 verifyFormat("size_t x = alignof (MyType);", Space); 10161 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); 10162 verifyFormat("int f () throw (Deprecated);", Space); 10163 verifyFormat("typedef void (*cb) (int);", Space); 10164 verifyFormat("T A::operator() ();", Space); 10165 verifyFormat("X A::operator++ (T);", Space); 10166 verifyFormat("auto lambda = [] () { return 0; };", Space); 10167 verifyFormat("int x = int (y);", Space); 10168 10169 FormatStyle SomeSpace = getLLVMStyle(); 10170 SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses; 10171 10172 verifyFormat("[]() -> float {}", SomeSpace); 10173 verifyFormat("[] (auto foo) {}", SomeSpace); 10174 verifyFormat("[foo]() -> int {}", SomeSpace); 10175 verifyFormat("int f();", SomeSpace); 10176 verifyFormat("void f (int a, T b) {\n" 10177 " while (true)\n" 10178 " continue;\n" 10179 "}", 10180 SomeSpace); 10181 verifyFormat("if (true)\n" 10182 " f();\n" 10183 "else if (true)\n" 10184 " f();", 10185 SomeSpace); 10186 verifyFormat("do {\n" 10187 " do_something();\n" 10188 "} while (something());", 10189 SomeSpace); 10190 verifyFormat("switch (x) {\n" 10191 "default:\n" 10192 " break;\n" 10193 "}", 10194 SomeSpace); 10195 verifyFormat("A::A() : a (1) {}", SomeSpace); 10196 verifyFormat("void f() __attribute__ ((asdf));", SomeSpace); 10197 verifyFormat("*(&a + 1);\n" 10198 "&((&a)[1]);\n" 10199 "a[(b + c) * d];\n" 10200 "(((a + 1) * 2) + 3) * 4;", 10201 SomeSpace); 10202 verifyFormat("#define A(x) x", SomeSpace); 10203 verifyFormat("#define A (x) x", SomeSpace); 10204 verifyFormat("#if defined(x)\n" 10205 "#endif", 10206 SomeSpace); 10207 verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace); 10208 verifyFormat("size_t x = sizeof (x);", SomeSpace); 10209 verifyFormat("auto f (int x) -> decltype (x);", SomeSpace); 10210 verifyFormat("int f (T x) noexcept (x.create());", SomeSpace); 10211 verifyFormat("alignas (128) char a[128];", SomeSpace); 10212 verifyFormat("size_t x = alignof (MyType);", SomeSpace); 10213 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", 10214 SomeSpace); 10215 verifyFormat("int f() throw (Deprecated);", SomeSpace); 10216 verifyFormat("typedef void (*cb) (int);", SomeSpace); 10217 verifyFormat("T A::operator()();", SomeSpace); 10218 verifyFormat("X A::operator++ (T);", SomeSpace); 10219 verifyFormat("int x = int (y);", SomeSpace); 10220 verifyFormat("auto lambda = []() { return 0; };", SomeSpace); 10221 } 10222 10223 TEST_F(FormatTest, SpaceAfterLogicalNot) { 10224 FormatStyle Spaces = getLLVMStyle(); 10225 Spaces.SpaceAfterLogicalNot = true; 10226 10227 verifyFormat("bool x = ! y", Spaces); 10228 verifyFormat("if (! isFailure())", Spaces); 10229 verifyFormat("if (! (a && b))", Spaces); 10230 verifyFormat("\"Error!\"", Spaces); 10231 verifyFormat("! ! x", Spaces); 10232 } 10233 10234 TEST_F(FormatTest, ConfigurableSpacesInParentheses) { 10235 FormatStyle Spaces = getLLVMStyle(); 10236 10237 Spaces.SpacesInParentheses = true; 10238 verifyFormat("do_something( ::globalVar );", Spaces); 10239 verifyFormat("call( x, y, z );", Spaces); 10240 verifyFormat("call();", Spaces); 10241 verifyFormat("std::function<void( int, int )> callback;", Spaces); 10242 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }", 10243 Spaces); 10244 verifyFormat("while ( (bool)1 )\n" 10245 " continue;", 10246 Spaces); 10247 verifyFormat("for ( ;; )\n" 10248 " continue;", 10249 Spaces); 10250 verifyFormat("if ( true )\n" 10251 " f();\n" 10252 "else if ( true )\n" 10253 " f();", 10254 Spaces); 10255 verifyFormat("do {\n" 10256 " do_something( (int)i );\n" 10257 "} while ( something() );", 10258 Spaces); 10259 verifyFormat("switch ( x ) {\n" 10260 "default:\n" 10261 " break;\n" 10262 "}", 10263 Spaces); 10264 10265 Spaces.SpacesInParentheses = false; 10266 Spaces.SpacesInCStyleCastParentheses = true; 10267 verifyFormat("Type *A = ( Type * )P;", Spaces); 10268 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces); 10269 verifyFormat("x = ( int32 )y;", Spaces); 10270 verifyFormat("int a = ( int )(2.0f);", Spaces); 10271 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces); 10272 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces); 10273 verifyFormat("#define x (( int )-1)", Spaces); 10274 10275 // Run the first set of tests again with: 10276 Spaces.SpacesInParentheses = false; 10277 Spaces.SpaceInEmptyParentheses = true; 10278 Spaces.SpacesInCStyleCastParentheses = true; 10279 verifyFormat("call(x, y, z);", Spaces); 10280 verifyFormat("call( );", Spaces); 10281 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10282 verifyFormat("while (( bool )1)\n" 10283 " continue;", 10284 Spaces); 10285 verifyFormat("for (;;)\n" 10286 " continue;", 10287 Spaces); 10288 verifyFormat("if (true)\n" 10289 " f( );\n" 10290 "else if (true)\n" 10291 " f( );", 10292 Spaces); 10293 verifyFormat("do {\n" 10294 " do_something(( int )i);\n" 10295 "} while (something( ));", 10296 Spaces); 10297 verifyFormat("switch (x) {\n" 10298 "default:\n" 10299 " break;\n" 10300 "}", 10301 Spaces); 10302 10303 // Run the first set of tests again with: 10304 Spaces.SpaceAfterCStyleCast = true; 10305 verifyFormat("call(x, y, z);", Spaces); 10306 verifyFormat("call( );", Spaces); 10307 verifyFormat("std::function<void(int, int)> callback;", Spaces); 10308 verifyFormat("while (( bool ) 1)\n" 10309 " continue;", 10310 Spaces); 10311 verifyFormat("for (;;)\n" 10312 " continue;", 10313 Spaces); 10314 verifyFormat("if (true)\n" 10315 " f( );\n" 10316 "else if (true)\n" 10317 " f( );", 10318 Spaces); 10319 verifyFormat("do {\n" 10320 " do_something(( int ) i);\n" 10321 "} while (something( ));", 10322 Spaces); 10323 verifyFormat("switch (x) {\n" 10324 "default:\n" 10325 " break;\n" 10326 "}", 10327 Spaces); 10328 10329 // Run subset of tests again with: 10330 Spaces.SpacesInCStyleCastParentheses = false; 10331 Spaces.SpaceAfterCStyleCast = true; 10332 verifyFormat("while ((bool) 1)\n" 10333 " continue;", 10334 Spaces); 10335 verifyFormat("do {\n" 10336 " do_something((int) i);\n" 10337 "} while (something( ));", 10338 Spaces); 10339 } 10340 10341 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { 10342 verifyFormat("int a[5];"); 10343 verifyFormat("a[3] += 42;"); 10344 10345 FormatStyle Spaces = getLLVMStyle(); 10346 Spaces.SpacesInSquareBrackets = true; 10347 // Lambdas unchanged. 10348 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); 10349 verifyFormat("return [i, args...] {};", Spaces); 10350 10351 // Not lambdas. 10352 verifyFormat("int a[ 5 ];", Spaces); 10353 verifyFormat("a[ 3 ] += 42;", Spaces); 10354 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); 10355 verifyFormat("double &operator[](int i) { return 0; }\n" 10356 "int i;", 10357 Spaces); 10358 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); 10359 verifyFormat("int i = a[ a ][ a ]->f();", Spaces); 10360 verifyFormat("int i = (*b)[ a ]->f();", Spaces); 10361 } 10362 10363 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { 10364 verifyFormat("int a = 5;"); 10365 verifyFormat("a += 42;"); 10366 verifyFormat("a or_eq 8;"); 10367 10368 FormatStyle Spaces = getLLVMStyle(); 10369 Spaces.SpaceBeforeAssignmentOperators = false; 10370 verifyFormat("int a= 5;", Spaces); 10371 verifyFormat("a+= 42;", Spaces); 10372 verifyFormat("a or_eq 8;", Spaces); 10373 } 10374 10375 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) { 10376 verifyFormat("class Foo : public Bar {};"); 10377 verifyFormat("Foo::Foo() : foo(1) {}"); 10378 verifyFormat("for (auto a : b) {\n}"); 10379 verifyFormat("int x = a ? b : c;"); 10380 verifyFormat("{\n" 10381 "label0:\n" 10382 " int x = 0;\n" 10383 "}"); 10384 verifyFormat("switch (x) {\n" 10385 "case 1:\n" 10386 "default:\n" 10387 "}"); 10388 10389 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30); 10390 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false; 10391 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle); 10392 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle); 10393 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle); 10394 verifyFormat("int x = a ? b : c;", CtorInitializerStyle); 10395 verifyFormat("{\n" 10396 "label1:\n" 10397 " int x = 0;\n" 10398 "}", 10399 CtorInitializerStyle); 10400 verifyFormat("switch (x) {\n" 10401 "case 1:\n" 10402 "default:\n" 10403 "}", 10404 CtorInitializerStyle); 10405 CtorInitializerStyle.BreakConstructorInitializers = 10406 FormatStyle::BCIS_AfterColon; 10407 verifyFormat("Fooooooooooo::Fooooooooooo():\n" 10408 " aaaaaaaaaaaaaaaa(1),\n" 10409 " bbbbbbbbbbbbbbbb(2) {}", 10410 CtorInitializerStyle); 10411 CtorInitializerStyle.BreakConstructorInitializers = 10412 FormatStyle::BCIS_BeforeComma; 10413 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10414 " : aaaaaaaaaaaaaaaa(1)\n" 10415 " , bbbbbbbbbbbbbbbb(2) {}", 10416 CtorInitializerStyle); 10417 CtorInitializerStyle.BreakConstructorInitializers = 10418 FormatStyle::BCIS_BeforeColon; 10419 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10420 " : aaaaaaaaaaaaaaaa(1),\n" 10421 " bbbbbbbbbbbbbbbb(2) {}", 10422 CtorInitializerStyle); 10423 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0; 10424 verifyFormat("Fooooooooooo::Fooooooooooo()\n" 10425 ": aaaaaaaaaaaaaaaa(1),\n" 10426 " bbbbbbbbbbbbbbbb(2) {}", 10427 CtorInitializerStyle); 10428 10429 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30); 10430 InheritanceStyle.SpaceBeforeInheritanceColon = false; 10431 verifyFormat("class Foo: public Bar {};", InheritanceStyle); 10432 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle); 10433 verifyFormat("for (auto a : b) {\n}", InheritanceStyle); 10434 verifyFormat("int x = a ? b : c;", InheritanceStyle); 10435 verifyFormat("{\n" 10436 "label2:\n" 10437 " int x = 0;\n" 10438 "}", 10439 InheritanceStyle); 10440 verifyFormat("switch (x) {\n" 10441 "case 1:\n" 10442 "default:\n" 10443 "}", 10444 InheritanceStyle); 10445 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon; 10446 verifyFormat("class Foooooooooooooooooooooo:\n" 10447 " public aaaaaaaaaaaaaaaaaa,\n" 10448 " public bbbbbbbbbbbbbbbbbb {\n" 10449 "}", 10450 InheritanceStyle); 10451 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma; 10452 verifyFormat("class Foooooooooooooooooooooo\n" 10453 " : public aaaaaaaaaaaaaaaaaa\n" 10454 " , public bbbbbbbbbbbbbbbbbb {\n" 10455 "}", 10456 InheritanceStyle); 10457 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 10458 verifyFormat("class Foooooooooooooooooooooo\n" 10459 " : public aaaaaaaaaaaaaaaaaa,\n" 10460 " public bbbbbbbbbbbbbbbbbb {\n" 10461 "}", 10462 InheritanceStyle); 10463 InheritanceStyle.ConstructorInitializerIndentWidth = 0; 10464 verifyFormat("class Foooooooooooooooooooooo\n" 10465 ": public aaaaaaaaaaaaaaaaaa,\n" 10466 " public bbbbbbbbbbbbbbbbbb {}", 10467 InheritanceStyle); 10468 10469 FormatStyle ForLoopStyle = getLLVMStyle(); 10470 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false; 10471 verifyFormat("class Foo : public Bar {};", ForLoopStyle); 10472 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle); 10473 verifyFormat("for (auto a: b) {\n}", ForLoopStyle); 10474 verifyFormat("int x = a ? b : c;", ForLoopStyle); 10475 verifyFormat("{\n" 10476 "label2:\n" 10477 " int x = 0;\n" 10478 "}", 10479 ForLoopStyle); 10480 verifyFormat("switch (x) {\n" 10481 "case 1:\n" 10482 "default:\n" 10483 "}", 10484 ForLoopStyle); 10485 10486 FormatStyle NoSpaceStyle = getLLVMStyle(); 10487 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false; 10488 NoSpaceStyle.SpaceBeforeInheritanceColon = false; 10489 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false; 10490 verifyFormat("class Foo: public Bar {};", NoSpaceStyle); 10491 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle); 10492 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle); 10493 verifyFormat("int x = a ? b : c;", NoSpaceStyle); 10494 verifyFormat("{\n" 10495 "label3:\n" 10496 " int x = 0;\n" 10497 "}", 10498 NoSpaceStyle); 10499 verifyFormat("switch (x) {\n" 10500 "case 1:\n" 10501 "default:\n" 10502 "}", 10503 NoSpaceStyle); 10504 } 10505 10506 TEST_F(FormatTest, AlignConsecutiveMacros) { 10507 FormatStyle Style = getLLVMStyle(); 10508 Style.AlignConsecutiveAssignments = true; 10509 Style.AlignConsecutiveDeclarations = true; 10510 Style.AlignConsecutiveMacros = false; 10511 10512 verifyFormat("#define a 3\n" 10513 "#define bbbb 4\n" 10514 "#define ccc (5)", 10515 Style); 10516 10517 verifyFormat("#define f(x) (x * x)\n" 10518 "#define fff(x, y, z) (x * y + z)\n" 10519 "#define ffff(x, y) (x - y)", 10520 Style); 10521 10522 verifyFormat("#define foo(x, y) (x + y)\n" 10523 "#define bar (5, 6)(2 + 2)", 10524 Style); 10525 10526 verifyFormat("#define a 3\n" 10527 "#define bbbb 4\n" 10528 "#define ccc (5)\n" 10529 "#define f(x) (x * x)\n" 10530 "#define fff(x, y, z) (x * y + z)\n" 10531 "#define ffff(x, y) (x - y)", 10532 Style); 10533 10534 Style.AlignConsecutiveMacros = true; 10535 verifyFormat("#define a 3\n" 10536 "#define bbbb 4\n" 10537 "#define ccc (5)", 10538 Style); 10539 10540 verifyFormat("#define f(x) (x * x)\n" 10541 "#define fff(x, y, z) (x * y + z)\n" 10542 "#define ffff(x, y) (x - y)", 10543 Style); 10544 10545 verifyFormat("#define foo(x, y) (x + y)\n" 10546 "#define bar (5, 6)(2 + 2)", 10547 Style); 10548 10549 verifyFormat("#define a 3\n" 10550 "#define bbbb 4\n" 10551 "#define ccc (5)\n" 10552 "#define f(x) (x * x)\n" 10553 "#define fff(x, y, z) (x * y + z)\n" 10554 "#define ffff(x, y) (x - y)", 10555 Style); 10556 10557 verifyFormat("#define a 5\n" 10558 "#define foo(x, y) (x + y)\n" 10559 "#define CCC (6)\n" 10560 "auto lambda = []() {\n" 10561 " auto ii = 0;\n" 10562 " float j = 0;\n" 10563 " return 0;\n" 10564 "};\n" 10565 "int i = 0;\n" 10566 "float i2 = 0;\n" 10567 "auto v = type{\n" 10568 " i = 1, //\n" 10569 " (i = 2), //\n" 10570 " i = 3 //\n" 10571 "};", 10572 Style); 10573 10574 Style.AlignConsecutiveMacros = false; 10575 Style.ColumnLimit = 20; 10576 10577 verifyFormat("#define a \\\n" 10578 " \"aabbbbbbbbbbbb\"\n" 10579 "#define D \\\n" 10580 " \"aabbbbbbbbbbbb\" \\\n" 10581 " \"ccddeeeeeeeee\"\n" 10582 "#define B \\\n" 10583 " \"QQQQQQQQQQQQQ\" \\\n" 10584 " \"FFFFFFFFFFFFF\" \\\n" 10585 " \"LLLLLLLL\"\n", 10586 Style); 10587 10588 Style.AlignConsecutiveMacros = true; 10589 verifyFormat("#define a \\\n" 10590 " \"aabbbbbbbbbbbb\"\n" 10591 "#define D \\\n" 10592 " \"aabbbbbbbbbbbb\" \\\n" 10593 " \"ccddeeeeeeeee\"\n" 10594 "#define B \\\n" 10595 " \"QQQQQQQQQQQQQ\" \\\n" 10596 " \"FFFFFFFFFFFFF\" \\\n" 10597 " \"LLLLLLLL\"\n", 10598 Style); 10599 } 10600 10601 TEST_F(FormatTest, AlignConsecutiveAssignments) { 10602 FormatStyle Alignment = getLLVMStyle(); 10603 Alignment.AlignConsecutiveMacros = true; 10604 Alignment.AlignConsecutiveAssignments = false; 10605 verifyFormat("int a = 5;\n" 10606 "int oneTwoThree = 123;", 10607 Alignment); 10608 verifyFormat("int a = 5;\n" 10609 "int oneTwoThree = 123;", 10610 Alignment); 10611 10612 Alignment.AlignConsecutiveAssignments = true; 10613 verifyFormat("int a = 5;\n" 10614 "int oneTwoThree = 123;", 10615 Alignment); 10616 verifyFormat("int a = method();\n" 10617 "int oneTwoThree = 133;", 10618 Alignment); 10619 verifyFormat("a &= 5;\n" 10620 "bcd *= 5;\n" 10621 "ghtyf += 5;\n" 10622 "dvfvdb -= 5;\n" 10623 "a /= 5;\n" 10624 "vdsvsv %= 5;\n" 10625 "sfdbddfbdfbb ^= 5;\n" 10626 "dvsdsv |= 5;\n" 10627 "int dsvvdvsdvvv = 123;", 10628 Alignment); 10629 verifyFormat("int i = 1, j = 10;\n" 10630 "something = 2000;", 10631 Alignment); 10632 verifyFormat("something = 2000;\n" 10633 "int i = 1, j = 10;\n", 10634 Alignment); 10635 verifyFormat("something = 2000;\n" 10636 "another = 911;\n" 10637 "int i = 1, j = 10;\n" 10638 "oneMore = 1;\n" 10639 "i = 2;", 10640 Alignment); 10641 verifyFormat("int a = 5;\n" 10642 "int one = 1;\n" 10643 "method();\n" 10644 "int oneTwoThree = 123;\n" 10645 "int oneTwo = 12;", 10646 Alignment); 10647 verifyFormat("int oneTwoThree = 123;\n" 10648 "int oneTwo = 12;\n" 10649 "method();\n", 10650 Alignment); 10651 verifyFormat("int oneTwoThree = 123; // comment\n" 10652 "int oneTwo = 12; // comment", 10653 Alignment); 10654 EXPECT_EQ("int a = 5;\n" 10655 "\n" 10656 "int oneTwoThree = 123;", 10657 format("int a = 5;\n" 10658 "\n" 10659 "int oneTwoThree= 123;", 10660 Alignment)); 10661 EXPECT_EQ("int a = 5;\n" 10662 "int one = 1;\n" 10663 "\n" 10664 "int oneTwoThree = 123;", 10665 format("int a = 5;\n" 10666 "int one = 1;\n" 10667 "\n" 10668 "int oneTwoThree = 123;", 10669 Alignment)); 10670 EXPECT_EQ("int a = 5;\n" 10671 "int one = 1;\n" 10672 "\n" 10673 "int oneTwoThree = 123;\n" 10674 "int oneTwo = 12;", 10675 format("int a = 5;\n" 10676 "int one = 1;\n" 10677 "\n" 10678 "int oneTwoThree = 123;\n" 10679 "int oneTwo = 12;", 10680 Alignment)); 10681 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10682 verifyFormat("#define A \\\n" 10683 " int aaaa = 12; \\\n" 10684 " int b = 23; \\\n" 10685 " int ccc = 234; \\\n" 10686 " int dddddddddd = 2345;", 10687 Alignment); 10688 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10689 verifyFormat("#define A \\\n" 10690 " int aaaa = 12; \\\n" 10691 " int b = 23; \\\n" 10692 " int ccc = 234; \\\n" 10693 " int dddddddddd = 2345;", 10694 Alignment); 10695 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10696 verifyFormat("#define A " 10697 " \\\n" 10698 " int aaaa = 12; " 10699 " \\\n" 10700 " int b = 23; " 10701 " \\\n" 10702 " int ccc = 234; " 10703 " \\\n" 10704 " int dddddddddd = 2345;", 10705 Alignment); 10706 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10707 "k = 4, int l = 5,\n" 10708 " int m = 6) {\n" 10709 " int j = 10;\n" 10710 " otherThing = 1;\n" 10711 "}", 10712 Alignment); 10713 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10714 " int i = 1;\n" 10715 " int j = 2;\n" 10716 " int big = 10000;\n" 10717 "}", 10718 Alignment); 10719 verifyFormat("class C {\n" 10720 "public:\n" 10721 " int i = 1;\n" 10722 " virtual void f() = 0;\n" 10723 "};", 10724 Alignment); 10725 verifyFormat("int i = 1;\n" 10726 "if (SomeType t = getSomething()) {\n" 10727 "}\n" 10728 "int j = 2;\n" 10729 "int big = 10000;", 10730 Alignment); 10731 verifyFormat("int j = 7;\n" 10732 "for (int k = 0; k < N; ++k) {\n" 10733 "}\n" 10734 "int j = 2;\n" 10735 "int big = 10000;\n" 10736 "}", 10737 Alignment); 10738 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 10739 verifyFormat("int i = 1;\n" 10740 "LooooooooooongType loooooooooooooooooooooongVariable\n" 10741 " = someLooooooooooooooooongFunction();\n" 10742 "int j = 2;", 10743 Alignment); 10744 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 10745 verifyFormat("int i = 1;\n" 10746 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 10747 " someLooooooooooooooooongFunction();\n" 10748 "int j = 2;", 10749 Alignment); 10750 10751 verifyFormat("auto lambda = []() {\n" 10752 " auto i = 0;\n" 10753 " return 0;\n" 10754 "};\n" 10755 "int i = 0;\n" 10756 "auto v = type{\n" 10757 " i = 1, //\n" 10758 " (i = 2), //\n" 10759 " i = 3 //\n" 10760 "};", 10761 Alignment); 10762 10763 verifyFormat( 10764 "int i = 1;\n" 10765 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 10766 " loooooooooooooooooooooongParameterB);\n" 10767 "int j = 2;", 10768 Alignment); 10769 10770 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n" 10771 " typename B = very_long_type_name_1,\n" 10772 " typename T_2 = very_long_type_name_2>\n" 10773 "auto foo() {}\n", 10774 Alignment); 10775 verifyFormat("int a, b = 1;\n" 10776 "int c = 2;\n" 10777 "int dd = 3;\n", 10778 Alignment); 10779 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 10780 "float b[1][] = {{3.f}};\n", 10781 Alignment); 10782 verifyFormat("for (int i = 0; i < 1; i++)\n" 10783 " int x = 1;\n", 10784 Alignment); 10785 verifyFormat("for (i = 0; i < 1; i++)\n" 10786 " x = 1;\n" 10787 "y = 1;\n", 10788 Alignment); 10789 } 10790 10791 TEST_F(FormatTest, AlignConsecutiveDeclarations) { 10792 FormatStyle Alignment = getLLVMStyle(); 10793 Alignment.AlignConsecutiveMacros = true; 10794 Alignment.AlignConsecutiveDeclarations = false; 10795 verifyFormat("float const a = 5;\n" 10796 "int oneTwoThree = 123;", 10797 Alignment); 10798 verifyFormat("int a = 5;\n" 10799 "float const oneTwoThree = 123;", 10800 Alignment); 10801 10802 Alignment.AlignConsecutiveDeclarations = true; 10803 verifyFormat("float const a = 5;\n" 10804 "int oneTwoThree = 123;", 10805 Alignment); 10806 verifyFormat("int a = method();\n" 10807 "float const oneTwoThree = 133;", 10808 Alignment); 10809 verifyFormat("int i = 1, j = 10;\n" 10810 "something = 2000;", 10811 Alignment); 10812 verifyFormat("something = 2000;\n" 10813 "int i = 1, j = 10;\n", 10814 Alignment); 10815 verifyFormat("float something = 2000;\n" 10816 "double another = 911;\n" 10817 "int i = 1, j = 10;\n" 10818 "const int *oneMore = 1;\n" 10819 "unsigned i = 2;", 10820 Alignment); 10821 verifyFormat("float a = 5;\n" 10822 "int one = 1;\n" 10823 "method();\n" 10824 "const double oneTwoThree = 123;\n" 10825 "const unsigned int oneTwo = 12;", 10826 Alignment); 10827 verifyFormat("int oneTwoThree{0}; // comment\n" 10828 "unsigned oneTwo; // comment", 10829 Alignment); 10830 EXPECT_EQ("float const a = 5;\n" 10831 "\n" 10832 "int oneTwoThree = 123;", 10833 format("float const a = 5;\n" 10834 "\n" 10835 "int oneTwoThree= 123;", 10836 Alignment)); 10837 EXPECT_EQ("float a = 5;\n" 10838 "int one = 1;\n" 10839 "\n" 10840 "unsigned oneTwoThree = 123;", 10841 format("float a = 5;\n" 10842 "int one = 1;\n" 10843 "\n" 10844 "unsigned oneTwoThree = 123;", 10845 Alignment)); 10846 EXPECT_EQ("float a = 5;\n" 10847 "int one = 1;\n" 10848 "\n" 10849 "unsigned oneTwoThree = 123;\n" 10850 "int oneTwo = 12;", 10851 format("float a = 5;\n" 10852 "int one = 1;\n" 10853 "\n" 10854 "unsigned oneTwoThree = 123;\n" 10855 "int oneTwo = 12;", 10856 Alignment)); 10857 // Function prototype alignment 10858 verifyFormat("int a();\n" 10859 "double b();", 10860 Alignment); 10861 verifyFormat("int a(int x);\n" 10862 "double b();", 10863 Alignment); 10864 unsigned OldColumnLimit = Alignment.ColumnLimit; 10865 // We need to set ColumnLimit to zero, in order to stress nested alignments, 10866 // otherwise the function parameters will be re-flowed onto a single line. 10867 Alignment.ColumnLimit = 0; 10868 EXPECT_EQ("int a(int x,\n" 10869 " float y);\n" 10870 "double b(int x,\n" 10871 " double y);", 10872 format("int a(int x,\n" 10873 " float y);\n" 10874 "double b(int x,\n" 10875 " double y);", 10876 Alignment)); 10877 // This ensures that function parameters of function declarations are 10878 // correctly indented when their owning functions are indented. 10879 // The failure case here is for 'double y' to not be indented enough. 10880 EXPECT_EQ("double a(int x);\n" 10881 "int b(int y,\n" 10882 " double z);", 10883 format("double a(int x);\n" 10884 "int b(int y,\n" 10885 " double z);", 10886 Alignment)); 10887 // Set ColumnLimit low so that we induce wrapping immediately after 10888 // the function name and opening paren. 10889 Alignment.ColumnLimit = 13; 10890 verifyFormat("int function(\n" 10891 " int x,\n" 10892 " bool y);", 10893 Alignment); 10894 Alignment.ColumnLimit = OldColumnLimit; 10895 // Ensure function pointers don't screw up recursive alignment 10896 verifyFormat("int a(int x, void (*fp)(int y));\n" 10897 "double b();", 10898 Alignment); 10899 Alignment.AlignConsecutiveAssignments = true; 10900 // Ensure recursive alignment is broken by function braces, so that the 10901 // "a = 1" does not align with subsequent assignments inside the function 10902 // body. 10903 verifyFormat("int func(int a = 1) {\n" 10904 " int b = 2;\n" 10905 " int cc = 3;\n" 10906 "}", 10907 Alignment); 10908 verifyFormat("float something = 2000;\n" 10909 "double another = 911;\n" 10910 "int i = 1, j = 10;\n" 10911 "const int *oneMore = 1;\n" 10912 "unsigned i = 2;", 10913 Alignment); 10914 verifyFormat("int oneTwoThree = {0}; // comment\n" 10915 "unsigned oneTwo = 0; // comment", 10916 Alignment); 10917 // Make sure that scope is correctly tracked, in the absence of braces 10918 verifyFormat("for (int i = 0; i < n; i++)\n" 10919 " j = i;\n" 10920 "double x = 1;\n", 10921 Alignment); 10922 verifyFormat("if (int i = 0)\n" 10923 " j = i;\n" 10924 "double x = 1;\n", 10925 Alignment); 10926 // Ensure operator[] and operator() are comprehended 10927 verifyFormat("struct test {\n" 10928 " long long int foo();\n" 10929 " int operator[](int a);\n" 10930 " double bar();\n" 10931 "};\n", 10932 Alignment); 10933 verifyFormat("struct test {\n" 10934 " long long int foo();\n" 10935 " int operator()(int a);\n" 10936 " double bar();\n" 10937 "};\n", 10938 Alignment); 10939 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n" 10940 " int const i = 1;\n" 10941 " int * j = 2;\n" 10942 " int big = 10000;\n" 10943 "\n" 10944 " unsigned oneTwoThree = 123;\n" 10945 " int oneTwo = 12;\n" 10946 " method();\n" 10947 " float k = 2;\n" 10948 " int ll = 10000;\n" 10949 "}", 10950 format("void SomeFunction(int parameter= 0) {\n" 10951 " int const i= 1;\n" 10952 " int *j=2;\n" 10953 " int big = 10000;\n" 10954 "\n" 10955 "unsigned oneTwoThree =123;\n" 10956 "int oneTwo = 12;\n" 10957 " method();\n" 10958 "float k= 2;\n" 10959 "int ll=10000;\n" 10960 "}", 10961 Alignment)); 10962 Alignment.AlignConsecutiveAssignments = false; 10963 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign; 10964 verifyFormat("#define A \\\n" 10965 " int aaaa = 12; \\\n" 10966 " float b = 23; \\\n" 10967 " const int ccc = 234; \\\n" 10968 " unsigned dddddddddd = 2345;", 10969 Alignment); 10970 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left; 10971 verifyFormat("#define A \\\n" 10972 " int aaaa = 12; \\\n" 10973 " float b = 23; \\\n" 10974 " const int ccc = 234; \\\n" 10975 " unsigned dddddddddd = 2345;", 10976 Alignment); 10977 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right; 10978 Alignment.ColumnLimit = 30; 10979 verifyFormat("#define A \\\n" 10980 " int aaaa = 12; \\\n" 10981 " float b = 23; \\\n" 10982 " const int ccc = 234; \\\n" 10983 " int dddddddddd = 2345;", 10984 Alignment); 10985 Alignment.ColumnLimit = 80; 10986 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int " 10987 "k = 4, int l = 5,\n" 10988 " int m = 6) {\n" 10989 " const int j = 10;\n" 10990 " otherThing = 1;\n" 10991 "}", 10992 Alignment); 10993 verifyFormat("void SomeFunction(int parameter = 0) {\n" 10994 " int const i = 1;\n" 10995 " int * j = 2;\n" 10996 " int big = 10000;\n" 10997 "}", 10998 Alignment); 10999 verifyFormat("class C {\n" 11000 "public:\n" 11001 " int i = 1;\n" 11002 " virtual void f() = 0;\n" 11003 "};", 11004 Alignment); 11005 verifyFormat("float i = 1;\n" 11006 "if (SomeType t = getSomething()) {\n" 11007 "}\n" 11008 "const unsigned j = 2;\n" 11009 "int big = 10000;", 11010 Alignment); 11011 verifyFormat("float j = 7;\n" 11012 "for (int k = 0; k < N; ++k) {\n" 11013 "}\n" 11014 "unsigned j = 2;\n" 11015 "int big = 10000;\n" 11016 "}", 11017 Alignment); 11018 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 11019 verifyFormat("float i = 1;\n" 11020 "LooooooooooongType loooooooooooooooooooooongVariable\n" 11021 " = someLooooooooooooooooongFunction();\n" 11022 "int j = 2;", 11023 Alignment); 11024 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 11025 verifyFormat("int i = 1;\n" 11026 "LooooooooooongType loooooooooooooooooooooongVariable =\n" 11027 " someLooooooooooooooooongFunction();\n" 11028 "int j = 2;", 11029 Alignment); 11030 11031 Alignment.AlignConsecutiveAssignments = true; 11032 verifyFormat("auto lambda = []() {\n" 11033 " auto ii = 0;\n" 11034 " float j = 0;\n" 11035 " return 0;\n" 11036 "};\n" 11037 "int i = 0;\n" 11038 "float i2 = 0;\n" 11039 "auto v = type{\n" 11040 " i = 1, //\n" 11041 " (i = 2), //\n" 11042 " i = 3 //\n" 11043 "};", 11044 Alignment); 11045 Alignment.AlignConsecutiveAssignments = false; 11046 11047 verifyFormat( 11048 "int i = 1;\n" 11049 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n" 11050 " loooooooooooooooooooooongParameterB);\n" 11051 "int j = 2;", 11052 Alignment); 11053 11054 // Test interactions with ColumnLimit and AlignConsecutiveAssignments: 11055 // We expect declarations and assignments to align, as long as it doesn't 11056 // exceed the column limit, starting a new alignment sequence whenever it 11057 // happens. 11058 Alignment.AlignConsecutiveAssignments = true; 11059 Alignment.ColumnLimit = 30; 11060 verifyFormat("float ii = 1;\n" 11061 "unsigned j = 2;\n" 11062 "int someVerylongVariable = 1;\n" 11063 "AnotherLongType ll = 123456;\n" 11064 "VeryVeryLongType k = 2;\n" 11065 "int myvar = 1;", 11066 Alignment); 11067 Alignment.ColumnLimit = 80; 11068 Alignment.AlignConsecutiveAssignments = false; 11069 11070 verifyFormat( 11071 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n" 11072 " typename LongType, typename B>\n" 11073 "auto foo() {}\n", 11074 Alignment); 11075 verifyFormat("float a, b = 1;\n" 11076 "int c = 2;\n" 11077 "int dd = 3;\n", 11078 Alignment); 11079 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11080 "float b[1][] = {{3.f}};\n", 11081 Alignment); 11082 Alignment.AlignConsecutiveAssignments = true; 11083 verifyFormat("float a, b = 1;\n" 11084 "int c = 2;\n" 11085 "int dd = 3;\n", 11086 Alignment); 11087 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n" 11088 "float b[1][] = {{3.f}};\n", 11089 Alignment); 11090 Alignment.AlignConsecutiveAssignments = false; 11091 11092 Alignment.ColumnLimit = 30; 11093 Alignment.BinPackParameters = false; 11094 verifyFormat("void foo(float a,\n" 11095 " float b,\n" 11096 " int c,\n" 11097 " uint32_t *d) {\n" 11098 " int * e = 0;\n" 11099 " float f = 0;\n" 11100 " double g = 0;\n" 11101 "}\n" 11102 "void bar(ino_t a,\n" 11103 " int b,\n" 11104 " uint32_t *c,\n" 11105 " bool d) {}\n", 11106 Alignment); 11107 Alignment.BinPackParameters = true; 11108 Alignment.ColumnLimit = 80; 11109 11110 // Bug 33507 11111 Alignment.PointerAlignment = FormatStyle::PAS_Middle; 11112 verifyFormat( 11113 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n" 11114 " static const Version verVs2017;\n" 11115 " return true;\n" 11116 "});\n", 11117 Alignment); 11118 Alignment.PointerAlignment = FormatStyle::PAS_Right; 11119 11120 // See llvm.org/PR35641 11121 Alignment.AlignConsecutiveDeclarations = true; 11122 verifyFormat("int func() { //\n" 11123 " int b;\n" 11124 " unsigned c;\n" 11125 "}", 11126 Alignment); 11127 11128 // See PR37175 11129 FormatStyle Style = getMozillaStyle(); 11130 Style.AlignConsecutiveDeclarations = true; 11131 EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n" 11132 "foo(int a);", 11133 format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style)); 11134 } 11135 11136 TEST_F(FormatTest, LinuxBraceBreaking) { 11137 FormatStyle LinuxBraceStyle = getLLVMStyle(); 11138 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; 11139 verifyFormat("namespace a\n" 11140 "{\n" 11141 "class A\n" 11142 "{\n" 11143 " void f()\n" 11144 " {\n" 11145 " if (true) {\n" 11146 " a();\n" 11147 " b();\n" 11148 " } else {\n" 11149 " a();\n" 11150 " }\n" 11151 " }\n" 11152 " void g() { return; }\n" 11153 "};\n" 11154 "struct B {\n" 11155 " int x;\n" 11156 "};\n" 11157 "} // namespace a\n", 11158 LinuxBraceStyle); 11159 verifyFormat("enum X {\n" 11160 " Y = 0,\n" 11161 "}\n", 11162 LinuxBraceStyle); 11163 verifyFormat("struct S {\n" 11164 " int Type;\n" 11165 " union {\n" 11166 " int x;\n" 11167 " double y;\n" 11168 " } Value;\n" 11169 " class C\n" 11170 " {\n" 11171 " MyFavoriteType Value;\n" 11172 " } Class;\n" 11173 "}\n", 11174 LinuxBraceStyle); 11175 } 11176 11177 TEST_F(FormatTest, MozillaBraceBreaking) { 11178 FormatStyle MozillaBraceStyle = getLLVMStyle(); 11179 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla; 11180 MozillaBraceStyle.FixNamespaceComments = false; 11181 verifyFormat("namespace a {\n" 11182 "class A\n" 11183 "{\n" 11184 " void f()\n" 11185 " {\n" 11186 " if (true) {\n" 11187 " a();\n" 11188 " b();\n" 11189 " }\n" 11190 " }\n" 11191 " void g() { return; }\n" 11192 "};\n" 11193 "enum E\n" 11194 "{\n" 11195 " A,\n" 11196 " // foo\n" 11197 " B,\n" 11198 " C\n" 11199 "};\n" 11200 "struct B\n" 11201 "{\n" 11202 " int x;\n" 11203 "};\n" 11204 "}\n", 11205 MozillaBraceStyle); 11206 verifyFormat("struct S\n" 11207 "{\n" 11208 " int Type;\n" 11209 " union\n" 11210 " {\n" 11211 " int x;\n" 11212 " double y;\n" 11213 " } Value;\n" 11214 " class C\n" 11215 " {\n" 11216 " MyFavoriteType Value;\n" 11217 " } Class;\n" 11218 "}\n", 11219 MozillaBraceStyle); 11220 } 11221 11222 TEST_F(FormatTest, StroustrupBraceBreaking) { 11223 FormatStyle StroustrupBraceStyle = getLLVMStyle(); 11224 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 11225 verifyFormat("namespace a {\n" 11226 "class A {\n" 11227 " void f()\n" 11228 " {\n" 11229 " if (true) {\n" 11230 " a();\n" 11231 " b();\n" 11232 " }\n" 11233 " }\n" 11234 " void g() { return; }\n" 11235 "};\n" 11236 "struct B {\n" 11237 " int x;\n" 11238 "};\n" 11239 "} // namespace a\n", 11240 StroustrupBraceStyle); 11241 11242 verifyFormat("void foo()\n" 11243 "{\n" 11244 " if (a) {\n" 11245 " a();\n" 11246 " }\n" 11247 " else {\n" 11248 " b();\n" 11249 " }\n" 11250 "}\n", 11251 StroustrupBraceStyle); 11252 11253 verifyFormat("#ifdef _DEBUG\n" 11254 "int foo(int i = 0)\n" 11255 "#else\n" 11256 "int foo(int i = 5)\n" 11257 "#endif\n" 11258 "{\n" 11259 " return i;\n" 11260 "}", 11261 StroustrupBraceStyle); 11262 11263 verifyFormat("void foo() {}\n" 11264 "void bar()\n" 11265 "#ifdef _DEBUG\n" 11266 "{\n" 11267 " foo();\n" 11268 "}\n" 11269 "#else\n" 11270 "{\n" 11271 "}\n" 11272 "#endif", 11273 StroustrupBraceStyle); 11274 11275 verifyFormat("void foobar() { int i = 5; }\n" 11276 "#ifdef _DEBUG\n" 11277 "void bar() {}\n" 11278 "#else\n" 11279 "void bar() { foobar(); }\n" 11280 "#endif", 11281 StroustrupBraceStyle); 11282 } 11283 11284 TEST_F(FormatTest, AllmanBraceBreaking) { 11285 FormatStyle AllmanBraceStyle = getLLVMStyle(); 11286 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; 11287 11288 EXPECT_EQ("namespace a\n" 11289 "{\n" 11290 "void f();\n" 11291 "void g();\n" 11292 "} // namespace a\n", 11293 format("namespace a\n" 11294 "{\n" 11295 "void f();\n" 11296 "void g();\n" 11297 "}\n", 11298 AllmanBraceStyle)); 11299 11300 verifyFormat("namespace a\n" 11301 "{\n" 11302 "class A\n" 11303 "{\n" 11304 " void f()\n" 11305 " {\n" 11306 " if (true)\n" 11307 " {\n" 11308 " a();\n" 11309 " b();\n" 11310 " }\n" 11311 " }\n" 11312 " void g() { return; }\n" 11313 "};\n" 11314 "struct B\n" 11315 "{\n" 11316 " int x;\n" 11317 "};\n" 11318 "union C\n" 11319 "{\n" 11320 "};\n" 11321 "} // namespace a", 11322 AllmanBraceStyle); 11323 11324 verifyFormat("void f()\n" 11325 "{\n" 11326 " if (true)\n" 11327 " {\n" 11328 " a();\n" 11329 " }\n" 11330 " else if (false)\n" 11331 " {\n" 11332 " b();\n" 11333 " }\n" 11334 " else\n" 11335 " {\n" 11336 " c();\n" 11337 " }\n" 11338 "}\n", 11339 AllmanBraceStyle); 11340 11341 verifyFormat("void f()\n" 11342 "{\n" 11343 " for (int i = 0; i < 10; ++i)\n" 11344 " {\n" 11345 " a();\n" 11346 " }\n" 11347 " while (false)\n" 11348 " {\n" 11349 " b();\n" 11350 " }\n" 11351 " do\n" 11352 " {\n" 11353 " c();\n" 11354 " } while (false)\n" 11355 "}\n", 11356 AllmanBraceStyle); 11357 11358 verifyFormat("void f(int a)\n" 11359 "{\n" 11360 " switch (a)\n" 11361 " {\n" 11362 " case 0:\n" 11363 " break;\n" 11364 " case 1:\n" 11365 " {\n" 11366 " break;\n" 11367 " }\n" 11368 " case 2:\n" 11369 " {\n" 11370 " }\n" 11371 " break;\n" 11372 " default:\n" 11373 " break;\n" 11374 " }\n" 11375 "}\n", 11376 AllmanBraceStyle); 11377 11378 verifyFormat("enum X\n" 11379 "{\n" 11380 " Y = 0,\n" 11381 "}\n", 11382 AllmanBraceStyle); 11383 verifyFormat("enum X\n" 11384 "{\n" 11385 " Y = 0\n" 11386 "}\n", 11387 AllmanBraceStyle); 11388 11389 verifyFormat("@interface BSApplicationController ()\n" 11390 "{\n" 11391 "@private\n" 11392 " id _extraIvar;\n" 11393 "}\n" 11394 "@end\n", 11395 AllmanBraceStyle); 11396 11397 verifyFormat("#ifdef _DEBUG\n" 11398 "int foo(int i = 0)\n" 11399 "#else\n" 11400 "int foo(int i = 5)\n" 11401 "#endif\n" 11402 "{\n" 11403 " return i;\n" 11404 "}", 11405 AllmanBraceStyle); 11406 11407 verifyFormat("void foo() {}\n" 11408 "void bar()\n" 11409 "#ifdef _DEBUG\n" 11410 "{\n" 11411 " foo();\n" 11412 "}\n" 11413 "#else\n" 11414 "{\n" 11415 "}\n" 11416 "#endif", 11417 AllmanBraceStyle); 11418 11419 verifyFormat("void foobar() { int i = 5; }\n" 11420 "#ifdef _DEBUG\n" 11421 "void bar() {}\n" 11422 "#else\n" 11423 "void bar() { foobar(); }\n" 11424 "#endif", 11425 AllmanBraceStyle); 11426 11427 // This shouldn't affect ObjC blocks.. 11428 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11429 " // ...\n" 11430 " int i;\n" 11431 "}];", 11432 AllmanBraceStyle); 11433 verifyFormat("void (^block)(void) = ^{\n" 11434 " // ...\n" 11435 " int i;\n" 11436 "};", 11437 AllmanBraceStyle); 11438 // .. or dict literals. 11439 verifyFormat("void f()\n" 11440 "{\n" 11441 " // ...\n" 11442 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11443 "}", 11444 AllmanBraceStyle); 11445 verifyFormat("void f()\n" 11446 "{\n" 11447 " // ...\n" 11448 " [object someMethod:@{a : @\"b\"}];\n" 11449 "}", 11450 AllmanBraceStyle); 11451 verifyFormat("int f()\n" 11452 "{ // comment\n" 11453 " return 42;\n" 11454 "}", 11455 AllmanBraceStyle); 11456 11457 AllmanBraceStyle.ColumnLimit = 19; 11458 verifyFormat("void f() { int i; }", AllmanBraceStyle); 11459 AllmanBraceStyle.ColumnLimit = 18; 11460 verifyFormat("void f()\n" 11461 "{\n" 11462 " int i;\n" 11463 "}", 11464 AllmanBraceStyle); 11465 AllmanBraceStyle.ColumnLimit = 80; 11466 11467 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; 11468 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11469 FormatStyle::SIS_WithoutElse; 11470 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11471 verifyFormat("void f(bool b)\n" 11472 "{\n" 11473 " if (b)\n" 11474 " {\n" 11475 " return;\n" 11476 " }\n" 11477 "}\n", 11478 BreakBeforeBraceShortIfs); 11479 verifyFormat("void f(bool b)\n" 11480 "{\n" 11481 " if constexpr (b)\n" 11482 " {\n" 11483 " return;\n" 11484 " }\n" 11485 "}\n", 11486 BreakBeforeBraceShortIfs); 11487 verifyFormat("void f(bool b)\n" 11488 "{\n" 11489 " if CONSTEXPR (b)\n" 11490 " {\n" 11491 " return;\n" 11492 " }\n" 11493 "}\n", 11494 BreakBeforeBraceShortIfs); 11495 verifyFormat("void f(bool b)\n" 11496 "{\n" 11497 " if (b) return;\n" 11498 "}\n", 11499 BreakBeforeBraceShortIfs); 11500 verifyFormat("void f(bool b)\n" 11501 "{\n" 11502 " if constexpr (b) return;\n" 11503 "}\n", 11504 BreakBeforeBraceShortIfs); 11505 verifyFormat("void f(bool b)\n" 11506 "{\n" 11507 " if CONSTEXPR (b) return;\n" 11508 "}\n", 11509 BreakBeforeBraceShortIfs); 11510 verifyFormat("void f(bool b)\n" 11511 "{\n" 11512 " while (b)\n" 11513 " {\n" 11514 " return;\n" 11515 " }\n" 11516 "}\n", 11517 BreakBeforeBraceShortIfs); 11518 } 11519 11520 TEST_F(FormatTest, WhitesmithsBraceBreaking) { 11521 FormatStyle WhitesmithsBraceStyle = getLLVMStyle(); 11522 WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths; 11523 11524 // Make a few changes to the style for testing purposes 11525 WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine = 11526 FormatStyle::SFS_Empty; 11527 WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 11528 WhitesmithsBraceStyle.ColumnLimit = 0; 11529 11530 // FIXME: this test case can't decide whether there should be a blank line 11531 // after the ~D() line or not. It adds one if one doesn't exist in the test 11532 // and it removes the line if one exists. 11533 /* 11534 verifyFormat("class A;\n" 11535 "namespace B\n" 11536 " {\n" 11537 "class C;\n" 11538 "// Comment\n" 11539 "class D\n" 11540 " {\n" 11541 "public:\n" 11542 " D();\n" 11543 " ~D() {}\n" 11544 "private:\n" 11545 " enum E\n" 11546 " {\n" 11547 " F\n" 11548 " }\n" 11549 " };\n" 11550 " } // namespace B\n", 11551 WhitesmithsBraceStyle); 11552 */ 11553 11554 verifyFormat("namespace a\n" 11555 " {\n" 11556 "class A\n" 11557 " {\n" 11558 " void f()\n" 11559 " {\n" 11560 " if (true)\n" 11561 " {\n" 11562 " a();\n" 11563 " b();\n" 11564 " }\n" 11565 " }\n" 11566 " void g()\n" 11567 " {\n" 11568 " return;\n" 11569 " }\n" 11570 " };\n" 11571 "struct B\n" 11572 " {\n" 11573 " int x;\n" 11574 " };\n" 11575 " } // namespace a", 11576 WhitesmithsBraceStyle); 11577 11578 verifyFormat("void f()\n" 11579 " {\n" 11580 " if (true)\n" 11581 " {\n" 11582 " a();\n" 11583 " }\n" 11584 " else if (false)\n" 11585 " {\n" 11586 " b();\n" 11587 " }\n" 11588 " else\n" 11589 " {\n" 11590 " c();\n" 11591 " }\n" 11592 " }\n", 11593 WhitesmithsBraceStyle); 11594 11595 verifyFormat("void f()\n" 11596 " {\n" 11597 " for (int i = 0; i < 10; ++i)\n" 11598 " {\n" 11599 " a();\n" 11600 " }\n" 11601 " while (false)\n" 11602 " {\n" 11603 " b();\n" 11604 " }\n" 11605 " do\n" 11606 " {\n" 11607 " c();\n" 11608 " } while (false)\n" 11609 " }\n", 11610 WhitesmithsBraceStyle); 11611 11612 // FIXME: the block and the break under case 2 in this test don't get indented 11613 // correctly 11614 /* 11615 verifyFormat("void switchTest1(int a)\n" 11616 " {\n" 11617 " switch (a)\n" 11618 " {\n" 11619 " case 2:\n" 11620 " {\n" 11621 " }\n" 11622 " break;\n" 11623 " }\n" 11624 " }\n", 11625 WhitesmithsBraceStyle); 11626 */ 11627 11628 // FIXME: the block and the break under case 2 in this test don't get indented 11629 // correctly 11630 /* 11631 verifyFormat("void switchTest2(int a)\n" 11632 " {\n" 11633 " switch (a)\n" 11634 " {\n" 11635 " case 0:\n" 11636 " break;\n" 11637 " case 1:\n" 11638 " {\n" 11639 " break;\n" 11640 " }\n" 11641 " case 2:\n" 11642 " {\n" 11643 " }\n" 11644 " break;\n" 11645 " default:\n" 11646 " break;\n" 11647 " }\n" 11648 " }\n", 11649 WhitesmithsBraceStyle); 11650 */ 11651 11652 verifyFormat("enum X\n" 11653 " {\n" 11654 " Y = 0, // testing\n" 11655 " }\n", 11656 WhitesmithsBraceStyle); 11657 11658 verifyFormat("enum X\n" 11659 " {\n" 11660 " Y = 0\n" 11661 " }\n", 11662 WhitesmithsBraceStyle); 11663 verifyFormat("enum X\n" 11664 " {\n" 11665 " Y = 0,\n" 11666 " Z = 1\n" 11667 " };\n", 11668 WhitesmithsBraceStyle); 11669 11670 verifyFormat("@interface BSApplicationController ()\n" 11671 " {\n" 11672 "@private\n" 11673 " id _extraIvar;\n" 11674 " }\n" 11675 "@end\n", 11676 WhitesmithsBraceStyle); 11677 11678 verifyFormat("#ifdef _DEBUG\n" 11679 "int foo(int i = 0)\n" 11680 "#else\n" 11681 "int foo(int i = 5)\n" 11682 "#endif\n" 11683 " {\n" 11684 " return i;\n" 11685 " }", 11686 WhitesmithsBraceStyle); 11687 11688 verifyFormat("void foo() {}\n" 11689 "void bar()\n" 11690 "#ifdef _DEBUG\n" 11691 " {\n" 11692 " foo();\n" 11693 " }\n" 11694 "#else\n" 11695 " {\n" 11696 " }\n" 11697 "#endif", 11698 WhitesmithsBraceStyle); 11699 11700 verifyFormat("void foobar()\n" 11701 " {\n" 11702 " int i = 5;\n" 11703 " }\n" 11704 "#ifdef _DEBUG\n" 11705 "void bar()\n" 11706 " {\n" 11707 " }\n" 11708 "#else\n" 11709 "void bar()\n" 11710 " {\n" 11711 " foobar();\n" 11712 " }\n" 11713 "#endif", 11714 WhitesmithsBraceStyle); 11715 11716 // This shouldn't affect ObjC blocks.. 11717 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" 11718 " // ...\n" 11719 " int i;\n" 11720 "}];", 11721 WhitesmithsBraceStyle); 11722 verifyFormat("void (^block)(void) = ^{\n" 11723 " // ...\n" 11724 " int i;\n" 11725 "};", 11726 WhitesmithsBraceStyle); 11727 // .. or dict literals. 11728 verifyFormat("void f()\n" 11729 " {\n" 11730 " [object someMethod:@{@\"a\" : @\"b\"}];\n" 11731 " }", 11732 WhitesmithsBraceStyle); 11733 11734 verifyFormat("int f()\n" 11735 " { // comment\n" 11736 " return 42;\n" 11737 " }", 11738 WhitesmithsBraceStyle); 11739 11740 FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle; 11741 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = 11742 FormatStyle::SIS_Always; 11743 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; 11744 verifyFormat("void f(bool b)\n" 11745 " {\n" 11746 " if (b)\n" 11747 " {\n" 11748 " return;\n" 11749 " }\n" 11750 " }\n", 11751 BreakBeforeBraceShortIfs); 11752 verifyFormat("void f(bool b)\n" 11753 " {\n" 11754 " if (b) return;\n" 11755 " }\n", 11756 BreakBeforeBraceShortIfs); 11757 verifyFormat("void f(bool b)\n" 11758 " {\n" 11759 " while (b)\n" 11760 " {\n" 11761 " return;\n" 11762 " }\n" 11763 " }\n", 11764 BreakBeforeBraceShortIfs); 11765 } 11766 11767 TEST_F(FormatTest, GNUBraceBreaking) { 11768 FormatStyle GNUBraceStyle = getLLVMStyle(); 11769 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU; 11770 verifyFormat("namespace a\n" 11771 "{\n" 11772 "class A\n" 11773 "{\n" 11774 " void f()\n" 11775 " {\n" 11776 " int a;\n" 11777 " {\n" 11778 " int b;\n" 11779 " }\n" 11780 " if (true)\n" 11781 " {\n" 11782 " a();\n" 11783 " b();\n" 11784 " }\n" 11785 " }\n" 11786 " void g() { return; }\n" 11787 "}\n" 11788 "} // namespace a", 11789 GNUBraceStyle); 11790 11791 verifyFormat("void f()\n" 11792 "{\n" 11793 " if (true)\n" 11794 " {\n" 11795 " a();\n" 11796 " }\n" 11797 " else if (false)\n" 11798 " {\n" 11799 " b();\n" 11800 " }\n" 11801 " else\n" 11802 " {\n" 11803 " c();\n" 11804 " }\n" 11805 "}\n", 11806 GNUBraceStyle); 11807 11808 verifyFormat("void f()\n" 11809 "{\n" 11810 " for (int i = 0; i < 10; ++i)\n" 11811 " {\n" 11812 " a();\n" 11813 " }\n" 11814 " while (false)\n" 11815 " {\n" 11816 " b();\n" 11817 " }\n" 11818 " do\n" 11819 " {\n" 11820 " c();\n" 11821 " }\n" 11822 " while (false);\n" 11823 "}\n", 11824 GNUBraceStyle); 11825 11826 verifyFormat("void f(int a)\n" 11827 "{\n" 11828 " switch (a)\n" 11829 " {\n" 11830 " case 0:\n" 11831 " break;\n" 11832 " case 1:\n" 11833 " {\n" 11834 " break;\n" 11835 " }\n" 11836 " case 2:\n" 11837 " {\n" 11838 " }\n" 11839 " break;\n" 11840 " default:\n" 11841 " break;\n" 11842 " }\n" 11843 "}\n", 11844 GNUBraceStyle); 11845 11846 verifyFormat("enum X\n" 11847 "{\n" 11848 " Y = 0,\n" 11849 "}\n", 11850 GNUBraceStyle); 11851 11852 verifyFormat("@interface BSApplicationController ()\n" 11853 "{\n" 11854 "@private\n" 11855 " id _extraIvar;\n" 11856 "}\n" 11857 "@end\n", 11858 GNUBraceStyle); 11859 11860 verifyFormat("#ifdef _DEBUG\n" 11861 "int foo(int i = 0)\n" 11862 "#else\n" 11863 "int foo(int i = 5)\n" 11864 "#endif\n" 11865 "{\n" 11866 " return i;\n" 11867 "}", 11868 GNUBraceStyle); 11869 11870 verifyFormat("void foo() {}\n" 11871 "void bar()\n" 11872 "#ifdef _DEBUG\n" 11873 "{\n" 11874 " foo();\n" 11875 "}\n" 11876 "#else\n" 11877 "{\n" 11878 "}\n" 11879 "#endif", 11880 GNUBraceStyle); 11881 11882 verifyFormat("void foobar() { int i = 5; }\n" 11883 "#ifdef _DEBUG\n" 11884 "void bar() {}\n" 11885 "#else\n" 11886 "void bar() { foobar(); }\n" 11887 "#endif", 11888 GNUBraceStyle); 11889 } 11890 11891 TEST_F(FormatTest, WebKitBraceBreaking) { 11892 FormatStyle WebKitBraceStyle = getLLVMStyle(); 11893 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit; 11894 WebKitBraceStyle.FixNamespaceComments = false; 11895 verifyFormat("namespace a {\n" 11896 "class A {\n" 11897 " void f()\n" 11898 " {\n" 11899 " if (true) {\n" 11900 " a();\n" 11901 " b();\n" 11902 " }\n" 11903 " }\n" 11904 " void g() { return; }\n" 11905 "};\n" 11906 "enum E {\n" 11907 " A,\n" 11908 " // foo\n" 11909 " B,\n" 11910 " C\n" 11911 "};\n" 11912 "struct B {\n" 11913 " int x;\n" 11914 "};\n" 11915 "}\n", 11916 WebKitBraceStyle); 11917 verifyFormat("struct S {\n" 11918 " int Type;\n" 11919 " union {\n" 11920 " int x;\n" 11921 " double y;\n" 11922 " } Value;\n" 11923 " class C {\n" 11924 " MyFavoriteType Value;\n" 11925 " } Class;\n" 11926 "};\n", 11927 WebKitBraceStyle); 11928 } 11929 11930 TEST_F(FormatTest, CatchExceptionReferenceBinding) { 11931 verifyFormat("void f() {\n" 11932 " try {\n" 11933 " } catch (const Exception &e) {\n" 11934 " }\n" 11935 "}\n", 11936 getLLVMStyle()); 11937 } 11938 11939 TEST_F(FormatTest, UnderstandsPragmas) { 11940 verifyFormat("#pragma omp reduction(| : var)"); 11941 verifyFormat("#pragma omp reduction(+ : var)"); 11942 11943 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string " 11944 "(including parentheses).", 11945 format("#pragma mark Any non-hyphenated or hyphenated string " 11946 "(including parentheses).")); 11947 } 11948 11949 TEST_F(FormatTest, UnderstandPragmaOption) { 11950 verifyFormat("#pragma option -C -A"); 11951 11952 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A")); 11953 } 11954 11955 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) { 11956 FormatStyle Style = getLLVMStyle(); 11957 Style.ColumnLimit = 20; 11958 11959 // See PR41213 11960 EXPECT_EQ("/*\n" 11961 " *\t9012345\n" 11962 " * /8901\n" 11963 " */", 11964 format("/*\n" 11965 " *\t9012345 /8901\n" 11966 " */", 11967 Style)); 11968 EXPECT_EQ("/*\n" 11969 " *345678\n" 11970 " *\t/8901\n" 11971 " */", 11972 format("/*\n" 11973 " *345678\t/8901\n" 11974 " */", 11975 Style)); 11976 11977 verifyFormat("int a; // the\n" 11978 " // comment", 11979 Style); 11980 EXPECT_EQ("int a; /* first line\n" 11981 " * second\n" 11982 " * line third\n" 11983 " * line\n" 11984 " */", 11985 format("int a; /* first line\n" 11986 " * second\n" 11987 " * line third\n" 11988 " * line\n" 11989 " */", 11990 Style)); 11991 EXPECT_EQ("int a; // first line\n" 11992 " // second\n" 11993 " // line third\n" 11994 " // line", 11995 format("int a; // first line\n" 11996 " // second line\n" 11997 " // third line", 11998 Style)); 11999 12000 Style.PenaltyExcessCharacter = 90; 12001 verifyFormat("int a; // the comment", Style); 12002 EXPECT_EQ("int a; // the comment\n" 12003 " // aaa", 12004 format("int a; // the comment aaa", Style)); 12005 EXPECT_EQ("int a; /* first line\n" 12006 " * second line\n" 12007 " * third line\n" 12008 " */", 12009 format("int a; /* first line\n" 12010 " * second line\n" 12011 " * third line\n" 12012 " */", 12013 Style)); 12014 EXPECT_EQ("int a; // first line\n" 12015 " // second line\n" 12016 " // third line", 12017 format("int a; // first line\n" 12018 " // second line\n" 12019 " // third line", 12020 Style)); 12021 // FIXME: Investigate why this is not getting the same layout as the test 12022 // above. 12023 EXPECT_EQ("int a; /* first line\n" 12024 " * second line\n" 12025 " * third line\n" 12026 " */", 12027 format("int a; /* first line second line third line" 12028 "\n*/", 12029 Style)); 12030 12031 EXPECT_EQ("// foo bar baz bazfoo\n" 12032 "// foo bar foo bar\n", 12033 format("// foo bar baz bazfoo\n" 12034 "// foo bar foo bar\n", 12035 Style)); 12036 EXPECT_EQ("// foo bar baz bazfoo\n" 12037 "// foo bar foo bar\n", 12038 format("// foo bar baz bazfoo\n" 12039 "// foo bar foo bar\n", 12040 Style)); 12041 12042 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the 12043 // next one. 12044 EXPECT_EQ("// foo bar baz bazfoo\n" 12045 "// bar foo bar\n", 12046 format("// foo bar baz bazfoo bar\n" 12047 "// foo bar\n", 12048 Style)); 12049 12050 EXPECT_EQ("// foo bar baz bazfoo\n" 12051 "// foo bar baz bazfoo\n" 12052 "// bar foo bar\n", 12053 format("// foo bar baz bazfoo\n" 12054 "// foo bar baz bazfoo bar\n" 12055 "// foo bar\n", 12056 Style)); 12057 12058 EXPECT_EQ("// foo bar baz bazfoo\n" 12059 "// foo bar baz bazfoo\n" 12060 "// bar foo bar\n", 12061 format("// foo bar baz bazfoo\n" 12062 "// foo bar baz bazfoo bar\n" 12063 "// foo bar\n", 12064 Style)); 12065 12066 // Make sure we do not keep protruding characters if strict mode reflow is 12067 // cheaper than keeping protruding characters. 12068 Style.ColumnLimit = 21; 12069 EXPECT_EQ( 12070 "// foo foo foo foo\n" 12071 "// foo foo foo foo\n" 12072 "// foo foo foo foo\n", 12073 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style)); 12074 12075 EXPECT_EQ("int a = /* long block\n" 12076 " comment */\n" 12077 " 42;", 12078 format("int a = /* long block comment */ 42;", Style)); 12079 } 12080 12081 #define EXPECT_ALL_STYLES_EQUAL(Styles) \ 12082 for (size_t i = 1; i < Styles.size(); ++i) \ 12083 EXPECT_EQ(Styles[0], Styles[i]) \ 12084 << "Style #" << i << " of " << Styles.size() << " differs from Style #0" 12085 12086 TEST_F(FormatTest, GetsPredefinedStyleByName) { 12087 SmallVector<FormatStyle, 3> Styles; 12088 Styles.resize(3); 12089 12090 Styles[0] = getLLVMStyle(); 12091 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1])); 12092 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2])); 12093 EXPECT_ALL_STYLES_EQUAL(Styles); 12094 12095 Styles[0] = getGoogleStyle(); 12096 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1])); 12097 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2])); 12098 EXPECT_ALL_STYLES_EQUAL(Styles); 12099 12100 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12101 EXPECT_TRUE( 12102 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1])); 12103 EXPECT_TRUE( 12104 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2])); 12105 EXPECT_ALL_STYLES_EQUAL(Styles); 12106 12107 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp); 12108 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1])); 12109 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2])); 12110 EXPECT_ALL_STYLES_EQUAL(Styles); 12111 12112 Styles[0] = getMozillaStyle(); 12113 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1])); 12114 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2])); 12115 EXPECT_ALL_STYLES_EQUAL(Styles); 12116 12117 Styles[0] = getWebKitStyle(); 12118 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1])); 12119 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); 12120 EXPECT_ALL_STYLES_EQUAL(Styles); 12121 12122 Styles[0] = getGNUStyle(); 12123 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); 12124 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); 12125 EXPECT_ALL_STYLES_EQUAL(Styles); 12126 12127 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); 12128 } 12129 12130 TEST_F(FormatTest, GetsCorrectBasedOnStyle) { 12131 SmallVector<FormatStyle, 8> Styles; 12132 Styles.resize(2); 12133 12134 Styles[0] = getGoogleStyle(); 12135 Styles[1] = getLLVMStyle(); 12136 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12137 EXPECT_ALL_STYLES_EQUAL(Styles); 12138 12139 Styles.resize(5); 12140 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript); 12141 Styles[1] = getLLVMStyle(); 12142 Styles[1].Language = FormatStyle::LK_JavaScript; 12143 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value()); 12144 12145 Styles[2] = getLLVMStyle(); 12146 Styles[2].Language = FormatStyle::LK_JavaScript; 12147 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n" 12148 "BasedOnStyle: Google", 12149 &Styles[2]) 12150 .value()); 12151 12152 Styles[3] = getLLVMStyle(); 12153 Styles[3].Language = FormatStyle::LK_JavaScript; 12154 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n" 12155 "Language: JavaScript", 12156 &Styles[3]) 12157 .value()); 12158 12159 Styles[4] = getLLVMStyle(); 12160 Styles[4].Language = FormatStyle::LK_JavaScript; 12161 EXPECT_EQ(0, parseConfiguration("---\n" 12162 "BasedOnStyle: LLVM\n" 12163 "IndentWidth: 123\n" 12164 "---\n" 12165 "BasedOnStyle: Google\n" 12166 "Language: JavaScript", 12167 &Styles[4]) 12168 .value()); 12169 EXPECT_ALL_STYLES_EQUAL(Styles); 12170 } 12171 12172 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ 12173 Style.FIELD = false; \ 12174 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ 12175 EXPECT_TRUE(Style.FIELD); \ 12176 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ 12177 EXPECT_FALSE(Style.FIELD); 12178 12179 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) 12180 12181 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \ 12182 Style.STRUCT.FIELD = false; \ 12183 EXPECT_EQ(0, \ 12184 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \ 12185 .value()); \ 12186 EXPECT_TRUE(Style.STRUCT.FIELD); \ 12187 EXPECT_EQ(0, \ 12188 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \ 12189 .value()); \ 12190 EXPECT_FALSE(Style.STRUCT.FIELD); 12191 12192 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \ 12193 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD) 12194 12195 #define CHECK_PARSE(TEXT, FIELD, VALUE) \ 12196 EXPECT_NE(VALUE, Style.FIELD); \ 12197 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ 12198 EXPECT_EQ(VALUE, Style.FIELD) 12199 12200 TEST_F(FormatTest, ParsesConfigurationBools) { 12201 FormatStyle Style = {}; 12202 Style.Language = FormatStyle::LK_Cpp; 12203 CHECK_PARSE_BOOL(AlignOperands); 12204 CHECK_PARSE_BOOL(AlignTrailingComments); 12205 CHECK_PARSE_BOOL(AlignConsecutiveAssignments); 12206 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations); 12207 CHECK_PARSE_BOOL(AlignConsecutiveMacros); 12208 CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine); 12209 CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine); 12210 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); 12211 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); 12212 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); 12213 CHECK_PARSE_BOOL(BinPackArguments); 12214 CHECK_PARSE_BOOL(BinPackParameters); 12215 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); 12216 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); 12217 CHECK_PARSE_BOOL(BreakStringLiterals); 12218 CHECK_PARSE_BOOL(CompactNamespaces); 12219 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); 12220 CHECK_PARSE_BOOL(DerivePointerAlignment); 12221 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); 12222 CHECK_PARSE_BOOL(DisableFormat); 12223 CHECK_PARSE_BOOL(IndentCaseLabels); 12224 CHECK_PARSE_BOOL(IndentGotoLabels); 12225 CHECK_PARSE_BOOL(IndentWrappedFunctionNames); 12226 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); 12227 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); 12228 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); 12229 CHECK_PARSE_BOOL(Cpp11BracedListStyle); 12230 CHECK_PARSE_BOOL(ReflowComments); 12231 CHECK_PARSE_BOOL(SortIncludes); 12232 CHECK_PARSE_BOOL(SortUsingDeclarations); 12233 CHECK_PARSE_BOOL(SpacesInParentheses); 12234 CHECK_PARSE_BOOL(SpacesInSquareBrackets); 12235 CHECK_PARSE_BOOL(SpacesInAngles); 12236 CHECK_PARSE_BOOL(SpaceInEmptyBlock); 12237 CHECK_PARSE_BOOL(SpaceInEmptyParentheses); 12238 CHECK_PARSE_BOOL(SpacesInContainerLiterals); 12239 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); 12240 CHECK_PARSE_BOOL(SpaceAfterCStyleCast); 12241 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword); 12242 CHECK_PARSE_BOOL(SpaceAfterLogicalNot); 12243 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); 12244 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList); 12245 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon); 12246 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon); 12247 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon); 12248 12249 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel); 12250 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass); 12251 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement); 12252 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum); 12253 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction); 12254 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace); 12255 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration); 12256 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct); 12257 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion); 12258 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock); 12259 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch); 12260 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse); 12261 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces); 12262 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction); 12263 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord); 12264 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace); 12265 } 12266 12267 #undef CHECK_PARSE_BOOL 12268 12269 TEST_F(FormatTest, ParsesConfiguration) { 12270 FormatStyle Style = {}; 12271 Style.Language = FormatStyle::LK_Cpp; 12272 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); 12273 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", 12274 ConstructorInitializerIndentWidth, 1234u); 12275 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); 12276 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); 12277 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); 12278 CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u); 12279 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", 12280 PenaltyBreakBeforeFirstCallParameter, 1234u); 12281 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", 12282 PenaltyBreakTemplateDeclaration, 1234u); 12283 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); 12284 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", 12285 PenaltyReturnTypeOnItsOwnLine, 1234u); 12286 CHECK_PARSE("SpacesBeforeTrailingComments: 1234", 12287 SpacesBeforeTrailingComments, 1234u); 12288 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u); 12289 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); 12290 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$"); 12291 12292 Style.PointerAlignment = FormatStyle::PAS_Middle; 12293 CHECK_PARSE("PointerAlignment: Left", PointerAlignment, 12294 FormatStyle::PAS_Left); 12295 CHECK_PARSE("PointerAlignment: Right", PointerAlignment, 12296 FormatStyle::PAS_Right); 12297 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, 12298 FormatStyle::PAS_Middle); 12299 // For backward compatibility: 12300 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, 12301 FormatStyle::PAS_Left); 12302 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, 12303 FormatStyle::PAS_Right); 12304 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, 12305 FormatStyle::PAS_Middle); 12306 12307 Style.Standard = FormatStyle::LS_Auto; 12308 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); 12309 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11); 12310 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03); 12311 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); 12312 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); 12313 12314 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; 12315 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", 12316 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); 12317 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, 12318 FormatStyle::BOS_None); 12319 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, 12320 FormatStyle::BOS_All); 12321 // For backward compatibility: 12322 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, 12323 FormatStyle::BOS_None); 12324 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, 12325 FormatStyle::BOS_All); 12326 12327 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon; 12328 CHECK_PARSE("BreakConstructorInitializers: BeforeComma", 12329 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12330 CHECK_PARSE("BreakConstructorInitializers: AfterColon", 12331 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon); 12332 CHECK_PARSE("BreakConstructorInitializers: BeforeColon", 12333 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon); 12334 // For backward compatibility: 12335 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true", 12336 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma); 12337 12338 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon; 12339 CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList, 12340 FormatStyle::BILS_BeforeComma); 12341 CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList, 12342 FormatStyle::BILS_AfterColon); 12343 CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList, 12344 FormatStyle::BILS_BeforeColon); 12345 // For backward compatibility: 12346 CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList, 12347 FormatStyle::BILS_BeforeComma); 12348 12349 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12350 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, 12351 FormatStyle::BAS_Align); 12352 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, 12353 FormatStyle::BAS_DontAlign); 12354 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, 12355 FormatStyle::BAS_AlwaysBreak); 12356 // For backward compatibility: 12357 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, 12358 FormatStyle::BAS_DontAlign); 12359 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, 12360 FormatStyle::BAS_Align); 12361 12362 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left; 12363 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, 12364 FormatStyle::ENAS_DontAlign); 12365 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines, 12366 FormatStyle::ENAS_Left); 12367 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines, 12368 FormatStyle::ENAS_Right); 12369 // For backward compatibility: 12370 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines, 12371 FormatStyle::ENAS_Left); 12372 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines, 12373 FormatStyle::ENAS_Right); 12374 12375 Style.UseTab = FormatStyle::UT_ForIndentation; 12376 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); 12377 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); 12378 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); 12379 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab, 12380 FormatStyle::UT_ForContinuationAndIndentation); 12381 // For backward compatibility: 12382 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); 12383 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); 12384 12385 Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty; 12386 CHECK_PARSE("AllowShortBlocksOnASingleLine: Never", 12387 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12388 CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty", 12389 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty); 12390 CHECK_PARSE("AllowShortBlocksOnASingleLine: Always", 12391 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12392 // For backward compatibility: 12393 CHECK_PARSE("AllowShortBlocksOnASingleLine: false", 12394 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never); 12395 CHECK_PARSE("AllowShortBlocksOnASingleLine: true", 12396 AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always); 12397 12398 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; 12399 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", 12400 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12401 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", 12402 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); 12403 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", 12404 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); 12405 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", 12406 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12407 // For backward compatibility: 12408 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", 12409 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); 12410 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", 12411 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); 12412 12413 Style.SpaceBeforeParens = FormatStyle::SBPO_Always; 12414 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, 12415 FormatStyle::SBPO_Never); 12416 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, 12417 FormatStyle::SBPO_Always); 12418 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, 12419 FormatStyle::SBPO_ControlStatements); 12420 CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens, 12421 FormatStyle::SBPO_NonEmptyParentheses); 12422 // For backward compatibility: 12423 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, 12424 FormatStyle::SBPO_Never); 12425 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, 12426 FormatStyle::SBPO_ControlStatements); 12427 12428 Style.ColumnLimit = 123; 12429 FormatStyle BaseStyle = getLLVMStyle(); 12430 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit); 12431 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u); 12432 12433 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup; 12434 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces, 12435 FormatStyle::BS_Attach); 12436 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces, 12437 FormatStyle::BS_Linux); 12438 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces, 12439 FormatStyle::BS_Mozilla); 12440 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces, 12441 FormatStyle::BS_Stroustrup); 12442 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces, 12443 FormatStyle::BS_Allman); 12444 CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces, 12445 FormatStyle::BS_Whitesmiths); 12446 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU); 12447 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces, 12448 FormatStyle::BS_WebKit); 12449 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces, 12450 FormatStyle::BS_Custom); 12451 12452 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All; 12453 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType, 12454 FormatStyle::RTBS_None); 12455 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType, 12456 FormatStyle::RTBS_All); 12457 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", 12458 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel); 12459 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions", 12460 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions); 12461 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions", 12462 AlwaysBreakAfterReturnType, 12463 FormatStyle::RTBS_TopLevelDefinitions); 12464 12465 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes; 12466 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", 12467 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No); 12468 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", 12469 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12470 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", 12471 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12472 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", 12473 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine); 12474 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", 12475 AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes); 12476 12477 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All; 12478 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None", 12479 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None); 12480 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All", 12481 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All); 12482 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel", 12483 AlwaysBreakAfterDefinitionReturnType, 12484 FormatStyle::DRTBS_TopLevel); 12485 12486 Style.NamespaceIndentation = FormatStyle::NI_All; 12487 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation, 12488 FormatStyle::NI_None); 12489 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation, 12490 FormatStyle::NI_Inner); 12491 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation, 12492 FormatStyle::NI_All); 12493 12494 Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always; 12495 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never", 12496 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12497 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse", 12498 AllowShortIfStatementsOnASingleLine, 12499 FormatStyle::SIS_WithoutElse); 12500 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always", 12501 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always); 12502 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false", 12503 AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never); 12504 CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true", 12505 AllowShortIfStatementsOnASingleLine, 12506 FormatStyle::SIS_WithoutElse); 12507 12508 // FIXME: This is required because parsing a configuration simply overwrites 12509 // the first N elements of the list instead of resetting it. 12510 Style.ForEachMacros.clear(); 12511 std::vector<std::string> BoostForeach; 12512 BoostForeach.push_back("BOOST_FOREACH"); 12513 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach); 12514 std::vector<std::string> BoostAndQForeach; 12515 BoostAndQForeach.push_back("BOOST_FOREACH"); 12516 BoostAndQForeach.push_back("Q_FOREACH"); 12517 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros, 12518 BoostAndQForeach); 12519 12520 Style.StatementMacros.clear(); 12521 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros, 12522 std::vector<std::string>{"QUNUSED"}); 12523 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros, 12524 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"})); 12525 12526 Style.NamespaceMacros.clear(); 12527 CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros, 12528 std::vector<std::string>{"TESTSUITE"}); 12529 CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros, 12530 std::vector<std::string>({"TESTSUITE", "SUITE"})); 12531 12532 Style.IncludeStyle.IncludeCategories.clear(); 12533 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = { 12534 {"abc/.*", 2, 0}, {".*", 1, 0}}; 12535 CHECK_PARSE("IncludeCategories:\n" 12536 " - Regex: abc/.*\n" 12537 " Priority: 2\n" 12538 " - Regex: .*\n" 12539 " Priority: 1", 12540 IncludeStyle.IncludeCategories, ExpectedCategories); 12541 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex, 12542 "abc$"); 12543 12544 Style.RawStringFormats.clear(); 12545 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = { 12546 { 12547 FormatStyle::LK_TextProto, 12548 {"pb", "proto"}, 12549 {"PARSE_TEXT_PROTO"}, 12550 /*CanonicalDelimiter=*/"", 12551 "llvm", 12552 }, 12553 { 12554 FormatStyle::LK_Cpp, 12555 {"cc", "cpp"}, 12556 {"C_CODEBLOCK", "CPPEVAL"}, 12557 /*CanonicalDelimiter=*/"cc", 12558 /*BasedOnStyle=*/"", 12559 }, 12560 }; 12561 12562 CHECK_PARSE("RawStringFormats:\n" 12563 " - Language: TextProto\n" 12564 " Delimiters:\n" 12565 " - 'pb'\n" 12566 " - 'proto'\n" 12567 " EnclosingFunctions:\n" 12568 " - 'PARSE_TEXT_PROTO'\n" 12569 " BasedOnStyle: llvm\n" 12570 " - Language: Cpp\n" 12571 " Delimiters:\n" 12572 " - 'cc'\n" 12573 " - 'cpp'\n" 12574 " EnclosingFunctions:\n" 12575 " - 'C_CODEBLOCK'\n" 12576 " - 'CPPEVAL'\n" 12577 " CanonicalDelimiter: 'cc'", 12578 RawStringFormats, ExpectedRawStringFormats); 12579 } 12580 12581 TEST_F(FormatTest, ParsesConfigurationWithLanguages) { 12582 FormatStyle Style = {}; 12583 Style.Language = FormatStyle::LK_Cpp; 12584 CHECK_PARSE("Language: Cpp\n" 12585 "IndentWidth: 12", 12586 IndentWidth, 12u); 12587 EXPECT_EQ(parseConfiguration("Language: JavaScript\n" 12588 "IndentWidth: 34", 12589 &Style), 12590 ParseError::Unsuitable); 12591 EXPECT_EQ(12u, Style.IndentWidth); 12592 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12593 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12594 12595 Style.Language = FormatStyle::LK_JavaScript; 12596 CHECK_PARSE("Language: JavaScript\n" 12597 "IndentWidth: 12", 12598 IndentWidth, 12u); 12599 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u); 12600 EXPECT_EQ(parseConfiguration("Language: Cpp\n" 12601 "IndentWidth: 34", 12602 &Style), 12603 ParseError::Unsuitable); 12604 EXPECT_EQ(23u, Style.IndentWidth); 12605 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u); 12606 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12607 12608 CHECK_PARSE("BasedOnStyle: LLVM\n" 12609 "IndentWidth: 67", 12610 IndentWidth, 67u); 12611 12612 CHECK_PARSE("---\n" 12613 "Language: JavaScript\n" 12614 "IndentWidth: 12\n" 12615 "---\n" 12616 "Language: Cpp\n" 12617 "IndentWidth: 34\n" 12618 "...\n", 12619 IndentWidth, 12u); 12620 12621 Style.Language = FormatStyle::LK_Cpp; 12622 CHECK_PARSE("---\n" 12623 "Language: JavaScript\n" 12624 "IndentWidth: 12\n" 12625 "---\n" 12626 "Language: Cpp\n" 12627 "IndentWidth: 34\n" 12628 "...\n", 12629 IndentWidth, 34u); 12630 CHECK_PARSE("---\n" 12631 "IndentWidth: 78\n" 12632 "---\n" 12633 "Language: JavaScript\n" 12634 "IndentWidth: 56\n" 12635 "...\n", 12636 IndentWidth, 78u); 12637 12638 Style.ColumnLimit = 123; 12639 Style.IndentWidth = 234; 12640 Style.BreakBeforeBraces = FormatStyle::BS_Linux; 12641 Style.TabWidth = 345; 12642 EXPECT_FALSE(parseConfiguration("---\n" 12643 "IndentWidth: 456\n" 12644 "BreakBeforeBraces: Allman\n" 12645 "---\n" 12646 "Language: JavaScript\n" 12647 "IndentWidth: 111\n" 12648 "TabWidth: 111\n" 12649 "---\n" 12650 "Language: Cpp\n" 12651 "BreakBeforeBraces: Stroustrup\n" 12652 "TabWidth: 789\n" 12653 "...\n", 12654 &Style)); 12655 EXPECT_EQ(123u, Style.ColumnLimit); 12656 EXPECT_EQ(456u, Style.IndentWidth); 12657 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces); 12658 EXPECT_EQ(789u, Style.TabWidth); 12659 12660 EXPECT_EQ(parseConfiguration("---\n" 12661 "Language: JavaScript\n" 12662 "IndentWidth: 56\n" 12663 "---\n" 12664 "IndentWidth: 78\n" 12665 "...\n", 12666 &Style), 12667 ParseError::Error); 12668 EXPECT_EQ(parseConfiguration("---\n" 12669 "Language: JavaScript\n" 12670 "IndentWidth: 56\n" 12671 "---\n" 12672 "Language: JavaScript\n" 12673 "IndentWidth: 78\n" 12674 "...\n", 12675 &Style), 12676 ParseError::Error); 12677 12678 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language); 12679 } 12680 12681 #undef CHECK_PARSE 12682 12683 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { 12684 FormatStyle Style = {}; 12685 Style.Language = FormatStyle::LK_JavaScript; 12686 Style.BreakBeforeTernaryOperators = true; 12687 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value()); 12688 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12689 12690 Style.BreakBeforeTernaryOperators = true; 12691 EXPECT_EQ(0, parseConfiguration("---\n" 12692 "BasedOnStyle: Google\n" 12693 "---\n" 12694 "Language: JavaScript\n" 12695 "IndentWidth: 76\n" 12696 "...\n", 12697 &Style) 12698 .value()); 12699 EXPECT_FALSE(Style.BreakBeforeTernaryOperators); 12700 EXPECT_EQ(76u, Style.IndentWidth); 12701 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language); 12702 } 12703 12704 TEST_F(FormatTest, ConfigurationRoundTripTest) { 12705 FormatStyle Style = getLLVMStyle(); 12706 std::string YAML = configurationAsText(Style); 12707 FormatStyle ParsedStyle = {}; 12708 ParsedStyle.Language = FormatStyle::LK_Cpp; 12709 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value()); 12710 EXPECT_EQ(Style, ParsedStyle); 12711 } 12712 12713 TEST_F(FormatTest, WorksFor8bitEncodings) { 12714 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n" 12715 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n" 12716 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n" 12717 "\"\xef\xee\xf0\xf3...\"", 12718 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 " 12719 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe " 12720 "\xef\xee\xf0\xf3...\"", 12721 getLLVMStyleWithColumns(12))); 12722 } 12723 12724 TEST_F(FormatTest, HandlesUTF8BOM) { 12725 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf")); 12726 EXPECT_EQ("\xef\xbb\xbf#include <iostream>", 12727 format("\xef\xbb\xbf#include <iostream>")); 12728 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>", 12729 format("\xef\xbb\xbf\n#include <iostream>")); 12730 } 12731 12732 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers. 12733 #if !defined(_MSC_VER) 12734 12735 TEST_F(FormatTest, CountsUTF8CharactersProperly) { 12736 verifyFormat("\"Однажды в студёную зимнюю пору...\"", 12737 getLLVMStyleWithColumns(35)); 12738 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"", 12739 getLLVMStyleWithColumns(31)); 12740 verifyFormat("// Однажды в студёную зимнюю пору...", 12741 getLLVMStyleWithColumns(36)); 12742 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32)); 12743 verifyFormat("/* Однажды в студёную зимнюю пору... */", 12744 getLLVMStyleWithColumns(39)); 12745 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */", 12746 getLLVMStyleWithColumns(35)); 12747 } 12748 12749 TEST_F(FormatTest, SplitsUTF8Strings) { 12750 // Non-printable characters' width is currently considered to be the length in 12751 // bytes in UTF8. The characters can be displayed in very different manner 12752 // (zero-width, single width with a substitution glyph, expanded to their code 12753 // (e.g. "<8d>"), so there's no single correct way to handle them. 12754 EXPECT_EQ("\"aaaaÄ\"\n" 12755 "\"\xc2\x8d\";", 12756 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12757 EXPECT_EQ("\"aaaaaaaÄ\"\n" 12758 "\"\xc2\x8d\";", 12759 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10))); 12760 EXPECT_EQ("\"Однажды, в \"\n" 12761 "\"студёную \"\n" 12762 "\"зимнюю \"\n" 12763 "\"пору,\"", 12764 format("\"Однажды, в студёную зимнюю пору,\"", 12765 getLLVMStyleWithColumns(13))); 12766 EXPECT_EQ( 12767 "\"一 二 三 \"\n" 12768 "\"四 五六 \"\n" 12769 "\"七 八 九 \"\n" 12770 "\"十\"", 12771 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11))); 12772 EXPECT_EQ("\"一\t\"\n" 12773 "\"二 \t\"\n" 12774 "\"三 四 \"\n" 12775 "\"五\t\"\n" 12776 "\"六 \t\"\n" 12777 "\"七 \"\n" 12778 "\"八九十\tqq\"", 12779 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"", 12780 getLLVMStyleWithColumns(11))); 12781 12782 // UTF8 character in an escape sequence. 12783 EXPECT_EQ("\"aaaaaa\"\n" 12784 "\"\\\xC2\x8D\"", 12785 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10))); 12786 } 12787 12788 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) { 12789 EXPECT_EQ("const char *sssss =\n" 12790 " \"一二三四五六七八\\\n" 12791 " 九 十\";", 12792 format("const char *sssss = \"一二三四五六七八\\\n" 12793 " 九 十\";", 12794 getLLVMStyleWithColumns(30))); 12795 } 12796 12797 TEST_F(FormatTest, SplitsUTF8LineComments) { 12798 EXPECT_EQ("// aaaaÄ\xc2\x8d", 12799 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10))); 12800 EXPECT_EQ("// Я из лесу\n" 12801 "// вышел; был\n" 12802 "// сильный\n" 12803 "// мороз.", 12804 format("// Я из лесу вышел; был сильный мороз.", 12805 getLLVMStyleWithColumns(13))); 12806 EXPECT_EQ("// 一二三\n" 12807 "// 四五六七\n" 12808 "// 八 九\n" 12809 "// 十", 12810 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9))); 12811 } 12812 12813 TEST_F(FormatTest, SplitsUTF8BlockComments) { 12814 EXPECT_EQ("/* Гляжу,\n" 12815 " * поднимается\n" 12816 " * медленно в\n" 12817 " * гору\n" 12818 " * Лошадка,\n" 12819 " * везущая\n" 12820 " * хворосту\n" 12821 " * воз. */", 12822 format("/* Гляжу, поднимается медленно в гору\n" 12823 " * Лошадка, везущая хворосту воз. */", 12824 getLLVMStyleWithColumns(13))); 12825 EXPECT_EQ( 12826 "/* 一二三\n" 12827 " * 四五六七\n" 12828 " * 八 九\n" 12829 " * 十 */", 12830 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9))); 12831 EXPECT_EQ("/* \n" 12832 " * \n" 12833 " * - */", 12834 format("/* - */", getLLVMStyleWithColumns(12))); 12835 } 12836 12837 #endif // _MSC_VER 12838 12839 TEST_F(FormatTest, ConstructorInitializerIndentWidth) { 12840 FormatStyle Style = getLLVMStyle(); 12841 12842 Style.ConstructorInitializerIndentWidth = 4; 12843 verifyFormat( 12844 "SomeClass::Constructor()\n" 12845 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12846 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12847 Style); 12848 12849 Style.ConstructorInitializerIndentWidth = 2; 12850 verifyFormat( 12851 "SomeClass::Constructor()\n" 12852 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12853 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12854 Style); 12855 12856 Style.ConstructorInitializerIndentWidth = 0; 12857 verifyFormat( 12858 "SomeClass::Constructor()\n" 12859 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" 12860 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", 12861 Style); 12862 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; 12863 verifyFormat( 12864 "SomeLongTemplateVariableName<\n" 12865 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", 12866 Style); 12867 verifyFormat("bool smaller = 1 < " 12868 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n" 12869 " " 12870 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", 12871 Style); 12872 12873 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon; 12874 verifyFormat("SomeClass::Constructor() :\n" 12875 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n" 12876 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}", 12877 Style); 12878 } 12879 12880 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { 12881 FormatStyle Style = getLLVMStyle(); 12882 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma; 12883 Style.ConstructorInitializerIndentWidth = 4; 12884 verifyFormat("SomeClass::Constructor()\n" 12885 " : a(a)\n" 12886 " , b(b)\n" 12887 " , c(c) {}", 12888 Style); 12889 verifyFormat("SomeClass::Constructor()\n" 12890 " : a(a) {}", 12891 Style); 12892 12893 Style.ColumnLimit = 0; 12894 verifyFormat("SomeClass::Constructor()\n" 12895 " : a(a) {}", 12896 Style); 12897 verifyFormat("SomeClass::Constructor() noexcept\n" 12898 " : a(a) {}", 12899 Style); 12900 verifyFormat("SomeClass::Constructor()\n" 12901 " : a(a)\n" 12902 " , b(b)\n" 12903 " , c(c) {}", 12904 Style); 12905 verifyFormat("SomeClass::Constructor()\n" 12906 " : a(a) {\n" 12907 " foo();\n" 12908 " bar();\n" 12909 "}", 12910 Style); 12911 12912 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None; 12913 verifyFormat("SomeClass::Constructor()\n" 12914 " : a(a)\n" 12915 " , b(b)\n" 12916 " , c(c) {\n}", 12917 Style); 12918 verifyFormat("SomeClass::Constructor()\n" 12919 " : a(a) {\n}", 12920 Style); 12921 12922 Style.ColumnLimit = 80; 12923 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All; 12924 Style.ConstructorInitializerIndentWidth = 2; 12925 verifyFormat("SomeClass::Constructor()\n" 12926 " : a(a)\n" 12927 " , b(b)\n" 12928 " , c(c) {}", 12929 Style); 12930 12931 Style.ConstructorInitializerIndentWidth = 0; 12932 verifyFormat("SomeClass::Constructor()\n" 12933 ": a(a)\n" 12934 ", b(b)\n" 12935 ", c(c) {}", 12936 Style); 12937 12938 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true; 12939 Style.ConstructorInitializerIndentWidth = 4; 12940 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style); 12941 verifyFormat( 12942 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n", 12943 Style); 12944 verifyFormat( 12945 "SomeClass::Constructor()\n" 12946 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}", 12947 Style); 12948 Style.ConstructorInitializerIndentWidth = 4; 12949 Style.ColumnLimit = 60; 12950 verifyFormat("SomeClass::Constructor()\n" 12951 " : aaaaaaaa(aaaaaaaa)\n" 12952 " , aaaaaaaa(aaaaaaaa)\n" 12953 " , aaaaaaaa(aaaaaaaa) {}", 12954 Style); 12955 } 12956 12957 TEST_F(FormatTest, Destructors) { 12958 verifyFormat("void F(int &i) { i.~int(); }"); 12959 verifyFormat("void F(int &i) { i->~int(); }"); 12960 } 12961 12962 TEST_F(FormatTest, FormatsWithWebKitStyle) { 12963 FormatStyle Style = getWebKitStyle(); 12964 12965 // Don't indent in outer namespaces. 12966 verifyFormat("namespace outer {\n" 12967 "int i;\n" 12968 "namespace inner {\n" 12969 " int i;\n" 12970 "} // namespace inner\n" 12971 "} // namespace outer\n" 12972 "namespace other_outer {\n" 12973 "int i;\n" 12974 "}", 12975 Style); 12976 12977 // Don't indent case labels. 12978 verifyFormat("switch (variable) {\n" 12979 "case 1:\n" 12980 "case 2:\n" 12981 " doSomething();\n" 12982 " break;\n" 12983 "default:\n" 12984 " ++variable;\n" 12985 "}", 12986 Style); 12987 12988 // Wrap before binary operators. 12989 EXPECT_EQ("void f()\n" 12990 "{\n" 12991 " if (aaaaaaaaaaaaaaaa\n" 12992 " && bbbbbbbbbbbbbbbbbbbbbbbb\n" 12993 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 12994 " return;\n" 12995 "}", 12996 format("void f() {\n" 12997 "if (aaaaaaaaaaaaaaaa\n" 12998 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n" 12999 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n" 13000 "return;\n" 13001 "}", 13002 Style)); 13003 13004 // Allow functions on a single line. 13005 verifyFormat("void f() { return; }", Style); 13006 13007 // Allow empty blocks on a single line and insert a space in empty blocks. 13008 EXPECT_EQ("void f() { }", format("void f() {}", Style)); 13009 EXPECT_EQ("while (true) { }", format("while (true) {}", Style)); 13010 // However, don't merge non-empty short loops. 13011 EXPECT_EQ("while (true) {\n" 13012 " continue;\n" 13013 "}", 13014 format("while (true) { continue; }", Style)); 13015 13016 // Constructor initializers are formatted one per line with the "," on the 13017 // new line. 13018 verifyFormat("Constructor()\n" 13019 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" 13020 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" 13021 " aaaaaaaaaaaaaa)\n" 13022 " , aaaaaaaaaaaaaaaaaaaaaaa()\n" 13023 "{\n" 13024 "}", 13025 Style); 13026 verifyFormat("SomeClass::Constructor()\n" 13027 " : a(a)\n" 13028 "{\n" 13029 "}", 13030 Style); 13031 EXPECT_EQ("SomeClass::Constructor()\n" 13032 " : a(a)\n" 13033 "{\n" 13034 "}", 13035 format("SomeClass::Constructor():a(a){}", Style)); 13036 verifyFormat("SomeClass::Constructor()\n" 13037 " : a(a)\n" 13038 " , b(b)\n" 13039 " , c(c)\n" 13040 "{\n" 13041 "}", 13042 Style); 13043 verifyFormat("SomeClass::Constructor()\n" 13044 " : a(a)\n" 13045 "{\n" 13046 " foo();\n" 13047 " bar();\n" 13048 "}", 13049 Style); 13050 13051 // Access specifiers should be aligned left. 13052 verifyFormat("class C {\n" 13053 "public:\n" 13054 " int i;\n" 13055 "};", 13056 Style); 13057 13058 // Do not align comments. 13059 verifyFormat("int a; // Do not\n" 13060 "double b; // align comments.", 13061 Style); 13062 13063 // Do not align operands. 13064 EXPECT_EQ("ASSERT(aaaa\n" 13065 " || bbbb);", 13066 format("ASSERT ( aaaa\n||bbbb);", Style)); 13067 13068 // Accept input's line breaks. 13069 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" 13070 " || bbbbbbbbbbbbbbb) {\n" 13071 " i++;\n" 13072 "}", 13073 format("if (aaaaaaaaaaaaaaa\n" 13074 "|| bbbbbbbbbbbbbbb) { i++; }", 13075 Style)); 13076 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n" 13077 " i++;\n" 13078 "}", 13079 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style)); 13080 13081 // Don't automatically break all macro definitions (llvm.org/PR17842). 13082 verifyFormat("#define aNumber 10", Style); 13083 // However, generally keep the line breaks that the user authored. 13084 EXPECT_EQ("#define aNumber \\\n" 13085 " 10", 13086 format("#define aNumber \\\n" 13087 " 10", 13088 Style)); 13089 13090 // Keep empty and one-element array literals on a single line. 13091 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n" 13092 " copyItems:YES];", 13093 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n" 13094 "copyItems:YES];", 13095 Style)); 13096 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n" 13097 " copyItems:YES];", 13098 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n" 13099 " copyItems:YES];", 13100 Style)); 13101 // FIXME: This does not seem right, there should be more indentation before 13102 // the array literal's entries. Nested blocks have the same problem. 13103 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13104 " @\"a\",\n" 13105 " @\"a\"\n" 13106 "]\n" 13107 " copyItems:YES];", 13108 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n" 13109 " @\"a\",\n" 13110 " @\"a\"\n" 13111 " ]\n" 13112 " copyItems:YES];", 13113 Style)); 13114 EXPECT_EQ( 13115 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13116 " copyItems:YES];", 13117 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n" 13118 " copyItems:YES];", 13119 Style)); 13120 13121 verifyFormat("[self.a b:c c:d];", Style); 13122 EXPECT_EQ("[self.a b:c\n" 13123 " c:d];", 13124 format("[self.a b:c\n" 13125 "c:d];", 13126 Style)); 13127 } 13128 13129 TEST_F(FormatTest, FormatsLambdas) { 13130 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n"); 13131 verifyFormat( 13132 "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n"); 13133 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n"); 13134 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n"); 13135 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n"); 13136 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n"); 13137 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n"); 13138 verifyFormat("auto c = [a = [b = 42] {}] {};\n"); 13139 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n"); 13140 verifyFormat("int x = f(*+[] {});"); 13141 verifyFormat("void f() {\n" 13142 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n" 13143 "}\n"); 13144 verifyFormat("void f() {\n" 13145 " other(x.begin(), //\n" 13146 " x.end(), //\n" 13147 " [&](int, int) { return 1; });\n" 13148 "}\n"); 13149 verifyFormat("void f() {\n" 13150 " other.other.other.other.other(\n" 13151 " x.begin(), x.end(),\n" 13152 " [something, rather](int, int, int, int, int, int, int) { " 13153 "return 1; });\n" 13154 "}\n"); 13155 verifyFormat( 13156 "void f() {\n" 13157 " other.other.other.other.other(\n" 13158 " x.begin(), x.end(),\n" 13159 " [something, rather](int, int, int, int, int, int, int) {\n" 13160 " //\n" 13161 " });\n" 13162 "}\n"); 13163 verifyFormat("SomeFunction([]() { // A cool function...\n" 13164 " return 43;\n" 13165 "});"); 13166 EXPECT_EQ("SomeFunction([]() {\n" 13167 "#define A a\n" 13168 " return 43;\n" 13169 "});", 13170 format("SomeFunction([](){\n" 13171 "#define A a\n" 13172 "return 43;\n" 13173 "});")); 13174 verifyFormat("void f() {\n" 13175 " SomeFunction([](decltype(x), A *a) {});\n" 13176 "}"); 13177 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13178 " [](const aaaaaaaaaa &a) { return a; });"); 13179 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" 13180 " SomeOtherFunctioooooooooooooooooooooooooon();\n" 13181 "});"); 13182 verifyFormat("Constructor()\n" 13183 " : Field([] { // comment\n" 13184 " int i;\n" 13185 " }) {}"); 13186 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n" 13187 " return some_parameter.size();\n" 13188 "};"); 13189 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n" 13190 " [](const string &s) { return s; };"); 13191 verifyFormat("int i = aaaaaa ? 1 //\n" 13192 " : [] {\n" 13193 " return 2; //\n" 13194 " }();"); 13195 verifyFormat("llvm::errs() << \"number of twos is \"\n" 13196 " << std::count_if(v.begin(), v.end(), [](int x) {\n" 13197 " return x == 2; // force break\n" 13198 " });"); 13199 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13200 " [=](int iiiiiiiiiiii) {\n" 13201 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n" 13202 " aaaaaaaaaaaaaaaaaaaaaaa;\n" 13203 " });", 13204 getLLVMStyleWithColumns(60)); 13205 verifyFormat("SomeFunction({[&] {\n" 13206 " // comment\n" 13207 " },\n" 13208 " [&] {\n" 13209 " // comment\n" 13210 " }});"); 13211 verifyFormat("SomeFunction({[&] {\n" 13212 " // comment\n" 13213 "}});"); 13214 verifyFormat( 13215 "virtual aaaaaaaaaaaaaaaa(\n" 13216 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n" 13217 " aaaaa aaaaaaaaa);"); 13218 13219 // Lambdas with return types. 13220 verifyFormat("int c = []() -> int { return 2; }();\n"); 13221 verifyFormat("int c = []() -> int * { return 2; }();\n"); 13222 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); 13223 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); 13224 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); 13225 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); 13226 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); 13227 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); 13228 verifyFormat("[a, a]() -> a<1> {};"); 13229 verifyFormat("[]() -> foo<5 + 2> { return {}; };"); 13230 verifyFormat("[]() -> foo<5 - 2> { return {}; };"); 13231 verifyFormat("[]() -> foo<5 / 2> { return {}; };"); 13232 verifyFormat("[]() -> foo<5 * 2> { return {}; };"); 13233 verifyFormat("[]() -> foo<5 % 2> { return {}; };"); 13234 verifyFormat("[]() -> foo<5 << 2> { return {}; };"); 13235 verifyFormat("[]() -> foo<!5> { return {}; };"); 13236 verifyFormat("[]() -> foo<~5> { return {}; };"); 13237 verifyFormat("[]() -> foo<5 | 2> { return {}; };"); 13238 verifyFormat("[]() -> foo<5 || 2> { return {}; };"); 13239 verifyFormat("[]() -> foo<5 & 2> { return {}; };"); 13240 verifyFormat("[]() -> foo<5 && 2> { return {}; };"); 13241 verifyFormat("[]() -> foo<5 == 2> { return {}; };"); 13242 verifyFormat("[]() -> foo<5 != 2> { return {}; };"); 13243 verifyFormat("[]() -> foo<5 >= 2> { return {}; };"); 13244 verifyFormat("[]() -> foo<5 <= 2> { return {}; };"); 13245 verifyFormat("[]() -> foo<5 < 2> { return {}; };"); 13246 verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };"); 13247 verifyFormat("namespace bar {\n" 13248 "// broken:\n" 13249 "auto foo{[]() -> foo<5 + 2> { return {}; }};\n" 13250 "} // namespace bar"); 13251 verifyFormat("namespace bar {\n" 13252 "// broken:\n" 13253 "auto foo{[]() -> foo<5 - 2> { return {}; }};\n" 13254 "} // namespace bar"); 13255 verifyFormat("namespace bar {\n" 13256 "// broken:\n" 13257 "auto foo{[]() -> foo<5 / 2> { return {}; }};\n" 13258 "} // namespace bar"); 13259 verifyFormat("namespace bar {\n" 13260 "// broken:\n" 13261 "auto foo{[]() -> foo<5 * 2> { return {}; }};\n" 13262 "} // namespace bar"); 13263 verifyFormat("namespace bar {\n" 13264 "// broken:\n" 13265 "auto foo{[]() -> foo<5 % 2> { return {}; }};\n" 13266 "} // namespace bar"); 13267 verifyFormat("namespace bar {\n" 13268 "// broken:\n" 13269 "auto foo{[]() -> foo<5 << 2> { return {}; }};\n" 13270 "} // namespace bar"); 13271 verifyFormat("namespace bar {\n" 13272 "// broken:\n" 13273 "auto foo{[]() -> foo<!5> { return {}; }};\n" 13274 "} // namespace bar"); 13275 verifyFormat("namespace bar {\n" 13276 "// broken:\n" 13277 "auto foo{[]() -> foo<~5> { return {}; }};\n" 13278 "} // namespace bar"); 13279 verifyFormat("namespace bar {\n" 13280 "// broken:\n" 13281 "auto foo{[]() -> foo<5 | 2> { return {}; }};\n" 13282 "} // namespace bar"); 13283 verifyFormat("namespace bar {\n" 13284 "// broken:\n" 13285 "auto foo{[]() -> foo<5 || 2> { return {}; }};\n" 13286 "} // namespace bar"); 13287 verifyFormat("namespace bar {\n" 13288 "// broken:\n" 13289 "auto foo{[]() -> foo<5 & 2> { return {}; }};\n" 13290 "} // namespace bar"); 13291 verifyFormat("namespace bar {\n" 13292 "// broken:\n" 13293 "auto foo{[]() -> foo<5 && 2> { return {}; }};\n" 13294 "} // namespace bar"); 13295 verifyFormat("namespace bar {\n" 13296 "// broken:\n" 13297 "auto foo{[]() -> foo<5 == 2> { return {}; }};\n" 13298 "} // namespace bar"); 13299 verifyFormat("namespace bar {\n" 13300 "// broken:\n" 13301 "auto foo{[]() -> foo<5 != 2> { return {}; }};\n" 13302 "} // namespace bar"); 13303 verifyFormat("namespace bar {\n" 13304 "// broken:\n" 13305 "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n" 13306 "} // namespace bar"); 13307 verifyFormat("namespace bar {\n" 13308 "// broken:\n" 13309 "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n" 13310 "} // namespace bar"); 13311 verifyFormat("namespace bar {\n" 13312 "// broken:\n" 13313 "auto foo{[]() -> foo<5 < 2> { return {}; }};\n" 13314 "} // namespace bar"); 13315 verifyFormat("namespace bar {\n" 13316 "// broken:\n" 13317 "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n" 13318 "} // namespace bar"); 13319 verifyFormat("[]() -> a<1> {};"); 13320 verifyFormat("[]() -> a<1> { ; };"); 13321 verifyFormat("[]() -> a<1> { ; }();"); 13322 verifyFormat("[a, a]() -> a<true> {};"); 13323 verifyFormat("[]() -> a<true> {};"); 13324 verifyFormat("[]() -> a<true> { ; };"); 13325 verifyFormat("[]() -> a<true> { ; }();"); 13326 verifyFormat("[a, a]() -> a<false> {};"); 13327 verifyFormat("[]() -> a<false> {};"); 13328 verifyFormat("[]() -> a<false> { ; };"); 13329 verifyFormat("[]() -> a<false> { ; }();"); 13330 verifyFormat("auto foo{[]() -> foo<false> { ; }};"); 13331 verifyFormat("namespace bar {\n" 13332 "auto foo{[]() -> foo<false> { ; }};\n" 13333 "} // namespace bar"); 13334 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" 13335 " int j) -> int {\n" 13336 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" 13337 "};"); 13338 verifyFormat( 13339 "aaaaaaaaaaaaaaaaaaaaaa(\n" 13340 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n" 13341 " return aaaaaaaaaaaaaaaaa;\n" 13342 " });", 13343 getLLVMStyleWithColumns(70)); 13344 verifyFormat("[]() //\n" 13345 " -> int {\n" 13346 " return 1; //\n" 13347 "};"); 13348 13349 // Lambdas with explicit template argument lists. 13350 verifyFormat( 13351 "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n"); 13352 13353 // Multiple lambdas in the same parentheses change indentation rules. These 13354 // lambdas are forced to start on new lines. 13355 verifyFormat("SomeFunction(\n" 13356 " []() {\n" 13357 " //\n" 13358 " },\n" 13359 " []() {\n" 13360 " //\n" 13361 " });"); 13362 13363 // A lambda passed as arg0 is always pushed to the next line. 13364 verifyFormat("SomeFunction(\n" 13365 " [this] {\n" 13366 " //\n" 13367 " },\n" 13368 " 1);\n"); 13369 13370 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like 13371 // the arg0 case above. 13372 auto Style = getGoogleStyle(); 13373 Style.BinPackArguments = false; 13374 verifyFormat("SomeFunction(\n" 13375 " a,\n" 13376 " [this] {\n" 13377 " //\n" 13378 " },\n" 13379 " b);\n", 13380 Style); 13381 verifyFormat("SomeFunction(\n" 13382 " a,\n" 13383 " [this] {\n" 13384 " //\n" 13385 " },\n" 13386 " b);\n"); 13387 13388 // A lambda with a very long line forces arg0 to be pushed out irrespective of 13389 // the BinPackArguments value (as long as the code is wide enough). 13390 verifyFormat( 13391 "something->SomeFunction(\n" 13392 " a,\n" 13393 " [this] {\n" 13394 " " 13395 "D0000000000000000000000000000000000000000000000000000000000001();\n" 13396 " },\n" 13397 " b);\n"); 13398 13399 // A multi-line lambda is pulled up as long as the introducer fits on the 13400 // previous line and there are no further args. 13401 verifyFormat("function(1, [this, that] {\n" 13402 " //\n" 13403 "});\n"); 13404 verifyFormat("function([this, that] {\n" 13405 " //\n" 13406 "});\n"); 13407 // FIXME: this format is not ideal and we should consider forcing the first 13408 // arg onto its own line. 13409 verifyFormat("function(a, b, c, //\n" 13410 " d, [this, that] {\n" 13411 " //\n" 13412 " });\n"); 13413 13414 // Multiple lambdas are treated correctly even when there is a short arg0. 13415 verifyFormat("SomeFunction(\n" 13416 " 1,\n" 13417 " [this] {\n" 13418 " //\n" 13419 " },\n" 13420 " [this] {\n" 13421 " //\n" 13422 " },\n" 13423 " 1);\n"); 13424 13425 // More complex introducers. 13426 verifyFormat("return [i, args...] {};"); 13427 13428 // Not lambdas. 13429 verifyFormat("constexpr char hello[]{\"hello\"};"); 13430 verifyFormat("double &operator[](int i) { return 0; }\n" 13431 "int i;"); 13432 verifyFormat("std::unique_ptr<int[]> foo() {}"); 13433 verifyFormat("int i = a[a][a]->f();"); 13434 verifyFormat("int i = (*b)[a]->f();"); 13435 13436 // Other corner cases. 13437 verifyFormat("void f() {\n" 13438 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n" 13439 " );\n" 13440 "}"); 13441 13442 // Lambdas created through weird macros. 13443 verifyFormat("void f() {\n" 13444 " MACRO((const AA &a) { return 1; });\n" 13445 " MACRO((AA &a) { return 1; });\n" 13446 "}"); 13447 13448 verifyFormat("if (blah_blah(whatever, whatever, [] {\n" 13449 " doo_dah();\n" 13450 " doo_dah();\n" 13451 " })) {\n" 13452 "}"); 13453 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n" 13454 " doo_dah();\n" 13455 " doo_dah();\n" 13456 " })) {\n" 13457 "}"); 13458 verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n" 13459 " doo_dah();\n" 13460 " doo_dah();\n" 13461 " })) {\n" 13462 "}"); 13463 verifyFormat("auto lambda = []() {\n" 13464 " int a = 2\n" 13465 "#if A\n" 13466 " + 2\n" 13467 "#endif\n" 13468 " ;\n" 13469 "};"); 13470 13471 // Lambdas with complex multiline introducers. 13472 verifyFormat( 13473 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 13474 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n" 13475 " -> ::std::unordered_set<\n" 13476 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n" 13477 " //\n" 13478 " });"); 13479 13480 FormatStyle DoNotMerge = getLLVMStyle(); 13481 DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None; 13482 verifyFormat("auto c = []() {\n" 13483 " return b;\n" 13484 "};", 13485 "auto c = []() { return b; };", DoNotMerge); 13486 verifyFormat("auto c = []() {\n" 13487 "};", 13488 " auto c = []() {};", DoNotMerge); 13489 13490 FormatStyle MergeEmptyOnly = getLLVMStyle(); 13491 MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty; 13492 verifyFormat("auto c = []() {\n" 13493 " return b;\n" 13494 "};", 13495 "auto c = []() {\n" 13496 " return b;\n" 13497 " };", 13498 MergeEmptyOnly); 13499 verifyFormat("auto c = []() {};", 13500 "auto c = []() {\n" 13501 "};", 13502 MergeEmptyOnly); 13503 13504 FormatStyle MergeInline = getLLVMStyle(); 13505 MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline; 13506 verifyFormat("auto c = []() {\n" 13507 " return b;\n" 13508 "};", 13509 "auto c = []() { return b; };", MergeInline); 13510 verifyFormat("function([]() { return b; })", "function([]() { return b; })", 13511 MergeInline); 13512 verifyFormat("function([]() { return b; }, a)", 13513 "function([]() { return b; }, a)", MergeInline); 13514 verifyFormat("function(a, []() { return b; })", 13515 "function(a, []() { return b; })", MergeInline); 13516 } 13517 13518 TEST_F(FormatTest, EmptyLinesInLambdas) { 13519 verifyFormat("auto lambda = []() {\n" 13520 " x(); //\n" 13521 "};", 13522 "auto lambda = []() {\n" 13523 "\n" 13524 " x(); //\n" 13525 "\n" 13526 "};"); 13527 } 13528 13529 TEST_F(FormatTest, FormatsBlocks) { 13530 FormatStyle ShortBlocks = getLLVMStyle(); 13531 ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13532 verifyFormat("int (^Block)(int, int);", ShortBlocks); 13533 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); 13534 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); 13535 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); 13536 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); 13537 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); 13538 13539 verifyFormat("foo(^{ bar(); });", ShortBlocks); 13540 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); 13541 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); 13542 13543 verifyFormat("[operation setCompletionBlock:^{\n" 13544 " [self onOperationDone];\n" 13545 "}];"); 13546 verifyFormat("int i = {[operation setCompletionBlock:^{\n" 13547 " [self onOperationDone];\n" 13548 "}]};"); 13549 verifyFormat("[operation setCompletionBlock:^(int *i) {\n" 13550 " f();\n" 13551 "}];"); 13552 verifyFormat("int a = [operation block:^int(int *i) {\n" 13553 " return 1;\n" 13554 "}];"); 13555 verifyFormat("[myObject doSomethingWith:arg1\n" 13556 " aaa:^int(int *a) {\n" 13557 " return 1;\n" 13558 " }\n" 13559 " bbb:f(a * bbbbbbbb)];"); 13560 13561 verifyFormat("[operation setCompletionBlock:^{\n" 13562 " [self.delegate newDataAvailable];\n" 13563 "}];", 13564 getLLVMStyleWithColumns(60)); 13565 verifyFormat("dispatch_async(_fileIOQueue, ^{\n" 13566 " NSString *path = [self sessionFilePath];\n" 13567 " if (path) {\n" 13568 " // ...\n" 13569 " }\n" 13570 "});"); 13571 verifyFormat("[[SessionService sharedService]\n" 13572 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13573 " if (window) {\n" 13574 " [self windowDidLoad:window];\n" 13575 " } else {\n" 13576 " [self errorLoadingWindow];\n" 13577 " }\n" 13578 " }];"); 13579 verifyFormat("void (^largeBlock)(void) = ^{\n" 13580 " // ...\n" 13581 "};\n", 13582 getLLVMStyleWithColumns(40)); 13583 verifyFormat("[[SessionService sharedService]\n" 13584 " loadWindowWithCompletionBlock: //\n" 13585 " ^(SessionWindow *window) {\n" 13586 " if (window) {\n" 13587 " [self windowDidLoad:window];\n" 13588 " } else {\n" 13589 " [self errorLoadingWindow];\n" 13590 " }\n" 13591 " }];", 13592 getLLVMStyleWithColumns(60)); 13593 verifyFormat("[myObject doSomethingWith:arg1\n" 13594 " firstBlock:^(Foo *a) {\n" 13595 " // ...\n" 13596 " int i;\n" 13597 " }\n" 13598 " secondBlock:^(Bar *b) {\n" 13599 " // ...\n" 13600 " int i;\n" 13601 " }\n" 13602 " thirdBlock:^Foo(Bar *b) {\n" 13603 " // ...\n" 13604 " int i;\n" 13605 " }];"); 13606 verifyFormat("[myObject doSomethingWith:arg1\n" 13607 " firstBlock:-1\n" 13608 " secondBlock:^(Bar *b) {\n" 13609 " // ...\n" 13610 " int i;\n" 13611 " }];"); 13612 13613 verifyFormat("f(^{\n" 13614 " @autoreleasepool {\n" 13615 " if (a) {\n" 13616 " g();\n" 13617 " }\n" 13618 " }\n" 13619 "});"); 13620 verifyFormat("Block b = ^int *(A *a, B *b) {}"); 13621 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n" 13622 "};"); 13623 13624 FormatStyle FourIndent = getLLVMStyle(); 13625 FourIndent.ObjCBlockIndentWidth = 4; 13626 verifyFormat("[operation setCompletionBlock:^{\n" 13627 " [self onOperationDone];\n" 13628 "}];", 13629 FourIndent); 13630 } 13631 13632 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) { 13633 FormatStyle ZeroColumn = getLLVMStyle(); 13634 ZeroColumn.ColumnLimit = 0; 13635 13636 verifyFormat("[[SessionService sharedService] " 13637 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13638 " if (window) {\n" 13639 " [self windowDidLoad:window];\n" 13640 " } else {\n" 13641 " [self errorLoadingWindow];\n" 13642 " }\n" 13643 "}];", 13644 ZeroColumn); 13645 EXPECT_EQ("[[SessionService sharedService]\n" 13646 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13647 " if (window) {\n" 13648 " [self windowDidLoad:window];\n" 13649 " } else {\n" 13650 " [self errorLoadingWindow];\n" 13651 " }\n" 13652 " }];", 13653 format("[[SessionService sharedService]\n" 13654 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" 13655 " if (window) {\n" 13656 " [self windowDidLoad:window];\n" 13657 " } else {\n" 13658 " [self errorLoadingWindow];\n" 13659 " }\n" 13660 "}];", 13661 ZeroColumn)); 13662 verifyFormat("[myObject doSomethingWith:arg1\n" 13663 " firstBlock:^(Foo *a) {\n" 13664 " // ...\n" 13665 " int i;\n" 13666 " }\n" 13667 " secondBlock:^(Bar *b) {\n" 13668 " // ...\n" 13669 " int i;\n" 13670 " }\n" 13671 " thirdBlock:^Foo(Bar *b) {\n" 13672 " // ...\n" 13673 " int i;\n" 13674 " }];", 13675 ZeroColumn); 13676 verifyFormat("f(^{\n" 13677 " @autoreleasepool {\n" 13678 " if (a) {\n" 13679 " g();\n" 13680 " }\n" 13681 " }\n" 13682 "});", 13683 ZeroColumn); 13684 verifyFormat("void (^largeBlock)(void) = ^{\n" 13685 " // ...\n" 13686 "};", 13687 ZeroColumn); 13688 13689 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always; 13690 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };", 13691 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13692 ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never; 13693 EXPECT_EQ("void (^largeBlock)(void) = ^{\n" 13694 " int i;\n" 13695 "};", 13696 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn)); 13697 } 13698 13699 TEST_F(FormatTest, SupportsCRLF) { 13700 EXPECT_EQ("int a;\r\n" 13701 "int b;\r\n" 13702 "int c;\r\n", 13703 format("int a;\r\n" 13704 " int b;\r\n" 13705 " int c;\r\n", 13706 getLLVMStyle())); 13707 EXPECT_EQ("int a;\r\n" 13708 "int b;\r\n" 13709 "int c;\r\n", 13710 format("int a;\r\n" 13711 " int b;\n" 13712 " int c;\r\n", 13713 getLLVMStyle())); 13714 EXPECT_EQ("int a;\n" 13715 "int b;\n" 13716 "int c;\n", 13717 format("int a;\r\n" 13718 " int b;\n" 13719 " int c;\n", 13720 getLLVMStyle())); 13721 EXPECT_EQ("\"aaaaaaa \"\r\n" 13722 "\"bbbbbbb\";\r\n", 13723 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10))); 13724 EXPECT_EQ("#define A \\\r\n" 13725 " b; \\\r\n" 13726 " c; \\\r\n" 13727 " d;\r\n", 13728 format("#define A \\\r\n" 13729 " b; \\\r\n" 13730 " c; d; \r\n", 13731 getGoogleStyle())); 13732 13733 EXPECT_EQ("/*\r\n" 13734 "multi line block comments\r\n" 13735 "should not introduce\r\n" 13736 "an extra carriage return\r\n" 13737 "*/\r\n", 13738 format("/*\r\n" 13739 "multi line block comments\r\n" 13740 "should not introduce\r\n" 13741 "an extra carriage return\r\n" 13742 "*/\r\n")); 13743 EXPECT_EQ("/*\r\n" 13744 "\r\n" 13745 "*/", 13746 format("/*\r\n" 13747 " \r\r\r\n" 13748 "*/")); 13749 } 13750 13751 TEST_F(FormatTest, MunchSemicolonAfterBlocks) { 13752 verifyFormat("MY_CLASS(C) {\n" 13753 " int i;\n" 13754 " int j;\n" 13755 "};"); 13756 } 13757 13758 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) { 13759 FormatStyle TwoIndent = getLLVMStyleWithColumns(15); 13760 TwoIndent.ContinuationIndentWidth = 2; 13761 13762 EXPECT_EQ("int i =\n" 13763 " longFunction(\n" 13764 " arg);", 13765 format("int i = longFunction(arg);", TwoIndent)); 13766 13767 FormatStyle SixIndent = getLLVMStyleWithColumns(20); 13768 SixIndent.ContinuationIndentWidth = 6; 13769 13770 EXPECT_EQ("int i =\n" 13771 " longFunction(\n" 13772 " arg);", 13773 format("int i = longFunction(arg);", SixIndent)); 13774 } 13775 13776 TEST_F(FormatTest, WrappedClosingParenthesisIndent) { 13777 FormatStyle Style = getLLVMStyle(); 13778 verifyFormat("int Foo::getter(\n" 13779 " //\n" 13780 ") const {\n" 13781 " return foo;\n" 13782 "}", 13783 Style); 13784 verifyFormat("void Foo::setter(\n" 13785 " //\n" 13786 ") {\n" 13787 " foo = 1;\n" 13788 "}", 13789 Style); 13790 } 13791 13792 TEST_F(FormatTest, SpacesInAngles) { 13793 FormatStyle Spaces = getLLVMStyle(); 13794 Spaces.SpacesInAngles = true; 13795 13796 verifyFormat("static_cast< int >(arg);", Spaces); 13797 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces); 13798 verifyFormat("f< int, float >();", Spaces); 13799 verifyFormat("template <> g() {}", Spaces); 13800 verifyFormat("template < std::vector< int > > f() {}", Spaces); 13801 verifyFormat("std::function< void(int, int) > fct;", Spaces); 13802 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }", 13803 Spaces); 13804 13805 Spaces.Standard = FormatStyle::LS_Cpp03; 13806 Spaces.SpacesInAngles = true; 13807 verifyFormat("A< A< int > >();", Spaces); 13808 13809 Spaces.SpacesInAngles = false; 13810 verifyFormat("A<A<int> >();", Spaces); 13811 13812 Spaces.Standard = FormatStyle::LS_Cpp11; 13813 Spaces.SpacesInAngles = true; 13814 verifyFormat("A< A< int > >();", Spaces); 13815 13816 Spaces.SpacesInAngles = false; 13817 verifyFormat("A<A<int>>();", Spaces); 13818 } 13819 13820 TEST_F(FormatTest, SpaceAfterTemplateKeyword) { 13821 FormatStyle Style = getLLVMStyle(); 13822 Style.SpaceAfterTemplateKeyword = false; 13823 verifyFormat("template<int> void foo();", Style); 13824 } 13825 13826 TEST_F(FormatTest, TripleAngleBrackets) { 13827 verifyFormat("f<<<1, 1>>>();"); 13828 verifyFormat("f<<<1, 1, 1, s>>>();"); 13829 verifyFormat("f<<<a, b, c, d>>>();"); 13830 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();")); 13831 verifyFormat("f<param><<<1, 1>>>();"); 13832 verifyFormat("f<1><<<1, 1>>>();"); 13833 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();")); 13834 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13835 "aaaaaaaaaaa<<<\n 1, 1>>>();"); 13836 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n" 13837 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();"); 13838 } 13839 13840 TEST_F(FormatTest, MergeLessLessAtEnd) { 13841 verifyFormat("<<"); 13842 EXPECT_EQ("< < <", format("\\\n<<<")); 13843 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13844 "aaallvm::outs() <<"); 13845 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 13846 "aaaallvm::outs()\n <<"); 13847 } 13848 13849 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) { 13850 std::string code = "#if A\n" 13851 "#if B\n" 13852 "a.\n" 13853 "#endif\n" 13854 " a = 1;\n" 13855 "#else\n" 13856 "#endif\n" 13857 "#if C\n" 13858 "#else\n" 13859 "#endif\n"; 13860 EXPECT_EQ(code, format(code)); 13861 } 13862 13863 TEST_F(FormatTest, HandleConflictMarkers) { 13864 // Git/SVN conflict markers. 13865 EXPECT_EQ("int a;\n" 13866 "void f() {\n" 13867 " callme(some(parameter1,\n" 13868 "<<<<<<< text by the vcs\n" 13869 " parameter2),\n" 13870 "||||||| text by the vcs\n" 13871 " parameter2),\n" 13872 " parameter3,\n" 13873 "======= text by the vcs\n" 13874 " parameter2, parameter3),\n" 13875 ">>>>>>> text by the vcs\n" 13876 " otherparameter);\n", 13877 format("int a;\n" 13878 "void f() {\n" 13879 " callme(some(parameter1,\n" 13880 "<<<<<<< text by the vcs\n" 13881 " parameter2),\n" 13882 "||||||| text by the vcs\n" 13883 " parameter2),\n" 13884 " parameter3,\n" 13885 "======= text by the vcs\n" 13886 " parameter2,\n" 13887 " parameter3),\n" 13888 ">>>>>>> text by the vcs\n" 13889 " otherparameter);\n")); 13890 13891 // Perforce markers. 13892 EXPECT_EQ("void f() {\n" 13893 " function(\n" 13894 ">>>> text by the vcs\n" 13895 " parameter,\n" 13896 "==== text by the vcs\n" 13897 " parameter,\n" 13898 "==== text by the vcs\n" 13899 " parameter,\n" 13900 "<<<< text by the vcs\n" 13901 " parameter);\n", 13902 format("void f() {\n" 13903 " function(\n" 13904 ">>>> text by the vcs\n" 13905 " parameter,\n" 13906 "==== text by the vcs\n" 13907 " parameter,\n" 13908 "==== text by the vcs\n" 13909 " parameter,\n" 13910 "<<<< text by the vcs\n" 13911 " parameter);\n")); 13912 13913 EXPECT_EQ("<<<<<<<\n" 13914 "|||||||\n" 13915 "=======\n" 13916 ">>>>>>>", 13917 format("<<<<<<<\n" 13918 "|||||||\n" 13919 "=======\n" 13920 ">>>>>>>")); 13921 13922 EXPECT_EQ("<<<<<<<\n" 13923 "|||||||\n" 13924 "int i;\n" 13925 "=======\n" 13926 ">>>>>>>", 13927 format("<<<<<<<\n" 13928 "|||||||\n" 13929 "int i;\n" 13930 "=======\n" 13931 ">>>>>>>")); 13932 13933 // FIXME: Handle parsing of macros around conflict markers correctly: 13934 EXPECT_EQ("#define Macro \\\n" 13935 "<<<<<<<\n" 13936 "Something \\\n" 13937 "|||||||\n" 13938 "Else \\\n" 13939 "=======\n" 13940 "Other \\\n" 13941 ">>>>>>>\n" 13942 " End int i;\n", 13943 format("#define Macro \\\n" 13944 "<<<<<<<\n" 13945 " Something \\\n" 13946 "|||||||\n" 13947 " Else \\\n" 13948 "=======\n" 13949 " Other \\\n" 13950 ">>>>>>>\n" 13951 " End\n" 13952 "int i;\n")); 13953 } 13954 13955 TEST_F(FormatTest, DisableRegions) { 13956 EXPECT_EQ("int i;\n" 13957 "// clang-format off\n" 13958 " int j;\n" 13959 "// clang-format on\n" 13960 "int k;", 13961 format(" int i;\n" 13962 " // clang-format off\n" 13963 " int j;\n" 13964 " // clang-format on\n" 13965 " int k;")); 13966 EXPECT_EQ("int i;\n" 13967 "/* clang-format off */\n" 13968 " int j;\n" 13969 "/* clang-format on */\n" 13970 "int k;", 13971 format(" int i;\n" 13972 " /* clang-format off */\n" 13973 " int j;\n" 13974 " /* clang-format on */\n" 13975 " int k;")); 13976 13977 // Don't reflow comments within disabled regions. 13978 EXPECT_EQ("// clang-format off\n" 13979 "// long long long long long long line\n" 13980 "/* clang-format on */\n" 13981 "/* long long long\n" 13982 " * long long long\n" 13983 " * line */\n" 13984 "int i;\n" 13985 "/* clang-format off */\n" 13986 "/* long long long long long long line */\n", 13987 format("// clang-format off\n" 13988 "// long long long long long long line\n" 13989 "/* clang-format on */\n" 13990 "/* long long long long long long line */\n" 13991 "int i;\n" 13992 "/* clang-format off */\n" 13993 "/* long long long long long long line */\n", 13994 getLLVMStyleWithColumns(20))); 13995 } 13996 13997 TEST_F(FormatTest, DoNotCrashOnInvalidInput) { 13998 format("? ) ="); 13999 verifyNoCrash("#define a\\\n /**/}"); 14000 } 14001 14002 TEST_F(FormatTest, FormatsTableGenCode) { 14003 FormatStyle Style = getLLVMStyle(); 14004 Style.Language = FormatStyle::LK_TableGen; 14005 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); 14006 } 14007 14008 TEST_F(FormatTest, ArrayOfTemplates) { 14009 EXPECT_EQ("auto a = new unique_ptr<int>[10];", 14010 format("auto a = new unique_ptr<int > [ 10];")); 14011 14012 FormatStyle Spaces = getLLVMStyle(); 14013 Spaces.SpacesInSquareBrackets = true; 14014 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", 14015 format("auto a = new unique_ptr<int > [10];", Spaces)); 14016 } 14017 14018 TEST_F(FormatTest, ArrayAsTemplateType) { 14019 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", 14020 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); 14021 14022 FormatStyle Spaces = getLLVMStyle(); 14023 Spaces.SpacesInSquareBrackets = true; 14024 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", 14025 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); 14026 } 14027 14028 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); } 14029 14030 TEST(FormatStyle, GetStyleWithEmptyFileName) { 14031 llvm::vfs::InMemoryFileSystem FS; 14032 auto Style1 = getStyle("file", "", "Google", "", &FS); 14033 ASSERT_TRUE((bool)Style1); 14034 ASSERT_EQ(*Style1, getGoogleStyle()); 14035 } 14036 14037 TEST(FormatStyle, GetStyleOfFile) { 14038 llvm::vfs::InMemoryFileSystem FS; 14039 // Test 1: format file in the same directory. 14040 ASSERT_TRUE( 14041 FS.addFile("/a/.clang-format", 0, 14042 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM"))); 14043 ASSERT_TRUE( 14044 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14045 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS); 14046 ASSERT_TRUE((bool)Style1); 14047 ASSERT_EQ(*Style1, getLLVMStyle()); 14048 14049 // Test 2.1: fallback to default. 14050 ASSERT_TRUE( 14051 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14052 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS); 14053 ASSERT_TRUE((bool)Style2); 14054 ASSERT_EQ(*Style2, getMozillaStyle()); 14055 14056 // Test 2.2: no format on 'none' fallback style. 14057 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14058 ASSERT_TRUE((bool)Style2); 14059 ASSERT_EQ(*Style2, getNoStyle()); 14060 14061 // Test 2.3: format if config is found with no based style while fallback is 14062 // 'none'. 14063 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0, 14064 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2"))); 14065 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS); 14066 ASSERT_TRUE((bool)Style2); 14067 ASSERT_EQ(*Style2, getLLVMStyle()); 14068 14069 // Test 2.4: format if yaml with no based style, while fallback is 'none'. 14070 Style2 = getStyle("{}", "a.h", "none", "", &FS); 14071 ASSERT_TRUE((bool)Style2); 14072 ASSERT_EQ(*Style2, getLLVMStyle()); 14073 14074 // Test 3: format file in parent directory. 14075 ASSERT_TRUE( 14076 FS.addFile("/c/.clang-format", 0, 14077 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google"))); 14078 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0, 14079 llvm::MemoryBuffer::getMemBuffer("int i;"))); 14080 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS); 14081 ASSERT_TRUE((bool)Style3); 14082 ASSERT_EQ(*Style3, getGoogleStyle()); 14083 14084 // Test 4: error on invalid fallback style 14085 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS); 14086 ASSERT_FALSE((bool)Style4); 14087 llvm::consumeError(Style4.takeError()); 14088 14089 // Test 5: error on invalid yaml on command line 14090 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS); 14091 ASSERT_FALSE((bool)Style5); 14092 llvm::consumeError(Style5.takeError()); 14093 14094 // Test 6: error on invalid style 14095 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS); 14096 ASSERT_FALSE((bool)Style6); 14097 llvm::consumeError(Style6.takeError()); 14098 14099 // Test 7: found config file, error on parsing it 14100 ASSERT_TRUE( 14101 FS.addFile("/d/.clang-format", 0, 14102 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n" 14103 "InvalidKey: InvalidValue"))); 14104 ASSERT_TRUE( 14105 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;"))); 14106 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS); 14107 ASSERT_FALSE((bool)Style7); 14108 llvm::consumeError(Style7.takeError()); 14109 14110 // Test 8: inferred per-language defaults apply. 14111 auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS); 14112 ASSERT_TRUE((bool)StyleTd); 14113 ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen)); 14114 } 14115 14116 TEST_F(ReplacementTest, FormatCodeAfterReplacements) { 14117 // Column limit is 20. 14118 std::string Code = "Type *a =\n" 14119 " new Type();\n" 14120 "g(iiiii, 0, jjjjj,\n" 14121 " 0, kkkkk, 0, mm);\n" 14122 "int bad = format ;"; 14123 std::string Expected = "auto a = new Type();\n" 14124 "g(iiiii, nullptr,\n" 14125 " jjjjj, nullptr,\n" 14126 " kkkkk, nullptr,\n" 14127 " mm);\n" 14128 "int bad = format ;"; 14129 FileID ID = Context.createInMemoryFile("format.cpp", Code); 14130 tooling::Replacements Replaces = toReplacements( 14131 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6, 14132 "auto "), 14133 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1, 14134 "nullptr"), 14135 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1, 14136 "nullptr"), 14137 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1, 14138 "nullptr")}); 14139 14140 format::FormatStyle Style = format::getLLVMStyle(); 14141 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility. 14142 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14143 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14144 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14145 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14146 EXPECT_TRUE(static_cast<bool>(Result)); 14147 EXPECT_EQ(Expected, *Result); 14148 } 14149 14150 TEST_F(ReplacementTest, SortIncludesAfterReplacement) { 14151 std::string Code = "#include \"a.h\"\n" 14152 "#include \"c.h\"\n" 14153 "\n" 14154 "int main() {\n" 14155 " return 0;\n" 14156 "}"; 14157 std::string Expected = "#include \"a.h\"\n" 14158 "#include \"b.h\"\n" 14159 "#include \"c.h\"\n" 14160 "\n" 14161 "int main() {\n" 14162 " return 0;\n" 14163 "}"; 14164 FileID ID = Context.createInMemoryFile("fix.cpp", Code); 14165 tooling::Replacements Replaces = toReplacements( 14166 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0, 14167 "#include \"b.h\"\n")}); 14168 14169 format::FormatStyle Style = format::getLLVMStyle(); 14170 Style.SortIncludes = true; 14171 auto FormattedReplaces = formatReplacements(Code, Replaces, Style); 14172 EXPECT_TRUE(static_cast<bool>(FormattedReplaces)) 14173 << llvm::toString(FormattedReplaces.takeError()) << "\n"; 14174 auto Result = applyAllReplacements(Code, *FormattedReplaces); 14175 EXPECT_TRUE(static_cast<bool>(Result)); 14176 EXPECT_EQ(Expected, *Result); 14177 } 14178 14179 TEST_F(FormatTest, FormatSortsUsingDeclarations) { 14180 EXPECT_EQ("using std::cin;\n" 14181 "using std::cout;", 14182 format("using std::cout;\n" 14183 "using std::cin;", 14184 getGoogleStyle())); 14185 } 14186 14187 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) { 14188 format::FormatStyle Style = format::getLLVMStyle(); 14189 Style.Standard = FormatStyle::LS_Cpp03; 14190 // cpp03 recognize this string as identifier u8 and literal character 'a' 14191 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style)); 14192 } 14193 14194 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) { 14195 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers 14196 // all modes, including C++11, C++14 and C++17 14197 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';")); 14198 } 14199 14200 TEST_F(FormatTest, DoNotFormatLikelyXml) { 14201 EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle())); 14202 EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle())); 14203 } 14204 14205 TEST_F(FormatTest, StructuredBindings) { 14206 // Structured bindings is a C++17 feature. 14207 // all modes, including C++11, C++14 and C++17 14208 verifyFormat("auto [a, b] = f();"); 14209 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();")); 14210 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();")); 14211 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();")); 14212 EXPECT_EQ("auto const volatile [a, b] = f();", 14213 format("auto const volatile[a, b] = f();")); 14214 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();")); 14215 EXPECT_EQ("auto &[a, b, c] = f();", 14216 format("auto &[ a , b,c ] = f();")); 14217 EXPECT_EQ("auto &&[a, b, c] = f();", 14218 format("auto &&[ a , b,c ] = f();")); 14219 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();")); 14220 EXPECT_EQ("auto const volatile &&[a, b] = f();", 14221 format("auto const volatile &&[a, b] = f();")); 14222 EXPECT_EQ("auto const &&[a, b] = f();", 14223 format("auto const && [a, b] = f();")); 14224 EXPECT_EQ("const auto &[a, b] = f();", 14225 format("const auto & [a, b] = f();")); 14226 EXPECT_EQ("const auto volatile &&[a, b] = f();", 14227 format("const auto volatile &&[a, b] = f();")); 14228 EXPECT_EQ("volatile const auto &&[a, b] = f();", 14229 format("volatile const auto &&[a, b] = f();")); 14230 EXPECT_EQ("const auto &&[a, b] = f();", 14231 format("const auto && [a, b] = f();")); 14232 14233 // Make sure we don't mistake structured bindings for lambdas. 14234 FormatStyle PointerMiddle = getLLVMStyle(); 14235 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; 14236 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle()); 14237 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle()); 14238 verifyFormat("auto [a3, b]{A * i};", PointerMiddle); 14239 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle()); 14240 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle()); 14241 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle); 14242 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle()); 14243 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle()); 14244 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle); 14245 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle()); 14246 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle()); 14247 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle); 14248 14249 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}", 14250 format("for (const auto && [a, b] : some_range) {\n}")); 14251 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}", 14252 format("for (const auto & [a, b] : some_range) {\n}")); 14253 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}", 14254 format("for (const auto[a, b] : some_range) {\n}")); 14255 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);")); 14256 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);")); 14257 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);")); 14258 EXPECT_EQ("auto const &[x, y](expr);", 14259 format("auto const & [x,y] (expr);")); 14260 EXPECT_EQ("auto const &&[x, y](expr);", 14261 format("auto const && [x,y] (expr);")); 14262 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};")); 14263 EXPECT_EQ("auto const &[x, y]{expr};", 14264 format("auto const & [x,y] {expr};")); 14265 EXPECT_EQ("auto const &&[x, y]{expr};", 14266 format("auto const && [x,y] {expr};")); 14267 14268 format::FormatStyle Spaces = format::getLLVMStyle(); 14269 Spaces.SpacesInSquareBrackets = true; 14270 verifyFormat("auto [ a, b ] = f();", Spaces); 14271 verifyFormat("auto &&[ a, b ] = f();", Spaces); 14272 verifyFormat("auto &[ a, b ] = f();", Spaces); 14273 verifyFormat("auto const &&[ a, b ] = f();", Spaces); 14274 verifyFormat("auto const &[ a, b ] = f();", Spaces); 14275 } 14276 14277 TEST_F(FormatTest, FileAndCode) { 14278 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", "")); 14279 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", "")); 14280 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", "")); 14281 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "")); 14282 EXPECT_EQ(FormatStyle::LK_ObjC, 14283 guessLanguage("foo.h", "@interface Foo\n@end\n")); 14284 EXPECT_EQ( 14285 FormatStyle::LK_ObjC, 14286 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }")); 14287 EXPECT_EQ(FormatStyle::LK_ObjC, 14288 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))")); 14289 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;")); 14290 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", "")); 14291 EXPECT_EQ(FormatStyle::LK_ObjC, 14292 guessLanguage("foo", "@interface Foo\n@end\n")); 14293 EXPECT_EQ(FormatStyle::LK_ObjC, 14294 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n")); 14295 EXPECT_EQ( 14296 FormatStyle::LK_ObjC, 14297 guessLanguage("foo.h", 14298 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n")); 14299 EXPECT_EQ( 14300 FormatStyle::LK_Cpp, 14301 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;")); 14302 } 14303 14304 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) { 14305 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];")); 14306 EXPECT_EQ(FormatStyle::LK_ObjC, 14307 guessLanguage("foo.h", "array[[calculator getIndex]];")); 14308 EXPECT_EQ(FormatStyle::LK_Cpp, 14309 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];")); 14310 EXPECT_EQ( 14311 FormatStyle::LK_Cpp, 14312 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];")); 14313 EXPECT_EQ(FormatStyle::LK_ObjC, 14314 guessLanguage("foo.h", "[[noreturn foo] bar];")); 14315 EXPECT_EQ(FormatStyle::LK_Cpp, 14316 guessLanguage("foo.h", "[[clang::fallthrough]];")); 14317 EXPECT_EQ(FormatStyle::LK_ObjC, 14318 guessLanguage("foo.h", "[[clang:fallthrough] foo];")); 14319 EXPECT_EQ(FormatStyle::LK_Cpp, 14320 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];")); 14321 EXPECT_EQ(FormatStyle::LK_Cpp, 14322 guessLanguage("foo.h", "[[using clang: fallthrough]];")); 14323 EXPECT_EQ(FormatStyle::LK_ObjC, 14324 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];")); 14325 EXPECT_EQ(FormatStyle::LK_Cpp, 14326 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];")); 14327 EXPECT_EQ( 14328 FormatStyle::LK_Cpp, 14329 guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)")); 14330 EXPECT_EQ( 14331 FormatStyle::LK_Cpp, 14332 guessLanguage("foo.h", 14333 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]")); 14334 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]")); 14335 } 14336 14337 TEST_F(FormatTest, GuessLanguageWithCaret) { 14338 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);")); 14339 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);")); 14340 EXPECT_EQ(FormatStyle::LK_ObjC, 14341 guessLanguage("foo.h", "int(^)(char, float);")); 14342 EXPECT_EQ(FormatStyle::LK_ObjC, 14343 guessLanguage("foo.h", "int(^foo)(char, float);")); 14344 EXPECT_EQ(FormatStyle::LK_ObjC, 14345 guessLanguage("foo.h", "int(^foo[10])(char, float);")); 14346 EXPECT_EQ(FormatStyle::LK_ObjC, 14347 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);")); 14348 EXPECT_EQ( 14349 FormatStyle::LK_ObjC, 14350 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); 14351 } 14352 14353 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) { 14354 EXPECT_EQ(FormatStyle::LK_Cpp, 14355 guessLanguage("foo.h", "void f() {\n" 14356 " asm (\"mov %[e], %[d]\"\n" 14357 " : [d] \"=rm\" (d)\n" 14358 " [e] \"rm\" (*e));\n" 14359 "}")); 14360 EXPECT_EQ(FormatStyle::LK_Cpp, 14361 guessLanguage("foo.h", "void f() {\n" 14362 " _asm (\"mov %[e], %[d]\"\n" 14363 " : [d] \"=rm\" (d)\n" 14364 " [e] \"rm\" (*e));\n" 14365 "}")); 14366 EXPECT_EQ(FormatStyle::LK_Cpp, 14367 guessLanguage("foo.h", "void f() {\n" 14368 " __asm (\"mov %[e], %[d]\"\n" 14369 " : [d] \"=rm\" (d)\n" 14370 " [e] \"rm\" (*e));\n" 14371 "}")); 14372 EXPECT_EQ(FormatStyle::LK_Cpp, 14373 guessLanguage("foo.h", "void f() {\n" 14374 " __asm__ (\"mov %[e], %[d]\"\n" 14375 " : [d] \"=rm\" (d)\n" 14376 " [e] \"rm\" (*e));\n" 14377 "}")); 14378 EXPECT_EQ(FormatStyle::LK_Cpp, 14379 guessLanguage("foo.h", "void f() {\n" 14380 " asm (\"mov %[e], %[d]\"\n" 14381 " : [d] \"=rm\" (d),\n" 14382 " [e] \"rm\" (*e));\n" 14383 "}")); 14384 EXPECT_EQ(FormatStyle::LK_Cpp, 14385 guessLanguage("foo.h", "void f() {\n" 14386 " asm volatile (\"mov %[e], %[d]\"\n" 14387 " : [d] \"=rm\" (d)\n" 14388 " [e] \"rm\" (*e));\n" 14389 "}")); 14390 } 14391 14392 TEST_F(FormatTest, GuessLanguageWithChildLines) { 14393 EXPECT_EQ(FormatStyle::LK_Cpp, 14394 guessLanguage("foo.h", "#define FOO ({ std::string s; })")); 14395 EXPECT_EQ(FormatStyle::LK_ObjC, 14396 guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); 14397 EXPECT_EQ( 14398 FormatStyle::LK_Cpp, 14399 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); 14400 EXPECT_EQ( 14401 FormatStyle::LK_ObjC, 14402 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); 14403 } 14404 14405 TEST_F(FormatTest, TypenameMacros) { 14406 std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"}; 14407 14408 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353 14409 FormatStyle Google = getGoogleStyleWithColumns(0); 14410 Google.TypenameMacros = TypenameMacros; 14411 verifyFormat("struct foo {\n" 14412 " int bar;\n" 14413 " TAILQ_ENTRY(a) bleh;\n" 14414 "};", 14415 Google); 14416 14417 FormatStyle Macros = getLLVMStyle(); 14418 Macros.TypenameMacros = TypenameMacros; 14419 14420 verifyFormat("STACK_OF(int) a;", Macros); 14421 verifyFormat("STACK_OF(int) *a;", Macros); 14422 verifyFormat("STACK_OF(int const *) *a;", Macros); 14423 verifyFormat("STACK_OF(int *const) *a;", Macros); 14424 verifyFormat("STACK_OF(int, string) a;", Macros); 14425 verifyFormat("STACK_OF(LIST(int)) a;", Macros); 14426 verifyFormat("STACK_OF(LIST(int)) a, b;", Macros); 14427 verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros); 14428 verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros); 14429 14430 Macros.PointerAlignment = FormatStyle::PAS_Left; 14431 verifyFormat("STACK_OF(int)* a;", Macros); 14432 verifyFormat("STACK_OF(int*)* a;", Macros); 14433 } 14434 14435 TEST_F(FormatTest, AmbersandInLamda) { 14436 // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899 14437 FormatStyle AlignStyle = getLLVMStyle(); 14438 AlignStyle.PointerAlignment = FormatStyle::PAS_Left; 14439 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14440 AlignStyle.PointerAlignment = FormatStyle::PAS_Right; 14441 verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle); 14442 } 14443 14444 } // end namespace 14445 } // end namespace format 14446 } // end namespace clang 14447